diff --git a/.github/workflows/lctt-article-badge.yml b/.github/workflows/lctt-article-badge.yml new file mode 100644 index 0000000000..aef3d9613d --- /dev/null +++ b/.github/workflows/lctt-article-badge.yml @@ -0,0 +1,27 @@ +name: LCTT Article Badge + +on: + push: + branches: [master] +jobs: + build: + runs-on: ubuntu-latest + steps: + - uses: actions/checkout@v2 + with: + fetch-depth: 0 + - name: checkout old pages branch + uses: actions/checkout@v2 + with: + repository: lctt/translateproject + path: build + ref: gh-pages + - name: remove pages .git + run: rm -rf ./build/.git + - name: run badge + run: sh ./scripts/badge.sh; + - uses: crazy-max/ghaction-github-pages@v2.2.0 + with: + build_dir: ./build + env: + GITHUB_TOKEN: ${{ secrets.GITHUB_TOKEN }} diff --git a/.github/workflows/lctt-article-checker.yml b/.github/workflows/lctt-article-checker.yml new file mode 100644 index 0000000000..32d4354454 --- /dev/null +++ b/.github/workflows/lctt-article-checker.yml @@ -0,0 +1,18 @@ +name: LCTT Article Checker + +on: + pull_request: + branches: [master] +jobs: + build: + runs-on: ubuntu-latest + env: + PULL_REQUEST_ID: ${{ github.event.number }} + steps: + - uses: actions/checkout@v2 + with: + fetch-depth: 0 + - name: "checkout master branch & return to pull request branch" + run: CURRENT=$(echo ${{github.ref}} | sed "s|refs/|refs/remotes/|") && git checkout master && git checkout $CURRENT + - name: run check + run: sh ./scripts/check.sh; diff --git a/.github/workflows/lctt-article-status.yml b/.github/workflows/lctt-article-status.yml new file mode 100644 index 0000000000..69ac7d5be8 --- /dev/null +++ b/.github/workflows/lctt-article-status.yml @@ -0,0 +1,28 @@ +name: LCTT Article Status + +on: + schedule: + - cron: "*/30 * * * *" + workflow_dispatch: +jobs: + build: + runs-on: ubuntu-latest + steps: + - uses: actions/checkout@v2 + with: + fetch-depth: 0 + - name: checkout old pages branch + uses: actions/checkout@v2 + with: + repository: lctt/translateproject + path: build + ref: gh-pages + - name: remove pages .git + run: rm -rf ./build/.git + - name: run status + run: sh ./scripts/status.sh; + - uses: crazy-max/ghaction-github-pages@v2.2.0 + with: + build_dir: ./build + env: + GITHUB_TOKEN: ${{ secrets.GITHUB_TOKEN }} diff --git a/.travis.yml b/.travis.yml deleted file mode 100644 index 0b12ca6653..0000000000 --- a/.travis.yml +++ /dev/null @@ -1,27 +0,0 @@ -language: minimal -install: - - sudo apt-get install jq - - git clone --depth=1 -b gh-pages https://github.com/LCTT/TranslateProject/ build && rm -rf build/.git -script: - - 'if [ "$TRAVIS_PULL_REQUEST" != "false" ]; then sh ./scripts/check.sh; fi' - - 'if [ "$TRAVIS_PULL_REQUEST" = "false" ]; then sh ./scripts/badge.sh; fi' - - 'if [ "$TRAVIS_EVENT_TYPE" = "cron" ]; then sh ./scripts/status.sh; fi' - -branches: - only: - - master - # - status - except: - - gh-pages -git: - submodules: false - depth: false -deploy: - provider: pages - skip_cleanup: true - github_token: $GITHUB_TOKEN - local_dir: build - on: - branch: - - master - # - status diff --git a/published/201601/20151127 Linux or UNIX grep Command Tutorial series 7--Linux or UNIX View Only Configuration File Directives Uncommented Lines of a Config File.md b/published/201601/20151127 Linux or UNIX grep Command Tutorial series 7--Uncommented Lines of a Config File.md similarity index 100% rename from published/201601/20151127 Linux or UNIX grep Command Tutorial series 7--Linux or UNIX View Only Configuration File Directives Uncommented Lines of a Config File.md rename to published/201601/20151127 Linux or UNIX grep Command Tutorial series 7--Uncommented Lines of a Config File.md diff --git a/published/201608/20160615 Explanation of “Everything is a File” and Types of Files in Linux.md b/published/201608/20160615 Explanation of Everything is a File and Types of Files in Linux.md old mode 100755 new mode 100644 similarity index 100% rename from published/201608/20160615 Explanation of “Everything is a File” and Types of Files in Linux.md rename to published/201608/20160615 Explanation of Everything is a File and Types of Files in Linux.md diff --git a/published/201610/20160604 How to Build Your First Slack Bot with Python.md b/published/201610/20160604 How to Build Your First Slack Bot with Python.md old mode 100755 new mode 100644 diff --git a/published/201610/20160724 Terminator A Linux Terminal Emulator With Multiple Terminals In One Window.md b/published/201610/20160724 Terminator A Linux Terminal Emulator With Multiple Terminals In One Window.md old mode 100755 new mode 100644 diff --git a/published/201610/20160811 How to Mount Remote Linux Filesystem or Directory Using SSHFS Over SSH.md b/published/201610/20160811 How to Mount Remote Linux Filesystem or Directory Using SSHFS Over SSH.md old mode 100755 new mode 100644 diff --git a/published/201610/20160812 What is copyleft.md b/published/201610/20160812 What is copyleft.md old mode 100755 new mode 100644 diff --git a/published/201611/20160513 aria2 (Command Line Downloader) command examples.md b/published/201611/20160513 aria2 (Command Line Downloader) command examples.md old mode 100755 new mode 100644 diff --git a/published/201611/20160914 Down and dirty with Windows Nano Server 2016.md b/published/201611/20160914 Down and dirty with Windows Nano Server 2016.md old mode 100755 new mode 100644 diff --git a/published/201611/20161025 3 Ways to Delete All Files in a Directory Except One or Few Files with Extensions.md b/published/201611/20161025 3 Ways to Delete All Files in a Directory Except One or Few Files with Extensions.md old mode 100755 new mode 100644 diff --git a/published/201611/20161025 How to Start Linux Command in Background and Detach Process in Terminal.md b/published/201611/20161025 How to Start Linux Command in Background and Detach Process in Terminal.md old mode 100755 new mode 100644 diff --git a/published/201701/20160610 Setting Up Real-Time Monitoring with Ganglia.md b/published/201701/20160610 Setting Up Real-Time Monitoring with Ganglia.md old mode 100755 new mode 100644 diff --git a/published/201804/20180206 Programming in Color with ncurses.md b/published/201804/20180206 Programming in Color with ncurses.md old mode 100755 new mode 100644 diff --git a/published/20180523 Creating random, secure passwords in Go.md b/published/20180523 Creating random, secure passwords in Go.md new file mode 100644 index 0000000000..e472554850 --- /dev/null +++ b/published/20180523 Creating random, secure passwords in Go.md @@ -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()`,并提供一个种子seed值,以初始化随机数生成器。如果你始终使用相同的种子值,随机数生成器将生成相同的随机整数序列。 + +![随机数生成代码][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 diff --git a/published/20180529 Build a concurrent TCP server in Go.md b/published/20180529 Build a concurrent TCP server in Go.md new file mode 100644 index 0000000000..8cd93bf002 --- /dev/null +++ b/published/20180529 Build a concurrent TCP server in Go.md @@ -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 diff --git a/published/20190404 Why you should choose mindfulness over multitasking.md b/published/20190404 Why you should choose mindfulness over multitasking.md new file mode 100644 index 0000000000..1d773a3d7a --- /dev/null +++ b/published/20190404 Why you should choose mindfulness over multitasking.md @@ -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 diff --git a/published/201908/20190730 How to create a pull request in GitHub.md b/published/201908/20190730 How to create a pull request in GitHub.md old mode 100755 new mode 100644 diff --git a/published/201908/20190817 GNOME and KDE team up on the Linux desktop, docs for Nvidia GPUs open up, a powerful new way to scan for firmware vulnerabilities, and more news.md b/published/201908/20190817 GNOME and KDE team up on the Linux desktop, docs for Nvidia GPUs open up.md similarity index 100% rename from published/201908/20190817 GNOME and KDE team up on the Linux desktop, docs for Nvidia GPUs open up, a powerful new way to scan for firmware vulnerabilities, and more news.md rename to published/201908/20190817 GNOME and KDE team up on the Linux desktop, docs for Nvidia GPUs open up.md diff --git a/published/201909/20190831 Google opens Android speech transcription and gesture tracking, Twitter-s telemetry tooling, Blender-s growing adoption, and more news.md b/published/201909/20190831 Google opens Android speech transcription and gesture tracking.md similarity index 100% rename from published/201909/20190831 Google opens Android speech transcription and gesture tracking, Twitter-s telemetry tooling, Blender-s growing adoption, and more news.md rename to published/201909/20190831 Google opens Android speech transcription and gesture tracking.md diff --git a/published/20200303 Watching activity on Linux with watch and tail commands.md b/published/20200303 Watching activity on Linux with watch and tail commands.md new file mode 100644 index 0000000000..bb8dd7b0d7 --- /dev/null +++ b/published/20200303 Watching activity on Linux with watch and tail commands.md @@ -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`(将其视为“离开go away”)选项。例如,如果你只是在等待其他人开始登录系统,则可以选择执行此操作。 + +你还可以使用 `-d`(差异differences)选项突出显示显示输出中的更改。突出显示只会持续一个间隔(默认为 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[=] + highlight changes between updates + -e, --errexit exit if command has a non-zero exit + -g, --chgexit exit when output from command changes + -n, --interval 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 diff --git a/published/202007/20200701 Customizing Bash.md b/published/202007/20200701 Customizing Bash.md old mode 100755 new mode 100644 diff --git a/published/20200807 A Beginner-s Guide to Open Source.md b/published/20200807 A Beginner-s Guide to Open Source.md new file mode 100644 index 0000000000..a51f88eefe --- /dev/null +++ b/published/20200807 A Beginner-s Guide to Open Source.md @@ -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) + +作为一名技术人员,你应该时不时会看到“开源Open Source”这个词。你有可能在浏览推文、博文时看到过它,也有可能是在学习某一门编程语言或使用某个工具时,看到它的部分介绍写着:这个工具/语言是“开源”的。总之,开源无处不在。 + +在本文中,我将介绍下面这三个话题: + +* 什么是开源 +* 贡献于开源的好处 +* 如何开始贡献 + +### 什么是开源 + +开源指的是这样一些软件、项目或社区:它们允许人们修改和分享,因为它们的设计目的就是为了让所有人都能访问。举一个关于菜谱的例子:你可以做你从未发明过的菜,因为发明这个菜谱的人公开了它。大多数时候,你也可以根据自己的口味烹饪,而不会呛到喉咙(开个玩笑)。 + +> 开源软件Open Source Software(OSS)是指源代码可供他人查看、复制、学习、修改或分享的软件。 + +下面是开源软件和语言的一些例子: + +* Linux 操作系统 +* Google 的 Android 操作系统 +* Firefox 浏览器 +* VLC 媒体播放器 +* Python 语言、PHP 语言、MySQL 数据库 + +与开源软件相反的是专有软件proprietary software / 闭源软件closed source software,只有软件的创造者才能自由使用,其他人若想使用,就得先获得法律许可才行。例如 Adobe Photoshop、微软 Office 等。 + +> 开源不仅限于软件或代码,技术领域的任何人都可以为开源做出贡献(各个角色)。有了开源,就有了透明度、可靠性、灵活性,并允许开放合作。 + +### 贡献于开源的好处 + +向开源项目或软件做贡献意味着“免费”让该项目变得更好。你应该会问自己,为什么我要关心或向自己强调“免费”呢?如果你是新手,你可以阅读 [Edidiong Asikpo][2] 的故事,她在 [这篇文章][3] 中说明了为什么开源是她成长的催化剂。 + +贡献开源的好处有很多,这里是其中一部分: + +* 它能够帮助你提高现有的技能,特别是对于新手而言,因为它允许你边做边学。 +* 无论身在何处,你都可以与世界各地的优秀科技人士协作或共事。 +* 你可以公开自己的想法,从而改善软件、项目或社区,让世界变得更美好。 +* 你可以通过贡献开源来得到大家的认可,或者成为独特或伟大事物的一部分(获得自豪感)。 +* 它让你有机会成为一个人才济济、活力四射的社区的一分子,你可以从中汲取灵感,并结识志同道合的人。 +* 你可以因为贡献开源而获得报酬(OoO)!比如你可以参与一些实习,包括 [谷歌编程之夏][4]Google Summer of Code、[Outreachy][5]、[谷歌文档季][6]Google Season of Docs,以及 Open Collective 的 [赏金计划][7]bounty program 等。(LCTT 译注:国内也有类似的开源实习机会,如“开源之夏”。) + +### 如何开始贡献 + +我相信你会对上面提到的最后一点感兴趣吧(^o^),那么,你该如何开始为开源软件做贡献呢? + +是时候介绍一下 GitHub 了! + +Github 是开源项目协作的大本营,因此它是一个开始贡献开源的好地方。没听说过 GitHub?没有关系!它提供了文档和指南,很容易就可以上手。不过我还是要提醒你,学习是一个循序渐进的过程,不要太心急喔。 + +Github 以公共存储库repositories的形式容纳了许多开源项目。对于某个项目,你可以提交一个议题issue,来说明你注意到的错误或问题(或进一步提出改进意见),也可以创建一个拉取请求pull request(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 diff --git a/published/202010/20180414 Go on very small hardware Part 2.md b/published/202010/20180414 Go on very small hardware Part 2.md new file mode 100644 index 0000000000..fdce9ab34c --- /dev/null +++ b/published/202010/20180414 Go on very small hardware Part 2.md @@ -0,0 +1,935 @@ +[#]: collector: (oska874) +[#]: translator: (gxlct008) +[#]: reviewer: (wxy) +[#]: publisher: (wxy) +[#]: url: (https://linux.cn/article-12747-1.html) +[#]: subject: (Go on very small hardware Part 2) +[#]: via: (https://ziutek.github.io/2018/04/14/go_on_very_small_hardware2.html) +[#]: author: (Michał Derkacz https://ziutek.github.io/) + +Go 语言在极小硬件上的运用(二) +============================================================ + +![](https://img.linux.net.cn/data/attachment/album/201909/24/210256yihkuy8kcigugr2h.png) + +在本文的 [第一部分][2] 的结尾,我承诺要写关于接口的内容。我不想在这里写有关接口或完整或简短的讲义。相反,我将展示一个简单的示例,来说明如何定义和使用接口,以及如何利用无处不在的 `io.Writer` 接口。还有一些关于反射reflection半主机semihosting的内容。 + +![STM32F030F4P6](https://ziutek.github.io/images/mcu/f030-demo-board/board.jpg) + +接口是 Go 语言的重要组成部分。如果你想了解更多有关它们的信息,我建议你阅读《[高效的 Go 编程][3]》 和 [Russ Cox 的文章][4]。 + +### 并发 Blinky – 回顾 + +当你阅读前面示例的代码时,你可能会注意到一中打开或关闭 LED 的反直觉方式。 `Set` 方法用于关闭 LED,`Clear` 方法用于打开 LED。这是由于在 漏极开路配置open-drain configuration 下驱动了 LED。我们可以做些什么来减少代码的混乱?让我们用 `On` 和 `Off` 方法来定义 `LED` 类型: + +``` +type LED struct { + pin gpio.Pin +} + +func (led LED) On() { + led.pin.Clear() +} + +func (led LED) Off() { + led.pin.Set() +} +``` + +现在我们可以简单地调用 `led.On()` 和 `led.Off()`,这不会再引起任何疑惑了。 + +在前面的所有示例中,我都尝试使用相同的 漏极开路配置open-drain configuration来避免代码复杂化。但是在最后一个示例中,对于我来说,将第三个 LED 连接到 GND 和 PA3 引脚之间并将 PA3 配置为推挽模式push-pull mode会更容易。下一个示例将使用以此方式连接的 LED。 + +但是我们的新 `LED` 类型不支持推挽配置,实际上,我们应该将其称为 `OpenDrainLED`,并定义另一个类型 `PushPullLED`: + +``` +type PushPullLED struct { + pin gpio.Pin +} + +func (led PushPullLED) On() { + led.pin.Set() +} + +func (led PushPullLED) Off() { + led.pin.Clear() +} +``` + +请注意,这两种类型都具有相同的方法,它们的工作方式也相同。如果在 LED 上运行的代码可以同时使用这两种类型,而不必注意当前使用的是哪种类型,那就太好了。 接口类型可以提供帮助: + +``` +package main + +import ( + "delay" + + "stm32/hal/gpio" + "stm32/hal/system" + "stm32/hal/system/timer/systick" +) + +type LED interface { + On() + Off() +} + +type PushPullLED struct{ pin gpio.Pin } + +func (led PushPullLED) On() { + led.pin.Set() +} + +func (led PushPullLED) Off() { + led.pin.Clear() +} + +func MakePushPullLED(pin gpio.Pin) PushPullLED { + pin.Setup(&gpio.Config{Mode: gpio.Out, Driver: gpio.PushPull}) + return PushPullLED{pin} +} + +type OpenDrainLED struct{ pin gpio.Pin } + +func (led OpenDrainLED) On() { + led.pin.Clear() +} + +func (led OpenDrainLED) Off() { + led.pin.Set() +} + +func MakeOpenDrainLED(pin gpio.Pin) OpenDrainLED { + pin.Setup(&gpio.Config{Mode: gpio.Out, Driver: gpio.OpenDrain}) + return OpenDrainLED{pin} +} + +var led1, led2 LED + +func init() { + system.SetupPLL(8, 1, 48/8) + systick.Setup(2e6) + + gpio.A.EnableClock(false) + led1 = MakeOpenDrainLED(gpio.A.Pin(4)) + led2 = MakePushPullLED(gpio.A.Pin(3)) +} + +func blinky(led LED, period int) { + for { + led.On() + delay.Millisec(100) + led.Off() + delay.Millisec(period - 100) + } +} + +func main() { + go blinky(led1, 500) + blinky(led2, 1000) +} + +``` + +我们定义了 `LED` 接口,它有两个方法: `On` 和 `Off`。 `PushPullLED` 和 `OpenDrainLED` 类型代表两种驱动 LED 的方式。我们还定义了两个用作构造函数的 `Make*LED` 函数。这两种类型都实现了 `LED` 接口,因此可以将这些类型的值赋给 `LED` 类型的变量: + +``` +led1 = MakeOpenDrainLED(gpio.A.Pin(4)) +led2 = MakePushPullLED(gpio.A.Pin(3)) +``` + +在这种情况下,可赋值性assignability在编译时检查。赋值后,`led1` 变量包含一个 `OpenDrainLED{gpio.A.Pin(4)}`,以及一个指向 `OpenDrainLED` 类型的方法集的指针。 `led1.On()` 调用大致对应于以下 C 代码: + +``` +led1.methods->On(led1.value) +``` + +如你所见,如果仅考虑函数调用的开销,这是相当廉价的抽象。 + +但是,对接口的任何赋值都会导致包含有关已赋值类型的大量信息。对于由许多其他类型组成的复杂类型,可能会有很多信息: + +``` +$ egc +$ arm-none-eabi-size cortexm0.elf + text data bss dec hex filename + 10356 196 212 10764 2a0c cortexm0.elf +``` + +如果我们不使用 [反射][5],可以通过避免包含类型和结构字段的名称来节省一些字节: + +``` +$ egc -nf -nt +$ arm-none-eabi-size cortexm0.elf + text data bss dec hex filename + 10312 196 212 10720 29e0 cortexm0.elf +``` + +生成的二进制文件仍然包含一些有关类型的必要信息和关于所有导出方法(带有名称)的完整信息。在运行时,主要是当你将存储在接口变量中的一个值赋值给任何其他变量时,需要此信息来检查可赋值性。 + +我们还可以通过重新编译所导入的包来删除它们的类型和字段名称: + +``` +$ cd $HOME/emgo +$ ./clean.sh +$ cd $HOME/firstemgo +$ egc -nf -nt +$ arm-none-eabi-size cortexm0.elf + text data bss dec hex filename + 10272 196 212 10680 29b8 cortexm0.elf +``` + +让我们加载这个程序,看看它是否按预期工作。这一次我们将使用 [st-flash][6] 命令: + +``` +$ arm-none-eabi-objcopy -O binary cortexm0.elf cortexm0.bin +$ st-flash write cortexm0.bin 0x8000000 +st-flash 1.4.0-33-gd76e3c7 +2018-04-10T22:04:34 INFO usb.c: -- exit_dfu_mode +2018-04-10T22:04:34 INFO common.c: Loading device parameters.... +2018-04-10T22:04:34 INFO common.c: Device connected is: F0 small device, id 0x10006444 +2018-04-10T22:04:34 INFO common.c: SRAM size: 0x1000 bytes (4 KiB), Flash: 0x4000 bytes (16 KiB) in pages of 1024 bytes +2018-04-10T22:04:34 INFO common.c: Attempting to write 10468 (0x28e4) bytes to stm32 address: 134217728 (0x8000000) +Flash page at addr: 0x08002800 erased +2018-04-10T22:04:34 INFO common.c: Finished erasing 11 pages of 1024 (0x400) bytes +2018-04-10T22:04:34 INFO common.c: Starting Flash write for VL/F0/F3/F1_XL core id +2018-04-10T22:04:34 INFO flash_loader.c: Successfully loaded flash loader in sram + 11/11 pages written +2018-04-10T22:04:35 INFO common.c: Starting verification of write complete +2018-04-10T22:04:35 INFO common.c: Flash written and verified! jolly good! + +``` + +我没有将 NRST 信号连接到编程器,因此无法使用 `-reset` 选项,必须按下复位按钮才能运行程序。 + +![Interfaces](https://ziutek.github.io/images/mcu/f030-demo-board/interfaces.png) + +看来,`st-flash` 与此板配合使用有点不可靠(通常需要复位 ST-LINK 加密狗)。此外,当前版本不会通过 SWD 发出复位命令(仅使用 NRST 信号)。软件复位是不现实的,但是它通常是有效的,缺少它会将会带来不便。对于板卡程序员board-programmer 来说 OpenOCD 工作得更好。 + +### UART + +UART(通用异步收发传输器Universal Aynchronous Receiver-Transmitter)仍然是当今微控制器最重要的外设之一。它的优点是以下属性的独特组合: + +* 相对较高的速度, +* 仅两条信号线(在 半双工half-duplex 通信的情况下甚至一条), +* 角色对称, +* 关于新数据的 同步带内信令synchronous in-band signaling(起始位), +* 在传输 words 内的精确计时。 + +这使得最初用于传输由 7-9 位的字组成的异步消息的 UART,也被用于有效地实现各种其他物理协议,例如被 [WS28xx LEDs][7] 或 [1-wire][8] 设备使用的协议。 + +但是,我们将以其通常的角色使用 UART:从程序中打印文本消息。 + +``` +package main + +import ( + "io" + "rtos" + + "stm32/hal/dma" + "stm32/hal/gpio" + "stm32/hal/irq" + "stm32/hal/system" + "stm32/hal/system/timer/systick" + "stm32/hal/usart" +) + +var tts *usart.Driver + +func init() { + system.SetupPLL(8, 1, 48/8) + systick.Setup(2e6) + + gpio.A.EnableClock(true) + tx := gpio.A.Pin(9) + + tx.Setup(&gpio.Config{Mode: gpio.Alt}) + tx.SetAltFunc(gpio.USART1_AF1) + d := dma.DMA1 + d.EnableClock(true) + tts = usart.NewDriver(usart.USART1, d.Channel(2, 0), nil, nil) + tts.Periph().EnableClock(true) + tts.Periph().SetBaudRate(115200) + tts.Periph().Enable() + tts.EnableTx() + + rtos.IRQ(irq.USART1).Enable() + rtos.IRQ(irq.DMA1_Channel2_3).Enable() +} + +func main() { + io.WriteString(tts, "Hello, World!\r\n") +} + +func ttsISR() { + tts.ISR() +} + +func ttsDMAISR() { + tts.TxDMAISR() +} + +//c:__attribute__((section(".ISRs"))) +var ISRs = [...]func(){ + irq.USART1: ttsISR, + irq.DMA1_Channel2_3: ttsDMAISR, +} + +``` + +你会发现此代码可能有些复杂,但目前 STM32 HAL 中没有更简单的 UART 驱动程序(在某些情况下,简单的轮询驱动程序可能会很有用)。 `usart.Driver` 是使用 DMA 和中断来减轻 CPU 负担的高效驱动程序。 + +STM32 USART 外设提供传统的 UART 及其同步版本。要将其用作输出,我们必须将其 Tx 信号连接到正确的 GPIO 引脚: + +``` +tx.Setup(&gpio.Config{Mode: gpio.Alt}) +tx.SetAltFunc(gpio.USART1_AF1) +``` + +在 Tx-only 模式下配置 `usart.Driver` (rxdma 和 rxbuf 设置为 nil): + +``` +tts = usart.NewDriver(usart.USART1, d.Channel(2, 0), nil, nil) +``` + +我们使用它的 `WriteString` 方法来打印这句名言。让我们清理所有内容并编译该程序: + +``` +$ cd $HOME/emgo +$ ./clean.sh +$ cd $HOME/firstemgo +$ egc +$ arm-none-eabi-size cortexm0.elf + text data bss dec hex filename + 12728 236 176 13140 3354 cortexm0.elf +``` + +要查看某些内容,你需要在 PC 中使用 UART 外设。 + +**请勿使用 RS232 端口或 USB 转 RS232 转换器!** + +STM32 系列使用 3.3V 逻辑,但是 RS232 可以产生 -15 V ~ +15 V 的电压,这可能会损坏你的 MCU。你需要使用 3.3V 逻辑的 USB 转 UART 转换器。流行的转换器基于 FT232 或 CP2102 芯片。 + +![UART](https://ziutek.github.io/images/mcu/f030-demo-board/uart.jpg) + +你还需要一些终端仿真程序(我更喜欢 [picocom][9])。刷新新图像,运行终端仿真器,然后按几次复位按钮: + +``` +$ openocd -d0 -f interface/stlink.cfg -f target/stm32f0x.cfg -c 'init; program cortexm0.elf; reset run; exit' +Open On-Chip Debugger 0.10.0+dev-00319-g8f1f912a (2018-03-07-19:20) +Licensed under GNU GPL v2 +For bug reports, read + http://openocd.org/doc/doxygen/bugs.html +debug_level: 0 +adapter speed: 1000 kHz +adapter_nsrst_delay: 100 +none separate +adapter speed: 950 kHz +target halted due to debug-request, current mode: Thread +xPSR: 0xc1000000 pc: 0x080016f4 msp: 0x20000a20 +adapter speed: 4000 kHz +** Programming Started ** +auto erase enabled +target halted due to breakpoint, current mode: Thread +xPSR: 0x61000000 pc: 0x2000003a msp: 0x20000a20 +wrote 13312 bytes from file cortexm0.elf in 1.020185s (12.743 KiB/s) +** Programming Finished ** +adapter speed: 950 kHz +$ +$ picocom -b 115200 /dev/ttyUSB0 +picocom v3.1 + +port is : /dev/ttyUSB0 +flowcontrol : none +baudrate is : 115200 +parity is : none +databits are : 8 +stopbits are : 1 +escape is : C-a +local echo is : no +noinit is : no +noreset is : no +hangup is : no +nolock is : no +send_cmd is : sz -vv +receive_cmd is : rz -vv -E +imap is : +omap is : +emap is : crcrlf,delbs, +logfile is : none +initstring : none +exit_after is : not set +exit is : no + +Type [C-a] [C-h] to see available commands +Terminal ready +Hello, World! +Hello, World! +Hello, World! +``` + +每次按下复位按钮都会产生新的 “Hello,World!”行。一切都在按预期进行。 + +要查看此 MCU 的 双向bi-directional UART 代码,请查看 [此示例][10]。 + +### io.Writer 接口 + +`io.Writer` 接口可能是 Go 中第二种最常用的接口类型,仅次于 `error` 接口。其定义如下所示: + +``` +type Writer interface { + Write(p []byte) (n int, err error) +} +``` + +`usart.Driver` 实现了 `io.Writer`,因此我们可以替换: + +``` +tts.WriteString("Hello, World!\r\n") +``` + +为 + +``` +io.WriteString(tts, "Hello, World!\r\n") +``` + +此外,你需要将 `io` 包添加到 `import` 部分。 + +`io.WriteString` 函数的声明如下所示: + +``` +func WriteString(w Writer, s string) (n int, err error) +``` + +如你所见,`io.WriteString` 允许使用实现了 `io.Writer` 接口的任何类型来编写字符串。在内部,它检查基础类型是否具有 `WriteString` 方法,并使用该方法代替 `Write`(如果可用)。 + +让我们编译修改后的程序: + +``` +$ egc +$ arm-none-eabi-size cortexm0.elf + text data bss dec hex filename + 15456 320 248 16024 3e98 cortexm0.elf +``` + +如你所见,`io.WriteString` 导致二进制文件的大小显着增加:15776-12964 = 2812 字节。 Flash 上没有太多空间了。是什么引起了这么大规模的增长? + +使用这个命令: + +``` +arm-none-eabi-nm --print-size --size-sort --radix=d cortexm0.elf +``` + +我们可以打印两种情况下按其大小排序的所有符号。通过过滤和分析获得的数据(`awk`,`diff`),我们可以找到大约 80 个新符号。最大的十个如下所示: + +``` +> 00000062 T stm32$hal$usart$Driver$DisableRx +> 00000072 T stm32$hal$usart$Driver$RxDMAISR +> 00000076 T internal$Type$Implements +> 00000080 T stm32$hal$usart$Driver$EnableRx +> 00000084 t errors$New +> 00000096 R $8$stm32$hal$usart$Driver$$ +> 00000100 T stm32$hal$usart$Error$Error +> 00000360 T io$WriteString +> 00000660 T stm32$hal$usart$Driver$Read +``` + +因此,即使我们不使用 `usart.Driver.Read` 方法,但它被编译进来了,与 `DisableRx`、`RxDMAISR`、`EnableRx` 以及上面未提及的其他方法一样。不幸的是,如果你为接口赋值了一些内容,就需要它的完整方法集(包含所有依赖项)。对于使用大多数方法的大型程序来说,这不是问题。但是对于我们这种极简的情况而言,这是一个巨大的负担。 + +我们已经接近 MCU 的极限,但让我们尝试打印一些数字(你需要在 `import` 部分中用 `strconv` 替换 `io` 包): + +``` +func main() { + a := 12 + b := -123 + + tts.WriteString("a = ") + strconv.WriteInt(tts, a, 10, 0, 0) + tts.WriteString("\r\n") + tts.WriteString("b = ") + strconv.WriteInt(tts, b, 10, 0, 0) + tts.WriteString("\r\n") + + tts.WriteString("hex(a) = ") + strconv.WriteInt(tts, a, 16, 0, 0) + tts.WriteString("\r\n") + tts.WriteString("hex(b) = ") + strconv.WriteInt(tts, b, 16, 0, 0) + tts.WriteString("\r\n") +} +``` + +与使用 `io.WriteString` 函数的情况一样,`strconv.WriteInt` 的第一个参数的类型为 `io.Writer`。 + +``` +$ egc +/usr/local/arm/bin/arm-none-eabi-ld: /home/michal/firstemgo/cortexm0.elf section `.rodata' will not fit in region `Flash' +/usr/local/arm/bin/arm-none-eabi-ld: region `Flash' overflowed by 692 bytes +exit status 1 +``` + +这一次我们的空间超出的不多。让我们试着精简一下有关类型的信息: + +``` +$ cd $HOME/emgo +$ ./clean.sh +$ cd $HOME/firstemgo +$ egc -nf -nt +$ arm-none-eabi-size cortexm0.elf + text data bss dec hex filename + 15876 316 320 16512 4080 cortexm0.elf +``` + +很接近,但很合适。让我们加载并运行此代码: + +``` +a = 12 +b = -123 +hex(a) = c +hex(b) = -7b +``` + +Emgo 中的 `strconv` 包与 Go 中的原型有很大的不同。它旨在直接用于写入格式化的数字,并且在许多情况下可以替换沉重的 `fmt` 包。 这就是为什么函数名称以 `Write` 而不是 `Format` 开头,并具有额外的两个参数的原因。 以下是其用法示例: + +``` +func main() { + b := -123 + strconv.WriteInt(tts, b, 10, 0, 0) + tts.WriteString("\r\n") + strconv.WriteInt(tts, b, 10, 6, ' ') + tts.WriteString("\r\n") + strconv.WriteInt(tts, b, 10, 6, '0') + tts.WriteString("\r\n") + strconv.WriteInt(tts, b, 10, 6, '.') + tts.WriteString("\r\n") + strconv.WriteInt(tts, b, 10, -6, ' ') + tts.WriteString("\r\n") + strconv.WriteInt(tts, b, 10, -6, '0') + tts.WriteString("\r\n") + strconv.WriteInt(tts, b, 10, -6, '.') + tts.WriteString("\r\n") +} +``` + +下面是它的输出: + +``` +-123 + -123 +-00123 +..-123 +-123 +-123 +-123.. +``` + +### Unix 流 和 莫尔斯电码Morse code + +由于大多数写入的函数都使用 `io.Writer` 而不是具体类型(例如 C 中的 `FILE` ),因此我们获得了类似于 Unix stream 的功能。在 Unix 中,我们可以轻松地组合简单的命令来执行更大的任务。例如,我们可以通过以下方式将文本写入文件: + +``` +echo "Hello, World!" > file.txt +``` + +`>` 操作符将前面命令的输出流写入文件。还有 `|` 操作符,用于连接相邻命令的输出流和输入流。 + +多亏了流,我们可以轻松地转换/过滤任何命令的输出。例如,要将所有字母转换为大写,我们可以通过 `tr` 命令过滤 `echo` 的输出: + +``` +echo "Hello, World!" | tr a-z A-Z > file.txt +``` + +为了显示 `io.Writer` 和 Unix 流之间的类比,让我们编写以下代码: + +``` +io.WriteString(tts, "Hello, World!\r\n") +``` + +采用以下伪 unix 形式: + +``` +io.WriteString "Hello, World!" | usart.Driver usart.USART1 +``` + +下一个示例将显示如何执行此操作: + +``` +io.WriteString "Hello, World!" | MorseWriter | usart.Driver usart.USART1 +``` + +让我们来创建一个简单的编码器,它使用莫尔斯电码对写入的文本进行编码: + +``` +type MorseWriter struct { + W io.Writer +} + +func (w *MorseWriter) Write(s []byte) (int, error) { + var buf [8]byte + for n, c := range s { + switch { + case c == '\n': + c = ' ' // Replace new lines with spaces. + case 'a' <= c && c <= 'z': + c -= 'a' - 'A' // Convert to upper case. + } + if c < ' ' || 'Z' < c { + continue // c is outside ASCII [' ', 'Z'] + } + var symbol morseSymbol + if c == ' ' { + symbol.length = 1 + buf[0] = ' ' + } else { + symbol = morseSymbols[c-'!'] + for i := uint(0); i < uint(symbol.length); i++ { + if (symbol.code>>i)&1 != 0 { + buf[i] = '-' + } else { + buf[i] = '.' + } + } + } + buf[symbol.length] = ' ' + if _, err := w.W.Write(buf[:symbol.length+1]); err != nil { + return n, err + } + } + return len(s), nil +} + +type morseSymbol struct { + code, length byte +} + +//emgo:const +var morseSymbols = [...]morseSymbol{ + {1<<0 | 1<<1 | 1<<2, 4}, // ! ---. + {1<<1 | 1<<4, 6}, // " .-..-. + {}, // # + {1<<3 | 1<<6, 7}, // $ ...-..- + + // Some code omitted... + + {1<<0 | 1<<3, 4}, // X -..- + {1<<0 | 1<<2 | 1<<3, 4}, // Y -.-- + {1<<0 | 1<<1, 4}, // Z --.. +} +``` + +你可以在 [这里][11] 找到完整的 `morseSymbols` 数组。 `//emgo:const` 指令确保 `morseSymbols` 数组不会被复制到 RAM 中。 + +现在我们可以通过两种方式打印句子: + +``` +func main() { + s := "Hello, World!\r\n" + mw := &MorseWriter{tts} + + io.WriteString(tts, s) + io.WriteString(mw, s) +} +``` + +我们使用指向 `MorseWriter` `&MorseWriter{tts}` 的指针而不是简单的 `MorseWriter{tts}` 值,因为 `MorseWriter` 太大,不适合接口变量。 + +与 Go 不同,Emgo 不会为存储在接口变量中的值动态分配内存。接口类型的大小受限制,相当于三个指针(适合 `slice` )或两个 `float64`(适合 `complex128`)的大小,以较大者为准。它可以直接存储所有基本类型和小型 “结构体/数组” 的值,但是对于较大的值,你必须使用指针。 + +让我们编译此代码并查看其输出: + +``` +$ egc +$ arm-none-eabi-size cortexm0.elf + text data bss dec hex filename + 15152 324 248 15724 3d6c cortexm0.elf +``` + +``` +Hello, World! +.... . .-.. .-.. --- --..-- .-- --- .-. .-.. -.. ---. +``` + +### 终极闪烁 + +Blinky 是等效于 “Hello,World!” 程序的硬件。一旦有了摩尔斯编码器,我们就可以轻松地将两者结合起来以获得终极闪烁程序: + +``` +package main + +import ( + "delay" + "io" + + "stm32/hal/gpio" + "stm32/hal/system" + "stm32/hal/system/timer/systick" +) + +var led gpio.Pin + +func init() { + system.SetupPLL(8, 1, 48/8) + systick.Setup(2e6) + + gpio.A.EnableClock(false) + led = gpio.A.Pin(4) + + cfg := gpio.Config{Mode: gpio.Out, Driver: gpio.OpenDrain, Speed: gpio.Low} + led.Setup(&cfg) +} + +type Telegraph struct { + Pin gpio.Pin + Dotms int // Dot length [ms] +} + +func (t Telegraph) Write(s []byte) (int, error) { + for _, c := range s { + switch c { + case '.': + t.Pin.Clear() + delay.Millisec(t.Dotms) + t.Pin.Set() + delay.Millisec(t.Dotms) + case '-': + t.Pin.Clear() + delay.Millisec(3 * t.Dotms) + t.Pin.Set() + delay.Millisec(t.Dotms) + case ' ': + delay.Millisec(3 * t.Dotms) + } + } + return len(s), nil +} + +func main() { + telegraph := &MorseWriter{Telegraph{led, 100}} + for { + io.WriteString(telegraph, "Hello, World! ") + } +} + +// Some code omitted... + +``` + +在上面的示例中,我省略了 `MorseWriter` 类型的定义,因为它已在前面展示过。完整版可通过 [这里][12] 获取。让我们编译它并运行: + +``` +$ egc +$ arm-none-eabi-size cortexm0.elf + text data bss dec hex filename + 11772 244 244 12260 2fe4 cortexm0.elf +``` + +![Ultimate Blinky](https://ziutek.github.io/images/mcu/f030-demo-board/morse.png) + +### 反射 + +是的,Emgo 支持 [反射][13]。`reflect` 包尚未完成,但是已完成的部分足以实现 `fmt.Print` 函数族了。来看看我们可以在小型 MCU 上做什么。 + +为了减少内存使用,我们将使用 [半主机][14]semihosting 作为标准输出。为了方便起见,我们还编写了简单的 `println` 函数,它在某种程度上类似于 `fmt.Println`。 + +``` +package main + +import ( + "debug/semihosting" + "reflect" + "strconv" + + "stm32/hal/system" + "stm32/hal/system/timer/systick" +) + +var stdout semihosting.File + +func init() { + system.SetupPLL(8, 1, 48/8) + systick.Setup(2e6) + + var err error + stdout, err = semihosting.OpenFile(":tt", semihosting.W) + for err != nil { + } +} + +type stringer interface { + String() string +} + +func println(args ...interface{}) { + for i, a := range args { + if i > 0 { + stdout.WriteString(" ") + } + switch v := a.(type) { + case string: + stdout.WriteString(v) + case int: + strconv.WriteInt(stdout, v, 10, 0, 0) + case bool: + strconv.WriteBool(stdout, v, 't', 0, 0) + case stringer: + stdout.WriteString(v.String()) + default: + stdout.WriteString("%unknown") + } + } + stdout.WriteString("\r\n") +} + +type S struct { + A int + B bool +} + +func main() { + p := &S{-123, true} + + v := reflect.ValueOf(p) + + println("kind(p) =", v.Kind()) + println("kind(*p) =", v.Elem().Kind()) + println("type(*p) =", v.Elem().Type()) + + v = v.Elem() + + println("*p = {") + for i := 0; i < v.NumField(); i++ { + ft := v.Type().Field(i) + fv := v.Field(i) + println(" ", ft.Name(), ":", fv.Interface()) + } + println("}") +} + +``` + +`semihosting.OpenFile` 函数允许在主机端打开/创建文件。特殊路径 `:tt` 对应于主机的标准输出。 + +`println` 函数接受任意数量的参数,每个参数的类型都是任意的: + +``` +func println(args ...interface{}) +``` + +可能是因为任何类型都实现了空接口 `interface{}`。 `println` 使用 [类型开关][15] 打印字符串,整数和布尔值: + +``` +switch v := a.(type) { +case string: + stdout.WriteString(v) +case int: + strconv.WriteInt(stdout, v, 10, 0, 0) +case bool: + strconv.WriteBool(stdout, v, 't', 0, 0) +case stringer: + stdout.WriteString(v.String()) +default: + stdout.WriteString("%unknown") +} +``` + +此外,它还支持任何实现了 `stringer` 接口的类型,即任何具有 `String()` 方法的类型。在任何 `case` 子句中,`v` 变量具有正确的类型,与 `case` 关键字后列出的类型相同。 + +`reflect.ValueOf(p)` 函数通过允许以编程的方式分析其类型和内容的形式返回 `p`。如你所见,我们甚至可以使用 `v.Elem()` 取消引用指针,并打印所有结构体及其名称。 + +让我们尝试编译这段代码。现在让我们看看如果编译时没有类型和字段名,会有什么结果: + +``` +$ egc -nt -nf +$ arm-none-eabi-size cortexm0.elf + text data bss dec hex filename + 16028 216 312 16556 40ac cortexm0.elf +``` + +闪存上只剩下 140 个可用字节。让我们使用启用了半主机的 OpenOCD 加载它: + +``` +$ openocd -d0 -f interface/stlink.cfg -f target/stm32f0x.cfg -c 'init; program cortexm0.elf; arm semihosting enable; reset run' +Open On-Chip Debugger 0.10.0+dev-00319-g8f1f912a (2018-03-07-19:20) +Licensed under GNU GPL v2 +For bug reports, read + http://openocd.org/doc/doxygen/bugs.html +debug_level: 0 +adapter speed: 1000 kHz +adapter_nsrst_delay: 100 +none separate +adapter speed: 950 kHz +target halted due to debug-request, current mode: Thread +xPSR: 0xc1000000 pc: 0x08002338 msp: 0x20000a20 +adapter speed: 4000 kHz +** Programming Started ** +auto erase enabled +target halted due to breakpoint, current mode: Thread +xPSR: 0x61000000 pc: 0x2000003a msp: 0x20000a20 +wrote 16384 bytes from file cortexm0.elf in 0.700133s (22.853 KiB/s) +** Programming Finished ** +semihosting is enabled +adapter speed: 950 kHz +kind(p) = ptr +kind(*p) = struct +type(*p) = +*p = { + X. : -123 + X. : true +} +``` + +如果你实际运行此代码,则会注意到半主机运行缓慢,尤其是在逐字节写入时(缓冲很有用)。 + +如你所见,`*p` 没有类型名称,并且所有结构字段都具有相同的 `X.` 名称。让我们再次编译该程序,这次不带 `-nt -nf` 选项: + +``` +$ egc +$ arm-none-eabi-size cortexm0.elf + text data bss dec hex filename + 16052 216 312 16580 40c4 cortexm0.elf +``` + +现在已经包括了类型和字段名称,但仅在 ~~_main.go_ 文件中~~ `main` 包中定义了它们。该程序的输出如下所示: + +``` +kind(p) = ptr +kind(*p) = struct +type(*p) = S +*p = { + A : -123 + B : true +} +``` + +反射是任何易于使用的序列化库的关键部分,而像 [JSON][16] 这样的序列化 ~~算法~~ 在物联网IoT时代也越来越重要。 + +这些就是我完成的本文的第二部分。我认为有机会进行第三部分,更具娱乐性的部分,在那里我们将各种有趣的设备连接到这块板上。如果这块板装不下,我们就换一块大一点的。 + +-------------------------------------------------------------------------------- + +via: https://ziutek.github.io/2018/04/14/go_on_very_small_hardware2.html + +作者:[Michał Derkacz][a] +译者:[gxlct008](https://github.com/gxlct008) +校对:[wxy](https://github.com/wxy) + +本文由 [LCTT](https://github.com/LCTT/TranslateProject) 原创编译,[Linux中国](https://linux.cn/) 荣誉推出 + +[a]:https://ziutek.github.io/ +[1]:https://ziutek.github.io/2018/04/14/go_on_very_small_hardware2.html +[2]:https://linux.cn/article-11383-1.html +[3]:https://golang.org/doc/effective_go.html#interfaces +[4]:https://research.swtch.com/interfaces +[5]:https://blog.golang.org/laws-of-reflection +[6]:https://github.com/texane/stlink +[7]:http://www.world-semi.com/solution/list-4-1.html +[8]:https://en.wikipedia.org/wiki/1-Wire +[9]:https://github.com/npat-efault/picocom +[10]:https://github.com/ziutek/emgo/blob/master/egpath/src/stm32/examples/f030-demo-board/usart/main.go +[11]:https://github.com/ziutek/emgo/blob/master/egpath/src/stm32/examples/f030-demo-board/morseuart/main.go +[12]:https://github.com/ziutek/emgo/blob/master/egpath/src/stm32/examples/f030-demo-board/morseled/main.go +[13]:https://blog.golang.org/laws-of-reflection +[14]:http://infocenter.arm.com/help/topic/com.arm.doc.dui0471g/Bgbjjgij.html +[15]:https://golang.org/doc/effective_go.html#type_switch +[16]:https://en.wikipedia.org/wiki/JSON diff --git a/published/20180710 Building a Messenger App- Messages.md b/published/202010/20180710 Building a Messenger App- Messages.md similarity index 100% rename from published/20180710 Building a Messenger App- Messages.md rename to published/202010/20180710 Building a Messenger App- Messages.md diff --git a/published/20180710 Building a Messenger App- Realtime Messages.md b/published/202010/20180710 Building a Messenger App- Realtime Messages.md similarity index 100% rename from published/20180710 Building a Messenger App- Realtime Messages.md rename to published/202010/20180710 Building a Messenger App- Realtime Messages.md diff --git a/published/20180712 Building a Messenger App- Development Login.md b/published/202010/20180712 Building a Messenger App- Development Login.md similarity index 100% rename from published/20180712 Building a Messenger App- Development Login.md rename to published/202010/20180712 Building a Messenger App- Development Login.md diff --git a/published/20180716 Building a Messenger App- Access Page.md b/published/202010/20180716 Building a Messenger App- Access Page.md similarity index 100% rename from published/20180716 Building a Messenger App- Access Page.md rename to published/202010/20180716 Building a Messenger App- Access Page.md diff --git a/translated/tech/20180719 Building a Messenger App- Home Page.md b/published/202010/20180719 Building a Messenger App- Home Page.md similarity index 86% rename from translated/tech/20180719 Building a Messenger App- Home Page.md rename to published/202010/20180719 Building a Messenger App- Home Page.md index ad3cd30125..741206a4a7 100644 --- a/translated/tech/20180719 Building a Messenger App- Home Page.md +++ b/published/202010/20180719 Building a Messenger App- Home Page.md @@ -1,8 +1,8 @@ [#]: collector: (lujun9972) [#]: translator: (gxlct008) -[#]: reviewer: ( ) -[#]: publisher: ( ) -[#]: url: ( ) +[#]: reviewer: (wxy) +[#]: publisher: (wxy) +[#]: url: (https://linux.cn/article-12722-1.html) [#]: subject: (Building a Messenger App: Home Page) [#]: via: (https://nicolasparada.netlify.com/posts/go-messenger-home-page/) [#]: author: (Nicolás Parada https://nicolasparada.netlify.com/) @@ -10,6 +10,8 @@ 构建一个即时消息应用(八):Home 页面 ====== +![](https://img.linux.net.cn/data/attachment/album/202010/15/213116evlwzdwwv66kmldj.jpg) + 本文是该系列的第八篇。 * [第一篇: 模式][1] @@ -20,8 +22,7 @@ * [第六篇: 仅用于开发的登录][6] * [第七篇: Access 页面][7] - -继续前端部分,让我们在本文中完成 Home 页面的开发。 我们将添加一个开始对话的表单和一个包含最新对话的列表。 +继续前端部分,让我们在本文中完成 `home` 页面的开发。 我们将添加一个开始对话的表单和一个包含最新对话的列表。 ### 对话表单 @@ -35,7 +36,7 @@ ``` -将该表单添加到我们显示 auth user 和 logout 按钮部分的下方。 +将该表单添加到我们显示 “auth user” 和 “logout” 按钮部分的下方。 ```js page.getElementById('conversation-form').onsubmit = onConversationSubmit @@ -78,7 +79,7 @@ function createConversation(username) { } ``` -在提交时,我们使用用户名对 `/api/conversations` 进行 POST 请求,并重定向到 conversation 页面 (用于下一篇文章)。 +在提交时,我们使用用户名对 `/api/conversations` 进行 POST 请求,并重定向到 `conversation` 页面(用于下一篇文章)。 ### 对话列表 @@ -166,8 +167,7 @@ export function escapeHTML(str) { ``` -这将非常烦人,因为该脚本将被执行😅。 -所以,永远记住要转义来自不可信来源的内容。 +这将非常烦人,因为该脚本将被执行😅。所以,永远记住要转义来自不可信来源的内容。 ### 消息订阅 @@ -227,7 +227,7 @@ function getConversation(id) { 以上这些涵盖了主页的所有内容 😊。 在下一篇文章中,我们将对 conversation 页面进行编码。 -[Souce Code][10] +- [源代码][10] -------------------------------------------------------------------------------- @@ -235,20 +235,20 @@ via: https://nicolasparada.netlify.com/posts/go-messenger-home-page/ 作者:[Nicolás Parada][a] 选题:[lujun9972][b] -译者:[译者ID](https://github.com/gxlct008) -校对:[校对者ID](https://github.com/校对者ID) +译者:[gxlct008](https://github.com/gxlct008) +校对:[wxy](https://github.com/wxy) 本文由 [LCTT](https://github.com/LCTT/TranslateProject) 原创编译,[Linux中国](https://linux.cn/) 荣誉推出 [a]: https://nicolasparada.netlify.com/ [b]: https://github.com/lujun9972 -[1]: https://nicolasparada.netlify.com/posts/go-messenger-schema/ -[2]: https://nicolasparada.netlify.com/posts/go-messenger-oauth/ -[3]: https://nicolasparada.netlify.com/posts/go-messenger-conversations/ -[4]: https://nicolasparada.netlify.com/posts/go-messenger-messages/ -[5]: https://nicolasparada.netlify.com/posts/go-messenger-realtime-messages/ -[6]: https://nicolasparada.netlify.com/posts/go-messenger-dev-login/ -[7]: https://nicolasparada.netlify.com/posts/go-messenger-access-page/ +[1]: https://linux.cn/article-11396-1.html +[2]: https://linux.cn/article-11510-1.html +[3]: https://linux.cn/article-12056-1.html +[4]: https://linux.cn/article-12680-1.html +[5]: https://linux.cn/article-12685-1.html +[6]: https://linux.cn/article-12692-1.html +[7]: https://linux.cn/article-12704-1.html [8]: https://nicolasparada.netlify.com/img/go-messenger-home-page/conversation-form.png [9]: https://nicolasparada.netlify.com/img/go-messenger-home-page/conversation-list.png [10]: https://github.com/nicolasparada/go-messenger-demo diff --git a/translated/tech/20180720 Building a Messenger App- Conversation Page.md b/published/202010/20180720 Building a Messenger App- Conversation Page.md similarity index 86% rename from translated/tech/20180720 Building a Messenger App- Conversation Page.md rename to published/202010/20180720 Building a Messenger App- Conversation Page.md index b249c2dcfb..95f91cabfa 100644 --- a/translated/tech/20180720 Building a Messenger App- Conversation Page.md +++ b/published/202010/20180720 Building a Messenger App- Conversation Page.md @@ -1,8 +1,8 @@ [#]: collector: (lujun9972) [#]: translator: (gxlct008) -[#]: reviewer: ( ) -[#]: publisher: ( ) -[#]: url: ( ) +[#]: reviewer: (wxy) +[#]: publisher: (wxy) +[#]: url: (https://linux.cn/article-12723-1.html) [#]: subject: (Building a Messenger App: Conversation Page) [#]: via: (https://nicolasparada.netlify.com/posts/go-messenger-conversation-page/) [#]: author: (Nicolás Parada https://nicolasparada.netlify.com/) @@ -10,6 +10,8 @@ 构建一个即时消息应用(九):Conversation 页面 ====== +![](https://img.linux.net.cn/data/attachment/album/202010/15/220239arr978u7t7oulv73.jpg) + 本文是该系列的第九篇,也是最后一篇。 * [第一篇: 模式][1] @@ -21,8 +23,6 @@ * [第七篇: Access 页面][7] * [第八篇: Home 页面][8] - - 在这篇文章中,我们将对对话conversation页面进行编码。此页面是两个用户之间的聊天室。在顶部我们将显示其他参与者的信息,下面接着的是最新消息列表,以及底部的消息表单。 ### 聊天标题 @@ -230,16 +230,15 @@ function readMessages(conversationID) { } ``` -在这里我们仍然使用 partial application 来获取会话 ID。 -当新消息到达时,我们首先检查它是否来自此对话。如果是,我们会将消息条目预先添加到列表中,并向`/api/conversations/{conversationID}/read_messages`发起 POST 一个请求,以更新参与者上次阅读消息的时间。 +在这里我们仍然使用这个应用的部分来获取会话 ID。 +当新消息到达时,我们首先检查它是否来自此对话。如果是,我们会将消息条目预先添加到列表中,并向 `/api/conversations/{conversationID}/read_messages` 发起 POST 一个请求,以更新参与者上次阅读消息的时间。 * * * -本系列到此结束。 Messenger app 现在可以运行了。 +本系列到此结束。 消息应用现在可以运行了。 -~~我将在对话和消息列表中添加分页功能,并在共享源代码之前添加用户搜索。我会在准备好的时候和托管的演示a hosted demo👨‍💻一起更新它~~ - -[Souce Code][13] • [Demo][14] +- [源代码][13] +- [演示][14] -------------------------------------------------------------------------------- @@ -248,20 +247,20 @@ via: https://nicolasparada.netlify.com/posts/go-messenger-conversation-page/ 作者:[Nicolás Parada][a] 选题:[lujun9972][b] 译者:[gxlct008](https://github.com/gxlct008) -校对:[校对者ID](https://github.com/校对者ID) +校对:[wxy](https://github.com/wxy) 本文由 [LCTT](https://github.com/LCTT/TranslateProject) 原创编译,[Linux中国](https://linux.cn/) 荣誉推出 [a]: https://nicolasparada.netlify.com/ [b]: https://github.com/lujun9972 -[1]: https://nicolasparada.netlify.com/posts/go-messenger-schema/ -[2]: https://nicolasparada.netlify.com/posts/go-messenger-oauth/ -[3]: https://nicolasparada.netlify.com/posts/go-messenger-conversations/ -[4]: https://nicolasparada.netlify.com/posts/go-messenger-messages/ -[5]: https://nicolasparada.netlify.com/posts/go-messenger-realtime-messages/ -[6]: https://nicolasparada.netlify.com/posts/go-messenger-dev-login/ -[7]: https://nicolasparada.netlify.com/posts/go-messenger-access-page/ -[8]: https://nicolasparada.netlify.com/posts/go-messenger-home-page/ +[1]: https://linux.cn/article-11396-1.html +[2]: https://linux.cn/article-11510-1.html +[3]: https://linux.cn/article-12056-1.html +[4]: https://linux.cn/article-12680-1.html +[5]: https://linux.cn/article-12685-1.html +[6]: https://linux.cn/article-12692-1.html +[7]: https://linux.cn/article-12704-1.html +[8]: https://linux.cn/article-12722-1.html [9]: https://nicolasparada.netlify.com/img/go-messenger-conversation-page/heading.png [10]: https://nicolasparada.netlify.com/img/go-messenger-conversation-page/list.png [11]: https://nicolasparada.netlify.com/img/go-messenger-conversation-page/form.png diff --git a/published/202010/20190102 Using Yarn on Ubuntu and Other Linux Distributions.md b/published/202010/20190102 Using Yarn on Ubuntu and Other Linux Distributions.md new file mode 100644 index 0000000000..0222a78d37 --- /dev/null +++ b/published/202010/20190102 Using Yarn on Ubuntu and Other Linux Distributions.md @@ -0,0 +1,273 @@ +[#]: collector: (lujun9972) +[#]: translator: (gxlct008) +[#]: reviewer: (wxy) +[#]: publisher: (wxy) +[#]: url: (https://linux.cn/article-12737-1.html) +[#]: subject: (Using Yarn on Ubuntu and Other Linux Distributions) +[#]: via: (https://itsfoss.com/install-yarn-ubuntu) +[#]: author: (Abhishek Prakash https://itsfoss.com/author/abhishek/) + +在 Ubuntu 和其他 Linux 发行版上使用 Yarn +====== + +> 本速成教程向你展示了在 Ubuntu 和 Debian Linux 上安装 Yarn 包管理器的官方方法。你还将学习到一些基本的 Yarn 命令以及彻底删除 Yarn 的步骤。 + +[Yarn][1] 是 Facebook 开发的开源 JavaScript 包管理器。它是流行的 npm 包管理器的一个替代品,或者应该说是改进。 [Facebook 开发团队][2] 创建 Yarn 是为了克服 [npm][3] 的缺点。 Facebook 声称 Yarn 比 npm 更快、更可靠、更安全。 + +与 npm 一样,Yarn 为你提供一种自动安装、更新、配置和删除从全局注册库中检索到的程序包的方法。 + +Yarn 的优点是它更快,因为它可以缓存已下载的每个包,所以无需再次下载。它还将操作并行化,以最大化资源利用率。在执行每个已安装的包代码之前,Yarn 还使用 [校验和来验证完整性][4]。 Yarn 还保证可以在一个系统上运行的安装,在任何其他系统上都会以完全相同地方式工作。 + +如果你正 [在 Ubuntu 上使用 node.js][5],那么你的系统上可能已经安装了 npm。在这种情况下,你可以使用 npm 通过以下方式全局安装 Yarn: + +``` +sudo npm install yarn -g +``` + +不过,我推荐使用官方方式在 Ubuntu/Debian 上安装 Yarn。 + +### 在 Ubuntu 和 Debian 上安装 Yarn [官方方式] + +![Yarn JS][6] + +这里提到的说明应该适用于所有版本的 Ubuntu,例如 Ubuntu 18.04、16.04 等。同样的一组说明也适用于 Debian 和其他基于 Debian 的发行版。 + +由于本教程使用 `curl` 来添加 Yarn 项目的 GPG 密钥,所以最好验证一下你是否已经安装了 `curl`。 + +``` +sudo apt install curl +``` + +如果 `curl` 尚未安装,则上面的命令将安装它。既然有了 `curl`,你就可以使用它以如下方式添加 Yarn 项目的 GPG 密钥: + +``` +curl -sS https://dl.yarnpkg.com/debian/pubkey.gpg | sudo apt-key add - +``` + +在此之后,将存储库添加到源列表中,以便将来可以轻松地升级 Yarn 包,并进行其余系统更新: + +``` +sudo sh -c 'echo "deb https://dl.yarnpkg.com/debian/ stable main" >> /etc/apt/sources.list.d/yarn.list' +``` + +你现在可以继续了。[更新 Ubuntu][7] 或 Debian 系统,以刷新可用软件包列表,然后安装 Yarn: + +``` +sudo apt update +sudo apt install yarn +``` + +这将一起安装 Yarn 和 node.js。该过程完成后,请验证是否已成功安装 Yarn。 你可以通过检查 Yarn 版本来做到这一点。 + +``` +yarn --version +``` + +对我来说,它显示了这样的输出: + +``` +yarn --version +1.12.3 +``` + +这意味着我的系统上安装了 Yarn 版本 1.12.3。 + +### 使用 Yarn + +我假设你对 JavaScript 编程以及依赖项的工作原理有一些基本的了解。我在这里不做详细介绍。我将向你展示一些基本的 Yarn 命令,这些命令将帮助你入门。 + +#### 使用 Yarn 创建一个新项目 + +与 `npm` 一样,Yarn 也可以使用 `package.json` 文件。在这里添加依赖项。所有依赖包都缓存在项目根目录下的 `node_modules` 目录中。 + +在项目的根目录中,运行以下命令以生成新的 `package.json` 文件: + +它会问你一些问题。你可以按回车键跳过或使用默认值。 + +``` +yarn init +yarn init v1.12.3 +question name (test_yarn): test_yarn_proect +question version (1.0.0): 0.1 +question description: Test Yarn +question entry point (index.js): +question repository url: +question author: abhishek +question license (MIT): +question private: +success Saved package.json +Done in 82.42s. +``` + +这样,你就得到了一个如下的 `package.json` 文件: + +``` +{ + "name": "test_yarn_proect", + "version": "0.1", + "description": "Test Yarn", + "main": "index.js", + "author": "abhishek", + "license": "MIT" +} +``` + +现在你有了 `package.json`,你可以手动编辑它以添加或删除包依赖项,也可以使用 Yarn 命令(首选)。 + +#### 使用 Yarn 添加依赖项 + +你可以通过以下方式添加对特定包的依赖关系: + +``` +yarn add <包名> +``` + +例如,如果你想在项目中使用 [Lodash][8],则可以使用 Yarn 添加它,如下所示: + +``` +yarn add lodash +yarn add v1.12.3 +info No lockfile found. +[1/4] Resolving packages… +[2/4] Fetching packages… +[3/4] Linking dependencies… +[4/4] Building fresh packages… +success Saved lockfile. +success Saved 1 new dependency. +info Direct dependencies +└─ [email protected] +info All dependencies +└─ [email protected] +Done in 2.67s. +``` + +你可以看到,此依赖项已自动添加到 `package.json` 文件中: + +``` +{ + "name": "test_yarn_proect", + "version": "0.1", + "description": "Test Yarn", + "main": "index.js", + "author": "abhishek", + "license": "MIT", + "dependencies": { + "lodash": "^4.17.11" + } +} +``` + +默认情况下,Yarn 将在依赖项中添加最新版本的包。如果要使用特定版本,可以在添加时指定。 + +``` +yarn add package@version-or-tag +``` + +像往常一样,你也可以手动更新 `package.json` 文件。 + +#### 使用 Yarn 升级依赖项 + +你可以使用以下命令将特定依赖项升级到其最新版本: + +``` +yarn upgrade <包名> +``` + +它将查看所​​涉及的包是否具有较新的版本,并且会相应地对其进行更新。 + +你还可以通过以下方式更改已添加的依赖项的版本: + +``` +yarn upgrade package_name@version_or_tag +``` + +你还可以使用一个命令将项目的所有依赖项升级到它们的最新版本: + +``` +yarn upgrade +``` + +它将检查所有依赖项的版本,如果有任何较新的版本,则会更新它们。 + +#### 使用 Yarn 删除依赖项 + +你可以通过以下方式从项目的依赖项中删除包: + +``` +yarn remove <包名> +``` + +#### 安装所有项目依赖项 + +如果对你 `project.json` 文件进行了任何更改,则应该运行: + +``` +yarn +``` + +或者, + +``` +yarn install +``` + +一次安装所有依赖项。 + +### 如何从 Ubuntu 或 Debian 中删除 Yarn + +我将通过介绍从系统中删除 Yarn 的步骤来完成本教程,如果你使用上述步骤安装 Yarn 的话。如果你意识到不再需要 Yarn 了,则可以将它删除。 + +使用以下命令删除 Yarn 及其依赖项。 + +``` +sudo apt purge yarn +``` + +你也应该从源列表中把存储库信息一并删除掉: + +``` +sudo rm /etc/apt/sources.list.d/yarn.list +``` + +下一步删除已添加到受信任密钥的 GPG 密钥是可选的。但要做到这一点,你需要知道密钥。你可以使用 `apt-key` 命令获得它: + +``` +Warning: apt-key output should not be parsed (stdout is not a terminal) pub rsa4096 2016-10-05 [SC] 72EC F46A 56B4 AD39 C907 BBB7 1646 B01B 86E5 0310 uid [ unknown] Yarn Packaging yarn@dan.cx sub rsa4096 2016-10-05 [E] sub rsa4096 2019-01-02 [S] [expires: 2020-02-02] +``` + +这里的密钥是以 `pub` 开始的行中 GPG 密钥指纹的最后 8 个字符。 + +因此,对于我来说,密钥是 `86E50310`,我将使用以下命令将其删除: + +``` +sudo apt-key del 86E50310 +``` + +你会在输出中看到 `OK`,并且 Yarn 包的 GPG 密钥将从系统信任的 GPG 密钥列表中删除。 + +我希望本教程可以帮助你在 Ubuntu、Debian、Linux Mint、 elementary OS 等操作系统上安装 Yarn。 我提供了一些基本的 Yarn 命令,以帮助你入门,并完成了从系统中删除 Yarn 的完整步骤。 + +希望你喜欢本教程,如果有任何疑问或建议,请随时在下面留言。 + + +-------------------------------------------------------------------------------- + +via: https://itsfoss.com/install-yarn-ubuntu + +作者:[Abhishek Prakash][a] +选题:[lujun9972][b] +译者:[gxlct008](https://github.com/gxlct008) +校对:[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://yarnpkg.com/lang/en/ +[2]: https://code.fb.com/ +[3]: https://www.npmjs.com/ +[4]: https://itsfoss.com/checksum-tools-guide-linux/ +[5]: https://itsfoss.com/install-nodejs-ubuntu/ +[6]: https://i2.wp.com/itsfoss.com/wp-content/uploads/2019/01/yarn-js-ubuntu-debian.jpeg?resize=800%2C450&ssl=1 +[7]: https://itsfoss.com/update-ubuntu/ +[8]: https://lodash.com/ diff --git a/published/20190521 How to Disable IPv6 on Ubuntu Linux.md b/published/202010/20190521 How to Disable IPv6 on Ubuntu Linux.md similarity index 100% rename from published/20190521 How to Disable IPv6 on Ubuntu Linux.md rename to published/202010/20190521 How to Disable IPv6 on Ubuntu Linux.md diff --git a/published/20190822 Things You Didn-t Know About GNU Readline.md b/published/202010/20190822 Things You Didn-t Know About GNU Readline.md similarity index 100% rename from published/20190822 Things You Didn-t Know About GNU Readline.md rename to published/202010/20190822 Things You Didn-t Know About GNU Readline.md diff --git a/published/202010/20191105 My first contribution to open source- Making a decision.md b/published/202010/20191105 My first contribution to open source- Making a decision.md new file mode 100644 index 0000000000..a8863ea7ff --- /dev/null +++ b/published/202010/20191105 My first contribution to open source- Making a decision.md @@ -0,0 +1,59 @@ +[#]: collector: (lujun9972) +[#]: translator: (chenmu-kk) +[#]: reviewer: (wxy) +[#]: publisher: (wxy) +[#]: url: (https://linux.cn/article-12768-1.html) +[#]: subject: (My first contribution to open source: Making a decision) +[#]: via: (https://opensource.com/article/19/11/my-first-open-source-contribution-mistake-decisions) +[#]: author: (Galen Corey https://opensource.com/users/galenemco) + +我的第一次开源贡献:做出决定 +====== + +> 一位新的开源贡献者告诉你如何加入到开源项目中。 + +![](https://img.linux.net.cn/data/attachment/album/202010/30/112350rh0xwp1x1y6awehn.jpg) + +先前,我把我的第一次开源贡献的拖延归咎于[冒牌综合症][2]。但还有一个我无法忽视的因素:我做出决定太艰难了。在[成千上百万][3]的开源项目中选择时,选择一个要做贡献的项目是难以抉择的。如此重负,以至于我常常不得不关掉我的笔记本去思考:“或许我改天再做吧”。 + +错误之二是让我对做出决定的恐惧妨碍了我做出第一次贡献。在理想世界里,也许开始我的开源之旅时,心中就已经有了一个真正关心和想去做的具体项目,但我有的只是总得为开源项目做出贡献的模糊目标。对于那些处于同一处境的人来说,这儿有一些帮助我挑选出合适的项目(或者至少是一个好的项目)来做贡献的策略。 + +### 经常使用的工具 + +一开始,我不认为有必要将自己局限于已经熟悉的工具或项目。有一些项目我之前从未使用过,但由于它们的社区很活跃,或者它们解决的问题很有趣,因此看起来很有吸引力。 + +但是,考虑我投入到这个项目中的时间有限,我决定继续投入到我了解的工具上去。要了解工具需求,你需要熟悉它的工作方式。如果你想为自己不熟悉的项目做贡献,则需要完成一个额外的步骤来了解代码的功能和目标。这个额外的工作量可能是有趣且值得的,但也会使你的工作时间加倍。因为我的目标主要是贡献,投入到我了解的工具上是缩小范围的很好方式。回馈一个你认为有用的项目也是有意义的。 + +### 活跃而友好的社区 + +在选择项目的时候,我希望在那里有人会审查我写的代码才会觉得有信心。当然,我也希望审核我代码的人是个和善的人。毕竟,把你的作品放在那里接受公众监督是很可怕的。虽然我对建设性的反馈持开放态度,但开发者社区中的一些有毒角落是我希望避免的。 + +为了评估我将要加入的社区,我查看了我正在考虑加入的仓库的议题issue部分。我要查看核心团队中是否有人定期回复。更重要的是,我试着确保没有人在评论中互相诋毁(这在议题讨论中是很常见的)。我还留意了那些有行为准则的项目,概述了什么是适当的和不适当的在线互动行为。 + +### 明确的贡献准则 + +因为这是我第一次为开源项目做出贡献,在此过程中我有很多问题。一些项目社区在流程的文档记录方面做的很好,可以用来指导挑选其中的议题并发起拉取请求。 [Gatsby][4] 是这种做法的典范,尽管那时我没有选择它们,因为在此之前我从未使用过该产品。 + +这种清晰的文档帮助我们缓解了一些不知如何去做的不安全感。它也给了我希望:项目对新的贡献者是开放的,并且会花时间来查看我的工作。除了贡献准则外,我还查看了议题部分,看看这个项目是否使用了“第一个好议题good first issue”标志。这是该项目对初学者开放的另一个迹象(并可以帮助你学会要做什么)。 + +### 总结 + +如果你还没有计划好选择一个项目,那么选择合适的领域进行你的第一个开源贡献更加可行。列出一系列标准可以帮助自己缩减选择范围,并为自己的第一个拉取请求找到一个好的项目。 + +-------------------------------------------------------------------------------- + +via: https://opensource.com/article/19/11/my-first-open-source-contribution-mistake-decisions + +作者:[Galen Corey][a] +选题:[lujun9972][b] +译者:[chenmu-kk](https://github.com/chenmu-kk) +校对:[wxy](https://github.com/wxy) + +本文由 [LCTT](https://github.com/LCTT/TranslateProject) 原创编译,[Linux中国](https://linux.cn/) 荣誉推出 + +[a]: https://opensource.com/users/galenemco +[b]: https://github.com/lujun9972 +[1]: https://opensource.com/sites/default/files/styles/image-full-size/public/lead-images/lightbulb-idea-think-yearbook-lead.png?itok=5ZpCm0Jh (Lightbulb) +[2]: https://opensource.com/article/19/10/my-first-open-source-contribution-mistakes +[3]: https://github.blog/2018-02-08-open-source-project-trends-for-2018/ +[4]: https://www.gatsbyjs.org/contributing/ diff --git a/published/20200512 Scan your Linux security with Lynis.md b/published/202010/20200512 Scan your Linux security with Lynis.md similarity index 100% rename from published/20200512 Scan your Linux security with Lynis.md rename to published/202010/20200512 Scan your Linux security with Lynis.md diff --git a/published/202010/20200521 Use the internet from the command line with curl.md b/published/202010/20200521 Use the internet from the command line with curl.md new file mode 100644 index 0000000000..9880cead4e --- /dev/null +++ b/published/202010/20200521 Use the internet from the command line with curl.md @@ -0,0 +1,171 @@ +[#]: collector: (lujun9972) +[#]: translator: (MjSeven) +[#]: reviewer: (wxy) +[#]: publisher: (wxy) +[#]: url: (https://linux.cn/article-12772-1.html) +[#]: subject: (Use the internet from the command line with curl) +[#]: via: (https://opensource.com/article/20/5/curl-cheat-sheet) +[#]: author: (Seth Kenlon https://opensource.com/users/seth) + +使用 curl 从命令行访问互联网 +====== + +> 下载我们整理的 curl 备忘录。要在不使用图形界面的情况下从互联网上获取所需的信息,curl 是一种快速有效的方法。 + +![](https://img.linux.net.cn/data/attachment/album/202010/31/000543n032ud499yy4d94v.jpg) + +`curl` 通常被视作一款非交互式 Web 浏览器,这意味着它能够从互联网上获取信息,并在你的终端中显示,或将其保存到文件中。从表面看,这是 Web 浏览器,类似 Firefox 或 Chromium 所做的工作,只是它们默认情况下会*渲染*信息,而 `curl` 会下载并显示原始信息。实际上,`curl` 命令可以做更多的事情,并且能够使用多种协议与服务器进行双向传输数据,这些协议包括 HTTP、FTP、SFTP、IMAP、POP3、LDAP、SMB、SMTP 等。对于普通终端用户来说,这是一个有用的工具;而对于系统管理员,这非常便捷;对于微服务和云开发人员来说,它是一个质量保证工具。 + +`curl` 被设计为在没有用户交互的情况下工作,因此与 Firefox 不同,你必须从头到尾考虑与在线数据的交互。例如,如果想要在 Firefox 中查看网页,你需要启动 Firefox 窗口。打开 Firefox 后,在地址栏或搜索引擎中输入要访问的网站。然后,导航到网站,然后单击要查看的页面。 + +对于 `curl` 来说也是如此,不同之处在于你需要一次执行所有操作:在启动 `curl` 的同时提供需要访问的互联网地址,并告诉它是否要将数据保存在终端或文件中。当你必须与需要身份验证的网站或 API 进行交互时,会变得有点复杂,但是一旦你学习了 `curl` 命令语法,它就会变得自然而然。为了帮助你掌握它,我们在一个方便的[备忘录][2]中收集了相关的语法信息。 + +### 使用 curl 下载文件 + +你可以通过提供指向特定 URL 的链接来使用 `curl` 命令下载文件。如果你提供的 URL 默认为 `index.html`,那么将下载此页面,并将下载的文件显示在终端屏幕上。你可以将数据通过管道传递到 `less`、`tail` 或任何其它命令: + +``` +$ curl "http://example.com" | tail -n 4 +

Example Domain

+

This domain is for use in illustrative examples in documents. You may use this domain in literature without prior coordination or asking for permission.

+

More information...

+ +``` + +由于某些 URL 包含特殊字符,shell 通常会将其解释,因此最安全的做法用引号将 URL 包起来。 + +某些文件无法很好的在终端中转换显示。你可以使用 `--remote-name` 选项使文件根据服务器上的命名进行保存: + +``` +$ curl --remote-name "https://example.com/linux-distro.iso" +$ ls +linux-distro.iso +``` + +或者,你可以使用 `--output` 选项来命名你想要下载的内容: + +``` +curl "http://example.com/foo.html" --output bar.html +``` + +### 使用 curl 列出带有远程目录的内容 + +因为 `curl` 不是交互式的,所以很难浏览页面上的可下载元素。如果你要连接的远程服务器允许,可以使用 `curl` 来列出目录的内容: + +``` +$ curl --list-only "https://example.com/foo/" +``` + +### 继续中断下载 + +如果你正在下载一个非常大的文件,你可能会发现有时候必须中断下载。`curl` 非常智能,可以确定下载从何处中断并继续下载。这意味着,下一次当你下载一个 4GB 的 Linux 发行版的 ISO 出现问题时,就不必重新开始了。`--continue-at` 的语法有点不寻常:如果你知道下载中断时的字节数,你可以提供给 `curl`;否则,你可以使用单独的一个破折号(`-`)指示 curl 自动检测: + +``` +$ curl --remote-name --continue-at - "https://example.com/linux-distro.iso" +``` + +### 下载文件序列 + +如果你需要下载多个文件而不是一个大文件,那么 `curl` 可以帮助你解决这个问题。假设你知道要下载的文件的位置和文件名模式,则可以使用 `curl` 的序列标记:中括号里是整数范围的起点和终点。对于输出文件名,使用 `#1` 表示第一个变量: + +``` +$ curl "https://example.com/file_[1-4].webp" --output "file_#1.webp" +``` + +如果你需要使用其它变量来表示另一个序列,按照每个变量在命令中出现的顺序表示它们。例如,在这个命令中,`#1` 指目录 `images_000` 到 `images_009`,而 `#2` 指目录 `file_1.webp` 至 `file_4.webp`: + +``` +$ curl "https://example.com/images_00[0-9]/file_[1-4].webp" --output "file_#1-#2.webp" +``` + +### 从站点下载所有 PNG 文件 + +你也可以仅使用 `curl` 和 `grep` 进行一些基本的 Web 抓取操作,以找到想要下载的内容。例如,假设你需要下载与正在归档网页关联的所有图像,首先,下载引用了图像的页面。将页面内通过管道传输到 `grep`,搜索所需的图片类型(在此示例中为 PNG)。最后,创建一个 `while` 循环来构造下载 URL,并将文件保存到你的计算机: + +``` +$ curl https://example.com |\ +grep --only-matching 'src="[^"]*.[png]"' |\ +cut -d\" -f2 |\ +while read i; do \ +curl https://example.com/"${i}" -o "${i##*/}"; \ +done +``` + +这只是一个示例,但它展示了 `curl` 与 Unix 管道和一些基本而巧妙的解析结合使用时是多么的灵活。 + +### 获取 HTML 头 + +用于数据交换的协议在计算机发送通信的数据包中嵌入了大量元数据。HTTP 头是数据初始部分的组件。在连接一个网站出现问题时,查看这些报文头(尤其是响应码)会有所帮助: + +``` +curl --head "https://example.com" +HTTP/2 200 +accept-ranges: bytes +age: 485487 +cache-control: max-age=604800 +content-type: text/html; charset=UTF-8 +date: Sun, 26 Apr 2020 09:02:09 GMT +etag: "3147526947" +expires: Sun, 03 May 2020 09:02:09 GMT +last-modified: Thu, 17 Oct 2019 07:18:26 GMT +server: ECS (sjc/4E76) +x-cache: HIT +content-length: 1256 +``` + +### 快速失败 + +响应 200 通常是 HTTP 成功指示符,这是你与服务器连接时通常期望的结果。著名的 404 响应表示找不到页面,而 500 则表示服务器在处理请求时出现了错误。 + +要查看协商过程中发生了什么错误,添加 `--show-error` 选项: + +``` +$ curl --head --show-error "http://opensource.ga" +``` + +除非你可以访问要连接的服务器,否则这些问题将很难解决,但是 `curl` 通常会尽力连接你指定的地址。有时在网络上进行测试时,无休止的重试似乎只会浪费时间,因此你可以使用 `--fail-early` 选项来强制 `curl` 在失败时迅速退出: + +``` +curl --fail-early "http://opensource.ga" +``` + +### 由 3xx 响应指定的重定向查询 + +300 这个系列的响应更加灵活。具体来说,301 响应意味着一个 URL 已被永久移动到其它位置。对于网站管理员来说,重新定位内容并留下“痕迹”是一种常见的方式,这样访问旧地址的人们仍然可以找到它。默认情况下,`curl` 不会进行 301 重定向,但你可以使用 `--localtion` 选项使其继续进入 301 响应指向的目标: + +``` +$ curl "https://iana.org" | grep title +301 Moved Permanently +$ curl --location "https://iana.org" +Internet Assigned Numbers Authority +``` + +### 展开短网址 + +如果你想要在访问短网址之前先查看它们,那么 `--location` 选项非常有用。短网址对于有字符限制的社交网络(当然,如果你使用[现代和开源的社交网络][4]的话,这可能不是问题),或者对于用户不能复制粘贴长地址的印刷媒体来说是有用处的。但是,它们也可能存在风险,因为其目的地址本质上是隐藏的。通过结合使用 `--head` 选项仅查看 HTTP 头,`--location` 选项可以查看一个 URL 的最终地址,你可以查看一个短网址而无需加载其完整的资源: + +``` +$ curl --head --location "" +``` + +### 下载我们的 curl 备忘录 + +一旦你开始考虑了将探索 web 由一条命令来完成,那么 `curl` 就成为一种快速有效的方式,可以从互联网上获取所需的信息,而无需麻烦图形界面。为了帮助你适应到工作流中,我们创建了一个 [curl 备忘录][2],它包含常见的 `curl` 用法和语法,包括使用它查询 API 的概述。 + +-------------------------------------------------------------------------------- + +via: https://opensource.com/article/20/5/curl-cheat-sheet + +作者:[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/coverimage_cheat_sheet.png?itok=lYkNKieP (Cheat Sheet cover image) +[2]: https://opensource.com/downloads/curl-command-cheat-sheet +[3]: https://www.iana.org/domains/example"\>More +[4]: https://opensource.com/article/17/4/guide-to-mastodon diff --git a/published/20200629 Using Bash traps in your scripts.md b/published/202010/20200629 Using Bash traps in your scripts.md similarity index 100% rename from published/20200629 Using Bash traps in your scripts.md rename to published/202010/20200629 Using Bash traps in your scripts.md diff --git a/published/20200723 Automate testing for website errors with this Python tool.md b/published/202010/20200723 Automate testing for website errors with this Python tool.md similarity index 100% rename from published/20200723 Automate testing for website errors with this Python tool.md rename to published/202010/20200723 Automate testing for website errors with this Python tool.md diff --git a/published/20200810 How to read Lynis reports to improve Linux security.md b/published/202010/20200810 How to read Lynis reports to improve Linux security.md similarity index 100% rename from published/20200810 How to read Lynis reports to improve Linux security.md rename to published/202010/20200810 How to read Lynis reports to improve Linux security.md diff --git a/published/20200811 TCP window scaling, timestamps and SACK.md b/published/202010/20200811 TCP window scaling, timestamps and SACK.md similarity index 100% rename from published/20200811 TCP window scaling, timestamps and SACK.md rename to published/202010/20200811 TCP window scaling, timestamps and SACK.md diff --git a/published/202010/20200820 Learn the basics of programming with C.md b/published/202010/20200820 Learn the basics of programming with C.md new file mode 100644 index 0000000000..8e54cdc13d --- /dev/null +++ b/published/202010/20200820 Learn the basics of programming with C.md @@ -0,0 +1,266 @@ +[#]: collector: (lujun9972) +[#]: translator: (robsean) +[#]: reviewer: (wxy) +[#]: publisher: (wxy) +[#]: url: (https://linux.cn/article-12732-1.html) +[#]: subject: (Learn the basics of programming with C) +[#]: via: (https://opensource.com/article/20/8/c-programming-cheat-sheet) +[#]: author: (Seth Kenlon https://opensource.com/users/seth) + +C 语言简单编程速成 +====== + +> 我们将所有的 C 语言要素放置到一份易读的备忘录上。 + +![](https://img.linux.net.cn/data/attachment/album/202010/18/213610t3do3u7oev2udoyn.png) + +1972 年,丹尼斯·里奇Dennis Ritchie任职于贝尔实验室Bell Labs,在几年前,他和他的团队成员发明了 Unix 。在创建了一个经久不衰的操作系统(至今仍在使用)之后,他需要一种好的方法来对这些 Unix 计算机编程,以便它们可用执行新的任务。在现在看来,这很奇怪,但在当时,编程语言相对较少,Fortran、Lisp、[Algol][2] 以及 B 语言都很流行,但是,对于贝尔实验室的研究员们想要做的事情来说,它们还是远远不够的。丹尼斯·里奇表现出一种后来被称为程序员的主要特征的特质:创造了他自己的解决方案。他称之为 C 语言,并且在近 50 年后,它仍在广泛的使用。 + +### 为什么你应该学习 C 语言 + +今天,有很多语言为程序员提供了比 C 语言更多的特性。最明显的是 C++ 语言,这是一种以相当露骨的方式命名的语言,它构建在 C 语言之上,创建了一种很好的面向对象语言。不过,许多其它语言的存在是有充分理由的。计算机擅长一致的重复,因此任何可预见的东西都可以构建在编程语言中,对程序员来说这意味着更少的工作量。为什么在 C++ 语言中用一行语句就可以将一个 `int` 转换为一个 `long` 时(`long x = long(n);`),还要在 C 语言用两行语句呢? + +然而,C 语言在今天仍然有用。 + +首先,C 语言是一种相当简约和直接的语言。除了编程的基础知识之外,并没有很高级的概念,这很大程度上是因为 C 语言实际上就是现代编程语言的基础之一。例如,C 语言的特性之一是数组,但是它不提供字典(除非你自己写一个)。当你学习 C 语言时,你会学习编程的基础组成部分,它可以帮助你认识到如今的编程语言的改进及其的精心设计。 + +因为 C 语言是一种最小化的编程语言,你的应用程序很可能会获得性能上的提升,这在其它许多编程语言中是看不到的。当你考虑你的代码可以执行多快的时候,很容易陷入锱铢必较的境地,因此,重要的是要问清楚你是否*需要*为某一特定任务提供更多的速度。与 Python 或 Java 相比,使用 C 语言,你在每行代码中需要纠结的地方更少。C 语言程序运行很快。这是 Linux 内核使用 C 语言编写的一个很好的理由。 + +最后,C 语言很容易入门,特别是,如果你正在运行 Linux,就已经能运行 C 语言代码了,因为 Linux 系统包含 GNU C 库(`glibc`)。为了编写和构建 C 语言程序,你需要做的全部工作就是安装一个编译器,打开一个文本编辑器,开始编码。 + +### 开始学习 C 语言 + +如果你正在运行 Linux ,你可以使用你的软件包管理器安装一个 C 编译器。在 Fedora 或 RHEL 上: + +``` +$ sudo dnf install gcc +``` + +在 Debian 及其衍生系统上: + +``` +$ sudo apt install build-essential +``` + +在 macOS 上,你可以 [安装 Homebrew][3] ,并使用它来安装 [GCC][4]: + +``` +$ brew install gcc +``` + +在 Windows 上, 你可以使用 [MinGW][5] 安装一套最小的包含 GCC 的 GNU 实用程序集。 + +在 Linux 或 macOS 上验证你已经安装的 GCC: + +``` +$ gcc --version +gcc (GCC) x.y.z +Copyright (C) 20XX Free Software Foundation, Inc. +``` + +在 Windows 上,提供 EXE 文件的完整路径: + +``` +PS> C:\MinGW\bin\gcc.exe --version +gcc.exe (MinGW.org GCC Build-2) x.y.z +Copyright (C) 20XX Free Software Foundation, Inc. +``` + +### C 语法 + +C 语言不是一种脚本语言。它是一种编译型语言,这意味着它由 C 编译器处理来产生一个二进制可执行文件。这不同于脚本语言(如 [Bash][6])或混合型语言(如 [Python][7])。 + +在 C 语言中,你可以创建*函数*来执行你希望做到的任务。默认情况下,执行的是一个名为 `main` 的函数。 + +这里是一个使用 C 语言写的简单的 “hello world” 程序: + +``` +#include + +int main() { + printf("Hello world"); + return 0; +} +``` + +第一行包含一个被称为 `stdio.h`(标准输入和输出)的 *头文件*,它基本上是自由使用的、非常初级的 C 语言代码,你可以在你自己的程序中重复使用它。然后创建了一个由一条基本的输出语句构成的名为 `main` 的函数。保存这些文本到一个被称为 `hello.c` 的文件中,然后使用 GCC 编译它: + +``` +$ gcc hello.c --output hello +``` + +尝试运行你的 C 语言程序: + +``` +$ ./hello +Hello world$ +``` + +#### 返回值 + +这是 Unix 哲学的一部分,一个函数在执行后“返回”一些东西:在成功时不返回任何东西,在失败时返回其它的一些东西(例如,一个错误信息)。这些返回的内容通常使用数字(确切地说是整数)表示:`0` 表示没有错误,任何大于 `0` 的数字都表示一些不成功的状态。 + +Unix 和 Linux 被设计成在运行成功时保持沉默是很明智的。这是为了让你在执行一系列命令时,假设没有任何错误或警告会妨碍你的工作,从而可以始终为成功执行做准备。类似地,在 C 语言中的函数在设计上也预期不出现错误。 + +你可以通过一个小的修改,让你的程序看起来是失败的,就可以看到这一点: + +``` +include + +int main() { + printf("Hello world"); + return 1; +} +``` + +编译它: + +``` +$ gcc hello.c --output failer +``` + +现在使用一个内置的 Linux 测试方式来运行它。仅在*成功*时,`&&` 操作符才会执行一个命令的第二部分。例如: + +``` +$ echo "success" && echo "it worked" +success +it worked +``` + +在*失败*时,`||` 测试会执行一个命令的第二部分。 + +``` +$ ls blah || echo "it did not work" +ls: cannot access 'blah': No such file or directory +it did not work +``` + +现在,尝试你的程序,在成功时,它*不*返回 `0`;而是返回 `1`: + +``` +$ ./failer && echo "it worked" +String is: hello +``` + +这个程序成功地执行了,但是没有触发第二个命令。 + +#### 变量和类型 + +在一些语言中,你可以创建变量而不具体指定变量所包含的数据的*类型*。这些语言如此设计使得解释器需要对一个变量运行一些测试来视图发现变量是什么样的数据类型。例如,`var=1` 定义了一个整型数,当你创建一个表达式将 `var` 与某些东西相加时,Python 知道显然它是一个整型数。它同样知道当你连接 `hello` 和 `world` 时,单词 `world` 是一个字符串。 + +C 语言不会为你做任何这些识别和调查;你必须自己定义你的变量类型。这里有几种变量类型,包括整型(`int`),字符型(`char`),浮点型(`float`),布尔型(`boolean`)。 + +你可能也注意到这里没有字符串类型。与 Python 和 Java 和 Lua 以及其它的编程语言不同,C 语言没有字符串类型,而是将字符串看作一个字符数组。 + +这里是一些简单的代码,它建立了一个 `char` 数组变量,然后使用 [printf][9] 将数组变量和一段简单的信息打印到你的屏幕上: + +``` +#include + +int main() { + char var[6] = "hello"; + printf("Your string is: %s\r\n",var); +} +``` + +你可能会注意到,这个代码示例向一个由五个字母组成的单词提供了六个字符的空间。这是因为在字符串的结尾有处一个隐藏的终止符,它占用了数组中的一个字节。你可以通过编译和执行代码来运行它: + +``` +$ gcc hello.c --output hello +$ ./hello +hello +``` + +### 函数 + +和其它的编程语言一样,C 函数也接受可选的参数。你可以通过定义你希望函数接受的数据类型,来将参数从一个函数传递到另一个函数: + +``` +#include + +int printmsg(char a[]) { + printf("String is: %s\r\n",a); +} + +int main() { + char a[6] = "hello"; + printmsg(a); + return 0; +} +``` + +简单地将一个函数分解为两个函数的这种方法并不是非常有用,但是它演示了默认运行 `main` 函数以及如何在函数之间传递数据。 + +### 条件语句 + +在真实的编程中,你通常希望你的代码根据数据做出判断。这是使用*条件*语句完成的,`if` 语句是其中最基础的一个语句。 + +为了使这个示例程序更具动态性,你可以包含 `string.h` 头文件,顾名思义,它包含用于检查字符串的代码。尝试使用来自 `string.h` 文件中的 `strlen` 函数测试传递给 `printmsg` 函数的字符串是否大于 `0`: + +``` +#include +#include + +int printmsg(char a[]) { + size_t len = strlen(a); + if ( len > 0) { + printf("String is: %s\r\n",a); + } +} + +int main() { + char a[6] = "hello"; + printmsg(a); + return 1; +} +``` + +正如在这个示例中所实现的,该条件永远都不会是非真的,因为所提供的字符串总是 `hello`,它的长度总是大于 `0`。这个不够认真的重新实现的 `echo` 命令的最后一点要做是接受来自用户的输入。 + +### 命令参数 + +`stdio.h` 文件包含的代码在每次程序启动时提供了两个参数: 一个是命令中包含多少项的计数(`argc`),一个是包含每个项的数组(`argv`)。例如, 假设你发出这个虚构的命令: + +``` +$ foo -i bar +``` + +`argc` 是 `3`,`argv` 的内容是: + + * `argv[0] = foo` + * `argv[1] = -i` + * `argv[2] = bar` + +你可以修改示例 C 语言程序来以字符串方式接受 `argv[2]`,而不是默认的 `hello` 吗? + +### 命令式编程语言 + +C 语言是一种命令式编程语言。它不是面向对象的,也没有类结构。使用 C 语言的经验可以教你很多关于如何处理数据,以及如何更好地管理你的代码运行时生成的数据。多使用 C 语言,你最后能够编写出其它语言(例如 Python 和 Lua)可以使用的库。 + +想要了解更多关于 C 的知识,你需要使用它。在 `/usr/include/` 中查找有用的 C 语言头文件,并且看看你可以做什么小任务来使 C 语言对你有用。在学习的过程中,使用来自 FreeDOS 的 [Jim Hall][12] 编写的 [C 语言忘备录][11]。它在一张双面纸忘备录上放置了所有的基本要素,所以在你练习时,可以立即访问 C 语言语法的所有要素。 + +-------------------------------------------------------------------------------- + +via: https://opensource.com/article/20/8/c-programming-cheat-sheet + +作者:[Seth Kenlon][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://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/6/algol68 +[3]: https://opensource.com/article/20/6/homebrew-mac +[4]: https://gcc.gnu.org/ +[5]: https://opensource.com/article/20/8/gnu-windows-mingw +[6]: https://opensource.com/resources/what-bash +[7]: https://opensource.com/resources/python +[8]: http://www.opengroup.org/onlinepubs/009695399/functions/printf.html +[9]: https://opensource.com/article/20/8/printf +[10]: http://www.opengroup.org/onlinepubs/009695399/functions/strlen.html +[11]: https://opensource.com/downloads/c-programming-cheat-sheet +[12]: https://opensource.com/users/jim-hall diff --git a/published/20200826 What is IPv6, and why aren-t we there yet.md b/published/202010/20200826 What is IPv6, and why aren-t we there yet.md similarity index 100% rename from published/20200826 What is IPv6, and why aren-t we there yet.md rename to published/202010/20200826 What is IPv6, and why aren-t we there yet.md diff --git a/published/20200901 Create a mobile app with Flutter.md b/published/202010/20200901 Create a mobile app with Flutter.md similarity index 100% rename from published/20200901 Create a mobile app with Flutter.md rename to published/202010/20200901 Create a mobile app with Flutter.md diff --git a/published/20200903 A practical guide to learning awk.md b/published/202010/20200903 A practical guide to learning awk.md similarity index 100% rename from published/20200903 A practical guide to learning awk.md rename to published/202010/20200903 A practical guide to learning awk.md diff --git a/published/20200908 How to install software with Ansible.md b/published/202010/20200908 How to install software with Ansible.md similarity index 100% rename from published/20200908 How to install software with Ansible.md rename to published/202010/20200908 How to install software with Ansible.md diff --git a/published/202010/20200910 Automate your container orchestration with Ansible modules for Kubernetes.md b/published/202010/20200910 Automate your container orchestration with Ansible modules for Kubernetes.md new file mode 100644 index 0000000000..c30f1e28d9 --- /dev/null +++ b/published/202010/20200910 Automate your container orchestration with Ansible modules for Kubernetes.md @@ -0,0 +1,252 @@ +[#]: collector: (lujun9972) +[#]: translator: (HankChow) +[#]: reviewer: (wxy) +[#]: publisher: (wxy) +[#]: url: (https://linux.cn/article-12766-1.html) +[#]: subject: (Automate your container orchestration with Ansible modules for Kubernetes) +[#]: via: (https://opensource.com/article/20/9/ansible-modules-kubernetes) +[#]: author: (Seth Kenlon https://opensource.com/users/seth) + +使用 Ansible 的 Kubernetes 模块实现容器编排自动化 +====== + +> 将 Kubernetes 与 Ansible 结合实现云端自动化。此外,还可以参照我们的 Ansible 的 k8s 模块速查表。 + +![](https://img.linux.net.cn/data/attachment/album/202010/28/211747jhlttlf3f81xrffi.jpg) + +[Ansible][2] 是实现自动化工作的优秀工具,而 [Kubernetes][3] 则是容器编排方面的利器,要是把两者结合起来,会有怎样的效果呢?正如你所猜测的,Ansible + Kubernetes 的确可以实现容器编排自动化。 + +### Ansible 模块 + +实际上,Ansible 本身只是一个用于解释 YAML 文件的框架。它真正强大之处在于它[丰富的模块][4],所谓模块module,就是在 Ansible 剧本playbook 中让你得以通过简单配置就能调用外部应用程序的一些工具。 + +Ansible 中有模块可以直接操作 Kubernetes,也有对一些相关组件(例如 [Docker][5] 和 [Podman][6])实现操作的模块。学习使用一个新模块的过程和学习新的终端命令、API 一样,可以先从文档中了解这个模块在调用的时候需要接受哪些参数,以及这些参数在外部应用程序中产生的具体作用。 + +### 访问 Kubernetes 集群 + +在使用 Ansible Kubernetes 模块之前,先要有能够访问 Kubernetes 集群的权限。在没有权限的情况下,可以尝试使用一个短期在线试用账号,但我们更推荐的是按照 Kubernetes 官网上的指引,或是参考 Braynt Son 《[入门 Kubernetes][8]》的教程安装 [Minikube][7]。Minikube 提供了一个单节点 Kubernetes 实例的安装过程,你可以像使用一个完整集群一样对其进行配置和交互。 + +- 下载 [Ansible k8s 速记表][9](需注册) + +在安装 Minikube 之前,你需要确保你的环境支持虚拟化并安装 `libvirt`,然后对 `libvirt` 用户组授权: + +``` +$ sudo dnf install libvirt +$ sudo systemctl start libvirtd +$ sudo usermod --append --groups libvirt `whoami` +$ newgrp libvirt +``` + +#### 安装 Python 模块 + +为了能够在 Ansible 中使用 Kubernetes 相关的模块,你需要安装以下这些 Python 模块: + +``` +$ pip3.6 install kubernetes --user +$ pip3.6 install openshift --user +``` + +#### 启动 Kubernetes + +如果你使用的是 Minikube 而不是完整的 Kubernetes 集群,请使用 `minikube` 命令在本地创建一个最精简化的 Kubernetes 实例: + +``` +$ minikube start --driver=kvm2 --kvm-network default +``` + +然后等待 Minikube 完成初始化,这个过程所需的时间会因实际情况而异。 + +### 获取集群信息 + +集群启动以后,通过 `cluster-info` 选项就可以获取到集群相关信息了: + +``` +$ kubectl cluster-info +Kubernetes master is running at https://192.168.39.190:8443 +KubeDNS is running at https://192.168.39.190:8443/api/v1/namespaces/kube-system/services/kube-dns:dns/proxy + +To further debug and diagnose cluster problems, use 'kubectl cluster-info dump'. +``` + +### 使用 k8s 模块 + +Ansible 使用 `k8s` 这个模块来实现对 Kubernetes 的操作,在剧本中使用 `k8s` 模块就可以对 Kuvernetes 对象进行管理。这个模块描述了 `kubectl` 命令的最终状态,例如对于以下这个使用 `kubectl` 创建新的[命名空间][10]的操作: + +``` +$ kubectl create namespace my-namespace +``` + +这是一个很简单的操作,而对这个操作的最终状态用 YAML 文件来描述是这样的: + +``` +- hosts: localhost +  tasks: +    - name: create namespace +      k8s: +        name: my-namespace +        api_version: v1 +        kind: Namespace +        state: present +``` + +如果你使用的是 Minikube,那么主机名(`hosts`)应该定义为 `localhost`。需要注意的是,所使用的模块也定义了可用参数的语法(例如 `api_version` 和 `kind` 参数)。 + +在运行这个剧本之前,先通过 `yamllint` 命令验证是否有错误: + +``` +$ yamllint example.yaml +``` + +确保没有错误之后,运行剧本: + +``` +$ ansible-playbook ./example.yaml +``` + +可以验证新的命名空间是否已经被创建出来: + +``` +$ kubectl get namespaces +NAME              STATUS   AGE +default           Active   37h +kube-node-lease   Active   37h +kube-public       Active   37h +kube-system       Active   37h +demo              Active   11h +my-namespace      Active   3s +``` + +### 使用 Podman 拉取容器镜像 + +容器是个 Linux 系统,几乎是最小化的,可以由 Kubernetes 管理。[LXC 项目][11]和 Docker 定义了大部分的容器规范。最近加入容器工具集的是 Podman,它不需要守护进程就可以运行,为此受到了很多用户的欢迎。 + +通过 Podman 可以从 Docker Hub 或者 Quay.io 等存储库拉取容器镜像。这一操作对应的 Ansible 语法也很简单,只需要将存储库网站提供的镜像路径写在剧本中的相应位置就可以了: + +``` +   - name: pull an image +      podman_image: +        name: quay.io/jitesoft/nginx +``` + +使用 `yamllint` 验证: + +``` +$ yamllint example.yaml +``` + +运行剧本: + +``` +$ ansible-playbook ./example.yaml +[WARNING]: provided hosts list is empty, only localhost is available. +Note that the implicit localhost does not match 'all' + +PLAY [localhost] ************************ + +TASK [Gathering Facts] ************************ +ok: [localhost] + +TASK [create k8s namespace] ************************ +ok: [localhost] + +TASK [pull an image] ************************ +changed: [localhost] + +PLAY RECAP ************************ +localhost: ok=3 changed=1 unreachable=0 failed=0 +           skipped=0 rescued=0 ignored=0 +``` + +### 使用 Ansible 实现部署 + +Ansible 除了可以执行小型维护任务以外,还可以通过剧本实现其它由 `kubectl` 实现的功能,因为两者的 YAML 文件之间只有少量的差异。在 Kubernetes 中使用的 YAML 文件只需要稍加改动,就可以在 Ansible 剧本中使用。例如下面这个用于使用 `kubectl` 命令部署 Web 服务器的 YAML 文件: + +``` +apiVersion: apps/v1 +kind: Deployment +metadata: +  name: my-webserver +spec: +  selector: +    matchLabels: +      run: my-webserver +  replicas: 1 +  template: +    metadata: +      labels: +        run: my-webserver +    spec: +      containers: +      - name: my-webserver +        image: nginx +        ports: +        - containerPort: 80 +``` + +如果你对其中的参数比较熟悉,你只要把 YAML 文件中的大部分内容放到剧本中的 `definition` 部分,就可以在 Ansible 中使用了: + +``` +   - name: deploy a web server +      k8s: +        api_version: v1 +        namespace: my-namespace +        definition: +          kind: Deployment +          metadata: +            labels: +              app: nginx +            name: nginx-deploy +          spec: +            replicas: 1 +            selector: +              matchLabels: +                app: nginx +            template: +              metadata: +                labels: +                  app: nginx +              spec: +                containers: +                  - name: my-webserver +                    image: quay.io/jitesoft/nginx +                    ports: +                      - containerPort: 80 +                        protocol: TCP +``` + +执行完成后,使用 `kubectl` 命令可以看到预期中的的部署deployment: + +``` +$ kubectl -n my-namespace get pods +NAME                      READY  STATUS +nginx-deploy-7fdc9-t9wc2  1/1    Running +``` + +### 在云上使用模块 + +随着现在越来越多的开发和部署工作往云上转移的趋势,我们必须了解如何在云上实现自动化。其中 `k8s` 和 `podman_image` 这两个模块只是云开发中的其中一小部分。你可以在你的工作流程中寻找一些需要自动化的任务,并学习如何使用 Ansible 让你在这些任务上事半功倍。 + +-------------------------------------------------------------------------------- + +via: https://opensource.com/article/20/9/ansible-modules-kubernetes + +作者:[Seth Kenlon][a] +选题:[lujun9972][b] +译者:[HankChow](https://github.com/HankChow) +校对:[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/ship_captain_devops_kubernetes_steer.png?itok=LAHfIpek (Ship captain sailing the Kubernetes seas) +[2]: https://opensource.com/resources/what-ansible +[3]: https://opensource.com/resources/what-is-kubernetes +[4]: https://docs.ansible.com/ansible/latest/modules/modules_by_category.html +[5]: https://opensource.com/resources/what-docker +[6]: http://podman.io +[7]: https://kubernetes.io/docs/tasks/tools/install-minikube +[8]: https://opensource.com/article/18/10/getting-started-minikube +[9]: https://opensource.com/downloads/ansible-k8s-cheat-sheet +[10]: https://opensource.com/article/19/10/namespaces-and-containers-linux +[11]: https://www.redhat.com/sysadmin/exploring-containers-lxc diff --git a/published/202010/20200914 NFC vs. Bluetooth LE- When to use which.md b/published/202010/20200914 NFC vs. Bluetooth LE- When to use which.md new file mode 100644 index 0000000000..ddac09e47d --- /dev/null +++ b/published/202010/20200914 NFC vs. Bluetooth LE- When to use which.md @@ -0,0 +1,64 @@ +[#]: collector: (lujun9972) +[#]: translator: (chenmu-kk) +[#]: reviewer: (wxy) +[#]: publisher: (wxy) +[#]: url: (https://linux.cn/article-12735-1.html) +[#]: subject: (NFC vs. Bluetooth LE: When to use which) +[#]: via: (https://www.networkworld.com/article/3574932/nfc-vs-bluetooth-le-when-to-use-which.html) +[#]: author: (Jon Gold https://www.networkworld.com/author/Jon-Gold/) + +近场通信 vs. 低功耗蓝牙:如何抉择 +====== + +> 近场通信(NFC)和低功耗蓝牙(BLE)是适合企业不同用途的低功耗无线技术。 + +![](https://images.idgesg.net/images/article/2020/08/distributed_network_of_wifi_wi-fi_internet_connections_across_cityscape_by_metamorworks_gettyimages-926502948_2400x1600-100855926-large.jpg) + +在低功率、相对短距离连接的众多选择中,有两种技术脱颖而出——近场通信(NFC)和低功耗蓝牙(BLE)。两者都具有相对低廉的部署成本且易于使用。 + +NFC 作为许多现代智能卡片的背后技术而为大众所熟知。NFC 芯片必须十分接近(在几厘米内)读卡器来实现连接,但这是它主要企业用例(安全性和访问控制)的一个优势。 + +BLE 是主要蓝牙标准的低功耗衍生品,以较低的潜在吞吐量换来了能耗的显著降低,从而能够适应更广泛的潜在用例。 + +接下来,我们将对每种技术及其主要用例进行更深入的描述。 + +### NFC 的未来 + +NFC 在近距离接触范围内工作(设备间必须靠近到几厘米范围内来进行连接),一个可读的无源 NFC “标签”根本不需要任何独立电源,它会从读卡器的信号中汲取能量,工作频率约为 13.5MHz,在主动读取芯片时需要 100-700µA 的电量。 + +“短距离实际上是它的优势。”Gartner 研究高级总监兼分析师说, “NFC 的一大优点是它不仅仅是无线电,还内置了一个庞大的安全协议。”也就是说,潜在的不良行为者必须非常接近——使用专用设备、在几米的范围内——才能检测到正在发生的 NFC 连接。NFC 还可以施行在 SSL 技术上面一层以提高安全性。 + +考虑到 NFC 本就起源于非接触式支付技术,这不足为奇。它在这一领域的根基在于对零售商的吸引力,零售商可以利用 NFC 让客户在购买商品前获取相关的信息、获得优惠券或者向店员寻求帮助,只需将手机接触到 NFC 热点即可。 + +尽管 NFC 只能在一个很近的范围内使用,这限制了使用 NFC 技术用例场景,但它不仅仅是为了开门和买一杯拿铁。NFC 可以用于引导连接,便于设备间轻松快速的配对,因此用户只需在会议室中将手机贴近配备好的投影仪,即可创建一个 NFC 连接,并验证智能手机是否是一个可连接的授权设备,并进行演示。演示文稿或者视频数据本身不会通过 NFC 来传输,但是 NFC 握手可作为另外的无线协议(例如 Wi-Fi 网络或者任何其他更高带宽可以传输数据的网络)间的验证,从而无需用户登录。 + +### BLE 的特点 + +相较之下,BLE 的工作距离要远的多(长达几十米),其最大带宽 :1 Mbit/s 约为 NFC 连接的两倍。它是著名的蓝牙技术的产物,相较于主线标准的更低功耗,它为机器到机器的连接做了优化。在连接两端的耗电量均小于 15 mA,实用范围约为 10米,可通过 AES 加密保护连接。 + +然而,根据 Forrester 首席分析师 Andre Kindness 的说法,它远非 NFC 的替代品。 + +他说:“从信息传递角度来看, [NFC] 比 BLE 快得多。”BLE 通常需要几分之一秒或更长时间的验证并安全连接,而 NFC 几乎在瞬间完成连接。 + +不过,根据 IDC 高级研究分析师 Patrick Filkins 的说法,相较于 NFC,BLE 由于范围更广而有着更多的通用性。 + +他说:“我认为 BLE 比较适合企业”。而类似于资产追踪、室内导航和目标广告的用例只是冰山一角。 + +对于企业,结果是相当直接的——NFC 用例大多与公司使用蓝牙的用例是分开的,对于少有的可以选择的重叠,相对的优势和劣势显而易见。NFC 距离很短、价格便宜、可即时连接以及数据转换率较低。BLE 的工作距离更远、传输速率更高,成本也更高,连接时还需要一点时间来进行“握手”。 + +-------------------------------------------------------------------------------- + +via: https://www.networkworld.com/article/3574932/nfc-vs-bluetooth-le-when-to-use-which.html + +作者:[Jon Gold][a] +选题:[lujun9972][b] +译者:[chenmu-kk](https://github.com/chenmu-kk) +校对:[wxy](https://github.com/wxy) + +本文由 [LCTT](https://github.com/LCTT/TranslateProject) 原创编译,[Linux中国](https://linux.cn/) 荣誉推出 + +[a]: https://www.networkworld.com/author/Jon-Gold/ +[b]: https://github.com/lujun9972 +[1]: https://www.networkworld.com/newsletters/signup.html +[2]: https://www.facebook.com/NetworkWorld/ +[3]: https://www.linkedin.com/company/network-world diff --git a/published/20200916 How to Create-Configure LVM (Logical Volume Management) in Linux.md b/published/202010/20200916 How to Create-Configure LVM (Logical Volume Management) in Linux.md similarity index 100% rename from published/20200916 How to Create-Configure LVM (Logical Volume Management) in Linux.md rename to published/202010/20200916 How to Create-Configure LVM (Logical Volume Management) in Linux.md diff --git a/published/202010/20200917 GNOME 3.38 is Here With Customizable App Grid, Performance Improvements and Tons of Other Changes.md b/published/202010/20200917 GNOME 3.38 is Here With Customizable App Grid, Performance Improvements and Tons of Other Changes.md new file mode 100644 index 0000000000..b51f072124 --- /dev/null +++ b/published/202010/20200917 GNOME 3.38 is Here With Customizable App Grid, Performance Improvements and Tons of Other Changes.md @@ -0,0 +1,121 @@ +[#]: collector: (lujun9972) +[#]: translator: (robsean) +[#]: reviewer: (wxy) +[#]: publisher: (wxy) +[#]: url: (https://linux.cn/article-12726-1.html) +[#]: subject: (GNOME 3.38 is Here With Customizable App Grid, Performance Improvements and Tons of Other Changes) +[#]: via: (https://itsfoss.com/gnome-3-38-release/) +[#]: author: (Ankush Das https://itsfoss.com/author/ankush/) + +GNOME 3.38:可定制应用程序网格、性能改善 +====== + +![](https://img.linux.net.cn/data/attachment/album/202010/16/203906xys0py0nvi1d01ss.jpg) + +[GNOME 3.36][1] 带来大量亟需的改进,同时也带来性能的重大提升。现在,在 6 个月后,我们终于引来了 GNOME 3.38,并带来了一系列重大的变化。 + +### GNOME 3.38 主要特色 + +这里是 GNOME 3.38 (代码名称:Orbis) 的主要亮点: + +- [video](https://www.youtube.com/embed/DZ_P5W9r2JY) + +#### 可定制应用程序菜单 + +作为 GNOME 3.38 重大更改中的一部分,应用程序网格(或称应用菜单)现在是可以可定制的。 + +现在,你可以通过拖拽每个应用程序图标来创建文件夹,将它们移到文件夹,或移出文件夹并将其设置回应用网格。你也可以在应用网格中随心所欲地调整图标的位置。 + +![][3] + +此外,这些变化是一些即将到来的设计更改的基本组成部分,因此,看到我们可以期待的东西会很令人兴奋。 + +#### 日历菜单更新 + +![][4] + +随着最近一次的 GNOME 更新,通知区整洁了很多,但是现在随着 GNOME 3.38 的到来,你终于可以通过日历区域的正下方访问日历事件,使事情变得方便且容易访问。 + +它不是一个重大的视觉改造,但也是一些改善。 + +#### 家长控制改善 + +作为 GNOME 3.38 一部分,你将会注意家长控制服务。它支持与桌面、shell、设置以及其它各种各样组件的集成,来帮助你限制用户可以访问的内容。 + +#### 重新启动按钮 + +一些细微的改善导致了巨大的变化,重新启动按钮正是其中的一个变化。先单击 “关闭电源” / “关机” 按钮,再单击 “重新启动” 按钮的操作来重新启动系统总是让人很烦。 + +因此,随着 GNOME 3.38 的到来,你将最终会注意到一个作为单独按钮的 “重新启动” ,这将节省你的单击次数,平复你烦闷的心情。 + +#### 屏幕录制改善 + +[GNOME shell 内置的屏幕录制][5] 现在是一项独立的系统服务,这可能会使录制屏幕成为一种平滑流畅的体验。 + +另外,窗口截屏也有一些改善,并修复了一些错误: + +- [video](https://www.youtube.com/embed/c29ge3KwBk8) + +#### GNOME 应用程序更新 + +GNOME 计算器也收到很多的错误修复。除此之外,你也将发现 [epiphany GNOME 浏览器][6] 的一些重大改变。 + +GNOME Boxes 现在允许你从一个操作系统列表中选择将要运行的操作系统,GNOME 地图也有一些图像用户界面上的更改。 + +当然,不仅限于这些,你页将注意到 GNOME 控制中心、联系人、照片、Nautilus,以及其它一些软件包的细微更新和修复。 + +#### 性能和多显示器支持改善 + +这里有一大堆底层的改进来全面地改善 GNOME 3.38 。例如,[Mutter][7] 有一些重要的修正,它现在允许在两个显示器中使用不同的刷新频率。 + +![][8] + +先前,如果一台显示器的刷新频率为 60 Hz,而另一台的刷新频率为 144 Hz ,那么刷新频率较慢的显示器将限制另外一台显示器的刷新频率。但是,随着在 GNOME 3.38 中的改善,它将能够处理多个显示器,而不会使显示器相互限制。 + +另外,[Phoronix][9] 报告的一些更改指出,在一些情况下,缩短大约 10% 的渲染时间。因此,这绝对是一个很棒的性能优化。 + +#### 各种各样的其它更改 + + * 电池百分比指示器 + * 电源菜单中的重新启动选项 + * 新的欢迎指引 + * 指纹登录 + * 二维码扫描以共享 Wi-Fi 热点 + * GNOME 浏览器的隐私和其它改善 + * GNOME 地图现在反应敏捷并能根据屏幕大小改变其大小 + * 重新修订的图标 + +你可以在它们的官方 [更改日志][10] 中找到一个详细的更改列表。 + +### 总结 + +GNOME 3.38 确实是一个令人赞叹的更新,它改善了 GNOME 用户体验。尽管 GNOME 3.36 带来了性能的很大改善,但是针对 GNOME 3.38 的更多优化仍然是一件非常好的事. + +GNOME 3.38 将在 Ubuntu 20.10 和 [Fedora 33][11] 中可用。Arch 和 Manjaro 用户应该很快就能获得。 + +我认为有很多变化是朝着正确的方向发展的。你觉得呢? + +-------------------------------------------------------------------------------- + +via: https://itsfoss.com/gnome-3-38-release/ + +作者:[Ankush Das][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/ankush/ +[b]: https://github.com/lujun9972 +[1]: https://itsfoss.com/gnome-3-36-release/ +[2]: https://www.youtube.com/c/itsfoss?sub_confirmation=1 +[3]: https://i0.wp.com/itsfoss.com/wp-content/uploads/2020/09/gnome-app-arranger.jpg?resize=799%2C450&ssl=1 +[4]: https://i1.wp.com/itsfoss.com/wp-content/uploads/2020/09/gnome-3-38-calendar-menu.png?resize=800%2C721&ssl=1 +[5]: https://itsfoss.com/gnome-screen-recorder/ +[6]: https://en.wikipedia.org/wiki/GNOME_Web +[7]: https://en.wikipedia.org/wiki/Mutter_(software) +[8]: https://i1.wp.com/itsfoss.com/wp-content/uploads/2020/09/gnome-multi-monitor-refresh-rate.jpg?resize=800%2C369&ssl=1 +[9]: https://www.phoronix.com/scan.php?page=news_item&px=GNOME-3.38-Last-Min-Mutter +[10]: https://help.gnome.org/misc/release-notes/3.38 +[11]: https://itsfoss.com/fedora-33/ diff --git a/published/20200918 How to Extend-Increase LVM-s (Logical Volume Resize) in Linux.md b/published/202010/20200918 How to Extend-Increase LVM-s (Logical Volume Resize) in Linux.md similarity index 100% rename from published/20200918 How to Extend-Increase LVM-s (Logical Volume Resize) in Linux.md rename to published/202010/20200918 How to Extend-Increase LVM-s (Logical Volume Resize) in Linux.md diff --git a/published/20200921 Installing and running Vagrant using qemu-kvm.md b/published/202010/20200921 Installing and running Vagrant using qemu-kvm.md similarity index 100% rename from published/20200921 Installing and running Vagrant using qemu-kvm.md rename to published/202010/20200921 Installing and running Vagrant using qemu-kvm.md diff --git a/published/202010/20200922 How to Reduce-Shrink LVM-s (Logical Volume Resize) in Linux.md b/published/202010/20200922 How to Reduce-Shrink LVM-s (Logical Volume Resize) in Linux.md new file mode 100644 index 0000000000..7d1348c83f --- /dev/null +++ b/published/202010/20200922 How to Reduce-Shrink LVM-s (Logical Volume Resize) in Linux.md @@ -0,0 +1,169 @@ +[#]: collector: (lujun9972) +[#]: translator: (geekpi) +[#]: reviewer: (wxy) +[#]: publisher: (wxy) +[#]: url: (https://linux.cn/article-12740-1.html) +[#]: subject: (How to Reduce/Shrink LVM’s \(Logical Volume Resize\) in Linux) +[#]: via: (https://www.2daygeek.com/reduce-shrink-decrease-resize-lvm-logical-volume-in-linux/) +[#]: author: (Magesh Maruthamuthu https://www.2daygeek.com/author/magesh/) + +如何在 Linux 中减少/缩小 LVM 大小(逻辑卷调整) +====== + +![](https://img.linux.net.cn/data/attachment/album/202010/21/210459ydp5an23nfzgglyy.jpg) + +减少/缩小逻辑卷是数据损坏的最高风险。 + +所以,如果可能的话,尽量避免这种情况,但如果没有其他选择的话,那就继续。 + +缩减 LVM 之前,建议先做一个备份。 + +当你在 LVM 中的磁盘空间耗尽时,你可以通过缩小现有的没有使用全部空间的 LVM,而不是增加一个新的物理磁盘,在卷组上腾出一些空闲空间。 + +**需要注意的是:** 在 GFS2 或者 XFS 文件系统上不支持缩小。 + +如果你是逻辑卷管理 (LVM) 的新手,我建议你从我们之前的文章开始学习。 + +* **第一部分:[如何在 Linux 中创建/配置 LVM(逻辑卷管理)][1]** +* **第二部分:[如何在 Linux 中扩展/增加 LVM(逻辑卷调整)][2]** + +![](https://img.linux.net.cn/data/attachment/album/202010/21/210610kikq1xynfje7hjaa.jpeg) + +减少逻辑卷涉及以下步骤: + + * 卸载文件系统 + * 检查文件系统是否有任何错误 + * 缩小文件系统的大小 + * 缩小逻辑卷的大小 + * 重新检查文件系统是否存在错误(可选) + * 挂载文件系统 + * 检查减少后的文件系统大小 + +**比如:** 你有一个 **100GB** 的没有使用全部空间的 LVM,你想把它减少到 **80GB**,这样 **20GB** 可以用于其他用途。 + +``` +# df -h /testlvm1 + +Filesystem Size Used Avail Use% Mounted on +/dev/mapper/vg01-lv002 100G 15G 85G 12% /testlvm1 +``` + +### 卸载文件系统 + +使用 `umount` 命令卸载文件系统: + +``` +# umount /testlvm1 +``` + +### 检查文件系统是否有任何错误 + +使用 `e2fsck` 命令检查文件系统是否有错误: + +``` +# e2fsck -f /dev/mapper/vg01-lv002 + +e2fsck 1.42.9 (28-Dec-2013) +Pass 1: Checking inodes, blocks, and sizes +Pass 2: Checking directory structure +Pass 3: Checking directory connectivity +Pass 4: Checking reference counts +Pass 5: Checking group summary information +/dev/mapper/vg01-lv002: 13/6553600 files (0.0% non-contiguous), 12231854/26212352 blocks +``` + +### 缩小文件系统 + +下面的命令将把 `testlvm1` 文件系统从 **100GB** 缩小到 **80GB**。 + +**文件系统大小调整的常用语法(`resize2fs`)**: + +``` +resize2fs [现有逻辑卷名] [新的文件系统大小] +``` + +实际命令如下: + +``` +# resize2fs /dev/mapper/vg01-lv002 80G + +resize2fs 1.42.9 (28-Dec-2013) +Resizing the filesystem on /dev/mapper/vg01-lv002 to 28321400 (4k) blocks. +The filesystem on /dev/mapper/vg01-lv002 is now 28321400 blocks long. +``` + +### 减少逻辑卷 (LVM) 容量 + +现在使用 `lvreduce` 命令缩小逻辑卷(LVM) 的大小。通过下面的命令, `/dev/mapper/vg01-lv002` 将把逻辑卷 (LVM) 从 100GB 缩小到 80GB。 + +**LVM 缩减 (`lvreduce`) 的常用语法**: + +``` +lvreduce [新的 LVM 大小] [现有逻辑卷名称] +``` + +实际命令如下: + +``` +# lvreduce -L 80G /dev/mapper/vg01-lv002 + +WARNING: Reducing active logical volume to 80.00 GiB +THIS MAY DESTROY YOUR DATA (filesystem etc.) +Do you really want to reduce lv002? [y/n]: y +Reducing logical volume lv002 to 80.00 GiB +Logical volume lv002 successfully resized +``` + +### 可选:检查文件系统是否有错误 + +缩减 LVM 后再次检查文件系统是否有错误: + +``` +# e2fsck -f /dev/mapper/vg01-lv002 + +e2fsck 1.42.9 (28-Dec-2013) +Pass 1: Checking inodes, blocks, and sizes +Pass 2: Checking directory structure +Pass 3: Checking directory connectivity +Pass 4: Checking reference counts +Pass 5: Checking group summary information +/dev/mapper/vg01-lv002: 13/4853600 files (0.0% non-contiguous), 1023185/2021235 blocks +``` + +### 挂载文件系统并检查缩小后的大小 + +最后挂载文件系统,并检查缩小后的文件系统大小。 + +使用 `mount` 命令[挂载逻辑卷][4]: + +``` +# mount /testlvm1 +``` + +使用 [df 命令][5]检查挂载的卷。 + +``` +# df -h /testlvm1 + +Filesystem Size Used Avail Use% Mounted on +/dev/mapper/vg01-lv002 80G 15G 65G 18% /testlvm1 +``` + +-------------------------------------------------------------------------------- + +via: https://www.2daygeek.com/reduce-shrink-decrease-resize-lvm-logical-volume-in-linux/ + +作者:[Magesh Maruthamuthu][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.2daygeek.com/author/magesh/ +[b]: https://github.com/lujun9972 +[1]: https://linux.cn/article-12670-1.html +[2]: https://linux.cn/article-12673-1.html +[3]: https://www.2daygeek.com/wp-content/uploads/2020/09/reduce-shrink-decrease-resize-lvm-logical-volume-in-linux-1.png +[4]: https://www.2daygeek.com/mount-unmount-file-system-partition-in-linux/ +[5]: https://www.2daygeek.com/linux-check-disk-space-usage-df-command/ diff --git a/published/20200923 Find security issues in Go code using gosec.md b/published/202010/20200923 Find security issues in Go code using gosec.md similarity index 100% rename from published/20200923 Find security issues in Go code using gosec.md rename to published/202010/20200923 Find security issues in Go code using gosec.md diff --git a/published/20200925 5 questions to ask yourself when writing project documentation.md b/published/202010/20200925 5 questions to ask yourself when writing project documentation.md similarity index 100% rename from published/20200925 5 questions to ask yourself when writing project documentation.md rename to published/202010/20200925 5 questions to ask yourself when writing project documentation.md diff --git a/published/20200926 10 Open Source Static Site Generators to Create Fast and Resource-Friendly Websites.md b/published/202010/20200926 10 Open Source Static Site Generators to Create Fast and Resource-Friendly Websites.md similarity index 100% rename from published/20200926 10 Open Source Static Site Generators to Create Fast and Resource-Friendly Websites.md rename to published/202010/20200926 10 Open Source Static Site Generators to Create Fast and Resource-Friendly Websites.md diff --git a/published/202010/20200926 Linux Jargon Buster- What is FOSS (Free and Open Source Software)- What is Open Source.md b/published/202010/20200926 Linux Jargon Buster- What is FOSS (Free and Open Source Software)- What is Open Source.md new file mode 100644 index 0000000000..69af9d8b63 --- /dev/null +++ b/published/202010/20200926 Linux Jargon Buster- What is FOSS (Free and Open Source Software)- What is Open Source.md @@ -0,0 +1,129 @@ +[#]: collector: (lujun9972) +[#]: translator: (wxy) +[#]: reviewer: (wxy) +[#]: publisher: (wxy) +[#]: url: (https://linux.cn/article-12748-1.html) +[#]: subject: (Linux Jargon Buster: What is FOSS \(Free and Open Source Software\)? What is Open Source?) +[#]: via: (https://itsfoss.com/what-is-foss/) +[#]: author: (Abhishek Prakash https://itsfoss.com/author/abhishek/) + +Linux 黑话解释:什么是 FOSS(自由和开源软件)?什么是开源? +====== + +![][7] + +什么是 FOSS? + +在过去,我曾多次被问到这个问题,现在是时候解释一下什么是 Linux 和软件世界中的 FOSS 了。 + +这个区别很重要,因为 FOSS 是一个通用的词汇,它可以根据上下文的不同而有不同的含义。在这里,我讨论的是软件中的 FOSS 原则。 + +### 什么是 FOSS? + +FOSS 是指自由和开放源码软件Free and Open Source Software。这并不意味着软件是免费的。它意味着软件的源代码是开放的,任何人都可以自由使用、研究和修改代码。这个原则允许人们像一个社区一样为软件的开发和改进做出贡献。 + +#### FOSS 的起源 + +在上世纪 60、70 年代,计算机以硬件为主,硬件价格昂贵。它们主要由大学的学者或实验室的研究人员使用。以前有限的软件都是免费的,或者是带有它们的源代码,用户可以根据自己的需要修改源代码。 + +在上世纪 70 年代末和 80 年代初,制造商为了不让自己的软件在竞争对手的计算机上运行,停止了分发源代码。 + +这种限制性的许可导致了那些习惯和喜欢修改软件的人的不便和不喜。上世纪 80 年代中期,Richard Stallman 发起了自由软件运动Free Software Movement。 + +[Stallman 指明了一个软件要成为 FOSS 的四个基本自由][1]。 + +![自由软件自由][2] + +为了便于理解,我将它们重新表述: + + * 任何用户应能为任何目的运行软件。 + * 用户应能自由查看软件的源代码,如有需要,应允许用户修改代码。 + * 用户应能自由地将软件的副本分发给他人。 + * 如果用户修改了代码,她/他应该可以自由地将修改后的代码发布给他人。修改后的代码必须开放源代码。 + +如果有兴趣,我建议阅读这篇关于 [FOSS 的历史][3]的文章。 + +### FOSS 中的 “Free” 并不意味着免费 + +![][4] + +你可能已经注意到了,自由和开源软件中的 “Free” 并不意味着它是免费的,它意味着运行、修改和分发软件的“自由”。 + +人们经常错误地认为,FOSS 或开源软件不能有价格标签。这是不正确的。 + +大多数 FOSS 都是免费提供的,原因有很多: + + * 源代码已经向公众开放,所以一些开发者认为没有必要在下载软件时贴上价格标签。 + * 有些项目是由一些志愿者免费提供的。因此,主要的开发者认为对这么多人免费贡献的东西收费是不道德的。 + * 有些项目是由较大的企业或非营利组织支持和/或开发的,这些组织会雇佣开发人员在他们的开源项目上工作。 + * 有些开发者创建开源项目是出于兴趣,或者出于他们对用代码为世界做贡献的热情。对他们来说,下载量、贡献和感谢的话比金钱更重要。 + +为了避免强调 “免费”,有些人使用了 FLOSS 这个词(LCTT 译注:有时候也写作 F/LOSS)。FLOSS 是自由和开源软件Free/Libre Open Source Software的缩写。单词 Libre(意为自由)与 gartuit/gratis(免费)不同。 + +> “Free” 是言论自由的自由,而不是免费啤酒的免费。 + +### FOSS 项目如何赚钱? + +开源项目不赚钱是一个神话。红帽是第一个达到 10 亿美元大关的开源公司。[IBM 以 340 亿美元收购了红帽][5]。这样的例子有很多。 + +许多开源项目,特别是企业领域的项目,都会提供收费的支持和面向企业的功能。这是红帽、SUSE Linux 和更多此类项目的主要商业模式。 + +一些开源项目,如 Discourse、WordPress 等,则提供其软件的托管实例,并收取一定的费用。 + +许多开源项目,特别是桌面应用程序,依靠捐赠。VLC、GIMP、Inkscape 等这类开源软件就属于这一类。有[资助开源项目的方法][6],但通常,你会在项目网站上找到捐赠链接。 + +利用开源软件赚钱可能很难,但也不是完全不可能。 + +### 但我不是程序员,我为什么要关心一个软件是否开源? + +这是一个合理的问题。你不是一个软件开发者,只是一个普通的计算机用户。即使软件的源代码是可用的,你也不会理解程序的工作原理。 + +这很好。你不会明白,但有必要技能的人就会明白,这才是最重要的。 + +你可以这样想。也许你不会理解一份复杂的法律文件。但如果你有看文件的自由,并保留一份副本,你就可以咨询某个人,他可以检查文件中的法律陷阱。 + +换句话说,开源软件具有透明度。 + +### FOSS 与开源之间的区别是什么? + +你会经常遇到 FOSS 和开源Open Source的术语。它们经常被互换使用。 + +它们是同一件事吗?这很难用“是”和“不是”来回答。 + +你看,FOSS 中的“Free”一词让很多人感到困惑,因为人们错误地认为它是免费的。企业高管、高层和决策者往往会关注自由和开源中的“免费”。由于他们是商业人士,专注于为他们的公司赚钱,“自由”一词在采用 FOSS 原则时起到了威慑作用。 + +这就是为什么在上世纪 90 年代中期创立了一个名为[开源促进会][8]Open Source Initiative的新组织。他们从自由和开放源码软件中去掉了“自由”一词,并创建了自己的[开放源码的定义][9],以及自己的一套许可证。 + +“开源Open Source”一词在软件行业特别流行。高管们对开源更加适应。开源软件的采用迅速增长,我相信 “免费”一词的删除确实起到了作用。 + +### 有问题吗? + +这正如我在[什么是 Linux 发行版][10]一文中所解释的那样,FOSS/开源的概念在 Linux 的发展和普及中起到了很大的作用。 + +我试图在这篇黑话解释文章中用更简单的语言解释 FOSS 和开源的概念,而试图避免在细节或技术精度上做过多的阐述。 + +我希望你现在对这个话题有了更好的理解。如果你有问题或建议,欢迎留言并继续讨论。 + +-------------------------------------------------------------------------------- + +via: https://itsfoss.com/what-is-foss/ + +作者:[Abhishek Prakash][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://itsfoss.com/author/abhishek/ +[b]: https://github.com/lujun9972 +[1]: https://www.gnu.org/philosophy/free-sw.html +[2]: https://i0.wp.com/itsfoss.com/wp-content/uploads/2020/09/foss-freedoms.jpg?resize=800%2C671&ssl=1 +[3]: https://itsfoss.com/history-of-foss/ +[4]: https://i1.wp.com/itsfoss.com/wp-content/uploads/2020/09/think-free-speech-not-free-beer.jpg?resize=800%2C800&ssl=1 +[5]: https://itsfoss.com/ibm-red-hat-acquisition/ +[6]: https://itsfoss.com/open-source-funding-platforms/ +[7]: https://i0.wp.com/itsfoss.com/wp-content/uploads/2020/09/what-is-foss.png?resize=800%2C450&ssl=1 +[8]: https://opensource.org/ +[9]: https://opensource.org/osd +[10]: https://itsfoss.com/what-is-linux-distribution/ diff --git a/published/20200928 Create template files in GNOME.md b/published/202010/20200928 Create template files in GNOME.md similarity index 100% rename from published/20200928 Create template files in GNOME.md rename to published/202010/20200928 Create template files in GNOME.md diff --git a/published/20200928 How to Use the Firefox Task Manager (to Find and Kill RAM and CPU Eating Tabs and Extensions).md b/published/202010/20200928 How to Use the Firefox Task Manager (to Find and Kill RAM and CPU Eating Tabs and Extensions).md similarity index 100% rename from published/20200928 How to Use the Firefox Task Manager (to Find and Kill RAM and CPU Eating Tabs and Extensions).md rename to published/202010/20200928 How to Use the Firefox Task Manager (to Find and Kill RAM and CPU Eating Tabs and Extensions).md diff --git a/published/20200928 How to view information on your Linux devices with lshw.md b/published/202010/20200928 How to view information on your Linux devices with lshw.md similarity index 100% rename from published/20200928 How to view information on your Linux devices with lshw.md rename to published/202010/20200928 How to view information on your Linux devices with lshw.md diff --git a/published/20200929 Drawing is an Open Source MS-Paint Type of App for Linux Desktop.md b/published/202010/20200929 Drawing is an Open Source MS-Paint Type of App for Linux Desktop.md similarity index 100% rename from published/20200929 Drawing is an Open Source MS-Paint Type of App for Linux Desktop.md rename to published/202010/20200929 Drawing is an Open Source MS-Paint Type of App for Linux Desktop.md diff --git a/published/202010/20200930 Present Slides in Linux Terminal With This Nifty Python Tool.md b/published/202010/20200930 Present Slides in Linux Terminal With This Nifty Python Tool.md new file mode 100644 index 0000000000..d780724635 --- /dev/null +++ b/published/202010/20200930 Present Slides in Linux Terminal With This Nifty Python Tool.md @@ -0,0 +1,101 @@ +[#]: collector: (lujun9972) +[#]: translator: (geekpi) +[#]: reviewer: (wxy) +[#]: publisher: (wxy) +[#]: url: (https://linux.cn/article-12719-1.html) +[#]: subject: (Present Slides in Linux Terminal With This Nifty Python Tool) +[#]: via: (https://itsfoss.com/presentation-linux-terminal/) +[#]: author: (Abhishek Prakash https://itsfoss.com/author/abhishek/) + +在 Linux 终端中展示幻灯片 +====== + +![](https://img.linux.net.cn/data/attachment/album/202010/15/000226j34xnkzzg7z7x9ka.jpg) + +演示文稿往往是枯燥的。这就是为什么有些人会添加动画或漫画/meme 来增加一些幽默和风格来打破单调。 + +如果你需要在你的大学或公司的演示文稿中加入一些独特的风格,那么使用 Linux 终端怎么样?想象一下,这将是多么酷的事情啊! + +### Present:Linux 终端中进行演示 + +在终端中可以做很多[有趣好玩的事情][1]。制作和展示幻灯片只是其中之一。 + +这个基于 Python 的应用名为 [Present][2],它可以让你创建基于 Markdown 和 YML 的幻灯片,你可以在你的大学或公司里演讲,并以真正的极客风格取悦人们。 + +我制作了一个视频,展示了在 Linux 终端中用 Present 演示一些东西的样子。 + +- [VIDEO](https://img.linux.net.cn/static/video/Makes%20ASCII%20Based%20Presentation%20Slides%20in%20Linux%20terminal-462902030.mp4) + +#### Present 的功能 + +你可以用 Present 做以下事情: + + * 使用 Markdown 语法在幻灯片中添加文本 + * 用箭头或 `PgUp`/`Down` 键控制幻灯片 + * 改变前景和背景颜色 + * 在幻灯片中添加图像 + * 增加代码块 + * 播放模拟代码,并用 codio YML 文件输出 + +#### 在 Linux 上安装 Present + +Present 是一个基于 Python 的工具,你可以使用 PIP 来安装它。你应该确保用这个命令[在 Ubuntu 上安装 Pip][4]: + +``` +sudo apt install python3-pip +``` + +如果你使用的是其他发行版,请检查你的包管理器来安装 PIP3。 + +安装 PIP 后,你就可以以这种方式全局安装 Present: + +``` +sudo pip3 install present +``` + +你也可以只为当前用户安装,但你也必须将 `~/.local/bin` 添加到你的 `PATH` 环境变量。 + +#### 在 Linux 终端中使用 Present 来创建和展示幻灯片 + +![][5] + +由于 Present 使用了 Markdown 语法,你应该用它来创建自己的幻灯片。在这里使用 [Markdown 编辑器][6]会有帮助。 + +Present 需要一个 Markdown 文件来读取和播放幻灯片。你可以[下载这个示例幻灯片][7],但你需要单独下载嵌入的图像,并将它放在图像文件夹内。 + + * 在 Markdown 文件中使用 `—` 来分隔幻灯片。 + * 使用 Markdown 语法在幻灯片中添加文本。 + * 使用以下语法添加图片 `![RC] (images/name.png)`。 + * 通过添加像 `` 这样的语法来改变幻灯片的颜色。 + * 使用像 `` 这样的语法来添加带有效果的幻灯片。 + * 使用 [codio 语法][8] 添加代码运行模拟。 + * 使用 `q` 退出演示,并用左/右箭头或 `PgUp`/`Down` 键控制幻灯片。 + +请记住,在演示时调整终端窗口的大小会把东西搞乱,按回车键也是如此。 + +### 总结 + +如果你熟悉 Markdown 和终端,使用 Present 对你来说并不困难。 + +你不能把它和常规的用 Impress、MS Office 等制作的幻灯片相比,但偶尔使用,它是一个很酷的工具。如果你是计算机科学/网络专业的学生,或者是开发人员或系统管理员,你的同事一定会觉得很有趣。 + +-------------------------------------------------------------------------------- + +via: https://itsfoss.com/presentation-linux-terminal/ + +作者:[Abhishek Prakash][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/abhishek/ +[b]: https://github.com/lujun9972 +[1]: https://itsfoss.com/funny-linux-commands/ +[2]: https://github.com/vinayak-mehta/present +[4]: https://itsfoss.com/install-pip-ubuntu/ +[5]: https://i0.wp.com/itsfoss.com/wp-content/uploads/2020/09/presentation-in-linux-terminal.png?resize=800%2C494&ssl=1 +[6]: https://itsfoss.com/best-markdown-editors-linux/ +[7]: https://github.com/vinayak-mehta/present/blob/master/examples/sample.md +[8]: https://present.readthedocs.io/en/latest/codio.html diff --git a/published/20200930 Recovering deleted files on Linux with testdisk.md b/published/202010/20200930 Recovering deleted files on Linux with testdisk.md similarity index 100% rename from published/20200930 Recovering deleted files on Linux with testdisk.md rename to published/202010/20200930 Recovering deleted files on Linux with testdisk.md diff --git a/published/20201005 Linux Jargon Buster- What is a Package Manager in Linux- How Does it Work.md b/published/202010/20201005 Linux Jargon Buster- What is a Package Manager in Linux- How Does it Work.md similarity index 100% rename from published/20201005 Linux Jargon Buster- What is a Package Manager in Linux- How Does it Work.md rename to published/202010/20201005 Linux Jargon Buster- What is a Package Manager in Linux- How Does it Work.md diff --git a/published/202010/20201006 Simplify your web experience with this internet protocol alternative.md b/published/202010/20201006 Simplify your web experience with this internet protocol alternative.md new file mode 100644 index 0000000000..dd013f7416 --- /dev/null +++ b/published/202010/20201006 Simplify your web experience with this internet protocol alternative.md @@ -0,0 +1,99 @@ +[#]: collector: (lujun9972) +[#]: translator: (geekpi) +[#]: reviewer: (wxy) +[#]: publisher: (wxy) +[#]: url: (https://linux.cn/article-12738-1.html) +[#]: subject: (Simplify your web experience with this internet protocol alternative) +[#]: via: (https://opensource.com/article/20/10/gemini-internet-protocol) +[#]: author: (Seth Kenlon https://opensource.com/users/seth) + +使用互联网协议替代方案 Gemini 简化你的 Web 体验 +====== + +> 用 Gemini 协议发现更安静、更简单的互联网新角落。 + +![](https://img.linux.net.cn/data/attachment/album/202010/21/070950dzph7mlm0h035h3o.jpg) + +如果你很久以前就已经上网了,或者是知识非常丰富,你可能还记得一个早期的文本共享协议,叫做 [Gopher][2]。Gopher 最终被 HTTP 协议所取代,当然,HTTP 协议是现代万维网的基础。对于很多人来说,“互联网internet”和“万维网World Wide Web”是一回事,因为很多人没有意识到在网上进行了*非* www 子域下的任何操作。 + +但一直以来,都有各种网络协议在互联网络上共享信息:Telnet、FTP、SSH、Torrent、GNUnet 等等。最近,在这一系列的替代品中又多了一个,它叫 [Gemini][3]。 + +Gemini(双子座)协议,以“水星计划”和“阿波罗计划”的基础实验之间的太空任务命名,旨在和平地处在 Gopher 和 HTTP 之间。无论如何,它的目的并不是要取代现代 Web,但它确实试图创造一个简化的网络和一个现代化的 Gopher。 + +它的发展历史虽然可能很年轻,但意义重大,原因有很多。当然,人们会因为技术和哲学上的原因而对现代 Web 表示质疑,但它只是一般的臃肿。当你真正想要的是一个非常具体的问题的可靠答案时,那么无数次点击谷歌搜索的结果让人感觉过头了。 + +许多人使用 Gopher 就是因为这个原因:它的规模小到可以让小众的兴趣很容易找到。然而,Gopher 是一个旧的协议,它对编程、网络和浏览做出了一些假设,但这些假设已经不再适用了。 Gemini 的目标是将最好的网络带入一种类似于 Gopher 但易于编程的格式。一个简单的 Gemini 浏览器可以用几百行代码写成,并且有一个非常好的浏览器用 1600 行左右写成。这对于程序员、学生和极简主义者来说都是一个强大的功能。 + +### 如何浏览 Gemini + +就像早期的网络一样,Gemini 的规模很小,所以有一个列表列出了运行 Gemini 网站的已知服务器。就像浏览 HTTP 站点需要一个网页浏览器一样,访问 Gemini 站点也需要一个 Gemini 浏览器。在 [Gemini 网站][4]上列出了有几个可用的浏览器。 + +最简单的一个是 [AV-98][5] 客户端。它是用 Python 编写的,在终端中运行。要想试试的话,请下载它: + +``` +$ git clone https://tildegit.org/solderpunk/AV-98.git +``` + +进入下载目录,运行 AV-98: + +``` +$ cd AV-98.git +$ python3 ./main.py +``` + +客户端是一个交互式的提示符。它有有限的几个命令,主要的命令是简单的 `go`,后面跟着一个 Gemini 服务器地址。在已知的 [Gemini 服务器][6]列表中选择一个看起来很有趣的服务器,然后尝试访问它: + +``` +AV-98> go gemini://example.club + +Welcome to the example.club Gemini server! + +Here are some folders of ASCII art: + +[1] Penguins +[2] Wildebeests +[3] Demons +``` + +导航是按照编号的链接来进行的。例如,要进入 `Penguins` 目录,输入 `1` 然后按回车键: + + +``` +AV-98> 1 + +[1] Gentoo +[2] Emperor +[3] Little Blue +``` + +要返回,输入 `back` 并按回车键: + +``` +AV-98> back +``` + +更多命令,请输入 `help`。 + +### 用 Gemini 作为你的 web 替代 + +Gemini 协议非常简单,初级和中级程序员都可以为其编写客户端,而且它是在互联网上分享内容的一种简单快捷的方式。虽然万维网的无处不在对广泛传播是有利的,但总有替代方案的空间。看看 Gemini,发现更安静、更简单的互联网的新角落。 + +-------------------------------------------------------------------------------- + +via: https://opensource.com/article/20/10/gemini-internet-protocol + +作者:[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/1980s-computer-yearbook.png?itok=eGOYEKK- (Person typing on a 1980's computer) +[2]: https://en.wikipedia.org/wiki/Gopher_%28protocol%29 +[3]: https://gemini.circumlunar.space/ +[4]: https://gemini.circumlunar.space/clients.html +[5]: https://tildegit.org/solderpunk/AV-98 +[6]: https://portal.mozz.us/gemini/gemini.circumlunar.space/servers diff --git a/published/202010/20201008 Integrate your calendar with Ansible to avoid schedule conflicts.md b/published/202010/20201008 Integrate your calendar with Ansible to avoid schedule conflicts.md new file mode 100644 index 0000000000..a37438c779 --- /dev/null +++ b/published/202010/20201008 Integrate your calendar with Ansible to avoid schedule conflicts.md @@ -0,0 +1,106 @@ +[#]: collector: (lujun9972) +[#]: translator: (geekpi) +[#]: reviewer: (wxy) +[#]: publisher: (wxy) +[#]: url: (https://linux.cn/article-12733-1.html) +[#]: subject: (Integrate your calendar with Ansible to avoid schedule conflicts) +[#]: via: (https://opensource.com/article/20/10/calendar-ansible) +[#]: author: (Nicolas Leiva https://opensource.com/users/nicolas-leiva) + +将你的日历与 Ansible 集成,以避免与日程冲突 +====== + +> 通过将日历应用集成到 Ansible 中,确保你的自动化工作流计划不会与其他东西冲突。 + +![](https://img.linux.net.cn/data/attachment/album/202010/18/221110wk9kd9ewrde11zxx.jpg) + +“随时”是执行自动化工作流的好时机吗?出于不同的原因,答案可能是否定的。 + +如果要避免同时进行更改,以最大限度地减少对关键业务流程的影响,并降低意外服务中断的风险,则在你的自动化运行的同时,其他任何人都不应该试图进行更改。 + +在某些情况下,可能存在一个正在进行的计划维护窗口。或者,可能有大型事件即将来临、一个关键的业务时间、或者假期(你或许不想在星期五晚上进行更改)。 + +![Street scene with a large calendar and people walking][2] + +无论出于什么原因,你都希望将此信息发送到你的自动化平台,以防止在特定时间段内执行周期性或临时任务。用变更管理的行话,我说的是当变更活动不应该发生时,指定封锁窗口。 + +### Ansible 中的日历集成 + +如何在 [Ansible][5] 中实现这个功能?虽然它本身没有日历功能,但 Ansible 的可扩展性将允许它与任何具有 API 的日历应用集成。 + +目标是这样的:在执行任何自动化或变更活动之前,你要执行一个 `pre-task` ,它会检查日历中是否已经安排了某些事情(目前或最近),并确认你没有在一个阻塞的时间段中。 + +想象一下,你有一个名为 `calendar` 的虚构模块,它可以连接到一个远程日历,比如 Google 日历,以确定你指定的时间是否已经以其他方式被标记为繁忙。你可以写一个类似这样的剧本: + +``` +- name: Check if timeslot is taken +  calendar: +    time: "{{ ansible_date_time.iso8601 }}" +  register: output +``` + +Ansible 实际会给出 `ansible_date_time`,将其传递给 `calendar` 模块,以验证时间的可用性,以便它可以注册响应 (`output`),用于后续任务。 + +如果你的日历是这样的: + +![Google Calendar screenshot][6] + +那么这个任务的输出就会指明这个时间段被占用的事实 (`busy: true`): + +``` +ok: [localhost] => { +   "output": { +       "busy": true, +       "changed": false, +       "failed": false, +       "msg": "The timeslot 2020-09-02T17:53:43Z is busy: true" +   } +} +``` + +### 阻止任务运行 + +接下来,[Ansible Conditionals][8] 将帮助阻止所有之后任务的执行。一个简单的例子,你可以在下一个任务上使用 `when` 语句来强制它只有当上一个输出中的 `busy` 字段不是 `true` 时,它才会运行: + +``` +tasks: +  - shell: echo "Run this only when not busy!" +    when: not output.busy +``` + +### 总结 + +在[上一篇文章][9]中,我说过 Ansible 是一个将事物连接在一起的框架,将不同的组成部分相互连接,以协调端到端自动化工作流。 + +这篇文章探讨了 Ansible 剧本如何与日历应用集成以检查可用性。然而,我只做了一些表面工作!例如,你的任务也可以阻止日历中的一个时间段,这里的发挥空间很大。 + +在我的下一篇文章中,我将深入 `calendar` 模块是如何构建的,以及其他编程语言如何与 Ansible 一起使用。如果你和我一样是 [Go][10] 的粉丝,请继续关注! + +* * * + +_这篇文章最初发表在 Medium 上,名为 [Ansible and Google Calendar integration for change management][11],采用 CC BY-SA 4.0 许可,经许可后转载。_ + +-------------------------------------------------------------------------------- + +via: https://opensource.com/article/20/10/calendar-ansible + +作者:[Nicolas Leiva][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/nicolas-leiva +[b]: https://github.com/lujun9972 +[1]: https://opensource.com/sites/default/files/styles/image-full-size/public/lead-images/calendar.jpg?itok=jEKbhvDT (Calendar close up snapshot) +[2]: https://opensource.com/sites/default/files/uploads/street-calendar.jpg (Street scene with a large calendar and people walking) +[3]: https://www.flickr.com/photos/7841127@N02/4217116202 +[4]: https://creativecommons.org/licenses/by-nd/2.0/ +[5]: https://docs.ansible.com/ansible/latest/index.html +[6]: https://opensource.com/sites/default/files/uploads/googlecalendarexample.png (Google Calendar screenshot) +[7]: https://creativecommons.org/licenses/by-sa/4.0/ +[8]: https://docs.ansible.com/ansible/latest/user_guide/playbooks_conditionals.html +[9]: https://medium.com/swlh/python-and-ansible-to-automate-a-network-security-workflow-28b9a44660c6 +[10]: https://golang.org/ +[11]: https://medium.com/swlh/ansible-and-google-calendar-integration-for-change-management-7c00553b3d5a diff --git a/published/202010/20201009 How to Install Deepin Desktop on Ubuntu 20.04 LTS.md b/published/202010/20201009 How to Install Deepin Desktop on Ubuntu 20.04 LTS.md new file mode 100644 index 0000000000..84fc35c76f --- /dev/null +++ b/published/202010/20201009 How to Install Deepin Desktop on Ubuntu 20.04 LTS.md @@ -0,0 +1,133 @@ +[#]: collector: (lujun9972) +[#]: translator: (gxlct008) +[#]: reviewer: (wxy) +[#]: publisher: (wxy) +[#]: url: (https://linux.cn/article-12724-1.html) +[#]: subject: (How to Install Deepin Desktop on Ubuntu 20.04 LTS) +[#]: via: (https://itsfoss.com/install-deepin-ubuntu/) +[#]: author: (Ankush Das https://itsfoss.com/author/ankush/) + +如何在 Ubuntu 20.04 LTS 上安装深度(Deepin)桌面环境 +====== + +![](https://img.linux.net.cn/data/attachment/album/202010/15/223607kqs5zguiq53fkkig.png) + +> 本教程向你展示在 Ubuntu 上安装深度(Deepin)桌面环境的正确步骤。还提到了移除步骤。 + +毫无疑问,深度操作系统(Deepin OS)是一个 [漂亮的 Linux 发行版][1]。最近发布的 [深度操作系统 V20][2] 就更加美观了。 + +[深度操作系统][3] 是基于 [Debian][4] 的,默认的存储库镜像太慢了。如果你更愿意使用 Ubuntu,可以选择 [UbuntuDDE Linux 发行版][5] 形式的 Ubuntu 的深度操作系统的变体。它还不是 [官方的 Ubuntu 风格][6] 之一。 + +[重新安装新的发行版][7] 是一个麻烦,因为你会丢失数据,你将不得不在新安装的 UbuntuDDE 上重新安装你的应用程序。 + +一个更简单的选择是在现有的 Ubuntu 系统上安装深度桌面环境(DDE)。毕竟,你可以轻松地在一个系统中安装多个[桌面环境][8]。 + +不要烦恼,这很容易做到,如果你不喜欢,也可以恢复这些更改。让我来告诉你怎么做。 + +### 在 Ubuntu 20.04 上安装深度桌面环境 + +UbuntuDDE 团队已为他们的发行版创建了一个 PPA,你可以使用相同的 PPA 在 Ubuntu 20.04 上安装深度桌面环境。请记住,此 PPA 仅适用于 Ubuntu 20.04。请阅读有关 [在 Ubuntu 中使用 PPA][10]。 + +> 没有深度桌面环境 V20 +> +> 你将在此处使用 PPA 安装的深度桌面环境还不是新的 V20。它可能会在 Ubuntu 20.10 发布后出现,但是我们不能担保。 + +以下是你需要遵循的步骤: + +**步骤 1**:你需要首先在终端上输入以下内容,来添加 [Ubuntu DDE Remix 团队的官方 PPA][11]: + +``` +sudo add-apt-repository ppa:ubuntudde-dev/stable +``` + +**步骤 2**:添加存储库以后,继而安装深度桌面环境。 + +``` +sudo apt install ubuntudde-dde +``` + +![][12] + +现在,安装将启动,一段时间后,将要求你选择显示管理器display manager。 + +![][13] + +如果需要深度桌面主题的锁屏,则需要选择 “lightdm”。如果不需要,你可以将其设置为 “gdm3”。 + +如果你看不到此选项,可以通过键入以下命令来获得它,然后选择你首选的显示管理器: + +``` +sudo dpkg-reconfigure lightdm +``` + +**步骤 3**: 完成后,你必须退出并通过选择 “Deepin” 会话再次登录,或者重新启动系统。 + +![][14] + + +就是这样。马上在你的 Ubuntu 20.04 LTS 系统上享受深度桌面环境体验吧! + +![][15] + +### 从 Ubuntu 20.04 删除深度桌面 + +如果你不喜欢这种体验,或者由于某些原因它有 bug,可以按照以下步骤将其删除。 + +**步骤 1**: 如果你已将 “lightdm” 设置为显示管理器,则需要在卸载深度桌面环境之前将显示管理器设置为 “gdm3”。为此,请键入以下命令: + +``` +sudo dpkg-reconfigure lightdm +``` + +![Select gdm3 on this screen][13] + +然后,选择 “gdm3” 继续。 + +完成此操作后,你只需输入以下命令即可完全删除深度桌面环境: + +``` +sudo apt remove startdde ubuntudde-dde +``` + +你只需重启即可回到原来的 Ubuntu 桌面环境。如果图标没有响应,只需打开终端(`CTRL + ALT + T`)并输入: + + +``` +reboot +``` + +### 总结 + +有不同的 [桌面环境选择][16] 是件好事。如果你真的喜欢深度桌面环境的界面,那么这可能是在 Ubuntu 上体验深度操作系统的一种方式。 + +如果你有任何疑问或遇到任何问题,请在评论中告诉我。 + +-------------------------------------------------------------------------------- + +via: https://itsfoss.com/install-deepin-ubuntu/ + +作者:[Ankush Das][a] +选题:[lujun9972][b] +译者:[gxlct008](https://github.com/gxlct008) +校对:[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/beautiful-linux-distributions/ +[2]: https://itsfoss.com/deepin-20-review/ +[3]: https://www.deepin.org/en/ +[4]: https://www.debian.org/ +[5]: https://itsfoss.com/ubuntudde/ +[6]: https://itsfoss.com/which-ubuntu-install/ +[7]: https://itsfoss.com/reinstall-ubuntu/ +[8]: https://itsfoss.com/what-is-desktop-environment/ +[9]: https://i2.wp.com/itsfoss.com/wp-content/uploads/2020/10/ubuntu-20-with-deepin.jpg?resize=800%2C386&ssl=1 +[10]: https://itsfoss.com/ppa-guide/ +[11]: https://launchpad.net/~ubuntudde-dev/+archive/ubuntu/stable +[12]: https://i2.wp.com/itsfoss.com/wp-content/uploads/2020/10/deepin-desktop-install.png?resize=800%2C534&ssl=1 +[13]: https://i1.wp.com/itsfoss.com/wp-content/uploads/2020/10/deepin-display-manager.jpg?resize=800%2C521&ssl=1 +[14]: https://i1.wp.com/itsfoss.com/wp-content/uploads/2020/10/deepin-session-ubuntu.jpg?resize=800%2C414&ssl=1 +[15]: https://i0.wp.com/itsfoss.com/wp-content/uploads/2020/10/ubuntu-20-with-deepin-1.png?resize=800%2C589&ssl=1 +[16]: https://itsfoss.com/best-linux-desktop-environments/ diff --git a/published/202010/20201009 How to Remove Physical Volume from a Volume Group in LVM.md b/published/202010/20201009 How to Remove Physical Volume from a Volume Group in LVM.md new file mode 100644 index 0000000000..92d4b4c6c1 --- /dev/null +++ b/published/202010/20201009 How to Remove Physical Volume from a Volume Group in LVM.md @@ -0,0 +1,181 @@ +[#]: collector: (lujun9972) +[#]: translator: (geekpi) +[#]: reviewer: (wxy) +[#]: publisher: (wxy) +[#]: url: (https://linux.cn/article-12750-1.html) +[#]: subject: (How to Remove Physical Volume from a Volume Group in LVM) +[#]: via: (https://www.2daygeek.com/linux-remove-delete-physical-volume-pv-from-volume-group-vg-in-lvm/) +[#]: author: (Magesh Maruthamuthu https://www.2daygeek.com/author/magesh/) + +如何从 LVM 的卷组中删除物理卷? +====== + +![](https://img.linux.net.cn/data/attachment/album/202010/25/101355kav72t5iy5yj55tg.jpg) + +如果你的 LVM 不再需要使用某个设备,你可以使用 `vgreduce` 命令从卷组中删除物理卷。 + +`vgreduce` 命令可以通过删除物理卷来缩小卷组的容量。但要确保该物理卷没有被任何逻辑卷使用,请使用 `pvdisplay` 命令查看。如果物理卷仍在使用,你必须使用 `pvmove` 命令将数据转移到另一个物理卷。 + +数据转移后,它就可以从卷组中删除。 + +最后使用 `pvremove` 命令删除空物理卷上的 LVM 标签和 LVM 元数据。 + + * **第一部分:[如何在 Linux 中创建/配置 LVM(逻辑卷管理)][1]** + * **第二部分:[如何在 Linux 中扩展/增加 LVM 大小(逻辑卷调整)][2]** + * **第三部分:[如何在 Linux 中减少/缩小 LVM 大小(逻辑卷调整)][3]** + +![](https://img.linux.net.cn/data/attachment/album/202010/25/101424vgcio5fooi9uo5gh.jpeg) + +### 将扩展块移动到现有物理卷上 + +使用 `pvs` 命令检查是否使用了所需的物理卷(我们计划删除 LVM 中的 `/dev/sdc` 磁盘)。 + +``` +# pvs -o+pv_used + +PV VG Fmt Attr PSize PFree Used +/dev/sda myvg lvm2 a- 75.00G 14.00G 61.00G +/dev/sdb myvg lvm2 a- 50.00G 45.00G 5.00G +/dev/sdc myvg lvm2 a- 17.15G 12.15G 5.00G +``` + +如果使用了,请检查卷组中的其他物理卷是否有足够的空闲扩展块extent。 + +如果有的话,你可以在需要删除的设备上运行 `pvmove` 命令。扩展块将被分配到其他设备上。 + +``` +# pvmove /dev/sdc + +/dev/sdc: Moved: 2.0% +… +/dev/sdc: Moved: 79.2% +… +/dev/sdc: Moved: 100.0% +``` + +当 `pvmove` 命令完成后。再次使用 `pvs` 命令检查物理卷是否有空闲。 + +``` +# pvs -o+pv_used + +PV VG Fmt Attr PSize PFree Used +/dev/sda myvg lvm2 a- 75.00G 1.85G 73.15G +/dev/sdb myvg lvm2 a- 50.00G 45.00G 5.00G +/dev/sdc myvg lvm2 a- 17.15G 17.15G 0 +``` + +如果它是空闲的,使用 `vgreduce` 命令从卷组中删除物理卷 `/dev/sdc`。 + +``` +# vgreduce myvg /dev/sdc +Removed "/dev/sdc" from volume group "vg01" +``` + +最后,运行 `pvremove` 命令从 LVM 配置中删除磁盘。现在,磁盘已经完全从 LVM 中移除,可以用于其他用途。 + +``` +# pvremove /dev/sdc +Labels on physical volume "/dev/sdc" successfully wiped. +``` + +### 移动扩展块到新磁盘 + +如果你在卷组中的其他物理卷上没有足够的可用扩展。使用以下步骤添加新的物理卷。 + +向存储组申请新的 LUN。分配完毕后,运行以下命令来[在 Linux 中发现新添加的 LUN 或磁盘][5]。 + +``` +# ls /sys/class/scsi_host +host0 +``` + +``` +# echo "- - -" > /sys/class/scsi_host/host0/scan +``` + +``` +# fdisk -l +``` + +操作系统中检测到磁盘后,使用 `pvcreate` 命令创建物理卷。 + +``` +# pvcreate /dev/sdd +Physical volume "/dev/sdd" successfully created +``` + +使用以下命令将新的物理卷 `/dev/sdd` 添加到现有卷组 `vg01` 中。 + +``` +# vgextend vg01 /dev/sdd +Volume group "vg01" successfully extended +``` + +现在,使用 `pvs` 命令查看你添加的新磁盘 `/dev/sdd`。 + +``` +# pvs -o+pv_used + +PV VG Fmt Attr PSize PFree Used +/dev/sda myvg lvm2 a- 75.00G 14.00G 61.00G +/dev/sdb myvg lvm2 a- 50.00G 45.00G 5.00G +/dev/sdc myvg lvm2 a- 17.15G 12.15G 5.00G +/dev/sdd myvg lvm2 a- 60.00G 60.00G 0 +``` + +使用 `pvmove` 命令将数据从 `/dev/sdc` 移动到 `/dev/sdd`。 + +``` +# pvmove /dev/sdc /dev/sdd + +/dev/sdc: Moved: 10.0% +… +/dev/sdc: Moved: 79.7% +… +/dev/sdc: Moved: 100.0% +``` + +数据移动到新磁盘后。再次使用 `pvs` 命令检查物理卷是否空闲。 + +``` +# pvs -o+pv_used + +PV VG Fmt Attr PSize PFree Used +/dev/sda myvg lvm2 a- 75.00G 14.00G 61.00G +/dev/sdb myvg lvm2 a- 50.00G 45.00G 5.00G +/dev/sdc myvg lvm2 a- 17.15G 17.15G 0 +/dev/sdd myvg lvm2 a- 60.00G 47.85G 12.15G +``` + +如果空闲,使用 `vgreduce` 命令从卷组中删除物理卷 `/dev/sdc`。 + +``` +# vgreduce myvg /dev/sdc +Removed "/dev/sdc" from volume group "vg01" +``` + +最后,运行 `pvremove` 命令从 LVM 配置中删除磁盘。现在,磁盘已经完全从 LVM 中移除,可以用于其他用途。 + +``` +# pvremove /dev/sdc +Labels on physical volume "/dev/sdc" successfully wiped. +``` + +-------------------------------------------------------------------------------- + +via: https://www.2daygeek.com/linux-remove-delete-physical-volume-pv-from-volume-group-vg-in-lvm/ + +作者:[Magesh Maruthamuthu][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.2daygeek.com/author/magesh/ +[b]: https://github.com/lujun9972 +[1]: https://linux.cn/article-12670-1.html +[2]: https://linux.cn/article-12673-1.html +[3]: https://linux.cn/article-12740-1.html +[4]: https://www.2daygeek.com/wp-content/uploads/2020/10/remove-delete-physical-volume-pv-from-volume-group-vg-lvm-linux-2.png +[5]: https://www.2daygeek.com/scan-detect-luns-scsi-disks-on-redhat-centos-oracle-linux/ diff --git a/translated/tech/20201010 6 Essential Things To Do After Installing Manjaro Linux.md b/published/202010/20201010 6 Essential Things To Do After Installing Manjaro Linux.md similarity index 77% rename from translated/tech/20201010 6 Essential Things To Do After Installing Manjaro Linux.md rename to published/202010/20201010 6 Essential Things To Do After Installing Manjaro Linux.md index 17a4b6846d..9f4147f6c6 100644 --- a/translated/tech/20201010 6 Essential Things To Do After Installing Manjaro Linux.md +++ b/published/202010/20201010 6 Essential Things To Do After Installing Manjaro Linux.md @@ -1,18 +1,18 @@ [#]: collector: (lujun9972) [#]: translator: (rakino) -[#]: reviewer: ( ) -[#]: publisher: ( ) -[#]: url: ( ) +[#]: reviewer: (wxy) +[#]: publisher: (wxy) +[#]: url: (https://linux.cn/article-12721-1.html) [#]: subject: (6 Essential Things To Do After Installing Manjaro Linux) [#]: via: (https://itsfoss.com/things-to-do-after-installing-manjaro/) [#]: author: (Dimitrios Savvopoulos https://itsfoss.com/author/dimitrios/) -安装 Manjaro Linux 后要做的 6 件事 +安装 Manjaro Linux 后必做的 6 件事 ====== -所以,你刚刚[全新安装了 Manjaro Linux][1],那么现在该做什么呢? +你刚刚[全新安装了 Manjaro Linux][1],那么现在该做什么呢? -下面是我推荐你在安装后进行的一些步骤。 +下面是我推荐你在安装后进行的一些必不可少的步骤。 不过说实话,这些都是我在安装 Manjaro 后喜欢做的事,根据你的需求,步骤可能会有所不同。 @@ -24,7 +24,7 @@ #### 1、设置最快的镜像 - 在更新系统之前,我建议先整理一下镜像列表。在刷新 Manjaro 系统和从软件仓库下载软件包的时候,优化后的镜像列表会对系统的性能产生明显的影响。 +在更新系统之前,我建议先整理一下镜像列表。在刷新 Manjaro 系统和从软件仓库下载软件包的时候,优化后的镜像列表会对系统的性能产生明显的影响。 打开终端模拟器并输入以下命令: @@ -36,7 +36,7 @@ sudo pacman-mirrors --fasttrack #### 2、更新系统 -保持系统更新可以降低安全漏洞的发生机率,在安装新的软件之前也建议刷新系统的软件仓库。 +保持系统更新可以降低安全漏洞的发生机率,在安装新的软件之前也建议刷新一下系统的软件仓库。 你可以用下面的命令来[更新 Manjaro 系统][5]: @@ -46,13 +46,13 @@ sudo pacman -Syu ![][6] -#### 3、启用 AUR,Snap 以及 Flatpak 支持 +#### 3、启用 AUR、Snap 以及 Flatpak 支持 [Arch 用户仓库Arch User Repository(AUR)][7]是用户选择[基于 Arch Linux 的系统][8]的一个主要理由。你可以在 AUR 中访问到大量的附加软件。 -(译注:AUR 中的 PKGBUILD 均为用户上传且未经审核,使用者需要自负责任,在构建软件包前请注意检查其中内容是否合理。) +(LCTT 译注:AUR 中的 PKGBUILD 均为用户上传且未经审核,使用者需要自负责任,在构建软件包前请注意检查其中内容是否合理。) -作为可选项,你可以直接在 Pamac 图形化软件包管理器中启用对 [Snap][9] 以及 [Flatpak][10] 的支持。 +作为可选项,你可以直接在 Pacman 图形化软件包管理器中启用对 [Snap][9] 以及 [Flatpak][10] 的支持。 ![][11] @@ -80,7 +80,7 @@ sudo systemctl enable fstrim.timer mhwd-kernel -li ``` -**安装新内核**(以最新的 5.8 版本内核为例)**:** +安装新内核(以最新的 5.8 版本内核为例): ``` sudo mhwd-kernel -i linux58 @@ -96,9 +96,9 @@ sudo mhwd-kernel -i linux58 ![][18] -#### 结论 +### 结论 -如果你想在一个预配置、为桌面优化的发行版上享受 Arch Linux 的优点,[Manjaro是一个很好的发行版][19]。虽然它预置了很多东西,但由于每个人设置和需求的不同,有几个步骤是不能提前完成的。 +如果你想在一个预配置、为桌面优化的发行版上享受 Arch Linux 的优点,[Manjaro 是一个很好的发行版][19]。虽然它预置了很多东西,但由于每个人设置和需求的不同,有几个步骤是不能提前完成的。 除开已经提到的步骤,还有哪一步对你来说是必不可少的?请在下面的评论中告诉我们。 @@ -109,7 +109,7 @@ via: https://itsfoss.com/things-to-do-after-installing-manjaro/ 作者:[Dimitrios Savvopoulos][a] 选题:[lujun9972][b] 译者:[rakino](https://github.com/rakino) -校对:[校对者ID](https://github.com/校对者ID) +校对:[wxy](https://github.com/wxy) 本文由 [LCTT](https://github.com/LCTT/TranslateProject) 原创编译,[Linux中国](https://linux.cn/) 荣誉推出 diff --git a/published/202010/20201012 Could Microsoft be en route to dumping Windows in favor of Linux.md b/published/202010/20201012 Could Microsoft be en route to dumping Windows in favor of Linux.md new file mode 100644 index 0000000000..db061a927a --- /dev/null +++ b/published/202010/20201012 Could Microsoft be en route to dumping Windows in favor of Linux.md @@ -0,0 +1,88 @@ +[#]: collector: (wxy) +[#]: translator: (gxlct008) +[#]: reviewer: (wxy) +[#]: publisher: (wxy) +[#]: url: (https://linux.cn/article-12718-1.html) +[#]: subject: (Could Microsoft be en route to dumping Windows in favor of Linux?) +[#]: via: (https://www.techrepublic.com/article/could-microsoft-be-en-route-to-dumping-windows-in-favor-of-linux/) +[#]: author: (Jack Wallen https://www.techrepublic.com/meet-the-team/us/jack-wallen/) + +微软能否放弃 Windows 转向 Linux? +====== + +> Jack Wallen 认为,Microsoft Linux 是 Microsoft 桌面操作系统的下一个演进方向。他解释了为什么这将是一个对 Microsoft、IT 专业人士、用户和 Linux 社区的双赢。 + +![](https://tr1.cbsistatic.com/hub/i/r/2014/08/20/123daeb8-d6ce-4f0b-986e-225d55bf12e3/resize/770x/a693d56694587dbe5d025db7b8d79c48/linux-and-windows.jpg) + +我尊敬的同事 Steven J. Vaughan-Nichols 在姊妹网站 ZDNet 上发表了一篇出色的文章,名为《[基于 Linux 的 Windows 非常有意义][1]》,他在文中讨论了 Eric S. Raymond 的[观点](https://linux.cn/article-12664-1.html),即我们正接近桌面战争的最后阶段。Vaughan-Nichols 猜测,下一个合乎逻辑的步骤是在 Linux 内核上运行的 Windows 界面。 + +这是有道理的,尤其是考虑到微软在 [Windows 的 Linux 子系统(WSL)][2] 上的努力。然而,从我过去几年所目睹的一切来看,我认为可以得出一个对微软更有意义的结论。 + +### Microsoft Linux: 为什么它是最好的解决方案 + +一度,微软的最大摇钱树是软件,确切地说是 Windows 和 Microsoft Office。但是,就像科技行业中的所有事物一样,进化也在发生,而拒绝进化的科技公司失败了。 + +微软明白这一点,并且它已经进化了。一个恰当的例子是:[Microsoft Azure][4]。微软的云计算服务,以及 [AWS][5] 和 [Google Cloud][6] 已经成为这个不断变化的行业的巨大推动力。Azure 已成为微软新世界的摇钱树 —— 多到以至于这家在桌面电脑市场上享有垄断地位的公司已经开始意识到,或许还有更好的方式来利用桌面计算机。 + +这种优势很容易通过 Linux 来实现,但不是你可能想到的 Linux。Vaughan-Nichols 所建议的 Microsoft Linux 对于微软来说可能是一个很好的垫脚石,但我相信该公司需要做出一个更大的飞跃。我说的是登月规模的飞跃 —— 这将使所有参与者的生活变得更加轻松。 + +我说的是深入 Linux 领域。忘掉在 Linux 内核上运行 [Windows 10][7] 界面的桌面版本吧,最后承认 Microsoft Linux 可能是当今世界的最佳解决方案。 + +微软发布一个完整的 Linux 发行版将对所有参与者来说意味着更少的挫败感。微软可以将其在 Windows 10 桌面系统上的开发工作转移到一个更稳定、更可靠、更灵活、更经考验的桌面系统上来。微软可以从任意数量的桌面系统中选择自己的官方风格:GNOME、KDE、Pantheon、Xfce、Mint、Cinnamon... 不胜枚举。微软可以按原样使用桌面,也可以为它们做出贡献,创造一些更符合用户习惯的东西。 + +### 开发:微软并没有摆脱困境 + +这并不意味着微软在开发方面将摆脱困境。微软也希望对 Wine 做出重大贡献,以确保其所有产品均可在兼容层上顺畅运行,并且默认集成到操作系统中,这样最终用户就不必为安装 Windows 应用程序做任何额外的工作。 + +### Windows 用户需要 Defender + +微软开发团队也希望将 Windows Defender 移植到这个新的发行版中。等一等。什么?我真的是在暗示 Microsoft Linux 需要 Windows Defender 吗?是的,我确定。为什么? + +最终用户仍然需要防范 [网络钓鱼][8] 诈骗phishing scams、恶意 URL 和其他类型的攻击。普通的 Windows 用户可能不会意识到,Linux 和安全使用实践的结合远比 Windows 10 和 Windows Defender 要安全得多。所以,是的,将 Windows Defender 移植到 Microsoft Linux 将是保持用户基础舒适的一个很好的步骤。 + +这些用户将很快了解在台式计算机上工作的感觉,而不必处理 Windows 操作系统带来的日常困扰。更新更流畅、更值得信赖、更安全,桌面更有意义。 + +### 微软、用户和 IT 专业人士的双赢 + +微软一直在尽其所能将用户从标准的基于客户端的软件迁移到云和其他托管解决方案,并且其软件摇钱树已经变成了以网络为中心和基于订阅的软件。所有这些 Linux 用户仍然可以使用 [Microsoft 365][10] 和它必须提供的任何其他 [软件即服务][11]Software as a Service(SaaS)解决方案——所有这些都来自于 Linux 操作系统的舒适性和安全性。 + +这对微软和消费者而言是双赢的,因为这样 Windows 没有那么多令人头疼的事情要处理(通过捕获漏洞和对其专有解决方案进行安全补丁),消费者可以得到一个更可靠的解决方案而不会错过任何东西。 +如果微软打对了牌,他们可以对 KDE 或几乎任何 Linux 桌面环境重新设置主题,使其与 Windows 10 界面没有太大区别。 + +如果布局得当,消费者甚至可能都不知道其中的区别——“Windows 11” 将仅仅是 Microsoft 桌面操作系统的下一个演进版本。 + +说到胜利,IT 专业人员将花费更少的时间来处理病毒、恶意软件和操作系统问题,而把更多的时间用于保持网络(以及为该网络供动力的服务器)的运行和安全上。 + +### 大卖场怎么办? + +这是个关键的地方。为了让这一做法真正发挥作用,微软将不得不完全放弃 Windows,转而使用自己风格的 Linux。基于同样的思路,微软需要确保大卖场里的 PC 都安装了 Microsoft Linux 系统。没有半途而废的余地——微软必须全力以赴,以确保这次转型的成功。 + +一旦大卖场开始销售安装了 Microsoft Linux 的 PC 和笔记本电脑,我预测这一举措对所有相关人员来说将会是一个巨大的成功。微软会被视为终于推出了一款值得消费者信赖的操作系统;消费者将拥有一个这样的桌面操作系统,它不会带来太多令人头疼的事情,而会带来真正的生产力和乐趣;Linux 社区最终将主导桌面计算机。 + +### Microsoft Linux:时机已到 + +你可能会认为这个想法很疯狂,但如果你真的仔细想想,微软 Windows 的演进就是朝着这个方向发展的。为什么不绕过这个时间线的中途部分,而直接跳到一个为所有参与者带来成功的终极游戏呢? Microsoft Linux 正当其时。 + +--- +via: https://www.techrepublic.com/article/could-microsoft-be-en-route-to-dumping-windows-in-favor-of-linux/ + +作者:[jack-wallen][a] +选题:[wxy][b] +译者:[gxlct008](https://github.com/gxlct008) +校对:[wxy](https://github.com/wxy) + +本文由 [LCTT](https://github.com/LCTT/TranslateProject) 原创编译,[Linux中国](https://linux.cn/) 荣誉推出 + +[a]: https://www.techrepublic.com/meet-the-team/us/jack-wallen/ +[b]: https://github.com/wxy +[1]: https://www.zdnet.com/article/linux-based-windows-makes-perfect-sense/ +[2]: https://www.techrepublic.com/article/microsoft-older-windows-10-versions-now-get-to-run-windows-subsystem-for-linux-2/ +[3]: https://www.techrepublic.com/resource-library/whitepapers/microsoft-build-2020-highlights/ +[4]: https://www.techrepublic.com/article/microsoft-azure-the-smart-persons-guide/ +[5]: https://www.techrepublic.com/article/amazon-web-services-the-smart-persons-guide/ +[6]: https://www.techrepublic.com/article/google-cloud-platform-the-smart-persons-guide/ +[7]: https://www.techrepublic.com/article/windows-10-the-smart-persons-guide/ +[8]: https://www.techrepublic.com/article/phishing-and-spearphishing-a-cheat-sheet/ +[9]: https://www.techrepublic.com/article/everything-a-linux-admin-needs-to-know-about-working-from-the-command-line/ +[10]: https://www.techrepublic.com/article/microsoft-365-a-cheat-sheet/ +[11]: https://www.techrepublic.com/article/software-as-a-service-saas-a-cheat-sheet/ diff --git a/published/202010/20201012 Linux Jargon Buster- What is Display Manager in Linux.md b/published/202010/20201012 Linux Jargon Buster- What is Display Manager in Linux.md new file mode 100644 index 0000000000..2aef0b010f --- /dev/null +++ b/published/202010/20201012 Linux Jargon Buster- What is Display Manager in Linux.md @@ -0,0 +1,101 @@ +[#]: collector: (lujun9972) +[#]: translator: (wxy) +[#]: reviewer: (wxy) +[#]: publisher: (wxy) +[#]: url: (https://linux.cn/article-12773-1.html) +[#]: subject: (Linux Jargon Buster: What is Display Manager in Linux?) +[#]: via: (https://itsfoss.com/display-manager/) +[#]: author: (Abhishek Prakash https://itsfoss.com/author/abhishek/) + +Linux 黑话解释:什么是显示管理器? +====== + +> 在这篇 Linux 黑话解释中,你将了解 Linux 中的显示管理器。它是桌面环境的一部分吗?它的作用是什么? + +### 什么是 Linux 中的显示管理器? + +简单来说,显示管理器display manager(DM)是一个为你的 Linux 发行版提供图形登录功能的程序。它控制用户会话并管理用户认证。显示管理器会在你输入用户名和密码后,立即启动[显示服务器][1]并加载[桌面环境][2]。 + +显示管理器通常是登录界面的代名词。毕竟它是可见的部分。然而,可见的登录屏幕,也叫欢迎页greeter,只是显示管理器的一部分。 + +![登录屏幕是显示管理器的可见部分][3] + +像[各种桌面环境][4]和显示服务器一样,也有各种显示管理器。我们来看看它们。 + +### 不同的显示管理器 + +有些人认为显示管理器是桌面环境的一部分,但事实并非如此。它是一个独立的程序。 + +桌面环境可能会推荐某个显示管理器,但这并不意味着它不能与其它一些显示管理器一起工作。如果你曾经在同一个系统中安装过不止一个桌面环境,你会记得,登录界面(即显示管理器)允许你切换桌面环境。 + +![显示管理器可以与各种桌面环境配合使用][5] + +虽然显示管理器不是桌面环境本身的一部分,但它往往与桌面环境由同一个开发团队开发。它也成为桌面环境的代表。 + +例如,GNOME 桌面环境开发了 GDM(GNOME Display Manager),光看登录界面就会想到 GNOME 桌面环境。 + +![GNOME登录屏幕与GDM][6] + +一些流行的显示管理器有: + + * [GDM][7](GNOME 显示管理器GNOME Display Manager):GNOME 的首选。 + * [SDDM][8](简单桌面显示管理器Simple Desktop Display Manager):KDE 首选。 + * LightDM:由 Ubuntu 为 Unity 桌面开发。 + +### 显示管理器可以定制 + +有这么多的桌面环境可供选择,它们都有自己的显示管理器吗?不,不是这样的。 + +正如我之前提到的,可见的登录屏幕被称为欢迎页。这个欢迎页可以进行自定义来改变登录屏幕的外观。 + +事实上,许多发行版和/或桌面环境都制作了自己的欢迎页,以给用户提供一个类似于他们品牌的登录屏幕。 + +例如,Mint 的 Cinnamon 桌面使用了 LightDM,但有自己的欢迎页来给它更多的 Mint 式(或者我应该说是 Cinnamon)的外观。 + +![基于 LightDM 的 Linux Mint 登录屏幕][9] + +来看看 Kali Linux 的登录界面: + +![Kali Linux 登录界面][10] + +如果你喜欢编码和调整,你可以根据自己的喜好修改或编码自己的欢迎页。 + +### 改变显示管理器 + +如果你愿意,可以[更改显示管理器][11]。你需要先安装显示管理器。安装时你会看到切换显示管理器的选项。 + +![][12] + +如果当时没有做切换,那么以后可以通过手动配置来改变显示管理器。不同的发行版重新配置显示管理器的方法略有不同,这不在本文讨论范围内。 + +### 结语 + +希望大家对 Linux 中的显示管理器这个术语有一点了解。本黑话解释系列的目的是用非技术性的语言解释常见的 Linux 俗语和技术术语,而不涉及太多的细节。 + +欢迎大家提出意见和建议。 + +-------------------------------------------------------------------------------- + +via: https://itsfoss.com/display-manager/ + +作者:[Abhishek Prakash][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://itsfoss.com/author/abhishek/ +[b]: https://github.com/lujun9972 +[1]: https://itsfoss.com/display-server/ +[2]: https://itsfoss.com/what-is-desktop-environment/ +[3]: https://i0.wp.com/itsfoss.com/wp-content/uploads/2018/05/login-screen-opensuse.jpg?resize=800%2C474&ssl=1 +[4]: https://itsfoss.com/best-linux-desktop-environments/ +[5]: https://i1.wp.com/itsfoss.com/wp-content/uploads/2020/10/deepin-session-ubuntu.jpg?resize=800%2C414&ssl=1 +[6]: https://i2.wp.com/itsfoss.com/wp-content/uploads/2020/06/Login-screen-1.png?resize=800%2C450&ssl=1 +[7]: https://wiki.gnome.org/Projects/GDM +[8]: https://github.com/sddm +[9]: https://i2.wp.com/itsfoss.com/wp-content/uploads/2020/10/linux-mint-login-screen.jpg?resize=800%2C418&ssl=1 +[10]: https://i0.wp.com/itsfoss.com/wp-content/uploads/2020/10/kali-linux-login-screen.jpg?resize=799%2C450&ssl=1 +[11]: https://itsfoss.com/switch-gdm-and-lightdm-in-ubuntu-14-04/ +[12]: https://i2.wp.com/itsfoss.com/wp-content/uploads/2014/06/Switch_between_gdm_and_lightgdm_Ubuntu.jpeg?resize=700%2C448&ssl=1 diff --git a/published/202010/20201013 Install MariaDB or MySQL on Linux.md b/published/202010/20201013 Install MariaDB or MySQL on Linux.md new file mode 100644 index 0000000000..62bd23b48e --- /dev/null +++ b/published/202010/20201013 Install MariaDB or MySQL on Linux.md @@ -0,0 +1,112 @@ +[#]: collector: (lujun9972) +[#]: translator: (geekpi) +[#]: reviewer: (wxy) +[#]: publisher: (wxy) +[#]: url: (https://linux.cn/article-12743-1.html) +[#]: subject: (Install MariaDB or MySQL on Linux) +[#]: via: (https://opensource.com/article/20/10/mariadb-mysql-linux) +[#]: author: (Seth Kenlon https://opensource.com/users/seth) + +在 Linux 上安装 MariaDB 或 MySQL +====== + +> 开始在 Linux 系统上使用开源的 SQL 数据库吧。 + +![](https://img.linux.net.cn/data/attachment/album/202010/22/144122hkkqrs2dhi9c7kif.jpg) + +[MariaDB][2] 和 [MySQL][3] 都是使用 SQL 的开源数据库,并且共享相同的初始代码库。MariaDB 是 MySQL 的替代品,你可以使用相同的命令(`mysql`)与 MySQL 和 MariaDB 数据库进行交互。因此,本文同时适用于 MariaDB 和 MySQL。 + +### 安装 MariaDB + +你可以使用你的 Linux 发行版的包管理器安装 MariaDB。在大多数发行版上,MariaDB 分为服务器包和客户端包。服务器包提供了数据库“引擎”,即 MariaDB 在后台运行(通常在物理服务器上)的部分,它监听数据输入或数据输出请求。客户端包提供了 `mysql` 命令,你可以用它来与服务器通信。 + +在 RHEL、Fedora、CentOS 或类似的发行版上: + +``` +$ sudo dnf install mariadb mariadb-server +``` + +在 Debian、Ubuntu、Elementary 或类似的发行版上: + +``` +$ sudo apt install mariadb-client mariadb-server +``` + +其他操作系统可能会以不同的打包系统封装 MariaDB,所以你可能需要搜索你的软件仓库来了解你的发行版的维护者是如何提供它的。 + +### 启动 MariaDB + +因为 MariaDB 被设计为部分作为数据库服务器,它可以在一台计算机上运行,并从另一台计算机上进行管理。只要你能访问运行它的计算机,你就可以使用 `mysql` 命令来管理数据库。在写这篇文章时,我在本地计算机上运行了 MariaDB,但你同样可与远程系统上托管的 MariaDB 数据库进行交互。 + +在启动 MariaDB 之前,你必须创建一个初始数据库。在初始化其文件结构时,你应该定义你希望 MariaDB 使用的用户。默认情况下,MariaDB 使用当前用户,但你可能希望它使用一个专用的用户帐户。你的包管理器可能为你配置了一个系统用户和组。使用 `grep` 查找是否有一个 `mysql` 组: + +``` +$ grep mysql /etc/group +mysql:x:27: +``` + +你也可以在 `/etc/passwd` 中寻找这个专门的用户,但通常情况下,有组就会有用户。如果没有专门的 `mysql` 用户和组,可以在 `/etc/group` 中寻找一个明显的替代品(比如 `mariadb`)。如果没有,请阅读你的发行版文档来了解 MariaDB 是如何运行的。 + +假设你的安装使用 `mysql`,初始化数据库环境: + +``` +$ sudo mysql_install_db --user=mysql +Installing MariaDB/MySQL system tables in '/var/lib/mysql'... +OK +[...] +``` + +这一步的结果显示了接下来你必须执行的配置 MariaDB 的任务: + +``` +PLEASE REMEMBER TO SET A PASSWORD FOR THE MariaDB root USER ! +To do so, start the server, then issue the following commands: + +'/usr/bin/mysqladmin' -u root password 'new-password' +'/usr/bin/mysqladmin' -u root -h $(hostname) password 'new-password' + +Alternatively you can run: +'/usr/bin/mysql_secure_installation' + +which will also give you the option of removing the test +databases and anonymous user created by default.  This is +strongly recommended for production servers. +``` + +使用你的发行版的初始化系统启动 MariaDB: + +``` +$ sudo systemctl start mariadb +``` + +在启动时启用 MariaDB 服务器: + +``` +$ sudo systemctl enable --now mariadb +``` + +现在你已经有了一个 MariaDB 服务器,为它设置一个密码: + +``` +mysqladmin -u root password 'myreallysecurepassphrase' +mysqladmin -u root -h $(hostname) password 'myreallysecurepassphrase' +``` + +最后,如果你打算在生产服务器上使用它,请在上线前运行 `mysql_secure_installation` 命令。 + +-------------------------------------------------------------------------------- + +via: https://opensource.com/article/20/10/mariadb-mysql-linux + +作者:[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/data_metrics_analytics_desktop_laptop.png?itok=9QXd7AUr (Person standing in front of a giant computer screen with numbers, data) +[2]: https://mariadb.org/ +[3]: https://www.mysql.com/ diff --git a/published/202010/20201014 2 Ways to Download Files From Linux Terminal.md b/published/202010/20201014 2 Ways to Download Files From Linux Terminal.md new file mode 100644 index 0000000000..0fa87fe9f0 --- /dev/null +++ b/published/202010/20201014 2 Ways to Download Files From Linux Terminal.md @@ -0,0 +1,190 @@ +[#]: collector: (lujun9972) +[#]: translator: (geekpi) +[#]: reviewer: (wxy) +[#]: publisher: (wxy) +[#]: url: (https://linux.cn/article-12752-1.html) +[#]: subject: (2 Ways to Download Files From Linux Terminal) +[#]: via: (https://itsfoss.com/download-files-from-linux-terminal/) +[#]: author: (Abhishek Prakash https://itsfoss.com/author/abhishek/) + +2 种从 Linux 终端下载文件的方法 +====== + +如果你被困在 Linux 终端,比如说在服务器上,如何从终端下载文件? + +在 Linux 中是没有 `download` 命令的,但是有几个 Linux 命令可用于下载文件。 + +在这篇终端技巧中,你将学习两种在 Linux 中使用命令行下载文件的方法。 + +我在这里使用的是 Ubuntu,但除了安装,其余的命令同样适用于所有其他 Linux 发行版。 + +### 使用 wget 命令从 Linux 终端下载文件 + +![][1] + +[wget][2] 也许是 Linux 和类 UNIX 系统中使用最多的命令行下载管理器。你可以使用 `wget` 下载一个文件、多个文件、整个目录甚至整个网站。 + +`wget` 是非交互式的,可以轻松地在后台工作。这意味着你可以很容易地在脚本中使用它,甚至构建像 [uGet 下载管理器][3]这样的工具。 + +让我们看看如何使用 `wget` 从终端下载文件。 + +#### 安装 wget + +大多数 Linux 发行版都预装了 `wget`。它也可以在大多数发行版的仓库中找到,你可以使用发行版的包管理器轻松安装它。 + +在基于 Ubuntu 和 Debian 的发行版上,你可以使用 [apt 包管理器][4]命令: + +``` +sudo apt install wget +``` + +#### 使用 wget 下载文件或网页 + +你只需要提供文件或网页的 URL。它将在你所在的目录下以原始名下载该文件。 + +``` +wget URL +``` + +![][5] + +要下载多个文件,你必须将它们的 URL 保存在一个文本文件中,并将该文件作为输入提供给 `wget`,就像这样: + +``` +wget -i download_files.txt +``` + +#### 用 wget 下载不同名字的文件 + +你会注意到,网页在 `wget` 中几乎总是以 `index.html` 的形式保存。为下载的文件提供自定义名称是个好主意。 + +你可以在下载时使用 `-O` (大写字母 `O`) 选项来提供输出文件名: + +``` +wget -O filename URL +``` + +![][6] + +#### 用 wget 下载一个文件夹 + +假设你正在浏览一个 FTP 服务器,你需要下载整个目录,你可以使用递归选项 `-r`: + +``` +wget -r ftp://server-address.com/directory +``` + +#### 使用 wget 下载整个网站 + +是的,你完全可以做到这一点。你可以用 `wget` 镜像整个网站。我说的下载整个网站是指整个面向公众的网站结构。 + +虽然你可以直接使用镜像选项 `-m`,但最好加上: + + * `–convert-links`:链接将被转换,使内部链接指向下载的资源,而不是网站。 + * `–page-requisites`:下载额外的东西,如样式表,使页面在离线状态下看起来更好。 + +``` +wget -m --convert-links --page-requisites website_address +``` + +![][7] + +#### 额外提示:恢复未完成的下载 + +如果你因为某些原因按 `CTRL-C` 键中止了下载,你可以用选项 `-c` 恢复之前的下载: + +``` +wget -c +``` + +### 使用 curl 在 Linux 命令行中下载文件 + +和 `wget` 一样,[curl][8] 也是 Linux 终端中最常用的下载文件的命令之一。[使用 curl][9] 的方法有很多,但我在这里只关注简单的下载。 + +#### 安装 curl + +虽然 `curl` 并不是预装的,但在大多数发行版的官方仓库中都有。你可以使用你的发行版的包管理器来安装它。 + +要[在 Ubuntu][10] 和其他基于 Debian 的发行版上安装 `curl`,请使用以下命令: + +``` +sudo apt install curl +``` + +#### 使用 curl 下载文件或网页 + +如果你在使用 `curl` 命令时没有在 URL 中带任何选项,它就会读取文件并打印在终端上。 + +要在 Linux 终端中使用 `curl` 命令下载文件,你必须使用 `-O`(大写字母 `O`)选项: + +``` +curl -O URL +``` + +![][11] + +在 Linux 中,用 `curl` 下载多个文件是比较简单的。你只需要指定多个 URL 即可: + +``` +curl -O URL1 URL2 URL3 +``` + +请记住,`curl` 不像 `wget` 那么简单。`wget` 可以将网页保存为 `index.html`,`curl` 却会抱怨远程文件没有网页的名字。你必须按照下一节的描述用一个自定义的名字来保存它。 + +#### 用不同的名字下载文件 + +这可能会让人感到困惑,但如果要为下载的文件提供一个自定义的名称(而不是原始名称),你必须使用 `-o`(小写 `O`)选项: + +``` +curl -o filename URL +``` + +![][12] + +有些时候,`curl` 并不能像你期望的那样下载文件,你必须使用选项 `-L`(代表位置)来正确下载。这是因为有些时候,链接会重定向到其他链接,而使用选项 `-L`,它就会跟随最终的链接。 + +#### 用 curl 暂停和恢复下载 + +和 `wget` 一样,你也可以用 `curl` 的 `-c` 选项恢复暂停的下载: + +``` +curl -c URL +``` + +### 总结 + +和以往一样,在 Linux 中做同一件事有多种方法。从终端下载文件也不例外。 + +`wget` 和 `curl` 只是 Linux 中最流行的两个下载文件的命令。还有更多这样的命令行工具。基于终端的网络浏览器,如 [elinks][13]、[w3m][14] 等也可以用于在命令行下载文件。 + +就个人而言,对于一个简单的下载,我更喜欢使用 `wget` 而不是 `curl`。它更简单,也不会让你感到困惑,因为你可能很难理解为什么 `curl` 不能以预期的格式下载文件。 + +欢迎你的反馈和建议。 + +-------------------------------------------------------------------------------- + +via: https://itsfoss.com/download-files-from-linux-terminal/ + +作者:[Abhishek Prakash][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/abhishek/ +[b]: https://github.com/lujun9972 +[1]: https://i1.wp.com/itsfoss.com/wp-content/uploads/2020/10/Download-Files-from-Linux-terminal.png?resize=800%2C450&ssl=1 +[2]: https://www.gnu.org/software/wget/ +[3]: https://itsfoss.com/install-latest-uget-ubuntu-linux-mint/ +[4]: https://itsfoss.com/apt-command-guide/ +[5]: https://i0.wp.com/itsfoss.com/wp-content/uploads/2020/10/download-file-in-linux-terminal-using-wget.png?resize=795%2C418&ssl=1 +[6]: https://i2.wp.com/itsfoss.com/wp-content/uploads/2020/10/download-file-in-linux-terminal-using-wget-2.png?resize=795%2C418&ssl=1 +[7]: https://i1.wp.com/itsfoss.com/wp-content/uploads/2020/10/download-entire-website-using-wget.png?resize=795%2C418&ssl=1 +[8]: https://curl.haxx.se/ +[9]: https://linuxhandbook.com/curl-command-examples/ +[10]: https://itsfoss.com/install-curl-ubuntu/ +[11]: https://i0.wp.com/itsfoss.com/wp-content/uploads/2020/10/download-files-in-linux-using-curl.png?resize=795%2C418&ssl=1 +[12]: https://i2.wp.com/itsfoss.com/wp-content/uploads/2020/10/download-files-in-linux-using-curl-1.png?resize=795%2C418&ssl=1 +[13]: http://elinks.or.cz/ +[14]: http://w3m.sourceforge.net/ diff --git a/published/202010/20201014 MellowPlayer is a Desktop App for Various Streaming Music Services.md b/published/202010/20201014 MellowPlayer is a Desktop App for Various Streaming Music Services.md new file mode 100644 index 0000000000..b9a67ba724 --- /dev/null +++ b/published/202010/20201014 MellowPlayer is a Desktop App for Various Streaming Music Services.md @@ -0,0 +1,92 @@ +[#]: collector: (lujun9972) +[#]: translator: (geekpi) +[#]: reviewer: (wxy) +[#]: publisher: (wxy) +[#]: url: (https://linux.cn/article-12759-1.html) +[#]: subject: (MellowPlayer is a Desktop App for Various Streaming Music Services) +[#]: via: (https://itsfoss.com/mellow-player/) +[#]: author: (Ankush Das https://itsfoss.com/author/ankush/) + +MellowPlayer:一款用于各种流媒体音乐服务的桌面应用 +====== + +> MellowPlayer 是一个自由开源的桌面应用,可以让你在 Linux 和 Windows 上整合基于网络的音乐流媒体服务。 + +![][8] + +毋庸置疑,很多用户都喜欢使用流媒体服务来收听自己喜欢的音乐,而不是从商店购买单首音乐或者下载收藏。 + +当然,流媒体服务可以让你探索新的音乐,帮助艺术家轻松传播到更多的听众。但是,由于有许多的音乐流媒体服务([Soundcloud][1]、[Spotify][2]、[YouTube Music][3]、[Amazon Music][4] 等),因此当在使用电脑时,要有效地使用它们往往会变得很麻烦。 + +你可以[在 Linux 上安装 Spotify][5],但没有 Amazon Music 的桌面应用,所以,有可能你无法从单一门户管理流媒体服务。 + +如果一个桌面应用可以让你同时在 Windows 和 Linux 上免费整合流媒体服务呢?在本文中,我将介绍这样一款应用:[MellowPlayer][6]。 + +### MellowPlayer: 集成各种流媒体音乐服务的开源应用 + +![][7] + +MellowPlayer 是一款自由开源的跨平台桌面应用,它可以让你整合多个流媒体服务,并在一个界面上管理它们。 + +你可以整合多个支持的流媒体服务。你还可以从每个服务中获得一定程度的控制权,来调整你的体验。例如,你可以设置在 YouTube 上自动跳过或静音广告。 + +对 Windows 和 Linux 的跨平台支持绝对是一个加分项。 + +除了能够管理流媒体服务外,它还将播放器与系统托盘整合在一起来轻松控制音乐。这意味着你可以使用键盘上的媒体键来控制音乐播放器。 + +另外值得一提的是,你只要在应用内自己创建一个插件,就可以添加一个官方不支持的新服务。为了让你对它有更多的了解,下面就让我重点介绍一下所有的主要特点。 + +### MellowPlayer 的特点 + + * 跨平台 (Windows 和 Linux) + * 自由且开源 + * 基于插件的应用,让你可以通过创建一个插件来添加新的服务 + * 将服务作为本地桌面应用与系统托盘整合 + * 支持热键 + * 支持通知 + * 收听历史 + +### 在 Linux 上安装 MellowPlayer + +![][9] + +MellowPlayer 是以 [Flatpak 包][10]的形式提供的。我知道这让一些人很失望,但它在 Linux 中只有 Flaptak,Windows 中只有一个可执行文件。如果你不知道,请按照我们的[在 Linux 上使用 Flatpak][11] 指南来开始使用。 + +- [下载 MellowPlayer][12] + +### 总结 + +MellowPlayer 是一款方便的桌面应用,适合经常涉猎多种流媒体音乐服务的用户使用。尽管根据我的测试,它在 SoundCloud、YouTube 和 Spotify 上都能正常工作,但我确实注意到,当我试图重新调整窗口大小时,应用会崩溃,只是在此提醒一下。你可以在它的 [GitLab 页面][13]上了解更多关于它的内容。 + +还有两个类似的应用,可以让你播放多个流媒体音乐服务。[Nuvola][14] 和 [Nuclear Music Player][15]。你可能会想看看它们。 + +你试过 MellowPlayer 吗?欢迎在下方评论中分享你的想法。 + +-------------------------------------------------------------------------------- + +via: https://itsfoss.com/mellow-player/ + +作者:[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://soundcloud.com +[2]: https://www.spotify.com +[3]: https://music.youtube.com +[4]: https://music.amazon.com/home +[5]: https://itsfoss.com/install-spotify-ubuntu-linux/ +[6]: https://colinduquesnoy.gitlab.io/MellowPlayer/ +[7]: https://i2.wp.com/itsfoss.com/wp-content/uploads/2020/10/mellowplayer-screenshot.jpg?resize=800%2C439&ssl=1 +[8]: https://i1.wp.com/itsfoss.com/wp-content/uploads/2020/10/mellowplayer.png?resize=800%2C442&ssl=1 +[9]: https://i1.wp.com/itsfoss.com/wp-content/uploads/2020/10/mellowplayer-system-integration.jpg?resize=800%2C438&ssl=1 +[10]: https://flathub.org/apps/details/com.gitlab.ColinDuquesnoy.MellowPlayer +[11]: https://itsfoss.com/flatpak-guide/ +[12]: https://colinduquesnoy.gitlab.io/MellowPlayer/#features +[13]: https://gitlab.com/ColinDuquesnoy/MellowPlayer +[14]: https://itsfoss.com/nuvola-music-player/ +[15]: https://itsfoss.com/nuclear-music-player-linux/ diff --git a/published/202010/20201014 Try Linux on any computer with this bootable USB tool.md b/published/202010/20201014 Try Linux on any computer with this bootable USB tool.md new file mode 100644 index 0000000000..9e72c9dab8 --- /dev/null +++ b/published/202010/20201014 Try Linux on any computer with this bootable USB tool.md @@ -0,0 +1,95 @@ +[#]: collector: (lujun9972) +[#]: translator: (geekpi) +[#]: reviewer: (wxy) +[#]: publisher: (wxy) +[#]: url: (https://linux.cn/article-12769-1.html) +[#]: subject: (Try Linux on any computer with this bootable USB tool) +[#]: via: (https://opensource.com/article/20/10/fedora-media-writer) +[#]: author: (Sumantro Mukherjee https://opensource.com/users/sumantro) + +用这个创建可引导 USB 的工具在电脑上尝试 Linux +====== + +> Fedora Media Writer 是创建临场版 USB 以尝试 Linux 的方便方法。 + +![](https://img.linux.net.cn/data/attachment/album/202010/30/122142c1cmcv7cxgjmw5vw.jpg) + +[Fedora Media Writer][2] 是一个小巧、轻量、全面的工具,它简化了 Linux 的入门体验。它可以下载 Fedora 的 Workstation 或 Server 版本并写入到一个可以在任何系统上引导的 USB 驱动器上,使你无需将其安装到硬盘上就可以试用 Fedora Linux。 + +Media Writer 工具可以用来创建一个临场体验的Live、可引导的 USB 驱动器。在你的平台上安装 Fedora Media Writer 应用后,你可以下载并烧录最新的 Fedora Workstation 或 Server 稳定版,也可以选择烧录你下载的任何其他镜像。而且它并不局限于英特尔 64 位设备。它还可以用于 ARM 设备,如[树莓派][3],这些设备日益变得更加强大和有用。 + +![Fedora Media Writer main screen][4] + +### 安装 Fedora Media Writer + +[安装 Fedora Media Writer][6] 有几种方式。你可以通过 GitHub [从源码编译][7]、下载 MacOS 或 Windows 版本、使用 `dnf` 或 `yum` 安装 RPM 包,或者以 Flatpak 的形式获得。 + +在 Fedora 上: + +``` +$ sudo dnf install mediawriter +``` + +最新版本请参见 GitHub 仓库的[发布][8]部分。 + +### 准备好你的媒体介质 + +首先,你需要一个 USB 驱动器来安装你的 Linux 操作系统。这就是 Fedora Media Writer 要烧录的设备。这个驱动器必须是空白或可擦除的,因为 **该 USB 驱动器上的所有数据都会被删除**。如果有任何数据,哪怕只是一个文件,如果你不想丢失,那么你必须在继续之前备份它! + +确认你的 USB 驱动器是可擦除的之后,将它插入你的电脑并启动 Fedora Media Writer。 + +### 使用 Fedora Media Writer + +当你启动 Fedora Media Writer 时,你会看到一个页面,提示你从互联网上获取一个可引导的镜像,或者从你的硬盘上加载一个自定义镜像。第一个选择是 Fedora 的最新版本。Workstation 版本适用于台式机和笔记本电脑,Server 版本适用于虚拟化、机架服务器或任何你想作为服务器运行的情况。 + +如果你选择了 Fedora 镜像,Media Writer 会下载一个光盘镜像(通常称为 “iso”,文件扩展名为 .iso),并将其保存到你的下载文件夹中,这样你就可以重复使用它来烧录另一个驱动器。 + +![Select your image][9] + +另外还有 Fedora Spins,这是来自 Fedora 社区的镜像,它旨在满足小众的兴趣。例如,如果你是 [MATE 桌面][10]的粉丝,那么你会很高兴地发现 Media Writer 提供了 MATE spin。它有很多,所以请滚动查看所有的选择。如果你是 Linux 的新手,不要被吓到或感到困惑:这些额外的选项是为老用户准备的,这些用户除了默认的选项外,还发展出了自己的偏好,所以对你来说,只使用 Workstation 或 Server 选项就行,这取决于你是想把 Fedora 作为一个桌面还是作为一个服务器操作系统来运行。 + +如果你需要一个与你当前使用的 CPU 不同架构的镜像,从窗口右上角的下拉菜单中选择 CPU 架构。 + +如果你已经将镜像保存在硬盘上,请选择“Custom Image”选项,并选择你要烧录到 USB 的发行版的 .iso 文件。 + +### 写入 USB 驱动器 + +当你下载或选择了一个镜像,你必须确认你要将该镜像写入驱动器。 + +驱动器选择下拉菜单只显示了外部驱动器,所以你不会意外地覆盖自己的硬盘驱动器。这是 Fedora Media Writer 的一个重要功能,它比你在网上看到的许多手动说明要安全得多。然而,如果你的计算机上连接了多个外部驱动器,除了你想覆盖的那个,你应该将它们全部移除,以增加安全性。 + +选择你要安装镜像的驱动器,然后单击“Write to Disk”按钮。 + +![Media write][11] + +稍等一会儿,镜像就会被写入到你的驱动器,然后可以看看 Don Watkins 对[如何从 USB 驱动器启动到 Linux][12]的出色介绍。 + +### 开始使用 Linux + +Fedora Media Writer 是一种将 Fedora Workstation 或 Server,或任何 Linux 发行版烧录到 USB 驱动器的方法,因此你可以在安装它到设备上之前试用它。试试吧,并在评论中分享你的经验和问题。 + +-------------------------------------------------------------------------------- + +via: https://opensource.com/article/20/10/fedora-media-writer + +作者:[Sumantro Mukherjee][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/sumantro +[b]: https://github.com/lujun9972 +[1]: https://opensource.com/sites/default/files/styles/image-full-size/public/lead-images/usb-hardware.png?itok=ROPtNZ5V (Multiple USB plugs in different colors) +[2]: https://github.com/FedoraQt/MediaWriter +[3]: https://fedoraproject.org/wiki/Architectures/ARM/Raspberry_Pi +[4]: https://opensource.com/sites/default/files/uploads/fmw_mainscreen.png (Fedora Media Writer main screen) +[5]: https://creativecommons.org/licenses/by-sa/4.0/ +[6]: https://docs.fedoraproject.org/en-US/fedora/f32/install-guide/install/Preparing_for_Installation/#_fedora_media_writer +[7]: https://github.com/FedoraQt/MediaWriter#building +[8]: https://github.com/FedoraQt/MediaWriter/releases +[9]: https://opensource.com/sites/default/files/mediawriter-image.png +[10]: https://opensource.com/article/19/12/mate-linux-desktop +[11]: https://opensource.com/sites/default/files/mediawriter-write.png (Media write) +[12]: https://opensource.com/article/20/4/first-linux-computer diff --git a/published/202010/20201016 Set up ZFS on Linux with yum.md b/published/202010/20201016 Set up ZFS on Linux with yum.md new file mode 100644 index 0000000000..1386118d8b --- /dev/null +++ b/published/202010/20201016 Set up ZFS on Linux with yum.md @@ -0,0 +1,122 @@ +[#]: collector: (lujun9972) +[#]: translator: (geekpi) +[#]: reviewer: (wxy) +[#]: publisher: (wxy) +[#]: url: (https://linux.cn/article-12754-1.html) +[#]: subject: (Set up ZFS on Linux with yum) +[#]: via: (https://opensource.com/article/20/10/zfs-dnf) +[#]: author: (Sheng Mao https://opensource.com/users/ivzhh) + +在 Linux 上使用 yum 设置 ZFS +====== + +> 在 Fedora 上使用 yum 仓库来获取最新的 ZFS 特性。 + +![](https://img.linux.net.cn/data/attachment/album/202010/26/103028g9q3v3e391c9b62v.jpg) + +我是一名 Fedora Linux 用户,我每天都会运行 `yum upgrade`。虽然这个习惯使我能够运行所有最新的软件([Fedora 的四个基础][2]之一的 “First” ,它也做到了),但它也会提醒 [ZFS][3] 存储平台和新内核之间的不兼容性。 + +作为一名开发者,有时我需要最新的 ZFS 分支的新特性。例如,ZFS 2.0.0 包含了一个令人兴奋的新功能,它大大[提高了 ZVOL 同步性能][4],这对我这个 KVM 用户来说至关重要。但这意味着,如果我想使用 2.0.0 分支,我必须自己构建 ZFS。 + +起初,我只是在每次内核更新后从它的 Git 仓库中手动编译 ZFS。如果我忘记了,ZFS 就会在下次启动时无法被识别。幸运的是,我很快就学会了如何为 ZFS 设置动态内核模块支持 ([DKMS][5])。然而,这个解决方案并不完美。首先,它没有利用强大的 [yum][6] 系统,而这个系统可以帮助解决依赖关系和升级。此外,使用 `yum` 在你自己的包和上游包之间进行切换是非常容易的。 + +在本文中,我将演示如何设置 `yum` 仓库来打包 ZFS。这个方案有两个步骤: + + 1. 从 ZFS 的 Git 仓库中创建 RPM 包。 + 2. 建立一个 `yum` 仓库来托管这些包。 + +### 创建 RPM 包 + +要创建 RPM 包,你需要安装 RPM 工具链。`yum` 提供了一个组来捆绑安装这些工具: + +``` +sudo dnf group install 'C Development Tools and Libraries' 'RPM Development Tools' +``` + +安装完这些之后,你必须从 ZFS Git 仓库中安装构建 ZFS 所需的所有包。这些包属于三个组: + + 1. [Autotools][7],用于从平台配置中生成构建文件。 + 2. 用于构建 ZFS 内核和用户态工具的库。 + 3. 构建 RPM 包的库。 + +``` +sudo dnf install libtool autoconf automake gettext createrepo \ +    libuuid-devel libblkid-devel openssl-devel libtirpc-devel \ +    lz4-devel libzstd-devel zlib-devel \ +    kernel-devel elfutils-libelf-devel \ +    libaio-devel libattr-devel libudev-devel \ +    python3-devel libffi-devel +``` + +现在你已经准备好创建你自己的包了。 + +### 构建 OpenZFS + +[OpenZFS][8] 提供了优秀的基础设施。要构建它: + + 1. 用 `git` 克隆仓库,并切换到你希望使用的分支/标签。 + 2. 运行 Autotools 生成一个 makefile。 + 3. 运行 `make rpm`,如果一切正常,RPM 文件将被放置在 `build` 文件夹中。 + +``` +$ git clone --branch=zfs-2.0.0-rc3 zfs +$ cd zfs +$ ./autogen.sh +$ ./configure +$ make rpm +``` + +### 建立一个 yum 仓库 + +在 `yum` 中,仓库是一个服务器或本地路径,包括元数据和 RPM 文件。用户设置一个 INI 配置文件,`yum` 命令会自动解析元数据并下载相应的软件包。 + +Fedora 提供了 `createrepo` 工具来设置 `yum` 仓库。首先,创建仓库,并将 ZFS 文件夹中的所有 RPM 文件复制到仓库中。然后运行 `createrepo --update` 将所有的包加入到元数据中。 + +``` +$ sudo mkdir -p /var/lib/zfs.repo +$ sudo createrepo /var/lib/zfs.repo +$ sudo cp *.rpm /var/lib/zfs.repo/ +$ sudo createrepo --update /var/lib/zfs.repo +``` + +在 `/etc/yum.repos.d` 中创建一个新的配置文件来包含仓库路径: + +``` +$ echo \ +"[zfs-local]\\nname=ZFS Local\\nbaseurl=file:///var/lib/zfs.repo\\nenabled=1\\ngpgcheck=0" |\ +sudo tee /etc/yum.repos.d/zfs-local.repo + +$ sudo dnf --repo=zfs-local list available --refresh +``` + +终于完成了!你已经有了一个可以使用的 `yum` 仓库和 ZFS 包。现在你只需要安装它们。 + +``` +$ sudo dnf install zfs +$ sudo /sbin/modprobe zfs +``` + +运行 `sudo zfs version` 来查看你的用户态和内核工具的版本。恭喜!你拥有了 [Fedora 中的 ZFS][9]。 + +-------------------------------------------------------------------------------- + +via: https://opensource.com/article/20/10/zfs-dnf + +作者:[Sheng Mao][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/ivzhh +[b]: https://github.com/lujun9972 +[1]: https://opensource.com/sites/default/files/styles/image-full-size/public/lead-images/puzzle_computer_solve_fix_tool.png?itok=U0pH1uwj (Puzzle pieces coming together to form a computer screen) +[2]: https://docs.fedoraproject.org/en-US/project/#_what_is_fedora_all_about +[3]: https://zfsonlinux.org/ +[4]: https://www.phoronix.com/scan.php?page=news_item&px=OpenZFS-3x-Boost-Sync-ZVOL +[5]: https://www.linuxjournal.com/article/6896 +[6]: https://en.wikipedia.org/wiki/Yum_%28software%29 +[7]: https://opensource.com/article/19/7/introduction-gnu-autotools +[8]: https://openzfs.org/wiki/Main_Page +[9]: https://openzfs.github.io/openzfs-docs/Getting%20Started/Fedora.html diff --git a/published/202010/20201027 Fedora 33 is officially here.md b/published/202010/20201027 Fedora 33 is officially here.md new file mode 100644 index 0000000000..f1fa986952 --- /dev/null +++ b/published/202010/20201027 Fedora 33 is officially here.md @@ -0,0 +1,93 @@ +[#]: collector: (lujun9972) +[#]: translator: (wxy) +[#]: reviewer: (wxy) +[#]: publisher: (wxy) +[#]: url: (https://linux.cn/article-12764-1.html) +[#]: subject: (Fedora 33 is officially here!) +[#]: via: (https://fedoramagazine.org/announcing-fedora-33/) +[#]: author: (Matthew Miller https://fedoramagazine.org/author/mattdm/) + +Fedora 33 正式发布了 +====== + +![][1] + +> 本文译自 Fedora 官方发布公告。 + +今天,我很兴奋地与大家分享数千名 Fedora 项目贡献者辛勤工作的成果:我们的最新版本 Fedora 33 来了! 这是一个有着很多变化的大版本,但我相信所有这些工作也会让您感到舒适,实现我们的目标:即为您带来最新的稳定、强大、健壮的自由和开源软件,并提供许多易于使用的产品。  + +如果您不想耽误时间,直接体验,现在就去 下载吧,欲了解详情请继续阅读! + +### 找到适合您的 Fedora 风味! + +Fedora Edition 是针对桌面、服务器和云环境中各种“体现”特定用途的目标产品,现在它也适用于物联网。 + +Fedora Workstation 专注于桌面,尤其是面向那些想要“只管去用”的 Linux 操作系统体验的软件开发者。这个版本的特点是 [GNOME 3.38][2],它一如既往地有很多很棒的改进。新增的 Tour 应用可以帮助新用户学习它们的操作方式。和我们所有其他面向桌面的变体一样,Fedora Workstation 现在使用 [BTRFS 作为默认文件系统][3]。这些发布的版本中带来了很多伟大的增强功能,这个先进的文件系统为之奠定了基础。为了您的视觉享受,Fedora 33 Workstation 现在默认提供了一个动画背景(它会基于一天中的时间变化)。 + +Fedora CoreOS 是一个新兴的 Fedora 版本。它是一个自动更新的、最小化的操作系统,用于安全地、大规模地运行容器化工作负载。它提供了几个[更新流][4],可以遵循大致每两周一次的自动更新。目前 **next** 流是基于 Fedora 33 的,**testing** 和 **stable** 流后继也会跟进。您可以从[下载页面][5]中找到关于跟随 **next** 流发布的工件的信息,并在 [Fedora CoreOS 文档][6]中找到关于如何使用这些工件的信息。 + +新晋升为 Edition 状态的 [Fedora IoT][7],为物联网生态系统和边缘计算用例提供了坚实的基础。在许多功能之外,Fedora 33 IoT 还引入了平台抽象安全Platform AbstRaction for SECurity(PARSEC),这是一个开源倡议,以平台无关的方式为硬件安全和加密服务提供了通用 API。 + +当然,我们制作的不仅仅是“官方版本”,还有 [Fedora Spin][8]和 [Lab][9]。[Fedora Spin][8] 和 [Lab][9] 针对不同的受众和用例,包括 [Fedora CompNeuro][10],它为神经科学带来了大量的开源计算建模工具,以及 [KDE Plasma][11] 和 [Xfce][12]等桌面环境。  + +此外,别忘了我们还有备用架构:[ARM AArch64、Power 和 S390x][13]。在 Fedora 33 中提供的新功能,AArch64 用户可以使用 .NET Core 语言进行跨平台开发。我们改进了对 Pine64 设备、NVidia Jetson 64 位平台以及 Rockchip 片上系统(SoC)设备的支持,包括 Rock960、RockPro64 和 Rock64。(不过,有个最新的说明:在其中一些设备上可能会出现启动问题。从现有的 Fedora 32 升级是没问题的。更多信息将在[常见错误][14]页面上公布。) + +我们也很高兴地宣布,Fedora 云镜像和 Fedora CoreOS 将首次与 Fedora 33 一起在亚马逊的 [AWS 市场][15] 中提供。Fedora 云镜像在亚马逊云中已经存在了十多年,您可以通过 AMI ID 或[点击一下][16]来启动我们的官方镜像。该市场提供了获得同样东西的另一种方式,显著扩大了 Fedora 的知名度。这也将使我们的云镜像可以更快地在新的 AWS 区域中可用。特别感谢 David Duncan 让这一切成为现实! + +### 常规改进 + +无论您使用的是哪种版本的 Fedora,您都会得到开源世界提供的最新版本。遵循我们的 [First][17] 原则,我们更新了关键的编程语言和系统库包,包括 Python 3.9、Ruby on Rails 6.0 和 Perl 5.32。在 Fedora KDE 中,我们沿用了 Fedora 32 Workstation 中的工作,默认启用了 EarlyOOM 服务,以改善低内存情况下的用户体验。 + +为了让 Fedora 的默认体验更好,我们将 nano 设置为默认编辑器。nano 是一个对新用户友好的编辑器。当然,那些想要像 vi 这样强大的编辑器的用户可以自己设置默认编辑器。 + +我们很高兴您能试用新版本! 前往 并立即下载它。或者如果您已经在运行 Fedora 操作系统,请按照这个简单的[升级说明][18]进行升级。关于 Fedora 33 新特性的更多信息,请参见[发布说明][19]。 + +### 关于安全启动的说明 + +安全启动Secure Boot是一种安全标准,它确保只有官方签署的操作系统软件才能加载到您的计算机上。这对于防止持久恶意软件非常重要,因为这些恶意软件可能会隐藏在您的计算机固件中,甚至在重新安装操作系统时也能存活。然而,在 [Boot Hole][20] 漏洞发生后,用于签署 Fedora 引导加载器Bootloader软件的加密证书将被撤销,并被新的证书取代。由于这将产生大范围的影响,撤销应该要到 2021 年第二季度或更晚才会广泛推行。 + +然而,一些用户可能已经从其他操作系统或固件更新中收到了这种撤销。在这种情况下,Fedora 将不能在启用了安全启动时进行安装。要说明的是,这不会影响大多数用户。如果它确实影响到了您,您可以暂时禁用安全启动。我们会在大范围的证书撤销之前发布一个用新证书签署的更新,在所有支持的版本上都可以使用,到那时,安全启动应该可以重新启用。 + +### 万一出现问题时…… + +如果您遇到问题,请查看 [Fedora 33 常见错误][14]页面;如果您有疑问,请访问我们的 [Ask Fedora][21] 用户支持平台。 + +### 谢谢大家 + +感谢在这个发布周期中为 Fedora 项目做出贡献的成千上万的人,尤其是那些在疫情大流行期间为使这个版本准时发布而付出额外努力的人。Fedora 是一个社区,很高兴看到我们如此互相支持。 + + +-------------------------------------------------------------------------------- + +via: https://fedoramagazine.org/announcing-fedora-33/ + +作者:[Matthew Miller][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://fedoramagazine.org/author/mattdm/ +[b]: https://github.com/lujun9972 +[1]: https://fedoramagazine.org/wp-content/uploads/2020/10/f33-final-816x345.jpg +[2]: https://www.gnome.org/news/2020/09/gnome-3-38-released/ +[3]: https://fedoramagazine.org/btrfs-coming-to-fedora-33/ +[4]: https://docs.fedoraproject.org/en-US/fedora-coreos/update-streams/ +[5]: https://getfedora.org/en/coreos/download?stream=next +[6]: https://docs.fedoraproject.org/en-US/fedora-coreos/getting-started/ +[7]: https://getfedora.org/iot +[8]: https://spins.fedoraproject.org/ +[9]: https://labs.fedoraproject.org/ +[10]: https://labs.fedoraproject.org/en/comp-neuro/ +[11]: https://spins.fedoraproject.org/en/kde/ +[12]: https://spins.fedoraproject.org/en/xfce/ +[13]: https://alt.fedoraproject.org/alt/ +[14]: https://fedoraproject.org/wiki/Common_F33_bugs +[15]: https://aws.amazon.com/marketplace +[16]: https://getfedora.org/en/coreos/download?tab=cloud_launchable&stream=stable +[17]: https://docs.fedoraproject.org/en-US/project/#_first +[18]: https://docs.fedoraproject.org/en-US/quick-docs/upgrading/ +[19]: https://docs.fedoraproject.org/en-US/fedora/f33/release-notes/ +[20]: https://access.redhat.com/security/vulnerabilities/grub2bootloader +[21]: http://ask.fedoraproject.org diff --git a/published/202011/20180503 Go on very small hardware (Part 3).md b/published/202011/20180503 Go on very small hardware (Part 3).md new file mode 100644 index 0000000000..4fa8c39c6d --- /dev/null +++ b/published/202011/20180503 Go on very small hardware (Part 3).md @@ -0,0 +1,434 @@ +[#]: collector: (lujun9972) +[#]: translator: (gxlct008) +[#]: reviewer: (wxy) +[#]: publisher: (wxy) +[#]: url: (https://linux.cn/article-12782-1.html) +[#]: subject: (Go on very small hardware Part 3) +[#]: via: (https://ziutek.github.io/2018/05/03/go_on_very_small_hardware3.html) +[#]: author: (Michał Derkacz ) + +Go 语言在极小硬件上的运用(三) +====== + +![](https://img.linux.net.cn/data/attachment/album/202010/24/090026to9c9sweyrw9ww37.png) + + +在本系列的 [第一][3] 和 [第二][4] 部分中讨论的大多数示例都是以某种方式闪烁的 LED。起初它可能很有趣,但是一段时间后变得有些无聊。让我们做些更有趣的事情…… + +…让我们点亮更多的 LED! + +![STM32F030F4P6][1] + +### WS281x LED + +[WS281x][5] RGB LED(及其克隆品)非常受欢迎。你可以以单个元素购买、链成长条或组装成矩阵、环或其他形状。 + +![WS2812B][6] + +它们可以串联连接,基于这个事实,你可以只用 MCU 的单个引脚就可以控制一个很长的 LED 灯条。不幸的是,它们的内部控制器使用的物理协议不能直接适用于你在 MCU 中可以找到的任何外围设备。你必须使用 位脉冲bit-banging或以特殊方式使用可用的外设。 + +哪种可用的解决方案最有效取决于同时控制的 LED 灯条数量。如果你必须驱动 4 到 16 个灯条,那么最有效的方法是 [使用定时器和 DMA][7](请不要忽略这篇文章末尾的链接)。 + +如果只需要控制一个或两个灯条,请使用可用的 SPI 或 UART 外设。对于 SPI,你只能在发送的一个字节中编码两个 WS281x 位。由于巧妙地使用了起始位和停止位,UART 允许更密集的编码:每发送一个字节 3 位。 + +我在 [此站点][8] 上找到了有关 UART 协议如何适用于 WS281x 协议的最佳解释。如果你不懂波兰语,这里是 [英文翻译][9]。 + +基于 WS281x 的 LED 仍然是最受欢迎的,但市场上也有 SPI 控制的 LED:[APA102][10]、[SK9822][11]。关于它们的三篇有趣的文章在这里:[1][12]、[2][13]、[3][14]。 + +### LED 环 + +市场上有许多基于 WS2812 的环。我有一个这样的: + +![WS2812B][15] + +它具有 24 个可单独寻址的 RGB LED(WS2812B),并暴露出四个端子:GND、5V、DI 和 DO。通过将 DI(数据输入)端子连接到上一个的 DO(数据输出)端子,可以链接更多的环或其他基于 WS2812 的东西。 + +让我们将这个环连接到我们的 STM32F030 板上。我们将使用基于 UART 的驱动程序,因此 DI 应连接到 UART 接头连接器上的 TXD 引脚。 WS2812B LED 需要至少 3.5V 的电源。 24 个 LED 会消耗大量电流,因此在编程/调试期间,最好将环上的 GND 和 5V 端子直接连接到 ST-LINK 编程器上可用的 GND 和 5V 引脚: + +![WS2812B][16] + +我们的 STM32F030F4P6 MCU 和整个 STM32 F0、F3、F7、L4 系列具有 F1、F4、L1 MCU 不具备的一项重要功能:它可以反转 UART 信号,因此我们可以将环直接连接到 UART TXD 引脚。如果你不知道我们需要这种反转,那么你可能没有读过我上面提到的 [文章][9]。 + +因此,你不能以这种方式使用流行的 [Blue Pill][17] 或 [STM32F4-DISCOVERY][18]。使用其 SPI 外设或外部反相器。有关使用 SPI 的 NUCLEO-F411RE,请参见 [圣诞树灯][19] 项目作为 UART + 逆变器的示例或 [WS2812示例][20]。 + +顺便说一下,大多数 DISCOVERY 板可能还有一个问题:它们在 VDD = 3V 而不是 3.3V 的情况下工作。 对于高 DI,WS281x 至少要求电源电压 * 0.7。如果是 5V 电源,则为 3.5V;如果是 4.7V 电源,则为 3.3V;可在 DISCOVERY 的 5V 引脚上找到。如你所见,即使在我们的情况下,第一个 LED 的工作电压也低于规格 0.2V。对于 DISCOVERY 板,如果供电 4.7V,它将工作在低于规格的 0.3V 下;如果供电 5V,它将工作在低于规格 0.5V 下。 + +让我们结束这段冗长的介绍并转到代码: + +``` +package main + +import ( + "delay" + "math/rand" + "rtos" + + "led" + "led/ws281x/wsuart" + + "stm32/hal/dma" + "stm32/hal/gpio" + "stm32/hal/irq" + "stm32/hal/system" + "stm32/hal/system/timer/systick" + "stm32/hal/usart" +) + +var tts *usart.Driver + +func init() { + system.SetupPLL(8, 1, 48/8) + systick.Setup(2e6) + + gpio.A.EnableClock(true) + tx := gpio.A.Pin(9) + + tx.Setup(&gpio.Config{Mode: gpio.Alt}) + tx.SetAltFunc(gpio.USART1_AF1) + + d := dma.DMA1 + d.EnableClock(true) + + tts = usart.NewDriver(usart.USART1, d.Channel(2, 0), nil, nil) + tts.Periph().EnableClock(true) + tts.Periph().SetBaudRate(3000000000 / 1390) + tts.Periph().SetConf2(usart.TxInv) + tts.Periph().Enable() + tts.EnableTx() + + rtos.IRQ(irq.USART1).Enable() + rtos.IRQ(irq.DMA1_Channel2_3).Enable() +} + +func main() { + var rnd rand.XorShift64 + rnd.Seed(1) + rgb := wsuart.GRB + strip := wsuart.Make(24) + black := rgb.Pixel(0) + for { + c := led.Color(rnd.Uint32()).Scale(127) + pixel := rgb.Pixel(c) + for i := range strip { + strip[i] = pixel + tts.Write(strip.Bytes()) + delay.Millisec(40) + } + for i := range strip { + strip[i] = black + tts.Write(strip.Bytes()) + delay.Millisec(20) + } + } +} + +func ttsISR() { + tts.ISR() +} + +func ttsDMAISR() { + tts.TxDMAISR() +} + +//c:__attribute__((section(".ISRs"))) +var ISRs = [...]func(){ + irq.USART1: ttsISR, + irq.DMA1_Channel2_3: ttsDMAISR, +} +``` + +#### 导入部分 + +与前面的示例相比,导入部分中的新内容是 `rand/math` 包和带有 `led/ws281x` 子树的 `led` 包。 `led` 包本身包含 `Color` 类型的定义。 `led/ws281x/wsuart` 定义了 `ColorOrder`、`Pixel` 和 `Strip` 类型。 + +我想知道如何使用 `image/color` 中的 `Color` 或 `RGBA` 类型,以及如何以它将实现 `image.Image` 接口的方式定义 `Strip`。 但是由于使用了 [gamma 校正][21] 和 大开销的 `color/draw` 包,我以简单的方式结束: + +``` +type Color uint32 +type Strip []Pixel +``` + +使用一些有用的方法。然而,这种情况在未来可能会改变。 + +#### init 函数 + +`init` 函数没有太多新颖之处。 UART 波特率从 115200 更改为 3000000000/1390 ≈ 2158273,相当于每个 WS2812 位 1390 纳秒。 CR2 寄存器中的 TxInv 位设置为反转 TXD 信号。 + +#### main 函数 + +`XorShift64` 伪随机数生成器用于生成随机颜色。 [XORSHIFT][22] 是目前由 `math/rand` 包实现的唯一算法。你必须使用带有非零参数的 `Seed` 方法显式初始化它。 + +`rgb` 变量的类型为 `wsuart.ColorOrder`,并设置为 WS2812 使用的 GRB 颜色顺序(WS2811 使用 RGB 顺序)。然后用于将颜色转换为像素。 + +`wsuart.Make(24)` 创建 24 像素的初始化条带。它等效于: + +``` +strip := make(wsuart.Strip, 24) +strip.Clear() +``` + +其余代码使用随机颜色绘制类似于 “Please Wait…” 微调器的内容。 + +`strip` 切片充当帧缓冲区。 `tts.Write(strip.Bytes())` 将帧缓冲区的内容发送到环。 + +#### 中断 + +该程序由处理中断的代码组成,与先前的 [UART 示例][23] 中的代码相同。 + +让我们编译并运行: + +``` +$ egc +$ arm-none-eabi-size cortexm0.elf + text data bss dec hex filename + 14088 240 204 14532 38c4 cortexm0.elf +$ openocd -d0 -f interface/stlink.cfg -f target/stm32f0x.cfg -c 'init; program cortexm0.elf; reset run; exit' +``` + +我跳过了 `openocd` 的输出。下面的视频显示了该程序的工作原理: + +![video](https://ziutek.github.io/videos/rgbspinner.mp4) + +### 让我们做些有用的事情... + +在 [第一部分][3] 的开头,我曾问过:“Go 能深入到多低层,而还能做一些有用的事情?”。 我们的 MCU 实际上是一种低端设备(8 比特的人可能会不同意我的看法),但到目前为止,我们还没有做任何有用的事情。 + +所以... 让我们做些有用的事情... 让我们做个时钟! + +在互联网上有许多由 RGB LED 构成的时钟示例。让我们用我们的小板子和 RGB 环制作自己的时钟。我们按照下面的描述更改先前的代码。 + +#### 导入部分 + +删除 `math/rand` 包,然后添加 `stm32/hal/exti`。 + +#### 全局变量 + +添加两个新的全局变量:`btn` 和 `btnev`: + +``` +var ( + tts *usart.Driver + btn gpio.Pin + btnev rtos.EventFlag +) +``` + +它们将用来处理那些用于设置时钟的 “按钮”。我们的板子除了重置之外没有其他按钮,但是如果没有它,我们仍然可以通过某种方式进行管理。 + +#### init 函数 + +将这段代码添加到 `init` 函数: + +``` +btn = gpio.A.Pin(4) + +btn.Setup(&gpio.Config{Mode: gpio.In, Pull: gpio.PullUp}) +ei := exti.Lines(btn.Mask()) +ei.Connect(btn.Port()) +ei.EnableFallTrig() +ei.EnableRiseTrig() +ei.EnableIRQ() + +rtos.IRQ(irq.EXTI4_15).Enable() +``` + +在内部上拉电阻pull-up resistor启用的情况下,将 PA4 引脚配置为输入。它已连接至板载 LED,但这不会妨碍任何事情。更重要的是它位于 GND 引脚旁边,所以我们可以使用任何金属物体来模拟按钮并设置时钟。作为奖励,我们还有来自板载 LED 的其他反馈。 + +我们使用 EXTI 外设来跟踪 PA4 状态。它被配置为在发生任何更改时都会产生中断。 + +#### btnWait 函数 + +定义一个新的辅助函数: + +``` +func btnWait(state int, deadline int64) bool { + for btn.Load() != state { + if !btnev.Wait(1, deadline) { + return false // timeout + } + btnev.Reset(0) + } + delay.Millisec(50) // debouncing + return true +} +``` + +它等待 “按钮” 引脚上的指定状态,但只等到最后期限出现。这是稍微改进的轮询代码: + +``` +for btn.Load() != state { + if rtos.Nanosec() >= deadline { + // timeout + } +} +``` + +我们的 `btnWait` 函数不是忙于等待 `state` 或 `deadline`,而是使用 `rtos.EventFlag` 类型的 `btnev` 变量休眠,直到有事情发生。你当然可以使用通道而不是 `rtos.EventFlag`,但是后者便宜得多。 + +#### main 函数 + +我们需要全新的 `main` 函数: + +``` +func main() { + rgb := wsuart.GRB + strip := wsuart.Make(24) + ds := 4 * 60 / len(strip) // Interval between LEDs (quarter-seconds). + adjust := 0 + adjspeed := ds + for { + qs := int(rtos.Nanosec() / 25e7) // Quarter-seconds since reset. + qa := qs + adjust + + qa %= 12 * 3600 * 4 // Quarter-seconds since 0:00 or 12:00. + hi := len(strip) * qa / (12 * 3600 * 4) + + qa %= 3600 * 4 // Quarter-seconds in the current hour. + mi := len(strip) * qa / (3600 * 4) + + qa %= 60 * 4 // Quarter-seconds in the current minute. + si := len(strip) * qa / (60 * 4) + + hc := led.Color(0x550000) + mc := led.Color(0x005500) + sc := led.Color(0x000055) + + // Blend the colors if the hands of the clock overlap. + if hi == mi { + hc |= mc + mc = hc + } + if mi == si { + mc |= sc + sc = mc + } + if si == hi { + sc |= hc + hc = sc + } + + // Draw the clock and write to the ring. + strip.Clear() + strip[hi] = rgb.Pixel(hc) + strip[mi] = rgb.Pixel(mc) + strip[si] = rgb.Pixel(sc) + tts.Write(strip.Bytes()) + + // Sleep until the button pressed or the second hand should be moved. + if btnWait(0, int64(qs+ds)*25e7) { + adjust += adjspeed + // Sleep until the button is released or timeout. + if !btnWait(1, rtos.Nanosec()+100e6) { + if adjspeed < 5*60*4 { + adjspeed += 2 * ds + } + continue + } + adjspeed = ds + } + } +} +``` + +我们使用 `rtos.Nanosec` 函数代替 `time.Now` 来获取当前时间。这样可以节省大量的闪存,但也使我们的时钟变成了不知道日、月、年的老式设备,最糟糕的是它无法处理夏令时的变化。 + +我们的环有 24 个 LED,因此秒针的显示精度可以达到 2.5 秒。为了不牺牲这种精度并获得流畅的运行效果,我们使用 1/4 秒作为基准间隔。半秒就足够了,但四分之一秒更准确,而且与 16 和 48 个 LED 配合使用也很好。 + +红色、绿色和蓝色分别用于时针、分针和秒针。这允许我们使用简单的“逻辑或操作”进行颜色混合。我们 `Color.Blend` 方法可以混合任意颜色,但是我们闪存不多,所以我们选择最简单的解决方案。 + +我们只有在秒针移动时才重画时钟。 + +``` +btnWait(0, int64(qs+ds)*25e7) +``` + +上面的这行代码等待的正是那一刻,或者是按钮的按下。 + +每按一下按钮就会把时钟向前调一调。按住按钮一段时间会加速调整。 + +#### 中断 + +定义新的中断处理程序: + +``` +func exti4_15ISR() { + pending := exti.Pending() & 0xFFF0 + pending.ClearPending() + if pending&exti.Lines(btn.Mask()) != 0 { + btnev.Signal(1) + } +} +``` + +并将 `irq.EXTI4_15: exti4_15ISR` 条目添加到 ISR 数组。 + +该处理程序(或中断服务程序)处理 EXTI4_15 IRQ。 Cortex-M0 CPU 支持的 IRQ 明显少于其较大的同类兄弟处理器,因此你经常可以看到一个 IRQ 被多个中断源共享。在我们的例子中,一个 IRQ 由 12 个 EXTI 线共享。 + +exti4_15ISR 读取所有挂起的位,并从中选择 12 个更高的有效位。接下来,它清除 EXTI 中选中的位并开始处理它们。在我们的例子中,仅检查第 4 位。 `btnev.Signal(1)` 引发 `btnev.Wait(1, deadline)` 唤醒并返回 `true`。 + +你可以在 [Github][24] 上找到完整的代码。让我们来编译它: + +``` +$ egc +$ arm-none-eabi-size cortexm0.elf + text data bss dec hex filename + 15960 240 216 16416 4020 cortexm0.elf +``` + +这里所有的改进只得到 184 个字节。让我们再次重新构建所有内容,但这次在 typeinfo 中不使用任何类型和字段名: + +``` +$ cd $HOME/emgo +$ ./clean.sh +$ cd $HOME/firstemgo +$ egc -nf -nt +$ arm-none-eabi-size cortexm0.elf + text data bss dec hex filename + 15120 240 216 15576 3cd8 cortexm0.elf +``` + +现在,有了千字节的空闲空间,你可以改进一些东西。让我们看看它是如何工作的: + +![video](https://ziutek.github.io/videos/rgbclock.mp4) + +我不知道我是怎么精确打到 3:00 的!? + +以上就是所有内容!在第 4 部分(本系列的结束)中,我们将尝试在 LCD 上显示一些内容。(LCTT 译注:然而烂尾了,第三篇写于 2018 年,整个博客当年就停更了。) + +-------------------------------------------------------------------------------- + +via: https://ziutek.github.io/2018/05/03/go_on_very_small_hardware3.html + +作者:[Michał Derkacz][a] +选题:[lujun9972][b] +译者:[gxlct008](https://github.com/gxlct008) +校对:[wxy](https://github.com/wxy) + +本文由 [LCTT](https://github.com/LCTT/TranslateProject) 原创编译,[Linux中国](https://linux.cn/) 荣誉推出 + +[a]: https://ziutek.github.io +[b]: https://github.com/lujun9972 +[1]: https://ziutek.github.io/images/mcu/f030-demo-board/board.jpg +[2]: https://ziutek.github.io/2018/05/03/go_on_very_small_hardware3.html +[3]: https://linux.cn/article-11383-1.html +[4]: https://linux.cn/article-12747-1.html +[5]: http://www.world-semi.com/solution/list-4-1.html +[6]: https://ziutek.github.io/images/led/ws2812b.jpg +[7]: http://www.martinhubacek.cz/arm/improved-stm32-ws2812b-library +[8]: http://mikrokontrolery.blogspot.com/2011/03/Diody-WS2812B-sterowanie-XMega-cz-2.html +[9]: https://translate.google.pl/translate?sl=pl&tl=en&u=http://mikrokontrolery.blogspot.com/2011/03/Diody-WS2812B-sterowanie-XMega-cz-2.html +[10]: http://neon-world.com/en/product.php +[11]: http://www.normandled.com/index.php/Product/view/id/800.html +[12]: https://cpldcpu.wordpress.com/2014/08/27/apa102/ +[13]: https://cpldcpu.wordpress.com/2014/11/30/understanding-the-apa102-superled/ +[14]: https://cpldcpu.wordpress.com/2016/12/13/sk9822-a-clone-of-the-apa102/ +[15]: https://ziutek.github.io/images/led/rgbring.jpg +[16]: https://ziutek.github.io/images/led/ring-stlink-f030.jpg +[17]: https://jeelabs.org/article/1649a/ +[18]: http://www.st.com/en/evaluation-tools/stm32f4discovery.html +[19]: https://github.com/ziutek/emgo/tree/master/egpath/src/stm32/examples/minidev/treelights +[20]: https://github.com/ziutek/emgo/tree/master/egpath/src/stm32/examples/nucleo-f411re/ws2812 +[21]: https://en.wikipedia.org/wiki/Gamma_correction +[22]: https://en.wikipedia.org/wiki/Xorshift +[23]: https://ziutek.github.io/2018/04/14/go_on_very_small_hardware2.html#uart +[24]: https://github.com/ziutek/emgo/tree/master/egpath/src/stm32/examples/f030-demo-board/ws2812-clock diff --git a/published/202011/20190402 When Wi-Fi is mission-critical, a mixed-channel architecture is the best option.md b/published/202011/20190402 When Wi-Fi is mission-critical, a mixed-channel architecture is the best option.md new file mode 100644 index 0000000000..e121eea3b0 --- /dev/null +++ b/published/202011/20190402 When Wi-Fi is mission-critical, a mixed-channel architecture is the best option.md @@ -0,0 +1,75 @@ +[#]: collector: (lujun9972) +[#]: translator: (chenmu-kk) +[#]: reviewer: (wxy) +[#]: publisher: (wxy) +[#]: url: (https://linux.cn/article-12817-1.html) +[#]: subject: (When Wi-Fi is mission-critical, a mixed-channel architecture is the best option) +[#]: via: (https://www.networkworld.com/article/3386376/when-wi-fi-is-mission-critical-a-mixed-channel-architecture-is-the-best-option.html#tk.rss_all) +[#]: author: (Zeus Kerravala https://www.networkworld.com/author/Zeus-Kerravala/) + +当 Wi-Fi 成为关键业务时,混合信道架构是最好的多信道选择 +====== + +> 混合信道架构是最好的多信道选择,但它并不总是最佳的选择。当需要可靠的 Wi-Fi 时,单信道和混合 AP 提供了令人信服的替代方案。 + +![Getty Images][1] + +我曾与许多实施数字项目的公司合作过,结果却发现它们失败了。正确的想法,健全地施行,现存的市场机遇。哪里是薄弱的环节?是 Wi-Fi 网络。 + +例如,一家大型医院希望通过将遥测信息发送到移动设备,来提高临床医生对患者警报的响应时间。如果没有这个系统,护士了解病人警报的唯一途径就是通过声音警报。在所有嘈杂的背景音中,通常很难分辨噪音来自哪里。问题是这家医院中的 Wi-Fi 网络已经很多年未升级了,这导致信息传递严重延迟(通常需要 4~5 分钟)。过长的信息传递导致人们对该系统失去信心,因此许多临床医生停止使用该系统,转而使用手动警报。最终,人们认为这个项目是失败的。 + +我曾在制造业、K-12 教育、娱乐和其他行业中见过类似的案例。企业竞争的基础是客户体验,而竞争的动力来自不断扩展又无处不在的无线优势。好的 Wi-Fi 并不意味着市场领导地位,但是劣质的 Wi-Fi 将会对客户和员工产生负面影响。而在当今竞争激烈的环境下,这是灾难的根源。 + +### Wi-Fi 性能历来不一致 + +Wi-Fi 的问题在于它本身就很脆弱。我相信每个阅读这篇文章的人都经历过下载失败、连接中断、性能不一致以及连接公用热点的漫长等待时间等缺陷。 + +想象一下,你在一个会议上,在一个主题演讲之前,你可以随意地发推特、发电子邮件、浏览网页以及做其他事情。然后主讲人上台,所有观众开始拍照,上传并流传信息——然后网络崩溃了。我发现这不仅仅是一个例外,更是一种常态,强调了对[无损 Wi-Fi][3]的需求。 + +对于网络技术人员的问题是如何让一个地方的 Wi-Fi 达到全部时间都保持不间断。有人说只要加强现存的网络可以做到,这也许可以,但在某些情况下,Wi-Fi 的类型可能并不合适。 + +最常见的 Wi-Fi 部署类型是多信道,也称为微蜂窝,每个客户端通过无线信道连接到接入点(AP)。高质量的通话体验基于两点:良好的信号强度和最小的干扰。有几个因素会导致干扰,例如接入点距离太近、布局问题或者来自其他设备的干扰。为了最大程度地减少干扰,企业需要投入大量的时间和资金在[现场调查中规划最佳的信道地图][2],但即使这些做得很好,Wi-Fi 故障仍然可能发生。 + +## 多通道 Wi-Fi 并非总是最佳选择 + +对于许多铺着地毯的办公室来说,多通道 Wi-Fi 可能是可靠的,但在某些环境中,外部环境会影响性能。一个很好的例子是多租户建筑,其中有多个 Wi-Fi 网络在同一信道上传输并相互干扰。另一个例子是医院,这里有许多工作人员在多个接入点间流动。客户端将试图连接到最佳接入点,导致客户端不断断开连接并重新连接,从而导致会话中断。还有一些环境,例如学校、机场和会议设施,那里存在大量的瞬态设备,而多通道则难以跟上。 + +## 单通道 Wi-Fi 提供更好的可靠性但与此同时性能会受到影响 + +网络管理器要做什么?不一致的 Wi-Fi 只是一个既成事实吗?多信道是一种标准,但它并非是为动态物理环境或那些需要可靠的连接环境而设计的。 + +几年前提出了一项解决这些问题的替代架构。顾名思义,“单信道”Wi-Fi 在网络中为所有接入点使用单一的无线频道。可以把它想象成在一个信道上运行的单个 Wi-Fi 结构。这种架构中,接入点的位置无关紧要,因为它们都利用相同的通道,因此不会互相干扰。这有一个显而易见的简化优势,比如,如果覆盖率很低,那就没有理由再做一次昂贵的现场调查。相反,只需在需要的地方布置接入点就可以了。 + +单通道的缺点之一是总网络吞吐量低于多通道,因为只能使用一个通道。在可靠性高于性能的环境中,这可能会很好,但许多组织希望二者兼而有之。 + +## 混合接入点提供了两全其美的优势 + +单信道系统制造商最近进行了创新,将信道架构混合在一起,创造了一种“两全其美”的部署,可提供多信道的吞吐量和单信道的可靠性。举个例子,Allied Telesis 提供了混合接入点,可以同时在多信道和单信道模式下运行。这意味着可以分配一些 Web 客户端到多信道以获得最大的吞吐量,而其他的 Web 客户端则可使用单信道来获得无缝漫游体验。 + +这种混合的实际用例可能是物流设施,办公室工作人员使用多通道,但叉车操作员在整个仓库移动时使用单一通道持续连接。 + +Wi-Fi 曾是一个便利的网络,但如今它或许是所有网络中最关键的任务。传统的多信道体系也许可以工作,但应该做一些尽职调查来看看它在重负下如何运转。IT 领导者需要了解 Wi-Fi 对数字转型计划的重要性,并进行适当的测试,以确保它不是基础设施链中的薄弱环节,并为当今环境选择最佳技术。 + +-------------------------------------------------------------------------------- + +via: https://www.networkworld.com/article/3386376/when-wi-fi-is-mission-critical-a-mixed-channel-architecture-is-the-best-option.html + +作者:[Zeus Kerravala][a] +选题:[lujun9972][b] +译者:[chenmu-kk](https://github.com/chenmu-kk) +校对:[wxy](https://github.com/wxy) + +本文由 [LCTT](https://github.com/LCTT/TranslateProject) 原创编译,[Linux中国](https://linux.cn/) 荣誉推出 + +[a]: https://www.networkworld.com/author/Zeus-Kerravala/ +[b]: https://github.com/lujun9972 +[1]: https://images.idgesg.net/images/article/2018/09/tablet_graph_wifi_analytics-100771638-large.jpg +[2]: https://www.networkworld.com/article/3315269/wi-fi-site-survey-tips-how-to-avoid-interference-dead-spots.html +[3]: https://www.alliedtelesis.com/blog/no-compromise-wi-fi +[4]: https://pluralsight.pxf.io/c/321564/424552/7490?u=https%3A%2F%2Fwww.pluralsight.com%2Fcourses%2Fmobile-device-management-big-picture +[5]: https://www.networkworld.com/article/3273439/review-icinga-enterprise-grade-open-source-network-monitoring-that-scales.html?nsdr=true#nww-fsb +[6]: https://www.networkworld.com/article/3304307/nagios-core-monitoring-software-lots-of-plugins-steep-learning-curve.html +[7]: https://www.networkworld.com/article/3269279/review-observium-open-source-network-monitoring-won-t-run-on-windows-but-has-a-great-user-interface.html?nsdr=true#nww-fsb +[8]: https://www.networkworld.com/article/3304253/zabbix-delivers-effective-no-frills-network-monitoring.html +[9]: https://www.facebook.com/NetworkWorld/ +[10]: https://www.linkedin.com/company/network-world diff --git a/published/202011/20190925 Most enterprise networks can-t handle big data loads.md b/published/202011/20190925 Most enterprise networks can-t handle big data loads.md new file mode 100644 index 0000000000..ae1615b66f --- /dev/null +++ b/published/202011/20190925 Most enterprise networks can-t handle big data loads.md @@ -0,0 +1,60 @@ +[#]: collector: (lujun9972) +[#]: translator: (chenmu-kk) +[#]: reviewer: (wxy) +[#]: publisher: (wxy) +[#]: url: (https://linux.cn/article-12803-1.html) +[#]: subject: (Most enterprise networks can't handle big data loads) +[#]: via: (https://www.networkworld.com/article/3440519/most-enterprise-networks-cant-handle-big-data-loads.html) +[#]: author: (Andy Patrizio https://www.networkworld.com/author/Andy-Patrizio/) + +大多数企业网络无法处理大数据负载 +====== + +> 随着网络中流动着越来越多的数据,由于领导力和技术问题,网络正在滞后于数据的发展速度。 + +![](https://images.idgesg.net/images/article/2019/08/gettyimages-811109186-100808291-large.jpg) + +又过了一周,另一项调查发现,IT 已经无法跟上不断膨胀的数据过载。这次的问题将主要是网络带宽和整体性能。 + +管理咨询公司埃森哲对 [300 名 IT 专业人士进行的一项调查][1] 发现,大多数人认为他们企业网络无法胜任处理大数据的任务和物联网部署的任务。只有 43% 的受访公司表示他们的网络已经准备好支持云服务、物联网和其他数字技术。 + +一个关键原因(58%)是“IT 与商业需求之间的错位”,这延缓了这些项目的进展。这是一个不同寻常的发现,因为 85% 的受访者还表示他们的网络已经完全或者大体上已经准备好支持企业的数字化计划。那么,究竟是哪一种情况呢? + +第二和第三大时常提及的障碍是“业务需求和运营需求间固有的复杂性”以及“对带宽、性能等方面的需求超过交付能力”,各占 45%。 + +由于分析技术和其他大数据技术的推动,大量传输的数据持续涌入网络线路,网络瓶颈持续增长。调查发现,带宽需求并未得到满足,目前的网络性能依旧达不到要求。 + +其他原因还包括缺乏网络技术、设备扩展和设备老化。 + +### 网络性能问题的一个解决方案:SDN + +埃森哲发现,大多数公司表示 [软件定义网络(SDN)][5] 是应对带宽和性能挑战的解决方案,77% 的受访企业在调查中表示正在部署 SDN 或者已完成部署。它指出,虽然 SDN 可能在组织的某部分中存在,它并不总是在整个企业范围内统一地推出。 + +如今看来,似乎从未有人有足够的预算来满足他们所有的 IT 雄心,但 31% 受访者认为为网络改善提供资金是“简单的”,而且是在网络基础设施团队的控制范围内,相较于直接下属(13%)或基础设施/网络主管和副总裁(19%),首席信息官/首席技术官更可能将融资过程报告为“轻松”(40%)。 + +报告指出,“仅靠传统网络无法支持数字时代所需的创新和性能。”报告呼吁拥抱新技术,但没有提到 SDN 的名字。同时它还呼吁首席执行官和他们直接下属间加强合作,因为很明显,双方在看待问题的方式上存在分歧。 + +报告总结说,“我们认为需要一种新的网络范式来确保网络满足当前和未来的业务需求。然而,尽管有进步的迹象,但变革的步伐缓慢。公司必须承担起重担,才能实现统一和标准化企业能力,提供必要的带宽、性能和安全,以支持当前和未来的业务需求”。 + +-------------------------------------------------------------------------------- + +via: https://www.networkworld.com/article/3440519/most-enterprise-networks-cant-handle-big-data-loads.html + +作者:[Andy Patrizio][a] +选题:[lujun9972][b] +译者:[chenmu-kk](https://github.com/chenmu-kk) +校对:[wxy](https://github.com/wxy) + +本文由 [LCTT](https://github.com/LCTT/TranslateProject) 原创编译,[Linux中国](https://linux.cn/) 荣誉推出 + +[a]: https://www.networkworld.com/author/Andy-Patrizio/ +[b]: https://github.com/lujun9972 +[1]: https://www.accenture.com/_acnmedia/pdf-107/accenture-network-readiness-survey.pdf#zoom=50 +[2]: https://www.networkworld.com/article/3209131/lan-wan/what-sdn-is-and-where-its-going.html +[3]: https://www.networkworld.com/article/3206709/lan-wan/what-s-the-difference-between-sdn-and-nfv.html +[4]: https://www.networkworld.com/newsletters/signup.html +[5]: https://www.networkworld.com/article/3209131/what-sdn-is-and-where-its-going.html +[6]: https://www.networkworld.com/blog/itaas-and-the-corporate-storage-technology/ +[7]: https://www.networkworld.com/article/3405522/how-network-pros-acquire-skills-for-sdn-programmable-networks.html +[8]: https://www.facebook.com/NetworkWorld/ +[9]: https://www.linkedin.com/company/network-world diff --git a/published/202011/20191003 4 open source eBook readers for Android.md b/published/202011/20191003 4 open source eBook readers for Android.md new file mode 100644 index 0000000000..89cbee1312 --- /dev/null +++ b/published/202011/20191003 4 open source eBook readers for Android.md @@ -0,0 +1,153 @@ +[#]: collector: (lujun9972) +[#]: translator: (chenmu-kk) +[#]: reviewer: (wxy) +[#]: publisher: (wxy) +[#]: url: (https://linux.cn/article-12826-1.html) +[#]: subject: (4 open source eBook readers for Android) +[#]: via: (https://opensource.com/article/19/10/open-source-ereaders-android) +[#]: author: (Scott Nesbitt https://opensource.com/users/scottnesbitt) + +四款安卓开源电子书阅读器 +====== + +> 你在寻找新的电子书阅读软件吗?来看看这四款适用于安卓的可靠的开源电子书阅读器吧。 + +![](https://img.linux.net.cn/data/attachment/album/202011/16/135728ayhh1aiqwrva50zy.jpg) + +谁不想有一个好的阅读体验?与其将时间浪费在社交媒体或[即时消息软件][2]上,不如在自己的安卓手机或平板上阅读一本书、杂志或其他文档。 + +要做到这一点,你需要的是一个适合的电子书阅读软件。接下来让我们来看一看四款可靠的、开源安卓电子书阅读器。 + +### Book Reader + +那我们先从我最喜欢的一款开源安卓电子书阅读器开始:[Book Reader][3]。它基于现在专有的 FBReader 应用的开源老版本。像 FBReader 的早期版本一样,Book Reader 小而简单,但是好用。 + +**优点:** + + * 易于操作。 + * 该应用界面遵循安卓的 [Material Design 指南][4],因此非常干净。 + * 你可以为电子书添加书签,并将文本分享至你设备上的其他应用。 + * 不断提供除英语外的其他语言的支持。 + +**缺点** + + * Book Reader 的自定义选项较少。 + * 没有内置词典或支持外部词典的功能。 + +**支持的电子书格式:** + +Book Reader 支持 EPUB、.mobi、PDF、[DjVu][5]、HTML、纯文本、 Word 文档、RTF 和 [FictionBook][6]。 + +![Book Reader Android app][7] + +Book Reader 的源码在 GNU GPL 3.0 下授权,你可以在[GitLab][8]中找到它。 + +### Cool Reader + +[Cool Reader][9] 是一个灵活易用的电子书软件。虽然我觉得该软件的图标会让想起 Windows vista 中的图标,但它确实有一些好用的功能。 + +**优点** + + * 高度自定义,你可以更改字体、行宽、段间距、连字符、字体大小、页边距以及背景色。 + * 你可以覆盖书中的样式表。我发现这对于两三本将所有文本设置为小写字母的书很有用。 + * 它会在设备启动时自动搜寻设备中的新书资源。你也可以查阅[古腾堡计划][10]和[互联网档案馆][11]中的书籍。 + +**缺点** + + * Cool Reader 的界面并不是极简或者说最现代化的。 + * 虽然它开箱即用,但实际上你需要调整一些配置来更舒适地使用 Cool Reader。 + * 应用的默认词典是专有的,尽管你可以用[开源的词典][12]来替换掉它。 + +**支持的电子书格式:** + +你可以使用 Cool Reader 来浏览 EPUB、小说、纯文本、RTF、HTML、[CHM][13] 和 TCR(Psion 系列掌上电脑的电子书格式)文件。 + +![Cool Reader Android app][14] + +Cool Reader 的源码在 GNU GPL 2 下授权,你可以在 [Sourceforge][15] 中找到它。 + +### KOReader + +[KOReader][16] 最初是为了 [E Ink][17] 电子书阅读器创建的,但后来发现它可用于安卓。在测试它时,我发现 KOReader 在同等程度下既有用又令人沮丧。很明显它绝不是一款不好的应用,但不会是我的首选。 + +**优点** + + * 高度自定义。 + * 支持多种语言。 + * 它允许你使用[词典][18](若你已安装)或者 Wikipedia(若你已连接至网络)来查单词。 + +**缺点** + + * 每一本书你都需要改变设置。在你打开一本新书时,KOReader 不会记住相关设置 + * 它的界面会让人觉得是一款专门的电子书阅读器。该应用没有安卓的外形和感受。 + +**支持的电子书格式:** + +你可以查阅 PDF、DjVu、CBT、以及 [CBZ][5] 电子书。它也支持 EPUB、小说、.mobi、Word 文档、文本文件和 [CHM][13] 文件。 + +![KOReader Android app][19] + +Cool Reader 的源码在 GNU Affero GPL 3.0 下授权,你可以在 [GitHub][20] 上找到它。 + +### Booky McBookface + +是的,这确实是[这款电子书阅读器][21]的名字。它是这篇文章中最基础的电子书阅读器,但不要因此(或者这个傻乎乎的名字)使你失望。Booky McBookface 易于使用,并且有一件事它做的很好。 + +**优点** + + * 没有多余的装饰。只有你和你的电子书。 + * 界面简洁。 + * 在安卓启动栏中的长按软件图标会弹出一个菜单,你可以从中打开正在阅读的最后一本书、获得未读书籍的列表、或者查找并打开设备上的一本书。 + +**缺点** + + * 软件中几乎没有配置选项——你可以更改字体大小和亮度,仅此而已。 + * 你需要使用屏幕底部的按钮浏览电子书。点击屏幕边缘无法操作。 + * 无法为电子书添加书签。 + +**支持的电子书格式** + +你可以使用该软件阅读 EPUB 格式、HTML 文档,或纯文本格式的电子书。 + +![Booky McBookface Android app][22] + +Booky McBookface 的源码在 GNU GPL 3.0 下授权,你可以在 [GitHub][23] 中找到它。 + +你有最喜欢的安卓开源电子书阅读器吗?在社区中留言分享一下吧。 + +-------------------------------------------------------------------------------- + +via: https://opensource.com/article/19/10/open-source-ereaders-android + +作者:[Scott Nesbitt][a] +选题:[lujun9972][b] +译者:[chenmu-kk](https://github.com/chenmu-kk) +校对:[wxy](https://github.com/wxy) + +本文由 [LCTT](https://github.com/LCTT/TranslateProject) 原创编译,[Linux中国](https://linux.cn/) 荣誉推出 + +[a]: https://opensource.com/users/scottnesbitt +[b]: https://github.com/lujun9972 +[1]: https://opensource.com/sites/default/files/styles/image-full-size/public/lead-images/computer_browser_program_books_read.jpg?itok=iNMWe8Bu (Computer browser with books on the screen) +[2]: https://opensource.com/article/19/3/open-messenger-client +[3]: https://f-droid.org/en/packages/com.github.axet.bookreader/ +[4]: https://material.io/design/ +[5]: https://opensource.com/article/19/3/comic-book-archive-djvu +[6]: https://en.wikipedia.org/wiki/FictionBook +[7]: https://opensource.com/sites/default/files/uploads/book_reader-book-list.png (Book Reader Android app) +[8]: https://gitlab.com/axet/android-book-reader/tree/HEAD +[9]: https://f-droid.org/en/packages/org.coolreader/ +[10]: https://www.gutenberg.org/ +[11]: https://archive.org +[12]: http://aarddict.org/ +[13]: https://fileinfo.com/extension/chm +[14]: https://opensource.com/sites/default/files/uploads/cool_reader-icons.png (Cool Reader Android app) +[15]: https://sourceforge.net/projects/crengine/ +[16]: https://f-droid.org/en/packages/org.koreader.launcher/ +[17]: https://en.wikipedia.org/wiki/E_Ink +[18]: https://github.com/koreader/koreader/wiki/Dictionary-support +[19]: https://opensource.com/sites/default/files/uploads/koreader-lookup.png (KOReader Android app) +[20]: https://github.com/koreader/koreader +[21]: https://f-droid.org/en/packages/com.quaap.bookymcbookface/ +[22]: https://opensource.com/sites/default/files/uploads/booky_mcbookface-menu.png (Booky McBookface Android app) +[23]: https://github.com/quaap/BookyMcBookface diff --git a/published/202011/20200310 Getting started with Emacs.md b/published/202011/20200310 Getting started with Emacs.md new file mode 100644 index 0000000000..01283be5a9 --- /dev/null +++ b/published/202011/20200310 Getting started with Emacs.md @@ -0,0 +1,177 @@ +[#]: collector: (lujun9972) +[#]: translator: (wxy) +[#]: reviewer: (wxy) +[#]: publisher: (wxy) +[#]: url: (https://linux.cn/article-12868-1.html) +[#]: subject: (Getting started with Emacs) +[#]: via: (https://opensource.com/article/20/3/getting-started-emacs) +[#]: author: (Seth Kenlon https://opensource.com/users/seth) + +10 个让你进入 Emacs 世界的技巧 +====== + +> 10 个技巧,让你深入这个有用的开源文本编辑器的世界。 + +![](https://img.linux.net.cn/data/attachment/album/202011/29/103757lccy9ljxiowooyzy.jpg) + +很多人都说想学 [Emacs][2],但很多人在短暂的接触后就退缩了。这并不是因为 Emacs 不好,也不是 Emacs 复杂。我相信,问题在于人们其实并不想“学习” Emacs,而是他们想习惯 Emacs 的传统。他们想了解那些神秘的键盘快捷键和不熟悉的术语。他们想按照他们认为的“使用目的”来使用 Emacs。 + +我很同情这一点,因为我对 Emacs 的感觉就是这样。我以为真正的 Emacs 用户都只会在终端里面运行,从来不用方向键和菜单,更不会用鼠标。这是个阻止自己开始使用 Emacs 的好办法。有足够多的独特的 `.emacs` 配置文件证明,如果说 Emacs 用户有一个共同的变化,那就是每个人使用 Emacs 的方式不同。 + +学习 Emacs 很容易。爱上 Emacs 才是最难的。要爱上 Emacs,你必须发现它所拥有的功能,而这些功能是你一直在寻找的,有时你并不知道你已经错过了它们。这需要经验。 + +获得这种经验的唯一方法就是从一开始就积极使用 Emacs。这里有十个小提示,可以帮助你找出最适合你的方法。 + +### 从 GUI 开始 + +Emacs(以及它的友好竞争者 [Vim][3])最伟大的事情之一是它可以在终端中运行,这在你 SSH 进入服务器时很有用,但在过去 15 年来制造的计算机上意义不大。Emacs 的 GUI 版本可以在极度[低功耗的设备][4]上运行,它有很多实用的功能,无论是新手还是有经验的用户都可以使用它。 + +例如,如果你不知道如何在 Emacs 中只用键盘快捷键复制一个单词,编辑菜单的复制、剪切和粘贴选择提供了最轻松的路径。没有理由因为选择了 Emacs 而惩罚自己。使用它的菜单,用鼠标选择区域,点击缓冲区内的按钮,不要让陌生感阻碍你的工作效率。 + +![Emacs slackware][5] + +这些功能被内置到 Emacs 中,是因为用户在使用它们。你应该在你需要的时候使用它们,而当你最终在 VT100 终端上通过 SSH 使用 Emacs,没有 `Alt` 或方向键的时候,你才应该使用这些晦涩的命令。 + +### 习惯术语 + +Emacs 的 UI 元素有着特殊的术语。个人计算的发展并不是建立在相同的术语上,所以很多术语对现代计算机用户来说比较陌生,还有一些术语虽然相同,但含义不同。下面是一些最常见的术语。 + + * 框架Frame。在 Emacs 中,“框架”就是现代计算机所说的“窗口”。 + * 缓冲区Buffer:“缓冲区”是 Emacs 的一个通信通道。它可以作为 Emacs 进程的命令行,也可以作为 shell,或者只是一个文件的内容。 + * 窗口Window:“窗口”是你进入一个缓冲区的视角。 + * 迷你缓冲区Mini-buffer。它是主要的命令行,位于 Emacs 窗口的底部。 + +![Emacs tutorial map][6] + +### 让 Emacs 的修饰键变得更有意义 + +在 PC 键盘上,`Ctrl` 键被称为 `C`,`Alt` 键被称为 `M`,这些键并不是 `C` 和 `M` 键,由于它们总是与相应的字母或符号键配对,所以在文档中很容易识别。 + +例如,`C-x` 在现代键盘符号中的意思是 `Ctrl+X`,`M-x` 是 `Alt+X`。就像你从任何应用程序中剪切文本时一样,同时按下这两个键。 + +不过,还有另一个层次的键盘快捷键,与现代电脑上的任何东西都完全不同。有时,键盘快捷键并不只是一个键组合,而是由一系列的按键组成。 + +例如,`C-x C-f` 的意思是像往常一样按 `Ctrl+X`,然后再按 `Ctrl+C`。 + +有时,一个键盘快捷键有混合的键型。组合键 `C-x 3` 意味着像往常一样按 `Ctrl+X`,然后按数字 `3` 键。 + +Emacs 之所以能做到这些花哨的强力组合,是因为某些键会让 Emacs 进入一种特殊的命令模式。如果你按 `C-X`(也就是 `Ctrl+X`),就是告诉 `Emacs` 进入空闲状态,等待第二个键或键盘快捷键。 + +Emacs 的文档,无论是官方的还是非官方的,都有很多键盘快捷键。在心里练习把 `C` 键翻译成 `Ctrl` 键,`M` 键翻译成 `Alt` 键,那么这些文档对你来说都会变得更有意义。 + +### 剪切、复制和粘贴的备用快捷方式 + +从规范上,复制文本是通过一系列的键盘快捷键进行的,这些快捷键取决于你想要复制或剪切的方式。 + +例如,你可以用 `M-d`(`Alt+d` 的 Emacs 行话)剪切一整个单词,或者用`C-k`(`Ctrl+K`)剪切一整行,或者用 `M-m`(`Alt+M`)剪切一个高亮区域。如果你想的话,你可以习惯这样,但如果你喜欢 `Ctrl+C` 和 `Ctrl+X` 和 `Ctrl-V`,那么你可以用这些来代替。 + +启用现代的“剪切-复制-粘贴”需要激活一个名为 CUA(通用用户访问Common User Access)的功能。要激活 CUA,请单击“选项”菜单并选择“使用 CUA 键”。启用后,`C-c` 复制高亮显示的文本,`C-x` 剪切高亮显示的文本,`C-v` 粘贴文本。这个模式只有在你选择了文本之后才会实际激活,所以你仍然可以学习 Emacs 通常使用的 `C-x` 和 `C-c` 绑定。 + +### 用哪个都好 + +Emacs 是一个应用程序,它不会意识到你对它的感情或忠诚度。如果你想只用 Emacs 来完成那些“感觉”适合 Emacs 的任务,而用不同的编辑器(比如 Vim)来完成其他任务,你可以这样做。 + +你与一个应用程序的交互会影响你的工作方式,所以如果 Emacs 中所需要的按键模式与特定任务不一致,那么就不要强迫自己使用 Emacs 来完成该任务。Emacs 只是众多可供你使用的开源工具之一,没有理由让自己只限于一种工具。 + +### 探索新函数 + +Emacs 所做的大部分工作都是一个 elisp 函数,它可以从菜单选择和键盘快捷键调用,或者在某些情况下从特定事件中调用。所有的函数都可以从迷你缓冲区(Emacs 框架底部的命令行)执行。理论上,你甚至可以通过键入 `forward-word` 和 `backward-word` 以及 `next-line` 和 `previous-line` 等函数来导航光标。这肯定是无比低效的,但这就是一种直接访问你运行的代码的方式。在某种程度上,Emacs 就是自己的 API。 + +你可以通过在社区博客上阅读有关 Emacs 的资料来了解新函数,或者你可以采取更直接的方法,使用描述函数(`describe-function`)。要获得任何函数的帮助,按 `M-x`(也就是 `Alt+X`),然后输入 `describe-function`,然后按回车键。系统会提示你输入一个函数名称,然后显示该函数的描述。 + +你可以通过键入`M-x(`Alt+X`),然后键入 `?` 来获得所有可用函数的列表。 + +你也可以在输入函数时,通过按 `M-x` 键,然后输入 `auto-complete-mode`,再按回车键,获得弹出的函数描述。激活该模式后,当你在文档中键入任何 Emacs 函数时,都会向你提供自动补完选项,以及函数的描述。 + +![Emacs function][7] + +当你找到一个有用的函数并使用它时,Emacs 会告诉你它的键盘绑定,如果有的话。如果没有的话,你可以通过打开你的 `$HOME/.emacs` 配置文件并输入键盘快捷键来自己分配一个。语法是 ` global-set-key`,后面是你要使用的键盘快捷键,然后是你要调用的函数。 + +例如,要将 `screenwriter-slugline` 函数分配一个键盘绑定: + +``` +(global-set-key (kbd “C-c s”) 'screenwriter-slugline) +``` + +重新加载配置文件,键盘快捷键就可以使用了: + +``` +M-x load-file ~/.emacs +``` + +### 紧急按钮 + +当你使用 Emacs 并尝试新的函数时,你一定会开始调用一些你并不想调用的东西。Emacs 中通用的紧急按钮是 `C-g`(就是 `Ctrl+G`)。 + +我通过将 G 与 GNU 联系起来来记住这一点,我想我是在呼吁 GNU 将我从一个错误的决定中拯救出来,但请随意编造你自己的记忆符号。 + +如果你按几下 `C-g`,Emacs 的迷你缓冲区就会回到潜伏状态,弹出窗口被隐藏,你又回到了一个普通的、无聊的文本编辑器的安全状态。 + +### 忽略键盘快捷键 + +潜在的键盘快捷键太多,在这里无法一一总结,更不希望你能记住。这是设计好的。Emacs 的目的是为了定制,当人们为 Emacs 编写插件时,他们可以定义自己的特殊键盘快捷键。 + +我们的想法不是要马上记住所有的快捷键。相反,你的目标是让你在使用 Emacs 时感到舒适。你在 Emacs 中变得越舒适,你就越会厌倦总是求助于菜单栏,你就会开始记住对你重要的组合键。 + +根据自己在 Emacs 中通常做的事情,每个人都有自己喜欢的快捷方式。一个整天用 Emacs 写代码的人可能知道运行调试器或启动特定语言模式的所有键盘快捷键,但对 Org 模式或 Artist 模式一无所知。这很自然,也很好。 + +### 使用 Bash 时练习 Emacs + +了解 Emacs 键盘快捷键的一个好处是,其中许多快捷键也适用于 Bash。 + + * `C-a`:到行首 + * `C-e`:到行尾 + * `C-k`:剪切整行 + * `M-f`:向前一个字 + * `M-b`:向后一个字 + * `M-d`:剪切一个字 + * `C-y`:贴回(粘贴)最近剪切的内容 + * `M-Shift-U`:大写一个词 + * `C-t`:交换两个字符(例如,`sl` 变成 `ls`) + +还有更多的例子,它能让你与 Bash 终端的交互速度超乎你的想象。 + +### 包 + +Emacs 有一个内置的包管理器来帮助你发现新的插件。它的包管理器包含了帮助你编辑特定类型文本的模式(例如,如果你经常编辑 JSON 文件,你可以尝试使用 ejson 模式)、嵌入的应用程序、主题、拼写检查选项、linter 等。这就是 Emacs 有可能成为你日常计算的关键所在;一旦你找到一个优秀的 Emacs 包,你可能离不开它了。 + +![Emacs emoji][8] + +你可以按 `M-x`(就是 `Alt+X`)键,然后输入 `package-list-packages` 命令,再按回车键来浏览包。软件包管理器在每次启动时都会更新缓存,所以第一次使用时要耐心等待它下载可用软件包的列表。一旦加载完毕,你可以用键盘或鼠标进行导航(记住,Emacs 是一个 GUI 应用程序)。每一个软件包的名称都是一个按钮,所以你可以将光标移到它上面,然后按回车键,或者直接用鼠标点击它。你可以在 Emacs 框架中出现的新窗口中阅读有关软件包的信息,然后用安装按钮来安装它。 + +有些软件包需要特殊的配置,有时会在它的描述中列出,但有时需要你访问软件包的主页来阅读更多的信息。例如,自动完成包 `ac-emoji` 很容易安装,但需要你定义一个符号字体。无论哪种方式都可以使用,但你只有在安装了字体的情况下才能看到相应的表情符号,除非你访问它的主页,否则你可能不会知道。 + +### 俄罗斯方块 + +Emacs 有游戏,信不信由你。有数独、拼图、扫雷、一个好玩的心理治疗师,甚至还有俄罗斯方块。这些并不是特别有用,但在任何层面上与 Emacs 进行交互都是很好的练习,游戏是让你在 Emacs 中花费时间的好方法。 + +![Emacs tetris][9] + +俄罗斯方块也是我最初接触 Emacs 的方式,所以在该游戏的所有版本中,Emacs 版本才是我真正的最爱。 + +### 使用 Emacs + +GNU Emacs 之所以受欢迎,是因为它的灵活性和高度可扩展性。人们习惯了 Emacs 的键盘快捷键,以至于他们习惯性地尝试在其他所有的应用程序中使用这些快捷键,他们将应用程序构建到 Emacs 中,所以他们永远不需要离开。如果你想让 Emacs 在你的计算生活中扮演重要角色,最终的关键是拥抱未知,开始使用 Emacs。磕磕绊绊地,直到你发现如何让它为你工作,然后安下心来,享受 40 年的舒适生活。 + +-------------------------------------------------------------------------------- + +via: https://opensource.com/article/20/3/getting-started-emacs + +作者:[Seth Kenlon][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/seth +[b]: https://github.com/lujun9972 +[1]: https://opensource.com/sites/default/files/styles/image-full-size/public/lead-images/keyboaord_enter_writing_documentation.jpg?itok=kKrnXc5h (Computer keyboard typing) +[2]: https://opensource.com/downloads/emacs-cheat-sheet +[3]: https://opensource.com/downloads/cheat-sheet-vim +[4]: https://opensource.com/article/17/2/pocketchip-or-pi +[5]: https://opensource.com/sites/default/files/uploads/emacs-slackware.jpg (Emacs slackware) +[6]: https://opensource.com/sites/default/files/uploads/emacs-tutorial-map.png (Emacs tutorial map) +[7]: https://opensource.com/sites/default/files/uploads/emacs-function.jpg (Emacs function) +[8]: https://opensource.com/sites/default/files/uploads/emacs-emoji_0.jpg (Emacs emoji) +[9]: https://opensource.com/sites/default/files/uploads/emacs-tetris.jpg (Emacs tetris) diff --git a/published/202011/20200720 An introduction to mutation testing in Python.md b/published/202011/20200720 An introduction to mutation testing in Python.md new file mode 100644 index 0000000000..8d737a7cf5 --- /dev/null +++ b/published/202011/20200720 An introduction to mutation testing in Python.md @@ -0,0 +1,155 @@ +[#]: collector: (lujun9972) +[#]: translator: (MjSeven) +[#]: reviewer: (wxy) +[#]: publisher: (wxy) +[#]: url: (https://linux.cn/article-12871-1.html) +[#]: subject: (An introduction to mutation testing in Python) +[#]: via: (https://opensource.com/article/20/7/mutmut-python) +[#]: author: (Moshe Zadka https://opensource.com/users/moshez) + +Python 突变测试介绍 +====== + +> 通过突变测试来修复未知的 bug。 + +![](https://img.linux.net.cn/data/attachment/album/202011/29/230106ie9xc89dj3jx1yj9.jpg) + +你一定对所有内容都进行了测试,也许你甚至在项目仓库中有一个徽章,标明有 100% 的测试覆盖率,但是这些测试真的帮到你了吗?你怎么知道的? + +开发人员很清楚单元测试的*成本*。测试必须要编写。有时它们无法按照预期工作:存在假告警或者抖动测试。在不更改任何代码的情况下有时成功,有时失败。通过单元测试发现的小问题很有价值,但是通常它们悄无声息的出现在开发人员的机器上,并且在提交到版本控制之前就已得到修复。但真正令人担忧的问题大多是看不见的。最糟糕的是,*丢失的告警*是完全不可见的:你看不到没能捕获的错误,直到出现在用户手上 —— 有时甚至连用户都看不到。 + +有一种测试可以使不可见的错误变为可见:[突变测试][2]mutation testing。 + +变异测试通过算法修改源代码,并检查每次测试是否都有“变异体”存活。任何在单元测试中幸存下来的变异体都是问题:这意味着对代码的修改(可能会引入错误)没有被标准测试套件捕获。 + +[Python][3] 中用于突变测试的一个框架是 `mutmut`。 + +假设你需要编写代码来计算钟表中时针和分针之间的角度,直到最接近的度数,代码可能会这样写: + +``` +def hours_hand(hour, minutes): +    base = (hour % 12 ) * (360 // 12) +    correction = int((minutes / 60) * (360 // 12)) +    return base + correction + +def minutes_hand(hour, minutes): +    return minutes * (360 // 60) + +def between(hour, minutes): +    return abs(hours_hand(hour, minutes) - minutes_hand(hour, minutes)) +``` + +首先,写一个简单的单元测试: + +``` +import angle + +def test_twelve(): +    assert angle.between(12, 00) == 0 +``` + +足够了吗?代码没有 `if` 语句,所以如果你查看覆盖率: + +``` +$ coverage run `which pytest` +============================= test session starts ============================== +platform linux -- Python 3.8.3, pytest-5.4.3, py-1.8.2, pluggy-0.13.1 +rootdir: /home/moshez/src/mut-mut-test +collected 1 item                                                               + +tests/test_angle.py .                                                    [100%] + +============================== 1 passed in 0.01s =============================== +``` + +完美!测试通过,覆盖率为 100%,你真的是一个测试专家。但是,当你使用突变测试时,覆盖率会变成多少? + +``` +$ mutmut run --paths-to-mutate angle.py + +Legend for output: +🎉 Killed mutants. The goal is for everything to end up in this bucket. +⏰ Timeout. Test suite took 10 times as long as the baseline so were killed. +🤔 Suspicious. Tests took a long time, but not long enough to be fatal. +🙁 Survived. This means your tests needs to be expanded. +🔇 Skipped. Skipped. + +⠋ 21/21 🎉 5 ⏰ 0 🤔 0 🙁 16 🔇 0 +``` + +天啊,在 21 个突变体中,有 16 个存活。只有 5 个通过了突变测试,但是,这意味着什么呢? + +对于每个突变测试,`mutmut` 会修改部分源代码,以模拟潜在的错误,修改的一个例子是将 `>` 比较更改为 `>=`,查看会发生什么。如果没有针对这个边界条件的单元测试,那么这个突变将会“存活”:这是一个没有任何测试用例能够检测到的潜在错误。 + +是时候编写更好的单元测试了。很容易检查使用 `results` 所做的更改: + +``` +$ mutmut results + +Survived 🙁 (16) + +---- angle.py (16) ---- + +4-7, 9-14, 16-21 +$ mutmut apply 4 +$ git diff +diff --git a/angle.py b/angle.py +index b5dca41..3939353 100644 +--- a/angle.py ++++ b/angle.py +@@ -1,6 +1,6 @@ + def hours_hand(hour, minutes): + hour = hour % 12 +- base = hour * (360 // 12) ++ base = hour / (360 // 12) + correction = int((minutes / 60) * (360 // 12)) + return base + correction +``` + +这是 `mutmut` 执行突变的一个典型例子,它会分析源代码并将运算符更改为不同的运算符:减法变加法。在本例中由乘法变为除法。一般来说,单元测试应该在操作符更换时捕获错误。否则,它们将无法有效地测试行为。按照这种逻辑,`mutmut` 会遍历源代码仔细检查你的测试。 + +你可以使用 `mutmut apply` 来应用失败的突变体。事实证明你几乎没有检查过 `hour` 参数是否被正确使用。修复它: + +``` +$ git diff +diff --git a/tests/test_angle.py b/tests/test_angle.py +index f51d43a..1a2e4df 100644 +--- a/tests/test_angle.py ++++ b/tests/test_angle.py +@@ -2,3 +2,6 @@ import angle + + def test_twelve(): + assert angle.between(12, 00) == 0 ++ ++def test_three(): ++ assert angle.between(3, 00) == 90 +``` + +以前,你只测试了 12 点钟,现在增加一个 3 点钟的测试就足够了吗? + +``` +$ mutmut run --paths-to-mutate angle.py + +⠋ 21/21 🎉 7 ⏰ 0 🤔 0 🙁 14 🔇 0 +``` + +这项新测试成功杀死了两个突变体,比以前更好,当然还有很长的路要走。我不会一一解决剩下的 14 个测试用例,因为我认为模式已经很明确了。(你能将它们降低到零吗?) + +变异测试和覆盖率一样,是一种工具,它允许你查看测试套件的全面程度。使用它使得测试用例需要改进:那些幸存的突变体中的任何一个都是人类在篡改代码时可能犯的错误,以及潜伏在程序中的隐藏错误。继续测试,愉快地搜寻 bug 吧。 + +-------------------------------------------------------------------------------- + +via: https://opensource.com/article/20/7/mutmut-python + +作者:[Moshe Zadka][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/moshez +[b]: https://github.com/lujun9972 +[1]: https://opensource.com/sites/default/files/styles/image-full-size/public/lead-images/search_find_code_python_programming.png?itok=ynSL8XRV (Searching for code) +[2]: https://opensource.com/article/19/8/mutation-testing-evolution-tdd +[3]: https://opensource.com/resources/python diff --git a/published/202011/20200804 Use your favorite programming language to provision Infrastructure as Code.md b/published/202011/20200804 Use your favorite programming language to provision Infrastructure as Code.md new file mode 100644 index 0000000000..2429ce55ae --- /dev/null +++ b/published/202011/20200804 Use your favorite programming language to provision Infrastructure as Code.md @@ -0,0 +1,452 @@ +[#]: collector: (lujun9972) +[#]: translator: (wxy) +[#]: reviewer: (wxy) +[#]: publisher: (wxy) +[#]: url: (https://linux.cn/article-12862-1.html) +[#]: subject: (Use your favorite programming language to provision Infrastructure as Code) +[#]: via: (https://opensource.com/article/20/8/infrastructure-as-code-pulumi) +[#]: author: (Lee Briggs https://opensource.com/users/lbriggs) + +使用你喜欢的编程语言,将基础设施作为代码进行配置 +====== + +> 用 Node.js 或其他编程语言为你提供启动基础设施所需的一切服务。 + +![](https://img.linux.net.cn/data/attachment/album/202011/27/151108bnnggmxegfzwog46.jpg) + +当你在 IT 和技术的世界里遨游时,你会反复遇到一些术语。其中有些术语很难量化,随着时间的推移,可能会有不同的含义。[“DevOps”][2] 就是一个例子,这个词似乎(在我看来)会根据使用它的人而改变;最初的 DevOps 先驱者可能甚至不认识我们今天所说的 DevOps。 + +如果你是一个软件开发者,“基础架构即代码Infrastructure as Code”(IaC)可能是其中一个术语。IaC 是使用与你编写面向用户的功能相同的软件开发实践来声明应用程序运行的基础设施。这通常意味着使用 [Git][3] 或 [Mercurial][4] 等工具进行版本控制,使用 Puppet、Chef 或 Ansible 进行[配置管理][5]。在基础设施供应层,最常见的技术是 CloudFormation(专用于 AWS),或开源替代品 [Terraform][6],用来创建供你的应用程序运行的混合云资源。 + +在配置管理领域有很好产品可供选择,可以将 IaC 写成配置文件或首选的编程语言,但这种选择在基础设施供应领域并不常见。 + +[Pulumi][7] 提供了一个使用标准编程语言来定义基础设施的方式。它支持一系列语言,包括 [JavaScript][8]、[TypeScript][9]、[Go][10]、[Python][11] 和 [C#][12]。就像 Terraform 一样,Pulumi 对许多熟悉的云提供商有一流的支持,比如 [AWS][13]、[Azure][14]、[Google Cloud][15] 和[其他提供商][16]。 + +在本文中,我将向你展示如何使用 Pulumi 以 Node.js 编写基础设施。 + +### 先决条件 + +首先,确保你已经做好了使用 Pulumi 的准备。Pulumi 支持所有主流的操作系统,所以你安装其先决条件的方法取决于你使用的操作系统。 + +首先,安装你喜欢的编程语言的解释器。我将使用 TypeScript,所以我需要安装 `node` 二进制。请查阅 Node 的[安装说明][17],了解你的操作系统的信息。你可以在 [Mac][19] 或 [Linux][20] 上使用 [Homebrew][18] 来安装: + +``` +brew install node +``` + +在 Linux 上,你可以使用你常用的软件包管理器,如 `apt` 或 `dnf`。 + +``` +$ sudo dnf install nodejs +``` + +无论哪种情况,结果都应该是 `node` 二进制文件在你的 `$PATH` 中可用。要确认它是可访问的,运行: + +``` +node --version +``` + +接下来,安装 Pulumi 命令行界面(CLI)。你可以在 Pulumi 的文档中找到针对不同操作系统的[安装说明][21]。在 Mac 或 Linux 上使用 `brew`: + +``` +brew install pulumi +``` + +另外,你也可以使用安装脚本。首先下载并审查它,然后执行它: + +``` +$ curl -fsSL --output pulumi_installer.sh https://get.pulumi.com/ +$ more  pulumi_installer.sh +$ sh ./pulumi_installer.sh +``` + +同样,我们所希望的结果是在你的路径上有 `pulumi` 二进制。检查版本以确保你已经准备好了: + +``` +pulumi version +v2.5.0 +``` + +### 配置 Pulumi + +在你开始配置任何基础设施之前,给 Pulumi 一个存储其[状态][22]的地方。 + +Pulumi 将其状态存储在后端。默认的后端是 Pulumi 的软件即服务(它有一个针对个人用户的免费计划),但在这个例子中,我使用替代的文件后端。文件后端将在你的本地文件系统上创建一个文件来存储状态: + +``` +pulumi login --local +``` + +如果你打算和别人分享这个项目,文件后台可能不是一个好的起点。Pulumi 还可以将其状态存储在 AWS S3 等云对象存储中。要使用它,请创建一个 S3 bucket 并登录: + +``` +pulumi login --cloud-url s3://my-pulumi-state-bucket +``` + +现在你已经登录到了状态后端,你可以创建一个项目和一个堆栈了! + +在你开始创建 Pulumi 项目之前,请先了解以下 Pulumi 术语,你将在本教程中看到这些术语。 + +#### 项目 + +[项目][23]project是一个包含 `Pulumi.yaml` 文件的目录。这个文件包含了 Pulumi 需要知道的元数据,以便进行它的工作。在 `Pulumi.yaml` 文件中可以找到的示例字段有: + + * 运行时(例如,Python、Node、Go、.Net) + * 项目说明(如“我的第一个 Pulumi 项目”) + * 项目名称 + +项目是一个松散的概念,可以满足你的需求。一般来说,一个项目包含了一系列的*资源*,这些资源是你想要提供和控制的东西。你可以选择拥有资源很少的小型 Pulumi 项目,也可以选择包含所有你需要的资源的大型项目。随着你对 Pulumi 越来越熟悉,你想如何布局你的项目会变得更加清晰。 + +#### 堆栈 + +Pulumi [堆栈][24]stack允许你根据可配置的值来区分你的 Pulumi 项目。一个常见的用途是将一个项目部署到不同的环境,如开发或生产环境,或不同的地区,如欧洲、中东和非洲以及美国。 + +在入门时,你不大需要一个复杂的堆栈设置,所以本演练使用默认的堆栈名称 `dev`。 + +### 在 IaC 中使用 TypeScript + +你可以使用方便的 `pulumi new` 命令来初建bootstrap一个 Pulumi 项目。`new` 命令有一大堆标志和选项,可以帮助你入门 Pulumi,所以请继续创建你的第一个项目: + +``` +$ pulumi new typescript +This command will walk you through creating a new Pulumi project. + +Enter a value or leave blank to accept the (default), and press . +Press ^C at any time to quit. + +project name: (pulumi) my-first-project +project description: (A minimal TypeScript Pulumi program) My very first Pulumi program +Created project 'my-first-project' + +Please enter your desired stack name. +To create a stack in an organization, use the format / (e.g. `acmecorp/dev`). +stack name: (dev) dev +Created stack 'dev' + +Installing dependencies... + + +> node scripts/postinstall + +added 82 packages from 126 contributors and audited 82 packages in 2.84s + +13 packages are looking for funding + run `npm fund` for details + +found 0 vulnerabilities + +Finished installing dependencies + +Your new project is ready to go! ✨ + +To perform an initial deployment, run 'pulumi up' +``` + +这里发生了很多事情,我将其展开来说: + +第一部分是为你的 Pulumi 项目确定一个模板。我选择了通用的 `typescript` 选项,但是有[很多选项可供选择][25]。 + +这个 `new` 命令从你的模板库中抓取模板,并将这个文件复制到本地,包括运行时的依赖关系(在本例中是 `package.json`)。 + +`new` 命令通过在这个目录下运行 `npm install` 来安装这些依赖关系。然后 `npm install` 下载并安装运行 Pulumi 程序所需的一切,在这种情况下就是:`@pulumi/pulumi` NPM 包。 + +你已经准备好创建你的第一个资源了! + +### 创建你的第一个云资源 + +资源是一个由你的基础设施供应软件生命周期进行管理的东西。资源一般是一个云提供商对象cloud provider object,比如 S3 桶。Pulumi 的提供商处理 Pulumi 资源,提供商是具体的云提供商。Pulumi 有大约 [40 个提供商][26]可供你使用,但对于你的第一个资源,使用一个最简单的:[随机提供商][27]random provider。 + +随机提供者顾名思义:它幂等地创建一个随机资源(例如,可以是一个字符串),并将其存储在 Pulumi 状态中。 + +使用 `npm` 将其添加到你的 Pulumi 项目中作为依赖关系: + +``` +npm install @pulumi/random +``` + +npm 包管理器下载并安装随机提供者包,并为你安装。现在你已经准备好编写你的 Pulumi 程序了。 + +当你之前生成你的项目时,Pulumi 的初建过程创建了一个 `index.ts` TypeScript 文件。在你喜欢的集成开发环境(IDE)中打开它,并添加你的第一个资源: + +``` +import * as pulumi from "@pulumi/pulumi"; +import * as random from "@pulumi/random"; + +const password = new random.RandomString(`password`, { +    length: 10 +}) +``` + +如果你对 TypeScript 或 JavaScript 非常熟悉,这看起来会非常熟悉,因为它是用你熟悉的编程语言编写的。如果你使用的是 Pulumi 支持的其他语言之一,也是一样的。这里是之前的那个随机资源,但这次是用 Python 写的: + +``` +import pulumi_random as random + +password = random.RandomString("password", length=10) +``` + +一个 Pulumi 项目目前只支持单一一种语言,但每个项目都可以引用其他语言编写的项目,这对于多语言团队的成员来说是一个很有用的技巧。 + +你已经编写了第一个 Pulumi 资源。现在你需要部署它。 + +离开编辑器,回到命令行。在你的项目目录下,运行 `pulumi up`,然后看着神奇的事情发生: + +``` +pulumi up + +Previewing update (dev): +     Type                          Name                  Plan + +   pulumi:pulumi:Stack           my-first-project-dev  create + +   └─ random:index:RandomString  password              create + +Resources: +    + 2 to create + +Do you want to perform this update? yes +Updating (dev): +     Type                          Name                  Status + +   pulumi:pulumi:Stack           my-first-project-dev  created + +   └─ random:index:RandomString  password              created + +Resources: +    + 2 created + +Duration: 2s + +Permalink: file:///Users/lbriggs/.pulumi/stacks/dev.json +``` + +太好了,你有了第一个 Pulumi 资源! 虽然你可能很享受这种成就感,但不幸的是,这个随机资源并没有那么有用:它只是一个随机的字符串,你甚至看不到它是什么。先解决这部分问题。修改你之前的程序,在你创建的常量中加入 `export`: + +``` +import * as pulumi from "@pulumi/pulumi"; +import * as random from "@pulumi/random"; + +export const password = new random.RandomString(`password`, { +    length: 10 +}) +``` + +重新运行 `pulumi up`,看看输出: + +``` +pulumi up +Previewing update (dev): + Type Name Plan + pulumi:pulumi:Stack my-first-project-dev + +Outputs: + + password: { + + id : "&+r?{}J$J7" + + keepers : output + + length : 10 + + lower : true + + minLower : 0 + + minNumeric : 0 + + minSpecial : 0 + + minUpper : 0 + + number : true + + overrideSpecial: output + + result : "&+r?{}J$J7" + + special : true + + upper : true + + urn : "urn:pulumi:dev::my-first-project::random:index/randomString:RandomString::password" + } + +Resources: + 2 unchanged + +Do you want to perform this update? yes +Updating (dev): + Type Name Status + pulumi:pulumi:Stack my-first-project-dev + +Outputs: + + password: { + + id : "&+r?{}J$J7" + + length : 10 + + lower : true + + minLower : 0 + + minNumeric: 0 + + minSpecial: 0 + + minUpper : 0 + + number : true + + result : "&+r?{}J$J7" + + special : true + + upper : true + + urn : "urn:pulumi:dev::my-first-project::random:index/randomString:RandomString::password" + } + +Resources: + 2 unchanged + +Duration: 1s +Permalink: file:///Users/lbriggs/.pulumi/stacks/dev.json +``` + +现在你可以在 `Outputs` 的 `result` 部分下看到一个随机生成的字符串。你现在可以看到你创建的资源有很多属性。 + +这一切都很好,但如果你想享受 IaC,你得提供一些随机字符串以外的东西。试试吧。 + +### 部署一个容器 + +到目前为止,你已经通过安装依赖关系和注册一个简单的随机资源来 体验了初建你的 Pulumi。现在部署一些实际的基础设施,尽管是在你的本地机器上。 + +首先,将 `@pulumi/docker` 提供者添加到你的堆栈中。使用你选择的包管理器将其添加到项目中: + +``` +npm install @pulumi/docker +``` + +你已经从 `npm` 下拉了 Pulumi Docker 提供商包,这意味着你现在可以在你的项目中创建 Docker 镜像。 + +如果你的机器上还没有安装 Docker,现在是一个极好的时机去安装它。说明将取决于你的操作系统,所以看看 [Docker 的安装页面][28]了解信息。 + +再次打开你喜欢的 IDE,运行一个 Docker 容器。修改你之前的 `index.ts` 文件,让它看起来像这样: + +``` +import * as pulumi from "@pulumi/pulumi"; +import * as random from "@pulumi/random"; +import * as docker from "@pulumi/docker"; + +const password = new random.RandomString(`password`, { +    length: 10 +}) + +const container = new docker.Container(`my-password`, { +    image: 'hashicorp/http-echo', +    command: [ pulumi.interpolate`-text=Your super secret password is: ${password.result}` ], +    ports: [{ +        internal: 5678, +        external: 5678, +    }] +}) + +export const id = container.id +``` + +这将创建一个容器,创建一个 Web 服务器。Web 服务器的输出是你随机生成的字符串,在本例中是一个密码。运行这个,看看会发生什么: + +``` +pulumi up + +Previewing update (dev): + Type Name Plan + pulumi:pulumi:Stack my-first-project-dev + + └─ docker:index:Container my-password create + +Outputs: + + id : output + ~ password: { + id : "&+r?{}J$J7" + length : 10 + lower : true + minLower : 0 + minNumeric: 0 + minSpecial: 0 + minUpper : 0 + number : true + result : "&+r?{}J$J7" + special : true + upper : true + urn : "urn:pulumi:dev::my-first-project::random:index/randomString:RandomString::password" + } + +Resources: + + 1 to create + 2 unchanged + +Do you want to perform this update? yes +Updating (dev): + Type Name Status + pulumi:pulumi:Stack my-first-project-dev + + └─ docker:index:Container my-password created + +Outputs: + + id : "e73b34aeca34a64b72b61b0b9b8438637ce28853937bc359a1528ca99f49ddda" + password: { + id : "&+r?{}J$J7" + length : 10 + lower : true + minLower : 0 + minNumeric: 0 + minSpecial: 0 + minUpper : 0 + number : true + result : "&+r?{}J$J7" + special : true + upper : true + urn : "urn:pulumi:dev::my-first-project::random:index/randomString:RandomString::password" + } + +Resources: + + 1 created + 2 unchanged + +Duration: 2s +Permalink: file:///Users/lbriggs/.pulumi/stacks/dev.json +``` + +你会注意到在 `Outputs` 部分,你输出的值已经改变了,它只是一个 Docker 容器 ID。检查你的非常简单的密码生成器是否工作: + +``` +curl http://localhost:5678 +Your super secret password is: &+r?{}J$J7 +``` + +就是这样! 你刚刚用 TypeScript 配置了你的第一个基础架构。 + +#### 关于 Pulumi 输出的快速说明 + +你会注意到在创建 Docker 容器的代码中,它使用了一个特殊的 `pulumi.interpolate` 调用。如果你熟悉 TypeScript,你可能会好奇为什么需要这样做(因为它是 Pulumi 特有的)。这有一个有趣的原因。 + +当 Pulumi 创建一个资源时,直到程序执行时有一些值是 Pulumi 不知道的。在 Pulumi 中,这些值被称为 `Outputs`。这些 `Outputs` 可以在上面的代码中看到,例如,在你的第一个随机资源中,你使用 `export` 关键字来输出随机资源的属性,你还输出了你创建的容器的容器 ID。 + +因为 Pulumi 直到执行时才知道这些 `Outputs` 的值,所以在操作字符串时,它需要特殊的助手来使用它们。如果你想了解更多关于这个特殊的编程模型,请观看[这个短视频][29]。 + +### 总结 + +随着混合云基础架构中出现的复杂性,IaC 在很多方面都有了发展。在基础设施供应领域,Pulumi 是一个很好的选择,它可以使用你最喜欢的编程语言来供应你所需要的一切基础设施,然后你可以在你最喜欢的配置管理工具中进行标记,以采取下一步措施。 + +-------------------------------------------------------------------------------- + +via: https://opensource.com/article/20/8/infrastructure-as-code-pulumi + +作者:[Lee Briggs][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/lbriggs +[b]: https://github.com/lujun9972 +[1]: https://opensource.com/sites/default/files/styles/image-full-size/public/lead-images/puzzle_computer_solve_fix_tool.png?itok=U0pH1uwj (Puzzle pieces coming together to form a computer screen) +[2]: https://opensource.com/resources/devops +[3]: https://git-scm.com/ +[4]: https://www.mercurial-scm.org/ +[5]: https://opensource.com/article/18/12/configuration-management-tools +[6]: https://opensource.com/article/20/7/terraform-kubernetes +[7]: https://www.pulumi.com/ +[8]: https://developer.mozilla.org/en-US/docs/Web/JavaScript +[9]: https://www.typescriptlang.org/ +[10]: https://golang.org/ +[11]: https://www.python.org/ +[12]: https://en.wikipedia.org/wiki/C_Sharp_(programming_language) +[13]: https://www.pulumi.com/docs/intro/cloud-providers/aws/ +[14]: https://www.pulumi.com/docs/intro/cloud-providers/azure/ +[15]: https://www.pulumi.com/docs/intro/cloud-providers/gcp/ +[16]: https://www.pulumi.com/docs/reference/pkg/ +[17]: https://nodejs.org/en/download/ +[18]: https://brew.sh/ +[19]: https://opensource.com/article/20/6/homebrew-mac +[20]: https://opensource.com/article/20/6/homebrew-linux +[21]: https://www.pulumi.com/docs/get-started/install/ +[22]: https://www.pulumi.com/docs/intro/concepts/state/ +[23]: https://www.pulumi.com/docs/intro/concepts/project/ +[24]: https://www.pulumi.com/docs/intro/concepts/stack/ +[25]: https://github.com/pulumi/templates +[26]: https://www.pulumi.com/docs/intro/cloud-providers/ +[27]: https://www.pulumi.com/docs/intro/cloud-providers/random/ +[28]: https://docs.docker.com/get-docker/ +[29]: https://www.youtube.com/watch?v=lybOxul2otM diff --git a/published/202011/20200909 How to Install Ubuntu Server on a Raspberry Pi.md b/published/202011/20200909 How to Install Ubuntu Server on a Raspberry Pi.md new file mode 100644 index 0000000000..58c77ccb7f --- /dev/null +++ b/published/202011/20200909 How to Install Ubuntu Server on a Raspberry Pi.md @@ -0,0 +1,202 @@ +[#]: collector: (lujun9972) +[#]: translator: (geekpi) +[#]: reviewer: (wxy) +[#]: publisher: (wxy) +[#]: url: (https://linux.cn/article-12783-1.html) +[#]: subject: (How to Install Ubuntu Server on a Raspberry Pi) +[#]: via: (https://itsfoss.com/install-ubuntu-server-raspberry-pi/) +[#]: author: (Dimitrios Savvopoulos https://itsfoss.com/author/dimitrios/) + +如何在树莓派上安装 Ubuntu 服务器? +====== + +![][6] + +[树莓派][1]是最著名的[单板计算机][2]。最初,树莓派项目的范围旨在促进学校和发展中国家的计算机基础科学的教学。 + +它的低成本、便携性和极低的功耗,使得它的受欢迎程度远远超过预期。从气象站到家庭自动化,玩家们用树莓派搭建了许多[酷炫的项目][3]。 + +[第四代树莓派][4]具备了普通台式电脑的功能和处理能力。但本文并不是要介绍如何使用树莓派作为桌面。相反,我会告诉你如何在树莓派上安装 Ubuntu 服务器。 + +在本教程中,我将使用树莓派 4,以下是我将介绍的内容: + + * 在 microSD 卡上安装 Ubuntu 服务器 + * 在树莓派上设置无线网络连接 + * 通过 SSH 访问你的树莓派 + +![][5] + +**本教程需要以下设备**: + + * 一张 micro SD 卡(建议使用 8GB 或更大的卡) + * 一台带有 micro SD 卡读卡器的计算机(运行 Linux、Windows 或 macOS) + * 树莓派 2、3 或 4 + * 良好的互联网连接 + * 用于树莓派 2 和 3 的 HDMI 线和用于树莓派 4 的 micro HDMI 线(可选) + * 一套 USB 键盘(可选) + +### 在树莓派上安装 Ubuntu 服务器 + +在本教程中,我使用 Ubuntu 来创建树莓派 SD 卡,但你可以在其他 Linux 发行版、macOS 和 Windows 上创建它。这是因为准备 SD 卡的步骤对 Raspberry Pi Imager 工具而言是一样的。 + +Raspberry Pi Imager 工具会自动下载你[选择的树莓派系统][7]镜像。这意味着你需要一个良好的网络连接来下载 1GB 左右的数据。 + +#### 步骤 1:用 Raspberry Pi Imager 准备 SD 卡 + +确保你已将 microSD 卡插入电脑,并在电脑上安装 Raspberry Pi Imager。 + +你可以从这些链接中下载适合你操作系统的 Imager 工具: + + * [用于 Ubuntu/Debian 的 Raspberry Pi Imager][8] + * [用于 Windows 的 Raspberry Pi Imager][9] + * [用于 MacOS 的 Raspberry Pi Imager][10] + +尽管我使用的是 Ubuntu,但我不会使用上面列出的 Debian 软件包,而是使用命令行安装 snap 包。这个方法可以适用于更广泛的 Linux 发行版。 + +``` +sudo snap install rpi-imager +``` + +安装好 Raspberry Pi Imager 工具后,找到并打开它,点击 “CHOOSE OS” 菜单。 + +![][11] + +滚动菜单并点击 “Ubuntu” (“核心”和“服务器”镜像)。 + +![][12] + +从可用的镜像中,我选择了 Ubuntu 20.04 LTS 64 位。如果你有一个树莓派 2,那你只能选择 32 位镜像。 + +**重要提示:如果你使用的是最新的树莓派 4 - 8 GB 内存型号,你应该选择 64 位操作系统,否则只能使用 4 GB 内存。** + +![][13] + +从 “SD Card” 菜单中选择你的 microSD 卡,然后点击 “WRITE”。 + +![][14] + +如果它显示一些错误,请尝试再次写入它。现在它将下载 Ubuntu 服务器镜像并将其写入 micro SD 卡。 + +当这个过程完成时,它将通知你。 + +![][15] + +#### 步骤 2:在 Ubuntu 服务器上添加 WiFi 支持 + +烧录完 micro SD 卡后,你就差不多可以使用它了。在使用它之前,有一件事情你可能想做,那就是添加 Wi-Fi 支持。 + +SD 卡仍然插入读卡器中,打开文件管理器,找到卡上的 “system-boot” 分区。 + +你要找的和需要编辑的文件名为 `network-config`。 + +![][16] + +这个过程也可以在 Windows 和 MacOS 上完成。如前所述,编辑 `network-config` 文件,添加你的 Wi-Fi 凭证。 + +首先,取消矩形框内的行的注释(删除开头的标签 `#`)。 + +之后,将 `myhomewifi` 替换为你的 Wi-Fi 网络名,比如 `"itsfoss"`,将 `"S3kr1t"` 替换为 Wi-Fi 密码,用引号括起来,比如 `"12345679"`。 + +![][17] + +它可能看上去像这样: + +``` +wifis: + wlan0: + dhcp4: true + optional: true + access-points: + "your wifi name": + password: "your_wifi_password" +``` + +保存文件并将 micro SD 卡插入到你的树莓派中。在第一次启动时,如果你的树莓派无法连接到 Wi-Fi 网络,只需重启你的设备。 + +#### 步骤 3:在树莓派上使用 Ubuntu 服务器(如果你有专门的显示器、键盘和鼠标的话) + +如果你有一套额外的鼠标,键盘和显示器,你可以很容易地像其他电脑一样使用树莓派(但没有 GUI)。 + +只需将 micro SD 卡插入树莓派,连接显示器、键盘和鼠标。现在[打开你的树莓派][18]。它将出现 TTY 登录屏幕(黑色终端屏幕)并询问用户名和密码。 + + * 默认用户名:`ubuntu` + * 默认密码:`ubuntu` + +看到提示符时,用 `ubuntu` 作为密码。登录成功后,[Ubuntu 会要求你更改默认密码][19]。 + +享受你的 Ubuntu 服务器吧! + +#### 步骤 3:通过 SSH 远程连接到你的树莓派(如果你没有树莓派的显示器、键盘和鼠标的话) + +如果你没有专门与树莓派一起使用的显示器也没关系。当你可以直接通过 SSH 进入它并按照你的方式使用它时,谁还需要一个带有显示器的服务器呢? + +**在 Ubuntu 和 Mac OS**上,通常已经安装了一个 SSH 客户端。要远程连接到你的树莓派,你需要找到它的 IP 地址。检查[连接到你的网络的设备][20],看看哪个是树莓派。 + +由于我没有 Windows 机器,你可以访问[微软][21]提供的综合指南。 + +打开终端,运行以下命令: + +``` +ssh ubuntu@raspberry_pi_ip_address +``` + +你可能会看到以下信息确认连接: + +``` +Are you sure you want to continue connecting (yes/no/[fingerprint])? +``` + +输入 `yes`,然后点击回车键。 + +![][22] + +当提示时,用前面提到的 `ubuntu` 作为密码。当然,你会被要求更改密码。 + +完成后,你将自动注销,你必须使用新密码重新连接。 + +你的 Ubuntu 服务器就可以在树莓派上运行了! + +### 总结 + +在树莓派上安装 Ubuntu 服务器是一个简单的过程,而且它的预配置程度很高,使用起来很愉快。 + +我不得不说,在所有[我在树莓派上尝试的操作系统][7]中,Ubuntu 服务器是最容易安装的。我并没有夸大其词。请查看我的[在树莓派上安装 Arch Linux][23] 的指南,以供参考。 + +希望这篇指南也能帮助你在树莓派上安装 Ubuntu 服务器。如果你有问题或建议,请在评论区告诉我。 + +-------------------------------------------------------------------------------- + +via: https://itsfoss.com/install-ubuntu-server-raspberry-pi/ + +作者:[Dimitrios Savvopoulos][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/dimitrios/ +[b]: https://github.com/lujun9972 +[1]: https://www.raspberrypi.org/ +[2]: https://itsfoss.com/raspberry-pi-alternatives/ +[3]: https://itsfoss.com/raspberry-pi-projects/ +[4]: https://itsfoss.com/raspberry-pi-4/ +[5]: https://i2.wp.com/itsfoss.com/wp-content/uploads/2020/09/Ubuntu-Server-20.04.1-LTS-aarch64.png?resize=800%2C600&ssl=1 +[6]: https://i1.wp.com/itsfoss.com/wp-content/uploads/2020/09/ubuntu-server-raspberry-pi.png?resize=800%2C450&ssl=1 +[7]: https://itsfoss.com/raspberry-pi-os/ +[8]: https://downloads.raspberrypi.org/imager/imager_amd64.deb +[9]: https://downloads.raspberrypi.org/imager/imager.exe +[10]: https://downloads.raspberrypi.org/imager/imager.dmg +[11]: https://i0.wp.com/itsfoss.com/wp-content/uploads/2020/09/raspberry-pi-imager.png?resize=800%2C600&ssl=1 +[12]: https://i1.wp.com/itsfoss.com/wp-content/uploads/2020/09/raspberry-pi-imager-choose-ubuntu.png?resize=800%2C600&ssl=1 +[13]: https://i0.wp.com/itsfoss.com/wp-content/uploads/2020/09/raspberry-pi-imager-ubuntu-server.png?resize=800%2C600&ssl=1 +[14]: https://i1.wp.com/itsfoss.com/wp-content/uploads/2020/09/raspberry-pi-imager-sd-card.png?resize=800%2C600&ssl=1 +[15]: https://i0.wp.com/itsfoss.com/wp-content/uploads/2020/09/ubuntu-server-installed-raspberry-pi.png?resize=799%2C506&ssl=1 +[16]: https://i0.wp.com/itsfoss.com/wp-content/uploads/2020/09/ubuntu-server-pi-network-config.png?resize=800%2C565&ssl=1 +[17]: https://i0.wp.com/itsfoss.com/wp-content/uploads/2020/09/Ubuntu-server-wifi.png?resize=800%2C600&ssl=1 +[18]: https://itsfoss.com/turn-on-raspberry-pi/ +[19]: https://itsfoss.com/change-password-ubuntu/ +[20]: https://itsfoss.com/how-to-find-what-devices-are-connected-to-network-in-ubuntu/ +[21]: https://docs.microsoft.com/en-us/windows-server/administration/openssh/openssh_install_firstuse +[22]: https://i1.wp.com/itsfoss.com/wp-content/uploads/2020/09/ubuntu-server-change-password.png?resize=800%2C600&ssl=1 +[23]: https://itsfoss.com/install-arch-raspberry-pi/ diff --git a/published/202011/20200918 Add throwing mechanics to your Python game.md b/published/202011/20200918 Add throwing mechanics to your Python game.md new file mode 100644 index 0000000000..b9540d8444 --- /dev/null +++ b/published/202011/20200918 Add throwing mechanics to your Python game.md @@ -0,0 +1,665 @@ +[#]: collector: (lujun9972) +[#]: translator: (robsean) +[#]: reviewer: (wxy) +[#]: publisher: (wxy) +[#]: url: (https://linux.cn/article-12872-1.html) +[#]: subject: (Add throwing mechanics to your Python game) +[#]: via: (https://opensource.com/article/20/9/add-throwing-python-game) +[#]: author: (Seth Kenlon https://opensource.com/users/seth) + +在你的 Python 游戏中添加投掷机制 +====== + +> 四处奔跑躲避敌人是一回事,反击敌人是另一回事。学习如何在这系列的第十二篇文章中在 Pygame 中创建平台游戏。 + +![](https://img.linux.net.cn/data/attachment/album/202011/30/124457xcj9mztw9kx9c7zj.jpg) + +这是仍在进行中的关于使用 [Pygame][3] 模块在 [Python 3][2] 中创建电脑游戏的第十二部分。先前的文章是: + + 1. [通过构建一个简单的掷骰子游戏去学习怎么用 Python 编程][4] + 2. [使用 Python 和 Pygame 模块构建一个游戏框架][5] + 3. [如何在你的 Python 游戏中添加一个玩家][6] + 4. [用 Pygame 使你的游戏角色移动起来][7] + 5. [如何向你的 Python 游戏中添加一个敌人][8] + 6. [在 Pygame 游戏中放置平台][9] + 7. [在你的 Python 游戏中模拟引力][10] + 8. [为你的 Python 平台类游戏添加跳跃功能][11] + 9. [使你的 Python 游戏玩家能够向前和向后跑][12] + 10. [在你的 Python 平台类游戏中放一些奖励][13] + 11. [添加计分到你的 Python 游戏][14] + +我的上一篇文章本来是这一系列文章的最后一篇,它鼓励你为这个游戏编写自己的附加程序。你们很多人都这么做了!我收到了一些电子邮件,要求帮助我还没有涵盖的常用机制:战斗。毕竟,跳起来躲避坏人是一回事,但是有时候让他们走开是一件非常令人满意的事。在电脑游戏中向你的敌人投掷一些物品是很常见的,不管是一个火球、一支箭、一道闪电,还是其它适合游戏的东西。 + +与迄今为止你在这个系列中为你的平台游戏编程的任何东西不同,可投掷物品有一个*生存时间*。在你投掷一个物品后,它会如期在移动一段距离后消失。如果它是一支箭或其它类似的东西,它可能会在通过屏幕的边缘时而消失。如果它是一个火球或一道闪电,它可能会在一段时间后熄灭。 + +这意味着每次生成一个可投掷的物品时,也必须生成一个独特的衡量其生存时间的标准。为了介绍这个概念,这篇文章演示如何一次只投掷一个物品。(换句话说,每次仅存在一个投掷物品)。 一方面,这是一个游戏的限制条件,但另一方面,它却是游戏本身的运行机制。你的玩家不能每次同时投掷 50 个火球,因为每次仅允许一个投掷物品,所以当你的玩家释放一个火球来尝试击中一名敌人就成为了一项挑战。而在幕后,这也使你的代码保持简单。 + +如果你想启用每次投掷多个项目,在完成这篇教程后,通过学习这篇教程所获取的知识来挑战你自己。 + +### 创建 Throwable 类 + +如果你跟随学习这系列的其它文章,那么你应该熟悉在屏幕上生成一个新的对象基础的 `__init__` 函数。这和你用来生成你的 [玩家][6] 和 [敌人][8] 的函数是一样的。这里是生成一个 `throwable` 对象的 `__init__` 函数来: + +``` +class Throwable(pygame.sprite.Sprite): + """ + 生成一个 throwable 对象 + """ + def __init__(self, x, y, img, throw): + pygame.sprite.Sprite.__init__(self) + self.image = pygame.image.load(os.path.join('images',img)) + self.image.convert_alpha() + self.image.set_colorkey(ALPHA) + self.rect = self.image.get_rect() + self.rect.x = x + self.rect.y = y + self.firing = throw +``` + +同你的 `Player` 类或 `Enemy` 类的 `__init__` 函数相比,这个函数的主要区别是,它有一个 `self.firing` 变量。这个变量保持跟踪一个投掷的物品是否在当前屏幕上活动,因此当一个 `throwable` 对象创建时,将变量设置为 `1` 的合乎情理的。 + +### 判断存活时间 + +接下来,就像使用 `Player` 和 `Enemy` 一样,你需要一个 `update` 函数,以便投掷的物品在瞄准敌人抛向空中时,它会自己移动。 + +测定一个投掷的物品存活时间的最简单方法是侦测它何时离开屏幕。你需要监视的屏幕边缘取决于你投掷的物品的物理特性。 + + * 如果你的玩家正在投掷的物品是沿着水平轴快速移动的,像一只弩箭或箭或一股非常快的魔法力量,而你想监视你游戏屏幕的水平轴极限。这可以通过 `worldx` 定义。 + * 如果你的玩家正在投掷的物品是沿着垂直方向或同时沿着水平方向和垂直方向移动的,那么你必须监视你游戏屏幕的垂直轴极限。这可以通过 `worldy` 定义。 + +这个示例假设你投掷的物品向前移动一点并最终落到地面上。不过,投掷的物品不会从地面上反弹起来,而是继续掉落出屏幕。你可以尝试不同的设置来看看什么最适合你的游戏: + +``` + def update(self,worldy): + ''' + 投掷物理学 + ''' + if self.rect.y < worldy: #垂直轴 + self.rect.x += 15 #它向前移动的速度有多快 + self.rect.y += 5 #它掉落的速度有多快 + else: + self.kill() #移除投掷对象 + self.firing = 0 #解除火力发射 +``` + +为使你的投掷物品移动地更快,增加 `self.rect` 的动量值。 + +如果投掷物品不在屏幕上,那么该物品将被销毁,以及释放其所占用的寄存器。另外,`self.firing` 将被设置回 `0` 以允许你的玩家来进行另一次射击。 + +### 设置你的投掷对象 + +就像使用你的玩家和敌人一样,你必须在你的设置部分中创建一个精灵组来保持投掷对象。 + +此外,你必须创建一个非活动的投掷对象来供开始的游戏使用。如果在游戏开始时却没有一个投掷对象,那么玩家在第一次尝试投掷一柄武器时,投掷将失败。 + +这个示例假设你的玩家使用一个火球作为开始的武器,因此,每一个投掷实例都是由 `fire` 变量指派的。在后面的关卡中,当玩家获取新的技能时,你可以使用相同的 `Throwable` 类来引入一个新的变量以使用一张不同的图像。 + +在这代码块中,前两行已经在你的代码中,因此不要重新键入它们: + +``` +player_list = pygame.sprite.Group() #上下文 +player_list.add(player) #上下文 +fire = Throwable(player.rect.x,player.rect.y,'fire.png',0) +firepower = pygame.sprite.Group() +``` + +注意,每一个投掷对象的起始位置都是和玩家所在的位置相同。这使得它看起来像是投掷对象来自玩家。在第一个火球生成时,使用 `0` 来显示 `self.firing` 是可用的。 + +### 在主循环中获取投掷行为 + +没有在主循环中出现的代码不会在游戏中使用,因此你需要在你的主循环中添加一些东西,以便能在你的游戏世界中获取投掷对象。 + +首先,添加玩家控制。当前,你没有火力触发器。在键盘上的按键是有两种状态的:释放的按键,按下的按键。为了移动,你要使用这两种状态:按下按键来启动玩家移动,释放按键来停止玩家移动。开火仅需要一个信号。你使用哪个按键事件(按键按下或按键释放)来触发你的投掷对象取决于你的品味。 + +在这个代码语句块中,前两行是用于上下文的: + +``` + if event.key == pygame.K_UP or event.key == ord('w'): + player.jump(platform_list) + if event.key == pygame.K_SPACE: + if not fire.firing: + fire = Throwable(player.rect.x,player.rect.y,'fire.png',1) + firepower.add(fire) +``` + +与你在设置部分创建的火球不同,你使用一个 `1` 来设置 `self.firing` 为不可用。 + +最后,你必须更新和绘制你的投掷物品。这个顺序很重要,因此把这段代码放置到你现有的 `enemy.move` 和 `player_list.draw` 的代码行之间: + +``` + enemy.move() # 上下文 + + if fire.firing: + fire.update(worldy) + firepower.draw(world) + player_list.draw(screen) # 上下文 + enemy_list.draw(screen) # 上下文 +``` + +注意,这些更新仅在 `self.firing` 变量被设置为 1 时执行。如果它被设置为 0 ,那么 `fire.firing` 就不为 `true`,接下来就跳过更新。如果你尝试做上述这些更新,不管怎样,你的游戏都会崩溃,因为在游戏中将不会更新或绘制一个 `fire` 对象。 + +启动你的游戏,尝试挑战你的武器。 + +### 检测碰撞 + +如果你玩使用了新投掷技巧的游戏,你可能会注意到,你可以投掷对象,但是它却不会对你的敌人有任何影响。 + +原因是你的敌人没有被查到碰撞事故。一名敌人可能会被你的投掷物品所击中,但是敌人却从来不知道被击中了。 + +你已经在你的 `Player` 类中完成了碰撞检测,这非常类似。在你的 `Enemy` 类中,添加一个新的 `update` 函数: + +``` + def update(self,firepower, enemy_list): + """ + 检测火力碰撞 + """ + fire_hit_list = pygame.sprite.spritecollide(self,firepower,False) + for fire in fire_hit_list: + enemy_list.remove(self) +``` + +代码很简单。每个敌人对象都检查并看看它自己是否被 `firepower` 精灵组的成员所击中。如果它被击中,那么敌人就会从敌人组中移除和消失。 + +为集成这些功能到你的游戏之中,在主循环中调用位于新触发语句块中的函数: + +``` + if fire.firing: # 上下文 + fire.update(worldy) # 上下文 + firepower.draw(screen) # 上下文 + enemy_list.update(firepower,enemy_list) # 更新敌人 +``` + +你现在可以尝试一下你的游戏了,大多数的事情都如预期般的那样工作。不过,这里仍然有一个问题,那就是投掷的方向。 + +### 更改投掷机制的方向 + +当前,你英雄的火球只会向右移动。这是因为 `Throwable` 类的 `update` 函数将像素添加到火球的位置,在 Pygame 中,在 X 轴上一个较大的数字意味着向屏幕的右侧移动。当你的英雄转向另一个方向时,你可能希望它投掷的火球也抛向左侧。 + +到目前为止,你已经知道如何实现这一点,至少在技术上是这样的。然而,最简单的解决方案却是使用一个变量,在一定程度上对你来说可能是一种新的方法。一般来说,你可以“设置一个标记”(有时也被称为“翻转一个位”)来标明你的英雄所面向的方向。在你做完后,你就可以检查这个变量来得知火球是向左移动还是向右移动。 + +首先,在你的 `Player` 类中创建一个新的变量来代表你的游戏所面向的方向。因为我的游戏天然地面向右侧,由此我把面向右侧作为默认值: + +``` + self.score = 0 + self.facing_right = True # 添加这行 + self.is_jumping = True +``` + +当这个变量是 `True` 时,你的英雄精灵是面向右侧的。当玩家每次更改英雄的方向时,变量也必须重新设置,因此,在你的主循环中相关的 `keyup` 事件中这样做: + +``` + if event.type == pygame.KEYUP: + if event.key == pygame.K_LEFT or event.key == ord('a'): + player.control(steps, 0) + player.facing_right = False # 添加这行 + if event.key == pygame.K_RIGHT or event.key == ord('d'): + player.control(-steps, 0) + player.facing_right = True # 添加这行 +``` + +最后,更改你的 `Throwable` 类的 `update` 函数,以检测英雄是否面向右侧,并恰当地添加或减去来自火球位置的像素: + +``` + if self.rect.y < worldy: + if player.facing_right: + self.rect.x += 15 + else: + self.rect.x -= 15 + self.rect.y += 5 +``` + +再次尝试你的游戏,清除掉你游戏世界中的一些坏人。 + +![Python 平台类使用投掷能力][15] + +作为一项额外的挑战,当彻底打败敌人时,尝试增加你玩家的得分。 + +### 完整的代码 + +``` +#!/usr/bin/env python3 +# 作者: Seth Kenlon + +# GPLv3 +# This program is free software: you can redistribute it and/or +# modify it under the terms of the GNU General Public License as +# published by the Free Software Foundation, either version 3 of the +# License, or (at your option) any later version. +# +# This program is distributed in the hope that it will be useful, but +# WITHOUT ANY WARRANTY; without even the implied warranty of +# MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the GNU +# General Public License for more details. +# +# You should have received a copy of the GNU General Public License +# along with this program. If not, see <[http://www.gnu.org/licenses/>][17]. + +import pygame +import pygame.freetype +import sys +import os + +''' +变量 +''' + +worldx = 960 +worldy = 720 +fps = 40 +ani = 4 +world = pygame.display.set_mode([worldx, worldy]) +forwardx = 600 +backwardx = 120 + +BLUE = (80, 80, 155) +BLACK = (23, 23, 23) +WHITE = (254, 254, 254) +ALPHA = (0, 255, 0) + +tx = 64 +ty = 64 + +font_path = os.path.join(os.path.dirname(os.path.realpath(__file__)), "fonts", "amazdoom.ttf") +font_size = tx +pygame.freetype.init() +myfont = pygame.freetype.Font(font_path, font_size) + +''' +对象 +''' + +def stats(score, health): + myfont.render_to(world, (4, 4), "Score:"+str(score), BLUE, None, size=64) + myfont.render_to(world, (4, 72), "Health:"+str(health), BLUE, None, size=64) + +class Throwable(pygame.sprite.Sprite): + """ + 生成一个投掷的对象 + """ + def __init__(self, x, y, img, throw): + pygame.sprite.Sprite.__init__(self) + self.image = pygame.image.load(os.path.join('images', img)) + self.image.convert_alpha() + self.image.set_colorkey(ALPHA) + self.rect = self.image.get_rect() + self.rect.x = x + self.rect.y = y + self.firing = throw + + def update(self, worldy): + ''' + 投掷物理学 + ''' + if self.rect.y < worldy: + if player.facing_right: + self.rect.x += 15 + else: + self.rect.x -= 15 + self.rect.y += 5 + else: + self.kill() + self.firing = 0 + +# x 位置, y 位置, img 宽度, img 高度, img 文件 +class Platform(pygame.sprite.Sprite): + def __init__(self, xloc, yloc, imgw, imgh, img): + pygame.sprite.Sprite.__init__(self) + self.image = pygame.image.load(os.path.join('images', img)).convert() + self.image.convert_alpha() + self.image.set_colorkey(ALPHA) + self.rect = self.image.get_rect() + self.rect.y = yloc + self.rect.x = xloc + +class Player(pygame.sprite.Sprite): + """ + 生成一名玩家 + """ + + def __init__(self): + pygame.sprite.Sprite.__init__(self) + self.movex = 0 + self.movey = 0 + self.frame = 0 + self.health = 10 + self.damage = 0 + self.score = 0 + self.facing_right = True + self.is_jumping = True + self.is_falling = True + self.images = [] + for i in range(1, 5): + img = pygame.image.load(os.path.join('images', 'walk' + str(i) + '.png')).convert() + img.convert_alpha() + img.set_colorkey(ALPHA) + self.images.append(img) + self.image = self.images[0] + self.rect = self.image.get_rect() + + def gravity(self): + if self.is_jumping: + self.movey += 3.2 + + def control(self, x, y): + """ + 控制玩家移动 + """ + self.movex += x + + def jump(self): + if self.is_jumping is False: + self.is_falling = False + self.is_jumping = True + + def update(self): + """ + 更新精灵位置 + """ + + # 向左移动 + if self.movex < 0: + self.is_jumping = True + self.frame += 1 + if self.frame > 3 * ani: + self.frame = 0 + self.image = pygame.transform.flip(self.images[self.frame // ani], True, False) + + # 向右移动 + if self.movex > 0: + self.is_jumping = True + self.frame += 1 + if self.frame > 3 * ani: + self.frame = 0 + self.image = self.images[self.frame // ani] + + # 碰撞 + enemy_hit_list = pygame.sprite.spritecollide(self, enemy_list, False) + if self.damage == 0: + for enemy in enemy_hit_list: + if not self.rect.contains(enemy): + self.damage = self.rect.colliderect(enemy) + if self.damage == 1: + idx = self.rect.collidelist(enemy_hit_list) + if idx == -1: + self.damage = 0 # 设置伤害回 0 + self.health -= 1 # 减去 1 单位健康度 + + ground_hit_list = pygame.sprite.spritecollide(self, ground_list, False) + for g in ground_hit_list: + self.movey = 0 + self.rect.bottom = g.rect.top + self.is_jumping = False # 停止跳跃 + + # 掉落世界 + if self.rect.y > worldy: + self.health -=1 + print(self.health) + self.rect.x = tx + self.rect.y = ty + + plat_hit_list = pygame.sprite.spritecollide(self, plat_list, False) + for p in plat_hit_list: + self.is_jumping = False # 停止跳跃 + self.movey = 0 + if self.rect.bottom <= p.rect.bottom: + self.rect.bottom = p.rect.top + else: + self.movey += 3.2 + + if self.is_jumping and self.is_falling is False: + self.is_falling = True + self.movey -= 33 # 跳跃多高 + + loot_hit_list = pygame.sprite.spritecollide(self, loot_list, False) + for loot in loot_hit_list: + loot_list.remove(loot) + self.score += 1 + print(self.score) + + plat_hit_list = pygame.sprite.spritecollide(self, plat_list, False) + + self.rect.x += self.movex + self.rect.y += self.movey + +class Enemy(pygame.sprite.Sprite): + """ + 生成一名敌人 + """ + + def __init__(self, x, y, img): + pygame.sprite.Sprite.__init__(self) + self.image = pygame.image.load(os.path.join('images', img)) + self.image.convert_alpha() + self.image.set_colorkey(ALPHA) + self.rect = self.image.get_rect() + self.rect.x = x + self.rect.y = y + self.counter = 0 + + def move(self): + """ + 敌人移动 + """ + distance = 80 + speed = 8 + + if self.counter >= 0 and self.counter <= distance: + self.rect.x += speed + elif self.counter >= distance and self.counter <= distance * 2: + self.rect.x -= speed + else: + self.counter = 0 + + self.counter += 1 + + def update(self, firepower, enemy_list): + """ + 检测火力碰撞 + """ + fire_hit_list = pygame.sprite.spritecollide(self, firepower, False) + for fire in fire_hit_list: + enemy_list.remove(self) + +class Level: + def ground(lvl, gloc, tx, ty): + ground_list = pygame.sprite.Group() + i = 0 + if lvl == 1: + while i < len(gloc): + ground = Platform(gloc[i], worldy - ty, tx, ty, 'tile-ground.png') + ground_list.add(ground) + i = i + 1 + + if lvl == 2: + print("Level " + str(lvl)) + + return ground_list + + def bad(lvl, eloc): + if lvl == 1: + enemy = Enemy(eloc[0], eloc[1], 'enemy.png') + enemy_list = pygame.sprite.Group() + enemy_list.add(enemy) + if lvl == 2: + print("Level " + str(lvl)) + + return enemy_list + + # x 位置, y 位置, img 宽度, img 高度, img 文件 + def platform(lvl, tx, ty): + plat_list = pygame.sprite.Group() + ploc = [] + i = 0 + if lvl == 1: + ploc.append((200, worldy - ty - 128, 3)) + ploc.append((300, worldy - ty - 256, 3)) + ploc.append((550, worldy - ty - 128, 4)) + while i < len(ploc): + j = 0 + while j <= ploc[i][2]: + plat = Platform((ploc[i][0] + (j * tx)), ploc[i][1], tx, ty, 'tile.png') + plat_list.add(plat) + j = j + 1 + print('run' + str(i) + str(ploc[i])) + i = i + 1 + + if lvl == 2: + print("Level " + str(lvl)) + + return plat_list + + def loot(lvl): + if lvl == 1: + loot_list = pygame.sprite.Group() + loot = Platform(tx*5, ty*5, tx, ty, 'loot_1.png') + loot_list.add(loot) + + if lvl == 2: + print(lvl) + + return loot_list + +''' +Setup 部分 +''' + +backdrop = pygame.image.load(os.path.join('images', 'stage.png')) +clock = pygame.time.Clock() +pygame.init() +backdropbox = world.get_rect() +main = True + +player = Player() # 生成玩家 +player.rect.x = 0 # 转到 x +player.rect.y = 30 # 转到 y +player_list = pygame.sprite.Group() +player_list.add(player) +steps = 10 +fire = Throwable(player.rect.x, player.rect.y, 'fire.png', 0) +firepower = pygame.sprite.Group() + +eloc = [] +eloc = [300, worldy-ty-80] +enemy_list = Level.bad(1, eloc) +gloc = [] + +i = 0 +while i <= (worldx / tx) + tx: + gloc.append(i * tx) + i = i + 1 + +ground_list = Level.ground(1, gloc, tx, ty) +plat_list = Level.platform(1, tx, ty) +enemy_list = Level.bad( 1, eloc ) +loot_list = Level.loot(1) + +''' +主循环 +''' + +while main: + for event in pygame.event.get(): + if event.type == pygame.QUIT: + pygame.quit() + try: + sys.exit() + finally: + main = False + + if event.type == pygame.KEYDOWN: + if event.key == ord('q'): + pygame.quit() + try: + sys.exit() + finally: + main = False + if event.key == pygame.K_LEFT or event.key == ord('a'): + player.control(-steps, 0) + if event.key == pygame.K_RIGHT or event.key == ord('d'): + player.control(steps, 0) + if event.key == pygame.K_UP or event.key == ord('w'): + player.jump() + + if event.type == pygame.KEYUP: + if event.key == pygame.K_LEFT or event.key == ord('a'): + player.control(steps, 0) + player.facing_right = False + if event.key == pygame.K_RIGHT or event.key == ord('d'): + player.control(-steps, 0) + player.facing_right = True + if event.key == pygame.K_SPACE: + if not fire.firing: + fire = Throwable(player.rect.x, player.rect.y, 'fire.png', 1) + firepower.add(fire) + + # 向向滚动世界 + if player.rect.x >= forwardx: + scroll = player.rect.x - forwardx + player.rect.x = forwardx + for p in plat_list: + p.rect.x -= scroll + for e in enemy_list: + e.rect.x -= scroll + for l in loot_list: + l.rect.x -= scroll + + # 向后滚动世界 + if player.rect.x <= backwardx: + scroll = backwardx - player.rect.x + player.rect.x = backwardx + for p in plat_list: + p.rect.x += scroll + for e in enemy_list: + e.rect.x += scroll + for l in loot_list: + l.rect.x += scroll + + world.blit(backdrop, backdropbox) + player.update() + player.gravity() + player_list.draw(world) + if fire.firing: + fire.update(worldy) + firepower.draw(world) + enemy_list.draw(world) + enemy_list.update(firepower, enemy_list) + loot_list.draw(world) + ground_list.draw(world) + plat_list.draw(world) + for e in enemy_list: + e.move() + stats(player.score, player.health) + pygame.display.flip() + clock.tick(fps) +``` + +-------------------------------------------------------------------------------- + +via: https://opensource.com/article/20/9/add-throwing-python-game + +作者:[Seth Kenlon][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://opensource.com/users/seth +[b]: https://github.com/lujun9972 +[1]: https://opensource.com/sites/default/files/styles/image-full-size/public/lead-images/game_pawn_grid_linux.png?itok=4gERzRkg (Gaming on a grid with penguin pawns) +[2]: https://www.python.org/ +[3]: https://www.pygame.org/news +[4]: https://linux.cn/article-9071-1.html +[5]: https://linux.cn/article-10850-1.html +[6]: https://linux.cn/article-10858-1.html +[7]: https://linux.cn/article-10874-1.html +[8]: https://linux.cn/article-10883-1.html +[9]: https://linux.cn/article-10902-1.html +[10]: https://linux.cn/article-11780-1.html +[11]: https://linux.cn/article-11790-1.html +[12]: https://linux.cn/article-11819-1.html +[13]: https://linux.cn/article-11828-1.html +[14]: https://linux.cn/article-11839-1.html +[15]: https://opensource.com/sites/default/files/uploads/pygame-throw.jpg (Python platformer with throwing capability) +[16]: https://creativecommons.org/licenses/by-sa/4.0/ +[17]: http://www.gnu.org/licenses/\> diff --git a/published/202011/20200922 Easily set image transparency using GIMP.md b/published/202011/20200922 Easily set image transparency using GIMP.md new file mode 100644 index 0000000000..435c5e3b37 --- /dev/null +++ b/published/202011/20200922 Easily set image transparency using GIMP.md @@ -0,0 +1,136 @@ +[#]: collector: (lujun9972) +[#]: translator: (robsean) +[#]: reviewer: (wxy) +[#]: publisher: (wxy) +[#]: url: (https://linux.cn/article-12874-1.html) +[#]: subject: (Easily set image transparency using GIMP) +[#]: via: (https://opensource.com/article/20/9/chroma-key-gimp) +[#]: author: (Seth Kenlon https://opensource.com/users/seth) + +使用 GIMP 轻松地设置图片透明度 +====== + +> 使用色键(绿屏)技巧来设置你电脑游戏中图片的透明度。 + +![](https://img.linux.net.cn/data/attachment/album/202011/30/223815rdmrgx1109ngng0g.jpg) + +不管你是否正在使用 [Python][2] 或 [Lua][3] 编程一个游戏或一个 APP,你都有可能在你的游戏资源中使用 PNG 图像。PNG 格式图像的一个优点是能够存储一个 **alpha 通道**,这在一个 JPEG 格式的图像中是不可能获得的。alpha 在本质上是不可见的或透明的“颜色”。alpha 是你图像 _不可见_ 的一部分。例如,你要绘制一个甜甜圈,甜甜圈的空洞将使用 alpha 填充,你就可以看到它后面的任何东西。 + +一个常见的问题是如何找到一幅图像的 alpha 部分。有时你的编程框架,不管它是 [Python Arcade][4]、[Pygame][5]、LÖVE,或者其它的任何东西都会检测出 alpha 通道,(在适当地调用函数后)将其作为透明处理。这意味着它将不会在 alpha 部分来渲染新的像素,而留下甜甜圈的空洞。100% 是透明的,0% 是不透明的,在功能上起到“不可见”的作用。 + +有些时候,你的框架与你的图像资源在 alpha 通道的位置上是不一致的(或者,alpha 通道根本就不存在),你在你想要透明度的地方却得到像素。 + +这篇文章描述了我所知道的最可靠的方法来解决透明度的问题。 + +### 色键 + +在计算机图形学中,有一些有助于确定每一个像素是如何渲染的值。色度Chrominance(或者 chroma),描述一个像素的饱和度或强度。色键chroma key技术(也称为绿屏green screening)最初是作为一种化学工艺而发展起来的,在复印一张底片时,使用一种特定的 **无光泽** 的颜色(最初是蓝色,后来是绿色)来故意遮掩,以允许使用另一幅图像来取代曾经有蓝色或绿色屏幕的地方。这是一种简化的解释,但是它说明了计算机图形学中被称为 alpha 通道的起源。 + +alpha 通道是保存在图像中的信息,用以标识要透明的像素。例如,RGB 图像有红、绿、蓝通道。RGBA 图像包含红、绿、蓝通道,以及 alpha 通道。alpha 值的范围可以从 0 到 1 ,使用小数是也有效的。 + +因为一个 alpha 通道可以用几种不同的方法表达,因此依赖于嵌入的 alpha 通道可能是有问题的。作为替代方案,你可以在你的游戏框架中选择一种颜色并将其转化为一个 0 的 alpha 值。要做到这一点,你必须知道在你图像中的颜色值。 + +### 准备你的图片 + +要准备一个专门为色度键保留明确颜色的图形,在你最喜欢的图片编辑器中打开图片。我建议使用 [GIMP][6] 或 [Glimpse][7],但是 [mtPaint][8] 或 [Pinta][9],甚至 [Inkscape][10] 也能很好地工作,这取决于你的图像的性质,以及你将这些操作指南转换到一种不同图片编辑器工具的能力。 + +首先打开这幅 Tux 企鹅的图像: + +![Tux 企鹅][11] + +### 选择图片 + +在图片打开后,转到 **窗口** 菜单,选择 **可停靠对话框** ,接下来选择 **图层**。在 **图层** 面板中 Tux 图层上右击。从弹出菜单中,选择 **Alpha 到选区** 。如果你的图像没有内置的 alpha 通道,那么你必须手动创建你自己的选区。 + +![Alpha 到选区][13] + +为手动创建一个选区,单击来自工具箱的 **路径** 工具。 + +![GIMP 的路径工具][14] + +使用 **路径** 工具,在图像周围移动鼠标,在其轮廓的每个主要交叉点处都单击和释放(不要拖动)。 不要担心沿着曲线走;只需要找到主要的交叉点和拐角。这将在每个点处创建一个节点,并在节点中间绘制一条条线段。你不需要闭合你的路径,因此当你最后到达你开始时的交叉点时,你就完成了。 + +![在 GIMP 中创建一个路径][15] + +在你创建你的轮廓路径后,转到 **窗口** 菜单,选择 **可停靠对话框** ,接下来选择 **工具选项** 。在 **工具选项** 面板中,选择 **编辑 (Ctrl)** 。随着这项操作的激活,你可以编辑你刚刚通过单击线或单击节点绘制的路径,并通过调整它们来更好地适应你的图像。你甚至能够将直线弯曲。 + +![编辑路径][16] + +现在从 **窗口 > 可停靠对话框** 菜单中选择 **路径** 面板。在 **路径** 面板中,单击 **路径到选区** 按钮。你的绘图现在已经被选中了。 + +### 扩大选区 + +如果你觉得你的选区太紧贴了,你可以通过扩大来给予你自己的选区一些富余。当我想在一张图像周围采用或加厚一个边框时,我有时会这么扩大选区。 + +为扩大一个选区,单击 **选择** 菜单,选择 **扩大** 。输入一个像素值并单击 **确定** 。 + +### 反转选区 + +你已经选择了你的图形,但是你真正想选择的东西却 _不包括_ 你所选择的图像。这是因为你要创建一个 alpha 蒙版来定义图像中的一些内容的来被其它一些内容所替换。换句话说,你需要标记那些将被转变为不可见的像素。 + +为了反转选择区,单击 **选择** 菜单,选择 **反转** 。现在除你的图像以外的一切东西都是被选择的。 + +### 使用 alpha 填充 + +随着选择了除了你的图像以外的一切东西,再选择你想使用的颜色来指定你的 alpha 蒙版。最常用的颜色是绿色(正如你可能从术语“绿屏”中所猜到的一样)。绿色不是什么神奇的颜色,甚至也不是特定的绿色色调。之所以使用它是因为人们经常处理不包含绿色色素的图像,这样人们能够很容易分离出绿色,而不会意外地分离出图像中重要的部分。当然,如果你的图像是一位绿色的外星人或一枚绿宝石或一些 _确实_ 包含绿色的东西,那么你应该使用一种不同的颜色。只要你所选择的颜色是单一的单色,那么你就可以使用你所希望的任意颜色。如果你正在处理很多图像,你的选择应该在所有图像中保持一致。 + +![在工具箱中的前景色][17] + +使用你选择的颜色值来设置你的前景色。为确保你的选择是精确的,使用 [HTML][18] 或 [HSV][19] 表示的颜色。例如,如果你正在使用纯绿色,它可以在 GIMP(以及大多数的开放源码图像应用程序)中表示为 `00ff00`(`00` 是红色,`FF` 是绿色,`00` 是蓝色,`F` 是最大值)。 + +![设置颜色值][20] + +不管你选择什么颜色,务必记录下 HTML 或 HSV 的值,以便你可以为每一张图像使用完全相同的颜色。 + +为填充你的 alpha 蒙版,单击 **编辑** 菜单,选择 **使用前景色填充** 。 + +### 平整和导出 + +如果你在你的图像周围留下边框,设置背景颜色来着色你想使用的边界笔刷。这通常是黑色或白色,但是它也可以是任何适宜你游戏审美观的颜色。 + +在你设置背景颜色后,单击 **图像** 菜单,选择 **平整图像**。不管你是否添加了边框,这样做都是安全的。这个过程将从图像中移除 alpha 通道,并使用背景色填充任何“透明的”像素。 + +![平整图像][21] + +你现在已经为你的游戏引擎准备好了一张图像。导出图像为你的游戏引擎喜欢的任何格式,接下来使用游戏引擎所需要的每一个函数来将图像导入的你的游戏中。在的代码中,设置 alpha 值为 `00ff00`(或你使用的任何颜色),接下来使用游戏引擎的图像转换器来将该颜色作为 alpha 通道处理。 + +### 其它的方法 + +这不是唯一能在你游戏图像中获取透明度的方法。查看你游戏引擎的文档来找出它是如何默认尝试处理 alpha 通道的,在你不确定的时候,尝试让你的游戏引擎来自动侦测图像中透明度,然后再去编辑它。有时,你游戏引擎的预期值和你图像的预设值恰巧匹配,那么你就可以直接获取透明度,而不需要做任何额外的工作。 + +不过,当这些尝试都失败时,尝试一下色键。它为电影业工作了将近 100 年,它也可以为你工作。 + +-------------------------------------------------------------------------------- + +via: https://opensource.com/article/20/9/chroma-key-gimp + +作者:[Seth Kenlon][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://opensource.com/users/seth +[b]: https://github.com/lujun9972 +[1]: https://opensource.com/sites/default/files/styles/image-full-size/public/lead-images/gaming_grid_penguin.png?itok=7Fv83mHR (Gaming with penguin pawns) +[2]: https://opensource.com/article/17/10/python-101 +[3]: https://opensource.com/article/17/4/how-program-games-raspberry-pi +[4]: https://opensource.com/article/18/4/easy-2d-game-creation-python-and-arcade +[5]: https://opensource.com/article/17/12/game-framework-python +[6]: http://gimp.org +[7]: https://glimpse-editor.github.io +[8]: https://opensource.com/article/17/2/mtpaint-pixel-art-animated-gifs +[9]: https://www.pinta-project.com/ +[10]: http://inkscape.org +[11]: https://opensource.com/sites/default/files/uploads/tux.png (Tux the penguin) +[12]: https://creativecommons.org/licenses/by-sa/4.0/ +[13]: https://opensource.com/sites/default/files/uploads/gimp_alpha-to-selection.jpg (Alpha to selection) +[14]: https://opensource.com/sites/default/files/uploads/gimp_path-tool.jpg (GIMP Paths tool) +[15]: https://opensource.com/sites/default/files/uploads/gimp_path-create.jpg (Create a path in GIMP) +[16]: https://opensource.com/sites/default/files/uploads/gimp_path-edit.jpg (Edit path) +[17]: https://opensource.com/sites/default/files/uploads/gimp_foreground-colour.jpg (Foreground color in toolbox) +[18]: https://www.w3schools.com/colors/colors_picker.asp +[19]: https://en.wikipedia.org/wiki/HSL_and_HSV +[20]: https://opensource.com/sites/default/files/uploads/gimp_colour.jpg (Setting color values) +[21]: https://opensource.com/sites/default/files/uploads/gimp_matte.jpg (Flattening image) diff --git a/published/202011/20201001 How open source underpins blockchain technology.md b/published/202011/20201001 How open source underpins blockchain technology.md new file mode 100644 index 0000000000..8205d3b2ce --- /dev/null +++ b/published/202011/20201001 How open source underpins blockchain technology.md @@ -0,0 +1,88 @@ +[#]: collector: "lujun9972" +[#]: translator: "xiao-song-123" +[#]: reviewer: "wxy" +[#]: publisher: "wxy" +[#]: url: "https://linux.cn/article-12776-1.html" +[#]: subject: "How open source underpins blockchain technology" +[#]: via: "https://opensource.com/article/20/10/open-source-blockchain" +[#]: author: "Matt Shealy https://opensource.com/users/mshealy" + +开源是如何支撑区块链技术发展的 +====== + +> 创造出区块链安全性和可靠性的原因:是开放,而非监管。 + +![](https://img.linux.net.cn/data/attachment/album/202011/01/155124l5c81g86mfwgjxfx.jpg) + +当人们发现以安全性而闻名的区块链技术居然是建立在开源软件代码之上时,通常会感到非常惊讶。事实上,正是这种开放性才赋予了区块链技术的安全性和可靠性。 + +以开源方式构建的任何事物,其核心价值之一就是为了提高效率。建立起一个有着不同观点和技能的开发人员社区,这些开发人员工作在同一个代码库的时候,可以成倍增加构建出来的应用程序数量以及复杂性。 + +### 开源比人们想象中的要更加普遍 + +开源的 Linux,就是一种比较流行的操作系统。Linux 为服务器提供了许多服务,这些服务让我们可以轻松地共享个人信息。其中包括 Google、Facebook 和数千个主要网站。当我们使用这些服务时,就是在和这些在网络上运行着 Linux 系统的计算机进行交互。Chromebook 也使用 Linux,Android 手机使用的操作系统也是基于 Linux 的。 + +Linux 不属于任何一家公司,人们可以免费使用并且可以共同协作来完善创造它。自 2005 年推出以来,已经有来自 1,700 多家公司的 20,000 多名开发人员 [为其中的代码做出了贡献][2] 。 + +这就是开源软件的运作方式。大量的人为此贡献,并不断添加、修改或构建开源代码库来创建新的应用程序和平台。区块链和加密货币的大部分代码都是使用开源软件开发的。开源软件是由充满热情的用户构建的,这些用户对错误、故障或缺陷时刻保持警惕。当发现问题时,开源社区中的开发人员将一起努力来解决问题。 + +### 区块链和开源 + +整个开源区块链开发者社区都在不断地添加和完善代码库。 + +以下是区块链的基本表现方式: + + * 区块链平台具有一个交易数据库,该交易数据库允许对等方在任何时候彼此进行交易。 + * 附有用户识别标签,以方便交易。 + * 平台一定有一种安全的方式来在交易批准前对交易进行验证。 + * 无法被验证的交易不会进行。 + +开源软件允许开发者在 [去中心化应用程序(Dapp)][3]中创建这些平台,这是区块链中交易的安全、保障和可变性的关键。 + +这种去中心化的方式意味着没有中央权威机构来调解交易,没有人能控制发生的事情。直接的点对点的交易可以更快速、安全的进行。由于交易被记录在分类账簿中,它们也会分发到整个生态系统中。 + +区块链使用密码学来保证安全。每一笔交易都携带着与前一笔交易相关联的信息,以验证其真实性。这可以防止威胁者篡改数据,因为一旦数据被添加到公共分类账中,其他用户就不能更改。 + +### 区块链是开源的吗? + +虽然区块链本身在技术上可以是不开源的,但区块链系统通常是使用开源软件实现的,因为没有政府机构对其进行监管,所以这些开源软件使用的概念体现了一种开放文化。私人公司开发的用于处理金融交易的专有软件很可能受到 [政府机构][4] 的监管。在美国,这可能包括美国证券交易委员会(SEC)、联邦储备委员会和联邦存款保险公司(FDIC)。区块链技术在开放环境下使用不需要政府监管,实际上,用来验证交易的是用户社区。 + +你可以称它为一种极端的众包形式,既用于开发构建区块链平台的开源软件,也用于验证交易。这就是区块链得到如此多关注的原因之一:它有可能颠覆整个行业,因为它可以作为处理和验证交易的权威中介。 + +### 比特币,以太坊和其他加密货币 + +截至 2020 年 6 月,超过 [5000 万人拥有区块链钱包][5] 。他们大多数用于金融交易,例如交易比特币、以太坊和其他加密货币。对许多人来说,像交易员观察股票价格一样,[查看加密货币价格][6] 已成为主流。 + +加密货币平台也使用开源软件。[以太坊项目][7] 开发出了任何人都可以免费使用的开源软件,社区中大量的开发者都为此贡献了代码。比特币客户端的参考实现版是由 450 多个开发人员和工程师进行开发的,他们已经贡献了超过 150,000 个贡献。 + +加密货币区块链是一个持续增长的记录。每个被称作为块的记录按顺序链接在一起,它们互相链接形成一条链。每个块都有其自己的唯一标记,这个标记称为 [哈希][8] 。一个块包含自身的哈希值和前一个块的加密计算出的哈希值。从本质上讲,每个块都链接到前一个块,形成了无法中断的长链,每个块都包含其它区块的信息,用于验证交易。 + +在金融或是加密货币的区块链中没有中央银行。这些分布在整个互联网中的区块,建立了一个性能强大的审计跟踪系统。任何人都能够通过区块链来验证交易,但却不能更改上面的记录。 + +### 牢不可破的区块链 + +尽管区块链不受任何政府或机构的监管,但分布式的网络保证了它们的安全。随着链的增长,每一笔交易都会增加伪造的难度。区块分布在世界各地的网络中,它们使用的信任标记不可被改变,这条链条几乎变得牢不可破。 + +这种去中心化的网络,其背后的代码是开源的,这也是用户在交易中不必使用诸如银行或经纪人之类的中介就可以相互信任的原因之一。支撑加密货币平台的软件是由相互独立的开发者组建的联盟创建的,并且任何人都可以免费使用。这创造了世界上最大的制衡体系之一。 + +-------------------------------------------------------------------------------- + +via: https://opensource.com/article/20/10/open-source-blockchain + +作者:[Matt Shealy][a] +选题:[lujun9972][b] +译者:[xiao-song-123](https://github.com/xiao-song-123) +校对:[wxy](https://github.com/wxy) + +本文由 [LCTT](https://github.com/LCTT/TranslateProject) 原创编译,[Linux中国](https://linux.cn/) 荣誉推出 + +[a]: https://opensource.com/users/mshealy +[b]: https://github.com/lujun9972 +[1]: https://opensource.com/sites/default/files/styles/image-full-size/public/lead-images/cube_innovation_process_block_container.png?itok=vkPYmSRQ "cubes coming together to create a larger cube" +[2]: https://www.linuxfoundation.org/wp-content/uploads/2020/08/2020_kernel_history_report_082720.pdf +[3]: https://www.freecodecamp.org/news/what-is-a-dapp-a-guide-to-ethereum-dapps/ +[4]: https://www.investopedia.com/ask/answers/063015/what-are-some-major-regulatory-agencies-responsible-overseeing-financial-institutions-us.asp +[5]: https://www.statista.com/statistics/647374/worldwide-blockchain-wallet-users/ +[6]: https://www.okex.com/markets +[7]: https://ethereum.org/en/ +[8]: https://opensource.com/article/18/7/bitcoin-blockchain-and-open-source diff --git a/published/202011/20201002 How to Free Up Space in -boot Partition on Ubuntu Linux.md b/published/202011/20201002 How to Free Up Space in -boot Partition on Ubuntu Linux.md new file mode 100644 index 0000000000..c73bd3a14d --- /dev/null +++ b/published/202011/20201002 How to Free Up Space in -boot Partition on Ubuntu Linux.md @@ -0,0 +1,173 @@ +[#]: collector: (lujun9972) +[#]: translator: (robsean) +[#]: reviewer: (wxy) +[#]: publisher: (wxy) +[#]: url: (https://linux.cn/article-12779-1.html) +[#]: subject: (How to Free Up Space in /boot Partition on Ubuntu Linux?) +[#]: via: (https://itsfoss.com/free-boot-partition-ubuntu/) +[#]: author: (Ankush Das https://itsfoss.com/author/ankush/) + +如何在 Ubuntu Linux 上释放 /boot 分区的空间? +====== + +前几天,我收到一个警告,`/boot` 分区已经几乎满了,没有剩余空间了。是的,我有一个独立的 `/boot` 分区,我相信现在很少有人这样做了。(LCTT 译注:个人认为保留单独的 /boot 分区是个好的运维经验,除此以外,/tmp、/var 也单独划定分区比较好。) + +这是我第一次看到这样一个错误,它让我很迷惑。现在,这里有一些 [方法来释放在 Ubuntu (或基于 Ubuntu 的分区)上的分区][1] ,但是在这种情况下并不是所有的方法都能用。 + +这就是为什么我决定写这些我释放 `/boot` 分区空间的步骤的原因。 + +### 如何在 Ubuntu 上释放 /boot 分区的空间 + +![][2] + +我建议你仔细阅读这些解决方案,并由此得出最适合你情况的解决方案。解决方案的操作很容易,但是你需要在你的生产力系统上小心的执行这些解决方案。 + +#### 方法 1: 使用 apt autoremove + +你不必是一名终端专家来做这件事,它只需要一个命令,你将移除未使用的内核来释放 `/boot` 分区中是空间。 + +你所有要做的事情是,输入: + +``` +sudo apt autoremove +``` + +这个命令不仅仅可以移除未使用的内核,而且也将移除你不需要的或工具安装后所不需要的依赖项。 + +在你输入命令后,它将列出将被移除的东西,你只需要确认操作即可。如果你很好奇它将移除什么,你可以仔细检查一下看看它实际移除了什么。 + +这里是它应该看起来的样子: + +![][3] + +你必须按 `Y` 按键来继续。 + +**值得注意的是,这种方法只在你还剩余一点点空间,并且得到警告的情况下才有效。但是,如果你的 `/boot` 分区已经满了,APT 甚至可能不会工作。** + +在接下来的方法中,我将重点介绍两种不同的方法,通过这些方法你可以使用 GUI 和终端来移除旧内核来释放空间。 + +#### 方法 2: 手动移除未使用的内核 + +在你尝试 [移除一些旧内核][4] 来释放空间前,你需要识别当前活动的内核,并且确保你不会删除它。 + +为 [检查你的内核的版本][5] ,在终端中输入下面的命令: + +``` +uname -r +``` + +[uname 命令通常用于获取 Linux 系统信息][6]。在这里,这个命令显示当前正在被使用的 Linux 内核。它看起来应该是这样: + +![][7] + +现在,你已经知道你当前的 Linux 内核是什么,你必须移除一个不同于这个版本的内核。你应该把它记录在某些地方,以便你不会不知不觉地移除它。 + +接下来,要移除它,你可以使用终端或 GUI。 + +> 警告! +> +> 在删除内核时一定要额外的小心。只识别和删除旧内核,而不是当前你正在使用的内核,否则你将会拥有一个残缺的系统。 + +##### 使用一个 GUI 工具来移除旧的 Linux 内核 + +你可以使用 [Synaptic 软件包管理器][8] 或一个类似 [Stacer][9] 的工具来开始。就我个人而言,当我遇到一个满满的 `/boot` 分区且 APT 损坏时,我使用 [Stacer][6] 来丢弃旧内核。因此,让我向你展示一下它看起的样子。 + +首先,你需要启动 Stacer ,然后导航到软件包卸载器,如下面屏幕截图所示。 + +![][10] + +在这里,搜索 “image” ,你将找到你所拥有的 Linux 内核。你只需要删除旧内核版本的镜像,而不是当前内核的镜像。 + +在上面的屏幕截图中,我已经指出了我系统上的当前内核和旧内核,因此你必须注意你系统上的内核。 + +你没有必要删除任何其它东西,只需要删除旧的内核版本。 + +同样的,只需要在软件包列表中搜索 “headers” ,并删除如下显示的旧的 “headers” 版本。 + +![][11] + +作为提醒,你 **不会希望移除 `linux-headers-generic`** 。只关注一下那些与其相关的有版本号的就行。 + +然后,就这样,你完成了所有的工作,APT 将会再次工作,并且你将成功地释放来自 `/boot` 分区的一些空间。同样地,你也可以使用任意其它的软件包管理器来完成这些工作。 + +#### 使用命令行来移除旧内核 + +使用命令行来移除旧内核与使用 GUI 来移除旧内核是一样的。因此,如果你没有选择使用 GUI 软件(如果它是一台远程机器/一项远程服务)的权利,或者如果你只是对终端情有独钟,你可以仿效下面的步骤。 + +首先,使用下面的命令列出所有已安装的内核: + +``` +ls -l /boot +``` + +它应该看起来像这样: + +![][12] + +标记为 “old” 的内核,或者不匹配你当前内核版本,都是未使用的内核,你可以删除它们。 + +现在,你可以使用 `rm` 命令来移除具体指定来自 `/boot` 分区中的内核,使用下面的命令(一个命令对应一个内核): + +``` +sudo rm /boot/vmlinuz-5.4.0-7634-generic +``` + +务必检查系统的版本 — 这里可能与你的系统的版本不同。 + +如果你有很多未使用的内核,这将需要一些时间。因此,你也可以下面的命令丢弃多个内核: + +``` +sudo rm /boot/*-5.4.0-{7634}-* +``` + +为了清晰起见,你需要用逗号分隔内核版本号的最后一部分/编码,以便同时删除它们。 + +假设,我有两个旧的内核 5.4.0-7634-generic 和 5.4.0-7624 ,那么命令将是: + +``` +sudo rm /boot/*-5.4.0-{7634,7624}-* +``` + +如果你不希望在 grub 启动菜单中再看到这些旧的内核版本,你可以使用下面的命令简单地 [更新 grub][13]: + +``` +sudo update-grub +``` + +就这样,你完成了所有的工作。你已经释放了空间,还修复了可能潜在的破损的 APT 问题,如果它是一个在你的 `/boot` 分区填满后出现的重要的问题的话。 + +在一些情况下,你需要输入这些命令来修复破损的(正如我在论坛中注意到的): + +``` +sudo dpkg --configure -a +sudo apt install -f +``` + +注意,除非你发现 APT 已破损,否则你不需要输入上面的命令。就我个人而言,我不需要这些命令,但是我发现这些命令对论坛上的一些人很有用。 + +-------------------------------------------------------------------------------- + +via: https://itsfoss.com/free-boot-partition-ubuntu/ + +作者:[Ankush Das][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/ankush/ +[b]: https://github.com/lujun9972 +[1]: https://itsfoss.com/free-up-space-ubuntu-linux/ +[2]: https://i1.wp.com/itsfoss.com/wp-content/uploads/2020/10/free-boot-space-ubuntu-linux.jpg?resize=800%2C450&ssl=1 +[3]: https://i1.wp.com/itsfoss.com/wp-content/uploads/2020/09/apt-autoremove-screenshot.jpg?resize=800%2C415&ssl=1 +[4]: https://itsfoss.com/remove-old-kernels-ubuntu/ +[5]: https://itsfoss.com/find-which-kernel-version-is-running-in-ubuntu/ +[6]: https://linuxhandbook.com/uname/ +[7]: https://i2.wp.com/itsfoss.com/wp-content/uploads/2020/09/uname-r-screenshot.jpg?resize=800%2C198&ssl=1 +[8]: https://itsfoss.com/synaptic-package-manager/ +[9]: https://itsfoss.com/optimize-ubuntu-stacer/ +[10]: https://i2.wp.com/itsfoss.com/wp-content/uploads/2020/09/stacer-remove-kernel.jpg?resize=800%2C562&ssl=1 +[11]: https://i0.wp.com/itsfoss.com/wp-content/uploads/2020/09/stacer-remove-kernel-header.png?resize=800%2C576&ssl=1 +[12]: https://i1.wp.com/itsfoss.com/wp-content/uploads/2020/09/command-kernel-list.png?resize=800%2C432&ssl=1 +[13]: https://itsfoss.com/update-grub/ diff --git a/published/202011/20201006 Start using virtual tables in Apache Cassandra 4.0.md b/published/202011/20201006 Start using virtual tables in Apache Cassandra 4.0.md new file mode 100644 index 0000000000..ba78aa772f --- /dev/null +++ b/published/202011/20201006 Start using virtual tables in Apache Cassandra 4.0.md @@ -0,0 +1,61 @@ +[#]: collector: (lujun9972) +[#]: translator: (geekpi) +[#]: reviewer: (wxy) +[#]: publisher: (wxy) +[#]: url: (https://linux.cn/article-12791-1.html) +[#]: subject: (Start using virtual tables in Apache Cassandra 4.0) +[#]: via: (https://opensource.com/article/20/10/virtual-tables-apache-cassandra) +[#]: author: (Ben Bromhead https://opensource.com/users/ben-bromhead) + +如何在 Apache Cassandra 4.0 中使用虚拟表 +====== + +> 虚拟表是什么以及如何使用。 + +![](https://img.linux.net.cn/data/attachment/album/202011/04/234511kpmv6dzac6fjmr65.jpg) + +在最近的发布的 [Apache Cassandra 4.0 测试版][3]中的[众多新增功能][2]中,虚拟表virtual table是一个值得关注的功能。 + +在以前的 Cassandra 版本中,用户需要访问 Java 管理扩展Java Management Extensions([JMX][4]) 来查看 Cassandra 的细节,如运行中的压实compaction、客户端、度量和各种配置设置。虚拟表消除了这些挑战。Cassandra 4.0 测试版让用户能够从一个只读的系统表中以 Cassandra 查询语言Cassandra Query Language(CQL)行的形式查询这些细节和数据。 + +以下是之前 Cassandra 版本中基于 JMX 的机制是如何工作的。想象一下,一个用户想要检查集群中某个节点的压实状态。用户首先要建立一个 JMX 连接,在节点上运行 `nodetool compactionstats`。这个要求马上就给用户带来了一些复杂的问题。用户的客户端是否配置了 JMX 访问?Cassandra 节点和防火墙是否配置为允许 JMX 访问?是否准备好了适当的安全和审计措施,并落实到位?这些只是用户在处理 Cassandra 以前版本时必须面对的其中一些问题。 + +在 Cassandra 4.0 中,虚拟表使得用户可以利用之前配置的驱动来查询所需信息。这一变化消除了与实现和维护 JMX 访问相关的所有开销。 + +Cassandra 4.0 创建了两个新的键空间keyspace来帮助用户利用虚拟表:`system_views` 和 `system_virtual_schema`。`system_views` 键空间包含了用户查询的所有有价值的信息,有用地存储在一些表中。`system_virtual_schema` 键空间,顾名思义,存储了这些虚拟表的所有必要的模式信息。 + +![system_views and system_virtual_schema keyspaces and tables][5] + +重要的是要明白,每个虚拟表的范围仅限于其节点。任何虚拟表查询都将返回的数据,只对其协调器的节点有效,而不管一致性如何。为了简化这一要求,已经在几个驱动中添加了支持,以便在这些查询中指定协调器节点 (Python、DataStax Java 和其他驱动现在提供了这种支持)。 + +为了说明这一点,请查看这个 `sstable_tasks` 虚拟表。这个虚拟表显示了对 [SSTables][7] 的所有操作,包括压实、清理、升级等。 + +![Querying the sstable_tasks virtual table][8] + +如果用户在以前的 Cassandra 版本中运行 `nodetool compactionstats`,则会显示相同类型的信息。 在这里,这个查询发现该节点当前有一个活动的压缩。它还显示了它的进度以及它的键空间和表。得益于虚拟表,用户可以快速收集这些信息,并同样有效地获得正确诊断集群健康状况所需的能力。 + +需要说明的是,Cassandra 4.0 并没有去除对 JMX 访问的需求。JMX 仍然是查询某些指标的唯一选择。尽管如此,用户会欢迎简单地使用 CQL 来获取关键集群指标的能力。由于虚拟表提供的便利,用户可能会将之前投入到 JMX 工具的时间和资源重新投入到 Cassandra 本身。客户端工具也应该开始利用虚拟表提供的优势。 + +如果你对 Cassandra 4.0 测试版及其虚拟表功能感兴趣,请[试试试它][3]。 + +-------------------------------------------------------------------------------- + +via: https://opensource.com/article/20/10/virtual-tables-apache-cassandra + +作者:[Ben Bromhead][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/ben-bromhead +[b]: https://github.com/lujun9972 +[1]: https://opensource.com/sites/default/files/styles/image-full-size/public/lead-images/computer_space_graphic_cosmic.png?itok=wu493YbB (Computer laptop in space) +[2]: https://www.instaclustr.com/apache-cassandra-4-0-beta-released/ +[3]: https://cassandra.apache.org/download/ +[4]: https://en.wikipedia.org/wiki/Java_Management_Extensions +[5]: https://opensource.com/sites/default/files/uploads/cassandra_virtual-tables.png (system_views and system_virtual_schema keyspaces and tables) +[6]: https://creativecommons.org/licenses/by-sa/4.0/ +[7]: https://cassandra.apache.org/doc/latest/architecture/storage_engine.html#sstables +[8]: https://opensource.com/sites/default/files/uploads/cassandra_virtual-tables_sstable_tasks.png (Querying the sstable_tasks virtual table) diff --git a/published/202011/20201007 How to Clear Apt Cache and Reclaim Precious Disk Space.md b/published/202011/20201007 How to Clear Apt Cache and Reclaim Precious Disk Space.md new file mode 100644 index 0000000000..de0b5a3659 --- /dev/null +++ b/published/202011/20201007 How to Clear Apt Cache and Reclaim Precious Disk Space.md @@ -0,0 +1,123 @@ +[#]: collector: (lujun9972) +[#]: translator: (geekpi) +[#]: reviewer: (wxy) +[#]: publisher: (wxy) +[#]: url: (https://linux.cn/article-12787-1.html) +[#]: subject: (How to Clear Apt Cache and Reclaim Precious Disk Space) +[#]: via: (https://itsfoss.com/clear-apt-cache/) +[#]: author: (Abhishek Prakash https://itsfoss.com/author/abhishek/) + +如何清除 APT 缓存来回收宝贵的磁盘空间 +====== + +![][13] + +如何清除 APT 缓存?你只需使用这个 [apt-get 命令][1]选项: + +``` +sudo apt-get clean +``` + +但是,清理 APT 缓存不仅仅是运行上面的命令。 + +在本教程中,我将解释什么是 APT 缓存、为什么会使用它、为什么你要清理它,以及关于清理 APT 缓存你应该知道的其他事情。 + +我将在这里使用 Ubuntu 作为参考,但由于这是关于 APT 的,因此它也适用于 [Debian][2] 和其他基于 Debian 和 Ubuntu 的发行版,比如 Linux Mint、Deepin 等等。 + +### 什么是 APT 缓存?为什么要使用它? + +当你使用 `apt-get` 或 [apt 命令][3]安装一个软件包时(或在软件中心安装 DEB 包),APT [包管理器][4]会以 .deb 格式下载软件包及其依赖关系,并将其保存在 `/var/cache/apt/archives` 文件夹中。 + +![][5] + +下载时,`apt` 将 deb 包保存在 `/var/cache/apt/archives/partial` 目录下。当 deb 包完全下载完毕后,它会被移到 `/var/cache/apt/archives` 目录下。 + +下载完包的 deb 文件及其依赖关系后,你的系统就会[从这些 deb 文件中安装包][6]。 + +现在你明白缓存的用途了吧?系统在安装软件包之前,需要一个地方把软件包文件存放在某个地方。如果你了解 [Linux 目录结构][7],你就会明白,`/var/cache` 是合适的地方。 + +#### 为什么安装包后要保留缓存? + +下载的 deb 文件在安装完成后并不会立即从目录中删除。如果你删除了一个软件包,然后重新安装,你的系统会在缓存中查找这个软件包,并从这里获取它,而不是重新下载(只要缓存中的软件包版本与远程仓库中的版本相同)。 + +这样就快多了。你可以自己尝试一下,看看一个程序第一次安装,删除后再安装需要多长时间。你可以[使用 time 命令来了解完成一个命令需要多长时间][8]:`time sudo apt install package_name`。 + +我找不到任何关于缓存保留策略的内容,所以我无法说明 Ubuntu 会在缓存中保留下载的包多长时间。 + +#### 你应该清理 APT 缓存吗? + +这取决于你。如果你的根目录下的磁盘空间用完了,你可以清理 APT 缓存来回收磁盘空间。这是 [Ubuntu 上释放磁盘空间的几种方法][9]之一。 + +使用 [du 命令][10]检查缓存占用了多少空间: + +![][11] + +有的时候,这可能会占用几百兆,如果你正在运行一个服务器,这些空间可能是至关重要的。 + +#### 如何清理 APT 缓存? + +如果你想清除 APT 缓存,有一个专门的命令来做。所以不要去手动删除缓存目录。只要使用这个命令就可以了: + +``` +sudo apt-get clean +``` + +这将删除 `/var/cache/apt/archives` 目录的内容(除了锁文件)。以下是 `apt-get clean` 命令模拟删除内容: + +![][12] + +还有一个命令是关于清理 APT 缓存的: + +``` +sudo apt-get autoclean +``` + +与 `clean` 不同的是,`autoclean` 只删除那些无法从仓库中下载的包。 + +假设你安装了包 xyz。它的 deb 文件仍然保留在缓存中。如果现在仓库中有新的 xyz 包,那么缓存中现有的这个 xyz 包就已经过时了,没有用了。`autoclean` 选项会删除这种不能再下载的无用包。 + +#### 删除 apt 缓存安全吗? + +是的,清除 APT 创建的缓存是完全安全的。它不会对系统的性能产生负面影响。也许如果你重新安装软件包,下载时间会更长一些,但也仅此而已。 + +再说一次,使用 `apt-get clean` 命令。它比手动删除缓存目录更快、更简单。 + +你也可以使用像 [Stacer][14] 或 [Bleachbit][15] 这样的图形工具来实现这个目的。 + +#### 总结 + +在写这篇文章的时候,新的 `apt` 命令没有这样的内置选项。不过,为了保持向后的兼容性,仍然可以运行 `apt clean` (内部应该是运行了 `apt-get clean`)。请参考这篇文章来[了解 apt 和 apt-get 的区别][16]。 + +我希望你觉得这个关于 APT 缓存的解释很有趣。虽然这不是什么必要的东西,但了解这些小东西会让你对你的 Linux 系统更加了解。 + +欢迎你在评论区提出反馈和建议。 + +-------------------------------------------------------------------------------- + +via: https://itsfoss.com/clear-apt-cache/ + +作者:[Abhishek Prakash][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/abhishek/ +[b]: https://github.com/lujun9972 +[1]: https://itsfoss.com/apt-get-linux-guide/ +[2]: https://www.debian.org/ +[3]: https://itsfoss.com/apt-command-guide/ +[4]: https://itsfoss.com/package-manager/ +[5]: https://i2.wp.com/itsfoss.com/wp-content/uploads/2020/10/apt-get-clean-cache.png?resize=800%2C470&ssl=1 +[6]: https://itsfoss.com/install-deb-files-ubuntu/ +[7]: https://linuxhandbook.com/linux-directory-structure/ +[8]: https://linuxhandbook.com/time-command/ +[9]: https://itsfoss.com/free-up-space-ubuntu-linux/ +[10]: https://linuxhandbook.com/find-directory-size-du-command/ +[11]: https://i2.wp.com/itsfoss.com/wp-content/uploads/2020/10/apt-cache-archive-size.png?resize=800%2C233&ssl=1 +[12]: https://i2.wp.com/itsfoss.com/wp-content/uploads/2020/10/apt-get-clean-ubuntu.png?resize=800%2C339&ssl=1 +[13]: https://i1.wp.com/itsfoss.com/wp-content/uploads/2020/10/Clear-Apt-Cache.png?resize=800%2C450&ssl=1 +[14]: https://itsfoss.com/optimize-ubuntu-stacer/ +[15]: https://itsfoss.com/use-bleachbit-ubuntu/ +[16]: https://itsfoss.com/apt-vs-apt-get-difference/ diff --git a/published/202011/20201014 LibreOffice Wants Apache to Drop the Ailing OpenOffice and Support LibreOffice Instead.md b/published/202011/20201014 LibreOffice Wants Apache to Drop the Ailing OpenOffice and Support LibreOffice Instead.md new file mode 100644 index 0000000000..216a944683 --- /dev/null +++ b/published/202011/20201014 LibreOffice Wants Apache to Drop the Ailing OpenOffice and Support LibreOffice Instead.md @@ -0,0 +1,81 @@ +[#]: collector: (lujun9972) +[#]: translator: (geekpi) +[#]: reviewer: (wxy) +[#]: publisher: (wxy) +[#]: url: (https://linux.cn/article-12775-1.html) +[#]: subject: (LibreOffice Wants Apache to Drop the Ailing OpenOffice and Support LibreOffice Instead) +[#]: via: (https://itsfoss.com/libreoffice-letter-openoffice/) +[#]: author: (Ankush Das https://itsfoss.com/author/ankush/) + +文档基金会希望 Apache 放弃陷入困境的 OpenOffice,转而支持 LibreOffice +====== + +对于 Linux 用户来说,当我们想到[微软 Office 的开源替代品][1]时,Apache OpenOffice 仍然是一个相关的推荐,这是不言而喻的。然而,在过去的几年里,OpenOffice 的发展几乎是停滞的。 + +当然,考虑到 Abhishek 早在 2016 年就写过 [Apache OpenOffice 关闭的可能性][2],这并不令人震惊。 + +现在,在一封[文档基金会的公开信][3]中,他们呼吁 Apache OpenOffice 推荐用户开始使用更好的替代品,比如 LibreOffice。在本文中,我将提到文档基金会的博文中的一些重点,以及它对 Apache OpenOffice 的意义。 + +![][4] + +### Apache OpenOffice 是历史,LibreOffice 是未来? + +尽管我当年没有使用过 OpenOffice,但可以肯定地说,它绝对不是微软 Office 的现代开源替代品。至少现在不是了。 + +是的,Apache OpenOffice 对于传统用户来说仍然是很重要的东西,在几年前是一个很好的替代品。 + +以下是 OpenOffice 和 LibreOffice 的主要发布时间线: + +![][5] + +现在 OpenOffice 已经没有重大的开发了,Apache OpenOffice 的未来是什么?一个相当活跃的项目,这个最大的开源基金会会不发布重大版本? + +这听起来并不乐观,而这正是文档基金会在他们的公开信中所强调的: + +> OpenOffice(.org),是 LibreOffice 的”父项目“,它是一个伟大的办公套件,它改变了世界。它有着引人入胜的历史,但**自从 2014 年以来,Apache OpenOffice (它现在的家)还没有一个重大的版本**。没错,六年多来,没有重大的新功能或重大更新到来,也很少发布次要版本,而且在及时的安全更新方面也存在问题。 + +对于一个普通用户来说,如果他们不知道 [LibreOffice][6],我肯定希望他们知道。但是,Apache 基金会是否应该建议 OpenOffice 用户尝试使用 LibreOffice 来体验更好或更高级的办公套件呢? + +我不知道,也许是,或者不是? + +> ...很多用户不知道 LibreOffice 的存在。OpenOffice 的品牌仍然如此强大,尽管该软件已经有六年多没有重大的版本发布,而且几乎没有人开发或支持它。 + +正如在公开信中提到的,文档基金会强调了 LibreOffice 相对于 OpenOffice的 优势/改进,并呼吁 Apache OpenOffice 开始推荐他们的用户尝试更好的东西(即 LibreOffice): + +> 我们呼吁 Apache OpenOffice 做正确的事情。我们的目标应该是**把强大的、最新的、维护良好的生产力工具送到尽可能多的人手中**。让我们一起努力吧! + +### Apache OpenOffice 应该做什么? + +如果 OpenOffice 能完成工作,用户可能不需要努力寻找替代品。那么,因为他们的缓慢开发而呼唤另一个项目,建议用户采用未来工具并推荐它是一个好主意么? + +在争论中,有人可能会说,如果你已经完成了你的目标,并且对改进 OpenOffice 没有兴趣,那么推广你的竞争对手才是公平的。而且,这并没有错,开源社区应该一直合作,以确保新用户得到最好的选择。 + +从另一个侧面来看,我们可以说,文档基金会对于 OpenOffice 到了 2020 年即使没有任何重大改进却仍然有重要意义感到沮丧。 + +我不会去评判,但当我看了这封公开信时,这些矛盾的想法就浮现在我的脑海里。 + +### 你认为是时候把 OpenOffice 搁置起来,依靠 LibreOffice 了吗? + +即使 LibreOffice 似乎是一个更优越的选择,并且绝对值得关注,你认为应该怎么做?Apache 是否应该停止 OpenOffice,并将用户重定向到 LibreOffice? + +欢迎你的意见。 + +-------------------------------------------------------------------------------- + +via: https://itsfoss.com/libreoffice-letter-openoffice/ + +作者:[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/best-free-open-source-alternatives-microsoft-office/ +[2]: https://itsfoss.com/openoffice-shutdown/ +[3]: https://blog.documentfoundation.org/blog/2020/10/12/open-letter-to-apache-openoffice/ +[4]: https://i1.wp.com/itsfoss.com/wp-content/uploads/2020/10/libre-office-open-office.png?resize=800%2C450&ssl=1 +[5]: https://i1.wp.com/itsfoss.com/wp-content/uploads/2020/10/libre-office-open-office-derivatives.jpg?resize=1536%2C319&ssl=1 +[6]: https://itsfoss.com/libreoffice-tips/ diff --git a/published/202011/20201021 5 open source tools I can-t live without.md b/published/202011/20201021 5 open source tools I can-t live without.md new file mode 100644 index 0000000000..d60f272f59 --- /dev/null +++ b/published/202011/20201021 5 open source tools I can-t live without.md @@ -0,0 +1,101 @@ +[#]: collector: (lujun9972) +[#]: translator: (geekpi) +[#]: reviewer: (wxy) +[#]: publisher: (wxy) +[#]: url: (https://linux.cn/article-12804-1.html) +[#]: subject: (5 open source tools I can't live without) +[#]: via: (https://opensource.com/article/20/10/open-source-tools) +[#]: author: (Victoria Martinez de la Cruz https://opensource.com/users/vkmc) + +5 个我不可或缺的开源工具 +====== + +> 通过将这些工具放在自己的技能包中,提高你在终端内、外的工作效率。 + +![](https://img.linux.net.cn/data/attachment/album/202011/08/185810ffjljj7o830fboz3.jpg) + +前段时间,我参与了一个在科技人士中广为流传的 Twitter 话题。“挑战?只挑选五个你不能没有的工具。”我开始结合我的日常生活来思考这个问题,只挑出五个工具并不容易。我使用了许多我认为必不可少的工具,比如用来与同事和朋友联系的 [IRC][2] 客户端(是的,我仍然使用 IRC),一个用来做各种事情的出色的文本编辑器,一个用来保持有条不紊的日历应用,以及当需要更直接的互动时的一个视频会议平台。 + +所以,让我给这个挑战来个变化:选出五个能提高你工作效率的开源工具。这是我的清单。请在评论中分享你的清单。 + +### tmate + +![tmate screenshot][3] + +哦,我喜欢这个工具。`tmate` 是著名的 [tmux][5] 终端多路复用器的一个复刻,它允许你启动一个 `tmux` 会话并通过 SSH 共享。你可以用它来进行[结对编程][6](这是我的主要使用场景),也可以用来进行远程控制。 + +如果你经常与你的团队成员合作,并且你想要一个简单的、与发行版无关的、开源的方式与他们一起编程(而且共享终端访问对你来说已经足够了),这绝对是你必须加到列表中的东西。 + +在 [tmate 的网站][7]上获取更多信息,或者在 [GitHub][8] 上查看代码。 + +### ix + +`ix` 是一个命令行粘贴板。你不需要安装任何东西。你可以通过 `curl` 到 [ix.io][9] 站点来创建新的粘贴。例如,`echo Hello world. | curl -F 'f:1=<-' ix.io` 会给你一个到 ix.io 的链接,那里粘贴了消息 “Hello world” 的信息。当你想分享日志用于调试或在没有桌面环境的服务器上保存配置文件时,这非常方便。 + +有一个缺点是源码还没有公布,尽管它的目的是自由开源。如果你是作者,并且正在阅读这篇文章,请发布代码,这样我们就可以为打磨它的过程做出贡献。 + +### asciinema + +是的,这是另一个终端工具,`asciinema` 可以让你记录你的终端。使用它的方法有很多,但我一般用它来制作演示。它非常容易使用,而且有很多 Linux 发行版和其他平台的软件包。 + +要想知道它是如何工作的,可以看看这个[酷炫的演示][10]。是不是很棒? + +在 [asciinema 的网站][11]上获取更多信息,在 [GitHub][12] 上访问其源代码。 + +### GNOME Pomodoro + +![pomodoro timer gnome][13] + +好了,关于终端工具的介绍就到此为止。现在我想和大家分享一下这个简单的宝物,它让你的工作变得有条不紊。你听说过 [番茄工作法][14] 吗?Pomodoro 基本上是一个时间管理工具。它使用一个番茄形状的计时器,帮助你将时间分成工作时间和休息时间(默认情况下,25 分钟的工作后有 5 分钟的休息时间)。而且,每隔 4 个“番茄”之后,你就会有更长的休息时间(默认为 15 分钟)。这样做的目的是让你在工作时间内保持专注,而在休息时间内进行伸展和放松。 + +这听起来非常非常简单,你可能会对让一个番茄形状的时钟来控制你的生活感到犹豫,但它确实帮助我变得跟有条理,并且在试图同时专注于许多事情时避免感到疲惫。 + +无论你是什么角色,我都强烈推荐这种做法。而在众多实现它的不同工具中,我推荐 GNOME Pomodoro 应用。它适用于主要的 GNU/Linux 发行版,所以它需要你使用 GNOME 桌面环境(这可能是它的缺点)。 + +在 [GNOME Pomodoro 的网站][15]上查看更多信息,并访问其 [GitHub][16] 仓库来获取源码并了解如何做出贡献。 + +### Jitsi + +最后但同样重要的是 Jitsi。当你在一个远程、遍布全球的团队中工作时,你需要一种与人们联系的方式。即时通讯是好的,但有时最好还是开个快速会议,面对面地讨论事情(嗯,看到对方的脸)。有很多[视频会议工具][17]可用,但我很喜欢 Jitsi。不仅因为它是免费和开源的,还因为它提供了一个简洁、实用的界面。你可以设置自己的 Jitsi 服务器(用于商业目的),但你也可以通过访问 [Jitsi Meet][18] 网站来试用一个公共的 Jitsi 实例。 + +设置这种会议的一个好做法是:只有在你心中有明确的议程时才使用它。而且要时刻问自己,这个会议能不能用电子邮件代替?遵循这些准则,谨慎使用 Jitsi,你的工作日将会非常高效! + +在 [Jitsi 网站][19]上了解更多信息,并通过访问其 [GitHub][20] 仓库开始贡献。 + +* * * + +我希望我的清单能帮助你在生产力上达到一个新的水平。你的 5 个不能离开的开源生产力工具是什么?在评论中告诉我。 + +-------------------------------------------------------------------------------- + +via: https://opensource.com/article/20/10/open-source-tools + +作者:[Victoria Martinez de la Cruz][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/vkmc +[b]: https://github.com/lujun9972 +[1]: https://opensource.com/sites/default/files/styles/image-full-size/public/lead-images/lenovo-thinkpad-laptop-window-focus.png?itok=g0xPm2kD (young woman working on a laptop) +[2]: https://en.wikipedia.org/wiki/Internet_Relay_Chat +[3]: https://opensource.com/sites/default/files/pictures/tmate-opensource.jpg (tmate screenshot) +[4]: https://creativecommons.org/licenses/by-sa/4.0/ +[5]: https://opensource.com/article/20/7/tmux-cheat-sheet +[6]: https://en.wikipedia.org/wiki/Pair_programming +[7]: https://tmate.io/ +[8]: https://github.com/tmate-io/tmate +[9]: http://ix.io/ +[10]: https://asciinema.org/a/239367 +[11]: https://asciinema.org/ +[12]: https://github.com/asciinema/asciinema +[13]: https://opensource.com/sites/default/files/pictures/pomodoro_timer_gnome.jpg (pomodoro timer gnome) +[14]: https://en.wikipedia.org/wiki/Pomodoro_Technique +[15]: https://gnomepomodoro.org/ +[16]: https://github.com/codito/gnome-pomodoro +[17]: https://opensource.com/article/20/5/open-source-video-conferencing +[18]: https://meet.jit.si/ +[19]: https://jitsi.org/ +[20]: https://github.com/jitsi diff --git a/published/202011/20201022 5 steps to learn any programming language.md b/published/202011/20201022 5 steps to learn any programming language.md new file mode 100644 index 0000000000..e4fae4c258 --- /dev/null +++ b/published/202011/20201022 5 steps to learn any programming language.md @@ -0,0 +1,184 @@ +[#]: collector: "lujun9972" +[#]: translator: "xiao-song-123" +[#]: reviewer: "wxy" +[#]: publisher: "wxy" +[#]: url: "https://linux.cn/article-12842-1.html" +[#]: subject: "5 steps to learn any programming language" +[#]: via: "https://opensource.com/article/20/10/learn-any-programming-language" +[#]: author: "Seth Kenlon https://opensource.com/users/seth" + +五步学会任何编程语言 +====== + +> 只需一点编程经验,你就可以在短短几天内(有时更少)学会一种新编程语言。 + +![](https://img.linux.net.cn/data/attachment/album/202011/19/225851j7miw3kd17joowa7.jpg) + +有些人喜欢学习新的编程语言,也有一些人觉得学习一种都是可望不可及的事情。在本文中,我将向你展示如何像程序员一样思考,这样你就可以自信地学习任何一门你想要学习的编程语言。 + +事实上,一旦你学会了如何编程,你使用的编程语言就不再是一个障碍,而更像是一种形式。实际上,这就是教育家们倡导 [让孩子尽早学习编程][2] 的众多原因之一。不管他们的入门语言有多简单,这种编程的逻辑和儿童们(或成人学习者)以后可能遇到的其他语言的逻辑有着想通之处。 + +只需有一点编程经验(你可以从我们这里的几篇介绍性文章中获得),你就可以在短短几天内(有时更短)学习任何编程语言。这并不是魔法,你也确实要为此付出一些努力。诚然,学习一种编程语言每个的可用库,或者学习打包代码以及进行交付的细微差别,需要的时间远远不止几天。但是,就入门来说,比你想像中的要容易许多,剩下的则要通过不断练习来完成。 + +当有经验的程序员静下心来学习一门新的编程语言时,他们会寻找五样东西。只要你知道了这五件事,你就可以开始编码了。 + +### 1、语法 + +![Syntax][3] + +语言的语法描述了代码的结构。这包括如何逐行编写代码,以及用于构造代码语句的实际单词。 + +例如,[Python][5] 以使用缩进来指示一个代码块在哪里结束以及另一代码块在哪里开始而闻名: + +``` +while j < rows: + while k < columns: + tile = Tile(k * w) + board.add(tile) + k += 1 + j += 1 + k = 0 +``` + +[Lua][6] 只是使用关键字 `end`: + +``` +for i,obj in ipairs(hit) do + if obj.moving == 1 then + obj.x,obj.y = v.mouse.getPosition() + end +end +``` + +[Java][7]、[C][8]、C++ 之类的编程语言使用花括号: + +``` +while (std::getline(e,r)) { + wc++; + } +``` + +编程语言的语法还包括包括库、设置变量和终止行等内容。通过练习,你将学会在阅读示例代码时下意识地识别语法需求(和惯例)。 + +#### 实践 + +当学习一门新的编程语言时,要努力理解它的语法。你不需要去记住它,只需要知道如果忘记了以后去哪里查找。使用好的 [IDE][9] 也很有帮助,因为很多 IDE 在出现语法错误时会提醒你。 + +### 2、内置函数和条件 + +![built-in words][10] + +就像自然语言一样,编程语言可以识别的合法单词是有限的。这个词汇表可以使用其他库进行扩展,但是核心语言知道一组特定的关键字。大多数语言并没有你想的那么多关键字。即使在像 C 语言这样非常低级的语言中,也只有 32 个关键字,比如 `for`、`do`、`while`、`int`、`float`、`char`、`break` 等等。 + +了解了这些关键字,你就可以编写基本的表达式,也就是构建程序的代码块。许多内置的关键字能帮助你构建条件语句,这些条件语句影响整个程序的流程。例如,如果你想编写一个允许单击和拖动图标的程序,那么你的代码就必须检测用户的鼠标指针何时位于图标上。只有当鼠标光标位于图标外部边缘相同的坐标时,才执行导致使鼠标抓取图标的代码。这是一个经典的 `if` / `then` 语句,但不同的语言可以用不同的方式表达。 + +Python 使用 `if`、`elif `和 `else` 的组合来实现条件语句,但是并不显式的关闭语句: + +``` +if var == 1: +    # action +elif var == 2: +    # some action +else: +    # some other action +``` + +[Bash][11] 使用 `if`、`elif`、`else`,并且使用 `fi` 来结束语句: + +``` +if [ "$var" = "foo" ]; then +   # action +elif [ "$var" = "bar" ]; then +   # some action +else +   # some other action +fi +``` + +然而 C 和 Java, 使用 `if`、`else` 和 `else if`,用花括号把它们括起来: + +``` +if (boolean) { +   // action +} else if (boolean) { +   // some action +} else { +   // some other action +} +``` + +各种编程语言虽然在关键字的选择和语法上有细微的变化,但基本是相同的。学习如何在编程语言中定义条件语句,包括 `if` / `then`、`do...while` 和 `case` 语句。 + +#### 实践 + +要熟悉编程语言能够理解的关键字集。在实践中,你的代码将不仅仅包含编程语言的关键字,可以肯定的是,有包含很多简单函数的库来帮助你做一些事情,诸如将输出打印到屏幕或显示窗口之类。然而,驱动这些库的逻辑始于编程语言的内置关键字。 + +### 3、数据类型 + +![Data types][12] + +代码是用来处理数据的,因此你必须学习编程语言如何识别不同类型的数据。所有编程语言都能理解整数,大多数的语言能理解小数和单个字符(`a`、`b`、`c` 等等)。它们通常被表示为 `int`、 `float`、`double` 和 `char`,当然,语言的内置词汇表会告诉你如何引用这些实体。 + +有时候,在编程语言中内置了一些额外的数据类型,也有时是通过引用库来启用复杂的数据类型。例如,Python 可以识别关键字为 `str` 的字符串,但是 C 语言的代码中必须包含 `string.h` 头文件才能实现字符串特性。 + +#### 实践 + +库可以为你的代码解锁各种类型的数据,但是学习编程语言中包含的基本数据类型是一个明智的起点。 + +### 4、运算符和解析器 + +![Operators][13] + +一旦你理解了编程语言可处理的数据类型,就可以学习如何分析这些数据了。幸运的是,数学这门学科是相当稳定的,所以算数运算符在许多语言中通常是相同的(或至少非常相似)。例如,两个整数相加通常用 `+` 符号完成,而测试一个整数是否大于另一个整数通常用 `>` 符号完成。测试是否相等通常使用 `==` 来完成(是的,是两个等号,因为通常一个等号用来赋值)。 + +当然也有一些例外,比如像 Lisp 和 Bash 语言算数运算符就不是如此,但与其他语言一样,这只是一个心理翻译的问题。一旦你了解了表达方式有何不同,很快就可以适应它。快速浏览一下一门编程语言的算数运算符通常足以让你了解算数操作是如何完成的。 + +你还需要知道如何比较和操作非数值数据,比如字符和字符串。这些通常是通过编程语言的核心库来进行的的。例如,Python 提供了 `split()` 方法,而 C 语言需要引入头文件 `string.h` 来提供 `strtok()` 函数。 + +#### 实践 + +了解用于处理基本数据类型的基本函数和关键字,并寻找可帮助你完成复杂操作的核心库。 + +### 5、函数 + +![Class][14] + +代码不只是计算机的待办清单。通常情况下,在编写代码时你往往希望向计算机提供一组理论条件和一组操作指令,当满足每个条件时计算机就会采取这些操作。尽管使用条件语句以及数学和逻辑运算符进行流控制可以做很多事情,但是引入了函数和类之后,代码会变得更加高效,因为它们使你可以定义子程序。例如,如果应用程序非常频繁地需要一个确认对话框,那么将其作为类的实例编写一次要比每次需要它时重新编写实现起来要容易得多。 + +你需要学习如何在编程语言中定义类和函数。更准确地说,你首先需要了解编程语言中是否支持类和函数。大多数现代语言都支持函数,但是类是面向对象的编程语言中所特有的。 + +#### 实践 + +学习语言中可用的结构,这些结构可以帮助你高效地编写和使用代码。 + +### 你可以学到任何东西 + +学习编程语言,就其本身而言,是一种编码过程中的子程序。一旦理解了代码如何工作,你所使用的语言就只是一种传递逻辑的媒介。学习一门新编程语言的过程几乎都是一样的:通过简单的练习来学习语法,通过学习词汇来积累进行复杂动作的能力,然后练习、练习、再练习。 + +-------------------------------------------------------------------------------- + +via: https://opensource.com/article/20/10/learn-any-programming-language + +作者:[Seth Kenlon][a] +选题:[lujun9972][b] +译者:[xiao-song-123](https://github.com/xiao-song-123) +校对:[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/learn-programming-code-keyboard.png?itok=xaLyptT4 "Learning to program" +[2]: https://opensource.com/article/20/9/scratch +[3]: https://opensource.com/sites/default/files/uploads/syntax_0.png "Syntax" +[4]: https://creativecommons.org/licenses/by-sa/4.0/ +[5]: https://opensource.com/downloads/cheat-sheet-python-37-beginners +[6]: https://opensource.com/article/20/2/lua-cheat-sheet +[7]: https://opensource.com/downloads/java-cheat-sheet +[8]: https://opensource.com/downloads/c-programming-cheat-sheet +[9]: https://opensource.com/resources/what-ide +[10]: https://opensource.com/sites/default/files/uploads/builtin.png "built-in words" +[11]: https://opensource.com/downloads/bash-cheat-sheet +[12]: https://opensource.com/sites/default/files/uploads/type.png "Data types" +[13]: https://opensource.com/sites/default/files/uploads/operator.png "Operators" +[14]: https://opensource.com/sites/default/files/uploads/class.png "Class" diff --git a/published/202011/20201023 Secure NTP with NTS.md b/published/202011/20201023 Secure NTP with NTS.md new file mode 100644 index 0000000000..56b4d47fce --- /dev/null +++ b/published/202011/20201023 Secure NTP with NTS.md @@ -0,0 +1,167 @@ +[#]: collector: (lujun9972) +[#]: translator: (wxy) +[#]: reviewer: (wxy) +[#]: publisher: (wxy) +[#]: url: (https://linux.cn/article-12860-1.html) +[#]: subject: (Secure NTP with NTS) +[#]: via: (https://fedoramagazine.org/secure-ntp-with-nts/) +[#]: author: (Miroslav Lichvar https://fedoramagazine.org/author/mlichvar/) + +用 NTS 保证 NTP 的安全 +====== + +![](https://img.linux.net.cn/data/attachment/album/202011/26/111649pt32v9j22x3ooa33.jpg) + +许多计算机使用网络时间协议Network Time Protocol(NTP)通过互联网来同步系统时钟。NTP 是少数几个仍在普遍使用的不安全的互联网协议之一。攻击者如果能够观察到客户端和服务器之间的网络流量,就可以向客户端提供虚假的数据,并根据客户端的实现和配置,强迫其将系统时钟设置为任何时间和日期。如果客户端的系统时钟不准确,一些程序和服务就可能无法工作。例如,如果根据客户端的系统时钟,Web 服务器的证书似乎已经过期,Web 浏览器将无法正常工作。可以使用网络时间安全Network Time Security(NTS)来保证 NTP 的安全。 + +Fedora 33 [^1] 是第一个支持 NTS 的 Fedora 版本。NTS 是一种新的 NTP 验证机制。它使客户端能够验证它们从服务器接收的数据包在传输过程中有没有被修改。当 NTS 启用时,攻击者唯一能做的就是丢弃或延迟数据包。关于 NTS 的更多细节,请参见 [RFC8915][3]。 + +使用对称密钥可以很好地保证 NTP 的安全。遗憾的是,服务器必须为每个客户端配备不同的密钥,而且密钥必须安全地分发才行。这对于本地网络上的私有服务器来说可能是实用的,但它不能扩展到有着数百万客户端的公共服务器上。 + +NTS 包括一个密钥建立Key Establishment(NTS-KE)协议,它可以自动创建服务器与其客户端之间使用的加密密钥。它在 TCP 端口 4460 上使用传输层安全Transport Layer Security(TLS)。它被设计成可以扩展到非常多的客户端,而对准确性的影响最小。服务器不需要保存任何客户端特定的状态。它为客户提供 cookie,cookie 是加密的,包含验证 NTP 数据包所需的密钥。隐私是 NTS 的目标之一。客户端在每次服务器响应时都会得到一个新的 cookie,所以它不必重复使用 cookie。这可以防止被动观察者跟踪在网络之间迁移的客户端。 + +Fedora 中默认的 NTP 客户端是 Chrony。Chrony 在 4.0 版本中增加了 NTS 支持,但并没有改变默认配置。Chrony 仍然使用 [pool.ntp.org][4] 项目中的公共服务器,而且默认情况下 NTS 没有启用。 + +目前,支持 NTS 的公共 NTP 服务器非常少。两个主要的提供商是 Cloudflare 和 Netnod。[Cloudflare 服务器][5]分布在世界各地的不同地方。他们使用的是任播anycast地址,应该可以让大多数客户到达一个接近的服务器。[Netnod 服务器][6]位于瑞典。在未来,我们可能会看到更多支持 NTS 的公共 NTP 服务器。 + +为了获得最佳的可靠性,配置 NTP 客户端的一般建议是至少有三个工作的服务器。为了达到最好的精度,建议选择距离较近的服务器,以减少网络延迟和非对称网络路由造成的不对称性。如果你不关心细粒度的精度,你可以忽略这个建议,使用任何你信任的 NTS 服务器,无论它们位于哪里。 + +如果你确实想要高准确度,但又没有近距离的 NTS 服务器,你可以将远处的 NTS 服务器和近处的非 NTS 服务器混合使用。但是,这样的配置不如只使用 NTS 服务器的配置安全。攻击者仍然不能强迫客户机接受任意时间,但他们确实对客户机的时钟及其估计精度有更大的控制权,这在某些环境下可能是不可接受的。 + +### 在安装程序中启用客户端 NTS + +安装 Fedora 33 时,你可以在“Time & Date”对话框的“Network Time”配置中启用 NTS。在点击“+”(添加)按钮之前,请输入服务器的名称并检查 NTS 支持情况。你可以添加一个或多个具有 NTS 的服务器或池。要删除默认的服务器池(`2.fedora.pool.ntp.org`),请取消选中“Use”列中的相应标记。 + +![Fedora 安装程序中的网络时间配置][7] + +### 在配置文件中启用客户端 NTS + +如果你从之前的 Fedora 版本升级,或者你没有在安装程序中启用 NTS,你可以直接在 `/etc/chrony.conf` 中启用 NTS。除了推荐的 `iburst` 选项外,还可以对指定服务器使用 `nts` 选项。例如: + +``` +server time.cloudflare.com iburst nts +server nts.sth1.ntp.se iburst nts +server nts.sth2.ntp.se iburst nts +``` + +你还应该允许客户端将 NTS 密钥和 cookie 保存到磁盘上,这样它就不必在每次启动时重复 NTS-KE 会话。在 `chrony.conf` 中添加以下一行,如果还没有的话: + +``` +ntsdumpdir /var/lib/chrony +``` + +如果不想让 DHCP 提供的 NTP 服务器与你指定的服务器混在一起,请在 `chrony.conf` 中删除或注释以下一行: + +``` +sourcedir /run/chrony-dhcp +``` + +当你完成编辑 `chrony.conf` 后,保存你的更改并重新启动 `chronyd` 服务: + +``` +systemctl restart chronyd +``` + +### 检查客户端状态 + +在 root 用户下运行以下命令,检查 NTS 密钥建立是否成功: + +``` +# chronyc -N authdata +Name/IP address Mode KeyID Type KLen Last Atmp NAK Cook CLen +========================================================================= +time.cloudflare.com NTS 1 15 256 33m 0 0 8 100 +nts.sth1.ntp.se NTS 1 15 256 33m 0 0 8 100 +nts.sth2.ntp.se NTS 1 15 256 33m 0 0 8 100 +``` + +`KeyID`、`Type` 和 `KLen` 列应该有非零值。如果它们为零,请检查系统日志中是否有来自 `chronyd` 的错误信息。一个可能的故障原因是防火墙阻止了客户端与服务器的 TCP 端口(端口 4460)的连接。 + +另一个可能的故障原因是由于客户机的时钟错误而导致证书无法验证。这是 NTS 的先有鸡还是先有蛋的问题。你可能需要手动修正日期或暂时禁用 NTS,以使 NTS 正常工作。如果你的电脑有实时时钟,几乎所有的电脑都有,而且有好的电池做备份,这种操作应该只需要一次。 + +如果计算机没有实时时钟或电池,就像一些常见的小型 ARM 计算机(如树莓派)那样,你可以在 `/etc/sysconfig/chronyd` 中添加 `-s` 选项来恢复上次关机或重启时保存的时间。时钟会落后于真实时间,但如果电脑没有关机太久,服务器的证书也没有在离到期时间太近的时候更新,应该足以让时间检查成功。作为最后的手段,你可以用 `nocerttimecheck` 指令禁用时间检查。详情请参见`chrony.conf(5)` 手册页。 + +运行下面的命令来确认客户端是否在进行 NTP 测量: + +``` +# chronyc -N sources +MS Name/IP address Stratum Poll Reach LastRx Last sample +=============================================================================== +^* time.cloudflare.com 3 6 377 45 +355us[ +375us] +/- 11ms +^+ nts.sth1.ntp.se 1 6 377 44 +237us[ +237us] +/- 23ms +^+ nts.sth2.ntp.se 1 6 377 44 -170us[ -170us] +/- 22ms +``` + +`Reach` 列应该有一个非零值,最好是 377。上图所示的值 377 是一个八进制数,它表示最后八个请求都有有效的响应。如果启用了 NTS 的话,验证检查将包括 NTS 认证。如果该值一直很少或从未达到 377,则表明 NTP 请求或响应在网络中丢失了。众所周知,一些主要的网络运营商有中间设备,它可以阻止或限制大的 NTP 数据包的速率,以缓解利用 `ntpd` 的监控协议进行的放大攻击。不幸的是,这影响了受 NTS 保护的 NTP 数据包,尽管它们不会引起任何放大。NTP 工作组正在考虑为 NTP 提供一个替代端口,作为解决这个问题的办法。 + +### 在服务器上启用 NTS + +如果你有自己的 NTP 服务器,运行着 `chronyd`,你可以启用服务器的 NTS 支持,让它的客户端安全同步。如果该服务器是其他服务器的客户端,它应该使用 NTS 或对称密钥与之同步。客户端假设同步链在所有服务器到主时间服务器之间是安全的。 + +启用服务器 NTS 类似于在 Web 服务器上启用 HTTPS。你只需要一个私钥和证书。例如,证书可以由 Let's Encrypt 权威机构使用 `certbot` 工具签署。当你有了密钥和证书文件(包括中间证书),在 `chrony.conf` 中用以下指令指定它们: + +``` +ntsserverkey /etc/pki/tls/private/foo.example.net.key +ntsservercert /etc/pki/tls/certs/foo.example.net.crt +``` + +确保之前在客户端配置中提到的 `ntsdumpdir` 指令存在于 `chrony.conf` 中。它允许服务器将其密钥保存到磁盘上,这样服务器的客户端在重启服务器时就不必获取新的密钥和 cookie 了。 + +重新启动 `chronyd` 服务: + +``` +systemctl restart chronyd +``` + +如果系统日志中没有来自 `chronyd` 的错误信息,那么它应该是可以接受客户端连接的,如果服务器有防火墙,则需要同时允许 UDP 123 和 TCP 4460 端口的 NTP 和 NTS-KE 服务。 + +你可以用下面的命令在客户端机器上进行快速测试: + +``` +$ chronyd -Q -t 3 'server foo.example.net iburst nts maxsamples 1' +2020-10-13T12:00:52Z chronyd version 4.0 starting (+CMDMON +NTP +REFCLOCK +RTC +PRIVDROP +SCFILTER +SIGND +ASYNCDNS +NTS +SECHASH +IPV6 +DEBUG) +2020-10-13T12:00:52Z Disabled control of system clock +2020-10-13T12:00:55Z System clock wrong by -0.001032 seconds (ignored) +2020-10-13T12:00:55Z chronyd exiting +``` + +如果你看到一个“System clock wrong”消息,说明它是正确工作的。 + +在服务器上,你可以使用下面的命令来检查它已经处理了多少个 NTS-KE 连接和认证的 NTP 数据包: + +``` +# chronyc serverstats +NTP packets received : 2143106240 +NTP packets dropped : 117180834 +Command packets received : 16819527 +Command packets dropped : 0 +Client log records dropped : 574257223 +NTS-KE connections accepted: 104 +NTS-KE connections dropped : 0 +Authenticated NTP packets : 52139 +``` + +如果你看到非零的 “NTS-KE connections accepted” 和 “Authenticated NTP packets”,这意味着至少有一些客户端能够连接到 NTS-KE 端口,并发送一个认证的 NTP 请求。 + +[^1]: Fedora 33 Beta 安装程序包含一个较旧的 Chrony 预发布版本,它不能与当前的 NTS 服务器一起工作,因为 NTS-KE 端口已经改变。因此,在安装程序中的网络时间配置中,服务器总是显示为不工作。安装后,需要更新 chrony 包,才能与当前的服务器配合使用。 + +-------------------------------------------------------------------------------- + +via: https://fedoramagazine.org/secure-ntp-with-nts/ + +作者:[Miroslav Lichvar][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://fedoramagazine.org/author/mlichvar/ +[b]: https://github.com/lujun9972 +[1]: https://fedoramagazine.org/wp-content/uploads/2020/10/secure-ntp-with-nts-816x345.jpg +[2]: tmp.rl0XC1HIGm#footnote1 +[3]: https://tools.ietf.org/html/rfc8915 +[4]: https://www.pool.ntp.org +[5]: https://developers.cloudflare.com/time-services/nts/usage +[6]: https://www.netnod.se/time-and-frequency/how-to-use-nts +[7]: https://fedoramagazine.org/wp-content/uploads/2020/10/anaconda-nts.png diff --git a/published/202011/20201026 ninja- a simple way to do builds.md b/published/202011/20201026 ninja- a simple way to do builds.md new file mode 100644 index 0000000000..43911730e3 --- /dev/null +++ b/published/202011/20201026 ninja- a simple way to do builds.md @@ -0,0 +1,117 @@ +[#]: collector: (lujun9972) +[#]: translator: (geekpi) +[#]: reviewer: (wxy) +[#]: publisher: (wxy) +[#]: url: (https://linux.cn/article-12798-1.html) +[#]: subject: (ninja: a simple way to do builds) +[#]: via: (https://jvns.ca/blog/2020/10/26/ninja--a-simple-way-to-do-builds/) +[#]: author: (Julia Evans https://jvns.ca/) + +ninja:一个简单的构建方式 +====== + +大家好!每隔一段时间,我就会发现一款我非常喜欢的新软件,今天我想说说我最近喜欢的一款软件:[ninja][1]! + +### 增量构建很有用 + +我做了很多小项目,在这些项目中,我想设置增量构建。例如,现在我正在写一本关于 bash 的杂志,杂志的每一页都有一个 `.svg`文件。我需要将 SVG 转换为 PDF,我的做法是这样的: + +``` +for i in *.svg +do + svg2pdf $i $i.pdf # or ${i/.svg/.pdf} if you want to get really fancy +done +``` + +这很好用,但是我的 `svg2pdf` 脚本有点慢(它使用 Inkscape),而且当我刚刚只更新了一页的时候,必须等待 90 秒或者其他什么时间来重建所有的 PDF 文件,这很烦人。 + +### 构建系统是让人困惑的 + +在过去,我对使用 `make` 或 `bazel` 这样的构建系统来做我的小项目一直很反感,因为 `bazel` 是个大而复杂的东西,而 `make` 对我来说感觉有点神秘。我真的不想使用它们中的任何一个。 + +所以很长时间以来,我只是写了一个 bash 脚本或者其他的东西来进行构建,然后就认命了,有时候只能等一分钟。 + +### ninja 是一个极其简单的构建系统 + +但 `ninja` 并不复杂!以下是我所知道的关于 ninja 构建文件的语法:创建一个 `rule` 和一个 `build`: + +`rule` 有一个命令(`command`)和描述(`description`)参数(描述只是给人看的,所以你可以知道它在构建你的代码时在做什么)。 + +``` +rule svg2pdf + command = inkscape $in --export-text-to-path --export-pdf=$out + description = svg2pdf $in $out +``` + +`build` 的语法是 `build output_file: rule_name input_files`。下面是一个使用 `svg2pdf` 规则的例子。输出在规则中的 `$out` 里,输入在 `$in` 里。 + +``` +build pdfs/variables.pdf: svg2pdf variables.svg +``` + +这就完成了!如果你把这两个东西放在一个叫 `build.ninja` 的文件里,然后运行 `ninja`,ninja 会运行 `inkscape variables.svg --export-text-to-path --export-pdf=pdfs/variables.pdf`。然后如果你再次运行它,它不会运行任何东西(因为它可以告诉你已经构建了 `pdfs/variables.pdf`,而且是最新的)。 + +Ninja 还有一些更多的功能(见[手册][2]),但我还没有用过。它最初是[为 Chromium][3] 构建的,所以即使只有一个小的功能集,它也能支持大型构建。 + +### ninja 文件通常是自动生成的 + +ninja 的神奇之处在于,你不必使用一些混乱的构建语言,它们很难记住,因为你不经常使用它(比如 `make`),相反,ninja 语言超级简单,如果你想做一些复杂的事情,那么你只需使用任意编程语言生成你想要的构建文件。 + +我喜欢写一个 `build.py` 文件,或者像这样的文件,创建 ninja 的构建文件,然后运行 `ninja`: + +``` +with open('build.ninja', 'w') as ninja_file: + # write some rules + ninja_file.write(""" +rule svg2pdf + command = inkscape $in --export-text-to-path --export-pdf=$out + description = svg2pdf $in $out +""") + + # some for loop with every file I need to build + for filename in things_to_convert: + ninja_file.write(f""" +build {filename.replace('svg', 'pdf')}: svg2pdf {filename} +""") + +# run ninja +import subprocess +subprocess.check_call(['ninja']) +``` + +我相信有一堆 `ninja` 的最佳实践,但我不知道。对于我的小项目而言,我发现它很好用。 + +### meson 是一个生成 ninja 文件的构建系统 + +我对 [Meson][4] 还不太了解,但最近我在构建一个 C 程序 ([plocate][5],一个比 `locate` 更快的替代方案)时,我注意到它有不同的构建说明,而不是通常的 `./configure; make; make install`: + +``` +meson builddir +cd builddir +ninja +``` + +看起来 Meson 是一个可以用 ninja 作为后端的 C/C++/Java/Rust/Fortran 构建系统。 + +### 就是这些! + +我使用 ninja 已经有几个月了。我真的很喜欢它,而且它几乎没有给我带来让人头疼的构建问题,这让我感觉非常神奇。 + +-------------------------------------------------------------------------------- + +via: https://jvns.ca/blog/2020/10/26/ninja--a-simple-way-to-do-builds/ + +作者:[Julia Evans][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://jvns.ca/ +[b]: https://github.com/lujun9972 +[1]: https://ninja-build.org/ +[2]: https://ninja-build.org/manual.html +[3]: http://neugierig.org/software/chromium/notes/2011/02/ninja.html +[4]: https://mesonbuild.com/Tutorial.html +[5]: https://blog.sesse.net/blog/tech/2020-09-28-00-37_introducing_plocate diff --git a/published/202011/20201027 KDE Neon vs Kubuntu- What-s the Difference Between the Two KDE Distribution.md b/published/202011/20201027 KDE Neon vs Kubuntu- What-s the Difference Between the Two KDE Distribution.md new file mode 100644 index 0000000000..79b0f00628 --- /dev/null +++ b/published/202011/20201027 KDE Neon vs Kubuntu- What-s the Difference Between the Two KDE Distribution.md @@ -0,0 +1,117 @@ +[#]: collector: (lujun9972) +[#]: translator: (geekpi) +[#]: reviewer: (wxy) +[#]: publisher: (wxy) +[#]: url: (https://linux.cn/article-12834-1.html) +[#]: subject: (KDE Neon vs Kubuntu: What’s the Difference Between the Two KDE Distribution?) +[#]: via: (https://itsfoss.com/kde-neon-vs-kubuntu/) +[#]: author: (Ankush Das https://itsfoss.com/author/ankush/) + +KDE Neon vs Kubuntu:这两款 KDE 发行版有什么区别? +====== + +当你发现两款基于 [Ubuntu][1] 并由 [KDE][2] 驱动的 Linux 发行版,你会选择哪一个? + + * [Kubuntu][3] 是 Ubuntu 的官方 KDE 版本。 + * [KDE Neon][4] 是 KDE 自己发布的基于 Ubuntu 的发行版。 + +我知道这常常会让人感到困惑,尤其是当你从来没有使用过这两个版本,但有人推荐你使用它们。因此,为了帮助你做出决定,我想整理一份 KDE Neon 和 Kubuntu 的区别(和相似之处)。 + +让我们先开始了解相似之处,然后再继续了解不同之处。 + +注:根据你的系统,你对这两个发行版的体验可能有所不同。所以,请把这篇文章作为一个参考,而不是一个”哪个更好“的比较。 + +### KDE Neon vs Kubuntu:功能上的比较 + +![][5] + +基于相似性比较发行版是一个不错的做法。所以,从理论上,我试图把最重要的区别写下来。 + +然而,值得注意的是,发行版的兼容性、性能和稳定性会根据你的硬件而有所不同,而这里没有考虑到这一点。 + +#### Ubuntu 作为基础 + +![][6] + +是的,这两个 Linux 发行版都是基于 Ubuntu 的,但 KDE Neon 只基于最新的 Ubuntu LTS 版本,而 Kubuntu 则提供了基于 Ubuntu LTS 的版本和非 LTS 版本。 + +所以,如果使用 KDE Neon,你可以期望在下一个 Ubuntu LTS 版本(每 2 年)的几个月后就能用上最新的 Ubuntu 功能。但是,对于 Kubuntu 来说,你可以选择一个非 LTS 版本,并尝试使用带有 6 个月的软件更新的最新 Ubuntu 版本。 + +KDE Neon 确实提供了测试版和开发者版,但这些都是为了测试预发布的 KDE 软件而提供的。 + +#### KDE Plasma 桌面 + +![][7] + +尽管这两个发行版都采用了 KDE plasma 桌面,而且你可以获得相同程度的定制,但 KDE Neon 会首先获得最新的 KDE Plasma 桌面。 + +如果你还不知道,KDE Neon 是由 KDE 官方团队开发的,由 Jonathan Riddell(Kubuntu 创始人)在[被 Canonical 强制赶出 Kubuntu][8] 后宣布的。 + +所以,不仅限于最新的 Plasma 桌面,如果你想尽快获得最新最好的 KDE,KDE Neon 是最佳选择。 + +Kubuntu 最终会得到更新的 KDE 软件的更新,但这需要时间。如果你不太确定需要最新的 KDE 软件/桌面,而只是需要一个稳定的 KDE 系统,你应该选择 Kubuntu LTS 版本。 + +#### 预装软件 + +开箱即用,你会发现 Kubuntu 已经预装了一些必要的工具和应用程序,但是,对于 KDE Neon,你需要找到并安装一些应用和工具。 + +从某些方面看,与 Kubuntu 相比,KDE Neon 可能是一个轻量级的发行版。然而,对于新的 Linux 用户来说,他们可能会发现 Kubuntu 是一个易于使用的体验,并预装了更多必要的软件和工具。 + +#### 软件更新 + +如果你没有使用按流量计费的连接,这可能根本不重要。但是,我应该提一下,考虑到常规的 Ubuntu LTS 修复/更新以及 KDE 软件更新,KDE Neon 会有更多的软件更新。 + +对于 Kubuntu,你只会得到 Ubuntu LTS 的更新(除非你使用的是非 LTS 版本)。所以,从技术上讲,你会有更少的更新数量。 + +#### Ubuntu KDE 版与 Plasma 的体验差异 + +![][11] + +我知道如果你没有尝试过这两个版本,你可能会认为它们很相似。但是,Kubuntu 是 Ubuntu 的官方版本,它更注重 Ubuntu 在 KDE 桌面环境上的使用体验。 + +而 KDE Neon 在技术上是一样的,但它的目的是为了获得一流的 Plasma 桌面体验,并搭载最新的东西。 + +尽管这两个发行版开箱即可完美工作,但它们有不同的愿景和相应的开发工作。你只需要决定你自己想要什么,然后选择其中之一。 + +#### 硬件兼容性 + +![Kubuntu Focus Laptop][12] + +正如我前面提到的,这不是一个基于事实的观点。但是,根据我在网上快速了解用户分享的反馈或经验,似乎 Kubuntu 可以与各种旧硬件以及新硬件(可能追溯到 2012 年)一起工作,而 KDE Neon 可能不能。 + +只需要记住,如果你尝试 KDE Neon,但由于某些原因不能工作。你知道该怎么做。 + +### 总结 + +那么,你会选择哪个呢?KDE Neon 还是 Kubuntu?这完全是你的选择。 + +两者都是[初学者友好的 Linux 发行版][13]的不错选择,但如果你想要最新的 KDE Plasma 桌面,KDE Neon 会更有优势。你可以在我们的 [KDE Neon 评测][10]中阅读更多关于它的内容。 + +欢迎在下面的评论中告诉我你的想法,你觉得它们中的任何一个有什么好的/坏的地方。 + +-------------------------------------------------------------------------------- + +via: https://itsfoss.com/kde-neon-vs-kubuntu/ + +作者:[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://ubuntu.com/ +[2]: https://kde.org/ +[3]: https://kubuntu.org +[4]: https://neon.kde.org +[5]: https://i1.wp.com/itsfoss.com/wp-content/uploads/2020/10/kde-neon-vs-kubuntu.png?resize=800%2C450&ssl=1 +[6]: https://i1.wp.com/itsfoss.com/wp-content/uploads/2020/01/install_ubuntu_8.jpg?resize=796%2C611&ssl=1 +[7]: https://i2.wp.com/itsfoss.com/wp-content/uploads/2020/10/kde-plasma-5-20-feat.png?resize=800%2C394&ssl=1 +[8]: https://lwn.net/Articles/645973/ +[9]: https://i2.wp.com/itsfoss.com/wp-content/uploads/2020/08/kde-neon-review.jpg?fit=800%2C450&ssl=1 +[10]: https://itsfoss.com/kde-neon-review/ +[11]: https://i0.wp.com/itsfoss.com/wp-content/uploads/2020/01/kubuntu-kde.jpg?resize=800%2C450&ssl=1 +[12]: https://i0.wp.com/itsfoss.com/wp-content/uploads/2020/01/kubuntu-focus-laptop.jpg?resize=800%2C600&ssl=1 +[13]: https://itsfoss.com/best-linux-beginners/ diff --git a/published/202011/20201027 You can Surf Internet in Linux Terminal With These Command Line Browsers.md b/published/202011/20201027 You can Surf Internet in Linux Terminal With These Command Line Browsers.md new file mode 100644 index 0000000000..54811507c5 --- /dev/null +++ b/published/202011/20201027 You can Surf Internet in Linux Terminal With These Command Line Browsers.md @@ -0,0 +1,172 @@ +[#]: collector: (lujun9972) +[#]: translator: (wxy) +[#]: reviewer: (wxy) +[#]: publisher: (wxy) +[#]: url: (https://linux.cn/article-12850-1.html) +[#]: subject: (You can Surf Internet in Linux Terminal With These Command Line Browsers) +[#]: via: (https://itsfoss.com/terminal-web-browsers/) +[#]: author: (Ankush Das https://itsfoss.com/author/ankush/) + +使用命令行浏览器在 Linux 终端上网浏览 +====== + +![](https://img.linux.net.cn/data/attachment/album/202011/22/212007f9s7aabmcj4aa9lo.jpg) + +我猜你阅读这篇文章可能是用 Firefox 或基于 Chrome 的浏览器(如 [Brave][1]),或者,也可能是 Chrome 浏览器或 [Chromium][2]。 + +换句话说,你正在利用基于 GUI 的方式浏览网页。然而,在以前,人们使用终端来获取资源和浏览网页,因为所有的东西大多是基于文本的。 + +虽然现在不能从终端上获取每个信息,但对于一些文本信息,还是可以尝试使用命令行浏览器,从 Linux 终端上打开网页。 + +不仅如此,如果你访问的是远程服务器,或者只有一个没有 GUI 的终端,终端网页浏览器就可以发挥用处了。 + +因此,在本文中,我将介绍一些基于终端的 Web 浏览器,你可以在 Linux 上尝试它们。 + +### Linux 用户的最佳终端 Web 浏览器 + +注:此榜单排名不分先后。 + +#### 1、W3M + +![][3] + +`w3m` 是一个流行的基于文本的开源终端 Web 浏览器。尽管其初始项目已经不再活跃,但另一个开发者 Tatsuya Kinoshita 正在维护着它的一个活跃分支。 + +`w3m` 相当简单,支持 SSL 连接、色彩,也支持内嵌图片。当然,根据你试图访问的资源,你那边的情况可能会有所不同。根据我的简单测试,它似乎无法加载 [DuckDuckGo][4],但我可以[在终端中使用 Google][5]就够了。 + +安装后,你可以简单的在终端中输入 `w3m` 以得到帮助。如果你感兴趣的话,也可以到 [GitHub][6] 上去查看它的仓库。 + +**如何安装和使用 w3m?** + +`w3m` 在任何基于 Debian 的 Linux 发行版的默认仓库中都是可用的。如果你有一个基于 Arch 的发行版,但没有直接可用的软件包,你可能需要查看一下 [AUR][7]。 + +对于 Ubuntu,你可以通过键入以下内容来安装它: + +``` +sudo apt install w3m w3m-img +``` + +在这里,我们将 w3m 包和图片扩展一起安装,以支持内嵌图片。接下来,要开始安装,你只需要按照下面的命令进行操作即可: + +``` +w3m xyz.com +``` + +当然,你需要将 `xyz.com` 替换成任何你想浏览或测试的网站。最后,你应该知道,你可以使用键盘上的方向键来导航,当你想采取一个动作时,按回车键。 + +要退出,你可以按 `SHIFT+Q`,返回上一页是 `SHIFT+B`。其他快捷键包括用 `SHIFT+T` 打开新标签页和用 `SHIFT+U` 打开新的 URL。 + +你可以通过访问它的手册页来了解更多信息。 + +#### 2、Lynx + +![][8] + +Lynx 是另一个开源的命令行浏览器,你可以试试。幸运的是,很多的网站在使用 Lynx 时往往能正常工作,所以我说它在这方面肯定更好。我能够加载 DuckDuckGo,并使其工作。 + +除此之外,我还注意到它可以让你在访问各种 Web 资源时接受或拒绝 cookie。你也可以将它设置为总是接受或拒绝。所以,这是件好事。 + +另一方面,在终端上使用时,窗口不能很好地调整大小。我还没有寻找到任何解决方法,所以如果你正在尝试这个,你可能会想要这样做。不论如何,它都很好用,当你在终端启动它时,你会得到所有键盘快捷键的说明。 + +请注意,它与系统终端主题不匹配,所以无论你的终端看起来如何,它都会看起来不同。 + +**如何安装 Lynx?** + +与 w3m 不同的是,如果你有兴趣尝试的话,确实可以找到一些 Win32 上的安装程序。不过,在 Linux 上,它在大多数的默认仓库中都是可用的。 + +对于 Ubuntu 来说,你只需要输入: + +``` +sudo apt install lynx +``` + +要想使用,你只需要按照下面的命令进行操作: + +``` +lynx examplewebsite.com +``` + +在这里,你只需要将示例网站替换成你想要访问的资源即可。 + +如果你想找其他 Linux 发行版的软件包,可以查看他们的[官网资源][9]。 + +#### 3、Links2 + +![][10] + +Links2 是一款有趣的基于文本的浏览器,你可以在你的终端上轻松使用,用户体验良好。它提供了一个很好的界面,你启动它后,只要输入网址就可以了。 + +![][11] + +值得注意的是,主题将取决于你的终端设置,我设置为“黑绿色”主题,因此你看到的就是这个。当你以命令行浏览器的方式启动它后,你只需要按任意键就会出现 URL 提示,或者按 `Q` 键退出。它相当好用,可以渲染大多数网站的文字。 + +与 Lynx 不同的是,你没有接受或拒绝 cookie 的功能。除此之外,它似乎工作的还不错。 + +**如何安装 Links2?** + +正如你所期望的,你会发现它在大多数默认的仓库中都有。对于 Ubuntu,你可以在终端输入以下命令来安装它: + +``` +sudo apt install links2 +``` + +如果你想在其他 Linux 发行版上安装它,你可以参考它的[官方网站][12]获取软件包或文档。 + +#### 4、eLinks + +![][13] + +eLinks 类似于 Links2,但它已经不再维护了。你仍然可以在各种发行版的默认仓库中找到它,因此,我把它保留在这个列表中。 + +它不会与你的系统终端主题相融合。所以,如果你需要的话,作为一个没有“黑暗”模式的文本型浏览器,这可能不是一个漂亮的体验。 + +**如何安装 eLinks?** + +在 Ubuntu 上,安装它很容易。你只需要在终端中输入以下内容: + +``` +sudo apt install elinks +``` + +对于其他 Linux 发行版,你应该可以在标准软件仓库中找到它。但是,如果你在软件仓库中找不到它,你可以参考[官方安装说明][14]。 + +### 总结 + +在终端上运行的基于文本的 Web 浏览器并不多,这并不奇怪。一些项目,如 [Browsh][15],试图呈现一个现代的 Linux 命令行浏览器,但在我这里它不能工作。 + +虽然像 `curl` 和 `wget` 这样的工具允许你[从 Linux 命令行下载文件][16],但这些基于终端的 Web 浏览器提供了额外的功能。 + +除了命令行浏览器之外,如果你想在终端上玩玩,也可以尝试一些[Linux 命令行游戏][17]。 + +对于 Linux 终端上的文本型 Web 浏览器,你有什么看法?欢迎在下面的评论中告诉我你的想法。 + +-------------------------------------------------------------------------------- + +via: https://itsfoss.com/terminal-web-browsers/ + +作者:[Ankush Das][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://itsfoss.com/author/ankush/ +[b]: https://github.com/lujun9972 +[1]: https://itsfoss.com/brave-web-browser/ +[2]: https://itsfoss.com/install-chromium-ubuntu/ +[3]: https://i0.wp.com/itsfoss.com/wp-content/uploads/2020/10/w3m-google.jpg +[4]: https://duckduckgo.com/ +[5]: https://itsfoss.com/review-googler-linux/ +[6]: https://github.com/tats/w3m +[7]: https://itsfoss.com/aur-arch-linux/ +[8]: https://i0.wp.com/itsfoss.com/wp-content/uploads/2020/10/lynx-terminal.jpg +[9]: https://lynx.invisible-island.net/lynx-resources.html +[10]: https://i1.wp.com/itsfoss.com/wp-content/uploads/2020/10/links2-terminal.jpg +[11]: https://i2.wp.com/itsfoss.com/wp-content/uploads/2020/10/links2-terminal-welcome.jpg +[12]: http://links.twibright.com/download.php +[13]: https://i2.wp.com/itsfoss.com/wp-content/uploads/2020/10/elinks-terminal.jpg +[14]: http://elinks.or.cz/documentation/installation.html +[15]: https://www.brow.sh/ +[16]: https://itsfoss.com/download-files-from-linux-terminal/ +[17]: https://itsfoss.com/best-command-line-games-linux/ diff --git a/published/202011/20201028 5 new sudo features you need to know in 2020.md b/published/202011/20201028 5 new sudo features you need to know in 2020.md new file mode 100644 index 0000000000..8472f95e4c --- /dev/null +++ b/published/202011/20201028 5 new sudo features you need to know in 2020.md @@ -0,0 +1,126 @@ +[#]: collector: (lujun9972) +[#]: translator: (wxy) +[#]: reviewer: (wxy) +[#]: publisher: (wxy) +[#]: url: (https://linux.cn/article-12865-1.html) +[#]: subject: (5 new sudo features you need to know in 2020) +[#]: via: (https://opensource.com/article/20/10/sudo-19) +[#]: author: (Peter Czanik https://opensource.com/users/czanik) + +2020 年 5 个新 sudo 功能 +====== + +> 从集中会话记录、chroot 支持到 Python API,sudo 1.9 提供了许多新功能。 + +![](https://img.linux.net.cn/data/attachment/album/202011/28/143544x5cdcxzf9dcujdng.jpg) + +当你想在 [POSIX 系统][2]上执行一个操作时,最安全的方法之一就是使用 `sudo` 命令。与以 root 用户身份登录并执行命令可能是个危险的操作不同,`sudo` 授予任何被系统管理员[指定为 “sudoer”][3]的用户临时权限,来执行通常受限制的活动。 + +几十年来,这个系统帮助 Linux、Unix 和 macOS 系统免受愚蠢的错误和恶意攻击,它是当今所有主要 Linux 发行版的默认管理机制。 + +当在 2020 年 5 月发布 sudo 1.9 时,它带来了许多新功能,包括集中收集会话记录,支持 `sudo` 内的 chroot,以及 Python API。如果你对其中的任何一项感到惊讶,请阅读我的文章,了解一些 [sudo 鲜为人知的功能][4]。 + +`sudo` 不仅仅是一个管理命令的前缀。你可以微调权限,记录终端上发生的事情,使用插件扩展`sudo`,在 LDAP 中存储配置,进行广泛的日志记录,以及更多。 + +1.9.0 版本和后续的小版本增加了各种新功能(我将在下面介绍),包括: + + * 一个集中收集 `sudo` 会话记录的记录服务 + * 审计插件 API + * 审批插件 API + * Python 对插件的支持 + * `sudo` 内置 chroot 和 CWD 支持(从 1.9.3 开始) + +### 哪里可以得到 sudo 1.9? + +大多数的 Linux 发行版仍然封装了上一代的 `sudo`(1.8 版本),并且在长期支持(LTS)的发行版中会保持这个版本数年。据我所知,提供了最完整的 sudo 1.9 包的 Linux 发行版是 openSUSE[Tumbleweed][5],它是一个滚动发行版,而且该 `sudo` 包的子包中有 Python 支持。最近的 [Fedora][6] 版本包含了 sudo 1.9,但没有 Python 支持。[FreeBSD Ports][7] 有最新的 `sudo` 版本,如果你自己编译 `sudo` 而不是使用软件包,你可以启用 Python 支持。 + +如果你喜欢的 Linux 发行版还没有包含 sudo 1.9,请查看 [sudo 二进制页面][8]来查看是否有现成的包可以用于你的系统。这个页面还提供了一些商用 Unix 变种的软件包。 + +像往常一样,在你开始试验 `sudo` 设置之前,*确保你知道 root 密码*。是的,即使在 Ubuntu 上也是如此。有一个临时的“后门”是很重要的;如果没有这个后门,如果出了问题,你就必须得黑掉自己的系统。记住:语法正确的配置并不意味着每个人都可以在该系统上通过 `sudo` 做任何事情! + +### 记录服务 + +记录服务可以集中收集会话记录。与本地会话记录存储相比,这有很多优势: + + * 更方便地在一个地方进行搜索,而不是访问各个机器来寻找记录 + * 即使在发送机器停机的情况下也可以进行记录 + * 本地用户若想掩盖其轨迹,不能删除记录 + +为了快速测试,你可以通过非加密连接向记录服务发送会话。我的博客中包含了[说明][9],可以在几分钟内完成设置。对于生产环境,我建议使用加密连接。有很多可能性,所以请阅读最适合你的环境的[文档][10]。 + +### 审计插件 API + +新的审计插件 API 不是一个用户可见的功能。换句话说,你不能从 `sudoers` 文件中配置它。它是一个 API,意味着你可以从插件中访问审计信息,包括用 Python 编写的插件。你可以用很多不同的方式来使用它,比如当一些有趣的事情发生时,从 `sudo` 直接发送事件到 Elasticsearch 或日志即服务(LaaS)上。你也可以用它来进行调试,并以任何你喜欢的格式将其他难以访问的信息打印到屏幕上。 + +根据你使用它的方式,你可以在 `sudo` 插件手册页(针对 C 语言)和 `sudo` Python 插件手册中找到它的文档。在 `sudo` 源代码中可以找到 [Python 代码示例][11],在我的博客上也有一个[简化的例子][12]。 + +### 审批插件 API + +审批插件 API 可以在命令执行之前加入额外的限制。这些限制只有在策略插件成功后才会运行,因此你可以有效地添加额外的策略层,而无需更换策略插件,进而无需更换 `sudoers`。可以定义多个审批插件,而且所有插件都必须成功,命令才能执行。 + +与审计插件 API 一样,你可以从 C 和 Python 中使用它。我博客上记录的[示例 Python 代码][13]是对该 API 的一个很好的介绍。一旦你理解了它是如何工作的,你就可以扩展它来将 `sudo` 连接到工单系统,并且只批准有相关开放工单的会话。你也可以连接到人力资源数据库,这样只有当班的工程师才能获得管理权限。 + +### Python 对插件的支持 + +尽管我不是程序员,但我最喜欢的 sudo 1.9 新特性是 Python 对插件的支持。你可以用 Python 也能使用 C 语言调用大部分 API。幸运的是,`sudo` 对性能不敏感,所以运行速度相对较慢的 Python 代码对 `sudo` 来说不是问题。使用 Python 来扩展 `sudo` 有很多优势: + + * 更简单、更快速的开发 + * 不需要编译;甚至可以通过配置管理分发代码 + * 许多 API 没有现成的 C 客户端,但有 Python 代码 + +除了审计和审批插件 API 之外,还有一些其他的 API,你可以用它们做一些非常有趣的事情。 + +通过使用策略插件 API,你可以取代 `sudo` 策略引擎。请注意,你将失去大部分的 `sudo` 功能,而且没有基于 `sudoers` 的配置。这在小众情况下还是很有用的,但大多数时候,最好还是继续使用 `sudoers`,并使用审批插件 API 创建额外的策略。如果你想尝试一下,我的 [Python 插件介绍][14]提供了一个非常简单的策略:只允许使用 `id` 命令。再次确认你知道 root 密码,因为一旦启用这个策略,它就会阻止任何实际使用 `sudo` 的行为。 + +使用 I/O 日志 API,你可以访问用户会话的输入和输出。这意味着你可以分析会话中发生了什么,甚至在发现可疑情况时终止会话。这个 API 有很多可能的用途,比如防止数据泄露。你可以监控屏幕上的关键字,如果数据流中出现任何关键字,你可以在关键字出现在用户的屏幕上之前中断连接。另一种可能是检查用户正在输入的内容,并使用这些数据来重建用户正在输入的命令行。例如,如果用户输入 `rm -fr /`,你可以在按下回车键之前就断开用户的连接。 + +组插件 API 允许非 Unix 组的查找。在某种程度上,这与审批插件 API 类似,因为它也扩展了策略插件。你可以检查一个用户是否属于一个给定的组,并在后面的配置部分基于此采取行动。 + +### chroot 和 CWD 支持 + +`sudo` 的最新功能是支持 chroot 和改变工作目录(CWD),这两个选项都不是默认启用的,你需要在 `sudoers` 文件中明确启用它们。当它们被启用时,你可以调整目标目录或允许用户指定使用哪个目录。日志反映了这些设置何时被使用。 + +在大多数系统中,chroot 只对 root 用户开放。如果你的某个用户需要 chroot,你需要给他们 root 权限,这比仅仅给他们 chroot 权限要大得多。另外,你可以通过 `sudo` 允许访问 chroot 命令,但它仍然允许漏洞,他们可以获得完全的权限。当你使用 `sudo` 内置的 chroot 支持时,你可以轻松地限制对单个目录的访问。你也可以让用户灵活地指定根目录。当然,这可能会导致灾难(例如,`sudo --chroot / -s`),但至少事件会被记录下来。 + +当你通过 `sudo` 运行一个命令时,它会将工作目录设置为当前目录。这是预期的行为,但可能有一些情况下,命令需要在不同的目录下运行。例如,我记得使用过一个应用程序,它通过检查我的工作目录是否是 `/root` 来检查我的权限。 + +### 尝试新功能 + +希望这篇文章能启发你仔细研究一下 sudo 1.9。集中会话记录比在本地存储会话日志更加方便和安全。chroot 和 CWD 支持为你提供了额外的安全性和灵活性。而使用 Python 来扩展 `sudo`,可以很容易地根据你的环境来定制 `sudo`。你可以通过使用最新的 Linux 发行版或 `sudo` 网站上的即用型软件包来尝试这些新功能。 + +如果你想了解更多关于 sudo 的信息,这里有一些资源: + + * [Sudo 官网][15] + * [Sudo 博客][16] + * [Sudo on Twitter][17] + +-------------------------------------------------------------------------------- + +via: https://opensource.com/article/20/10/sudo-19 + +作者:[Peter Czanik][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/czanik +[b]: https://github.com/lujun9972 +[1]: https://opensource.com/sites/default/files/styles/image-full-size/public/lead-images/tools_osyearbook2016_sysadmin_cc.png?itok=Y1AHCKI4 (Wratchet set tools) +[2]: https://opensource.com/article/19/7/what-posix-richard-stallman-explains +[3]: https://opensource.com/article/17/12/using-sudo-delegate +[4]: https://opensource.com/article/19/10/know-about-sudo +[5]: https://software.opensuse.org/distributions/tumbleweed +[6]: https://getfedora.org/ +[7]: https://www.freebsd.org/ports/ +[8]: https://www.sudo.ws/download.html#binary +[9]: https://blog.sudo.ws/posts/2020/03/whats-new-in-sudo-1.9-recording-service/ +[10]: https://www.sudo.ws/man/sudo_logsrvd.man.html#EXAMPLES +[11]: https://github.com/sudo-project/sudo/blob/master/plugins/python/example_audit_plugin.py +[12]: https://blog.sudo.ws/posts/2020/06/sudo-1.9-using-the-new-audit-api-from-python/ +[13]: https://blog.sudo.ws/posts/2020/08/sudo-1.9-using-the-new-approval-api-from-python/ +[14]: https://blog.sudo.ws/posts/2020/01/whats-new-in-sudo-1.9-python/ +[15]: https://www.sudo.ws/ +[16]: https://blog.sudo.ws/ +[17]: https://twitter.com/sudoproject diff --git a/published/202011/20201028 How JavaScript became a serious programming language.md b/published/202011/20201028 How JavaScript became a serious programming language.md new file mode 100644 index 0000000000..3b6b15fd92 --- /dev/null +++ b/published/202011/20201028 How JavaScript became a serious programming language.md @@ -0,0 +1,82 @@ +[#]: collector: (lujun9972) +[#]: translator: (wxy) +[#]: reviewer: (wxy) +[#]: publisher: (wxy) +[#]: url: (https://linux.cn/article-12813-1.html) +[#]: subject: (How JavaScript became a serious programming language) +[#]: via: (https://opensource.com/article/20/10/history-javascript) +[#]: author: (Nimisha Mukherjee https://opensource.com/users/nimisha) + +JavaScript 是如何成为一门严肃的编程语言的 +====== + +> 从最开始作为一种使网站变得漂亮的方式,JavaScript 已转变为一种严肃的编程语言。 + +![](https://img.linux.net.cn/data/attachment/album/202011/12/010945vezib4p1b1ti6pjt.jpg) + +JavaScript 的卑微起步始于 1995 年,是由当时在 Netscape 通信公司工作的 Brendan Eich [在短短 10 天内创建的][2]。从那时起,JavaScript 已经走过了漫长的道路,从一个让网站变得漂亮的工具变成了一种严肃的编程语言。 + +在其早期,JavaScript 被认为是一种视觉工具,它使网站变得更有趣和更有吸引力。像 [Jakarta Server Pages][3](即 JSP,以前称作 JavaServer Pages)这样的语言曾经用来完成渲染网页的繁重工作,而 JavaScript 则被用来创建基本的交互、视觉增强和动画。 + +长期以来,HTML、CSS 和 JavaScript 之间的分界并不明确。前端开发主要由 HTML、CSS 和 JavaScript 组成,形成了标准 Web 技术的“[多层蛋糕][4]”。 + +![标准 Web 技术的多层蛋糕][5] + +*标准网络技术的“[多层蛋糕][4]”(Mozilla 开发者网络,[CC BY-SA 4.0][6])* + +HTML 和 CSS 为内容提供结构、格式和样式。一旦网页要做一些超越了显示静态内容的事情,就是 JavaScript 的用武之地。Ecma 国际部开发了 JavaScript 规范,万维网联盟World Wide Web Consortium(W3C)开发了 HTML 和 CSS 规范。 + +### JavaScript 是如何获得突出地位的 + +JavaScript 是如何成为[最受欢迎的][8]编程语言的,背后有一段漫长的[历史][7]。早在 20 世纪 90 年代,Java 是王者,不可避免的人们会与它进行比较。许多工程师认为 JavaScript 不是一门好的编程语言,因为它缺乏对面向对象编程的支持。尽管当时并不明显,但其实 JavaScript 的对象模型和功能特性在其第一个版本中就已经出现了。 + +1995 年 JavaScript 匆匆发布后,网景公司将其提交给了欧洲计算机制造商协会European Computer Manufacturers Association(ECMA)国际部进行标准化。由此产生了 [ECMAScript][9],这是一个 JavaScript 标准,旨在确保不同 Web 浏览器之间网页的互操作性。ECMAScript 1 于 1997 年 6 月问世,帮助推进了 JavaScript 的标准化。 + +在此期间,PHP 和 JSP 成为了服务器端编程语言的流行选择。JSP 作为通用网关接口Common Gateway Interface([CGI][10])的首选替代方案获得了突出的地位,因为它可以在 HTML 中嵌入 Java 代码。虽然它很受欢迎,但开发人员发现将 Java 嵌入 HTML 中是不自然的。此外,即使是 HTML 上最简单的文本变化,JSP 也必须经历一个耗时的生命周期。在今天的微服务世界里,面向 JSP 的页面被认为是技术债务。  + +[PHP][11] 的工作原理与 JSP 类似,但 PHP 代码以一个通用网关接口([CGI][10])的可执行文件来处理。基于 PHP 的 Web 应用比基于 JSP 的应用更容易部署。总的来说,使用 PHP 更容易上手和运行。今天,PHP 和 JavaScript 是创建动态网站最流行的组合之一:PHP 作为服务器端脚本,JavaScript 作为客户端脚本。 + +伴随着 2006 年 [jQuery][12] 的发布,JavaScript 的应用越来越多。jQuery 是一个多用途的 JavaScript 库,简化了繁琐的文档对象模型Document Object Model(DOM)管理、事件处理和 [Ajax][13]。  + +2009 年 [Node.js][14] 的发布是 JavaScript 发展的转折点。开发者现在可以用 JavaScript 编写服务器端脚本了。紧随其后的是 2010 年发布的 [Backbone.js][15] 和 [AngularJS][16] 等框架。这导致了出现了使用单一语言进行全栈开发的概念。 + +2015 年,Ecma 国际部发布了 ECMAScript 6(ES6),它为编写复杂的应用程序增加了包括类声明在内的重要新语法。其他新特性还包括迭代器、箭头函数表达式、`let` 和 `const` 关键字、类型化数组、新的集合(映射、集合和 WeakMap)、Promise、字符串的模板字元以及许多其它很酷的特性。后来的版本又继续增加了更多的功能,使 JavaScript 更加强大、精简和可靠。 + +### 总结 + +在过去的 20 年里,JavaScript 有了长足的进步。现在大多数浏览器都在争相满足合规性,因此最新的规范推出得更快。 + +根据你的项目需求,有大量稳定的 JavaScript 框架可供选择,包括最流行的 [React][17]、[Angular][18] 和 [Vue.js][19] 等等。在本系列的下一篇文章中,我将深入探讨为什么 JavaScript 如此受欢迎。 + +-------------------------------------------------------------------------------- + +via: https://opensource.com/article/20/10/history-javascript + +作者:[Nimisha Mukherjee][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/nimisha +[b]: https://github.com/lujun9972 +[1]: https://opensource.com/sites/default/files/styles/image-full-size/public/lead-images/code_javascript.jpg?itok=60evKmGl (Javascript code close-up with neon graphic overlay) +[2]: https://en.wikipedia.org/wiki/JavaScript +[3]: https://en.wikipedia.org/wiki/Jakarta_Server_Pages +[4]: https://developer.mozilla.org/en-US/docs/Learn/JavaScript/First_steps/What_is_JavaScript +[5]: https://opensource.com/sites/default/files/uploads/layercakewebtech.png (Layer cake of standard web technologies) +[6]: https://creativecommons.org/licenses/by-sa/4.0/ +[7]: https://blog.logrocket.com/history-of-frontend-frameworks/ +[8]: https://octoverse.github.com/ +[9]: https://en.wikipedia.org/wiki/ECMAScript +[10]: https://en.wikipedia.org/wiki/Common_Gateway_Interface +[11]: https://en.wikipedia.org/wiki/PHP#:~:text=PHP%20development%20began%20in%201994,Interpreter%22%20or%20PHP%2FFI. +[12]: https://en.wikipedia.org/wiki/JQuery +[13]: https://en.wikipedia.org/wiki/Ajax_(programming) +[14]: https://en.wikipedia.org/wiki/Node.js +[15]: https://en.wikipedia.org/wiki/Backbone.js +[16]: https://en.wikipedia.org/wiki/AngularJS +[17]: https://reactjs.org/ +[18]: https://angular.io/ +[19]: https://vuejs.org/ diff --git a/published/202011/20201028 How to Clear Terminal Screen in Ubuntu and Other Linux Distributions -Beginner-s Tip.md b/published/202011/20201028 How to Clear Terminal Screen in Ubuntu and Other Linux Distributions -Beginner-s Tip.md new file mode 100644 index 0000000000..bb5988667c --- /dev/null +++ b/published/202011/20201028 How to Clear Terminal Screen in Ubuntu and Other Linux Distributions -Beginner-s Tip.md @@ -0,0 +1,87 @@ +[#]: collector: (lujun9972) +[#]: translator: (geekpi) +[#]: reviewer: (wxy) +[#]: publisher: (wxy) +[#]: url: (https://linux.cn/article-12806-1.html) +[#]: subject: (How to Clear Terminal Screen in Ubuntu and Other Linux Distributions [Beginner’s Tip]) +[#]: via: (https://itsfoss.com/clear-terminal-ubuntu/) +[#]: author: (Abhishek Prakash https://itsfoss.com/author/abhishek/) + +如何清除 Ubuntu 和其他 Linux 发行版的终端屏幕 +====== + +![][2] + +在终端上工作时,通常会发现终端屏幕上显示了太多的命令及其输出。 + +你可能需要清除终端屏幕并专注于要执行的下一个任务。相信我,清除 Linux 终端屏幕会很有帮助。 + +### 使用 clear 命令清除 Linux 终端 + +那么,如何清除 Linux 中的终端?最简单,最常见的方法是使用 `clear` 命令: + +``` +clear +``` + +`clear` 命令无需选项。就是这么简单,但是你还需要了解其他一些内容。 + +![][1] + +`clear` 命令和其他清除屏幕的方法可能取决于你使用的终端模拟器。终端模拟器是用于访问 Linux Shell(命令行)的终端应用。 + +如果你在带有 GNOME 终端的 Ubuntu 上使用 `clear` 命令,它将清除屏幕,并且你将无法看到之前屏幕上的内容。 + +在许多其他终端模拟器或 Putty 中,它可能只清除一页屏幕。如果使用鼠标或 `PageUp` 和 `PageDown` 键滚动,那么仍然可以看到以前的屏幕输出。 + +坦白说,这取决于你的需要。如果你突然意识到需要引用以前运行的命令的输出,那么也许可以使用该方式。 + +### 在 Linux 中清除终端屏幕的其他方法 + +`clear` 命令不是清除终端屏幕的唯一方法。 + +你可以在 Linux 中使用 `Ctrl+L` [键盘快捷键][3]来清除屏幕。它适用于大多数终端模拟器。 + +``` +Ctrl+L +``` + +如果你在 GNOME 终端(Ubuntu 中默认)中使用 `Ctrl+L` 和 `clear` 命令,那么你会注意到它们的影响有所不同。`Ctrl+L` 将屏幕向下移动一页,给人一种干净的错觉,但是你仍然可以通过向上滚动来访问命令输出历史。 + +**某些其他终端模拟器将此键盘快捷键设置为 `Ctrl+Shift+K`**。 + +你也可以使用 `reset` 命令清除终端屏幕。实际上,此命令执行完整的终端重新初始化。但是,它可能比 `clear` 命令要花费更长的时间。 + +``` +reset +``` + +当你想完全清除屏幕时,还有几种其他复杂的方法可以清除屏幕。但是由于命令有点复杂,所以最好将它作为 [Linux 中的别名][4]: + +``` +alias cls='printf "\033c"' +``` + +你可以将此别名添加到你的 bash 配置文件中,以便作为命令使用。 + +我知道这是一个非常基本的主题,大多数 Linux 用户可能已经知道了,但这对于为新 Linux 用户介绍基本主题并没有什么坏处。是不是? + +在清除终端屏幕上有些秘密提示​​吗?为什么不与我们分享呢? + +-------------------------------------------------------------------------------- + +via: https://itsfoss.com/clear-terminal-ubuntu/ + +作者:[Abhishek Prakash][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/abhishek/ +[b]: https://github.com/lujun9972 +[1]: https://i1.wp.com/itsfoss.com/wp-content/uploads/2020/10/clear-command-linux.gif?resize=800%2C432&ssl=1 +[2]: https://i1.wp.com/itsfoss.com/wp-content/uploads/2020/10/clear-terminal-screen-linux.png?resize=800%2C450&ssl=1 +[3]: https://linuxhandbook.com/linux-shortcuts/ +[4]: https://linuxhandbook.com/linux-alias-command/ diff --git a/published/202011/20201028 What-s new in Fedora 33 Workstation.md b/published/202011/20201028 What-s new in Fedora 33 Workstation.md new file mode 100644 index 0000000000..c4027535d2 --- /dev/null +++ b/published/202011/20201028 What-s new in Fedora 33 Workstation.md @@ -0,0 +1,75 @@ +[#]: collector: (lujun9972) +[#]: translator: (geekpi) +[#]: reviewer: (wxy) +[#]: publisher: (wxy) +[#]: url: (https://linux.cn/article-12801-1.html) +[#]: subject: (What’s new in Fedora 33 Workstation) +[#]: via: (https://fedoramagazine.org/whats-new-fedora-33-workstation/) +[#]: author: (Gregory Bartholomew https://fedoramagazine.org/author/glb/) + +Fedora 33 Workstation 的新功能 +====== + +![][1] + +Fedora 33 Workstation 是我们这个免费的、领先的操作系统的[最新版本][2]。你现在就可以从[官方网站][3]下载它。Fedora 33 Workstation 中有一些新的和值得注意的变化。请阅读如下更多细节。 + +### GNOME 3.38 + +Fedora 33 Workstation 为各类用户提供了最新版本的 GNOME 桌面环境。在 Fedora 33 Workstation 中的 GNOME 3.38 包含了许多更新和改进,包括: + +#### 一个新的 GNOME Tour 应用 + +现在,新用户会看到一个“新的 Tour 应用,重点展示了桌面的主要功能,并为第一次使用 GNOME 的用户提供一个很好的欢迎页”。 + +![The new GNOME Tour application in Fedora 33][4] + +#### 拖动重排序应用 + +GNOME 3.38 用一个单一的可定制的、一致的视图取代了之前分开的“常用”和“所有”应用视图,这允许你重新排列应用并将它们组织到自定义文件夹中。只需点击并拖动即可移动应用。 + +![GNOME 3.38 Drag to Reorder][5] + +#### 改进屏幕录制 + +GNOME Shell 中的屏幕录制基础架构已被改进,以利用 PipeWire 和内核 API。这将有助于减少资源消耗并提高响应速度。 + +GNOME 3.38 还提供了许多额外的功能和改进。查看 [GNOME 3.38 发行说明][6]以获得更多信息。 + +#### B-tree 文件系统 + +正如[之前宣布的][7],新安装的 Fedora 33 将默认使用 [Btrfs][8]。每一个新的内核版本都会为 Btrfs 增加一些特性和增强功能。[变更日志][9]有一个完整的总结,它介绍了每个新内核版本给 Btrfs 带来的功能。 + +#### Swap on ZRAM + +Anaconda 和 Fedora IoT 多年来一直默认使用 swap-on-zram。在 Fedora 33 中,将默认启用 swap-on-zram,而不是交换分区。查看 [Fedora wiki 页面][10]了解更多关于 swap-on-zram 的细节。 + +#### 默认使用 Nano + +新的 Fedora 33 将把 `EDITOR` 环境变量默认设置为 [nano][11]。这个变化影响了一些命令行工具,当它们需要用户输入时,会打开一个文本编辑器。在早期的版本中,这个环境变量的默认值并没有被指定,而是由各个应用程序来选择一个默认的编辑器。通常情况下,应用程序会使用 [vi][12] 作为它们的默认编辑器,因为它是一个小应用,通常在大多数 Unix/Linux 操作系统的基础安装中都可以使用。由于 Fedora 33 的基本安装中包含了 nano,而且 nano 对于初学者来说更加直观,所以 Fedora 33 将默认使用 nano。当然,想要使用 vi 的用户可以在自己的环境中覆盖 `EDITOR` 变量的值。详见[Fedora 修改请求][11]获取更多信息。 + +-------------------------------------------------------------------------------- + +via: https://fedoramagazine.org/whats-new-fedora-33-workstation/ + +作者:[Gregory Bartholomew][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/glb/ +[b]: https://github.com/lujun9972 +[1]: https://fedoramagazine.org/wp-content/uploads/2020/10/f33workstation-816x345.jpg +[2]: https://fedoramagazine.org/announcing-fedora-33/ +[3]: https://getfedora.org/workstation +[4]: https://fedoramagazine.org/wp-content/uploads/2020/10/fedora-33-gnome-tour-1.png +[5]: https://fedoramagazine.org/wp-content/uploads/2020/10/drag-to-reorder-1.gif +[6]: https://help.gnome.org/misc/release-notes/3.38/ +[7]: https://fedoramagazine.org/btrfs-coming-to-fedora-33/ +[8]: https://en.wikipedia.org/wiki/Btrfs +[9]: https://btrfs.wiki.kernel.org/index.php/Changelog#By_feature +[10]: https://fedoraproject.org/wiki/Changes/SwapOnZRAM +[11]: https://fedoraproject.org/wiki/Changes/UseNanoByDefault +[12]: https://en.wikipedia.org/wiki/Vi diff --git a/published/202011/20201029 Improve your database knowledge with this MariaDB and MySQL cheat sheet.md b/published/202011/20201029 Improve your database knowledge with this MariaDB and MySQL cheat sheet.md new file mode 100644 index 0000000000..6ef5aef401 --- /dev/null +++ b/published/202011/20201029 Improve your database knowledge with this MariaDB and MySQL cheat sheet.md @@ -0,0 +1,368 @@ +[#]: collector: "lujun9972" +[#]: translator: "lxbwolf" +[#]: reviewer: "wxy" +[#]: publisher: "wxy" +[#]: url: "https://linux.cn/article-12822-1.html" +[#]: subject: "Improve your database knowledge with this MariaDB and MySQL cheat sheet" +[#]: via: "https://opensource.com/article/20/10/mariadb-mysql-cheat-sheet" +[#]: author: "Seth Kenlon https://opensource.com/users/seth" + +备忘单:提升你的 MariaDB 和 MySQL 数据库技能 +====== + +> 阅读本文并下载我们的免费备忘单,去使用开源的数据库吧。 + +![](https://img.linux.net.cn/data/attachment/album/202011/14/065421hq1qocmk3rf4npq1.jpg) + +当你写一个程序或配置一个服务时,你最终都要持久化存储信息。有时候,你只需要一个 INI 或者 [YAML][2] 配置文件就够了。而有时候,一个自定义格式的 XML 或者 JSON 或其他类似的文件会更好。 + +但也有时候你需要校验输入、快速查询信息、关联数据、通常还要熟练地处理你的用户的请求。这就是设计数据库的目的,而 [MariaDB][3](由 [MySQL][4] 的原始开发人员开发的一个分支) 是一个极佳的选项。在本文中我使用的是 MariaDB,但这些信息同样适用于 MySQL。 + +通过编程语言与数据库进行交互是很普遍的。正因如此,出现了大量 Java、Python、Lua、PHP、Ruby、C++ 和其他语言的 [SQL][5] 库。然而,在使用这些库之前,理解数据库引擎做了什么以及为什么选择数据库是重要的对我们会很有帮助。本文介绍 MariaDB 和 `mysql` 命令来帮助你熟悉数据库处理数据的基本原理。 + +如果你还没有安装 MariaDB,请查阅我的文章 [在 Linux 上安装 MariaDB][6]。如果你没有使用 Linux,请参照 MariaDB [下载页面][7]提供的指导方法。 + +### 与 MariaDB 交互 + +你可以使用 `mysql` 命令与 MariaDB 进行交互。首先使用子命令 `ping` 确认你的服务是运行着的,在提示后输入密码: + +``` +$ mysqladmin -u root -p ping +Enter password: +mysqld is alive +``` + +为了易于读者理解,打开一个交互式的 MariaDB 会话: + +``` +$ mysql -u root -p +Enter password: +Welcome to the MariaDB monitor. +Commands end with ; or \g. +[...] +Type 'help;' or '\h' for help. +Type '\c' to clear the current input statement. + +MariaDB [(none)]> +``` + +你现在是在一个 MariaDB 子 shell 中,提示符是 MariaDB 提示符。普通的 Bash 命令在这里不能使用,只能用 MariaDB 命令。输入 `help` (或 `?`)查看命令列表。这些是你的 MariaDB shell 的管理命令,使用它们可以定制你的 shell,但它们不属于 SQL 语言。 + +### 学习 SQL 基本知识 + +[结构化查询语言][8]是基于它们的能力定义的:一种通过有规则且一致的语法来查询数据库中的内容以得到有用的结果的方法。SQL 看起来像是普通的英文语句,有一点点生硬。例如,如果你登入数据库服务器,想查看有哪些库,输入 `SHOW DATABASES;` 并回车就能看到结果。 + +SQL 命令以分号作为结尾。如果你忘记输入分号,MariaDB 会认为你是想在下一行继续输入你的查询命令,在下一行你可以继续输入命令也可以输入分号结束命令。 + +``` +MariaDB [(NONE)]> SHOW DATABASES; ++--------------------+ +| DATABASE | ++--------------------+ +| information_schema | +| mysql | +| performance_schema | +| test | ++--------------------+ +4 ROWS IN SET (0.000 sec) +``` + +上面的例子显示当前有四个数据库:`information_schema`、`mysql`、`performance_schema` 和 `test`。你必须指定 MariaDB 使用哪个库,才能对该库使用查询语句。指定数据库的命令是 `use`。当你选择了一个库后,MariaDB 提示框会切换为选择的库。 + +``` +MariaDB [(NONE)]> USE test; +MariaDB [(test)]> +``` + +#### 显示数据库的表 + +数据库里有*表*,与电子表格类似:有一系列的行(在数据库中称为*记录*)和列。一个行和一个列唯一确定一个*字段*。 + +查看一个数据库中可用的表(可以理解为多表单电子表格中的一页),使用 SQL 关键字 `SHOW`: + +``` +MariaDB [(test)]> SHOW TABLES; +empty SET +``` + +`test` 数据库是空的,所以使用 `use` 命令切换到 `mysql` 数据库: + +``` +MariaDB [(test)]> USE mysql; +MariaDB [(mysql)]> SHOW TABLES; + ++---------------------------+ +| Tables_in_mysql | ++---------------------------+ +| column_stats | +| columns_priv | +| db | +[...] +| time_zone_transition_type | +| transaction_registry | +| USER | ++---------------------------+ +31 ROWS IN SET (0.000 sec) +``` + +这个数据库中有很多表!`mysql` 数据库是这个 MariaDB 实例的系统管理数据库。它里面包含重要数据,比如用来管理数据库权限的用户结构。这个数据库很重要,你不需要经常直接与它交互,但是使用 SQL 脚本来操作它却很常见。当你学习 MariaDB 时理解 `mysql` 数据库很有用,因为它有助于说明一些基本的 SQL 命令。 + +#### 检查一个表 + +这个实例的 `mysql` 数据库的最后一个表名为 `USER`。这个表包含了可以访问这个数据库的用户。当前里面只有一个 root 用户,但是你可以添加不同权限的用户,赋予它们查看、更新或创建数据的权限。你可以查看一个表的列首来了解一个 MariaDB 用户的所有属性: + +``` +> SHOW COLUMNS IN USER; +MariaDB [mysql]> SHOW COLUMNS IN USER; ++-------------+---------------+------+-----+----------+ +| FIELD | TYPE | NULL | KEY | DEFAULT | ++-------------+---------------+------+-----+----------+ +| Host | CHAR(60) | NO | PRI | | +| USER | CHAR(80) | NO | PRI | | +| Password | CHAR(41) | NO | | | +| Select_priv | enum('N','Y') | NO | | N | +| Insert_priv | enum('N','Y') | NO | | N | +| Update_priv | enum('N','Y') | NO | | N | +| Delete_priv | enum('N','Y') | NO | | N | +| Create_priv | enum('N','Y') | NO | | N | +| Drop_priv | enum('N','Y') | NO | | N | +[...] +47 ROWS IN SET (0.001 sec) +``` + +#### 创建一个新的用户 + +不论你是否需要一个普通的账号来管理数据库或者为计算机配置数据库(例如安装 WordPress、Drupal 或 Joomla时),在 MariaDB 中多建一个用户账号是很普遍的。你可以通过向 `mysql` 数据库的 `USER` 表中添加一个用户或使用 SQL 关键字 `CREATE` 来提示 MariaDB 创建一个 MariaDB 用户。使用 `CREATE` 来创建新用户会默认执行一些有用的方法,因此你不需要手动生成所有的信息: + +``` +> CREATE USER 'tux'@'localhost' IDENTIFIED BY 'really_secure_password'; +``` + +#### 查看表的字段 + +你可以使用 `SELECT` 关键字来查看数据库表的字段和值。这本例中,你创建了一个名为 `tux` 的用户,因此查询 `USER` 表中的列: + +``` +> SELECT USER,host FROM USER; ++------+------------+ +| USER | host | ++------+------------+ +| root | localhost | +[...] +| tux | localhost | ++------+------------+ +7 ROWS IN SET (0.000 sec) +``` + +#### 为一个用户赋予权限 + +通过查看 `USER` 表列出的信息,你可以看到用户的状态。例如,新用户 `tux` 对这个数据库没有任何权限。使用 `WHERE` 语句你可以只查 `tux` 那一条记录。 + +``` +> SELECT USER,select_priv,insert_priv,update_priv FROM USER WHERE USER='tux'; ++------+-------------+-------------+-------------+ +| USER | select_priv | insert_priv | update_priv | ++------+-------------+-------------+-------------+ +| tux | N | N | N | ++------+-------------+-------------+-------------+ +``` + +使用 `GRANT` 命令修改用户的权限: + +``` +> GRANT SELECT ON *.* TO 'tux'@'localhost'; +> FLUSH PRIVILEGES; +``` + +验证你的修改: + +``` +> SELECT USER,select_priv,insert_priv,update_priv FROM USER WHERE USER='tux'; ++------+-------------+-------------+-------------+ +| USER | select_priv | insert_priv | update_priv | ++------+-------------+-------------+-------------+ +| tux | Y | N | N | ++------+-------------+-------------+-------------+ +``` + +`tux` 用户现在有了从所有表中查询记录的权限。 + +### 创建自定义的数据库 + +到目前为止,你一直在与默认的数据库进行交互。除了用户管理,大部分人很少会与默认的数据库进行交互。通常,你会用自定义的数据来填充创建的数据库。 + +#### 创建一个 MariaDB 数据库 + +你可能已经可以自己在 MariaDB 中创建新数据库了。创建数据库跟新建用户差不多。 + +``` +> CREATE DATABASE example; +Query OK, 1 ROW affected (0.000 sec) +> SHOW DATABASES; ++--------------------+ +| DATABASE | ++--------------------+ +| example | +[...] +``` + +使用 `use` 命令来把这个新建的数据库作为当前使用的库: + +``` +> USE example; +``` + +#### 创建一个表 + +创建表比创建数据库要复杂,因为你必须定义列首。MariaDB 提供了很多方便的函数,可以用于创建列,引入数据类型定义,自增选项,对空值的约束,自动时间戳等等。 + +下面是用来描述一系列用户的一个简单的表: + +``` +> CREATE TABLE IF NOT EXISTS member ( + -> id INT AUTO_INCREMENT PRIMARY KEY, + -> name VARCHAR(128) NOT NULL, + -> startdate TIMESTAMP DEFAULT CURRENT_TIMESTAMP); +Query OK, 0 ROWS affected (0.030 sec) +``` + +这个表通过使用一个自动递增的方法来唯一标识每一行。表示用户名字的字段不能为空(或 `null`),每一行被创建时会自动生成时间戳。 + +使用 SQL 关键字 `INSERT` 向这个表填充一些示例数据: + +``` +> INSERT INTO member (name) VALUES ('Alice'); +Query OK, 1 ROW affected (0.011 sec) +> INSERT INTO member (name) VALUES ('Bob'); +Query OK, 1 ROW affected (0.011 sec) +> INSERT INTO member (name) VALUES ('Carol'); +Query OK, 1 ROW affected (0.011 sec) +> INSERT INTO member (name) VALUES ('David'); +Query OK, 1 ROW affected (0.011 sec) +``` + +验证一下表里的数据: + +``` +> SELECT * FROM member; ++----+-------+---------------------+ +| id | name | startdate | ++----+-------+---------------------+ +| 1 | Alice | 2020-10-03 15:25:06 | +| 2 | Bob | 2020-10-03 15:26:43 | +| 3 | Carol | 2020-10-03 15:26:46 | +| 4 | David | 2020-10-03 15:26:51 | ++----+-------+---------------------+ +4 ROWS IN SET (0.000 sec) +``` + +#### 同时增加多行数据 + +再创建一个表: + +``` +> CREATE TABLE IF NOT EXISTS linux ( + -> id INT AUTO_INCREMENT PRIMARY KEY, + -> distro VARCHAR(128) NOT NULL); +Query OK, 0 ROWS affected (0.030 sec) +``` + +填充一些示例数据,这次使用 `VALUES` 快捷方式,这样你可以一次添加多行数据。`VALUES` 关键字需要一个用括号包围的列表作为参数,也可以用逗号分隔的多个列表作为参数。 + +``` +> INSERT INTO linux (distro) + -> VALUES ('Slackware'), ('RHEL'),('Fedora'),('Debian'); +Query OK, 4 ROWS affected (0.011 sec) +Records: 4 Duplicates: 0 Warnings: 0 +> SELECT * FROM linux; ++----+-----------+ +| id | distro | ++----+-----------+ +| 1 | Slackware | +| 2 | RHEL | +| 3 | Fedora | +| 4 | Debian | ++----+-----------+ +``` + +### 关联多个表 + +现在你有两个表,之间没有关联。两个表的数据是独立的,但是你可能需要表一中的一个值来识别表二的记录。 + +你可以在表一中新增一列对应表二中的值。因为两个表都有唯一的标识符(自动递增的 `id` 字段),关联的它们的最简单的方式是,使用表一中的 `id` 字段作为表二的查询条件。 + +在表一中创建一列用来表示表二中的一个值: + +``` +> ALTER TABLE member ADD COLUMN (os INT); +Query OK, 0 ROWS affected (0.012 sec) +Records: 0 Duplicates: 0 Warnings: 0 +> DESCRIBE member; +DESCRIBE member; ++-----------+--------------+------+-----+---------+------+ +| FIELD | TYPE | NULL | KEY | DEFAULT | Extra| ++-----------+--------------+------+-----+---------+------+ +| id | INT(11) | NO | PRI | NULL | auto_| +| name | VARCHAR(128) | NO | | NULL | | +| startdate | TIMESTAMP | NO | | cur[...]| | +| os | INT(11) | YES | | NULL | | ++-----------+--------------+------+-----+---------+------+ +``` + +把 `linux` 表中的唯一 ID 分配给每个成员。因为记录已经存在,使用 `UPDATE` 关键字而不是 `INSERT`。尤其是当你想查询某行然后再更新某列值时。语法上,表达方式有点倒装,先更新后查询: + +``` +> UPDATE member SET os=1 WHERE name='Alice'; +Query OK, 1 ROW affected (0.007 sec) +ROWS matched: 1 Changed: 1 Warnings: 0 +``` + +要填充数据,请对其他名字重复执行这个过程。为了数据的多样性,在四行记录中分配三个不同的值。 + +#### 连接表 + +现在这两个表彼此有了关联,你可以使用 SQL 来展示关联的数据。数据库中有很多种连接方式,你可以尽请尝试。下面的例子是关联 `member` 表中 `os` 字段和 `linux` 表中 `id` 字段: + +``` +SELECT * FROM member JOIN linux ON member.os=linux.id; ++----+-------+---------------------+------+----+-----------+ +| id | name | startdate | os | id | distro | ++----+-------+---------------------+------+----+-----------+ +| 1 | Alice | 2020-10-03 15:25:06 | 1 | 1 | Slackware | +| 2 | Bob | 2020-10-03 15:26:43 | 3 | 3 | Fedora | +| 4 | David | 2020-10-03 15:26:51 | 3 | 3 | Fedora | +| 3 | Carol | 2020-10-03 15:26:46 | 4 | 4 | Debian | ++----+-------+---------------------+------+----+-----------+ +4 ROWS IN SET (0.000 sec) +``` + +连接 `os` 和 `id` 字段。 + +在图形化的应用中,你可以想象 `os` 字段可以在下拉菜单中设置,值的来源是 `linux` 表中的 `distro` 字段。通过使用多个表中独立却有关联的数据,你可以保证数据的一致性和有效性,使用 SQL 你可以动态地关联它们。 + +### 下载 MariaDB 和 MySQL 备忘单 + +MariaDB 是企业级的数据库。它是健壮、强大、高效的数据库引擎。学习它是你向管理 web 应用和编写语言库迈出的伟大的一步。你可以[下载 MariaDB 和 MySQL 备忘单][9],在你使用 MariaDB 时可以快速参考。 + +-------------------------------------------------------------------------------- + +via: https://opensource.com/article/20/10/mariadb-mysql-cheat-sheet + +作者:[Seth Kenlon][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/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://www.redhat.com/sysadmin/yaml-tips +[3]: https://mariadb.org/ +[4]: https://www.mysql.com/ +[5]: https://en.wikipedia.org/wiki/SQL +[6]: https://opensource.com/article/20/10/install-mariadb-and-mysql-linux +[7]: https://mariadb.org/download +[8]: https://publications.opengroup.org/c449 +[9]: https://opensource.com/downloads/mariadb-mysql-cheat-sheet \ No newline at end of file diff --git a/published/202011/20201029 Linux Kernel 5.10 Will be the Next LTS Release and it has Some Exciting Improvements Lined Up.md b/published/202011/20201029 Linux Kernel 5.10 Will be the Next LTS Release and it has Some Exciting Improvements Lined Up.md new file mode 100644 index 0000000000..ac2f20a8e5 --- /dev/null +++ b/published/202011/20201029 Linux Kernel 5.10 Will be the Next LTS Release and it has Some Exciting Improvements Lined Up.md @@ -0,0 +1,79 @@ +[#]: collector: (lujun9972) +[#]: translator: (geekpi) +[#]: reviewer: (wxy) +[#]: publisher: (wxy) +[#]: url: (https://linux.cn/article-12807-1.html) +[#]: subject: (Linux Kernel 5.10 Will be the Next LTS Release and it has Some Exciting Improvements Lined Up) +[#]: via: (https://itsfoss.com/kernel-5-10/) +[#]: author: (Ankush Das https://itsfoss.com/author/ankush/) + +Linux 内核 5.10 LTS 的一些令人兴奋的改进 +====== + +> Linux 内核 5.10 的开发正在进行中。已确认这是一个长期支持的版本,将带来更新的硬件支持和其他承诺的功能。 + +### Linux Kernel 5.10 将是长期支持版本 + +主要稳定内核维护者 **Greg Kroah-Hartman** 在 Linux 基金会欧洲开源峰会的 “Ask the Expert” 环节上发言,确认 Linux 5.10 将是下一个 LTS 版本。 + +尽管早期有一些关于 5.9 是 LTS 版本的猜测,但 Greg 澄清说,**一年的最后一个内核版本永远是 LTS 版本**。 + +目前来看,[Linux 内核 5.4][1] 系列恰好是最新的 LTS 版本,它增加了很多改进和硬件支持。另外,考虑到开发进度,Linux [内核 5.8][2] 是目前最大的版本,而 Linux 5.10 的第一个候选版本也很接近,所以下面有很多事情要做。 + +让我们来看看 Linux 内核 5.10 的一些功能和改进。 + +### Linux 内核 5.10 特性 + +![][4] + +**注意:** Linux 内核 5.10 仍处于早期开发阶段。因此,我们将定期更新文章,以更新最新的补充/功能。 + +#### AMD Zen 3 处理器支持 + +新的 [Ryzen 5000][5] 产品线是 2020 年最大的看点之一。所以,随着 Linux 内核 5.10 发布候选版本的推出,针对 Zen 3 处理器的各种新增功能也在陆续推出。 + +#### Intel Rocket Lake 支持 + +我并不对 Intel 的 Rocket Lake 芯片组在明年(2021 年) Q1 出货报太大希望。但是,考虑到英特尔在不断地压榨 14 纳米制程,看到 Intel Rocket Lake 在 Linux 内核 5.10 上所做的工作,绝对是一件好事。 + +#### Radeon RX 6000 系列开源驱动 + +尽管我们是在 Big Navi 揭晓前一天才报道的,但 Radeon RX 6000 系列绝对会是一个令人印象深刻的东西,可以和 NVIDIA RTX 3000 系列竞争。 + +当然,除非它和 Vega 系列或 5000 系列遇到的同样问题。 + +很高兴在 Linux 内核 5.10 上看到下一代 Radeon GPU 的开源驱动已经完成。 + +#### 文件系统优化和存储改进 + +[Phoronix][6] 报道了 5.10 也对文件系统进行了优化和存储改进。所以,从这一点来看,我们应该会看到一些性能上的改进。 + +#### 其他改进 + +毫无疑问,你应该期待新内核带来大量的驱动更新和硬件支持。 + +目前,对 SoundBlaster AE-7 的支持、对 NVIDIA Orin(AI 处理器)的早期支持以及 Tiger Lake GPU 的改进似乎是主要亮点。 + +Linux 内核 5.10 的稳定版本应该会在 12 月中旬左右发布。它将被支持至少 2 年,但可能一直会有安全和 bug 修复更新,直到 2026 年。因此,我们将继续关注下一个 Linux 内核 5.10 LTS 版本的发展,以获得任何令人兴奋的东西。 + +你对即将发布的 Linux 内核 5.10 有什么看法?请在评论中告诉我们你的想法。 + +-------------------------------------------------------------------------------- + +via: https://itsfoss.com/kernel-5-10/ + +作者:[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-kernel-5-4/ +[2]: https://itsfoss.com/kernel-5-8-release/ +[3]: https://twitter.com/gregkh/status/1320745076566433793?ref_src=twsrc%5Etfw +[4]: https://i2.wp.com/itsfoss.com/wp-content/uploads/2020/10/kernel-5-10-release.png?resize=800%2C450&ssl=1 +[5]: https://www.tomsguide.com/news/amd-ryzen-5000-revealed-what-it-means-for-pc-gaming +[6]: https://www.phoronix.com/scan.php?page=article&item=linux-510-features&num=1 diff --git a/published/202011/20201030 How to Use apt-cache Command in Debian, Ubuntu and Other Linux Distributions.md b/published/202011/20201030 How to Use apt-cache Command in Debian, Ubuntu and Other Linux Distributions.md new file mode 100644 index 0000000000..32432da3d8 --- /dev/null +++ b/published/202011/20201030 How to Use apt-cache Command in Debian, Ubuntu and Other Linux Distributions.md @@ -0,0 +1,169 @@ +[#]: collector: (lujun9972) +[#]: translator: (wxy) +[#]: reviewer: (wxy) +[#]: publisher: (wxy) +[#]: url: (https://linux.cn/article-12786-1.html) +[#]: subject: (How to Use apt-cache Command in Debian, Ubuntu and Other Linux Distributions) +[#]: via: (https://itsfoss.com/apt-cache-command/) +[#]: author: (Abhishek Prakash https://itsfoss.com/author/abhishek/) + +如何在 Debian、Ubuntu 中使用 apt-cache 命令 +====== + +> 使用 apt-cache 命令,你可以在本地 APT 缓存中搜索软件包的详细信息。在本教程中学习使用 apt-cache 命令。 + +### apt-cache 命令是用来干什么的? + +[APT][1] [包管理器][2]工作在软件包元数据的本地缓存上。元数据通常由包名、版本、描述、依赖关系、仓库和开发者等信息组成。通过 `apt-cache` 命令,你可以查询这个本地 APT 缓存并获得相关信息。 + +你可以搜索一个包的可用性、它的版本号、它的依赖关系等等。我将通过实例告诉你如何使用 `apt-cache`命令。 + +APT 缓存的位置是 `/var/lib/apt/lists/` 目录。缓存哪些仓库元数据取决于你的源列表中 `/etc/apt/sources.list` 文件中添加的仓库,以及位于 `/etc/apt/sources.list.d` 目录下的额外仓库文件。 + +令人惊讶的是,`apt-cache` 并不能清除 APT 缓存。为此,你必须[使用 apt-get clean 命令][3]。 + +不用说,APT 打包系统是在 Debian 和基于 Debian 的 Linux 发行版上使用的,比如 Ubuntu、Linux Mint、Elementary OS 等。你不能在 Arch 或 Fedora 上使用它。 + +### 使用 apt-cache 命令 + +![][4] + +就像其他 Linux 命令一样,`apt-cache` 也有一些可用的选项,你可以随时参考它的手册页来了解这些选项。 + +然而,你可能并不需要使用所有的选项。这就是为什么我在本教程中只向你展示 `apt-cache` 命令中最常见和最有用的例子。 + +#### 始终更新 + +更新本地 APT 缓存以与远程仓库同步是一个好主意。如何做到这一点呢?你可以使用命令: + +``` +sudo apt update +``` + +#### 搜索软件包 + +`apt-cache` 命令最常见的用途是查找软件包。你可以使用一个正则表达式来搜索本地 APT 缓存中的包。 + +``` +apt-cache search package_name +``` + +默认情况下,它会在软件包的名称和描述中查找搜索关键词。它按字母顺序显示匹配的软件包及其简短的描述。 + +![][5] + +你也可以缩小搜索范围,只在软件包名称中查找搜索词。 + +``` +apt-cache search --names-only package_name +``` + +![][6] + +如果你想知道所有匹配软件包的完整细节,你可以使用 `--full` 标志。 + +![][7] + +#### 获取详细的包装信息 + +如果你知道确切的软件包名称(或者你已经成功地通过搜索找到了它),你可以得到软件包的详细元数据信息。 + +``` +apt-cache show package_name +``` + +![][8] + +你可以看到软件包元数据中的所有细节,比如名称、版本、开发者、维护者、仓库、长短描述、软件包大小甚至是校验和。 + +还有一个选项 `showpkg` 可以显示软件包的名称、版本、正向和反向依赖关系等信息。 + +``` +apt-cache showpkg package_name +``` + +#### apt-cache 的策略 + +这是 `apt-cache` 命令中很少使用的一个选项。`policy` 选项可以帮助你调试与 [preference 文件][9]相关的问题。 + +如果你指定了软件包的名称,它将显示该软件包是否已经安装,在哪个版本的仓库中可用,以及它的优先级。 + +![][10] + +默认情况下,每个已安装的软件包版本的优先级为 100,未安装的软件包的优先级为 500。同一软件包可能有多个不同优先级的版本。APT 会安装优先级较高的版本,除非安装的版本较新。 + +如果不理解这个部分,也没关系。对于一个普通的 Linux 用户来说,会极少纠结于这么深的软件包管理知识。 + +#### 检查软件包的依赖关系和反向依赖关系。 + +你可以在安装之前(甚至在安装之后)[检查一个包的依赖关系][11]。它还会显示所有可能满足依赖关系的软件包。 + +``` +apt-cache depends package +``` + +![][12] + +你也可以通过 `apt-cahce` 检查反向依赖关系来检查哪些包是依赖于某个包的。 + +![][13] + +坦白说,看到 Ansible 这样的 DevOps 工具对 [Cowsay 这样有趣的 Linux 命令][14]有依赖性,我也很惊讶。我想可能是因为在[安装 Ansible][15]之后,它会在节点上显示一些信息。 + +#### 检查未满足的依赖性 + +你可能会被 [Ubuntu 中未满足的依赖问题][16]所困扰,其他 Linux 也有类似问题。`apt-cache` 命令提供了一个选项来检查系统中各种可用软件包的所有未满足的依赖关系。 + +``` +apt-cache unmet +``` + +![][17] + +### 结论 + +你可以用 `apt-cache` 命令列出所有可用的软件包。输出结果会很庞大,所以我建议将其与 [wc 命令][18] 结合起来,得到可用软件包的总数,就像这样: + +``` +apt-cache pkgnames | wc -l +``` + +你是否注意到你不需要成为 [root 用户][19]就可以使用 `apt-cache` 命令? + +较新的 [apt 命令][20]也有一些与 `apt-cache` 命令相对应的功能选项。由于 `apt` 比较新,所以在脚本中还是首选使用 `apt-get` 及其相关的 `apt-cache` 等命令。 + +希望你觉得本教程对你有帮助。如果你对上面讨论的任何一点有疑问或者有改进的建议,请在评论中告诉我。 + +-------------------------------------------------------------------------------- + +via: https://itsfoss.com/apt-cache-command/ + +作者:[Abhishek Prakash][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://itsfoss.com/author/abhishek/ +[b]: https://github.com/lujun9972 +[1]: https://wiki.debian.org/Apt +[2]: https://itsfoss.com/package-manager/ +[3]: https://itsfoss.com/clear-apt-cache/ +[4]: https://i1.wp.com/itsfoss.com/wp-content/uploads/2020/10/apt-cache-command.png?resize=800%2C450&ssl=1 +[5]: https://i2.wp.com/itsfoss.com/wp-content/uploads/2020/10/apt-cache-search.png?resize=759%2C437&ssl=1 +[6]: https://i1.wp.com/itsfoss.com/wp-content/uploads/2020/10/apt-cache-search-names-only.png?resize=759%2C209&ssl=1 +[7]: https://i2.wp.com/itsfoss.com/wp-content/uploads/2020/10/apt-cache-show-full.png?resize=759%2C722&ssl=1 +[8]: https://i2.wp.com/itsfoss.com/wp-content/uploads/2020/10/apt-cache-show-pkgname.png?resize=800%2C795&ssl=1 +[9]: https://debian-handbook.info/browse/stable/sect.apt-get.html#sect.apt.priorities +[10]: https://i0.wp.com/itsfoss.com/wp-content/uploads/2020/10/apt-cache-policy.png?resize=795%2C456&ssl=1 +[11]: https://itsfoss.com/check-dependencies-package-ubuntu/ +[12]: https://i2.wp.com/itsfoss.com/wp-content/uploads/2020/10/apt-cache-dependency-check.png?resize=768%2C304&ssl=1 +[13]: https://i1.wp.com/itsfoss.com/wp-content/uploads/2020/10/apt-cache-reverse-dependency.png?resize=768%2C304&ssl=1 +[14]: https://itsfoss.com/funny-linux-commands/ +[15]: https://linuxhandbook.com/install-ansible-linux/ +[16]: https://itsfoss.com/held-broken-packages-error/ +[17]: https://i0.wp.com/itsfoss.com/wp-content/uploads/2020/10/apt-cache-unmet.png?resize=759%2C399&ssl=1 +[18]: https://linuxhandbook.com/wc-command/ +[19]: https://itsfoss.com/root-user-ubuntu/ +[20]: https://itsfoss.com/apt-command-guide/ diff --git a/published/202011/20201102 4 cool new projects to try in COPR from October 2020.md b/published/202011/20201102 4 cool new projects to try in COPR from October 2020.md new file mode 100644 index 0000000000..a3e17071d5 --- /dev/null +++ b/published/202011/20201102 4 cool new projects to try in COPR from October 2020.md @@ -0,0 +1,109 @@ +[#]: collector: (lujun9972) +[#]: translator: (geekpi) +[#]: reviewer: (wxy) +[#]: publisher: (wxy) +[#]: url: (https://linux.cn/article-12810-1.html) +[#]: subject: (4 cool new projects to try in COPR from October 2020) +[#]: via: (https://fedoramagazine.org/4-cool-new-projects-to-try-in-copr-from-october-2020/) +[#]: author: (frostyx https://fedoramagazine.org/author/frostyx/) + +COPR 仓库中 4 个很酷的新项目(2020.10) +====== + +![][1] + +COPR 是个人软件仓库[集合][2],它不在 Fedora 中。这是因为某些软件不符合轻松打包的标准;或者它可能不符合其他 Fedora 标准,尽管它是自由而开源的。COPR 可以在 Fedora 套件之外提供这些项目。COPR 中的软件不受 Fedora 基础设施的支持,或者是由项目自己背书的。但是,这是一种尝试新的或实验性的软件的一种巧妙的方式。 + +本文介绍了 COPR 中一些有趣的新项目。如果你第一次使用 COPR,请参阅 [COPR 用户文档][3]。 + +### Dialect + +[Dialect][4] 使用谷歌翻译将文本翻译成外语。它可以记住你的翻译历史,并支持自动语言检测和文本到语音等功能。用户界面简约,模仿谷歌翻译工具本身,所以它真的很容易使用。 + +![][5] + +#### 安装说明 + +目前[仓库][6]在 Fedora 33 和 Fedora Rawhide 中提供了 Dialect。要安装它,请使用下面的命令: + +``` +sudo dnf copr enable lyessaadi/dialect +sudo dnf install dialect +``` + +### GitHub CLI + +[gh][7] 是一个官方的 GitHub 命令行客户端。它在终端提供了快速的访问,并完全控制你的项目问题、拉取请求和发布。议题(和其他东西)也可以在浏览器中轻松查看,以获得更标准的用户界面,或与他人分享。 + +![][8] + +#### 安装说明 + +目前[仓库][9]在 Fedora 33 和 Fedora Rawhide 中提供了 `gh` 。要安装它,请使用下面的命令: + +``` +sudo dnf copr enable jdoss/github-cli +sudo dnf install github-cli +``` + +### Glide + +[Glide][10] 是一个基于 GStreamer 的极简主义媒体播放器。它可以播放任何 GStreamer 支持的多媒体格式的本地和远程文件。如果你需要一个多平台的具有简单用户界面的媒体播放器,你可能会想试试 Glide。 + +![][11] + +#### 安装说明 + +目前[仓库][12]在 Fedora 32、33 和 Rawhide 中提供了 Glide。要安装它,请使用下面的命令: + +``` +sudo dnf copr enable atim/glide-rs +sudo dnf install glide-rs +``` + +### Vim ALE + +[ALE][13] 是 Vim 文本编辑器的一个插件,它提供了语法和语义错误检查。它还带来了诸如代码修复和许多其他类似于 IDE 的功能,如 TAB 补全、跳转到定义、查找引用、查看文档等。 + +![][14] + +#### 安装说明 + +目前[仓库][15]在 Fedora 31、32、33 和 Rawhide 还有 EPEL8 中提供了 `vim-ale` 。要安装它,请使用下面的命令: + +``` +sudo dnf copr enable praiskup/vim-ale +sudo dnf install vim-ale +``` + +编者注:可在[此处][16]查阅以前的 COPR 文章。 + +-------------------------------------------------------------------------------- + +via: https://fedoramagazine.org/4-cool-new-projects-to-try-in-copr-from-october-2020/ + +作者:[frostyx][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/frostyx/ +[b]: https://github.com/lujun9972 +[1]: https://fedoramagazine.org/wp-content/uploads/2017/08/4-copr-945x400.jpg +[2]: https://copr.fedorainfracloud.org/ +[3]: https://docs.pagure.org/copr.copr/user_documentation.html +[4]: https://github.com/gi-lom/dialect +[5]: https://fedoramagazine.org/wp-content/uploads/2020/10/dialect.png +[6]: https://copr.fedorainfracloud.org/coprs/lyessaadi/dialect/ +[7]: https://github.com/cli/cli +[8]: https://fedoramagazine.org/wp-content/uploads/2020/10/github-cli.png +[9]: https://copr.fedorainfracloud.org/coprs/jdoss/github-cli/ +[10]: https://github.com/philn/glide +[11]: https://fedoramagazine.org/wp-content/uploads/2020/10/glide.png +[12]: https://copr.fedorainfracloud.org/coprs/atim/glide-rs/ +[13]: https://github.com/dense-analysis/ale +[14]: https://fedoramagazine.org/wp-content/uploads/2020/10/vim-ale.png +[15]: https://copr.fedorainfracloud.org/coprs/praiskup/vim-ale/ +[16]: https://fedoramagazine.org/?s=COPR diff --git a/published/202011/20201102 4 reasons why JavaScript is so popular.md b/published/202011/20201102 4 reasons why JavaScript is so popular.md new file mode 100644 index 0000000000..4ac7718161 --- /dev/null +++ b/published/202011/20201102 4 reasons why JavaScript is so popular.md @@ -0,0 +1,115 @@ +[#]: collector: (lujun9972) +[#]: translator: (wxy) +[#]: reviewer: (wxy) +[#]: publisher: (wxy) +[#]: url: (https://linux.cn/article-12830-1.html) +[#]: subject: (4 reasons why JavaScript is so popular) +[#]: via: (https://opensource.com/article/20/11/javascript-popular) +[#]: author: (Nimisha Mukherjee https://opensource.com/users/nimisha) + +JavaScript 如此受欢迎的 4 个原因 +====== + +> JavaScript 之所以能在编程语言中名列前茅,是有充分的理由的。 + +![](https://img.linux.net.cn/data/attachment/album/202011/17/102936u1hghm95bbu7xjxg.jpg) + +如 GitHub 的 [The State of the Octoverse][2] 报告的这张图所示,如果按 GitHub 上项目的贡献者数量统计,[JavaScript][3] 一直是最受欢迎的编程语言。 + +![The State of the Octoverse 报告中的热门语言][4] + +*热门语言,根据《The State of the Octoverse》(©2019,[GitHub Corp][2])* + +在本系列的 [上一篇][5] 中,我们深入了解了 JavaScript 的历史。在这篇文章中,我将分享它如此受欢迎的四个[原因][6]。 + +### 1、JavaScript 适合初级、中级和高级开发人员 + +JavaScript 不需要任何环境设置,只要打开浏览器,比如 Chrome 浏览器,导航到[开发者工具][7],就可以开始编码。编写一个 “Hello World” 的程序,就这么简单: + +``` +console.log("Hello World"); +``` + +JavaScript 的灵活性最适合中级开发人员。该语言通过让开发人员专注于解决问题来帮助你完成任务。开发者可以混合使用插件和自己的代码片段来让一个应用程序工作。 + +虽然 JavaScript 比较容易上手,但它也并不是一下子就能掌握的。如果你想达到高级水平,这里有一些你需要了解的概念: + + * **JavaScript 的[多范式][8]特性:** JavaScript 同时支持函数式编程和面向对象编程(OOP)。 + * **在 JavaScript 中应用[设计模式][9]:** 模型-视图-*([MV*][10])设计模式一直是最流行的模式之一,并促成了[多个现代框架][11]的发展。 + * **[带原型链的继承][12]:** JavaScript 由于其动态的特性,无法实现传统的 Java 基于类的模式下的 OOP。JavaScript 中的 OOP 是通过原型继承模型实现的。 + * **[闭包][13]:** 闭包可以从内部函数中访问外部函数的作用域。 + * **[柯里化][14]Currying:** 柯里化是函数的一种转换,它将函数从 `f(a, b, c)` 的调用形式转换为 `f(a)(b)(c)` 调用形式。 + * **[Promises][15] 和 [Observables][16]:** 这些可以帮助你处理异步函数。 + * **[TypeScript][17]:** 在 JavaScript 中添加了静态类型。 + +### 2、全平台 + +JavaScript 可以在任何地方运行,包括: + + * 手机、平板电脑和笔记本电脑等设备。 + * 在客户端和服务器端。 + +这种在任何地方都能运行的能力使 JavaScript 成为一种通用语言。 + +### 3、开放标准和社区 + +[ECMAScript][18] 是 JavaScript 的标准化版本,也是一种开放的标准语言。公司可以使用 ECMAScript 来创建 JavaScript 的实现。根据[维基百科][19],“ECMAScript 引擎是执行以 ECMAScript 语言标准编写的源代码(例如,JavaScript)的程序”。最流行的引擎 [V8][20] 和 [SpiderMonkey][21] 是开源项目。 + +JavaScript 已经存在了 25 年,背后有一个庞大的社区。开发者们简直目不暇接,社区已经构建了如此多的插件和框架,以至于创造了“[框架疲劳][22]”这个词。 + +### 4、现代框架 + +现代框架如 [React][23]、[Angular][24] 和 [Vue.js][25] 已经稳定下来,并且正在进行优化以获得更好的性能。大多数框架对开发者非常友好,有良好的社区支持。 + +### 未来 + +JavaScript 将长期存在。全栈开发和现代前端框架继续帮助 JavaScript 巩固其作为最受欢迎的编程语言之一的地位。 + +JavaScript 的[下一波][26]可能会将焦点放在。 + + * **[Deno][27]:** JavaScript 的现代安全运行时。 + * **网络组件:** 可重复使用的自定义元素。 + * **与 AI 和 ML 的整合:** 像 [Supernova][28] 和 [BAYOU][29] 这样的项目在将 JavaScript 与人工智能和机器学习整合方面取得了实质性的突破。 + +-------------------------------------------------------------------------------- + +via: https://opensource.com/article/20/11/javascript-popular + +作者:[Nimisha Mukherjee][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/nimisha +[b]: https://github.com/lujun9972 +[1]: https://opensource.com/sites/default/files/styles/image-full-size/public/lead-images/javascript_vim.jpg?itok=mqkAeakO (JavaScript in Vim) +[2]: https://octoverse.github.com/ +[3]: https://en.wikipedia.org/wiki/JavaScript +[4]: https://opensource.com/sites/default/files/uploads/toplanguages-the_state_of_the_octoverse.png (Top Languages from The State of the Octoverse report) +[5]: https://linux.cn/article-12813-1.html +[6]: https://medium.com/paul-heintzelman/so-why-is-javascript-so-popular-f35bd6cfeb39 +[7]: https://developers.google.com/web/tools/chrome-devtools +[8]: https://medium.com/javascript-in-plain-english/what-are-javascript-programming-paradigms-3ef0f576dfdb +[9]: https://addyosmani.com/resources/essentialjsdesignpatterns/book/ +[10]: https://developpaper.com/javascript-mv-pattern/ +[11]: https://en.wikipedia.org/wiki/Model%E2%80%93view%E2%80%93viewmodel#JavaScript_frameworks +[12]: https://developer.mozilla.org/en-US/docs/Web/JavaScript/Inheritance_and_the_prototype_chain +[13]: https://developer.mozilla.org/en-US/docs/Web/JavaScript/Closures +[14]: https://javascript.info/currying-partials +[15]: https://developer.mozilla.org/en-US/docs/Web/JavaScript/Reference/Global_Objects/Promise +[16]: https://rxjs-dev.firebaseapp.com/guide/observable +[17]: https://en.wikipedia.org/wiki/TypeScript +[18]: https://en.wikipedia.org/wiki/ECMAScript +[19]: https://en.wikipedia.org/wiki/List_of_ECMAScript_engines +[20]: https://en.wikipedia.org/wiki/V8_%28JavaScript_engine%29 +[21]: https://en.wikipedia.org/wiki/SpiderMonkey +[22]: https://teropa.info/blog/2015/07/15/overcoming-javascript-framework-fatigue.html +[23]: https://en.wikipedia.org/wiki/React_%28web_framework%29 +[24]: https://en.wikipedia.org/wiki/Angular_%28web_framework%29 +[25]: https://en.wikipedia.org/wiki/Vue.js +[26]: https://medium.com/@rangleio/the-future-of-javascript-in-the-front-end-world-2544c1814e2 +[27]: https://en.wikipedia.org/wiki/Deno_%28software%29 +[28]: https://techcrunch.com/2018/03/13/supernova-studio/ +[29]: https://futurism.com/military-created-ai-learned-to-program diff --git a/published/202011/20201102 Understand your Python code with this open source visualization tool.md b/published/202011/20201102 Understand your Python code with this open source visualization tool.md new file mode 100644 index 0000000000..460bdbee1f --- /dev/null +++ b/published/202011/20201102 Understand your Python code with this open source visualization tool.md @@ -0,0 +1,101 @@ +[#]: collector: "lujun9972" +[#]: translator: "xiao-song-123" +[#]: reviewer: "wxy" +[#]: publisher: "wxy" +[#]: url: "https://linux.cn/article-12819-1.html" +[#]: subject: "Understand your Python code with this open source visualization tool" +[#]: via: "https://opensource.com/article/20/11/python-code-viztracer" +[#]: author: "Tian Gao https://opensource.com/users/gaogaotiantian" + +使用开源可视化工具来理解你的 Python 代码 +====== + +> VizTracer 工具可以可视化并跟踪 Python 代码,让你可以更深入地了解其工作原理。 + +![](https://img.linux.net.cn/data/attachment/album/202011/13/225531g64gdav22n6d6va9.jpg) + +随着 Python 项目变得越来越大、越复杂,理解起它来就变得充满挑战性。即使是你自己独自编写了整个项目,也不可能完全知道项目是如何工作的。为了能更好的理解你的代码,调试和分析代码变得至关重要。 + +[VizTracer][2] 是一个这样的工具,它通过跟踪和可视化 Python 代码的执行过程,来帮助你对代码的理解。无需对源代码进行任何更改,VizTracer 即可记录函数的入口 / 出口,函数参数 / 返回值以及任意变量,然后通过 [Trace-Viewer][3] 使用直观的谷歌前端界面来显示数据。 + +下面是一个运行[蒙特卡洛树搜索][4]的例子: + +![Monte Carlo tree search visualization][5] + +每个函数都在时间线上以堆栈的形式记录和可视化,这样你就可以看到在运行程序时发生了什么。你可以放大查看任意特定点的详细信息: + +![Zooming in on VizTracer visualization][7] + +VizTracer 还可以自动记录函数参数和返回值。你可以单击函数条目并查看详细信息: + +![Viewing VizTracer details][8] + +或者你可以创建一个全新的信号,并用它来记录变量。例如,这显示了执行梯度下降时的成本值: + +![VizTracer gradient descent][9] + +与其他设置复杂的工具相比,VizTracer 使用起来非常简单,并且没有任何依赖关系。你可以从 pip 安装它: + +``` +pip install viztracer +``` + +你也可以通过输入来跟踪你的程序(`` 是你脚本的名称): + +``` +viztracer +``` + +VizTracer 将在你的工作目录中生成一个 HTML 报告,你可以在 Chrome 浏览器中打开它。 + +VizTracer 还提供了其他高级功能,比如过滤器功能,你可以使用它过滤掉不想跟踪的函数,获得更清晰的报告。例如,要仅包含文件中的函数,你需要: + +``` +viztracer include_files ./ --run +``` + +记录函数参数和返回值: + +``` +viztracer --log_function_args --log_return_value +``` + +记录与某个正则表达式匹配的任意变量: + +``` +# log variables starts with a +viztracer --log_var a.* --run <your_script.py> +``` + +你可以通过对源代码进行较小的修改来获得其他功能,例如自定义事件来记录数值和对象。 + +VizTracer 还包括一个虚拟调试器(vdb),它可以调试 VizTracer 的日志文件。可以用 vdb 调试你运行中的代码(与 [pdb][10] 非常相似)以便你了解代码流。有用的是,它还支持时间回溯,因为它知道发生的一切。 + +与一些原型不同,VizTracer 使用纯 C 语言实现其核心,这将极大地减少开销,使其达到类似于 [cProfile][11] 的水平。 + +VizTracer 是开源的,在 Apache 2.0 许可下发布,支持所有常见的操作系统平台(Linux、macOS 和 Windows)。你可以在 [GitHub][2] 上了解关于它的更多特性并访问源代码。 + +-------------------------------------------------------------------------------- + +via: https://opensource.com/article/20/11/python-code-viztracer + +作者:[Tian Gao][a] +选题:[lujun9972][b] +译者:[xiao-song-123](https://github.com/xiao-song-123) +校对:[wxy](https://github.com/wxy) + +本文由 [LCTT](https://github.com/LCTT/TranslateProject) 原创编译,[Linux中国](https://linux.cn/) 荣誉推出 + +[a]: https://opensource.com/users/gaogaotiantian +[b]: https://github.com/lujun9972 +[1]: https://opensource.com/sites/default/files/styles/image-full-size/public/lead-images/python_programming_question.png?itok=cOeJW-8r "Python programming language logo with question marks" +[2]: https://github.com/gaogaotiantian/viztracer +[3]: http://google.github.io/trace-viewer/ +[4]: https://en.wikipedia.org/wiki/Monte_Carlo_tree_search +[5]: https://opensource.com/sites/default/files/uploads/viztracer_mcts.png "Monte Carlo tree search visualization" +[6]: https://creativecommons.org/licenses/by-sa/4.0/ +[7]: https://opensource.com/sites/default/files/uploads/viztracer_zoomin.png "Zooming in on VizTracer visualization" +[8]: https://opensource.com/sites/default/files/uploads/viztracer_details.png "Viewing VizTracer details" +[9]: https://opensource.com/sites/default/files/uploads/viztracer_gradient.png "VizTracer gradient descent" +[10]: https://docs.python.org/3/library/pdb.html +[11]: https://docs.python.org/2/library/profile.html#module-cProfile diff --git a/published/202011/20201103 4 ways to run Kubernetes locally.md b/published/202011/20201103 4 ways to run Kubernetes locally.md new file mode 100644 index 0000000000..9778b00d30 --- /dev/null +++ b/published/202011/20201103 4 ways to run Kubernetes locally.md @@ -0,0 +1,121 @@ +[#]: collector: (lujun9972) +[#]: translator: (geekpi) +[#]: reviewer: (wxy) +[#]: publisher: (wxy) +[#]: url: (https://linux.cn/article-12825-1.html) +[#]: subject: (4 ways to run Kubernetes locally) +[#]: via: (https://opensource.com/article/20/11/run-kubernetes-locally) +[#]: author: (Bryant Son https://opensource.com/users/brson) + +本地运行 Kubernetes 的 4 种方法 +====== + +> 设置一个本地开发环境,或者直接用这些工具尝试容器编排平台。 + +![](https://img.linux.net.cn/data/attachment/album/202011/16/132219hn9q9dszudbdtn35.jpg) + +[Kubernetes][2] 是一个开源的容器编排平台。它由 Google 开发,为自动化部署、扩展和管理容器化应用提供了一个开源系统。虽然大多数人在云环境中运行 Kubernetes,但在本地运行 Kubernetes 集群不仅是可能的,它还至少有两个好处: + +* 在决定使用 Kubernetes 作为主要平台部署应用之前,你可以快速试用它。 +* 在将任何东西推送到公共云之前,你可以将其设置为本地开发环境,从而实现开发环境和生产环境之间的分离。 + +无论你的情况如何,将本地 Kubernetes 环境设置为你的开发环境都是推荐的选择,因为这种设置可以创建一个安全而敏捷的应用部署流程。 + +幸运的是,有多个平台可以让你尝试在本地运行 Kubernetes,它们都是开源的,并且都是 [Apache 2.0][3] 许可。 + +* [Minikube][4] 的主要目标是成为本地 Kubernetes 应用开发的最佳工具,并支持所有适合的 Kubernetes 特性。 +* [kind][5] 使用 Docker 容器“节点”运行本地 Kubernetes 集群。 +* [CodeReady Containers][6](CRC)用来管理为测试和开发目的优化的本地 OpenShift 4.x 集群。 +* [Minishift][7] 通过在虚拟机 (VM) 内运行单节点的 OpenShift 集群,帮助你在本地运行 OpenShift 3.x 集群。 + +### Minikube + +![Minikube][8] + +[Minikube][10] 是在本地计算机上运行 Kubernetes 环境的最知名、最流行的选择。无论你使用什么操作系统,[Minikube 的文档][11]都会为你提供一个简单的[安装][12]指南。一般来说,安装 Minikube 只需运行两条命令: + +``` +$ curl -LO https://storage.googleapis.com/minikube/releases/latest/minikube-PLATFORM-amd64 +$ sudo install minikube-PLATFORM-amd64 /usr/local/bin/minikube +``` + +Minikube 可在 Linux、macOS 或 Windows 上快速设置本地 Kubernetes 集群,其功能如下: + +* 支持最新的 Kubernetes 版本(包括 6 个以前的小版本) +* 跨平台(Linux、macOS、Windows) +* 以虚拟机、容器或裸机的形式部署 +* 支持多个容器运行时(CRI-O、containerd、Docker) +* 用于快速推送镜像的 Docker API 端点 +* 负载均衡器、文件系统挂载、FeatureGates 和其他高级功能 +* 用于轻松安装 Kubernetes 应用的附加组件 + +因为 Minikube 是一个开源项目,你可以对它的[源代码][4]做贡献。 + +### kind + +![kind][13] + +[kind][14] 的开发者将其描述为“一个使用 Docker 容器‘节点’运行本地 Kubernetes 集群的工具”。它是为测试 Kubernetes 而设计的,但也可能用于本地开发或持续集成。 + +kind 支持: + +* 多节点(包括高可用性)集群 +* 从源码构建 Kubernetes 版本 +* Make/Bash/Docker 或 Bazel,以及预发布构建 +* Linux、MacOS 和 Windows + +此外,kind 是一个经过云原生计算基金会(CNCF)认证的 Kubernetes 合规安装程序。因为它是开源的,你可以在它的 GitHub 仓库中找到 kind 的[源码][5]。 + +### CodeReady Container (CRC) + +![CodeReady Container][15] + +如果你想在本地尝试最新版本的 OpenShift,可以尝试红帽的 [CodeReady Containers][16] (CRC)。CRC 将一个最小的 OpenShift 4.x 集群带到你的本地计算机上,为开发和测试目的提供一个最小的环境。CRC 主要针对开发者的桌面使用。 + +你可以在 GitHub 上找到 CodeReady Container 的[源码][6],也是在 Apache 2.0 许可下提供的。 + +### Minishift + +![Minishift][17] + +[Minishift][7] 项目帮助你在本地用 [OKD][19] 在虚拟机内的单节点 OpenShift 集群[运行一个版本的 OpenShift][18]。你可以用它来[尝试 OpenShift][20],或者在你的本地主机上为云开发。 + +和这个列表中的其他工具一样,Minishift 也是开源的,你可以在 GitHub 上访问它的[源码][7]。 + +### 为人服务的 Kubernetes + +正如你所看到的,有几种方法可以在本地环境中试用 Kubernetes。我有遗漏么?欢迎留言提问或提出建议。 + +-------------------------------------------------------------------------------- + +via: https://opensource.com/article/20/11/run-kubernetes-locally + +作者:[Bryant Son][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/brson +[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://kubernetes.io/ +[3]: https://www.apache.org/licenses/LICENSE-2.0 +[4]: https://github.com/kubernetes/minikube +[5]: https://github.com/kubernetes-sigs/kind +[6]: https://github.com/code-ready/crc +[7]: https://github.com/minishift/minishift +[8]: https://opensource.com/sites/default/files/uploads/1_minikube.jpg (Minikube) +[9]: https://creativecommons.org/licenses/by-sa/4.0/ +[10]: https://minikube.sigs.k8s.io/docs/ +[11]: https://minikube.sigs.k8s.io/docs +[12]: https://minikube.sigs.k8s.io/docs/start/ +[13]: https://opensource.com/sites/default/files/uploads/2_kind.jpg (kind) +[14]: https://kind.sigs.k8s.io +[15]: https://opensource.com/sites/default/files/uploads/4_crc.jpg (CodeReady Container) +[16]: https://code-ready.github.io/crc +[17]: https://opensource.com/sites/default/files/uploads/3_minishift.jpg (Minishift) +[18]: https://www.redhat.com/sysadmin/kubernetes-cluster-laptop +[19]: https://www.okd.io/ +[20]: https://www.redhat.com/sysadmin/learn-openshift-minishift \ No newline at end of file diff --git a/published/202011/20201103 GnuCash- A Powerful Open Source Accounting Software.md b/published/202011/20201103 GnuCash- A Powerful Open Source Accounting Software.md new file mode 100644 index 0000000000..f8086ecdaa --- /dev/null +++ b/published/202011/20201103 GnuCash- A Powerful Open Source Accounting Software.md @@ -0,0 +1,95 @@ +[#]: collector: (lujun9972) +[#]: translator: (geekpi) +[#]: reviewer: (wxy) +[#]: publisher: (wxy) +[#]: url: (https://linux.cn/article-12823-1.html) +[#]: subject: (GnuCash: A Powerful Open Source Accounting Software) +[#]: via: (https://itsfoss.com/gnucash/) +[#]: author: (Ankush Das https://itsfoss.com/author/ankush/) + +GnuCash:一个强大的开源会计软件 +====== + +> GnuCash 是一款流行的自由开源的会计软件,可用于管理个人财务和商业交易。 + +![](https://img.linux.net.cn/data/attachment/album/202011/14/070431j1547hbh3v2j4vhh.jpg) + +考虑到管理个人财务和商业交易的复杂性,你会发现有很多旨在简化这些的在线服务或软件工具。有些工具只是让你添加支出和收入来跟踪你的储蓄,而其他一些工具则提供不同的功能。 + +我在过去已经介绍过几个[开源会计软件][1]。在这里,我将重点介绍其中一个 — **GnuCash**,它是一款很流行的免费会计软件,为所有用户提供了很多功能。 + +### GnuCash: 自由开源的会计软件 + +![][2] + +GnuCash 是一款为专业需求量身定做的免费会计软件,可以追踪交易、股票等。它适用于 Linux、BSD、macOS 和 Windows。 + +虽然刚开始使用可能会让人不知所措,但对于管理个人交易而言很容易使用。在你开始管理一个账户,并添加交易后,你可以得到一个详细的报告。 + +### GnuCash 的功能 + +![][3] + +正如我前面提到的,GnuCash 带来了一大堆功能,这对于一个刚接触会计的人来说可能会让人不知所措,但我认为它应该是值得的: + + * 复式记账 + * 股票/债券/共同基金账户 + * 有税务支持的小企业会计(如印度的商品和服务税) + * 详细的分类报告 + * 便于分析的图表 + * 支持财务计算 + * 自动保存功能 + * 彩色编码 + * 网上银行向导 + * 日志 + * 贷款还款计算器 + * 用于快速计算的价格数据库 + * 每个类别的预算平衡表、流程、图表 + * 能够以 CSV 格式导出 + * 分别添加客户、供应商和雇员记录。 + * 计划交易记录 + * 制定预算的能力 + * 配置账单生成器,以简化会计程序。 + +我不是专家,但这只是冰山一角。你会发现有很多选项可以根据你的会计需求进行定制和设置。 + +![Gnucash Report][4] + +### 在 Linux 上安装 GnuCash + +你可以在你的 Linux 发行版的软件中心找到 GnuCash。从那里安装或使用[发行版的软件包管理器][5]。 + +对于那些想要最新版本的人来说,还可以使用 [Flatpak 包][6]。如果你不知道它,我建议你去看看我们的 [Flatpak 指南][7]。 + +另外,你也可以从源码构建,或者你可以前往他们的[官方下载页面][8]来探索适合你的 Linux 发行版选项。 + +- [GnuCash][9] + +### 总结 + +对于基本的个人理财来说,这对我来说有点复杂,因为我更喜欢安卓应用的简单。不过,如果你试上几分钟,就会发现它很容易理解,GnuCash 似乎可以灵活地满足大多数要求。 + +如果你想管理自己或企业的财务,你可以尝试一下。它绝对比在电子表格中保存数据要好。 :) + +-------------------------------------------------------------------------------- + +via: https://itsfoss.com/gnucash/ + +作者:[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/open-source-accounting-software/ +[2]: https://i0.wp.com/itsfoss.com/wp-content/uploads/2020/11/gnucash.jpg?resize=800%2C633&ssl=1 +[3]: https://i2.wp.com/itsfoss.com/wp-content/uploads/2020/11/gnucash-screenshot.jpg?resize=800%2C636&ssl=1 +[4]: https://i1.wp.com/itsfoss.com/wp-content/uploads/2020/11/gnucash-report.jpg?resize=800%2C638&ssl=1 +[5]: https://itsfoss.com/package-manager/ +[6]: https://flathub.org/apps/details/org.gnucash.GnuCash +[7]: https://itsfoss.com/flatpak-guide/ +[8]: https://www.gnucash.org/download.phtml#distribution +[9]: https://www.gnucash.org diff --git a/published/202011/20201103 Linux Jargon Buster- What are GUI, CLI and TUI in Linux.md b/published/202011/20201103 Linux Jargon Buster- What are GUI, CLI and TUI in Linux.md new file mode 100644 index 0000000000..b75edaa882 --- /dev/null +++ b/published/202011/20201103 Linux Jargon Buster- What are GUI, CLI and TUI in Linux.md @@ -0,0 +1,104 @@ +[#]: collector: (lujun9972) +[#]: translator: (wxy) +[#]: reviewer: (wxy) +[#]: publisher: (wxy) +[#]: url: (https://linux.cn/article-12809-1.html) +[#]: subject: (Linux Jargon Buster: What are GUI, CLI and TUI in Linux?) +[#]: via: (https://itsfoss.com/gui-cli-tui/) +[#]: author: (Abhishek Prakash https://itsfoss.com/author/abhishek/) + +Linux 黑话解释:什么是 Linux 中的 GUI、CLI 和 TUI? +====== + +![](https://img.linux.net.cn/data/attachment/album/202011/10/092051zw3ofb365a63fahl.jpg) + +当你开始使用 Linux 并关注关于 Linux 的网站和论坛时,你会经常遇到诸如 GUI、CLI 等术语,有时还会遇到 TUI。 + +这一章的 Linux 黑话解释简要解释了这些术语,以便你作为一个(新的)Linux 用户在使用这些缩写词时能够更好地理解上下文。 + +说实话,像 GUI、CLI 或 TUI 这样的术语并不是 Linux 的专属术语。这些都是通用的计算术语,你会发现在非 Linux 的讨论中也会用到它们。 + +### GUI - 图形用户界面Graphical User Interface + +这可能是你在这里最常遇到的词汇。这是因为我们专注于桌面 Linux 用户,并试图涵盖易于使用的图形化方法和应用程序。 + +GUI 应用程序(或图形应用程序)基本上是指任何可以与你的鼠标、触摸板或触摸屏交互的东西。有了图标和其他视觉概念,你可以使用鼠标指针来访问功能。 + +![GIMP:一个用于照片编辑的GUI应用程序][1] + +在 Linux 上,[桌面环境][2]为你提供了与系统交互的图形界面,然后,你可以使用 GUI 应用程序,如 GIMP,VLC、Firefox、LibreOffice、文件管理器等来完成各种任务。 + +GUI 使普通用户的计算机使用变得更加容易,否则它将仍然是一个极客专用区。 + +### CLI - 命令行界面Command Line Interface + +CLI 基本上是一个接受输入来执行某种功能的命令行程序。基本上,任何可以在终端中通过命令使用的应用程序都属于这一类。 + +![apt-cache 是一个 CLI 工具,用于在基于 Debian 的系统上与 APT 缓存交互][3] + +早期的电脑与操作系统交互没有鼠标,你必须使用命令与机器互动。 + +如果你认为这都算困难,那你应该知道,早期的计算机甚至没有一个屏幕可以看到正在输入的东西,他们用实体的纸质打印机看到他们的输入命令。我从来没有用过这样的电脑,也没有在现实生活中看到过。我用过的最接近的东西是学习期间的单片机套件。 + +![肯•汤普森和丹尼斯•里奇在 PDP11 电脑上开发 UNIX 操作系统][4] + +现在的 CLI 还有用吗?当然有。命令总是有它的好处,特别是当你处理操作系统的核心功能和配置时,比如设置防火墙、管理网络甚至[包管理][5]。 + +你可能会有一个基于 GUI 的应用程序来完成同样的任务,但命令可以让你更精细地访问这些功能。在一些情况下,你会发现 GUI 应用程序也会用命令(在它们的代码中使用)与操作系统交互。 + +![Handbrake GUI 应用程序在底层使用 FFMPEG CLI 工具][6] + +许多流行的 GUI 应用程序往往是基于 CLI 工具的。以[Handbrake][7] 为例。这是一个流行的开源媒体转换器,它底层使用的是 [FFMPEG 命令行][8]工具。 + +很明显,使用命令行工具没有图形工具那么简单。不要担心。除非你有特殊需要,否则你应该可以用图形化的方式使用 Linux 系统。然而,了解基本的 Linux 命令会有很大的帮助。 + +### TUI - 终端用户界面Terminal User Interface(也称为基于文本的用户界面Text-based User Interface) + +这是三者中最不常见的名词。TUI 基本上部分是 GUI,部分是 CLI。糊涂了吗?让我为你解释一下。 + +你已经知道,早期的计算机使用 CLI。在实际的 GUI 出现之前,基于文本的用户界面在终端中提供了一种非常基本的图形交互。你会有更多的视觉效果,也可以使用鼠标和键盘与应用程序进行交互。 + +![终端中的 nnn 文件浏览器][9] + +TUI 是基于文本的用户界面或终端用户界面的缩写。“基于文本”这个说法主要是因为你在屏幕上有一堆文本,而“终端用户界面”的说法是因为它们只在终端中使用。 + +TUI 的应用虽然不是那么常见,但你还是有一些的。[基于终端的 Web 浏览器][10]是 TUI 程序的好例子。[基于终端的游戏][11]也属于这一类。 + +![CMUS 是基于终端的音乐播放器][12] + +当你在 [Ubuntu 中安装多媒体编解码器][13]时,你可能会遇到 TUI,你必须接受 EULA 或做出选择。 + +TUI 应用程序不像 GUI 应用程序那样用户友好,它们经常会有学习曲线,但它们比命令行工具更容易使用一些。 + +### 最后…… + +TUI 应用程序通常也被认为是 CLI 应用程序,因为它们被限制在终端上。在我看来,你是否认为它们与 CLI 不同,这取决于你。 + +我希望你喜欢这篇 Linux 黑话解释。如果你对这个系列的主题有什么建议,请在评论中告诉我,我将在以后尽量涵盖它们。 + +-------------------------------------------------------------------------------- + +via: https://itsfoss.com/gui-cli-tui/ + +作者:[Abhishek Prakash][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://itsfoss.com/author/abhishek/ +[b]: https://github.com/lujun9972 +[1]: https://i1.wp.com/itsfoss.com/wp-content/uploads/2018/04/gimp-2-10-interface.jpg?resize=800%2C450&ssl=1 +[2]: https://itsfoss.com/what-is-desktop-environment/ +[3]: https://i1.wp.com/itsfoss.com/wp-content/uploads/2020/10/apt-cache-search-names-only.png?resize=759%2C209&ssl=1 +[4]: https://i0.wp.com/itsfoss.com/wp-content/uploads/2020/11/Ken_Thompson_and_Dennis_Ritchie_at_PDP-11.jpg?resize=800%2C641&ssl=1 +[5]: https://itsfoss.com/package-manager/ +[6]: https://i2.wp.com/itsfoss.com/wp-content/uploads/2019/11/handbrake.png?resize=800%2C537&ssl=1 +[7]: https://itsfoss.com/handbrake/ +[8]: https://itsfoss.com/ffmpeg/ +[9]: https://i2.wp.com/itsfoss.com/wp-content/uploads/2020/10/nnn-file-browser.jpg?resize=800%2C597&ssl=1 +[10]: https://itsfoss.com/terminal-web-browsers/ +[11]: https://itsfoss.com/best-command-line-games-linux/ +[12]: https://i2.wp.com/itsfoss.com/wp-content/uploads/2017/07/cmus-interface.png?resize=734%2C436&ssl=1 +[13]: https://itsfoss.com/install-media-codecs-ubuntu/ diff --git a/published/202011/20201103 The New Raspberry Pi 400 is Basically a Tiny Computer Inside a Keyboard.md b/published/202011/20201103 The New Raspberry Pi 400 is Basically a Tiny Computer Inside a Keyboard.md new file mode 100644 index 0000000000..1a070873f6 --- /dev/null +++ b/published/202011/20201103 The New Raspberry Pi 400 is Basically a Tiny Computer Inside a Keyboard.md @@ -0,0 +1,99 @@ +[#]: collector: (lujun9972) +[#]: translator: (wxy) +[#]: reviewer: (wxy) +[#]: publisher: (wxy) +[#]: url: (https://linux.cn/article-12793-1.html) +[#]: subject: (The New Raspberry Pi 400 is Basically a Tiny Computer Inside a Keyboard) +[#]: via: (https://itsfoss.com/raspberry-pi-400/) +[#]: author: (Ankush Das https://itsfoss.com/author/ankush/) + +新的树莓派 400:一台藏身于键盘内微型计算机 +====== + +树莓派是什么已经无需介绍。这台起初是为 DIY 爱好者打造的低规格电脑,现在可以作为全功能桌面使用了。 + +随着树莓派 400 的发布,使得它更加适合作为家庭电脑使用。树莓派 400 基本上是一台藏身于键盘内微型计算机。 + +如果你还记得,[Commodore 64][1] 在 1982 年时也是一台键盘形式的电脑。尽管树莓派 400 并不是独一无二的,但对于树莓派这样的成功产品来说,这是一个令人心仪的产品。 + +### 树莓派 400 概观 + +![][2] + +它是基于树莓派 4 的(带有 4GB 内存),并已调整附加了冷却器。它采用四核处理器,速度比以往更快。 + +除了易用性和便携性,它还可以为你节省很多桌面空间。而且,就像我一样,如果你打算买一台备用电脑来测试东西,我想我可能会选择树莓派 400,而不是组装另一台 PC 或[基于 Linux 的迷你 PC][3]。 + +尽管我在下面提到了它的技术规格,但你可以观看官方视频来了解它的外观,以及它所承诺的是否可以满足作为你的家用电脑的需求。 + +![video](https://www.youtube.com/embed/ZSvHJ97d8n8) + +### 树莓派 400 技术规格 + + * 博通 BCM2711 四核 Cortex-A72(ARM v8)64 位 SoC @ 1.8GHz + * 4GB LPDDR4-3200 + * 双频(2.4GHz 和 5.0GHz)IEEE 802.11b/g/n/ac 无线局域网 + * 蓝牙 5.0,BLE + * 千兆以太网 + * 2 个 USB 3.0 和 1 个 USB 2.0 端口 + * 水平 40 针 GPIO 头 + * 2 个 micro HDMI 端口(支持最高 4Kp60) + * H.265(4Kp60 解码);H.264(1080p60 解码,1080p30 编码);OpenGL ES 3.0 图形 + * micro SD 卡插槽,用于操作系统和数据存储 + * 78 或 79 键的小型键盘(取决于地区差异) + * 5V DC,通过 USB 连接器 + * 工作温度:环境温度 0℃ 至 +50℃。 + * 最大尺寸 286 毫米 × 122 毫米 × 23 毫米 + +![][4] + +### 定价与供应 + +这是你付出 **70** 美元,所能得到的最好的现代家用电脑,只需一个键盘就可以简单的携带到任何地方(你只需要一个屏幕连接)。 + +你可以花 70 美元只买树莓派 400,也可以花 100 美元买完整的套装,它还包括一个 USB 鼠标、micro HDMI 转 HDMI 线、USB-C 电源、一本初学者指南和一张预装了树莓派操作系统的 SD 卡。 + +如果你想知道,对于键盘布局的支持,新闻稿中是这样提到的: + +> 在发布时,我们支持英语(英国和美国)、法语、意大利语、德语和西班牙语的键盘布局,并(首次)提供翻译版的新手指南。在不久的将来,我们计划支持与我们的[官方键盘][5]相同的语言集。 + +换句话说,一开始他们就支持所有主要的键盘布局。所以,对于大多数人来说,这应该不是问题。 + +除了键盘布局的细节外,下面是你如何获得树莓派 400 的方法: + +> 英国、美国和法国的树莓派 400 [套件][6]和[电脑][7]现在就可以购买。意大利、德国和西班牙的产品正在送往树莓派授权经销商的路上,他们应该在下周就会有货。 +> +> 我们预计,印度、澳大利亚和新西兰的授权经销商将在今年年底前拿到套件和电脑。我们也在迅速推出其他地区的合规认证,因此树莓派 400 将在 2021 年的前几个月在全球范围内上市。 +> +> 当然,如果你在剑桥附近的任何地方,你可以前往[树莓派商店][8],今天就可以领取你的树莓派 400。 + +- [树莓派 400][9] + +### 总结 + +在远程办公成为新常态的当下,树莓派 400 绝对是令人印象深刻的好东西,也是非常有用的。 + +你对新的树莓派 400 有什么看法?打算买一台吗?在下面的评论中告诉我你的想法。 + +-------------------------------------------------------------------------------- + +via: https://itsfoss.com/raspberry-pi-400/ + +作者:[Ankush Das][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://itsfoss.com/author/ankush/ +[b]: https://github.com/lujun9972 +[1]: https://en.wikipedia.org/wiki/Commodore_64 +[2]: https://i0.wp.com/itsfoss.com/wp-content/uploads/2020/11/raspberry-pi-400.jpg?resize=800%2C554&ssl=1 +[3]: https://itsfoss.com/linux-based-mini-pc/ +[4]: https://i2.wp.com/itsfoss.com/wp-content/uploads/2020/11/raspberry-pi-400-shot.jpeg?resize=800%2C572&ssl=1 +[5]: https://www.raspberrypi.org/products/raspberry-pi-keyboard-and-hub/ +[6]: https://www.raspberrypi.org/products/raspberry-pi-400/ +[7]: https://www.raspberrypi.org/products/raspberry-pi-400-unit/ +[8]: https://www.raspberrypi.org/raspberry-pi-store/ +[9]: https://www.raspberrypi.org/products/raspberry-pi-400 diff --git a/published/202011/20201105 5 surprising ways I use Jupyter to improve my life.md b/published/202011/20201105 5 surprising ways I use Jupyter to improve my life.md new file mode 100644 index 0000000000..8caca94e32 --- /dev/null +++ b/published/202011/20201105 5 surprising ways I use Jupyter to improve my life.md @@ -0,0 +1,89 @@ +[#]: collector: (lujun9972) +[#]: translator: (wxy) +[#]: reviewer: (wxy) +[#]: publisher: (wxy) +[#]: url: (https://linux.cn/article-12816-1.html) +[#]: subject: (5 surprising ways I use Jupyter to improve my life) +[#]: via: (https://opensource.com/article/20/11/surprising-jupyter) +[#]: author: (Moshe Zadka https://opensource.com/users/moshez) + +5 种令人惊讶的使用 Jupyter 的方式 +====== + +> Jupyter 不仅仅是一个数据分析工具,让我们看看如何以最有创意的方式使用这个基于 Python 的软件。 + +![](https://img.linux.net.cn/data/attachment/album/202011/12/224138d99jlp3q5qjqv5v7.jpg) + +[Jupyter][2] 项目提供了用 JupyterLab 和 Jupyter Notebook 等交互式编写软件的技术方式。这个软件通常用于数据分析,但你可能不知道(Jupyter 社区也没有想到),你可以用它做多少事情。 + +以下是我使用 Jupyter 的五大意想不到的创造性方法。 + +### 1、处理图像 + +在[图像编辑和处理][3]方面,有很多很好的开源工具 —— 从那些可以与 Photoshop 媲美的工具到实验性的 [Glimpse][4]。但即使有这么多选择,有时我还是不想离开 [Python][5] 的世界。 + +幸运的是,Jupyter 是一个做轻量级图像处理的好选择。利用 Jupyter 直接将 [Pillow][6] 对象显示为图像的优势,让你可以尽情地对图片进行实验。我甚至还用它给孩子[做了一个涂色画][7]。 + +### 2、做一个 SSH 跳板遥控器 + +由于 JupyterLab 可以让你[上传和下载][8]文件、[编辑][9]文件,甚至[运行终端][10],所以它拥有制作 SSH 跳板环境所需的所有部件。 + +通过一些 SSH 转发魔法,你可以让 Jupyter 成为防火墙另一边的[远程控制台][11]。 + +### 3、开发 Web 应用程序 + +我最喜欢的使用 Jupyter 的方式之一是用于一种意想不到的软件开发。我[做了一次演讲][12],在演讲中,我使用 Jupyter Notebook 实时开发了一个 [Web 应用][13]。讲演的最后是一个简单的表单,它是 XSS 和 CSS 安全的,并包括一些轻量级的服务器端计算。 + +一个日常的 Jupyter 用户可能不会期望它是一个最棒的 Web 开发环境,但它是一个非常强大的环境。 + +### 4、从你喜欢的服务中提取报告 + +JupyterLab 中的数据分析是一种常见的用法,但自我提升分析self-improvement analysis呢? + +你可以使用 Jupyter 来[分析你的日历][14]。如果你最喜欢的服务允许 API 导出,甚至可以让你导出一个 CSV,你可以将这些与你的日历进行关联。如果你发现你在社交媒体上发帖的时候,你的日历上写着你应该和你的经理开会,那 Jupyter 也救不了你! + +### 5、开发游戏 + +对于扩大对 Jupyter Notebook 的期望值,我最喜欢的方式是和孩子一起建立一个游戏。我之前写过这方面的文章,有一个使用 [PursuedPyBear][16] 和 Jupyter [编写游戏][15]的分步教程。 + +在试图弄清游戏机制时,这种迭代式的游戏开发方法特别有用。能够在游戏中途改变规则(对不起,我必须得这样做)是一个改变游戏规则的方法。 + +你甚至可以使用 IPywidgets 来修改数字参数,就像[这个视频][17]所示。 + +### 下载电子书 + +JupyterLab 和 Jupyter Notebooks 提供了一个不可思议的实验环境。[下载这本指南][18],其中包含了以令人吃惊的方式使用 Jupyter 的教程。  + +你是如何以创造性的方式使用它的?在下面的评论中分享你的最爱。 + +-------------------------------------------------------------------------------- + +via: https://opensource.com/article/20/11/surprising-jupyter + +作者:[Moshe Zadka][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/moshez +[b]: https://github.com/lujun9972 +[1]: https://opensource.com/sites/default/files/styles/image-full-size/public/lead-images/computer_space_graphic_cosmic.png?itok=wu493YbB (Computer laptop in space) +[2]: https://jupyter.org/ +[3]: https://opensource.com/life/12/6/design-without-debt-five-tools-for-designers +[4]: https://glimpse-editor.github.io/ +[5]: https://opensource.com/resources/python +[6]: https://pillow.readthedocs.io/en/stable/index.html +[7]: https://opensource.com/article/20/8/edit-images-python +[8]: https://jupyterlab.readthedocs.io/en/stable/user/files.html#uploading-and-downloading +[9]: https://jupyterlab.readthedocs.io/en/stable/user/files.html#opening-files +[10]: https://jupyterlab.readthedocs.io/en/stable/user/terminal.html +[11]: https://opensource.com/article/20/8/remote-management-jupyter +[12]: https://opensource.com/article/20/8/write-talk-using-jupyter-notebooks +[13]: https://github.com/moshez/interactive-web-development/blob/e31ae72d8cab7637d18bc734c4e8afc10c60251f/interactive-web-development.ipynb +[14]: https://opensource.com/article/20/9/analyze-your-life-jupyter +[15]: https://opensource.com/article/20/5/python-games +[16]: https://ppb.dev/ +[17]: https://www.youtube.com/watch?v=JaTf_ZT7tE8 +[18]: https://opensource.com/downloads/jupyter-guide diff --git a/published/202011/20201105 Got Kids- Limit Computer Usage Per Account in Linux With Timekpr-nExt.md b/published/202011/20201105 Got Kids- Limit Computer Usage Per Account in Linux With Timekpr-nExt.md new file mode 100644 index 0000000000..50d25c00a5 --- /dev/null +++ b/published/202011/20201105 Got Kids- Limit Computer Usage Per Account in Linux With Timekpr-nExt.md @@ -0,0 +1,109 @@ +[#]: collector: (lujun9972) +[#]: translator: (geekpi) +[#]: reviewer: (wxy) +[#]: publisher: (wxy) +[#]: url: (https://linux.cn/article-12835-1.html) +[#]: subject: (Got Kids? Limit Computer Usage Per Account in Linux With Timekpr-nExt) +[#]: via: (https://itsfoss.com/timekpr-next/) +[#]: author: (Abhishek Prakash https://itsfoss.com/author/abhishek/) + +有孩子吗?使用 Timekpr-nExt 限制 Linux 中每个账户的电脑使用 +====== + +![](https://img.linux.net.cn/data/attachment/album/202011/18/004039svxva9wrvva2xias.jpg) + +> 本周的开源软件亮点是 Timekpr-nExt。它是一个 GUI 应用,用于限制 Linux 系统中某些账户的电脑使用。对于不想让孩子花太多时间在电脑上的父母来说,这是一个方便的工具。 + +### 使用 Timekpr-nExt 在 Linux 上限制电脑使用 + +如果你家里有小孩,他们花太多时间在电脑上,你可能想对他们的使用进行一些限制。 + +可以让你根据一天的时间、一天、一周或者一月的小时数来限制某些账户的电脑使用。你也可以设置时间间隔来强制账户用户休息。 + +![][1] + +给定的时间超过后,用户会自动登出,直到满足限制条件才可以重新登录。 + +![][2] + +当然,这意味着你需要为孩子们单独设置非管理员(无 `sudo` 权限)账户。如果孩子们的账户也有管理员权限,他们可以很容易地改变设置。孩子们很聪明,你知道的。 + +### Timekpr-nExt 的功能 + +除了一个令人讨厌的风格化的名字,Timekpr-nExt 有以下功能: + +* 将系统使用限制设置为按日智能限制、每日、每周或每月限制 +* 你还可以根据时间和小时设置访问限制 +* 用户可以看到关于他们还剩多少时间的通知 +* 设置锁定动作(终止会话、关闭、暂停或锁定屏幕) +* 追踪账户的时间使用情况 + +请注意以下事项: + +* 仔细检查你正在配置的账户。**不要把自己锁定** +* 每次更改配置时,请点击应用或设置按钮,否则更改将不会被设置 +* 儿童帐户不应该有管理员操作,否则他们会覆盖设置 + +这里阅读[关于使用 Timekpr-nExt 的更多信息的文档][3]。 + +### 在 Linux 中安装 Timekpr-nExt + +对于基于 Ubuntu 的 Linux 发行版(如 Mint、Linux Lite 等),有一个[官方 PPA 可用][4]。你可以通过以下命令逐步安装它: + +``` +sudo add-apt-repository ppa:mjasnik/ppa +sudo apt update +sudo apt install timekpr-next +``` + +Arch Linux 用户可以[在 AUR 中找到它][5]。对于其他用户,请检查你的发行版仓库。如果没有这样的包,你可以尝试使用源码。 + +- [Timekpr-nExt 源码][6] + +**再说一次,不要在主账户中使用 Timekpr-nExt。你可能会把自己锁在外面。** + +你会看到两个应用的实例。使用开头有 (SU) 的那个。 + +![][7] + +#### 删除 Timekpr-nExt + +我不能确定删除 Timekpr-nExt 是否也会删除你为用户设置的限制。手动恢复他们(间隔一天 24 小时)会是一个好主意。这里没有重置按钮。 + +要删除这个应用(如果你使用 PPA 安装它),使用以下命令: + +``` +sudo apt-get remove --purge timekpr-next +``` + +同时删除 PPA 仓库: + +``` +sudo add-apt-repository -r ppa:mjasnik/ppa +``` + +和[在 Linux 上屏蔽成人内容][8]一样,这个应用也是专门针对儿童的。并不是每个人都会觉得它有用,但家里有小孩的人如果觉得有必要的话,可以使用它。 + +你是否使用其他应用来监控/限制儿童访问计算机? + +-------------------------------------------------------------------------------- + +via: https://itsfoss.com/timekpr-next/ + +作者:[Abhishek Prakash][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/abhishek/ +[b]: https://github.com/lujun9972 +[1]: https://i2.wp.com/itsfoss.com/wp-content/uploads/2020/10/timekpr-next-ubuntu.png?resize=800%2C612&ssl=1 +[2]: https://i1.wp.com/itsfoss.com/wp-content/uploads/2020/10/timekpr-next-icon-system-notification-area.png?resize=640%2C94&ssl=1 +[3]: https://mjasnik.gitlab.io/timekpr-next/ +[4]: https://launchpad.net/~mjasnik/+archive/ubuntu/ppa +[5]: https://aur.archlinux.org/packages/timekpr-next/ +[6]: https://launchpad.net/timekpr-next +[7]: https://i2.wp.com/itsfoss.com/wp-content/uploads/2020/10/timekeeper-next.jpg?resize=799%2C250&ssl=1 +[8]: https://itsfoss.com/how-to-block-porn-by-content-filtering-on-ubuntu/ \ No newline at end of file diff --git a/published/202011/20201105 How to Check Free Disk Space on Linux -Terminal and GUI Methods.md b/published/202011/20201105 How to Check Free Disk Space on Linux -Terminal and GUI Methods.md new file mode 100644 index 0000000000..f8ac5b6f0e --- /dev/null +++ b/published/202011/20201105 How to Check Free Disk Space on Linux -Terminal and GUI Methods.md @@ -0,0 +1,127 @@ +[#]: collector: (lujun9972) +[#]: translator: (robsean) +[#]: reviewer: (wxy) +[#]: publisher: (wxy) +[#]: url: (https://linux.cn/article-12831-1.html) +[#]: subject: (How to Check Free Disk Space on Linux [Terminal and GUI Methods]) +[#]: via: (https://itsfoss.com/check-free-disk-space-linux/) +[#]: author: (Abhishek Prakash https://itsfoss.com/author/abhishek/) + +如何在 Linux 上检查可用的磁盘空间 +====== + +![](https://img.linux.net.cn/data/attachment/album/202011/17/111346h0vrdvldsy6hlhlh.jpg) + +> 我已经使用了多少磁盘空间? + +在 Linux 上查找可用磁盘空间的最简单的方法是[使用 df 命令][1] 。`df` 命令从字面意思上代表着磁盘可用空间disk free,很明显,它将向你显示在 Linux 系统上的可用磁盘空间。 + +``` +df -h +``` + +使用 `-h` 选项,它将以人类可读的格式(MB 和 GB)来显示磁盘空间。 + +这里是针对我 Dell XPS 系统的 `df` 命令的输出,它使用了加密磁盘并且只安装了 Linux: + +![在 Linux 中使用 df 命令检查可用磁盘空间][2] + +如果上面的输出使你感到困惑,不用担心。我将介绍一些关于在 Linux 中检查可用磁盘空间的东西。我也将为桌面 Linux 用户展示 GUI 方法。 + +### 方法 1: 使用 df 命令来检查在 Linux 中的可用磁盘空间(并理解它的输出) + +当你使用 `df` 命令来检查磁盘空间时,它将显示一组“文件系统”,包括它们的大小、使用的空间和可用的空间。你实际的磁盘通常应该下面列表中的一个: + + * `/dev/sda` + * `/dev/sdb` + * `/dev/nvme0n1p` + +这不是硬性的标准,但是它可以给予你一个指示,它可以让你能够很容易地从一堆文字中辨别出真正的磁盘。 + +你的 Linux 系统在你的磁盘上可能有一些用于引导 分区、EFI 分区、根分区、交换分区、家目录等的分区。在这种情况下,这些分区在“磁盘名称”的结尾处使用一个数字来标示,像 `/dev/sda1`、`/dev/nvme0n1p2` 等等。 + +你可以从它们的挂载点来辨认出哪个分区是用于做什么的。根分区挂载在 `/`、EFI 分区在 `/boot/EFI` 等等。 + +就我的情况来说,我已经使用了根分区下磁盘空间(232 GB)的 41% 。如果你有 2 到 3 个大分区(像根分区、家目录分区等等),你将不得不在这里计算一下已使用的磁盘空间。 + +![理解 df 命令输出][3] + + * `tmpfs`:[tmpfs][4](临时文件系统)用于在虚拟存储器中保持文件。你可以随意地忽略这个虚拟文件系统。 + * `udev`:[udev 文件系统][5] 用于存储插入到你系统的设备(像 USB、网卡、CD ROM 等等)的相关信息。你也可以忽略它。 + * `/dev/loop`: 它们是环回设备。由于 snap 应用程序,在 Ubuntu 中查看磁盘时,你将看到很多的这样的设备。环回设备是虚拟设备,它们允许普通文件作为块设备文件来访问。使用环回设备,snap 应用程序在它们自己的虚拟磁盘中进行沙盒处理。尽管它们是在根分区下,但是你不需要单独计算它们使用的磁盘空间。 + +#### 丢失了磁盘空间?检查你是否挂载了所有是磁盘和分区 + +记住,`df` 命令仅显示已挂载文件系统的磁盘空间。如果你在同一块磁盘上使用多个 Linux 发行版(或者多个操作系统),或者在你的系统上有多个磁盘,你需要先挂载它们,以便查看在这些分区和磁盘上的可用磁盘空间。 + +例如,我的 [Intel NUC][6] 有两个 SSD 磁盘,并且在其上有 4 个或 5 个 Linux 分区。仅当我明确地挂载它们时,`df` 命令才会显示更多磁盘。 + +![][7] + +你可以使用 `lsblk` 命令来查看在你系统上的所有磁盘和分区。 + +![][8] + +在你有了磁盘分区名称后,你可以用这种方式来挂载它: + +``` +sudo mount /dev/sdb2 /mnt +``` + +我希望这种方法能够给你提供一个在 Linux 上检查硬盘驱动器空间的好主意。让我们看看如何在 GUI 下来完成。 + +### 方法 2: 在 GUI 下检查可用磁盘使用情况 + +在 Ubuntu 中使用 “Disk Usage Analyzer” 工具来在 GUI 的方式下检查可用磁盘空间是很容易的。 + +![Disk Usage Analyzer 工具][9] + +在这里,你将看到所有实际的磁盘和分区。你可能需要单击一些分区来挂载它们。它显示所有已挂载分区的磁盘使用情况。 + +![磁盘使用情况检查][10] + +#### 使用 GNOME 的 Disks 实用程序来检查可用磁盘空间 + +除此之外,GNOME 的 Disks 实用程序也是非常容易使用的工具。 + +![GNOME 的 Disks 工具][11] + +启动工具和选择磁盘。选择一个分区来查看可用磁盘空间。如果没有挂载分区,那么先通过单击 “▶” 图标来挂载它。 + +![检查 Ubuntu 的桌面版本的可用磁盘空间][12] + +我认为在 Linux 上的所有主要桌面环境都有某种图形工具来检查磁盘使用情况。你可以在你是桌面 Linux 系统的菜单中搜索它。 + +### 结束语 + +当然,有很多方法和工具来检查磁盘空间。为此,我向你显示了最常用的命令行方法和 GUI 方法。 + +我也解释一些可能会让你很难理解磁盘使用情况的东西。希望你喜欢它。 + +如果你有问题或建议,请在评论区告诉我。 + +-------------------------------------------------------------------------------- + +via: https://itsfoss.com/check-free-disk-space-linux/ + +作者:[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://linuxhandbook.com/df-command/ +[2]: https://i1.wp.com/itsfoss.com/wp-content/uploads/2020/11/free-disk-space-linux-df-command-output.png?resize=786%2C475&ssl=1 +[3]: https://i1.wp.com/itsfoss.com/wp-content/uploads/2020/11/df-command-output.png?resize=800%2C600&ssl=1 +[4]: https://www.kernel.org/doc/html/latest/filesystems/tmpfs.html +[5]: https://wiki.debian.org/udev +[6]: https://itsfoss.com/install-linux-on-intel-nuc/ +[7]: https://i2.wp.com/itsfoss.com/wp-content/uploads/2020/11/df-command-ubuntu-1.png?resize=786%2C443&ssl=1 +[8]: https://i1.wp.com/itsfoss.com/wp-content/uploads/2020/11/lsblk-command-to-see-disks-linux.png?resize=786%2C538&ssl=1 +[9]: https://i0.wp.com/itsfoss.com/wp-content/uploads/2020/11/disk-usage-analyzer-tool-linux.jpg?resize=800%2C250&ssl=1 +[10]: https://i0.wp.com/itsfoss.com/wp-content/uploads/2020/11/free-disk-space-ubuntu-desktop.png?resize=800%2C648&ssl=1 +[11]: https://i2.wp.com/itsfoss.com/wp-content/uploads/2020/11/disks-tool-linux.jpg?resize=800%2C250&ssl=1 +[12]: https://i1.wp.com/itsfoss.com/wp-content/uploads/2020/11/free-disk-space-check-ubuntu-desktop.png?resize=800%2C600&ssl=1 diff --git a/published/202011/20201105 How to Scan-Detect New LUNs and SCSI Disks on Linux.md b/published/202011/20201105 How to Scan-Detect New LUNs and SCSI Disks on Linux.md new file mode 100644 index 0000000000..7946201c1d --- /dev/null +++ b/published/202011/20201105 How to Scan-Detect New LUNs and SCSI Disks on Linux.md @@ -0,0 +1,163 @@ +[#]: collector: (lujun9972) +[#]: translator: (geekpi) +[#]: reviewer: (wxy) +[#]: publisher: (wxy) +[#]: url: (https://linux.cn/article-12820-1.html) +[#]: subject: (How to Scan/Detect New LUNs and SCSI Disks on Linux) +[#]: via: (https://www.2daygeek.com/scan-detect-luns-scsi-disks-on-redhat-centos-oracle-linux/) +[#]: author: (Magesh Maruthamuthu https://www.2daygeek.com/author/magesh/) + +如何在 Linux 上扫描/检测新的 LUN 和 SCSI 磁盘 +====== + +![](https://img.linux.net.cn/data/attachment/album/202011/14/001530vgyym7779ys09y7m.jpg) + +当 Linux 系统连接到 SAN(存储区域网络)后,你需要重新扫描 iSCSI 服务以发现新的 LUN。 + +要做到这一点,你必须向存储团队提供 Linux 主机的 WWN 号和所需的 LUN 大小。 + +这篇文章将帮助你[查找 Linux 主机的 WWN 号][1]。 + +当存储团队将 LUN 与给定的 Linux 主机进行了映射,他们将为你提供新的 LUN 详细信息。 + +LUN 在存储术语中被称为 LUN 的串行十六进制。 + +你需要扫描 SCSI 主机来寻找存储团队分配的新 LUN。 + +这可以通过两种方式进行,扫描每个 scsi 主机设备或运行 `rescan-scsi-bus.sh` 脚本来检测新磁盘。 + +扫描后可以在 `/dev/disk/by-id` 目录下找到它们。 + +``` +# ll /dev/disk/by-id + +total 0 +lrwxrwxrwx 1 root root 10 Jul 9 17:52 scsi-60a98000486e542d4f5a2f47694d684b -> ../../sdah +lrwxrwxrwx 1 root root 9 Jul 9 17:52 scsi-60a98000486e542d4f5a2f47694d684c -> ../../sdw +. +. +lrwxrwxrwx 1 root root 10 Jul 9 17:52 scsi-60a98000486e542d4f5a2f47694d684d -> ../../sdjk +lrwxrwxrwx 1 root root 10 Jul 9 17:52 scsi-60a98000486e542d4f5a2f47694d684e -> ../../sdaa +lrwxrwxrwx 1 root root 9 Jul 9 17:52 scsi-60a98000486e542d4f5a2f47694d684f -> ../../sdh +``` + +另外,如果你已经用 `multipath` 配置了它们,那么可以用 `multipath` 命令找到。 + +`multipath 主要是配置到 Oracle 数据库服务器中,以提高性能。 + +``` +# multipath -ll + +60a98000486e542d4f5a2f47694d684b dm-37 NETAPP,LUN C-Mode +size=512G features='3 queue_if_no_path pg_init_retries 50' hwhandler='1 alua' wp=rw +|-+- policy='round-robin 0' prio=50 status=active +| |- 1:0:4:18 sdoe 128:416 active ready running +| |- 0:0:4:18 sdpq 131:256 active ready running +| |- 0:0:5:18 sdsr 135:496 active ready running +| `- 1:0:5:18 sdsq 135:480 active ready running +`-+- policy='round-robin 0' prio=10 status=enabled +|- 1:0:1:18 sdfw 131:32 active ready running +|- 1:0:0:18 sdci 69:96 active ready running +|- 0:0:1:18 sdbz 68:208 active ready running +|- 0:0:0:18 sds 65:32 active ready running +|- 1:0:3:18 sdmd 69:336 active ready running +|- 1:0:2:18 sdjj 8:464 active ready running +|- 0:0:3:34 sdjt 65:368 active ready running +`- 0:0:2:34 sdgi 131:224 active ready running +``` + +这个过程适用于基于 Red Hat 6.x、7.x 和 8.x(RHEL - Red Hat Enterprise Linux)的系统,如 CentOS 和 Oracle Linux。 + +### 方法 1:如何使用 /sys 类文件在 Linux 上扫描新的 LUN 和 SCSI 磁盘 + +sysfs 文件系统是一个伪文件系统,它为内核数据结构提供了一个接口。 + +sysfs 下的文件提供了关于设备、内核模块、文件系统和其他内核组件的信息。 + +sysfs 文件系统通常被挂载在 `/sys`。通常,它是由系统自动挂载的。 + +你可以使用 `echo` 命令来扫描每个 SCSI 主机设备,如下所示: + +``` +# echo "- - -" > /sys/class/scsi_host/host[n]/scan +``` + +当你运行上面的重新扫描所有的命令时,三个破折号(`- – -`)指的是通配符选项。这些值如下: + +``` +# echo "c t l" > /sys/class/scsi_host/host[n]/scan +``` + +这里: + +* `c`:HBA 上的通道 +* `t`:SCSI 目标 ID +* `l`:LUN ID +* `n`:HBA 编号 + +运行下面的命令来查找系统中所有的主机总线编号: + +``` +# ls /sys/class/scsi_host +host0 host1 host2 +``` + +得到主机总线编号后,运行以下命令来发现新的磁盘: + +``` +# echo "- - -" > /sys/class/scsi_host/host0/scan +# echo "- - -" > /sys/class/scsi_host/host1/scan +# echo "- - -" > /sys/class/scsi_host/host2/scan +``` + +另外,还可以用 `for` 循环用一条命令进行扫描。 + +``` +# for host in ls /sys/class/scsi_host/;do echo "- - -" >/sys/class/scsi_host/${host}/scan; done +``` + +你可以使用文章开头提到的 [ls 命令][2]来检查它们。 + +``` +# ls /dev/disk/by-id | grep -i "serial-hex of LUN" +``` + +### 方法 2:如何使用 rescan-scsi-bus.sh 脚本在 Linux 上扫描新的 LUN 和 SCSI 磁盘 + +确保你已经安装了 `sg3_utils` 包来使用这个脚本。否则,运行以下命令来安装它。 + +对于 RHEL/CentOS 6/7 系统,使用 [yum 命令][3]安装 `sg3_utils`。 + +``` +# yum install -y sg3_utils +``` + +对于 RHEL/CentOS 8 和 Fedora 系统,使用 [dnf 命令][4]安装 sg3_utils。 + +``` +# dnf install -y sg3_utils +``` + +现在你可以使用 `rescan-scsi-bus.sh` 脚本重新扫描 LUN。 + +``` +# ./rescan-scsi-bus.sh +``` + +-------------------------------------------------------------------------------- + +via: https://www.2daygeek.com/scan-detect-luns-scsi-disks-on-redhat-centos-oracle-linux/ + +作者:[Magesh Maruthamuthu][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.2daygeek.com/author/magesh/ +[b]: https://github.com/lujun9972 +[1]: https://www.2daygeek.com/how-to-find-wwn-wwnn-wwpn-number-of-hba-card-in-linux/ +[2]: https://www.2daygeek.com/linux-unix-ls-command-display-directory-contents/ +[3]: https://www.2daygeek.com/linux-yum-command-examples-manage-packages-rhel-centos-systems/ +[4]: https://www.2daygeek.com/linux-dnf-command-examples-manage-packages-fedora-centos-rhel-systems/ \ No newline at end of file diff --git a/published/202011/20201105 Tweak your Git config for multiple user IDs.md b/published/202011/20201105 Tweak your Git config for multiple user IDs.md new file mode 100644 index 0000000000..746d6fc422 --- /dev/null +++ b/published/202011/20201105 Tweak your Git config for multiple user IDs.md @@ -0,0 +1,74 @@ +[#]: collector: (lujun9972) +[#]: translator: (geekpi) +[#]: reviewer: (wxy) +[#]: publisher: (wxy) +[#]: url: (https://linux.cn/article-12814-1.html) +[#]: subject: (Tweak your Git config for multiple user IDs) +[#]: via: (https://opensource.com/article/20/10/git-config) +[#]: author: (Ramanathan M https://opensource.com/users/muthiahramanathan) + +调整你的 Git 配置以适应多个用户 ID 的需要 +====== + +> 可以使用相同的机器用于工作和个人的 Git 提交,而无需手动重置你的配置。 + +![](https://img.linux.net.cn/data/attachment/album/202011/12/013805t4u4nu57rc6ur7nt.jpg) + +Git 的 [git config][2] 命令可以让你为 Git 设置仓库或全局选项。它有很多选项,其中的一个选项 `includeIf` 在你使用在 Git 时有双重角色时非常方便,比如说,你既是全职的开发者,又在业余时间为开源项目做贡献。在这种情况下,大多数人都不想为两个角色使用一个共同的配置,或者,至少,他们肯定希望保持配置的某些部分是不同的,尤其是当他们在两个角色中使用同一台计算机时。 + +我的情况就是这样,所以我在 Git 配置中保留了两组不同的邮件 ID。这样一来,在我工作场所的项目仓库中提交的内容就会使用我办公室的邮件 ID,而在我个人 GitHub 帐户中提交的内容则使用我个人的邮件 ID。 + +以下是我的全局配置(维护在 `$HOME/.gitconfig`)中的一个片段,我将在下文中介绍。 + +``` +[includeIf "gitdir:~/priv_scm/"] +        path = ~/priv_scm/.gitconfig +[includeIf "gitdir:~/work_scm/"] +        path = ~/work_scm/.gitconfig +``` + +### 什么是 includeIf? + +`includeIf.condition.path` 变量,是 `include` 配置指令的一部分,允许你有条件地设置自定义配置。同时,自定义配置的路径也可以作为指令的一部分来设置。 + +这个指令支持三个关键字:`gitdir`、`gitdir/I` 和 `onbranch`。我将简单解释一下 `gitdir`,我在上面的代码片段中使用了它。你可以在[文档][3]中了解其他两个关键词。 + +在 `includeIf` 指令中使用 `gitdir` 关键字会对模式进行条件检查。根据规则,如果当前工作目录与 `gitdir` 中指定的目录模式相匹配,那么它就会从给定的路径中选取配置。我将在配置片段上应用这个规则来展示它是如何被应用的。 + +在配置片段中,你可以看到一个简单的模式,`~/`,它与 `gitdir` 关键字一起使用。这个模式会被存储在 `$HOME` 环境变量中的值所替代。 + +### 如何使用它 + +如果你使用同一个系统在 GitHub 或 GitLab 上的开源项目上工作,并在工作中提交到 Git 仓库,你可以有两个顶级目录,比如 `$HOME/priv_scm` 和 `$HOME/work_scm`。在这两个目录中,你可以有两个单独的 `.gitconfig` 文件,其中包含与你的 `user.name` 和 `user.email` 相关的设置。然而,它们也可以包含存储在 `$HOME` 的全局 `.gitconfig` 中,它可以保存两个环境通用的所有自定义项。 + +这里是一个例子 `$HOME/priv_scm/.gitconfig` 的片段: + +``` +$ cat $HOME/priv_scm/.gitconfig +[user] +    name  = Ramanathan Muthiah +    email = <personal-mailid-goes-here> +``` + +有了这个配置,你就可以切换目录,并开始在开源项目上工作,而无需手动重置一些与 Git 相关的配置。这些更改会在主 `.gitconfig` 中借助 `includeIf` 条件指令自动处理。 + +### Git 小贴士 + +希望这个小贴士能帮助你组织 Git 项目。你最喜欢的 Git 小贴士是什么?请在评论中分享吧! + +-------------------------------------------------------------------------------- + +via: https://opensource.com/article/20/10/git-config + +作者:[Ramanathan M][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/muthiahramanathan +[b]: https://github.com/lujun9972 +[1]: https://opensource.com/sites/default/files/styles/image-full-size/public/lead-images/email_chat_communication_message.png?itok=LKjiLnQu (Chat via email) +[2]: https://git-scm.com/docs/git-config +[3]: https://git-scm.com/docs/git-config#_conditional_includes diff --git a/published/202011/20201106 Reclaim hard-drive space with LVM.md b/published/202011/20201106 Reclaim hard-drive space with LVM.md new file mode 100644 index 0000000000..e40862864f --- /dev/null +++ b/published/202011/20201106 Reclaim hard-drive space with LVM.md @@ -0,0 +1,90 @@ +[#]: collector: (lujun9972) +[#]: translator: (geekpi) +[#]: reviewer: (wxy) +[#]: publisher: (wxy) +[#]: url: (https://linux.cn/article-12864-1.html) +[#]: subject: (Reclaim hard-drive space with LVM) +[#]: via: (https://fedoramagazine.org/reclaim-hard-drive-space-with-lvm/) +[#]: author: (Troy Curtis Jr https://fedoramagazine.org/author/troycurtisjr/) + +使用 LVM 扩展卷空间 +====== + +![](https://img.linux.net.cn/data/attachment/album/202011/27/193719d3df4p4z748f33f3.jpg) + +LVM 是一个逻辑卷管理工具,包括分配磁盘、条带化、镜像和调整逻辑卷的大小。它在 Fedora 安装中被普遍使用(在 BTRFS 作为默认文件系统之前是 LVM + Ext4)。但是你是否曾经遇到过启动系统时,GNOME 提示 home 卷几乎没有空间了!幸运的是,很有可能有一些空间在另一个卷中,而未被使用,可以用于重新分配。下面就来看看如何用 LVM 回收硬盘空间。 + +在卷之间轻松重新分配空间的关键是[逻辑卷管理器(LVM)][2]。Fedora 32 及以前的系统默认使用 LVM 来划分磁盘空间。这种技术类似于标准的硬盘分区,但 LVM 更加灵活。LVM 不仅可以实现灵活的卷大小管理,还可以实现一些高级功能,比如读写快照、在多个硬盘上进行数据条带化或镜像、将高速硬盘作为慢速硬盘的缓存等等。所有这些高级选项可能会让人有点不知所措,但调整卷的大小很简单的。 + +### LVM 基础 + +**卷组**(VG)作为 LVM 系统中的主要容器。默认情况下,Fedora 只定义了一个卷组,但你可以根据需要定义多个卷组。实际的硬盘和硬盘分区被添加到卷组中作为**物理卷**(PV)。物理卷会将可用的空间添加到卷组中。一个典型的 Fedora 安装有一个格式化的启动分区,其余的硬盘是一个配置为 LVM 物理卷的分区。 + +从这个可用空间池中,卷组分配了一个或多个**逻辑卷**(LV)。这些卷类似于硬盘分区,但没有磁盘上连续空间的限制。LVM 的逻辑卷甚至可以跨越多个设备!就像硬盘分区一样,逻辑卷有一个定义的大小,可以包含任何文件系统,然后可以挂载到特定的目录。 + +### 需要什么 + +在 gnome-disks 应用中确认系统使用 LVM ,并确保其他卷中有可用的空间。如果没有可以从另一个卷中回收的空间,这个指南就没有用。还需要一个 [Fedora 临场 CD/USB][3]。任何需要收缩的文件系统都必须卸载。从临场Live镜像运行,可以让硬盘上的所有卷保持未挂载状态,甚至包括像 `/` 和 `/home` 这样的重要目录。 + +![Use gnome-disks to verify free space][4] + +### 一句话警告 + +按照这个指南,应该不会丢失任何数据,但它确实会使用一些非常底层和强大的命令。一个错误可能会破坏硬盘上的所有数据。所以要先备份磁盘上的所有数据! + +### 调整 LVM 卷的大小 + +开始时,启动 Fedora 临场镜像并在对话框中选择 “Try Fedora”。接下来,使用 “Run Command” 启动 “blivet-gui” 应用(按 `Alt-F2`,输入 `blivet-gui`,然后按回车)。选择左侧 “LVM” 下的卷组。逻辑卷在右边。 + +![Explore logical volumes in blivet-gui][5] + +逻辑卷标签由卷组名称和逻辑卷名称组成。在本例中,卷组是 `fedora_localhost-live`,分配了 `home`、`root` 和 `swap` 逻辑卷。要找到完整的卷,选择每一个卷,点击“齿轮”图标,然后选择 “resize”。调整大小对话框中的滑块表示卷的允许大小。左边的最小值是文件系统中已经使用的空间,所以这是最小可能的尺寸大小(不删除数据)。右边的最大值是基于卷组中的最大可用空间。 + +![Resize dialog in blivet-gui][6] + +灰色的 “resize” 选项意味着该卷已经满了,而且卷组中没有可用空间。 + +现在可以更改大小了!查看所有的卷,就像上面的截图那样,找到一个有足够空间的卷。并像上面的截图那样,在所有的卷中找到一个有大量额外空间的卷。向左移动滑块来设置新的大小。腾出足够的空间对整个卷有用,但仍然要为未来的数据增长留出足够的空间。否则,这个卷将是下一个被填满的卷。 + +点击 “resize”,注意卷列表中出现了一个新项目:“free space”。现在选择这次要调整的卷,并将滑块一直向右移动。按 “resize” 键,并查看新改进的卷的布局。然而,硬盘驱动器上的任何东西现在都还没有改变。点击“勾选”选项将更改提交到磁盘。 + +![Review changes in blivet-gui][7] + +查看更改的摘要,如果一切看起来都是正确的,点击 “Ok” 继续。等待 “blivet-gui” 完成。现在重新启动回到 Fedora,可以使用之前被充满的卷上的新空间了。 + +### 为未来计划 + +要知道任何特定卷在未来需要多少空间是很困难的。与其立即分配所有可用的空闲空间,不如考虑在卷组中留出空闲空间。事实上,Fedora Server 默认在卷组中保留空间。当一个卷处于在线和使用中时,扩展卷是可能的。不需要临场镜像或重启。当一个卷几乎满的时候,可以使用部分可用空间轻松扩展卷并继续工作。遗憾的是,默认的磁盘管理器 gnome-disks 不支持 LVM 卷的大小调整,所以安装 [blivet-gui][8] 作为图形化管理工具。另外,还有一个简单的终端命令来扩展卷: + +``` +lvresize -r -L +1G /dev/fedora_localhost-live/root +``` + +### 总结 + +用 LVM 回收硬盘空间只是 LVM 功能的表面。大多数人,特别是在桌面中,可能不需要更高级的功能。然而,当需要的时候,LVM 就在那里,尽管它的实现可能会变得有点复杂。从 [Fedora 33][10] 开始,[BTRFS][9] 是默认的文件系统,没有 LVM。BTRFS 可以更容易管理,同时对于大多数常见的使用来说也足够灵活。查看最近 [Fedora Magazine 关于 BTRFS 的文章][11]了解更多。 + +-------------------------------------------------------------------------------- + +via: https://fedoramagazine.org/reclaim-hard-drive-space-with-lvm/ + +作者:[Troy Curtis Jr][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/troycurtisjr/ +[b]: https://github.com/lujun9972 +[1]: https://fedoramagazine.org/wp-content/uploads/2020/11/lvm-resize-816x345.jpg +[2]: http://sourceware.org/lvm2/ +[3]: https://getfedora.org/en/workstation/download/ +[4]: https://fedoramagazine.org/wp-content/uploads/2020/11/gnome-disks.png +[5]: https://fedoramagazine.org/wp-content/uploads/2020/11/blivet-overview.png +[6]: https://fedoramagazine.org/wp-content/uploads/2020/11/blivet-resize-1024x525.png +[7]: https://fedoramagazine.org/wp-content/uploads/2020/11/blivet-summary-1024x525.png +[8]: https://fedoraproject.org/wiki/Blivet-gui +[9]: https://fedoramagazine.org/btrfs-coming-to-fedora-33/ +[10]: https://fedoramagazine.org/whats-new-fedora-33-workstation/ +[11]: https://fedoramagazine.org/btrfs-snapshots-backup-incremental/ diff --git a/published/202011/20201110 What I love about the newest GNOME desktop.md b/published/202011/20201110 What I love about the newest GNOME desktop.md new file mode 100644 index 0000000000..0246663267 --- /dev/null +++ b/published/202011/20201110 What I love about the newest GNOME desktop.md @@ -0,0 +1,78 @@ +[#]: collector: (lujun9972) +[#]: translator: (geekpi) +[#]: reviewer: (wxy) +[#]: publisher: (wxy) +[#]: url: (https://linux.cn/article-12839-1.html) +[#]: subject: (What I love about the newest GNOME desktop) +[#]: via: (https://opensource.com/article/20/11/new-gnome) +[#]: author: (Jim Hall https://opensource.com/users/jim-hall) + +我喜欢最新的 GNOME 桌面 +====== + +> 看看 GNOME 3.38 桌面最重要的新功能。 + +![](https://img.linux.net.cn/data/attachment/album/202011/18/225213tmv6aeev1x0t1p4k.jpg) + +Fedora 33 [刚出来][2],我就马上安装了它。在这个新版 Linux 发行版的众多功能中,其中之一是最新的 GNOME 桌面。GNOME 3.38 于 2020 年 9 月发布,我很喜欢它。 + +### 我为什么喜欢 GNOME 3.38? + +GNOME 3.38 [发布说明][3]中列出了这次更新中的一些重大的新功能。其中,新用户的欢迎页面有了重大改版,现在更加容易使用,如果你是新用户的话,它提供了更多有用的信息。 + +![The new "Welcome GNOME"][4] + +我还喜欢在 GNOME 应用概览中拖动来重新排列应用图标的功能。这让我在 GNOME 下组织我一直使用的应用变得轻而易举。你甚至可以将图标拖放到一起,并自动将它们放入一个文件夹。 + +![GNOME 3.38 Application Overview][7] + +我的家人在不同的时区,更新后的 GNOME 时钟使得添加新的世界时钟变得更加容易,所以当我给家人打电话时,我不必弄清楚现在是什么时间,他们是早一个小时还是晚一个小时?我只需查看 GNOME 时钟,就能一目了然地看到每个人的当地时间。另外,虽然我并不经常使用闹钟功能,但我喜欢我可以自己设置铃声持续时间和每个闹钟的默认“打盹”时间。 + +![Adding a new world clock in GNOME Clocks][8] + +除了所有这些功能更新之外,GNOME 3.38 中最大的改进是性能。正如 GNOME 开发者 Emmanuele Bassi [今年早些时候的解释][9]:“GNOME 中的每个人都为使速度更快而做了很多工作,即使是在树莓派等这样受限的系统上运行的人也是如此。为了让 GNOME 表现得更好,大家做了很多工作。因为人们真的很关心它”。而这一点在新版本中体现得淋漓尽致!GNOME 桌面感觉反应更灵敏。 + +![Applications running on GNOME 3.38][10] + +作为我的咨询和培训业务的一部分,我经常在几个打开的应用之间切换,包括 LibreOffice、GIMP、Inkscape、Web 浏览器等。在 GNOME 3.38 中,启动一个新的应用或在打开的应用之间切换感觉更快。 + +### 除了一件事 + +如果说新版 GNOME 中有什么我不喜欢的地方,那就是重新设计的屏幕截图工具。我一直使用这个工具来抓取屏幕上的一部分内容,并将其插入到我的演示文稿和培训文档中。 + +![GNOME Screenshot tool][11] + +当我浏览用户界面或电脑屏幕时,我自然会像阅读书籍或杂志那样浏览:从左到右,从上到下。当我使用新的屏幕截图工具进行屏幕截图时,我从左上角开始,然后进行选择。大多数时候,我只需要改变选区的捕捉区域,所以我点击那个按钮,然后寻找截图的按钮。但我总是要花点时间才能找到左上角的**截图**按钮。它并不在窗口的底部,也不是我希望找到它的地方。 + +![GNOME Screenshot tool][12] + +到目前为止,这似乎是我在 GNOME 3.38 中唯一的烦恼。总的来说,我对新的 GNOME 感到非常兴奋。我希望你也是! + +要了解更多关于 GNOME 3.38 的信息,请访问 [GNOME 网站][13]或阅读 [GNOME 3.38 公告][5]。 + +-------------------------------------------------------------------------------- + +via: https://opensource.com/article/20/11/new-gnome + +作者:[Jim Hall][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/jim-hall +[b]: https://github.com/lujun9972 +[1]: https://opensource.com/sites/default/files/styles/image-full-size/public/lead-images/computer_browser_web_desktop.png?itok=Bw8ykZMA (Digital images of a computer desktop) +[2]: https://fedoramagazine.org/announcing-fedora-33/ +[3]: https://help.gnome.org/misc/release-notes/3.38/ +[4]: https://opensource.com/sites/default/files/uploads/welcome-tour.png (The new "Welcome GNOME" ) +[5]: https://www.gnome.org/news/2020/09/gnome-3-38-released/ +[6]: https://creativecommons.org/licenses/by-sa/4.0/ +[7]: https://opensource.com/sites/default/files/uploads/app-overview.png (GNOME 3.38 Application Overview) +[8]: https://opensource.com/sites/default/files/uploads/world-clocks.png (Adding a new world clock in GNOME Clocks) +[9]: https://opensource.com/article/20/7/new-gnome-features +[10]: https://opensource.com/sites/default/files/uploads/desktop-busy.png (Applications running on GNOME 3.38) +[11]: https://opensource.com/sites/default/files/uploads/gnome-screenshot-tool.png (GNOME Screenshot tool) +[12]: https://opensource.com/sites/default/files/uploads/screenshot-tool-path.png (GNOME Screenshot tool) +[13]: https://www.gnome.org/ diff --git a/published/202011/20201111 Using Fedora 33 with Microsoft-s WSL2.md b/published/202011/20201111 Using Fedora 33 with Microsoft-s WSL2.md new file mode 100644 index 0000000000..fb2f0d24bd --- /dev/null +++ b/published/202011/20201111 Using Fedora 33 with Microsoft-s WSL2.md @@ -0,0 +1,112 @@ +[#]: collector: (lujun9972) +[#]: translator: (wxy) +[#]: reviewer: (wxy) +[#]: publisher: (wxy) +[#]: url: (https://linux.cn/article-12845-1.html) +[#]: subject: (Using Fedora 33 with Microsoft’s WSL2) +[#]: via: (https://fedoramagazine.org/wsl-fedora-33/) +[#]: author: (Jim Perrin https://fedoramagazine.org/author/jperrin/) + +通过微软的 WSL2 使用 Fedora 33 +====== + +![][1] + +如果你像我一样,你可能会发现自己因为各种原因而运行 Windows,无论是因为工作还是游戏。当然,你可以在虚拟机或容器中运行 Fedora,但这些并不像 Windows 的 Linux 子系统(WSL)那样容易融合到普通的 Windows 体验中。通过 WSL 使用 Fedora 可以让你将这两种环境融合在一起,创造一个奇妙的开发环境。 + +### 先决条件 + +为了达成这一目标,你需要一些基本条件。你应该运行 Windows 10,并且已经安装了 WSL2。如果没有,请查看[微软文档说明][4],完成后再回来这里。微软建议为了简单起见,将 WSL2 设置为发行版的默认设置。本指南假设你已经这样做了。 + +接下来,你将需要一些解压 xz 压缩文件的方法。你可以用另一个基于 WSL 的发行版来解压,或者使用 [7zip][5]。 + +### 下载 Fedora 33 rootfs + +由于 Fedora 并没有提供实际的 rootfs 存档,所以我们将借用一个用于生成 Dockerhub 容器镜像的存档。你需要从 fedora-cloud 的 GitHub 仓库下载该 [tar.xz 文件][6] 。一旦你有了这个 tar.xz 文件,解压它,但不要展开 tar 包。你会得到一个类似 `fedora-33-时间标签.tar` 的文件。有了这个文件,你就可以构建镜像了。 + +### 组合 WSL Fedora 的构建版本 + +我喜欢使用 `c:\distros` 目录,但你可以选择几乎任何你想要的位置。无论你选择什么目录,在你导入该构建版本之前,确保其顶层路径存在。现在打开一个 CMD 或 Powershell 提示符,因为是时候导入了: + +``` +wsl.exe --import Fedora-33 c:\distros\Fedora-33 $HOME\Downloads\fedora-33.tar +``` + +你会看到 Fedora-33 显示在 WSL 的列表当中: + +``` +PS C:\Users\jperrin> wsl.exe -l -v + NAME STATE VERSION + Fedora-33 Stopped 2 +``` + +下面,你就可以开始在 WSL 中摆弄 Fedora 了,但我们还需要做一些事情来使它真正成为一个有用的 WSL 发行版。 + +``` +wsl -d Fedora-33 +``` + +这将以 root 用户的身份启动 Fedora 的 WSL 实例。下面,你将安装一些核心包并设置一个新的默认用户。你还需要配置 `sudo`,否则你将无法在以后需要安装其他东西时轻松提升权限。 + +``` +dnf update +dnf install wget curl sudo ncurses dnf-plugins-core dnf-utils passwd findutils +``` + +`wslutilites` 使用 `curl` 和 `wget` 来实现与 VS Code 的集成,所以它们很有用。由于你需要使用 COPR 仓库,你需要增加 `dnf` 功能。 + +### 添加你的用户 + +现在是时候添加你的用户,并将其设置为默认用户。 + +``` +useradd -G wheel 用户名 +passwd 用户名 +``` + +现在,你已经创建了你的用户名,并添加了密码,确保它们可以工作。退出 WSL 实例,并再次启动它,这次指定用户名。你还要测试 `sudo`,并检查你的 uid。 + +``` +wsl -d Fedora-33 -u 用户名 +$id -u +1000 +$ sudo cat /etc/shadow +``` + +假设一切正常,你现在已经准备好在 Windows 中为你的 Fedora 环境设置默认用户。要做到这一点,请退出 WSL 实例并回到 Powershell 中。这个 Powershell 单行代码可以正确配置你的用户: + +``` +Get-ItemProperty Registry::HKEY_CURRENT_USER\Software\Microsoft\Windows\CurrentVersion\Lxss\\*\ DistributionName | Where-Object -Property DistributionName -eq Fedora-33  | Set-ItemProperty -Name DefaultUid -Value 1000 +``` + +现在你应该可以再次启动 WSL,而不需要指定就可以成为自己的用户而不是 root。 + +### 自定义! + +至此,你已经有了可以在 WSL 中运行的基本 Fedora 33 环境,但它还没有 Windows 集成的部分。如果你想要这个,有一个 COPR 仓库可以启用。如果你选择添加这部分,你就可以直接在 shell 里面运行 Windows 应用,也可以轻松地将你的 Linux 环境与 VS Code 集成。需要注意的是,COPR 并没有得到 Fedora 基础架构的官方支持。使用该软件包,风险自担。 + +``` +dnf copr enable trustywolf/wslu +``` + +现在你可以去配置终端、设置一个 Python 开发环境,或者其它你想使用 Fedora 33 的方式。享受吧! + +-------------------------------------------------------------------------------- + +via: https://fedoramagazine.org/wsl-fedora-33/ + +作者:[Jim Perrin][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://fedoramagazine.org/author/jperrin/ +[b]: https://github.com/lujun9972 +[1]: https://fedoramagazine.org/wp-content/uploads/2020/11/wsl-fedora33-816x345.jpg +[2]: https://unsplash.com/@matthias_heil?utm_source=unsplash&utm_medium=referral&utm_content=creditCopyText +[3]: https://unsplash.com/s/photos/windows?utm_source=unsplash&utm_medium=referral&utm_content=creditCopyText +[4]: https://docs.microsoft.com/en-us/windows/wsl/install-win10 +[5]: https://www.7-zip.org/download.html +[6]: https://github.com/fedora-cloud/docker-brew-fedora/tree/33/x86_64 diff --git a/published/202011/20201112 How to Install Google Chrome on Fedora -Beginner-s Tutorial.md b/published/202011/20201112 How to Install Google Chrome on Fedora -Beginner-s Tutorial.md new file mode 100644 index 0000000000..e78e3a2c92 --- /dev/null +++ b/published/202011/20201112 How to Install Google Chrome on Fedora -Beginner-s Tutorial.md @@ -0,0 +1,124 @@ +[#]: collector: (lujun9972) +[#]: translator: (geekpi) +[#]: reviewer: (wxy) +[#]: publisher: (wxy) +[#]: url: (https://linux.cn/article-12856-1.html) +[#]: subject: (How to Install Google Chrome on Fedora [Beginner’s Tutorial]) +[#]: via: (https://itsfoss.com/install-google-chrome-fedora/) +[#]: author: (Dimitrios Savvopoulos https://itsfoss.com/author/dimitrios/) + +如何在 Fedora 上安装 Google Chrome 浏览器 +====== + +![](https://img.linux.net.cn/data/attachment/album/202011/25/094346ig44av4l4lzh1v7t.jpg) + +Fedora 的默认网页浏览器是 Firefox。尽管它是一个优秀的网络浏览器,你可能更喜欢流行的 Google Chrome 浏览器。 + +如果你想知道如何在 Fedora 上安装 Google Chrome 浏览器,让我告诉你两种安装 Google Chrome 浏览器的方式:图形化方式和命令行方式。 + +* [图形化方式 1:通过启用 Fedora 第三方仓库从软件中心安装 Chrome 浏览器][1] +* [图形化方式 2:从谷歌浏览器网站下载 RPM 文件][2] +* [命令行方式:从 Fedora 第三方仓库安装 Chrome,一切使用命令(与 GUI 方式 1 相同)][3] + +这全取决于你喜欢哪种方式。你在 [Fedora][4] 上的 Google Chrome 浏览器都将通过这三种方式的系统更新获取定期更新。 + +### 方式 1:在 Fedora 中从软件中心安装 Google Chrome + +Fedora 提供了一个第三方仓库,其中包含了一些流行的专有软件、图形驱动程序。Google Chrome 就是其中之一。 + +第一步,确保在 Fedora 中启用第三方仓库。你应该在软件中心中看到这个选项。 + +![Step1: Fedora Third Party Repositories][5] + +启用后,只需在软件中心搜索 Chrome: + +![Step 2: Search for Chrome In Fedora Software Center][6] + +并从那里安装它: + +![Step 3: Install Chrome Fedora][7] + +还有比这更简单的吗?我觉得没有。 + +### 方式 2:在 Fedora 上从 Chrome 网站安装 Google Chrome + +如果你不想启用第三方仓库,也没关系。你不必这样做。你可以从 Chrome 的网站上下载 RPM 文件,双击并安装它。 + +访问 Google Chrome 的网站,点击下载按钮。 + +- [获取 Google Chrome][8] + +![][9] + +然后选择 .rpm 包,点击“接受并安装”。 + +![][10] + +下载结束后,双击文件,在包管理器提示时点击安装。输入密码,等待安装完成。 + +![][11] + +这是超级简单的,对吧?让我们来看看有点复杂的方式(如果你不是一个终端爱好者)。 + +### 方式 3:使用命令行在 Fedora 上安装 Chrome + +首先,你需要添加额外的 Fedora 仓库(你在方式 1 中看到的): + +``` +sudo dnf install fedora-workstation-repositories +``` + +然后启用 Google Chrome 仓库。 + +``` +sudo dnf config-manager --set-enabled google-chrome +``` + +![][12] + +要安装 Google Chrome 稳定版,请在终端运行以下命令。 + +``` +sudo dnf install google-chrome-stable +``` + +你会看到一个导入 GPG 密钥的警告,输入 `y` 继续。 + +![][13] + +你正在添加 Google Chrome 仓库。这个软件包来自这个仓库,它直接来自 Google。 + +### 总结 + +即使你使用命令行,在 Fedora 上安装 Google chrome 也相当简单。除了第三方仓库的部分,这和[在 Ubuntu 上安装 Chrome][14] 差不多。 + +现在你已经安装好了,你可能会想[查看我们的 Google Chrome 键盘快捷键列表][15]来更快地使用浏览器。 + +-------------------------------------------------------------------------------- + +via: https://itsfoss.com/install-google-chrome-fedora/ + +作者:[Dimitrios Savvopoulos][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/dimitrios/ +[b]: https://github.com/lujun9972 +[1]: tmp.VFVwBw56ac#gui-method-1 +[2]: tmp.VFVwBw56ac#gui-method-2 +[3]: tmp.VFVwBw56ac#cli-method +[4]: https://getfedora.org/ +[5]: https://i0.wp.com/itsfoss.com/wp-content/uploads/2020/11/fedora-third-party-repositories.jpg?resize=800%2C400&ssl=1 +[6]: https://i1.wp.com/itsfoss.com/wp-content/uploads/2020/11/chrome-in-fedora.png?resize=800%2C400&ssl=1 +[7]: https://i2.wp.com/itsfoss.com/wp-content/uploads/2020/11/installing-chrome-fedora.png?resize=800%2C400&ssl=1 +[8]: https://www.google.com/chrome/ +[9]: https://i1.wp.com/itsfoss.com/wp-content/uploads/2019/01/install-google-chrome-ubuntu-1.jpeg?resize=800%2C374&ssl=1 +[10]: https://i1.wp.com/itsfoss.com/wp-content/uploads/2020/11/3.-download-rpm-chrome.png?resize=800%2C600&ssl=1 +[11]: https://i2.wp.com/itsfoss.com/wp-content/uploads/2020/11/4.-install-chrome-fedora.png?resize=800%2C550&ssl=1 +[12]: https://i2.wp.com/itsfoss.com/wp-content/uploads/2020/11/1.-Fedora-extra-repos.png?resize=800%2C550&ssl=1 +[13]: https://i0.wp.com/itsfoss.com/wp-content/uploads/2020/11/2.-Fedora-GPG-key.png?resize=800%2C550&ssl=1 +[14]: https://itsfoss.com/install-chrome-ubuntu/ +[15]: https://itsfoss.com/google-chrome-shortcuts/ \ No newline at end of file diff --git a/published/202011/20201112 How to Install and Use Etcher on Linux for Making Live Linux USB.md b/published/202011/20201112 How to Install and Use Etcher on Linux for Making Live Linux USB.md new file mode 100644 index 0000000000..74ab8519d5 --- /dev/null +++ b/published/202011/20201112 How to Install and Use Etcher on Linux for Making Live Linux USB.md @@ -0,0 +1,136 @@ +[#]: collector: (lujun9972) +[#]: translator: (geekpi) +[#]: reviewer: (wxy) +[#]: publisher: (wxy) +[#]: url: (https://linux.cn/article-12847-1.html) +[#]: subject: (How to Install and Use Etcher on Linux for Making Live Linux USB) +[#]: via: (https://itsfoss.com/install-etcher-linux/) +[#]: author: (Ankush Das https://itsfoss.com/author/ankush/) + +如何在 Linux 上安装和使用 Etcher 来制作 Linux 临场 USB +====== + +![](https://img.linux.net.cn/data/attachment/album/202011/21/214209xor9upp7jznd9djd.jpg) + +> Etcher 是一款流行的 USB 烧录应用,可用于创建可启动的 Linux USB。让我来告诉你如何安装它,以及如何使用它来制作一个 Linux 临场盘。 + +### Etcher:一个用于在 SD 卡和 USB 驱动器中烧录 Linux ISO 的开源工具 + +Etcher 是一个由 [Balena][1] 开发的开源项目,来用于为树莓派烧录 SD 卡。事实上,我们在[如何在 SD 卡上安装 Raspbian OS][2] 的教程中就使用了它。 + +它不仅仅局限于 SD 卡,你还可以使用 Etcher 来[制作一个可启动的 USB 驱动器][3],我们就通过它的帮助在 Linux 中制作了一个 [Manjaro 的临场 USB][4]。 + +自首次发布以来,Etcher 就以其整洁的界面和简单的使用方式引起了人们的注意。 + +![][5] + +在本文中,我将重点介绍帮助你在 Linux 上安装 Etcher 的步骤。然后,我还将展示如何使用它。在这之前,让我先给大家介绍一下它的功能。 + +### Etcher 的功能 + + * 在烧录前验证驱动器 + * 漂亮的用户界面 + * 自动检测 USB 驱动器/SD 卡,防止电脑上的硬盘被擦除。 + * 跨平台支持(Windows、macOS 和 Linux)。 + * 快速烧录 + * 简单的三步过程 + +理论上,你已经有了在 SD 卡和 USB 驱动器上烧录操作系统镜像所需的一切。同样令人激动的是,根据他们的[路线图][6],他们计划增加对多个设备的同步写入支持。 + +### 在 Linux 上安装 Etcher + +要开始使用,你需要从它的官方网站上下载它提供的 AppImage 文件(适用于任何 Linux 发行版)。 + +你只需要前往它的[主页][7],并根据你的系统(32 位/64 位)下载一个程序: + +![][8] + +在我的例子中,我下载了 Ubuntu 的 64 位 AppImage 文件。你可以通过我们的指南来了解[在 Linux 上使用 AppImage文件][9],但我会让你先知道下一步需要做什么。 + +你需要给文件执行权限,你可以右击**AppImage 文件 -> 属性**来实现。 + +![][10] + +接下来,点击权限选项卡下的“**允许作为程序执行**”,如下图所示。 + +![][11] + +现在,只需双击 AppImage 文件即可启动 Etcher! + +这应该可以在任何 Linux 发行版上运行。在任何情况下,如果你想从源码构建或者直接使用 .rpm 或 .deb 文件安装,你也可以前往它的 [Github 发布页][12]找到 RPM、DEB 和源码。 + +你也可以参考我们的[在 Ubuntu 中使用 deb 文件][13]来安装应用。 + +> 注意! +> +> 我们注意到,当你使用 Etcher 创建 Linux 发行版的临场 USB 时,它会使 USB 处于明显的不可使用状态,即它只有几 MB 的空闲空间,并且不能直接格式化。在 Linux 上,你可以[使用磁盘工具手动删除分区,然后格式化它][14]。 + +### 在 Linux 上使用 Etcher + +只需三步就可以开始使用 Etcher。在你启动它之后,根据屏幕上的提示应该是清晰的,但为了给你一个好的开始,以下是你要做的事情: + +**步骤 1:** 选择合适的 ISO 镜像文件或你需要烧录的文件的 URL(如下图所示)。 + +![][15] + +**步骤 2:** 接下来,你需要选择目标设备。它会自动检测并高亮显示可移动设备,以防止你选择任何内部存储位置。 + +![][16] + +在这里,我连接了一个 USB 驱动器,我也选择了它(如下图所示)。 + +![][17] + +**步骤 3:** 现在,你所有需要做的就是烧录镜像并等待它成功完成。 + +![][18] + +这是进度的样子: + +![][19] + +完成了! + +![][20] + +- [下载 balenaEtcher][7] + +### 总结 + +Etcher 是一个有用的工具,可以为 SD 卡和 USB 驱动器烧录操作系统镜像。我倾向于主要使用它来创建临场 USB 驱动器来测试 Linux 发行版,我对它很满意。 + +你更喜欢用什么来创建可启动驱动器?你是否已经尝试过 Etcher?请在下面的评论中告诉我你的想法。 + +-------------------------------------------------------------------------------- + +via: https://itsfoss.com/install-etcher-linux/ + +作者:[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://www.balena.io/ +[2]: https://itsfoss.com/tutorial-how-to-install-raspberry-pi-os-raspbian-wheezy/ +[3]: https://itsfoss.com/create-bootable-ubuntu-usb-drive-mac-os/ +[4]: https://itsfoss.com/create-live-usb-manjaro-linux/ +[5]: https://i2.wp.com/itsfoss.com/wp-content/uploads/2020/10/etcher-mxlinux-2.png?resize=800%2C518&ssl=1 +[6]: https://github.com/balena-io/etcher/milestones +[7]: https://www.balena.io/etcher +[8]: https://i0.wp.com/itsfoss.com/wp-content/uploads/2020/11/etcher-official-site-download.png?resize=800%2C580&ssl=1 +[9]: https://itsfoss.com/use-appimage-linux/ +[10]: https://i0.wp.com/itsfoss.com/wp-content/uploads/2020/11/balena-etcher-permission.jpg?resize=800%2C378&ssl=1 +[11]: https://i0.wp.com/itsfoss.com/wp-content/uploads/2020/11/balena-etcher-execute.jpg?resize=800%2C445&ssl=1 +[12]: https://github.com/balena-io/etcher/releases/tag/v1.5.109 +[13]: https://itsfoss.com/install-deb-files-ubuntu/ +[14]: https://itsfoss.com/cant-format-usb-disk/ +[15]: https://i0.wp.com/itsfoss.com/wp-content/uploads/2020/11/balena-etcher-select.jpg?resize=800%2C521&ssl=1 +[16]: https://i1.wp.com/itsfoss.com/wp-content/uploads/2020/11/etcher-select-target.jpg?resize=800%2C509&ssl=1 +[17]: https://i0.wp.com/itsfoss.com/wp-content/uploads/2020/11/etcher-target-device.jpg?resize=800%2C521&ssl=1 +[18]: https://i2.wp.com/itsfoss.com/wp-content/uploads/2020/11/etcher-flash.jpg?resize=800%2C516&ssl=1 +[19]: https://i0.wp.com/itsfoss.com/wp-content/uploads/2020/11/etcher-flashing.jpg?resize=800%2C510&ssl=1 +[20]: https://i2.wp.com/itsfoss.com/wp-content/uploads/2020/11/etcher-flash-complete.jpg?resize=800%2C507&ssl=1 diff --git a/published/202011/20201114 How to Install Fedora in VirtualBox -With Steps for USB, Clipboard and Folder Sharing.md b/published/202011/20201114 How to Install Fedora in VirtualBox -With Steps for USB, Clipboard and Folder Sharing.md new file mode 100644 index 0000000000..23edba8404 --- /dev/null +++ b/published/202011/20201114 How to Install Fedora in VirtualBox -With Steps for USB, Clipboard and Folder Sharing.md @@ -0,0 +1,283 @@ +[#]: collector: (lujun9972) +[#]: translator: (frogOAO) +[#]: reviewer: (wxy) +[#]: publisher: (wxy) +[#]: url: (https://linux.cn/article-12854-1.html) +[#]: subject: (How to Install Fedora in VirtualBox [With Steps for USB, Clipboard and Folder Sharing]) +[#]: via: (https://itsfoss.com/install-fedora-in-virtualbox/) +[#]: author: (Dimitrios Savvopoulos https://itsfoss.com/author/dimitrios/) + +如何在 VirtualBox 中安装 Fedora +====== + +如果你对 Fedora Linux 感兴趣,这有几种方式可以尝试它。 + +最简单还不影响你操作系统的方式是 [制作 Fedora 的 USB 临场启动盘][1]。 + +> **LCTT 译注**: +> +> 在 Linux 发行版的使用方式上,有一种可以无需安装而通过光盘或 USB 存储棒直接在计算机上启动完整的 Linux 操作系统的方式,这种方式称之为 “Live” 方式,如 Live CD、Live USB。 +> +> 通常,Live 一词并不翻译,不过,我认为,除了英文缩写和部分历史原因造成直接使用的英文单词,大部分场景都应该使用本地化的语言来描述,否则,中英文混杂的港台式中文,实在有些不伦不类;抑或,外文翻译本身就不存在意义了。 +> +> 因此,对于 “Live” 一词如何翻译,我们也颇费心思。这个词,在维基百科中文中,被翻译为“[自生系统](https://zh.wikipedia.org/wiki/Live_CD)”,在某些场景下偶见 “现场”、“临场” 等翻译。考虑到 Live CD/USB 的特性,我认为翻译为 “临场” 比较好。 +> +> 于此抛出愚见,希望得到大家的积极反馈。wxy@LCTT + +另一种方式是安装 VirtualBox 利用虚拟化技术来尝试 Fedora。这样,你可以在你的操作系统上像使用应用程序一样使用 Fedora。 + +通过这种方式,你可以执行更彻底的测试,而不会搞乱当前的操作系统。 + +你甚至可以复制你的虚拟环境,并在其他系统上重新安装它。听起来方便吗?让我来教你怎么做。 + +### 在 VirtualBox 上安装 Fedora + +![][2] + +让我们分步在 Oracle VirtualBox 上安装 Fedora。 + +#### 步骤一:安装 VirtualBox + +如果你的系统还没有安装 VirtualBox,你可以从官方网站下载。你可以找到 Windows、MacOs 和 Linux 的说明。 [Ubuntu 用户可以参考这个关于安装 VirtualBox 的详细教程。][3] + +![][4] + +- [下载 VirtualBox][5] + +#### 步骤二: 下载 Fedora ISO + +如果你不熟悉 Fedora,那么这些镜像你需要知道。 + +[Fedora IoT][6] 是用于可扩展基础设施的,[Fedora workstation][7] 是一个带有一组面向普通 GNOME 桌面环境中的桌面工具的镜像。[Fedora server][8] 顾名思义,是为服务器或数据中心定制的。 + +如果 GNOME 不是你的首选,你可以下载一个带有替代桌面环境的[定制版][9] Fedora 桌面。对于本教程,我选择了带有 GNOME 桌面环境的[Fedora 33][10]。 + +- [下载 Fedora][11] + +#### 步骤三: 创建一个空虚拟机并对其进行配置 + +要成功安装和运行 Fedora,至少需要 20GB 磁盘空间和 2GB RAM。不过,为了获得更流畅的用户体验,建议增加一倍。在此基础上,我将创建并配置虚拟机。 + +开启 Virtual Box 点击 “New”。 + +![创建一个新的虚拟机][12] + +需要注意,最重要的选项是 **将类型设置为 Linux ,版本设置为 Fedora (64-bit)**。如果你在名称提示符处开始输入 “Fedora”,VirtualBox 将自动为你选择正确的设置。虽然名字不一定非得是 Fedora,它可以是任何你喜欢的。 + +*如果你只能访问 32 位版本,那么你需要在 BIOS 上启用虚拟化技术,如果你有一个 AMD CPU,它被称为 SVM。最坏的情况是你的 CPU 不支持虚拟化技术。如果你不确定,先检查这个。 + +如果你的设置和我类似,点击 “create” 按钮。 + +![命名你的虚拟机,并未它指定至少 3 GB RAM][13] + +如前所述,至少需要 20GB 的磁盘空间才能安装 Fedora。我的系统上有 32GB 的内存,所以我分配了 8GB 内存。3 GB 的内存应该也没问题。 + +顺便说下内存的使用,只有在运行虚拟机时,虚拟机才会使用内存。否则,它将可用于常规使用。 + +确保其余设置与示例匹配,并点击 “Create” 按钮。 + +![以 VDI 格式分配 15-20 GB 的磁盘空间][14] + +在你点击虚拟机的 Start 按钮之前,你需要加载如下所示的 ISO [光驱]。 + +![将 Fedora ISO 添加到光驱存储中][15] + +因为你的虚拟硬盘是空的,虚拟机将从这个 ISO 启动。可以把它看作是使用临场 USB 或磁盘安装 Linux。 + +![在设置中将 ISO 添加为光驱][16] + +然后,如果你有一个多核 CPU,建议为虚拟机分配 2 个或更多的核。你可以在 “System” 选项卡下找到 CPU 核心。配置系统时,单击 “OK” 并启动虚拟机。 + +![可选:分配 CPU 核数][17] + +配置好所有内容后,单击 “Start” 按钮开始安装。 + +#### 步骤四:在 VirtualBox 中安装 Fedora。 + +如果你正确地遵循了这个过程,那么当你启动虚拟机时,你将直接从 ISO 文件启动。当你看到类似下面的屏幕时,选择 “Start Fedora”,并按回车键。 + +![Fedora 运行在虚拟机的临场环境中][18] + +要启动安装对话框,单击 “Install To Hard Drive”。 + +![点击 “install to hard drive”][19] + +在你继续安装之前,有必要定义你的键盘布局、你的时区以及最终安装操作系统的位置。 + +![选择键盘布局、日期和时间,然后是安装目标位置][20] + +分区过程很简单。你像前面的 VDI 那样划分一些空闲空间。它应该被自动识别。 + +选择你的磁盘并将存储配置设置为 “Automatic”。单击 “Done” 进入上一个对话框。 + +![磁盘应该会自动识别][21] + +一旦你配置完了上面的,点击 “Begin Installation”。 + +![开始 Fedora 的安装][22] + +现在只需等待 5 - 6 分钟即可完成安装。安装完成后,点击 “Finish installation” 按钮。 + +最后一步,需要关闭系统的电源。如果你不熟悉 GNOME 桌面环境,你可以如下这样做。 + +![安装后关闭 Fedora 临场环境][23] + +你必须手动卸载在初始步骤中加载的 ISO 文件。 + +![从光驱中移走 Fedora ISO][24] + +下一次使用 Fedora 启动虚拟机时,系统将提示你为 Fedora Linux 创建用户帐户并设置密码。 + +### 使用 VirtualBox Guest Additions 的附加功能,如剪贴板共享,文件夹共享等 + +[Guest Additions][25] 设计为在访客guest操作系统安装后安装在虚拟机中。它们包含对客户操作系统进行优化的设备驱动程序和系统应用程序,以获得更好的性能和可用性。 + +Guest Additions ISO 文件被安装为虚拟 CD-ROM 以便安装。 + +这是一个简单的过程。只需单击设备选项卡,然后单击 “Insert Guest Additions CD image”。 + +![][26] + +当提示单击 “Download” 时,系统将弹出下载 Guest Additions 镜像界面。 + +![安装 VirtualBox Guest Additions][27] + +#### 共享剪贴板 + +有时候,你需要在虚拟机和宿主机host操作系统之间移动一些内容。共享剪贴板/拖放支持将允许你在一个平台上复制项目,并将它们粘贴到另一个平台上。 + +要启用此功能,请在 VirtualBox 主页上选择 “Settings”,并按照下面的说明操作。“Bidirectional” 的选项是最方便的。 + +![启用访客和宿主系统间的剪贴板共享][28] + +#### 共享文件夹 + +有两种类型的分享: + + * 永久共享,与虚拟机设置一起保存。 + * 暂时共享,当虚拟机关闭时就会消失。可以使用 VirtualBox 管理器中的复选框创建暂时共享。 + +在本教程中,我将创建一个永久共享文件夹。在 VM 设置中添加你想要共享的宿主机系统文件夹,并选择你想要在 VM 中出现的名称。 + +![][29] + +下次启动虚拟机时,该文件夹应该显示为网络驱动器。 + +![][30] + +#### 更好的视频支持 + +虽然 Oracle VirtualBox 提供了具有基本功能的虚拟显卡,但访客系统添加的自定义视频驱动程序为你提供了超高和非标准的视频模式,以及视频加速。 + +使用 Guest Additions,操作系统的分辨率将随着你调整计算机上的 VirtualBox 窗口而动态调整大小。 + +最后,Guest Additions 可以利用你的计算机的显卡。如果你是一名游戏玩家或在 WM 中使用高效软件,这就会产生巨大的改变。 + +#### USB 和网络设备共享 + +有了 VirtualBox,用户就可以使用一个功能齐全的操作系统,而不必在不同的硬件上进行设置。然而,在宿主机和访客机器之间共享 USB 和网络设备并不像想的那样简单。 + +要访问 USB 设备,你将需要安装 [VirtualBox 扩展包][31]。 + +![安装 VirtualBox 扩展包][32] + +**下面这些仅对 Linux**,因为我使用的是 Linux。 + +为了使 VirtualBox 能够访问 USB 子系统,运行 VirtualBox 的用户(在宿主机系统上)必须属于 `vboxuser` 组。为此,打开一个终端并发出以下命令: + +``` +sudo usermod -aG vboxusers 'your username' +``` + +运行该命令后,你应该注销并重新登录,或者重新启动主机。 + +在这一步,插入你的 U 盘,通过你的 VM 设置,你应该能够找到并添加介质,如例子中所示。 + +![][33] + +当你下次启动虚拟机,你的 USB 将是可访问的。 + +![][34] + +### 额外提示:保存并导出虚拟机,以便以后可以在任何系统上使用它 + +你可能想在另一台计算机上使用虚拟机,或者是时候构建一台新机器了,并且你需要保持虚拟机的原样。只需几个简单的步骤,就可以轻松地导出当前设置并将其导入到另一台机器。 + +在 VirtualBox 主面板上,单击 “file”、“Export Appliance”。如果你喜欢键盘快捷键,你可以简单地点击 `Ctrl+E`。 + +![][35] + +选择要导出的虚拟机,然后单击 “Next”。 + +![][36] + +“Format” 选项需要注意一下。有三种不同的选项:开放虚拟化格式Open Virtualization Format 0.9、1.0 和 2.0 ,可以是 ovf 或 ova 扩展名。 + +使用 ovf 扩展名,会分别写入几个文件,而 ova 扩展名则将所有文件合并到一个开放虚拟化格式归档文件中。 + +默认格式 OVF 1.0 应该没问题。 + +![][37] + +要完成该过程,单击 “Next”,然后在下一个对话框中单击 “Export”。 + +### 总结 + +通过使用虚拟机,你不仅可以测试操作系统,还可以部署与物理机器同等重要的功能完整的系统。如今,硬件已经变得如此强大和廉价,它的大部分功能都没有被利用。 + +通过虚拟化技术,你可以使用这些浪费的资源。对物理机器的需求减少了,因此能源消耗也减少了。你可以从硬件和降低运行成本两方面省钱。 + +在大规模服务环境中,服务器虚拟化更多的是一种基本需求,而不是一种高级概念。 + +我希望本教程对你在 VirtualBox 中安装 Fedora Linux 有帮助。如果你遇到任何问题,请在评论中告诉我。 + +-------------------------------------------------------------------------------- + +via: https://itsfoss.com/install-fedora-in-virtualbox/ + +作者:[Dimitrios Savvopoulos][a] +选题:[lujun9972][b] +译者:[frogOAO](https://github.com/frogOAO) +校对:[wxy](https://github.com/wxy) + +本文由 [LCTT](https://github.com/LCTT/TranslateProject) 原创编译,[Linux中国](https://linux.cn/) 荣誉推出 + +[a]: https://itsfoss.com/author/dimitrios/ +[b]: https://github.com/lujun9972 +[1]: https://itsfoss.com/create-fedora-live-usb-ubuntu/ +[2]: https://i0.wp.com/itsfoss.com/wp-content/uploads/2020/11/install-fedora-in-virtualbox.png?resize=800%2C450&ssl=1 +[3]: https://itsfoss.com/install-virtualbox-ubuntu/ +[4]: https://i2.wp.com/itsfoss.com/wp-content/uploads/2020/05/download-virtulabox.jpg?resize=799%2C294&ssl=1 +[5]: https://www.virtualbox.org/ +[6]: https://getfedora.org/en/iot/ +[7]: https://getfedora.org/en/workstation/ +[8]: https://getfedora.org/en/server/ +[9]: https://spins.fedoraproject.org/ +[10]: https://itsfoss.com/fedora-33/ +[11]: https://getfedora.org/ +[12]: https://i2.wp.com/itsfoss.com/wp-content/uploads/2020/10/0.-create-a-new-vm.png?resize=800%2C550&ssl=1 +[13]: https://i1.wp.com/itsfoss.com/wp-content/uploads/2020/10/1-create-vm-fedora.png?resize=800%2C533&ssl=1 +[14]: https://i0.wp.com/itsfoss.com/wp-content/uploads/2020/10/2-fedora-vm-disk.png?resize=800%2C533&ssl=1 +[15]: https://i2.wp.com/itsfoss.com/wp-content/uploads/2020/11/fedora-vm-settings-iso.png?resize=800%2C640&ssl=1 +[16]: https://i2.wp.com/itsfoss.com/wp-content/uploads/2020/11/3-fedora-vm-settings2.png?resize=800%2C600&ssl=1 +[17]: https://i0.wp.com/itsfoss.com/wp-content/uploads/2020/10/4-fedora-vm-cpu.png?resize=800%2C533&ssl=1 +[18]: https://i2.wp.com/itsfoss.com/wp-content/uploads/2020/11/6-fedora-vm-boot.png?resize=800%2C600&ssl=1 +[19]: https://i2.wp.com/itsfoss.com/wp-content/uploads/2020/10/7-fedora-vm-install-1.png?resize=800%2C622&ssl=1 +[20]: https://i2.wp.com/itsfoss.com/wp-content/uploads/2020/10/9-fedora-vm-partitioning-2.png?resize=800%2C706&ssl=1 +[21]: https://i0.wp.com/itsfoss.com/wp-content/uploads/2020/11/10-fedora-vm-hdd.png?resize=732%2C645&ssl=1 +[22]: https://i1.wp.com/itsfoss.com/wp-content/uploads/2020/11/12-fedora-vm-installation-1.png?resize=800%2C706&ssl=1 +[23]: https://i1.wp.com/itsfoss.com/wp-content/uploads/2020/11/15-power-off-fedora-gnome.png?resize=800%2C706&ssl=1 +[24]: https://i0.wp.com/itsfoss.com/wp-content/uploads/2020/11/remove-fedora-iso-from-optical-drive.png?resize=800%2C589&ssl=1 +[25]: https://www.virtualbox.org/manual/ch04.html +[26]: https://i1.wp.com/itsfoss.com/wp-content/uploads/2020/11/16-Fedora-vm-guest-additions.png?resize=800%2C706&ssl=1 +[27]: https://i1.wp.com/itsfoss.com/wp-content/uploads/2020/11/17-Fedora-vm-guest-additions.png?resize=800%2C686&ssl=1 +[28]: https://i1.wp.com/itsfoss.com/wp-content/uploads/2020/11/19-fedora-vm-shared-clipboard-2.png?resize=800%2C650&ssl=1 +[29]: https://i0.wp.com/itsfoss.com/wp-content/uploads/2020/11/20-fedora-vm-shared-folders-1.png?resize=800%2C650&ssl=1 +[30]: https://i1.wp.com/itsfoss.com/wp-content/uploads/2020/11/22-fedora-vm-shared-folders2-1.png?resize=800%2C547&ssl=1 +[31]: https://download.virtualbox.org/virtualbox/6.1.16/Oracle_VM_VirtualBox_Extension_Pack-6.1.16.vbox-extpack +[32]: https://i1.wp.com/itsfoss.com/wp-content/uploads/2020/11/21.-fedora-vm-extension-pack.png?resize=800%2C600&ssl=1 +[33]: https://i0.wp.com/itsfoss.com/wp-content/uploads/2020/11/25.-fedora-vm-usb-1.png?resize=800%2C527&ssl=1 +[34]: https://i2.wp.com/itsfoss.com/wp-content/uploads/2020/11/26.-fedora-vm-usb-1.png?resize=800%2C578&ssl=1 +[35]: https://i2.wp.com/itsfoss.com/wp-content/uploads/2020/11/23.-fedora-vm-export.png?resize=800%2C600&ssl=1 +[36]: https://i1.wp.com/itsfoss.com/wp-content/uploads/2020/11/24.-fedora-vm-export-1.png?resize=800%2C545&ssl=1 +[37]: https://i0.wp.com/itsfoss.com/wp-content/uploads/2020/11/25.-fedora-vm-export-800x545.png?resize=800%2C545&ssl=1 diff --git a/published/202011/20201116 Podman with capabilities on Fedora.md b/published/202011/20201116 Podman with capabilities on Fedora.md new file mode 100644 index 0000000000..92123795f3 --- /dev/null +++ b/published/202011/20201116 Podman with capabilities on Fedora.md @@ -0,0 +1,115 @@ +[#]: collector: (lujun9972) +[#]: translator: (geekpi) +[#]: reviewer: (wxy) +[#]: publisher: (wxy) +[#]: url: (https://linux.cn/article-12859-1.html) +[#]: subject: (Podman with capabilities on Fedora) +[#]: via: (https://fedoramagazine.org/podman-with-capabilities-on-fedora/) +[#]: author: (shiwanibiradar https://fedoramagazine.org/author/shiwanibiradar/) + +在 Fedora 中结合权能使用 Podman +====== + +![][1] + +容器化是一项蓬勃发展的技术。在不久的将来,多达百分之七十五的全球组织可能会运行某种类型的容器化技术。由于广泛使用的技术更容易成为黑客攻击的目标,因此保护容器的安全就显得尤为重要。本文将演示如何使用 POSIX [权能][2]Capability 来保护 Podman 容器的安全。Podman 是 RHEL8 中默认的容器管理工具。 + +### 确定 Podman 容器的权限模式 + +容器以特权模式或无特权模式运行。在特权模式下,[容器的 uid 0 被映射到宿主机的 uid 0][3]。对于某些情况,无特权的容器[缺乏对宿主机资源的充分访问能力][4]。但不管其操作模式如何,包括强制访问控制Mandatory Access Control(MAC:如 apparmor、SELinux 等)、seccomp 过滤器、删除权能Capability、命名空间等在内的技术有助于确保容器的安全。 + +要从容器外部确定特权模式: + +``` +$ podman inspect --format="{{.HostConfig.Privileged}}" +``` + +如果上面的命令返回 `true`,那么容器在特权模式下运行。如果返回 `false`,那么容器在非特权模式下运行。 + +要从容器内部确定特权模式: + +``` +$ ip link add dummy0 type dummy +``` + +如果该命令允许你创建一个接口,那么你运行的是一个特权容器,否则你运行的是一个非特权容器。 + +### 权能 + +命名空间隔离了容器的进程,使其无法任意访问宿主机的资源,也无法访问在同一宿主机上运行的其他容器的资源。然而,在**特权**容器内的进程仍然可以做一些事情,如改变 IP 路由表、跟踪任意进程和加载内核模块。权能Capability允许人们对容器内的进程可以访问或更改的资源施加更细微的限制,即使容器在特权模式下运行也一样。权能还允许人们为无特权的容器分配它本来不会拥有的特权。 + +例如,如果要将 `NET_ADMIN` 功能添加到一个无特权的容器中,以便在容器内部创建一个网络接口,你可以用下面的参数运行 `podman`: + +``` +[root@vm1 ~]# podman run -it --cap-add=NET_ADMIN centos +[root@b27fea33ccf1 /]# ip link add dummy0 type dummy +[root@b27fea33ccf1 /]# ip link +``` + +上面的命令演示了在一个无特权的容器中创建一个 `dummy0` 接口。如果没有 `NET_ADMIN` 权能,非特权容器将无法创建接口。上面的命令演示了如何将一个权能授予一个无特权的容器。 + +目前,大约有 [39 种权能][5]可以被授予或拒绝。特权容器默认会被授予许多权能。建议从特权容器中删除不需要的权能,以使其更加安全。 + +要从容器中删除所有权能: + +``` +$ podman run -it -d --name mycontainer --cap-drop=all centos +``` + +列出一个容器的权能: + +``` +$ podman exec -it 48f11d9fa512 capsh --print +``` + +上述命令显示没有向容器授予任何权能。 + +请参考 `capabilities` 手册页以获取完整的权能列表: + +``` +$ man capabilities +``` + +可以使用 `capsh` 命令来列出目前拥有的权能: + +``` +$ capsh --print +``` + +作为另一个例子,下面的命令演示了如何从容器中删除 `NET_RAW` 权能。如果没有 `NET_RAW` 权能,就不能从容器中 `ping` 互联网上的服务器。 + +``` +$ podman run -it --name mycontainer1 --cap-drop=net_raw centos +>>> ping google.com (will output error, operation not permitted) +``` + +最后一个例子,如果你的容器只需要 `SETUID` 和 `SETGID` 权能,你可以删除所有权能,然后只重新添加这两个权能来实现这样的权限设置。 + +``` +$ podman run -d --cap-drop=all --cap-add=setuid --cap-add=setgid fedora sleep 5 > /dev/null; pscap | grep sleep +``` + +上面的 `pscap` 命令会显示容器被授予的权能。 + +我希望你喜欢这个关于如何使用权能来保护 Podman 容器的简短探索。 + +谢谢! + +-------------------------------------------------------------------------------- + +via: https://fedoramagazine.org/podman-with-capabilities-on-fedora/ + +作者:[shiwanibiradar][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/shiwanibiradar/ +[b]: https://github.com/lujun9972 +[1]: https://fedoramagazine.org/wp-content/uploads/2018/10/podman-816x345.jpg +[2]: https://www.linuxjournal.com/magazine/making-root-unprivileged +[3]: https://linuxcontainers.org/lxc/security/#privileged-containers +[4]: https://github.com/containers/podman/blob/master/rootless.md +[5]: https://man7.org/linux/man-pages/man7/capabilities.7.html diff --git a/published/202011/20201116 Unlock encrypted disks on Linux automatically.md b/published/202011/20201116 Unlock encrypted disks on Linux automatically.md new file mode 100644 index 0000000000..e7a44a312b --- /dev/null +++ b/published/202011/20201116 Unlock encrypted disks on Linux automatically.md @@ -0,0 +1,249 @@ +[#]: collector: (lujun9972) +[#]: translator: (geekpi) +[#]: reviewer: (wxy) +[#]: publisher: (wxy) +[#]: url: (https://linux.cn/article-12851-1.html) +[#]: subject: (Unlock encrypted disks on Linux automatically) +[#]: via: (https://opensource.com/article/20/11/nbde-linux) +[#]: author: (Curt Warfield https://opensource.com/users/rcurtiswarfield) + +自动解锁 Linux 上的加密磁盘 +====== + +> 通过使用网络绑定磁盘加密(NBDE),无需手动输入密码即可打开加密磁盘。 + +![](https://img.linux.net.cn/data/attachment/album/202011/23/104735lmx18sxxs18f4xcc.jpg) + +从安全的角度来看,对敏感数据进行加密以保护其免受窥探和黑客的攻击是很重要的。Linux 统一密钥设置Linux Unified Key Setup([LUKS][2])是一个很好的工具,也是 Linux 磁盘加密的通用标准。因为它将所有相关的设置信息存储在分区头部中,所以它使数据迁移变得简单。 + +要使用 LUKS 配置加密磁盘或分区,你需要使用 [cryptsetup][3] 工具。不幸的是,加密磁盘的一个缺点是,每次系统重启或磁盘重新挂载时,你都必须手动提供密码。 + +然而,网络绑定磁盘加密Network-Bound Disk Encryption(NBDE) 可以在没有任何用户干预的情况下自动安全地解锁加密磁盘。它可以在一些 Linux 发行版中使用,包括从 Red Hat Enterprise Linux 7.4、CentOS 7.4 和 Fedora 24 开始,以及之后的后续版本。 + +NBDE 采用以下技术实现: + +* [Clevis 框架][4]:一个可插拔的框架工具,可自动解密和解锁 LUKS 卷 +* [Tang 服务器][5]:用于将加密密钥绑定到网络状态的服务 + +Tang 向 Clevis 客户端提供加密密钥。据 Tang 的开发人员介绍,这为密钥托管服务提供了一个安全、无状态、匿名的替代方案。 + +由于 NBDE 使用客户端-服务器架构,你必须同时配置客户端和服务器。你可以在你的本地网络上使用一个虚拟机作为 Tang 服务器。 + +### 服务器安装 + +用 sudo 安装 Tang: + +``` +sudo yum install tang -y +``` + +启用 Tang 服务器: + +``` +sudo systemctl enable tangd.socket --now +``` + +Tang 服务器工作在 80 端口,需加入到 firewalld 防火墙。添加相应的 firewalld 规则: + + +``` +sudo firewall-cmd --add-port=tcp/80 --perm +sudo firewall-cmd --reload +``` + +现在安装好了服务器。 + +### 客户端安装 + +在本例中,假设你已经添加了一个名为 `/dev/vdc` 的新的 1GB 磁盘到你的系统中。 + +使用 `fdisk` 或 `parted` 创建主分区: + +``` +sudo fdisk /dev/vdc +``` + +完成以下步骤来安装客户端: + +``` +Welcome to fdisk (util-linux 2.23.2). + +Changes will remain in memory only, until you decide to write them. +Be careful before using the write command. + +Device does not contain a recognized partition table +Building a new DOS disklabel with disk identifier 0x4a6812d4. + +Command (m for help): +``` + +输入 `n` 来创建新的分区: + +``` +Partition type: + p primary (0 primary, 0 extended, 4 free) + e extended +Select (default p): +``` + +按下**回车**键选择主分区: + + +``` +Using default response p +Partition number (1-4, default 1): +``` + +按下回车键选择默认分区号: + +``` +First sector (2048-2097151, default 2048): +Using default value 2048 +Last sector, +sectors or +size{K,M,G} (2048-2097151, default 2097151): +``` + +按回车键选择最后一个扇区: + +``` +Using default value 2097151 +Partition 1 of type Linux and of size 1023 MiB is set + +Command (m for help): wq +``` + +输入 `wq` 保存更改并退出 `fdisk`: + +``` +The partition table has been altered! + +Calling ioctl() to re-read partition table. +Syncing disks. +``` + +运行 `partprobe` 通知系统分区表的变化: + +``` +sudo partprobe +``` + +使用 `sudo` 安装 cryptsetup 软件包: + +``` +sudo yum install cryptsetup -y +``` + +使用 `cryptsetup luksFormat` 命令对磁盘进行加密。当提示时,你需要输入大写的 `YES`,并输入密码来加密磁盘: + +``` +sudo cryptsetup luksFormat /dev/vdc1 +WARNING! +======== +This will overwrite data on /dev/vdc1 irrevocably. + +Are you sure? (Type uppercase yes): + +Enter passphrase for /dev/vdc1: +Verify passphrase: +``` + +使用 `cryptsetup luksOpen` 命令将加密的分区映射到一个逻辑设备上。例如,使用 `encryptedvdc1` 作为名称。你还需要再次输入密码: + +``` +sudo cryptsetup luksOpen /dev/vdc1 encryptedvdc1 +Enter passphrase for /dev/vdc1: +``` + +加密分区现在在 `/dev/mapper/encryptedvdc1` 中可用。 + +在加密的分区上创建一个 XFS 文件系统: + +``` +sudo mkfs.xfs /dev/mapper/encryptedvdc1 +``` + +创建一个挂载加密分区的目录: + +``` +sudo mkdir /encrypted +``` + +使用 `cryptsetup luksClose` 命令锁定分区: + +``` +cryptsetup luksClose encryptedvdc1 +``` + +使用 `sudo` 安装 Clevis 软件包: + +``` +sudo yum install clevis clevis-luks clevis-dracut -y +``` + +修改 `/etc/crypttab`,在启动时打开加密卷: + +``` +sudo vim /etc/crypttab +``` + +增加以下一行: + +``` +encryptedvdc1 /dev/vdc1 none _netdev +``` + +修改 `/etc/fstab`,在重启时或启动时自动挂载加密卷: + +``` +sudo vim /etc/fstab +``` + +增加以下一行: + +``` +/dev/mapper/encryptedvdc1 /encrypted xfs _netdev 1 2 +``` + +在这个例子中,假设 Tang 服务器的 IP 地址是 `192.168.1.20`。如果你喜欢,也可以使用主机名或域名。 + +运行以下 `clevis` 命令: + +``` +sudo clevis bind luks -d /dev/vdc1 tang '{"url":"http://192.168.1.20"}' +The advertisement contains the following signing keys: + +rwA2BAITfYLuyNiIeYUMBzkhk7M + +Do you wish to trust these keys? [ynYN] Y +Enter existing LUKS password: +``` + +输入 `Y` 接受 Tang 服务器的密钥,并提供现有的 LUKS 密码进行初始设置。 + +通过 `systemctl` 启用 `clevis-luks-askpass.path`,以防止非根分区被提示输入密码。 + +``` +sudo systemctl enable clevis-luks-askpass.path +``` + +客户端已经安装完毕。现在,每当你重启服务器时,加密后的磁盘应该会自动解密,并通过 Tang 服务器取回密钥进行挂载。 + +如果 Tang 服务器因为任何原因不可用,你需要手动提供密码,才能解密和挂载分区。 + +-------------------------------------------------------------------------------- + +via: https://opensource.com/article/20/11/nbde-linux + +作者:[Curt Warfield][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/rcurtiswarfield +[b]: https://github.com/lujun9972 +[1]: https://opensource.com/sites/default/files/styles/image-full-size/public/lead-images/security-lock-password.jpg?itok=KJMdkKum (Lock) +[2]: https://en.wikipedia.org/wiki/Linux_Unified_Key_Setup +[3]: https://gitlab.com/cryptsetup/cryptsetup +[4]: https://github.com/latchset/clevis +[5]: https://github.com/latchset/tang \ No newline at end of file diff --git a/published/202011/20201118 LazPaint- A Free - Open Source Paint.NET Alternative.md b/published/202011/20201118 LazPaint- A Free - Open Source Paint.NET Alternative.md new file mode 100644 index 0000000000..3828710bf1 --- /dev/null +++ b/published/202011/20201118 LazPaint- A Free - Open Source Paint.NET Alternative.md @@ -0,0 +1,95 @@ +[#]: collector: (lujun9972) +[#]: translator: (geekpi) +[#]: reviewer: (wxy) +[#]: publisher: (wxy) +[#]: url: (https://linux.cn/article-12858-1.html) +[#]: subject: (LazPaint: A Free & Open Source Paint.NET Alternative) +[#]: via: (https://itsfoss.com/lazpaint/) +[#]: author: (Ankush Das https://itsfoss.com/author/ankush/) + +LazPaint:一个自由开源的 Paint.NET 替代品 +====== + +![](https://img.linux.net.cn/data/attachment/album/202011/25/120828b330z4cem3i030tl.jpg) + +> LazPaint 是一款开源 Paint.NET 替代品,支持跨平台。它是一个轻量级的程序,拥有一堆快速编辑图像的基本选项。下面是 LazPaint 的概述。 + +### LazPaint:Linux 下的开源 Paint.NET 替代品 + +![][1] + +如果你喜欢使用工具来快速编辑和处理图像和截图,你可能听说过 [Paint.NET][2],但它只适用于 Windows 系统。 + +它是一个流行的小工具,可以完成很多基本的编辑任务,同时还有一堆可用的选项。你可能知道一些[图像编辑工具][3],但 Paint.NET 是一个相当受欢迎的选择,因为对于一个普通用户来说,它易于使用,且没有任何臃肿的功能。 + +[LazPaint][4]作为 Linux、Windows 和 macOS 上 Paint.NET 的令人印象深刻的开源替代品而出现。它提供了操作图像所需的大部分基本功能,同时又易于使用。 + +![][5] + +由于它是跨平台的应用,即使你不使用 Linux 系统,你仍然可以以自由开源工具使用它,这并非没有意义。现在,让我们看一下它提供的一些功能。 + +### LazPaint 的功能 + +![][6] + +正如我前面提到的,LazPaint 提供了一堆必要的功能。在这里,我将列出关键的部分,这可以帮助你决定是否需要它。然而,我建议你去探索它,以了解更多关于它的信息。 + +* 支持所有主要的文件格式(包括分层位图和 3D 文件) +* 选区工具、裁剪选区、选区笔、反转选区 +* 支持导出到 [Krita][7] +* 以各种质量设置对图像进行重新采样 +* 运动模糊、自定义模糊、径向模糊和像素化工具 +* 可以移除透明度和扁平化图像 +* 旋转和翻转图像 +* 将图像转换为负片 +* 能够调整画布的大小 +* 变形工具(透视) +* 高级绘图工具 +* 设置工作区颜色 +* 黑暗主题 +* 支持脚本功能 +* 具有基本管理选项的层支持 +* 层效果 +* 过滤器 +* 灰度效果 +* 能够启用/禁用工具栏或将其添加到 Dock 上 + +### 在 Linux 上安装 LazPaint + +你应该可以在你的官方软件仓库中找到它,通过你的默认软件包管理器来安装它,但要获得最新版本,你需要下载 .deb 文件,或者在非 Debian 的发行版上从源码编译它。 + +我希望有一个可以在每个 Linux 发行版上获得最新的版本的 Flatpak 软件包,但目前还没有。 + +它也适用于 Windows 和 macOS。你会发现 Windows 还有一个便携版,可以派上用场。 + +- [LazPaint][4] + +### 关于 LazPaint 的总结 + +我发现它真的很容易使用,以各种质量设置来重新采样(或调整大小)图像绝对是一个加分项。如果你已经安装了它,你一定注意到,它不需要大量的存储空间,总体上是一个轻量级的程序。 + +它的速度很快,我在快速测试中的大部分功能都相当好用,没有任何问题。 + +你觉得 LazPaint 作为 Paint.NET 的替代品怎么样?请在下面的评论中告诉我你的想法。 + +-------------------------------------------------------------------------------- + +via: https://itsfoss.com/lazpaint/ + +作者:[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://i1.wp.com/itsfoss.com/wp-content/uploads/2020/11/lazpaint.jpg?resize=800%2C397&ssl=1 +[2]: https://www.getpaint.net +[3]: https://itsfoss.com/image-applications-ubuntu-linux/ +[4]: https://lazpaint.github.io/ +[5]: https://i2.wp.com/itsfoss.com/wp-content/uploads/2020/11/lazpaint-screenshot-2.png?resize=800%2C481&ssl=1 +[6]: https://i2.wp.com/itsfoss.com/wp-content/uploads/2020/11/lazpaint-screenshot.jpg?resize=800%2C484&ssl=1 +[7]: https://krita.org/en +[9]: https://itsfoss.com/drawing-app/ \ No newline at end of file diff --git a/published/202011/20201120 How to Increase Disk Size of Your Existing Virtual Machines in VirtualBox.md b/published/202011/20201120 How to Increase Disk Size of Your Existing Virtual Machines in VirtualBox.md new file mode 100644 index 0000000000..bd09032fe7 --- /dev/null +++ b/published/202011/20201120 How to Increase Disk Size of Your Existing Virtual Machines in VirtualBox.md @@ -0,0 +1,89 @@ +[#]: collector: (lujun9972) +[#]: translator: (geekpi) +[#]: reviewer: (wxy) +[#]: publisher: (wxy) +[#]: url: (https://linux.cn/article-12869-1.html) +[#]: subject: (How to Increase Disk Size of Your Existing Virtual Machines in VirtualBox) +[#]: via: (https://itsfoss.com/increase-disk-size-virtualbox/) +[#]: author: (Dimitrios Savvopoulos https://itsfoss.com/author/dimitrios/) + +如何在 VirtualBox 中增加现有虚拟机的磁盘大小 +====== + +下面是你迟早会遇到的情况。 + +你在 [VirtualBox][1] 中安装了一个或多个操作系统。在创建这些虚拟操作系统的同时,你还在 VirtualBox 中为它们创建了虚拟硬盘。 + +你指定了虚拟磁盘的最大大小,比如说 15 或 20GB,但现在使用了一段时间后,你发现你的虚拟机已经没有空间了。 + +虽然[在 Ubuntu 和其他操作系统上有释放磁盘空间的方法][2],但更稳健的处理方式是增加 VirtualBox 中创建的虚拟机的磁盘大小。 + +是的,你可以在 VirtualBox 中扩大虚拟硬盘,即使在创建之后也可以。虽然这是一个安全且经过测试的过程,但我们强烈建议你在执行这样的操作之前,先创建一个虚拟机的备份。 + +### 如何扩大 VirtualBox 磁盘大小 + +![][3] + +我将向你展示如何在 VirtualBox 中以图形和命令行(对于 Linux 极客)方式调整磁盘大小。这两种方法都很简单直接。 + +#### 方法 1:在 VirtualBox 中使用虚拟媒体管理器 + +VirtualBox 6 增加了一个调整虚拟磁盘大小的图形化选项。你可以在 VirtualBox 主页的文件选项卡中找到它。 + +进入 “File -> Virtual Media Manager”: + +![][4] + +在列表中选择一个虚拟机,然后使用 “Size” 滑块或输入你需要的大小值。完成后点击 “Apply”。 + +![][5] + +请记住,虽然你增加了虚拟磁盘的大小,但**如果你的空间是动态分配的,那么实际的分区大小仍然不变**。 + +#### 方法 2:使用 Linux 命令行增加 VirtualBox 磁盘空间 + +如果你使用 Linux 操作系统作为宿主机,在宿主机中打开终端并输入以下命令来调整 VDI 的大小: + +``` +VBoxManage modifymedium "/path_to_vdi_file" --resize +``` + +在你按下回车执行命令后,调整大小的过程应该马上结束。 + +> 注意事项 +> +> VirtualBox 早期版本命令中的 `*modifyvdi` 和 `modifyhd` 命令也支持,并在内部映射到 `modifymedium` 命令。 + +![][6] + +如果你不确定虚拟机的保存位置,可以在 VirtualBox 主页面点击 “Files -> Preferences” 或使用键盘快捷键 `Ctrl+G` 找到默认位置。 + +![][7] + +### 总结 + +就我个人而言,我更喜欢在每个 Linux 发行版上使用终端来扩展磁盘,图形化选项是最新的 VirtualBox 版本的一个非常方便的补充。 + +这是一个简单快捷的小技巧,但对 VirtualBox 基础知识是一个很好的补充。如果你觉得这个小技巧很有用,可以看看 [VirtualBox 客户端增强包][8]的几个功能。 + +-------------------------------------------------------------------------------- + +via: https://itsfoss.com/increase-disk-size-virtualbox/ + +作者:[Dimitrios Savvopoulos][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/dimitrios/ +[b]: https://github.com/lujun9972 +[1]: https://www.virtualbox.org/ +[2]: https://itsfoss.com/free-up-space-ubuntu-linux/ +[3]: https://i2.wp.com/itsfoss.com/wp-content/uploads/2020/11/enlarge-disk-size-virtualbox.png?resize=800%2C450&ssl=1 +[4]: https://i0.wp.com/itsfoss.com/wp-content/uploads/2020/11/1-virtual-box-media-manager.png?resize=800%2C600&ssl=1 +[5]: https://i0.wp.com/itsfoss.com/wp-content/uploads/2020/11/2-virtual-box-increase-disc-space.png?resize=800%2C505&ssl=1 +[6]: https://i1.wp.com/itsfoss.com/wp-content/uploads/2020/11/3-virtual-box-increase-disc-space-terminal.png?resize=800%2C600&ssl=1 +[7]: https://i0.wp.com/itsfoss.com/wp-content/uploads/2020/11/4-virtual-box-preferences.png?resize=800%2C450&ssl=1 +[8]: https://itsfoss.com/install-fedora-in-virtualbox/ diff --git a/published/202011/20201124 Compare Files and Folders Graphically in Linux With Meld.md b/published/202011/20201124 Compare Files and Folders Graphically in Linux With Meld.md new file mode 100644 index 0000000000..619f4dd774 --- /dev/null +++ b/published/202011/20201124 Compare Files and Folders Graphically in Linux With Meld.md @@ -0,0 +1,113 @@ +[#]: collector: (lujun9972) +[#]: translator: (geekpi) +[#]: reviewer: (wxy) +[#]: publisher: (wxy) +[#]: url: (https://linux.cn/article-12866-1.html) +[#]: subject: (Compare Files and Folders Graphically in Linux With Meld) +[#]: via: (https://itsfoss.com/meld-gui-diff/) +[#]: author: (Abhishek Prakash https://itsfoss.com/author/abhishek/) + +使用 Meld 在 Linux 中以图形方式比较文件和文件夹 +====== + +![](https://img.linux.net.cn/data/attachment/album/202011/28/145914mr5zcl2wnns8rj5j.jpg) + +如何比较两个相似的文件来检查差异?答案显而易见,就是[使用 Linux 中的 diff 命令][1]。 + +问题是,并不是每个人都能自如地在 Linux 终端中比较文件,而且 `diff` 命令的输出可能会让一些人感到困惑。 + +以这个 `diff` 命令的输出为例: + +![][2] + +这里肯定涉及到一个学习曲线。然而,如果你使用的是桌面 Linux,你可以使用 [GUI][3] 应用来轻松比较两个文件是否有任何差异。 + +有几个 Linux 中的 GUI 差异比较工具。我将在本周的 Linux 应用亮点中重点介绍我最喜欢的工具 Meld。 + +### Meld:Linux(及 Windows)下的可视化比较和合并工具 + +通过 [Meld][4],你可以将两个文件并排比较。不仅如此,你还可以对文件进行相应的修改。这是你在大多数情况下想做的事情,对吗? + +![File Comparison][5] + +Meld 还能够比较目录,并显示哪些文件是不同的。它还会显示而文件是新的或是缺失的。 + +![Directory Comparison][6] + +你也可以使用 Meld 进行三向比较。 + +![Three Way File Comparison][7] + +图形化的并排比较在很多情况下都有帮助。如果你是开发人员,你可以用它来了解代码补丁。Meld 还支持版本控制系统,如 Git、[Mercurial][8]、[Subversion][9] 等。 + +### Meld 的功能 + +![][10] + +开源的 Meld 工具具有以下主要功能: + + * 进行双向和三向差异比较 + * 就地编辑文件,差异比较立即更新 + * 在差异和冲突之间进行导航 + * 通过插入、更改和冲突相应地标示出全局和局部差异,使其可视化 + * 使用正则文本过滤来忽略某些差异 + * 语法高亮显示 + * 比较两个或三个目录,看是否有新增加、缺失和更改的文件 + * 将一些文件排除在比较之外 + * 支持流行的版本控制系统,如 Git、Mercurial、Bazaar 和 SVN + * 支持多种国际语言 + * 开源 GPL v2 许可证 + * 既可用于 Linux,也可用于 Windows + +### 在 Linux 上安装 Meld + +Meld 是一个流行的应用程序,它在大多数 Linux 发行版的官方仓库中都有。 + +检查你的发行版的软件中心,看看 Meld 是否可用。 + +![Meld In Ubuntu Software Center][11] + +另外,你也可以使用你的发行版的命令行包管理器来安装 Meld。在 [Ubuntu 上,它可以在 Universe 仓库中找到][12],并且可以[使用 apt 命令安装][13]: + +``` +sudo apt install meld +``` + +你可以在 GNOME 的 GitLab 仓库中找到 Meld 的源码: + +[Meld Source Code][14] + +### 它值得使用吗? + +我知道[大多数现代开源编辑器][15]都有这个功能,但有时你只是想要一个简单的界面,而不需要安装额外的附加软件来比较文件。Meld 就为你提供了这样的功能。 + +你是否使用一些其他工具来检查文件之间的差异?是哪种工具呢?如果你用过 Meld,你有什么经验?请在评论区分享你的意见。 + +-------------------------------------------------------------------------------- + +via: https://itsfoss.com/meld-gui-diff/ + +作者:[Abhishek Prakash][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/abhishek/ +[b]: https://github.com/lujun9972 +[1]: https://linuxhandbook.com/diff-command/ +[2]: https://i1.wp.com/itsfoss.com/wp-content/uploads/2020/11/diff-command-complicated-output.png?resize=795%2C551&ssl=1 +[3]: https://itsfoss.com/gui-cli-tui/ +[4]: https://meldmerge.org +[5]: https://i1.wp.com/itsfoss.com/wp-content/uploads/2020/11/file-comaprison-in-Linux-with-meld.png?resize=800%2C498&ssl=1 +[6]: https://i0.wp.com/itsfoss.com/wp-content/uploads/2020/11/directory-comparison-in-Linux-with_meld.png?resize=800%2C497&ssl=1 +[7]: https://i0.wp.com/itsfoss.com/wp-content/uploads/2020/11/three-way-file-comaprison-with-meld-in-linux.png?resize=800%2C466&ssl=1 +[8]: https://www.mercurial-scm.org/ +[9]: https://subversion.apache.org/ +[10]: https://i0.wp.com/itsfoss.com/wp-content/uploads/2020/11/meld-visual-diff.png?resize=786%2C455&ssl=1 +[11]: https://i1.wp.com/itsfoss.com/wp-content/uploads/2020/11/Meld-in-Ubuntu-Software-Center.png?resize=800%2C384&ssl=1 +[12]: https://itsfoss.com/ubuntu-repositories/ +[13]: https://itsfoss.com/apt-command-guide/ +[14]: https://gitlab.gnome.org/GNOME/meld +[15]: https://itsfoss.com/best-modern-open-source-code-editors-for-linux/ diff --git a/published/202012/20190115 Linux Desktop Setup - HookRace Blog.md b/published/202012/20190115 Linux Desktop Setup - HookRace Blog.md new file mode 100644 index 0000000000..4efb833a04 --- /dev/null +++ b/published/202012/20190115 Linux Desktop Setup - HookRace Blog.md @@ -0,0 +1,523 @@ +[#]: collector: (lujun9972) +[#]: translator: (chenmu-kk) +[#]: reviewer: (wxy) +[#]: publisher: (wxy) +[#]: url: (https://linux.cn/article-12883-1.html) +[#]: subject: (Linux Desktop Setup · HookRace Blog) +[#]: via: (https://hookrace.net/blog/linux-desktop-setup/) +[#]: author: (Dennis Felsing http://felsin9.de/nnis/) + +十年 Linux 桌面生存指南 +====== + +![](https://img.linux.net.cn/data/attachment/album/202012/03/223817smrej5qwsbqjb3vs.jpg) + +从 2006 年开始转战 Linux 系统后,经过几年的实践,我的软件设置在过去十年内出人意料的固定。再过十年回顾一下,看看发生了什么,也许会非常有趣。在写这篇推文时,我迅速回顾了正在运行的内容: + +![htop overview][2] + +### 动机 + +我的软件介绍排序不分先后: + + * 程序应该运行在本地系统中以便我可以控制它,这其中并不包括云解决方案。 + * 程序应在终端中运行,以便于在任何地方连贯地使用它们,包括性能稍差的电脑或手机。 + * 通过使用终端软件,可以实现自动聚焦键盘。只有在一些有意义的地方,我会更喜欢使用鼠标,因为在打字期间一直伸手去拿鼠标感觉像在浪费时间。有时候过了一个小时我才注意到甚至还没有插鼠标。 + * 最好使用快速高效的软件,我不喜欢听到风扇的声音和感到房间在变热。我还可以继续长久地运行旧硬件,已经使用了 10 年的 Thinkpad x200s 还能很好地支持我所使用的软件。 + * 组合。我不想手动执行每个步骤,而是在需要时自动执行更多操作,这时自然是支持 shell。 + +### 操作系统 + +十二年前移除 Windows 系统后,我在 Linux 系统上经历了一个艰难的开始,当时我手上只有 [Gentoo Linux][3] 系统的安装光盘和一本打印的说明书,要用它们来实现一个可运行的 Linux 系统。虽然花费了几天的时间去编译和修整,但最终还是觉得自己受益颇多。 + +自此我再也没有转回 Windows 系统,但在持续的编译压力导致风扇失灵后,我将我的电脑系统切换到 [Arch Linux][4]。之后我将其他的电脑和私人服务器也切换到了 Arch Linux。作为一个滚动发布发行版,你可以随时升级软件包,但 [Arch Linux News][5] 已经详细报道了其中最主要的漏洞。 + +不过,令人烦恼的是一旦你更新了旧的内核模组,Arch Linux 就会移除旧版的相关信息。我经常注意到一旦我试着插入一个 USB 闪存盘,内核就无法加载相关组件。相反,每次内核升级后都应该进行重启。有一些 [方法][6] 可以解决这个问题,但我还没有实际地使用它们。 + +其他程序也会出现类似的情况,通常 Firefox 、 cron 或者 Samba 在升级后都需要重启,但恼人的是,它们没有警告你存在这种情况。我在工作中使用的 [SUSE][7] 很好地提醒了这种情况。 + +对于 [DDNet][8] 产品服务器,相较于 Arch Linux ,我更倾向于 [Debian][9] 系统,这样在每次升级时出现故障的几率更低。我的防火墙和路由器使用了 [OpenBSD][10] ,它拥有干净系统、文档和强大的 [pf 防火墙][11],而我现在不需要一个单独的路由器。 + +### 窗口管理器 + +从我开始使用 Gentoo 后,我很快注意到 KDE 的编译时间非常长,这让我没办法继续使用它。我四处寻找更简单的解决方案,最初使用了 [Openbox][12] 和 [Fluxbox][13]。某次,为了能更多进行纯键盘操作,我开始尝试转入平铺窗口管理器,并在研究其初始版本的时候学习了 [dwm][14] 和 [awesome][15]。 + +最终,由于 [xmonad][16]的灵活性、可扩展性以及使用纯 [Haskell][17](一种出色的函数编程语言)编写和配置,最终选择了它。一个例子是,我在家中运行一个 40" 4K 的屏幕,但经常会将它分为四个虚拟屏幕,每个虚拟屏幕显示一个工作区,每个工作区自动排列在我的窗口上。当然, xmonad 有一个对应的 [模块][18]。 + +[dzen][19] 和 [conky][20] 对我来说是一个非常简单的状态栏。我的整体 conky 配置看起来是这样的: + +``` +out_to_console yes +update_interval 1 +total_run_times 0 + +TEXT +${downspeed eth0} ${upspeed eth0} | $cpu% ${loadavg 1} ${loadavg 2} ${loadavg 3} $mem/$memmax | ${time %F %T} +``` + +输入命令直接通过管道输入 dzen2: + +``` +conky | dzen2 -fn '-xos4-terminus-medium-r-normal-*-12-*-*-*-*-*-*-*' -bg '#000000' -fg '#ffffff' -p -e '' -x 1000 -w 920 -xs 1 -ta r +``` + +对我而言,一项重要功能是在完成工作后使终端发出蜂鸣声。只需要简单地在 zsh 中的 `PR_TITLEBAR` 变量中添加一个 `\a` 字符就可以做到,只要工作完成就可以发出蜂鸣声。当然,我使用了命令: + +``` +echo "blacklist pcspkr" > /etc/modprobe.d/nobeep.conf +``` + +将 `pcspkr` 内核模块列入黑名单来禁用实际的蜂鸣声。相反 urxvt 的 `URxvt.urgentOnBell: true` 设置会将声音变为尖锐。之后 xmonad 有一个 urgency 钩子来捕捉这类信号,并且我可以使用组合键自动聚焦到当前的发出紧急信号的窗口。在 dzen 中我可以看到一个漂亮且明亮的 `#ff0000` 紧急窗口。 + +在我笔记本上所得到的最终成品是: + +![Laptop screenshot][22] + +我听说前几年 [i3][23] 变得非常流行,但它要求更多的手动窗口对齐而不是自动对齐。 + +我意识到也有像 [tmux][24] 那样的终端多路复用器,但我仍想要一些图形化应用程序,因此最终我没有有效地使用它们。 + +### 终端连续性 + +为了使终端保持活跃状态,我使用了 [dtach][25] ,它只是模拟屏幕分离功能。为了使计算机上的每个终端都可连接和断开,我编写了一个小的封装脚本。 这意味着,即使必须重新启动 X 服务器,我也可以使所有终端都运行良好,包括本地和远程终端。 + +### Shell & 编程 + +对于 shell,我使用 [zsh][28] 而不是 [bash][27],因为它有众多的功能。 + +作为终端模拟,我发现 [urxvt][29] 足够轻巧,支持 Unicode 编码和 256 色,具有出色的性能。另一个重要的功能是可以分别运行 urxvt 客户端和守护进程。因此,即使大量终端也几乎不占用任何内存(回滚缓冲区除外)。 + +对我而言,只有一种字体看起来绝对干净和完美: [Terminus][30]。 由于它是位图字体,因此所有内容都是完美像素,渲染速度极快且 CPU 使用率低。为了能使用 `CTRL-WIN-[1-7]` 在每个终端按需切换字体,我的 `~/.Xdefaults` 包含: + +``` +URxvt.font: -xos4-terminus-medium-r-normal-*-14-*-*-*-*-*-*-* +dzen2.font: -xos4-terminus-medium-r-normal-*-14-*-*-*-*-*-*-* + +URxvt.keysym.C-M-1: command:\033]50;-xos4-terminus-medium-r-normal-*-12-*-*-*-*-*-*-*\007 +URxvt.keysym.C-M-2: command:\033]50;-xos4-terminus-medium-r-normal-*-14-*-*-*-*-*-*-*\007 +URxvt.keysym.C-M-3: command:\033]50;-xos4-terminus-medium-r-normal-*-18-*-*-*-*-*-*-*\007 +URxvt.keysym.C-M-4: command:\033]50;-xos4-terminus-medium-r-normal-*-22-*-*-*-*-*-*-*\007 +URxvt.keysym.C-M-5: command:\033]50;-xos4-terminus-medium-r-normal-*-24-*-*-*-*-*-*-*\007 +URxvt.keysym.C-M-6: command:\033]50;-xos4-terminus-medium-r-normal-*-28-*-*-*-*-*-*-*\007 +URxvt.keysym.C-M-7: command:\033]50;-xos4-terminus-medium-r-normal-*-32-*-*-*-*-*-*-*\007 + +URxvt.keysym.C-M-n: command:\033]10;#ffffff\007\033]11;#000000\007\033]12;#ffffff\007\033]706;#00ffff\007\033]707;#ffff00\007 +URxvt.keysym.C-M-b: command:\033]10;#000000\007\033]11;#ffffff\007\033]12;#000000\007\033]706;#0000ff\007\033]707;#ff0000\007 +``` + +对于编程和书写,我使用 [Vim][31] 语法高亮显示和 [ctags][32] 进行索引,以及一些带有 `grep` 、`sed` 和其他用于搜索和操作的常用终端窗口。这可能不像 IDE 那样舒适,但可以实现更多的自动化。 + +Vim 的一个问题是你已经习惯了它的键映射,因此希望在任何地方都使用它们。 + +在 shell 功能不够强大时,[Python][33] 和 [Nim][34] 作为脚本语言也不错。 + +### 系统监控 + +[htop][35] (查看当前站点的后台运行,是托管服务器的实时视图)非常适合快速了解软件的当前运行状态。 [lm_sensors][36] 可以监控硬件温度、风扇和电压。 [powertop][37] 是一款由 Intel 发布的优秀省电小工具。 [ncdu][38] 可以交互式分析磁盘使用情况。 + +[nmap][39]、 iptraf-ng、 [tcpdump][40] 和 [Wireshark][41] 都是分析网络问题的基本工具。 + +当然还有很多更优秀的工具。 + +### 邮件 & 同步 + +在我的家庭服务器上,我为自己所有的邮箱账号运行了 [fetchmail][42] 守护进程。fetchmail 只是检索收到的邮件并调用 [procmail][43]: + +``` +#!/bin/sh +for i in /home/deen/.fetchmail/*; do + FETCHMAILHOME=$i /usr/bin/fetchmail -m 'procmail -d %T' -d 60 +done +``` + +配置非常简单,然后等待服务器通知我们有新的邮件: + +``` +poll imap.1und1.de protocol imap timeout 120 user "dennis@felsin9.de" password "XXX" folders INBOX keep ssl idle +``` + +我的 `.procmailrc` 配置包含一些备份全部邮件的规则,并将邮件整理在对应的目录下面。例如,基于邮件列表名或者邮件标题: + +``` +MAILDIR=/home/deen/shared/Maildir +LOGFILE=$HOME/.procmaillog +LOGABSTRACT=no +VERBOSE=off +FORMAIL=/usr/bin/formail +NL=" +" + +:0wc +* ! ? test -d /media/mailarchive/`date +%Y` +| mkdir -p /media/mailarchive/`date +%Y` + +# Make backups of all mail received in format YYYY/YYYY-MM +:0c +/media/mailarchive/`date +%Y`/`date +%Y-%m` + +:0 +* ^From: .*(.*@.*.kit.edu|.*@.*.uka.de|.*@.*.uni-karlsruhe.de) +$MAILDIR/.uni/ + +:0 +* ^list-Id:.*lists.kit.edu +$MAILDIR/.uni-ml/ + +[...] +``` + +我使用 [msmtp][44] 来发送邮件,它也很好配置: + +``` +account default +host smtp.1und1.de +tls on +tls_trust_file /etc/ssl/certs/ca-certificates.crt +auth on +from dennis@felsin9.de +user dennis@felsin9.de +password XXX + +[...] +``` + +但是到目前为止,邮件还在服务器上。 我的文档全部存储在一个目录中,我使用 [Unison][45] 在所有计算机之间进行同步。Unison 可以视为双向交互式 [rsync][46],我的邮件是这个文件目录下的一部分,因此它们最终存储在我的电脑上。 + +这也意味着,尽管邮件会立即到达我的邮箱,但我只是按需拿取,而不是邮件一到达时就立即收到通知。 + +从此我使用 [mutt][47] 阅读邮件,使用侧边栏显示我的邮件目录。 `/etc/mailcap` 文件对于显示非纯文本邮件( HTML, Word 或者 PDF)不可或缺: + +``` +text/html;w3m -I %{charset} -T text/html; copiousoutput +application/msword; antiword %s; copiousoutput +application/pdf; pdftotext -layout /dev/stdin -; copiousoutput +``` + +### 新闻 & 通讯 + +[Newsboat][48] 是一个非常棒的终端 RSS/Atom 阅读器。我在一个有约 150 个提要的 `tach` 会话服务器上运行它。也可以在本地选择提要,例如: + +``` +ignore-article "https://forum.ddnet.tw/feed.php" "title =~ \"Map Testing •\" or title =~ \"Old maps •\" or title =~ \"Map Bugs •\" or title =~ \"Archive •\" or title =~ \"Waiting for mapper •\" or title =~ \"Other mods •\" or title =~ \"Fixes •\"" +``` + +我以同样的方式使用 [Irssi][49] 进行 IRC 通讯。 + +### 日历 + +[remind][50] 是一个可以从命令行获取的日历。通过编辑 `rem` 文件可以设置新的提醒: + +``` +# One time events +REM 2019-01-20 +90 Flight to China %b + +# Recurring Holidays +REM 1 May +90 Holiday "Tag der Arbeit" %b +REM [trigger(easterdate(year(today()))-2)] +90 Holiday "Karfreitag" %b + +# Time Change +REM Nov Sunday 1 --7 +90 Time Change (03:00 -> 02:00) %b +REM Apr Sunday 1 --7 +90 Time Change (02:00 -> 03:00) %b + +# Birthdays +FSET birthday(x) "'s " + ord(year(trigdate())-x) + " birthday is %b" +REM 16 Apr +90 MSG Andreas[birthday(1994)] + +# Sun +SET $LatDeg 49 +SET $LatMin 19 +SET $LatSec 49 +SET $LongDeg -8 +SET $LongMin -40 +SET $LongSec -24 + +MSG Sun from [sunrise(trigdate())] to [sunset(trigdate())] +[...] +``` + +遗憾的是,目前 remind 中还没有中国农历的提醒功能,因此中国的节日不易计算。 + +我给提醒设置了两个名字: + +``` +rem -m -b1 -q -g +``` + +按时间顺序查看待办事项清单 + +``` +rem -m -b1 -q -cuc12 -w$(($(tput cols)+1)) | sed -e "s/\f//g" | less +``` + +显示适应终端宽度的日历: + +![remcal][51] + +### 字典 + +[rdictcc][52] 是鲜为人知的字典工具,它可以使用 [dict.cc][53] 很棒的词典并将他们转存在本地数据库中: + +``` +$ rdictcc rasch +====================[ A => B ]==================== +rasch: + - apace + - brisk [speedy] + - cursory + - in a timely manner + - quick + - quickly + - rapid + - rapidly + - sharpish [Br.] [coll.] + - speedily + - speedy + - swift + - swiftly +rasch [gehen]: + - smartly [quickly] +Rasch {n} [Zittergras-Segge]: + - Alpine grass [Carex brizoides] + - quaking grass sedge [Carex brizoides] +Rasch {m} [regional] [Putzrasch]: + - scouring pad +====================[ B => A ]==================== +Rasch model: + - Rasch-Modell {n} +``` + +### 记录和阅读 + +我有一个简单记录任务的备忘录,在 Vim 会话中基本上一直处于打开状态。我也使用备忘录作为工作中“已完成”工作的记录,这样就可以检查自己每天完成了哪些任务。 + +对于写文件、信件和演示文稿,我会使用 [LaTeX][54] 进行高级排版。德式的简单信件可以这样设置,例如: + +``` +\documentclass[paper = a4, fromalign = right]{scrlttr2} +\usepackage{german} +\usepackage{eurosym} +\usepackage[utf8]{inputenc} +\setlength{\parskip}{6pt} +\setlength{\parindent}{0pt} + +\setkomavar{fromname}{Dennis Felsing} +\setkomavar{fromaddress}{Meine Str. 1\\69181 Leimen} +\setkomavar{subject}{Titel} + +\setkomavar*{enclseparator}{Anlagen} + +\makeatletter +\@setplength{refvpos}{89mm} +\makeatother + +\begin{document} +\begin{letter} {Herr Soundso\\Deine Str. 2\\69121 Heidelberg} +\opening{Sehr geehrter Herr Soundso,} + +Sie haben bei mir seit dem Bla Bla Bla. + +Ich fordere Sie hiermit zu Bla Bla Bla auf. + +\closing{Mit freundlichen Grüßen} + +\end{letter} +\end{document} +``` + +在 [我的私人网站][55] 上可以找到更多的示例文档和演示文稿。 + +[Zathura][56] 读取 PDF 文件速度很快,支持 Vim 类控件,还支持两种不同的 PDF 后端: Poppler 和 MuPDF。另一方面,在偶尔遇到 Zathura 无法打开的文件时,[Evince][57] 则显得更全能一些。 + +### 图片编辑 + +简便的选择是,[GIMP][58] 和 [Inkscape][59] 分别用于照片编辑和交互式向量图形。 + +有时 [Imagemagick][60] 已经足够好了,它可以从命令行直接使用,从而自动编辑图片。同样 [Graphviz][61] 和 [TikZ][62] 可以用来绘制曲线图和其他图表。 + +### Web 浏览器 + +对于 Web 浏览器,我一直在使用 [Firefox][63]。相较于 Chrome,它的可扩展性更好,资源使用率更低。 + +不幸的是,在 Firefox 完全改用 Chrome 风格的扩展之后, [Pentadactyl][64] 扩展的开发就停止了,所以我的浏览器中再也没有令人满意的 Vim 类控件了。 + +### 媒体播放器 + +通过设置 `vo=gpu` 以及 `hwdec=vaapi`,具有硬件解码功能的 [mpv][65] 在播放期间 CPU 的占用率保持在 5%。相较于默认的 PulseAudio,mpv 中的 `audio-channels=2` 似乎可以使我的立体扬声器/耳机获得更清晰的降级混频。一个很棒的小功能是用 `Shift-Q` 退出,而不是只用 `Q` 来保存回放位置。当你与母语是其他语言的人一起看视频时,你可以使用 `--secondary-sid=` 同时显示两种字幕,主字幕位于底部,次字幕位于屏幕顶部。 + +我的无线鼠标可以简单地通过一个小的配置文件( `~/.config/mpv/input.conf` )实现远程控制 mpv : + +``` +MOUSE_BTN5 run "mixer" "pcm" "-2" +MOUSE_BTN6 run "mixer" "pcm" "+2" +MOUSE_BTN1 cycle sub-visibility +MOUSE_BTN7 add chapter -1 +MOUSE_BTN8 add chapter 1 +``` + +[youtube-dl][66] 非常适合观看在线托管的视频,使用 `-f bestvideo+bestaudio/best --all-subs --embed-subs` 命令可获得最高质量的视频。 + +作为音乐播放器, [MOC][67] 不再活跃开发,但它仍是一个简易的播放器,可以播放各种可能的格式,包括最不常用的 Chiptune 格式。在 AUR 中有一个 [补丁][68] 增加了 PulseAudio 支持。即使在 CPU 时钟频率降到 800 MHz, MOC 也只使用了单核 CPU 的 1-2% 。 + +![moc][69] + +我的音乐收藏夹保存在我的家庭服务器上,因此我可以从任何地方访问它。它使用 [SSHFS][70] 挂载并自动安装在 `/etc/fstab/` 目录下: + +``` +root@server:/media/media /mnt/media fuse.sshfs noauto,x-systemd.automount,idmap=user,IdentityFile=/root/.ssh/id_rsa,allow_other,reconnect 0 0 +``` + +### 跨平台构建 + +除了 Linux 本身,它对于构建任何主流操作系统的软件包都很优秀! 一开始,我使用 [QEMU][71] 与旧版 Debian、 Windows 以及 Mac OS X VM 一起构建这些平台。 + +现在我在旧版 Debian 发行版上转而使用 chroot (以获得最大的 Linux 兼容性),在 Windows 上使用 [MinGW][72] 进行交叉编译,在 Mac OS X 上则使用 [OSXCross][73]。 + +用于 [构建 DDNet][74] 的脚本以及 [更新库构建的说明][75] 的脚本都基于这个。 + +### 备份 + +通常,我们都会忘记备份。即使这是最后一节,它也不应该成为事后诸葛。 + +十年前我写了 [rrb][76] (反向 rsync 备份)重新封装了 `rsync` ,因此我只需要将备份服务器的 root SSH 权限授予正在备份的计算机。令人惊讶地是,尽管我一直在使用 rrb ,但它在过去十年里没有任何改变。 + +备份文件直接存储在文件系统中。使用硬链接实现增量备份(`--link-dest`)。一个简单的 [配置][77] 定义了备份保存时间,默认为: + +``` +KEEP_RULES=( \ + 7 7 \ # One backup a day for the last 7 days + 31 8 \ # 8 more backups for the last month + 365 11 \ # 11 more backups for the last year +1825 4 \ # 4 more backups for the last 5 years +) +``` + +因为我的一些计算机没有静态 IP / DNS 但仍想使用 rrb 备份,那我会使用反向安全隧道(作为 systemd 服务): + +``` +[Unit] +Description=Reverse SSH Tunnel +After=network.target + +[Service] +ExecStart=/usr/bin/ssh -N -R 27276:localhost:22 -o "ExitOnForwardFailure yes" server +KillMode=process +Restart=always + +[Install] +WantedBy=multi-user.target +``` + +现在,隧道运行备份时,服务器可以通过 `ssh -p 27276 localhost` 命令或者使用 `.ssh/config` 到达服务器端。 + +``` +Host cr-remote + HostName localhost + Port 27276 +``` + +在谈及 SSH 技巧时,有时由于某些中断的路由会很难访问到服务器。在那种情况下你可以借道其他服务器的 SSH 连接,以获得更好的路由。在这种情况下,你可能通过美国连接访问到我的中国服务器,而来自德国的不可靠连接可能需要几个周: + +``` +Host chn.ddnet.tw + ProxyCommand ssh -q usa.ddnet.tw nc -q0 chn.ddnet.tw 22 + Port 22 +``` + +### 结语 + +感谢阅读我工具的收藏。这其中我也许遗漏了许多日常中自然成习惯的步骤。让我们来看看我的软件设置在下一年里能多稳定吧。如果你有任何问题,随时联系我 [dennis@felsin9.de][78] 。 + +在 [Hacker News][79] 下评论吧。 + +-------------------------------------------------------------------------------- + +via: https://hookrace.net/blog/linux-desktop-setup/ + +作者:[Dennis Felsing][a] +选题:[lujun9972][b] +译者:[chenmu-kk](https://github.com/chenmu-kk) +校对:[wxy](https://github.com/wxy) + +本文由 [LCTT](https://github.com/LCTT/TranslateProject) 原创编译,[Linux中国](https://linux.cn/) 荣誉推出 + +[a]: http://felsin9.de/nnis/ +[b]: https://github.com/lujun9972 +[1]: https://hookrace.net/public/linux-desktop/htop_small.png +[2]: https://hookrace.net/public/linux-desktop/htop.png +[3]: https://gentoo.org/ +[4]: https://www.archlinux.org/ +[5]: https://www.archlinux.org/news/ +[6]: https://www.reddit.com/r/archlinux/comments/4zrsc3/keep_your_system_fully_functional_after_a_kernel/ +[7]: https://www.suse.com/ +[8]: https://ddnet.tw/ +[9]: https://www.debian.org/ +[10]: https://www.openbsd.org/ +[11]: https://www.openbsd.org/faq/pf/ +[12]: http://openbox.org/wiki/Main_Page +[13]: http://fluxbox.org/ +[14]: https://dwm.suckless.org/ +[15]: https://awesomewm.org/ +[16]: https://xmonad.org/ +[17]: https://www.haskell.org/ +[18]: http://hackage.haskell.org/package/xmonad-contrib-0.15/docs/XMonad-Layout-LayoutScreens.html +[19]: http://robm.github.io/dzen/ +[20]: https://github.com/brndnmtthws/conky +[21]: https://hookrace.net/public/linux-desktop/laptop_small.png +[22]: https://hookrace.net/public/linux-desktop/laptop.png +[23]: https://i3wm.org/ +[24]: https://github.com/tmux/tmux/wiki +[25]: http://dtach.sourceforge.net/ +[26]: https://github.com/def-/tach/blob/master/tach +[27]: https://www.gnu.org/software/bash/ +[28]: http://www.zsh.org/ +[29]: http://software.schmorp.de/pkg/rxvt-unicode.html +[30]: http://terminus-font.sourceforge.net/ +[31]: https://www.vim.org/ +[32]: http://ctags.sourceforge.net/ +[33]: https://www.python.org/ +[34]: https://nim-lang.org/ +[35]: https://hisham.hm/htop/ +[36]: http://lm-sensors.org/ +[37]: https://01.org/powertop/ +[38]: https://dev.yorhel.nl/ncdu +[39]: https://nmap.org/ +[40]: https://www.tcpdump.org/ +[41]: https://www.wireshark.org/ +[42]: http://www.fetchmail.info/ +[43]: http://www.procmail.org/ +[44]: https://marlam.de/msmtp/ +[45]: https://www.cis.upenn.edu/~bcpierce/unison/ +[46]: https://rsync.samba.org/ +[47]: http://www.mutt.org/ +[48]: https://newsboat.org/ +[49]: https://irssi.org/ +[50]: https://www.roaringpenguin.com/products/remind +[51]: https://hookrace.net/public/linux-desktop/remcal.png +[52]: https://github.com/tsdh/rdictcc +[53]: https://www.dict.cc/ +[54]: https://www.latex-project.org/ +[55]: http://felsin9.de/nnis/research/ +[56]: https://pwmt.org/projects/zathura/ +[57]: https://wiki.gnome.org/Apps/Evince +[58]: https://www.gimp.org/ +[59]: https://inkscape.org/ +[60]: https://imagemagick.org/Usage/ +[61]: https://www.graphviz.org/ +[62]: https://sourceforge.net/projects/pgf/ +[63]: https://www.mozilla.org/en-US/firefox/new/ +[64]: https://github.com/5digits/dactyl +[65]: https://mpv.io/ +[66]: https://rg3.github.io/youtube-dl/ +[67]: http://moc.daper.net/ +[68]: https://aur.archlinux.org/packages/moc-pulse/ +[69]: https://hookrace.net/public/linux-desktop/moc.png +[70]: https://github.com/libfuse/sshfs +[71]: https://www.qemu.org/ +[72]: http://www.mingw.org/ +[73]: https://github.com/tpoechtrager/osxcross +[74]: https://github.com/ddnet/ddnet-scripts/blob/master/ddnet-release.sh +[75]: https://github.com/ddnet/ddnet-scripts/blob/master/ddnet-lib-update.sh +[76]: https://github.com/def-/rrb/blob/master/rrb +[77]: https://github.com/def-/rrb/blob/master/config.example +[78]: mailto:dennis@felsin9.de +[79]: https://news.ycombinator.com/item?id=18979731 diff --git a/published/202012/20190208 3 Ways to Install Deb Files on Ubuntu Linux.md b/published/202012/20190208 3 Ways to Install Deb Files on Ubuntu Linux.md new file mode 100644 index 0000000000..ad7e49ee81 --- /dev/null +++ b/published/202012/20190208 3 Ways to Install Deb Files on Ubuntu Linux.md @@ -0,0 +1,186 @@ +[#]: collector: (lujun9972) +[#]: translator: (robsean) +[#]: reviewer: (wxy) +[#]: publisher: (wxy) +[#]: url: (https://linux.cn/article-12956-1.html) +[#]: subject: (3 Ways to Install Deb Files on Ubuntu Linux) +[#]: via: (https://itsfoss.com/install-deb-files-ubuntu) +[#]: author: (Abhishek Prakash https://itsfoss.com/author/abhishek/) + +在 Ubuntu Linux 上安装 Deb 文件的 3 种方法 +====== + +> 这篇初学者文章解释了如何在 Ubuntu 中安装 deb 软件包。它稍后也向你展示如何移除这些 deb 软件包。 + +这是 Ubuntu 初学者系列的另一篇文章。如果你对 Ubuntu 很陌生,你可能会想知道 [如何安装应用程序][1]。 + +最简单的方法是使用 Ubuntu 软件中心。在软件中心中搜索应用程序的名称并安装它。如果你能在软件中心中找到所有的应用程序,那么生活就太惬意了。但是,不幸的是,这是不可能的发生的。 + +一些软件包可以通过 DEB 软件包的形式获得。它们是以 .deb 扩展名为结尾的存档文件。你可以把 .deb 文件看作为 Windows 中的 .exe 文件。在 Windows 中,你双击 .exe 文件,它将开始安装过程。DEB 软件包也是非常类似的。 + +你可以从软件提供商网站的下载区域找到这些 DEB 软件包。例如,如果你想 [在 Ubuntu 上安装 Google Chrome][2] ,你可以从它的网站下载 Chrome 的 DEB 软件包。 + +现在问题产生了,你将如何安装 deb 文件呢?在 Ubuntu 中有多种安装 DEB 软件包的方法。在这篇教程中,我将向你依次地展示它们。 + +![在 Ubuntu 中安装 deb 文件][3] + +### 在 Ubuntu 和基于 Debian 的 Linux 发行版中安装 .deb 文件 + +你可以选择一个 GUI 工具或一个命令行工具来安装一个 deb 软件包。你拥有选择权。 + +让我们继续看看如何安装 deb 文件。 + +#### 方法 1: 使用默认的软件中心 + +在 Ubuntu 中,最简单的方法是使用默认的软件中心。在这里你不必要做任何特别的事。只需要转到你所下载的 .deb 文件的文件夹下(它应该是 Downloads 文件夹),并在这个文件上双击。 + +![在 Ubuntu 上的 Google Chrome 的 deb 文件][4] + +在已下载的 .deb 文件上双击以开始安装。 + +它将打开软件中心,并且你将看到安装软件时的选项。你所需要做的全部工作就是:点击安装按钮并输入你的登录密码。 + +![在 Ubuntu 软件中心中安装 Google Chrome][5] + +.deb 文件的安装将通过软件中心来执行。 + +看,它甚至比在 Windows 中安装一个 .exe 文件更简单,不是吗? + +#### 方法 2: 使用 Gdebi 应用程序来安装 deb 软件包及其依赖项 + +再提一次,如果事情总是进展顺利,生活可能会更简单一些。但是生活并不是我们熟知的那样。 + +现在,你已经知道 .deb 文件可以简单地通过软件中心来安装,接下来,让我告诉你一些软件包可能会遇到的依赖项的错误。 + +发生错误的原因是,一个程序可能依赖于另外一个软件包(库)。当开发者为你准备 DEB 软件包时,他/她可能会假设你的系统中已经有了所依赖的软件包(库)。 + +但是如果情况并不是这样的,你的系统没有这些所需要的软件包(库),你将遇到臭名昭著的“依赖项错误”。 + +软件中心不能处理这样的错误,因此你不得不使用另外一个名称为 [gdebi][6] 的工具。 + +gdebi 是一个轻量级的 GUI 应用程序,它只有安装 deb 软件包的一个用途。 + +它将识别依赖项,并尝试在安装 .deb 文件的同时安装这些依赖项。 + +![gdebi 在安装 deb 软件包时处理依赖项][7] + +就我个人而言,我更喜欢使用 gdebi 而不是使用软件包中心来安装 deb 文件。它是一个轻量级应用程序,因此安装过程看起来更快一点。更多的信息,你可以阅读[使用 gDebi ,并使其成为安装 DEB 软件包的默认设置][6]。 + +你可以从软件中心或使用下面的命令来安装 gdebi : + +``` +sudo apt install gdebi +``` + +#### 方法 3: 在命令行中使用 dpkg 安装 .deb 文件 + +如果你想在命令行中安装 deb 软件包,你可以使用 `apt` 命令或者 `dpkg` 命令。实际上,`apt` 命令在底层上使用 [dpkg][9] 命令,但是 `apt` 却更流行和易于使用。 + +如果你想对 deb 文件使用 `apt` 命令,像这样使用它: + +``` +sudo apt install path_to_deb_file +``` + +如果你想对将要安装的 deb 软件包使用 `dpkg` 命令,在这里是如何完成它: + +``` +sudo dpkg -i path_to_deb_file +``` + +在这两个命令中,你应该使用你已下载的 deb 文件的路径和名称来替换 `path_to_deb_file` 。 + +![在 Ubuntu 中使用 dpkg 命令安装 deb 文件][10] + +如果你在安装 deb 软件包的过程中得到一个依赖项的错误,你可以使用下面的命令来修复依赖项的问题: + +``` +sudo apt install -f +``` + +### 如何移除 deb 软件包 + +移除一个 deb 软件包也不是一件什么大事。并且,你不需要用于安装程序的原始的 deb 文件。 + +#### 方法 1: 使用 apt 命令移除 deb 软件包 + +你所需要的全部东西就是你所已安装程序的名称,接下来你可以使用 `apt` 或 `dpkg` 来移除这个程序。 + +``` +sudo apt remove program_name +``` + +现在,问题来了,在移除命令中,你如何找到你所需要使用的准确的程序名称?为此,`apt` 命令也有一个解决方案。 + +你可以使用 `apt` 命令找到所有已安装文件的列表,但是手动完成这一过程将会是一件令人头疼的事。因此,你可以使用 `grep` 命令来搜索你的软件包。 + +例如,在先前的部分中,我已安装 AppGrid 应用程序,但是如果我想知道准确的程序名称,我可以像这样使用一些东西: + +``` +sudo apt list --installed | grep grid +``` + +这将给予我全部的名称中含有 “grid” 的软件包,从这里,我可以得到准确的程序名称。 + +``` +apt list --installed | grep grid +WARNING: apt does not have a stable CLI interface. Use with caution in scripts. +appgrid/now 0.298 all [installed,local] +``` + +正如你所看到的,一个名称为 “appgrid” 的软件包已经安装。现在,你可以在 `apt remove` 命令中使用这个程序名称。 + +#### 方法2: 使用 dpkg 命令移除 deb 软件包 + +你可以使用 `dpkg` 来找到已安装程序的名称: + +``` +dpkg -l | grep grid +``` + +该输出将给予所有的名称中有 “grid” 的软件包。 + +``` +dpkg -l | grep grid + +ii appgrid 0.298 all Discover and install apps for Ubuntu +``` + +在上面的命令输出中的 `ii` 意味着软件包已经被正确地安装。 + +现在,你有了程序名称,你可以使用 `dpkg` 命令来移除它: + +``` +dpkg -r program_name +``` + +**提示:更新 deb 软件包** + +一些 deb 软件包 (像 Chrome)通过系统更新来提供其更新,但是对于大多数的其它的程序,你将不得不先移除已存在的程序,并在接下来安装更新的版本。 + +我希望这篇初学者指南能够帮助你在 Ubuntu 上安装 deb 软件包。我添加了移除部分,以便你可以更好地控制你所安装的程序。 + +-------------------------------------------------------------------------------- + +via: https://itsfoss.com/install-deb-files-ubuntu + +作者:[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://itsfoss.com/remove-install-software-ubuntu/ +[2]: https://itsfoss.com/install-chrome-ubuntu/ +[3]: https://i2.wp.com/itsfoss.com/wp-content/uploads/2019/02/deb-packages-ubuntu.png?resize=800%2C450&ssl=1 +[4]: https://i1.wp.com/itsfoss.com/wp-content/uploads/2019/01/install-google-chrome-ubuntu-4.jpeg?resize=800%2C347&ssl=1 +[5]: https://i2.wp.com/itsfoss.com/wp-content/uploads/2019/01/install-google-chrome-ubuntu-5.jpeg?resize=800%2C516&ssl=1 +[6]: https://itsfoss.com/gdebi-default-ubuntu-software-center/ +[7]: https://i1.wp.com/itsfoss.com/wp-content/uploads/2019/01/gdebi-handling-dependency.jpg?ssl=1 +[8]: http://xmodulo.com +[9]: https://help.ubuntu.com/lts/serverguide/dpkg.html.en +[10]: https://i2.wp.com/itsfoss.com/wp-content/uploads/2019/02/install-deb-file-with-dpkg.png?ssl=1 +[11]: https://i2.wp.com/itsfoss.com/wp-content/uploads/2019/02/deb-packages-ubuntu.png?fit=800%2C450&ssl=1 diff --git a/published/202012/20190524 Dual booting Windows and Linux using UEFI.md b/published/202012/20190524 Dual booting Windows and Linux using UEFI.md new file mode 100644 index 0000000000..9c701f6487 --- /dev/null +++ b/published/202012/20190524 Dual booting Windows and Linux using UEFI.md @@ -0,0 +1,103 @@ +[#]: collector: (lujun9972) +[#]: translator: (robsean) +[#]: reviewer: (wxy) +[#]: publisher: (wxy) +[#]: url: (https://linux.cn/article-12891-1.html) +[#]: subject: (Dual booting Windows and Linux using UEFI) +[#]: via: (https://opensource.com/article/19/5/dual-booting-windows-linux-uefi) +[#]: author: (Alan Formy-Duval https://opensource.com/users/alanfdoss/users/ckrzen) + +使用 UEFI 双启动 Windows 和 Linux +====== + +> 这是一份在同一台机器上设置 Linux 和 Windows 双重启动的速成解释,使用统一可扩展固件接口(UEFI)。 + +![](https://img.linux.net.cn/data/attachment/album/202012/06/101431eb02wvkk0nzkk5sw.jpg) + +我将强调一些重要点,而不是一步一步地指导你来如何配置你的系统以实现双重启动。作为一个示例,我将提到我在几个月之前新买的笔记本计算机。我先是安装 [Ubuntu Linux][2] 到整个硬盘中,这就摧毁了预装的 [Windows 10][3] 环境。几个月后,我决定安装一个不同的 Linux 发行版 [Fedora Linux][4],也决定在双重启动配置中与它一起再次安装 Windows 10 。我将强调一些极其重要的实际情况。让我们开始吧! + +### 固件 + +双重启动不仅仅是软件问题。或者说它算是软件的问题,因为它需要更改你的固件,以告诉你的机器如何开始启动程序。这里有一些和固件相关的重要事项要铭记于心。 + +#### UEFI vs BIOS + +在尝试安装前,确保你的固件配置是最佳的。现在出售的大多数计算机有一个名为 [统一可扩展固件接口][5]Unified Extensible Firmware Interface (UEFI)的新类型固件,UEFI 差不多取代了另一个名为 [基本输入输出系统][6]Basic Input Output System(BIOS)的固件类型,(包括很多固件供应商在内的很多人)通常称 BIOS 为传统启动模式Legacy Boot。 + +我不需要 BIOS,所以我选择了 UEFI 模式。 + +#### 安全启动 + +另一个重要的设置是安全启动Secure Boot。这个功能将检测启动路径是否被篡改,并阻止未经批准的操作系统的启动。现在,我禁用这个选项来确保我能够安装 Fedora Linux 。依据 Fedora 项目维基“[功能/安全启动][7]”部分的介绍可知:Fedora Linux 在安全启动选项启用的时候也可以工作。这对其它的 Linux 发行版来说可能有所不同 — 我打算今后重新研究这项设置。 + +简而言之,如果你发现在这项设置启用时你不能安装你的 Linux 操作系统,那么禁用安全启动并再次重新尝试安装。 + +### 对启动驱动器进行分区 + +如果你选择双重启动并且两个操作系统都在同一个驱动器上,那么你必须将它分成多个分区。即使你使用两个不同的驱动器进行双重启动,出于各种各样的原因,大多数 Linux 环境也最好分成几个基本的分区。这里有一些选项值得考虑。 + +#### GPT vs MBR + +如果你决定手动分区你的启动驱动器,在动手前,我建议使用[GUID 分区表][8]GUID Partition Table(GPT),而不是使用旧的[主启动记录][9]Master Boot Record(MBR) 。这种更改的原因之一是:MBR 有两个特定的限制,而 GPT 却没有: + + * MBR 可以最多拥有 15 个分区,而 GPT 可以最多拥有 128 个分区。 + * MBR 最多仅支持 2 TB 磁盘,而 GPT 使用 64 位地址,这使得它最多支持 800 万 TB 的磁盘。 + +如果你最近购买过硬盘,那么你可能会知道现代的很多硬盘都超过了 2 TB 的限制。 + +#### EFI 系统分区 + +如果你正在进行一次全新的安装或使用一块新的驱动器,那么这里可能没有可以开始的分区。在这种情况下,操作系统安装程序将先创建一个分区,即[EFI 系统分区][10]EFI System Partition(ESP)。如果你选择使用一个诸如 [gdisk][11] 之类的工具来手动分区你的驱动器,你将需要使用一些参数来创建这个分区。基于现有的 ESP ,我设置它为约 500 MB 的大小,并分配它为 `ef00`( EFI 系统 )分区类型。UEFI 规范要求格式化为 FAT32/msdos ,很可能是因为这种格式被大量的操作系统所支持。 + +![分区][12] + +### 操作系统安装 + +在你完成先前的两个任务后,你就可以安装你的操作系统了。虽然我在这里关注的是 Windows 10 和 Fedora Linux ,当安装其它组合时的过程也是非常相似。 + +#### Windows 10 + +我开始 Windows 10 的安装,并创建了一个 20 GB 的 Windows 分区。因为我先前在我的笔记本计算机上安装了 Linux ,所以驱动器已经有了一个 ESP ,我选择保留它。我删除所有的现有 Linux 和交换分区来开始一次全新安装,然后开始我的 Windows 安装。Windows 安装程序自动创建另一个 16 MB 的小分区,称为 [微软保留分区][13]Microsoft Reserved Partition(MSR)。在这完成后,在 512 GB 启动驱动器上仍然有大约 400 GB 的未分配空间。 + +接下来,我继续完成了 Windows 10 安装过程。随后我重新启动到 Windows 来确保它是工作的,在操作系统第一次启动时,创建我的用户账号,设置 Wi-Fi ,并完成其它必须的任务。 + +#### Fedora Linux + +接下来,我将心思转移到安装 Linux 。我开始了安装过程,当安装进行到磁盘配置的步骤时,我确保不会更改 Windows NTFS 和 MSR 分区。我也不会更改 ESP ,但是我设置它的挂载点为 `/boot/efi`。然后我创建常用的 ext4 格式分区, `/`(根分区)、`/boot` 和 `/home`。我创建的最后一个分区是 Linux 的交换分区(swap)。 + +像安装 Windows 一样,我继续完成了 Linux 安装,随后重新启动。令我高兴的是,在启动时[大一统启动加载程序][14]GRand Unified Boot Loader(GRUB)菜单提供选择 Windows 或 Linux 的选项,这意味着我不需要再做任何额外的配置。我选择 Linux 并完成了诸如创建我的用户账号等常规步骤。 + +### 总结 + +总体而言,这个过程是不难的,在过去的几年里,从 BIOS 过渡到 UEFI 有一些困难需要解决,加上诸如安全启动等功能的引入。我相信我们现在已经克服了这些障碍,可以可靠地设置多重启动系统。 + +我不再怀念 [Linux LOader][15](LILO)! + +-------------------------------------------------------------------------------- + +via: https://opensource.com/article/19/5/dual-booting-windows-linux-uefi + +作者:[Alan Formy-Duval][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://opensource.com/users/alanfdoss/users/ckrzen +[b]: https://github.com/lujun9972 +[1]: https://opensource.com/sites/default/files/styles/image-full-size/public/lead-images/linux_keyboard_desktop.png?itok=I2nGw78_ (Linux keys on the keyboard for a desktop computer) +[2]: https://www.ubuntu.com +[3]: https://www.microsoft.com/en-us/windows +[4]: https://getfedora.org +[5]: https://en.wikipedia.org/wiki/Unified_Extensible_Firmware_Interface +[6]: https://en.wikipedia.org/wiki/BIOS +[7]: https://fedoraproject.org/wiki/Features/SecureBoot +[8]: https://en.wikipedia.org/wiki/GUID_Partition_Table +[9]: https://en.wikipedia.org/wiki/Master_boot_record +[10]: https://en.wikipedia.org/wiki/EFI_system_partition +[11]: https://sourceforge.net/projects/gptfdisk/ +[12]: /sites/default/files/u216961/gdisk_screenshot_s.png +[13]: https://en.wikipedia.org/wiki/Microsoft_Reserved_Partition +[14]: https://en.wikipedia.org/wiki/GNU_GRUB +[15]: https://en.wikipedia.org/wiki/LILO_(boot_loader) diff --git a/published/202012/20190612 When to use 5G, when to use Wi-Fi 6.md b/published/202012/20190612 When to use 5G, when to use Wi-Fi 6.md new file mode 100644 index 0000000000..0de2050060 --- /dev/null +++ b/published/202012/20190612 When to use 5G, when to use Wi-Fi 6.md @@ -0,0 +1,82 @@ +[#]: collector: (lujun9972) +[#]: translator: (chenmu-kk) +[#]: reviewer: (wxy) +[#]: publisher: (wxy) +[#]: url: (https://linux.cn/article-12914-1.html) +[#]: subject: (When to use 5G, when to use Wi-Fi 6) +[#]: via: (https://www.networkworld.com/article/3402316/when-to-use-5g-when-to-use-wi-fi-6.html) +[#]: author: (Lee Doyle ) + +何时使用 5G,何时使用 Wi-Fi 6 +====== + +> 5G 是一种蜂窝服务, Wi-Fi 6 则是短程无线接入技术,这两种技术都有使其在特定企业角色中发挥作用的特性。 + +![Thinkstock][1] + +我们已经看到了关于 [5G][2] 蜂窝还是 [Wi-Fi 6][3] 将在企业使用中胜出的大肆宣传,但事实却是这两者在很大程度上互补,这将在 21 世纪 20 年代初形成一个有趣的竞争环境。 + +### 5G 在企业中的潜力 + +5G 对企业用户的承诺是在更低的延迟下提供更高的连接速度。蜂窝技术使用许可频段,可在很大程度上消除未经许可的 WiFi 频段可能会发生的潜在干涉。像当前的 4G LTE 技术一样,5G 可以由蜂窝无线运营商提供,也可以作为专用网络构建。 + +5G 的架构需要更多的无线接入点,并且在室内可能会出现连接质量较差或没有连接。因此,典型的组织需要为连接它的 PC、路由器和其他设备评估其 [当前 4G 和潜在 5G 服务配置][4]。部署室内微蜂窝、中继器以及分布式天线可以帮助解决室内 5G 服务问题。与 4G 一样,5G 最佳的企业应用案例应该是用于真正的移动连接,例如,公共安全车和非地毯式覆盖区域(如采矿,石油与天然气开采、运输、农业和一些制造业)。 + +除了广泛的移动性,5G 在漫游时的身份验证和部署速度方面也具有优势,这正好满足临时办公室或零售点的广域网连接需求。5G 将会拥有在视频直播这样的数据拥塞的情况下分流的能力。随着 5G 标准的成熟,该技术将提高其低功耗 IoT 连接的选择。 + +未来四到五年内,5G 将从大城市和特定地区开始逐步推出;4G 技术将在未来数年内继续流行。企业用户将需要新的设备、加密狗和路由器来连接 5G 服务。例如,苹果的 iPhone 预计要到 2020 年才能支持 5G,而物联网设备需要特定的蜂窝网络兼容性才能连接到 5G。(LCTT 译注:原文发表于 2019 年中) + +Doyle Research 预计,5G 承诺的 1Gbps 和更高的带宽将对 SD-WAN 市场产生重大影响。4G LTE 已经使蜂窝服务成为主要的 WAN 连接。5G 可能比许多有线 WAN 选项(例如 MPLS 或互联网)更具成本竞争力或更便宜。5G 为企业 WAN 管理员提供了更多选择,为他们的分支站点和远程用户提供更多的带宽 —— 随着时间的推移,或将取代 MPLS。 + +### Wi-Fi 6 在企业中的潜力 + +Wi-Fi 几乎无处不在,它可以将便携式笔记本电脑、平板电脑和其他设备连接到企业网络中。Wi-Fi 6(802.11ax)是 Wi-Fi 的最新版本,并有望提高速度、降低延迟、改善聚合带宽并提供高级流量管理。虽然 Wi-Fi 6 与 5G 有一些相似之处(两者均基于正交频分多址),但 Wi-Fi 6 不太容易受到干扰,能耗更低(延长设备电池的寿命),并提高了频谱效率。 + +与典型的 Wi-Fi 相同,目前许多厂商都有 [Wi-Fi 6 早期厂商专用版本][6]。Wi-Fi 联盟计划在 2020 年获得 Wi-Fi 6 标准设备的认证。大多数企业将按照标准接入点access-point(AP)的生命周期(三年左右)升级到 Wi-Fi 6,除非他们有特定的性能/延迟要求,这将促使它们更快地升级。 + +Wi-Fi 接入点仍然会受到干涉的影响。设计和配置接入点以提供适当的覆盖范围将会是一项挑战。企业 LAN 管理者将继续需要供应商提供的工具和合作伙伴来为组织配置最理想的 Wi-Fi 覆盖。Wi-Fi 6 解决方案必须与有线区域基础建设集成。Wi-Fi 供应商需要更好地为企业提供无线和有线解决方案的统一网络管理。 + +### 有线回程的需求 + +对于这两种技术,通过无线与有线网络基础设施相结合,可以提供端到端的高速通信。在企业中,Wi-Fi 通常与区域和一些较大分支机构的有线以太网交换机搭配使用。一些设备通过电缆连接到交换机,其他设备则通过 Wi-Fi 连接,而笔记本电脑可能会同时采用这两种方法。Wi-Fi 接入点通过企业内部的以太网连接,并通过光纤连接连接到 WAN 或 Internet。 + +5G 的架构广泛使用光纤,将分布式无线接入网络连接回 5G 网络的核心。光纤通常需要提供将 5G 端点连接到基于 SaaS 的应用程序所需的高带宽,并提供实时视频和高速互联网访问。专用 5G 网络也必须满足高速有线连接要求。 + +### 切换问题 + +随着手机在 5G 和 Wi-Fi 6 之间切换,企业 IT 管理者要注意到切换挑战。这些问题会影响到性能和用户满意度。一些组织正在努力制定标准,以促进 Wi-Fi 6 和 5G 间更好的互操作性。 +由于 Wi-Fi 6 的架构与 5G 接轨,在蜂窝网络与 Wi-Fi 网络间移动的体验应该更加顺滑。 + +### 5G 和 Wi-Fi 6 的对比取决于位置、应用和设备 + +Wi-Fi 6 和 5G 在企业环境中的特定情况下相互竞争,这取决于位置、应用程序和设备类型。IT 管理者应该仔细评估他们当前和正在出现的连接性需求。Wi-Fi 将继续占领室内环境优势,而移动蜂窝网络将赢得更为广泛的室外覆盖。 + +一些重叠的情况发生在体育场馆、酒店和其他大型活动场所,许多用户将争夺带宽。政府应用(包括智能城市方面)可适用于 Wi-Fi 和蜂窝。医疗保健设施中有许多分布式医疗设备和需要连接的用户。大型分布式制造环境具有相似的特点。新兴的物联网应用环境可能是最有趣的“重叠使用案例”。 + +### 对于 IT 领导者的建议 + +虽然支持它们的无线技术正在融合,但 Wi-Fi 6 和 5G 从根本上来说是不同的网络,在企业连接中都有各自的作用。企业 IT 领导者应关注 Wi-Fi 和蜂窝网络如何相互补足,Wi-Fi 将继续作为内置技术,连接 PC 和笔记本电脑,处理手机和平板电脑数据,并实现一些物联网连接。 + +4G LTE 升级到 5G 后,仍将是手机和平板电脑连接的真正移动技术,也是 PC 连接的一种选择(通过加密狗),并在连接一些物联网设备方面越来越受欢迎。5G WAN 链路将日益成为标准,作为提高 SD-WAN 可靠性的备份和远程办公室的主要链路。 + +-------------------------------------------------------------------------------- + +via: https://www.networkworld.com/article/3402316/when-to-use-5g-when-to-use-wi-fi-6.html + +作者:[Lee Doyle][a] +选题:[lujun9972][b] +译者:[chenmu-kk](https://github.com/chenmu-kk) +校对:[wxy](https://github.com/wxy) + +本文由 [LCTT](https://github.com/LCTT/TranslateProject) 原创编译,[Linux中国](https://linux.cn/) 荣誉推出 + +[a]: https://www.networkworld.com/author/Lee-Doyle/ +[b]: https://github.com/lujun9972 +[1]: https://images.idgesg.net/images/article/2017/07/wi-fi_wireless_communication_network_abstract_thinkstock_610127984_1200x800-100730107-large.jpg +[2]: https://www.networkworld.com/article/3203489/what-is-5g-how-is-it-better-than-4g.html +[3]: https://www.networkworld.com/article/3215907/why-80211ax-is-the-next-big-thing-in-wi-fi.html +[4]: https://www.networkworld.com/article/3330603/5g-versus-4g-how-speed-latency-and-application-support-differ.html +[5]: https://pluralsight.pxf.io/c/321564/424552/7490?u=https%3A%2F%2Fwww.pluralsight.com%2Fcourses%2Fmobile-device-management-big-picture +[6]: https://www.networkworld.com/article/3309439/80211ax-preview-access-points-and-routers-that-support-the-wi-fi-6-protocol-on-tap.html +[7]: https://www.facebook.com/NetworkWorld/ +[8]: https://www.linkedin.com/company/network-world diff --git a/published/202012/20190617 How to Use VLAN tagged NIC (Ethernet Card) on CentOS and RHEL Servers.md b/published/202012/20190617 How to Use VLAN tagged NIC (Ethernet Card) on CentOS and RHEL Servers.md new file mode 100644 index 0000000000..2e1814d627 --- /dev/null +++ b/published/202012/20190617 How to Use VLAN tagged NIC (Ethernet Card) on CentOS and RHEL Servers.md @@ -0,0 +1,172 @@ +[#]: collector: (lujun9972) +[#]: translator: (quinbyjoe) +[#]: reviewer: (wxy) +[#]: publisher: (wxy) +[#]: url: (https://linux.cn/article-12927-1.html) +[#]: subject: (How to Use VLAN tagged NIC \(Ethernet Card\) on CentOS and RHEL Servers) +[#]: via: (https://www.linuxtechi.com/vlan-tagged-nic-ethernet-card-centos-rhel-servers/) +[#]: author: (Pradeep Kumar https://www.linuxtechi.com/author/pradeep/) + +如何在 CentOS/RHEL 系统中使用带 VLAN 标记的网卡 +====== + +在某些场景中,我们希望在 Linux 服务器(CentOS/RHEL)的同一块以太网卡(NIC)上分配来自不同 VLAN 的多个 IP。这个可以通过使用 VLAN 标记接口来实现。但是要做到这一点,我们必须确保交换机的端口上连接了多个 VLAN,也就是说我们可以在交换机上添加多个 VLAN 来配置聚合端口Trunk port(LCTT 译注:一般有聚合端口Trunk port接入端口Access port混合端口Hybird port三种)。 + +![](https://img.linux.net.cn/data/attachment/album/202012/17/123821uvv3oyonqnhn2bqq.jpg) + +假设我们有一个 Linux 服务器,我们在这里有两张以太网卡(`enp0s3` 和 `enp0s8`),第一张网卡(`enp0s3`)会用于数据传输,而第二张网卡(`enp0s8`) 会用于控制/流量管理。我会使用多个 VLAN 用于数据传输(或在数据流量网卡上从不同的 VLAN 中分配多个 IP)。 + +我假设连接到我服务器的数据网卡的端口,是通过映射多个 VLAN 来配置为聚合端口。 + +下面是映射到数据传输网卡(NIC)的 VLAN: + + * VLAN ID (200), VLAN N/W = 172.168.10.0/24 + * VLAN ID (300), VLAN N/W = 172.168.20.0/24 + +要在 CentOS 7 / RHEL 7 / CentOS 8 / RHEL 8 系统中使用 VLAN 标记接口,必须加载[内核模块][1] `8021q` 。 + +加载内核模块 `8021q` 可以使用下面的命令: + +``` +[root@linuxtechi ~]# lsmod | grep -i 8021q +[root@linuxtechi ~]# modprobe --first-time 8021q +[root@linuxtechi ~]# lsmod | grep -i 8021q +8021q 29022 0 +garp 14384 1 8021q +mrp 18542 1 8021q +[root@linuxtechi ~]# +``` + +可以使用 `modinfo` 命令显示内核模块 `8021q` 的详细信息: + +``` +[root@linuxtechi ~]# modinfo 8021q +filename: /lib/modules/3.10.0-327.el7.x86_64/kernel/net/8021q/8021q.ko +version: 1.8 +license: GPL +alias: rtnl-link-vlan +rhelversion: 7.2 +srcversion: 2E63BD725D9DC11C7DA6190 +depends: mrp,garp +intree: Y +vermagic: 3.10.0-327.el7.x86_64 SMP mod_unload modversions +signer: CentOS Linux kernel signing key +sig_key: 79:AD:88:6A:11:3C:A0:22:35:26:33:6C:0F:82:5B:8A:94:29:6A:B3 +sig_hashalgo: sha256 +[root@linuxtechi ~]# +``` + +现在使用 [ip 命令][2]给 `enp0s3` 网卡标记(或映射)上 `200` 和 `300` 的 VLAN 。 + +(LCTT 译注:这是先给 `enp0s3` 网卡映射上 `200` 的 VLAN 标签。) + +``` +[root@linuxtechi ~]# ip link add link enp0s3 name enp0s3.200 type vlan id 200 +``` + +使用下面的 `ip` 命令打开接口: + +``` +[root@linuxtechi ~]# ip link set dev enp0s3.200 up +``` + +同理给 `enp0s3` 网卡映射上 `300` 的 VLAN 标签: + +``` +[root@linuxtechi ~]# ip link add link enp0s3 name enp0s3.300 type vlan id 300 +[root@linuxtechi ~]# ip link set dev enp0s3.300 up +``` + +现在使用 `ip` 命令查看标记后的接口状态: + +![tagged-interface-ip-command][3] + +现在我们可以使用下面的 `ip` 命令从它们各自的 VLAN 为已经标记的接口分配 IP 地址: + +``` +[root@linuxtechi ~]# ip addr add 172.168.10.51/24 dev enp0s3.200 +[root@linuxtechi ~]# ip addr add 172.168.20.51/24 dev enp0s3.300 +``` + +使用下面的 `ip` 命令查看是否为已标记的接口分配到 IP: + +![ip-address-tagged-nic][5] + +重启之后,上面所有通过 `ip` 命令的更改都不会保持(LCTT 译注:修改后可保存至配置文件或数据库中,如果未进行保存处理,则只有当前环境生效,重启后配置失效)。系统重启和网络服务重启(LCTT 译注:`service network restart`,或 `down` 和 `up` 命令)之后这些标记接口将不可用。 + +因此,要使标记的接口在重启后保持不变,需要使用接口的 `ifcfg` 文件。 + +编辑接口(`enp0s3`)文件 `/etc/sysconfig/network-scripts/ifcfg-enp0s3`,并且增加下面的内容: + +**作者提醒**:替换为你环境中的接口名称。 + +``` +[root@linuxtechi ~]# vi /etc/sysconfig/network-scripts/ifcfg-enp0s3 +TYPE=Ethernet +DEVICE=enp0s3 +BOOTPROTO=none +ONBOOT=yes +``` + +保存和退出文件。 + +为 id 是 `200` 的 VLAN 创建接口文件 `/etc/sysconfig/network-scripts/ifcfg-enp0s3.200`,且增加下面的内容: + +``` +[root@linuxtechi ~]# vi /etc/sysconfig/network-scripts/ifcfg-enp0s3.200 +DEVICE=enp0s3.200 +BOOTPROTO=none +ONBOOT=yes +IPADDR=172.168.10.51 +PREFIX=24 +NETWORK=172.168.10.0 +VLAN=yes +``` + +保存并退出此文件。 + +同理为 id 是 `300` 的 VLAN 创建接口文件 `/etc/sysconfig/network-scripts/ifcfg-enp0s3.300`,且增加下面的内容: + +``` +[root@linuxtechi ~]# vi /etc/sysconfig/network-scripts/ifcfg-enp0s3.300 +DEVICE=enp0s3.300 +BOOTPROTO=none +ONBOOT=yes +IPADDR=172.168.20.51 +PREFIX=24 +NETWORK=172.168.20.0 +VLAN=yes +``` + +保存并退出文件,这时候使用下面的命令重启网络服务, + +``` +[root@linuxtechi ~]# systemctl restart network +``` + +现在使用下面的 `ip` 命令检验标记的接口是否已配置和启动,并且正在运行中: + +![tagged-interface-status-ip-command-linux-server][6] + +以上就是本文的全部内容,我希望你已经学会了在 CentOS 7 / 8 和 RHEL 7 / 8 服务器上如何去配置和启用 VLAN 标签接口的方法。请分享你的反馈和意见。 + +-------------------------------------------------------------------------------- + +via: https://www.linuxtechi.com/vlan-tagged-nic-ethernet-card-centos-rhel-servers/ + +作者:[Pradeep Kumar][a] +选题:[lujun9972][b] +译者:[quinbyjoe](https://github.com/quinbyjoe) +校对:[wxy](https://github.com/wxy) + +本文由 [LCTT](https://github.com/LCTT/TranslateProject) 原创编译,[Linux中国](https://linux.cn/) 荣誉推出 + +[a]: https://www.linuxtechi.com/author/pradeep/ +[b]: https://github.com/lujun9972 +[1]: https://www.linuxtechi.com/how-to-manage-kernel-modules-in-linux/ +[2]: https://www.linuxtechi.com/ip-command-examples-for-linux-users/ +[3]: https://www.linuxtechi.com/wp-content/uploads/2019/06/tagged-interface-ip-command-1024x444.jpg +[4]: https://www.linuxtechi.com/wp-content/uploads/2019/06/tagged-interface-ip-command.jpg +[5]: https://www.linuxtechi.com/wp-content/uploads/2019/06/ip-address-tagged-nic-1024x343.jpg +[6]: https://www.linuxtechi.com/wp-content/uploads/2019/06/tagged-interface-status-ip-command-linux-server-1024x656.jpg +[7]: https://www.linuxtechi.com/wp-content/uploads/2019/06/VLAN-Tagged-NIC-Linux-Server.jpg \ No newline at end of file diff --git a/published/202012/20191118 Creating a Chat Bot with Recast.AI.md b/published/202012/20191118 Creating a Chat Bot with Recast.AI.md new file mode 100644 index 0000000000..e878ea1bc2 --- /dev/null +++ b/published/202012/20191118 Creating a Chat Bot with Recast.AI.md @@ -0,0 +1,164 @@ +[#]: collector: (lujun9972) +[#]: translator: (alim0x) +[#]: reviewer: (wxy) +[#]: publisher: (wxy) +[#]: url: (https://linux.cn/article-12878-1.html) +[#]: subject: (Creating a Chat Bot with Recast.AI) +[#]: via: (https://opensourceforu.com/2019/11/creating-a-chat-bot-with-recast-ai/) +[#]: author: (Athira Lekshmi C.V https://opensourceforu.com/author/athira-lekshmi/) + +用 Recast.AI 创建一个聊天机器人 +====== + +[![][1]][2] + +> 据 Gartner 2018 年 2 月的报告,“到 2020 年,25% 的客户服务和支持业务将在参与渠道中整合虚拟客户助理(VCA)或聊天机器人技术,而 2017 年只有不到 2%。”鉴于此,读者会发现本教程对理解开源的 Recast.AI 机器人创建平台的工作原理很有帮助。 + +聊天机器人,包括基于语音的以及其他技术的,已经实际使用了有一阵子了。从让用户参与谋杀解密游戏,到帮助完成房地产交易和医疗诊断,聊天机器人已经跨越了多个领域。 + +有许多平台可以让用户创建和部署机器人。Recast.AI(在被 SAP 收购之后现在是 SAP Conversational AI)是其中的先行者。 + +酷炫的界面、协作性以及它所提供的分析工具,让它成为流行的选择。 + +正如 Recast 官方网站说的,“它是一个创建、训练、部署和监控智能机器人的终极协作平台。” + +### 创建一个基础的机器人 + +让我们来看看如何在 Recast 创建一个基础的机器人。 + + 1. 在 https://cai.tools.sap 创建一个账户。注册可以使用电子邮箱或者 Github 账户。 + 2. 在你登录之后,你会进入仪表板。点击右上角 “+” 新建机器人图标新建一个机器人。 + 3. 在下一个界面,你会看到一系列可选的预定义技能。暂时选择问候Greetings”(图 1)。这个机器人已经经过训练,能够理解基本的问候。 + ![图 1: 设置机器人属性][3] + 4. 给机器人提供一个名字。目前来说,你可以让机器人讲一些笑话,所以我们将它命名为 Joke Bot,选择英语作为默认语言。 + 5. 因为你不会处理任何敏感信息,所以在数据策略下选择非个人数据。然后选择公共机器人选项并点击创建一个机器人。 + +所以这就是你在 Recast 平台创建的机器人。 + +### 开发一个机器人的五个阶段 + +用 Recast 官方博客的话说,在机器人的生命中有五个阶段。 + + * 训练——教授机器人需要理解的内容 + * 构建——使用机器人构建工具创建你的对话流 + * 编写代码——将机器人连接到外部 API 或数据库 + * 连接——将机器人发布到一个或多个消息平台 + * 监控——训练机器人让它更敏锐,并且了解其使用情况 + +### 通过意图训练机器人 + +你可以在仪表板上看到搜索、分叉或创建一个意图intent的选项。“‘意图’是一系列含义相同但构造不同的表达。‘意图’是你的机器人理解能力的核心。每个‘意图’代表了机器人可以理解的一种想法。”(摘自 Recast.AI 网站) + +![图 2: 机器人面板][4] + +就像先前定的,你需要一个讲笑话的机器人。所以底线是这个机器人可以理解用户在要求它讲笑话,它不应该在用户仅仅说了“Hi”的情况下回复一个笑话——这可不妙。把用户可能说的话进行分组,比如: + +``` +Tell me a joke.(给我讲个笑话。) +Tell me a funny fact.(告诉我一个有趣的事实。) +Can you crack a joke?(你可以讲个笑话吗?) +What’s funny today?(今天有什么有趣的?) +``` +…… + +在继续从头开始创建意图之前,让我们来看看搜索/分叉选项。在搜索框输入 “Joke”(图 3)。系统给出了全球的 Recast 用户创建的公开的意图清单,这就是为什么说 Recast 天然就是协作性质的。所以其实没有必要从头开始创建所有的意图,可以在已经创建的基础上进行构建。这就降低了训练具有常见意图的机器人所需的投入。 + +![图 3: 搜索一个意图][5] + + * 选择列表中的第一个意图并将其分叉到机器人上。 + * 点击分叉Fork按钮。这个意图就添加到了机器人中(图 4)。 + ![图 4: @joke 意图][6] + * 点击意图 @joke,会显示出这个意图中已经存在的表达expression列表(图 5)。 + ![图 5: 预定义表达][7] + * 向其添加更多的表达(图 6)。 + ![图 6: 建议的表达][8] + +添加了一些表达之后,机器人会给出一些建议,像图 7 展示的那样。选择几个将它们添加到意图中。你还可以根据机器人的上下文,标记你自己的自定义实体来检测关键词。 + +![图 7: 建议的表达][9] + +### 技能 + +技能skill是一块有明确目的的对话,机器人可以据此运行并达到目标。它可以像打招呼那么简单,也可以更复杂,比如基于用户提供的信息提供电影建议。 + +技能需要的不能只是一对问答,它需要多次交互。比如考虑一个帮你学习汇率的机器人。它一开始会问原货币,然后是目标货币,最后给出准确回应。结合技能可以创建复杂的对话流。 + +下面是如何给笑话机器人创建技能: + + * 去到 构建(Build) 页。点击 “+” 图标创建技能。 + * 给技能命名 “Joke”(图 8) + ![图 8: 技能面板][10] + * 创建之后,点击这个技能。你会看到四个标签。读我Read me触发器Triggers需求Requirements动作Actions。 + * 切换到需求页面。只有在笑话意图存在的时候,你才应该存储信息。所以,像图 9 那样添加一个需求。 + ![图 9: 添加一个触发器][11] + +由于这个简单的使用范例,你不需要在需求选项卡中考虑任何特定的需求,但可以考虑只有当某些关键字或实体出现时才需要触发响应的情况——在这种情况下你需要需求。 + +需求是某个技能执行动作之前需要检索的意图或实体。需求是对话中机器人可以使用的重要信息。例如用户的姓名或位置。一旦一个需求完成,相关的值就会存储在机器人的内存中,供整个对话使用。 + +现在让我们转到动作页面设置回应response(参见图 10)。 + +![图 10: 添加动作][12] + +点击添加新消息组new message group。然后选择发送消息Send message并添加一条文本消息,在这个例子中可以是任何笑话。当然,你肯定不想让你的机器人每次都说一样的笑话,你可以添加多条消息,每次从中随机选择一条。 + +![图 11: 添加文本消息][13] + +### 频道集成 + +一个成功的机器人还依赖于它的易得性。Recast 有不少的内置消息频道集成,如 Skype for Business、Kik Messenger、Telegram、Line、Facebook Messenger、Slack、Alexa 等等。除此之外,Recast 还提供了 SDK 用于开发自定义的频道。 + +此外,Recast 还提供一个可立即使用的网页聊天(在连接页面中)。你可以自定义颜色主题、标题、机器人头像等。它给你提供了一个可以添加到页面的脚本标签。你的界面现在就可以使用了(图 12)。 + +![图 12: 设置网络聊天][14] + +网页聊天的代码是开源的,开发者可以更方便地定制外观、标准回应类型等等。面板提供了如何将机器人部署到各种频道的逐步过程说明。这个笑话机器人部署在 Telegram 和网页聊天上,就像图 13 展示的那样。 + +![图 13: 网页聊天部署][15] + +![图 14: Telegram 中开发的机器人][16] + +### 还有更多 + +Recast 支持多语言,创建机器人的时候选择一个语言作为基础,但之后你有选项可以添加更多你想要的语言。 + +![图 15: 多语言机器人][17] + +这里的例子是一个简单的静态笑话机器人,实际使用中可能需要更多的和不同系统的交互。Recast 有 Web 钩子功能,用户可以连接到不同的系统来获取回应。同时它还有详细的 API 文档来帮助使用平台的每个独立功能。 + +至于分析,Recast 有一个监控面板,帮助你了解机器人的准确度以及更加深入地训练机器人。 + +-------------------------------------------------------------------------------- + +via: https://opensourceforu.com/2019/11/creating-a-chat-bot-with-recast-ai/ + +作者:[Athira Lekshmi C.V][a] +选题:[lujun9972][b] +译者:[alim0x](https://github.com/alim0x) +校对:[wxy](https://github.com/wxy) + +本文由 [LCTT](https://github.com/LCTT/TranslateProject) 原创编译,[Linux中国](https://linux.cn/) 荣誉推出 + +[a]: https://opensourceforu.com/author/athira-lekshmi/ +[b]: https://github.com/lujun9972 +[1]: https://i0.wp.com/opensourceforu.com/wp-content/uploads/2019/04/Build-ChatBoat.jpg?resize=696%2C442&ssl=1 (Build ChatBoat) +[2]: https://i0.wp.com/opensourceforu.com/wp-content/uploads/2019/04/Build-ChatBoat.jpg?fit=900%2C572&ssl=1 +[3]: https://i1.wp.com/opensourceforu.com/wp-content/uploads/2019/11/Figure-1-Setting-the-bot-properties.jpg +[4]: https://i1.wp.com/opensourceforu.com/wp-content/uploads/2019/11/Figure-2-Setting-the-bot-properties.jpg +[5]: https://i0.wp.com/opensourceforu.com/wp-content/uploads/2019/11/Figure-3-Searching-an-intent.jpg +[6]: https://i0.wp.com/opensourceforu.com/wp-content/uploads/2019/11/Figure-4-@joke-intent.jpg +[7]: https://i0.wp.com/opensourceforu.com/wp-content/uploads/2019/11/Figure-5-Predefined-expressions.jpg +[8]: https://i2.wp.com/opensourceforu.com/wp-content/uploads/2019/11/Figure-6-Suggested-expressions.jpg +[9]: https://i1.wp.com/opensourceforu.com/wp-content/uploads/2019/11/Figure-7-Suggested-expressions.jpg +[10]: https://i0.wp.com/opensourceforu.com/wp-content/uploads/2019/11/Figure-8-Skills-dashboard.jpg +[11]: https://i0.wp.com/opensourceforu.com/wp-content/uploads/2019/11/Figure-9-Adding-a-trigger.jpg +[12]: https://i0.wp.com/opensourceforu.com/wp-content/uploads/2019/11/Figure-10-Adding-actions.jpg +[13]: https://i1.wp.com/opensourceforu.com/wp-content/uploads/2019/11/Figure-11-Adding-text-messages.jpg +[14]: https://i2.wp.com/opensourceforu.com/wp-content/uploads/2019/11/Figure-12-Setting-up-webchat.jpg +[15]: https://i0.wp.com/opensourceforu.com/wp-content/uploads/2019/11/Figure-13-Webchat-deployed.jpg +[16]: https://i2.wp.com/opensourceforu.com/wp-content/uploads/2019/11/Figure-14-Bot-deployed-in-Telegram.jpg +[17]: https://i1.wp.com/opensourceforu.com/wp-content/uploads/2019/11/Figure-15-Multi-language-bot.jpg +[18]: https://secure.gravatar.com/avatar/d24503a2a0bb8bd9eefe502587d67323?s=100&r=g +[19]: https://opensourceforu.com/author/athira-lekshmi/ +[20]: https://opensourceforu.com/wp-content/uploads/2019/11/assoc.png +[21]: https://feedburner.google.com/fb/a/mailverify?uri=LinuxForYou&loc=en_US diff --git a/published/202012/20200421 How I use Python to map the global spread of COVID-19.md b/published/202012/20200421 How I use Python to map the global spread of COVID-19.md new file mode 100644 index 0000000000..ef37e77c5a --- /dev/null +++ b/published/202012/20200421 How I use Python to map the global spread of COVID-19.md @@ -0,0 +1,158 @@ +[#]: collector: (lujun9972) +[#]: translator: (zxp93) +[#]: reviewer: (wxy) +[#]: publisher: (wxy) +[#]: url: (https://linux.cn/article-12935-1.html) +[#]: subject: (How I use Python to map the global spread of COVID-19) +[#]: via: (https://opensource.com/article/20/4/python-map-covid-19) +[#]: author: (AnuragGupta https://opensource.com/users/999anuraggupta) + +如何使用 Python 绘制 COVID-19 的全球扩散图 +====== + +> 使用这些开源框架创建一个彩色地图,显示病毒的可能的传播路径。 + +![](https://img.linux.net.cn/data/attachment/album/202012/20/005146t8voetski8ocm5c2.jpg) + +对于一个全球旅行司空见惯的世界来说,疾病的传播是一个真正令人担忧的问题。一些组织会跟踪重大的流行病(还有所有普遍的流行病),并将他们的跟踪工作获得的数据公开出来。不过,这些原始的数据对人来说可能很难处理,这就是为什么数据科学如此重要的原因。比如,用 Python 和 Pandas 可视化 COVID-19 在全球范围内的传播路径可能对这些数据的分析有所帮助。 + +最开始,当面对如此大数量的原始数据时可能难以下手。但当你开始处理数据之后,慢慢地就会发现一些处理数据的方式。下面是用于处理 COVID-19 数据的一些常见的情况: + + 1. 从 GitHub 上下载 COVID-19 的国家每日传播数据,保存为一个 Pandas 中的 DataFrame 对象。这时你需要使用 Python 中的 Pandas 库。 + 2. 处理并清理下载好的数据,使其满足可视化数据的输入格式。所下载的数据的情况很好(数据规整)。这个数据有一个问题是它用国家的名字来标识国家,但最好是使用三位数的 ISO 3 码(国家代码表)来标识国家。为了生成 ISO 3 码,可是使用 `pycountry` 这个 Python 库。生成了这些代码之后,可以在原有的 DataFrame 上增加一列,然后用这些代码填充进去。 + 3. 最后为了实现可视化,使用 Plotly 库中的 `express` 模块。这篇文章是使用名为choropleth 的地图(可在 Plotly 库中获得)来可视化该疾病在全球的传播。 + +### 第一步:Corona 数据 + +从下面这个网站上下载最新的 corona 数据(LCTT 译注:2020-12-14 仍可访问,有墙): + + - + +我们之间将这个下载好的数据载入为 Pandas 的 DataFrame。Pandas 提供了一个函数, `read_csv()`,可以直接使用 URL 读取数据,并返回一个 DataFrame 对象,具体如下所示: + +``` +import pycountry +import plotly.express as px +import pandas as pd +URL_DATASET = r'https://raw.githubusercontent.com/datasets/covid-19/master/data/countries-aggregated.csv' +df1 = pd.read_csv(URL_DATASET) +print(df1.head(3))  # Get first 3 entries in the dataframe +print(df1.tail(3))  # Get last 3 entries in the dataframe +``` + +在 Jupyter 上的输出截图: + +![Jupyter screenshot][2] + +从这个输出可以看到这个 DataFrame(`df1`)包括以下几列数据: + + 1. `Date` + 2. `Country` + 3. `Confirmed` + 4. `Recovered` + 5. `Dead` + +之后还可以看到 `Date` 这一列包含了从 1 月 22 日到 3 月 31 日的条目信息。这个数据是每天更新的,所以你会得到你当天的值。 + +### 第二步:清理和修改 DataFrame + +我们要往这个 DataFrame 中增加一列数据,就是那个包含了 ISO 3 编码。可以通过以下三步完成这个任务: + + 1. 创建一个包含所有国家的列表。因为在 `df1` 的 `Country` 列中,国家都是每个日期就重复一次。所以实际上 `Country` 列中对每个国家就会有多个条目。我使用 `unique().tolist()` 函数完成这个任务。 + 2. 我使用 `d_country_code` 字典对象(初始为空),然后将其键设置为国家的名称,然后它的值设置为其对应的 ISO 3 编码。 + 3. 我使用 `pycountry.countries.search_fuzzy(country)` 为每个国家生成 ISO 3 编码。你需要明白的是这个函数的返回值是一个 `Country` 对象的列表。我将这个函数的返回值赋给 `country_data` 对象。以这个对象的第一个元素(序号 `0`)为例。这个 `\` 对象有一个 `alpha_3` 属性。所以我使用 `country_data[0].alpha_3` 就能“获得”第一个元素的 ISO 3 编码。然而,在这个 DataFrame 中有些国家的名称可能没有对应的 ISO 3 编码(比如有争议的领土)。那么对这些“国家/地区”,我就用一个空白字符串来替代 ISO 3 编码。你也可以用一个 `try-except` 代码来替换这部分。`except` 中的语句可以写:`print(‘could not add ISO 3 code for ->', country)`。这样就能在找不到这些“国家/地区”对应的 ISO 3 编码时给出一个输出提示。实际上,你会发现这些“国家/地区”会在最后的输出中用白色来表示。 + 4. 在获得了每个国家的 ISO 3 编码(有些是空白字符串)之后,我把这些国家的名称(作为键)还有国家对应的 ISO 3 编码(作为值)添加到之前的字典 `d_country_code` 中。可以使用 Python 中字典对象的 `update()` 方法来完成这个任务。 + 5. 在创建好了一个包含国家名称和对应 ISO 3 编码的字典之后,我使用一个简单的循环将他们加入到 DataFrame 中。 + +### 第三步:使用 Plotly 可视化传播路径 + +choropleth 地图是一个由彩色多边形组成的地图。它常常用来表示一个变量在空间中的变化。我们使用 Plotly 中的 `px` 模块来创建 choropleth 图,具体函数为:`px.choropleth`。 + +这个函数的所包含的参数如下: + +``` +plotly.express.choropleth(data_frame=None, lat=None, lon=None, locations=None, locationmode=None, geojson=None, featureidkey=None, color=None, hover_name=None, hover_data=None, custom_data=None, animation_frame=None, animation_group=None, category_orders={}, labels={}, color_discrete_sequence=None, color_discrete_map={}, color_continuous_scale=None, range_color=None, color_continuous_midpoint=None, projection=None, scope=None, center=None, title=None, template=None, width=None, height=None) +``` + +`choropleth()` 这个函数还有几点需要注意: + + 1. `geojson` 是一个 `geometry` 对象(上面函数第六个参数)。这个对象有点让人困扰,因为在函数文档中没有明确地提到这个对象。你可以提供,也可以不提供 `geojson` 对象。如果你提供了 `geojson` 对象,那么这个对象就会被用来绘制地球特征,如果不提供 `geojson` 对象,那这个函数默认就会使用一个内建的 `geometry` 对象。(在我们的实验中,我们使用内建的 `geometry` 对象,因此我们不会为 `geojson` 参数提供值) + 2. DataFrame 对象有一个 `data_frame` 属性,在这里我们先前就提供了一个我们创建好的`df1`。 + 3. 我们用 `Confirmed`(确诊数)来决定每个国家多边形的颜色。 + 4. 最后,我们 `Date` 列创建一个 `animation_frame`。这样我们就能通过日期来划分数据,国家的颜色会随着 `Confirmed` 的变化而变化。 + +最后完整的代码如下: + +``` +import pycountry +import plotly.express as px +import pandas as pd +# ----------- Step 1 ------------ +URL_DATASET = r'https://raw.githubusercontent.com/datasets/covid-19/master/data/countries-aggregated.csv' +df1 = pd.read_csv(URL_DATASET) +# print(df1.head) # Uncomment to see what the dataframe is like +# ----------- Step 2 ------------ +list_countries = df1['Country'].unique().tolist() +# print(list_countries) # Uncomment to see list of countries +d_country_code = {} # To hold the country names and their ISO +for country in list_countries: + try: + country_data = pycountry.countries.search_fuzzy(country) + # country_data is a list of objects of class pycountry.db.Country + # The first item ie at index 0 of list is best fit + # object of class Country have an alpha_3 attribute + country_code = country_data[0].alpha_3 + d_country_code.update({country: country_code}) + except: + print('could not add ISO 3 code for ->', country) + # If could not find country, make ISO code ' ' + d_country_code.update({country: ' '}) + +# print(d_country_code) # Uncomment to check dictionary + +# create a new column iso_alpha in the df +# and fill it with appropriate iso 3 code +for k, v in d_country_code.items(): + df1.loc[(df1.Country == k), 'iso_alpha'] = v + +# print(df1.head) # Uncomment to confirm that ISO codes added +# ----------- Step 3 ------------ +fig = px.choropleth(data_frame = df1, + locations= "iso_alpha", + color= "Confirmed", # value in column 'Confirmed' determines color + hover_name= "Country", + color_continuous_scale= 'RdYlGn', # color scale red, yellow green + animation_frame= "Date") + +fig.show() +``` + +这段代码的输出就是下面这个图的内容: + +![Map][3] + +你可以从这里下载并运行[完整代码][4]。 + +最后,这里还有一些关于 Plotly 绘制 choropleth 图的不错的资源。 + + * + * + +-------------------------------------------------------------------------------- + +via: https://opensource.com/article/20/4/python-map-covid-19 + +作者:[AnuragGupta][a] +选题:[lujun9972][b] +译者:[zhangxiangping](https://github.com/zxp93) +校对:[wxy](https://github.com/wxy) + +本文由 [LCTT](https://github.com/LCTT/TranslateProject) 原创编译,[Linux中国](https://linux.cn/) 荣誉推出 + +[a]: https://opensource.com/users/999anuraggupta +[b]: https://github.com/lujun9972 +[1]: https://opensource.com/sites/default/files/styles/image-full-size/public/lead-images/cloud-globe.png?itok=_drXt4Tn (Globe up in the clouds) +[2]: https://opensource.com/sites/default/files/uploads/jupyter_screenshot.png (Jupyter screenshot) +[3]: https://opensource.com/sites/default/files/uploads/map_2.png (Map) +[4]: https://github.com/ag999git/jupyter_notebooks/blob/master/corona_spread_visualization +[5]: tmp.azs72dmHFd#choropleth diff --git a/published/202012/20200711 scanimage- scan from the command line.md b/published/202012/20200711 scanimage- scan from the command line.md new file mode 100644 index 0000000000..75aac2dae6 --- /dev/null +++ b/published/202012/20200711 scanimage- scan from the command line.md @@ -0,0 +1,78 @@ +[#]: collector: (lujun9972) +[#]: translator: (geekpi) +[#]: reviewer: (wxy) +[#]: publisher: (wxy) +[#]: url: (https://linux.cn/article-12886-1.html) +[#]: subject: (scanimage: scan from the command line!) +[#]: via: (https://jvns.ca/blog/2020/07/11/scanimage--scan-from-the-command-line/) +[#]: author: (Julia Evans https://jvns.ca/) + +scanimage:从命令行扫描! +====== + +![](https://img.linux.net.cn/data/attachment/album/202012/05/105822m30t6x66hz3hx6x3.jpg) + +这又是一篇关于我很喜欢的一个命令行工具的文章。 + +昨晚,出于官僚原因,我需要扫描一些文档。我以前从来没有在 Linux 上使用过扫描仪,我担心会花上好几个小时才弄明白。我从使用 `gscan2pdf` 开始,但在用户界面上遇到了麻烦。我想同时扫描两面(我知道我们的扫描仪支持),但无法使它工作。 + +### 遇到 scanimage! + +`scanimage` 是一个命令行工具,在 `sane-utils` Debian 软件包中。我想所有的 Linux 扫描工具都使用 `sane` (“scanner access now easy”) 库,所以我猜测它和其他扫描软件有类似的能力。在这里,我不需要 OCR,所以我不打算谈论 OCR。 + +### 用 scanimage -L 得到你的扫描仪的名字 + +`scanimage -L` 列出了你所有的扫描设备。 + +一开始我不能让它工作,我有点沮丧,但事实证明,我把扫描仪连接到了我的电脑上,但没有插上电源。 + +插上后,它马上就能工作了。显然我们的扫描仪叫 `fujitsu:ScanSnap S1500:2314`。万岁! + +### 用 --help 列出你的扫描仪选项 + +显然每个扫描仪有不同的选项(有道理!),所以我运行这个命令来获取我的扫描仪的选项: + +``` +scanimage --help -d 'fujitsu:ScanSnap S1500:2314' +``` + +我发现我的扫描仪支持 `--source` 选项(我可以用它来启用双面扫描)和 `--resolution` 选项(我把它改为 150,以减少文件大小,使扫描更快)。 + +### scanimage 不支持输出 PDF 文件(但你可以写一个小脚本) + +唯一的缺点是:我想要一个 PDF 格式的扫描文件,而 scanimage 似乎不支持 PDF 输出。 + +所以我写了这个 5 行的 shell 脚本在一个临时文件夹中扫描一堆 PNG 文件,并将结果保存到 PDF 中。 + +``` +#!/bin/bash +set -e + +DIR=`mktemp -d` +CUR=$PWD +cd $DIR +scanimage -b --format png -d 'fujitsu:ScanSnap S1500:2314' --source 'ADF Front' --resolution 150 +convert *.png $CUR/$1 +``` + +我像这样运行脚本:`scan-single-sided output-file-to-save.pdf` + +你可能需要为你的扫描仪设置不同的 `-d` 和 `-source`。 + +### 这真是太简单了! + +我一直以为在 Linux 上使用打印机/扫描仪是一个噩梦,我真的很惊讶 `scanimage` 可以工作。我可以直接运行我的脚本 `scan-single-sided receipts.pdf`,它将扫描文档并将其保存到 `receipts.pdf`! + +-------------------------------------------------------------------------------- + +via: https://jvns.ca/blog/2020/07/11/scanimage--scan-from-the-command-line/ + +作者:[Julia Evans][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://jvns.ca/ +[b]: https://github.com/lujun9972 diff --git a/published/202012/20200928 Add sound to your Python game.md b/published/202012/20200928 Add sound to your Python game.md new file mode 100644 index 0000000000..5d898e07cb --- /dev/null +++ b/published/202012/20200928 Add sound to your Python game.md @@ -0,0 +1,156 @@ +[#]: collector: (lujun9972) +[#]: translator: (robsean) +[#]: reviewer: (wxy) +[#]: publisher: (wxy) +[#]: url: (https://linux.cn/article-12877-1.html) +[#]: subject: (Add sound to your Python game) +[#]: via: (https://opensource.com/article/20/9/add-sound-python-game) +[#]: author: (Seth Kenlon https://opensource.com/users/seth) + +添加声音到你的 Python 游戏 +====== + +> 通过添加声音到你的游戏中,听听当你的英雄战斗、跳跃、收集战利品时会发生什么。学习如何在这个 Pygame 系列的第十三篇文章中,创建一个声音平台类精灵。 + +![](https://img.linux.net.cn/data/attachment/album/202012/02/092244du74f14837zmo7fz.jpg) + +在 [Python 3][2] 中使用 [Pygame][3] 模块来创建电脑游戏的系列文章仍在进行中,这是第十三部分。先前的文章是: + + 1. [通过构建一个简单的掷骰子游戏去学习怎么用 Python 编程][4] + 2. [使用 Python 和 Pygame 模块构建一个游戏框架][5] + 3. [如何在你的 Python 游戏中添加一个玩家][6] + 4. [用 Pygame 使你的游戏角色移动起来][7] + 5. [如何向你的 Python 游戏中添加一个敌人][8] + 6. [在 Pygame 游戏中放置平台][9] + 7. [在你的 Python 游戏中模拟引力][10] + 8. [为你的 Python 平台类游戏添加跳跃功能][11] + 9. [使你的 Python 游戏玩家能够向前和向后跑][12] + 10. [在你的 Python 平台类游戏中放一些奖励][13] + 11. [添加计分到你的 Python 游戏][14] + 12. [在你的 Python 游戏中加入投掷机制][15] + +Pygame 提供了一种简单的方法来集成声音到你的 Python 电脑游戏中。Pygame 的 [mixer 模块][16] 可以依据命令播放一个或多个声音,并且你也可以将这些声音混合在一起,例如,你能够在听到你的英雄收集奖励或跳过敌人声音的同时播放背景音乐。 + +集成 `mixer` 模块到一个已存在的游戏中是很容易的,因此,与其给你代码示例来向你展示放置它们的位置,不如在这篇文章解释在你的应用程序中获得声音所需的四个步骤。 + +### 启动 mixer + +首先,在你代码的设置部分,启动 `mixer` 进程。你的代码已经启动 Pygame 和 Pygame 字体,因此将它们归类到一起是一个很好的主意: + +``` +pygame.init() +pygame.font.init() +pygame.mixer.init() # add this line +``` + +### 定义声音 + +接下来,你必需定义你想要使用的声音。这样就要求你的计算机上有声音文件,就像使用字体就要求你有字体文件,使用图像就要求你有图像文件一样。 + +你还必需把这些声音与你的游戏捆绑在一起,以便任何玩你游戏的人都有这些声音文件。 + +为将一个声音与你的游戏捆绑在一起,首先在你的游戏目录中创建一个新的目录,就像你为你图像和字体创建的目录一样。称它为 `sound`: + +``` +s = 'sound' +``` + +尽管在互联网上有很多声音文件,下载这些声音文件并将其与你的游戏一起分发并不一定是合法的。这看起来是很奇怪的,因为这么多来自著名电脑游戏的声音是流行文化的一部分,但法律就是这样运作的。如果你想与你的游戏一起分发一个声音文件,你必需找到一个开源或[共创许可][17]的声音文件,它们准许与游戏一起提供声音。 + +这里有一些专门提供自由和合法的声音文件的网站,包括: + + * [Freesound][18] 托管存储所有种类的音效。 + * [Incompetech][19] 托管存储背景音乐。 + * [Open Game Art][20] 托管存储一些音效和音乐。 + +一些声音文件只要你给予作曲家或声音设计师一个致谢就可以自由使用。在与你的游戏捆绑前,仔细阅读使用条件!音乐家和声音设计师在声音上的工作就像你在代码上的工作一样努力,因此即使他们不要求,给予他们致谢也是极好的。 + +给予你的声音源文件一些致谢,在一个名为 `CREDIT` 的文本文件中列出你使用的声音,并在你的游戏文件夹中放置该文本文件。 + +你也可以尝试制作你自己的音乐。优秀的 [LMMS][21] 音频工作站易于使用,并带有很多有趣的声音。它在所有主要的平台上都可以使用,也可以导出为 [Ogg Vorbis][22](OGG)音频格式。 + +### 添加声音到 Pygame + +当你找到你喜欢的一个声音文件时,下载它。如果它是一个 ZIP 或 TAR 文件,提取它并将其移动到你游戏目录中的 `sound` 文件夹中。 + +如果声音文件的名字带有空格或特殊字符,重新命名它。文件名称是完全随意的,它的名称越简单,你就越容易输入到你的代码中。 + +大多数的电脑游戏使用 OGG 格式声音文件,因为这种格式可以占有较小空间而提供高质量的声音。当你下载一个声音文件时,它可能是一个 MP3、WAVE、FLAC 或者其它的音频格式。为保持你的文件的较高兼容性和降低下载文件大小,使用一个像 [fre:ac][23] 或 [Miro][24] 这样的工具来转换这些的文件格式为 Ogg 格式。 + +例如,假设你已经下载一个称为 `ouch.ogg` 的声音文件。 + +在你代码的设置部分中,创建一个变量,代表你想使用的声音文件: + +``` +ouch = pygame.mixer.Sound(os.path.join(s, 'ouch.ogg')) +``` + +### 触发一个声音 + +为使用一个声音,你所要做的就是在你想触发它的时候调用这个变量。例如,当你的玩家击中一名敌人时,触发 `OUCH` 声音效果: + +``` +for enemy in enemy_hit_list: + pygame.mixer.Sound.play(ouch) + score -= 1 +``` + +你可以为各种动作创建声音,例如,跳跃、收集奖励、投掷、碰撞,以及其他任何你能想象到的动作。 + +### 添加背景音乐 + +如果你有想在你的游戏的背景中播放的音乐或令人激动的音效,你可以使用 Pygame 中的 `mixer` 模块中的 `music` 函数。在你的设置部分中,加载音乐文件: + +``` +music = pygame.mixer.music.load(os.path.join(s, 'music.ogg')) +``` + +然后,开始音乐: + +``` +pygame.mixer.music.play(-1) +``` + +`-1` 值告诉 Pygame 无限循环音乐文件。你可以将其设置为从 0 到更高的值之间的任意数值,以定义音乐在停止前循环多少次。 + +### 享受音效 + +音乐和声音可以为你的游戏添加很多韵味。尝试添加一些声音到你的 Pygame 工程! + +-------------------------------------------------------------------------------- + +via: https://opensource.com/article/20/9/add-sound-python-game + +作者:[Seth Kenlon][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://opensource.com/users/seth +[b]: https://github.com/lujun9972 +[1]: https://opensource.com/sites/default/files/styles/image-full-size/public/lead-images/colorful_sound_wave.png?itok=jlUJG0bM (Colorful sound wave graph) +[2]: https://www.python.org/ +[3]: https://www.pygame.org/news +[4]: https://linux.cn/article-9071-1.html +[5]: https://linux.cn/article-10850-1.html +[6]: https://linux.cn/article-10858-1.html +[7]: https://linux.cn/article-10874-1.html +[8]: https://linux.cn/article-10883-1.html +[9]: https://linux.cn/article-10902-1.html +[10]: https://linux.cn/article-11780-1.html +[11]: https://linux.cn/article-11790-1.html +[12]: https://linux.cn/article-11819-1.html +[13]: https://linux.cn/article-11828-1.html +[14]: https://linux.cn/article-11839-1.html +[15]: https://linux.cn/article-12872-1.html +[16]: https://www.pygame.org/docs/ref/mixer.html +[17]: https://opensource.com/article/20/1/what-creative-commons +[18]: https://freesound.org +[19]: https://incompetech.filmmusic.io +[20]: https://opengameart.org +[21]: https://opensource.com/life/16/2/linux-multimedia-studio +[22]: https://en.wikipedia.org/wiki/Vorbis +[23]: https://www.freac.org/index.php/en/downloads-mainmenu-330 +[24]: http://getmiro.com diff --git a/published/202012/20201005 How the Linux kernel handles interrupts.md b/published/202012/20201005 How the Linux kernel handles interrupts.md new file mode 100644 index 0000000000..2abfe041e5 --- /dev/null +++ b/published/202012/20201005 How the Linux kernel handles interrupts.md @@ -0,0 +1,111 @@ +[#]: collector: (lujun9972) +[#]: translator: (mengxinayan) +[#]: reviewer: (wxy) +[#]: publisher: (wxy) +[#]: url: (https://linux.cn/article-12965-1.html) +[#]: subject: (How the Linux kernel handles interrupts) +[#]: via: (https://opensource.com/article/20/10/linux-kernel-interrupts) +[#]: author: (Stephan Avenwedde https://opensource.com/users/hansic99) + +Linux 内核如何处理中断 +====== + +> 中断是计算机处理数据的关键部分。 + +![](https://img.linux.net.cn/data/attachment/album/202012/29/063805o5taf82ftgz85e22.jpg) + +中断是现代 CPU 工作方式中重要的部分。例如:当你每次在键盘上按下一个按键后,CPU 会被中断以使得 PC 读取用户键盘的输入。这个过程发生得相当快,以致于在使用体验上你不会感到任何变化或损害。 + +此外,键盘并不是导致中断的唯一组件。一般来说,有三种类型的事件会导致 CPU 发生中断:硬件中断、软件中断和异常。在具体介绍不同类型的中断前,我需要先定义一些术语。 + +### 定义 + +中断请求interrupt request(IRQ)是由可编程的中断控制器programmable interrupt controlle(PIC)发起的,其目的是为了中断 CPU 和执行中断服务程序interrupt service routine(ISR)。中断服务程序(ISR)是一个小的程序,用来处理具体的数据,其具体的处理方式依赖于造成中断请求(IRQ)的原因。之前正在运行的进程在中断服务程序(ISR)运行结束前都会被中断。 + +在过去,中断请求由单独的芯片处理(中断控制器芯片 PIC),I/O 设备直接与中断控制器(PIC)相连。中断控制器(PIC)管理着多种硬件的中断请求(IRQ),并且可以直接与 CPU 通信。当一个中断请求(IRQ)产生后,中断控制器(PIC)向 CPU 写入数据,并且触发中断请求引脚(INTR)。 + +现如今,中断请求(IRQ)由 CPU 中的高级可编程中断控制器advanced programmable interrupt controller(APIC)部分来处理。每个核中都拥有属于自己的高级可编程中断控制器。 + +### 中断的类型 + +正如我前文中提到的,中断可以根据其来源分为三种类型。 + +#### 硬件中断 + +当一个硬件设备想要告诉 CPU 某一需要处理的数据已经准备好后(例如:当键盘被按下或者一个数据包到了网络接口处),它将会发送一个中断请求(IRQ)来告诉 CPU 数据是可用的。接下来会调用在内核启动时设备驱动注册的对应的中断服务程序(ISR)。 + +#### 软件中断 + +当你在播放一个视频时,音频和视频是同步播放是相当重要的,这样音乐的速度才不会变化。这是由软件中断实现的,由精确的计时器系统(称为 [jiffies][2])重复发起的。这个计时器会使得你的音乐播放器同步。软件中断也可以被特殊的指令所调用,来读取或写入数据到硬件设备。 + +当系统需要实时性时(例如在工业应用中),软件中断会变得重要。你可以在 Linux 基金会的文章中找到更多相关信息:[面向嵌入式开发者的实时 Linux 介绍][3]。 + +#### 异常 + +异常exception是你可能之前就知道的中断类型。当 CPU 执行一些将会导致除零或缺页错误的指令时,任何其他运行中的程序都会被中断。在这种情况下,你会被一个弹窗提醒,或在控制台输出中看到**段错误segmentation fault核心已转储core dumped)**。但并不是所有异常都是由指令错误引起的。 + +异常可以进一步分为错误Fault陷阱Trap终止Abort。 + + * **错误**:错误是系统可以纠正的异常。例如当一个进程尝试访问某个已经被换出到硬盘的页时。当请求的地址在进程的地址空间中,并且满足访问权限时,如果页不在内存(RAM)中,将会产生一个中断请求(IRQ),并开始启用**缺页异常处理程序**把所需的页加载到内存中。如果操作成功执行,程序将继续运行。 + * **陷阱**:陷阱主要用在调试中。如果你在某个程序中设置了一个断点,你就插入了一条可以触发陷阱执行的特殊指令。陷阱可以触发上下文切换来允许你的调试器读取和展示局部变量的值。之后程序可以继续运行。陷阱同样也是运行系统调用的方式(如杀死一个进程) + * **终止**:终止是由系统表中的硬件错误或值不一致而导致的。终止不会报告造成异常的指令的所在位置。这是最严重的中断,终止将会调用系统的**终止异常处理程序**来结束造成异常的进程。 + +### 动手实践 + +中断请求按照高级可编程中断控制器(APIC)中的优先级高低排序(0是最高优先级)。前 32 个中断(0~31)是由 CPU 指定的固定序列。你可以在 [OsDev 异常][4] 页面找到关于它们的概述。随后的中断请求可以以不同的方式进行分配。中断描述表interrupt descriptor table(IDT)中记录了中断请求(IRQ)和中断服务程序(ISR)的对应关系。Linux 中定义了从 0 到 256 的 IRQ 向量。 + +为了打印出在你的系统中已注册的中断,打开一个终端并输入: + +``` +cat /proc/interrupts +``` + +你应该会看到类似如下图的结果: + +![注册的中断列表][5] + +*内核版本为5.6.6中注册的中断 (Stephan Avenwedde, [CC BY-SA 4.0][6])* + +从左到右各列的含义依次为:中断向量号、每个 CPU(0~n)中断发生次数、硬件来源、硬件源通道信息、以及造成中断请求的设备名。 + +在表的末尾,有一些非数字的中断。它们是特定于体系结构的中断,如本地计时器中断local timer interrupt(LOC)的中断请求(IRQ)号为 236。其中一些在 Linux 内核源树中的[Linux IRQ 向量布局][7]中指定。 + +![特定于体系结构的中断][8] + +*特定于体系结构的中断 (Stephan Avenwedde, [CC BY-SA 4.0][6])* + +如果要实时获取该表,请运行如下命令: + +``` +watch -n1 "cat /proc/interrupts" +``` + +### 总结 + +正确的中断请求(IRQ)处理对于硬件、驱动和软件的正常交互是必要的。幸运地是,Linux 内核很好地完成了它,一个 PC 的普通用户几乎不会注意到内核的整个中断处理过程。 + +中断相当复杂,本文仅仅是一个关于中断的概述。如果想要深入了解该主题可以阅读 [Linux Inside 电子书][9](CC BY-NC-SA 4.0)和 [Linux 内核教程][10] 仓库。 + +-------------------------------------------------------------------------------- + +via: https://opensource.com/article/20/10/linux-kernel-interrupts + +作者:[Stephan Avenwedde][a] +选题:[lujun9972][b] +译者:[萌新阿岩](https://github.com/mengxinayan) +校对:[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/car-penguin-drive-linux-yellow.png?itok=twWGlYAc (Penguin driving a car with a yellow background) +[2]: https://elinux.org/Kernel_Timer_Systems +[3]: https://www.linuxfoundation.org/blog/2013/03/intro-to-real-time-linux-for-embedded-developers/ +[4]: https://wiki.osdev.org/Exceptions +[5]: https://opensource.com/sites/default/files/uploads/proc_interrupts_1.png (Registered interrupts list) +[6]: https://creativecommons.org/licenses/by-sa/4.0/ +[7]: https://github.com/torvalds/linux/blob/master/arch/x86/include/asm/irq_vectors.h +[8]: https://opensource.com/sites/default/files/uploads/proc_interrupts_2.png (Architecture-specific interrupts) +[9]: https://0xax.gitbooks.io/linux-insides/content/Interrupts/ +[10]: https://linux-kernel-labs.github.io/refs/heads/master/lectures/interrupts.html# diff --git a/published/202012/20201022 How to influence people to join open source.md b/published/202012/20201022 How to influence people to join open source.md new file mode 100644 index 0000000000..2de7e12310 --- /dev/null +++ b/published/202012/20201022 How to influence people to join open source.md @@ -0,0 +1,90 @@ +[#]: collector: (lujun9972) +[#]: translator: (mengxinayan) +[#]: reviewer: (wxy) +[#]: publisher: (wxy) +[#]: url: (https://linux.cn/article-12926-1.html) +[#]: subject: (How to influence people to join open source) +[#]: via: (https://opensource.com/article/20/10/influence-open-source) +[#]: author: (Joshua Pearce https://opensource.com/users/jmpearce) + +如何感召人们让其参与到开源活动中 +====== + +> 向他人介绍开源最有效的办法是,告诉他们开源可以提供给他们想要的。 + +![建筑物中的管道][1] + +如果你在浏览这里,可能你会编程,而且或许你正使用某些难以捉摸的 [Linux 发行版][2]的开源浏览器上阅读这些内容。你也许很多年没有看到过浏览器广告了,因为你正运行着一个[开源的广告拦截器][3]。当你想到企鹅时,你感到温暖而又陌生。 + +简单地说,你知道开源的力量,并且它已经成了你生活的一部分。不幸的是,并不是每个人都发现了如何利用开源的方式。他们的电脑慢得令人痛苦,当他们上网浏览时他们看到的广告比内容都多,他们把钱花在专利和版权的垃圾上。这些人中可能有些是与你有关系的,例如你的侄女和侄子。 + +### 知识就是财富 + +那么你如何向你的侄女和侄子(以及任意一个人)介绍开源? + +我尝试着回答这个问题,作为一个教授,一个以长篇大论著称的职业,我最终还是出了一本书:[《使用开源项目创造、分享和省钱》][4],由 McGraw-Hill 出版。 + +我认为诀窍在于先发现你的侄女或侄子想要获取但没有钱去购买的东西,然后向他们展示如何通过开源知识来得到他们想要的东西。 + +![可升降的桌子][5] + +*[可升降的桌子][6] (Joni Steiner and Nick Ierodiaconou, [CC-BY-SA-NC][7])* + +知识是所有商品里独特的财富。不像黄金或小麦,它不仅在分享时会保留价值,而且可以迅速增值。因为互联网信息分享成本趋近于零,因此无限地扩展了此过程。每个可以访问互联网的人都史无前例地拥有这一财富。例如,我提供[免费的仓库链接][4]到关于书籍、教育、电影、攻略、地图、音乐、照片、艺术品、软件和烹饪等内容。 + +### 不要买,而是去制作它 + +免费和开源逐渐扩展到现实世界,我们现在有机会从根本上降低通过沃尔玛或亚马逊购买的东西的成本,包括[玩具][8]、[电器][9]、[家居用品][10]和衣服。使用 3D 打印或类似的工具,结合开源分享和数字制造,使得每个人可以制造属于他们自己的复杂的、有用的工具。 + +![3D 打印的家居用品][11] + +*[3D 打印的家居用品][12] (Joshua M. Pearce, [CC BY-SA 3.0][13])* + +前些年,科学家已经[在他们的实验室][14]中做这些工作了。但是现在,任何人都可以轻松地定制满足他们具体需求的产品。已经有数百万个免费的设计可供使用。 + +![Recyclebot][15] + +*[Recyclebot][16] (Joshua M. Pearce, [GPLv3][17])* + +真正降低一个产品的价格,就要[通过垃圾来获取其原材料][18]。伴随着小规模的回收利用过程(例如我实验室正在使用的 [Recyclebots][19])最近得到了改进,这使得人们可以从废物中制造有用的产品,因此产生了一系列让人眼花缭乱的产品。最重要的是,任何人都可以利用专有系统的一小部分成本来获取到这些定制的绿色产品。我们生产出相比常规商品的销售税更低的[定制产品][20]——它们具有相同的功能,更好的定制形式,而且几乎没有成本。 + +### 了解更多 + +在[《使用开源项目创建、分享和省钱的项目》][4]一书中,我分享了在家庭制造和回收利用的潜力,以及如何利用开源来为大宗商品评分,如房屋、电力。你可以在我和 Megan Krieger 以及 Janet Callahan 三人为密歇根理工学院的 [Husky Bites][21] 录制的网络研讨会了解更多。 + +希望这些知识能足够激励你把一到两个侄女或侄子带到开源的路上来! + +-------------------------------------------------------------------------------- + +via: https://opensource.com/article/20/10/influence-open-source + +作者:[Joshua Pearce][a] +选题:[lujun9972][b] +译者:[萌新阿岩](https://github.com/mengxinayan) +校对:[wxy](https://github.com/wxy) + +本文由 [LCTT](https://github.com/LCTT/TranslateProject) 原创编译,[Linux中国](https://linux.cn/) 荣誉推出 + +[a]: https://opensource.com/users/jmpearce +[b]: https://github.com/lujun9972 +[1]: https://opensource.com/sites/default/files/styles/image-full-size/public/lead-images/open_pipe_red_hat_tower_building.png?itok=8ho3yi7L (pipe in a building) +[2]: https://distrowatch.com/ +[3]: https://opensource.com/article/20/4/ad-blockers +[4]: https://www.appropedia.org/Create,_Share,_and_Save_Money_Using_Open-Source_Projects +[5]: https://opensource.com/sites/default/files/uploads/opendesk_furniture_lift-standing-desk.jpg (Lift Standing Desk) +[6]: https://www.appropedia.org/File:Opendesk_furniture_lift-standing-desk.jpg +[7]: https://creativecommons.org/licenses/by-nc-sa/2.0/ +[8]: http://www.mdpi.com/2227-7080/5/3/45 +[9]: https://doi.org/10.3390/inventions3030064 +[10]: https://www.mdpi.com/2227-7080/5/1/7 +[11]: https://opensource.com/sites/default/files/uploads/3dprinted_household.jpg (3D printed household items) +[12]: https://www.appropedia.org/File:3dprinted_household.JPG +[13]: https://creativecommons.org/licenses/by-sa/3.0/ +[14]: https://opensource.com/article/20/10/open-source-hardware-savings +[15]: https://opensource.com/sites/default/files/uploads/recyclebotrep.png (Recyclebot) +[16]: https://www.appropedia.org/File:Recyclebotrep.png +[17]: https://www.gnu.org/licenses/gpl-3.0.html +[18]: https://www.academia.edu/34738483/Tightening_the_Loop_on_the_Circular_Economy_Coupled_Distributed_Recycling_and_Manufacturing_with_Recyclebot_and_RepRap_3-D_Printing +[19]: https://www.appropedia.org/Recyclebot +[20]: https://opensource.com/article/17/3/how-to-create-consumer-goods-open-hardware +[21]: https://www.facebook.com/Michigan-Tech-College-of-Engineering-109353424030003/videos/husky-bites-presents-special-guest-joshua-m-pearce/2669023713361207/ diff --git a/published/202012/20201026 7 Git tricks that changed my life.md b/published/202012/20201026 7 Git tricks that changed my life.md new file mode 100644 index 0000000000..e1bfdbfa84 --- /dev/null +++ b/published/202012/20201026 7 Git tricks that changed my life.md @@ -0,0 +1,189 @@ +[#]: collector: (lujun9972) +[#]: translator: (wxy) +[#]: reviewer: (wxy) +[#]: publisher: (wxy) +[#]: url: (https://linux.cn/article-12894-1.html) +[#]: subject: (7 Git tricks that changed my life) +[#]: via: (https://opensource.com/article/20/10/advanced-git-tips) +[#]: author: (Rajeev Bera https://opensource.com/users/acompiler) + +改变我使用 Git 工作方式的七个技巧 +====== + +> 这些有用的技巧将改变你使用这个流行的版本控制系统的工作方式。 + +![](https://img.linux.net.cn/data/attachment/album/202012/07/092803d67fa7bttuuj98fb.jpg) + +Git 是目前最常见的版本控制系统之一,无论是私有系统还是公开托管的网站,都在使用它进行各种开发工作。但无论我对 Git 的使用有多熟练,似乎总有一些功能还没有被发现,下面是改变我使用 Git 工作方式的七个技巧。 + +### 1、Git 中的自动更正 + +我们有时都会打错字,但如果启用了 Git 的自动更正功能,就可以让 Git 自动修正打错的子命令。 + +假设你想用 `git status` 检查状态,却不小心输入了 `git stats`。正常情况下,Git 会告诉你 `stats` 不是一条有效的命令: + +``` +$ git stats +git: ‘stats’ is not a git command. See ‘git --help’. + +The most similar command is +status +``` + +为了避免类似的情况发生,请在 Git 配置中启用 Git 自动更正功能: + +``` +$ git config --global help.autocorrect 1 +``` + +如果你希望这个命令只适用于你当前的版本库,请省略 `--global` 选项。 + +这条命令启用了自动更正功能。更深入的教程可以在 [Git Docs][2] 中找到,但尝试一下和上面一样的错误命令,就能很好地了解这个配置的作用: + +``` +$ git stats +git: ‘stats’ is not a git command. See ‘git --help’. +On branch master +Your branch is up to date with ‘origin/master’. + +nothing to commit, working tree clean +``` + +Git 现在不会建议使用其他子命令,而是直接运行最上面的建议,在本例中是 `git status`。 + +### 2、计算你的提交量 + +你需要计算提交数量可能有很多原因。例如,许多开发者通过计算提交数量来判断何时该增加构建版本号,或者只是想了解项目的进展情况。 + +要计算提交数量其实很简单直接,下面是 Git 的命令: + +``` +$ git rev-list --count branch-name +``` + +在上面的命令中,`branch-name` 应该是当前版本库中有效的分支名称: + +``` +$ git rev-list –count master +32 +$ git rev-list –count dev +34 +``` + +### 3、优化你的仓库 + +你的代码仓库不仅对你有价值,对你的组织也有价值。你可以通过一些简单的做法来保持你的版本库的清洁和更新。其中一个最好的做法是 [使用 .gitignore 文件][3]。使用这个文件,就是告诉 Git 不要存储许多不需要的文件,比如二进制文件、临时文件等等。 + +为了进一步优化你的版本库,你可以使用 Git 的垃圾收集功能: + +``` +$ git gc --prune=now --aggressive +``` + +当你或你的团队大量使用 `pull` 或 `push` 命令时,这条命令就会起到帮助作用。 + +这个命令是一个内部工具,可以清理仓库中无法访问或 “孤儿” Git 对象。 + +### 4、备份未被跟踪的文件 + +大多数时候,删除所有未被跟踪的文件是安全的。不过很多时候,你不仅要删除,还要为你的未跟踪文件创建一个备份,以备以后需要。 + +通过 Git 和一些 Bash 命令管道,可以很容易地为你的未被跟踪的文件创建一个压缩包: + +``` +$ git ls-files --others --exclude-standard -z |\ +xargs -0 tar rvf ~/backup-untracked.zip +``` + +上面的命令制作了一个名为 `backup-untracked.zip` 的存档(并排除了 `.gitignore` 中列出的文件)。 + +### 5、了解你的 .git 文件夹 + +每个版本库都有一个 `.git` 文件夹。它是一个特殊的隐藏文件夹。 + +``` +$ ls -a +. … .git +``` + +Git 的工作主要依赖于两个部分: + + 1. 工作树(你当前签出的文件状态)。 + 2. 你的 Git 仓库的路径(即你的 `.git` 文件夹的位置,其中包含版本信息)。 + +这个文件夹存储了所有的引用和其他重要的细节,比如配置、仓库数据、HEAD 状态、日志等等。 + +如果你删除这个文件夹,你的源代码的当前状态不会被删除,但你的远程信息,如你的项目历史记录,会被删除。删除这个文件夹意味着你的项目(至少是本地副本)不再处于版本控制之下。这意味着你不能跟踪你的变化;你不能从远程拉取或推送。 + +一般来说,不需要在 `.git` 文件夹里做什么,也没有什么应该做的。它是由 Git 管理的,基本上被认为是个禁区。然而,这个目录里有一些有趣的工件,包括 HEAD 的当前状态。 + +``` +$ cat .git/HEAD +ref: refs/heads/master +``` + +它还可能包含对你的存储库的描述: + +``` +$ cat .git/description +``` + +这是一个未命名的仓库,编辑这个 `description` 文件可以命名这个仓库。 + +Git 钩子文件夹(`hooks`)也在这里,里面有一些钩子示例文件。你可以阅读这些示例来了解通过 Git 钩子可以实现什么,你也可以 [阅读 Seth Kenlon 的 Git 钩子介绍][4]。 + +### 6、查看另一个分支的文件 + +有时你想查看另一个分支的文件的内容。用一个简单的 Git 命令就可以实现,而且不需要切换分支。 + +假设你有一个名为 [README.md][5] 的文件,它在 `main` 分支中,而你正在 `dev` 分支上工作。 + +使用下面的 Git 命令,你可以在终端上完成: + +``` +$ git show main:README.md +``` + +一旦你执行了这个命令,你就可以在你的终端上查看文件的内容。 + +### 7、在 Git 中搜索 + +只需一个简单的命令,你就可以像专业人士一样在 Git 中搜索。更棒的是,即使你不确定是在哪个提交或分支上做的修改,也可以在 Git 中搜索。 + +``` +$ git rev-list --all | xargs git grep -F 'string' +``` + +例如,假设你想在你的版本库中搜索 `font-size: 52 px;` 这个字符串: + +``` +$ git rev-list –all | xargs git grep -F 'font-size: 52 px;' +F3022…9e12:HtmlTemplate/style.css: font-size: 52 px; +E9211…8244:RR.Web/Content/style/style.css: font-size: 52 px; +``` + +### 试试这些技巧 + +希望这些高级技巧对你有用,提高你的工作效率,为你节省很多时间。 + +你有喜欢的 [Git 小技巧][6] 吗?在评论中分享吧。 + +-------------------------------------------------------------------------------- + +via: https://opensource.com/article/20/10/advanced-git-tips + +作者:[Rajeev Bera][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/acompiler +[b]: https://github.com/lujun9972 +[1]: https://opensource.com/sites/default/files/styles/image-full-size/public/lead-images/browser_screen_windows_files.png?itok=kLTeQUbY (Computer screen with files or windows open) +[2]: https://git-scm.com/book/en/v2/Customizing-Git-Git-Configuration#_code_help_autocorrect_code +[3]: https://linux.cn/article-12524-1.html +[4]: https://opensource.com/life/16/8/how-construct-your-own-git-server-part-6 +[5]: http://README.md +[6]: https://acompiler.com/git-tips/ diff --git a/published/202012/20201030 How to rebase to Fedora 33 on Silverblue.md b/published/202012/20201030 How to rebase to Fedora 33 on Silverblue.md new file mode 100644 index 0000000000..c0c218cd07 --- /dev/null +++ b/published/202012/20201030 How to rebase to Fedora 33 on Silverblue.md @@ -0,0 +1,93 @@ +[#]: collector: (lujun9972) +[#]: translator: (geekpi) +[#]: reviewer: (wxy) +[#]: publisher: (wxy) +[#]: url: (https://linux.cn/article-12880-1.html) +[#]: subject: (How to rebase to Fedora 33 on Silverblue) +[#]: via: (https://fedoramagazine.org/how-to-rebase-to-fedora-33-on-silverblue/) +[#]: author: (Michal Konečný https://fedoramagazine.org/author/zlopez/) + +如何在 Silverblue 上变基到 Fedora 33? +====== + +![](https://img.linux.net.cn/data/attachment/album/202012/02/232440exewdbwdhde4mqhv.jpg) + +Silverblue 是[一个建立在 Fedora 之上的桌面操作系统][2]。它非常适合日常使用、开发和基于容器的工作流程。它提供了[众多的优势][3],例如在出现任何问题时能够回滚。如果你想在你的 Silverblue 系统上更新到 Fedora 33,这篇文章会告诉你如何做。它不仅告诉你该怎么做,还告诉你如果发生了不可预见的事情时该如何回退。 + +在实际做变基到 Fedora 33 之前,你应该应用任何挂起的更新。在终端中输入以下内容: + +``` +$ rpm-ostree update +``` + +或通过 GNOME 软件中心安装更新并重启。 + +### 使用 GNOME 软件中心变基 + +GNOME 软件中心会在更新界面显示有新版本的 Fedora 可用。 + +![Fedora 33 is available][4] + +首先你需要做的是下载新镜像,点击 “Download” 按钮。这将需要一些时间,完成后你会看到更新已经准备好安装了。 + +![Fedora 33 is ready for installation][5] + +点击 “Install” 按钮。这一步只需要几分钟,然后会提示你重启电脑。 + +![Restart is needed to rebase to Fedora 33 Silverblue][6] + +点击 “Restart” 按钮就可以了。重启后,你将进入新的 Fedora 33 版本。很简单,不是吗? + +### 使用终端变基 + +如果你喜欢在终端上做所有的事情,那么接下来的指南就适合你。 + +使用终端变基到 Fedora 33 很简单。首先,检查 33 版本分支是否可用: + +``` +$ ostree remote refs fedora +``` + +你应该在输出中看到以下内容: + +``` +fedora:fedora/33/x86_64/silverblue +``` + +接下来,将你的系统变基到 Fedora 33 分支。 + +``` +$ rpm-ostree rebase fedora:fedora/33/x86_64/silverblue +``` + +最后要做的是重启你的电脑并启动到 Fedora 33。 + +### 如何回滚 + +如果有什么不好的事情发生。例如,如果你无法启动到 Fedora 33,那很容易回滚回去。在启动时选择 GRUB 菜单中的前一个条目,你的系统就会以切换到 Fedora 33 之前的状态启动。要使这一改变永久化,请使用以下命令: + +``` +$ rpm-ostree rollback +``` + +就是这样了。现在你知道如何将 Silverblue 变基为 Fedora 33 并回滚了。那为什么不在今天就做呢? + +-------------------------------------------------------------------------------- + +via: https://fedoramagazine.org/how-to-rebase-to-fedora-33-on-silverblue/ + +作者:[Michal Konečný][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/zlopez/ +[b]: https://github.com/lujun9972 +[1]: https://fedoramagazine.org/wp-content/uploads/2020/02/fedora-silverblue-logo.png +[2]: https://docs.fedoraproject.org/en-US/fedora-silverblue/ +[3]: https://fedoramagazine.org/give-fedora-silverblue-a-test-drive/ +[4]: https://fedoramagazine.org/wp-content/uploads/2020/10/Screenshot-from-2020-10-29-12-53-37-1024x725.png +[5]: https://fedoramagazine.org/wp-content/uploads/2020/10/Screenshot-from-2020-10-29-13-00-15-1024x722.png +[6]: https://fedoramagazine.org/wp-content/uploads/2020/10/Screenshot-from-2020-10-29-13-01-32-1024x727.png diff --git a/published/202012/20201109 Day 1- a confusing Rails error message.md b/published/202012/20201109 Day 1- a confusing Rails error message.md new file mode 100644 index 0000000000..32c5ef8659 --- /dev/null +++ b/published/202012/20201109 Day 1- a confusing Rails error message.md @@ -0,0 +1,97 @@ +[#]: collector: (lujun9972) +[#]: translator: (wxy) +[#]: reviewer: (wxy) +[#]: publisher: (wxy) +[#]: url: (https://linux.cn/article-12884-1.html) +[#]: subject: (Day 1: a confusing Rails error message) +[#]: via: (https://jvns.ca/blog/2020/11/09/day-1--a-little-rails-/) +[#]: author: (Julia Evans https://jvns.ca/) + +Rails 之旅第 1 天:一个令人困惑的 Rails 错误信息 +====== + +![](https://img.linux.net.cn/data/attachment/album/202012/04/080957f0p4piqz52bypqb5.jpg) + +今天,我开始了一个 Recurse Center 的班次学习!我认识了一些人,并开始了一个小小的有趣的 Rails 项目。我想我今天不会谈太多关于这个项目的实际内容,但这里有一些关于 Rails 一天的快速笔记。 + +### 一些关于开始的笔记 + +在建立 Rails 项目的过程中,我学到的主要是: + + 1. 它默认使用 sqlite,你必须告诉它使用 Postgres。 + 2. Rails 默认包含了大量的东西,你可以禁用。 + +我安装并 `rm -rf` Rails 大概 7 次后才满意,最后用了这个咒语: + +``` +rails new . -d postgresql --skip-sprockets --skip-javascript +``` + +主要是因为我想用 Postgres 而不是 sqlite,而且跳过 sprockets 和 javascript 似乎能让安装 Rails 的速度更快,而且我想如果我决定要它们的话,我可以在以后再安装。 + +### 官方的 Rails 指南真的很不错 + +我在创建我的 Rails 入门应用时主要参考了 2 个资源: + + * DHH 在 2005 年的 Rails 原版演讲 (这次我没有看,但上次我花了一天时间学习 Rails 时看了,我发现它很有启发和帮助)。 + * 官方的 Rails 入门指南,似乎非常简短明了 。 + +### 一个神秘的错误信息:`undefined method 'user'` + +我喜欢 bug,所以今天我遇到了一个奇怪的 Rails 错误! 我有一些看起来像这样的代码: + +``` +@user = User.new(user_params) +@user.save +``` + +很简单吧?但当这段代码运行时,我得到了这个令人费解的错误信息: + +``` +undefined method `user' for # Did you mean? super +``` + +我对这里发生的事情感到**超级**困惑,因为我没有调用一个叫做 `user` 的方法。我调用的是 `.save`。什么嘛?!我对此感到困惑和沮丧,大概呆了 20 分钟,最后我看了看我的 `User` 模型,发现了这段代码: + +``` +class User < ApplicationRecord + has_secure_password + + validates :user, presence: true, uniqueness: true +end +``` + +`validates :user...` *应该*是一些 Rails 魔法,验证每个 `User` 都有一个 `username`,而且用户名必须是唯一的。但我犯了一个错,我写的是 `user` 而不是 `username`。我把这个问题解决了,然后一切都正常了!万岁。 + +我仍然不明白我应该如何调试这个问题:堆栈跟踪告诉我问题出在 `@user.save` 行,根本没有提到 `validates :user` 的事情。我觉得一定有办法调试这个问题,但我不知道是什么办法。 + +我学 Rails 的目的就是想看看 Rails 的魔力在实践中是如何发挥的,所以这是个很有意思的 bug,早早的就掉坑里了。 + +### 一个简单的用户管理系统 + +我决定在我的玩具应用中加入用户。我在网上搜索了一下,发现有一个非常流行的叫做 [devise][1] 的工具可以处理用户。我发现它的 `README` 有点让人不知所措,而且我知道想要在我的玩具应用中建立一个非常简陋的用户管理系统,所以我遵循了这个名为《[Rails 5.2 中从零开始进行用户验证][2]》的指南,到目前为止,这个指南似乎还不错。Rails 似乎已经有了一大堆管理用户的内置东西,我真的很惊讶于这本指南的短小和我需要写的代码之少。 + +我在实现用户功能的时候了解到,Rails 有一个内置的神奇的会话管理系统(参见 [Rails 会话如何工作][3]。默认情况下,所有的会话数据似乎都存储在用户电脑上的 cookie 中,不过我想如果 cookie 太大了,你也可以把会话数据存储在数据库中。 + +已经有了会话管理系统,有了 cookie 和用户,却不太清楚到底发生了什么,这肯定是有点奇怪的,但也是挺好玩的!我们会看看情况如何。我们将拭目以待。 + +### 明天:更多的 Rails! + +也许明天我可以在实现我的有趣的 rails 应用的想法上取得一些进展! + +-------------------------------------------------------------------------------- + +via: https://jvns.ca/blog/2020/11/09/day-1--a-little-rails-/ + +作者:[Julia Evans][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://jvns.ca/ +[b]: https://github.com/lujun9972 +[1]: https://github.com/heartcombo/devise +[2]: https://medium.com/@wintermeyer/authentication-from-scratch-with-rails-5-2-92d8676f6836 +[3]: https://www.justinweiss.com/articles/how-rails-sessions-work/ diff --git a/published/202012/20201110 Day 2- Rails associations - dragging divs around.md b/published/202012/20201110 Day 2- Rails associations - dragging divs around.md new file mode 100644 index 0000000000..38bf83bcf2 --- /dev/null +++ b/published/202012/20201110 Day 2- Rails associations - dragging divs around.md @@ -0,0 +1,117 @@ +[#]: collector: (lujun9972) +[#]: translator: (wxy) +[#]: reviewer: (wxy) +[#]: publisher: (wxy) +[#]: url: (https://linux.cn/article-12890-1.html) +[#]: subject: (Day 2: Rails associations & dragging divs around) +[#]: via: (https://jvns.ca/blog/2020/11/10/day-2--rails-associations---dragging-divs-around/) +[#]: author: (Julia Evans https://jvns.ca/) + +Rails 之旅第 2 天:Rails 关联和拖动 div +====== + +![](https://img.linux.net.cn/data/attachment/album/202012/05/212345zz8jajhaj0hh8h2f.jpg) + +大家好!今天是我搭建这个玩具项目的第 2 天。下面再来记录一下关于 Rails 的一些有趣的事情吧! + +### 目标:做一个冰箱诗歌论坛 + +我想做一种无聊的标准网站来学习 Rails,并且其他人可以与之互动,就像一个论坛一样! 但如果人们真的可以在网站上打字,那就会产生各种各样的问题(如果他们是垃圾邮件发送者怎么办?又或者只是言语刻薄?)。 + +我想到的第一个想法是,可以让人们与网站互动,但实际上却不能在网站上打字,那就是一个“冰箱诗歌论坛”,只给你一组固定的字,你就可以随意组合。 + +所以,这就是我们的计划! + +我这个项目的目标是想知道我是否能用 Rails 来做其他的小型网络项目(而不是像我通常做的那样,使用一些更基本的东西,比如 Flask,或者放弃后端,用 Javascript 来写所有东西)。 + +### 怎么把字拖来拖去呢?jQuery 的可拖放 UI! + +我想让大家能够把文字拖动起来,但我又不想写很多 Javascript。结果发现这超级简单 —— 有一个 jQuery 库可以做到,它叫做 `draggable`!一开始,拖动并不成功。 + +一开始拖动在手机上是不行的,但是有一个技巧可以让 jQuery UI 在手机上工作,叫做 [jQuery UI touch punch][1]。下面是它的样子(有兴趣看工作原理的可以查看源码,代码很少)。 + +> `banana` `forest` `cake` `is` + +### 一个有趣的 Rails 功能:关联 + +我以前从来没有使用过关系型 ORM,对于 Rails,我很兴奋的一件事就是想看看使用 Active Record 是什么样子的!今天我了解了 Rails 的 ORM 功能之一:[关联][2]。如果你像我一样对 ORM 完全不了解的话,那就来看看是怎么回事吧。 + +在我的论坛中,我有: + + * 用户 + * 话题(我本来想把它叫做“线索”,但显然这在 Rails 中是一个保留词,所以现在叫做“话题”)。 + * 帖子 + +当显示一个帖子时,我需要显示创建该帖子的用户的用户名。所以我想我可能需要写一些代码来加载帖子,并为每个帖子加载用户,就像这样(在 Rails 中,`Post.where` 和 `User.find` 将会运行 SQL 语句,并将结果转化为 Ruby 对象): + +``` +@posts = Post.where(topic_id: id) +@posts.each do |post| + user = User.find(post.user_id) + post.user = user +end +``` + +这还不够好,它要为每个帖子做一次单独的 SQL 查询!我知道有一个更好的方法,我发现它叫做[关联][2]。这个链接是来自 的指南,到目前为止,它对我很有帮助。 + +基本上我需要做的就是: + + 1. 在 `User` 模型中添加一行 `has_many :post`。 + 2. 在 `Post` 模型中添加一行 `belongs_to :user`。 + 3. Rails 现在知道如何将这两个表连接起来,尽管我没有告诉它要连接到什么列上!我认为这是因为我按照它所期望的惯例命名了 `posts` 表中的 `user_id` 列。 + 4. 对 `User` 和 `Topic` 做完全相同的事情(一个主题也有很多帖子:`has_many :posts`)。 + +然后我加载每一个帖子和它的关联用户的代码就变成了只有一行! 就是这一行: + +``` +@posts = @topic.posts.order(created_at: :asc).preload(:user) +``` + +比起只有一行更重要的是,它不是单独做一个查询来获取每个帖子的用户,而是在 1 个查询中获取所有用户。显然,在 Rails 中,有一堆[不同的方法][3]来做类似的事情(预加载、急切加载、联接和包含?),我还不知道这些都是什么,但也许我以后会知道的。 + +### 一个有趣的 Rails 功能:脚手架! + +Rails 有一个叫 `rails` 的命令行工具,它可以生成很多代码。例如,我想添加一个 `Topic` 模型/控制器。我不用去想在哪里添加所有的代码,可以直接运行 + +``` +rails generate scaffold Topic title:text +``` + +并生成了一堆代码,这样我已经有了基本的端点来创建/编辑/删除主题(`Topic`)。例如,这是我的[现在的主题控制器][4],其中大部分我没有写(我只写了高亮的 3 行)。我可能会删除很多内容,但是有一个起点,让我可以扩展我想要的部分,删除我不想要的部分,感觉还不错。 + +### 数据库迁移! + +`rails` 工具还可以生成数据库迁移! 例如,我决定要删除帖子中的 `title` 字段。 + +下面是我要做的: + +``` +rails generate migration RemoveTitleFromPosts title:string +rails db:migrate +``` + +就是这样 —— 只要运行几个命令行咒语就可以了! 我运行了几个这样的迁移,因为我改变了对我的数据库模式的设想。它是相当直接的,到目前为止 —— 感觉很神奇。 + +当我试图在一列中的某些字段为空的地方添加一个“不为空”(`not null`)约束时,情况就变得有点有趣了 —— 迁移失败。但我可以修复违例的记录,并轻松地重新运行迁移。 + +### 今天就到这里吧! + +明天,如果我有更多的进展,也许我会把它放在互联网上。 + +-------------------------------------------------------------------------------- + +via: https://jvns.ca/blog/2020/11/10/day-2--rails-associations---dragging-divs-around/ + +作者:[Julia Evans][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://jvns.ca/ +[b]: https://github.com/lujun9972 +[1]: https://github.com/furf/jquery-ui-touch-punch +[2]: https://guides.rubyonrails.org/association_basics.html +[3]: https://blog.bigbinary.com/2013/07/01/preload-vs-eager-load-vs-joins-vs-includes.html +[4]: https://github.com/jvns/refrigerator-forum/blob/776b3227cfd7004cb1efb00ec7e3f82a511cbdc4/app/controllers/topics_controller.rb#L13-L15 diff --git a/published/202012/20201113 The state of the art of microservices in 2020.md b/published/202012/20201113 The state of the art of microservices in 2020.md new file mode 100644 index 0000000000..217b280dcf --- /dev/null +++ b/published/202012/20201113 The state of the art of microservices in 2020.md @@ -0,0 +1,134 @@ +[#]: collector: (lujun9972) +[#]: translator: (zxp93) +[#]: reviewer: (wxy) +[#]: publisher: (wxy) +[#]: url: (https://linux.cn/article-12941-1.html) +[#]: subject: (The state of the art of microservices in 2020) +[#]: via: (https://www.linux.com/news/the-state-of-the-art-of-microservices-in-2020/) +[#]: author: (Linux.com Editorial Staff https://www.linux.com/author/linuxdotcom/) + +2020 年微服务现状 +====== + +![](https://img.linux.net.cn/data/attachment/album/202012/22/122634t2hwh2hh12bvrbsd.jpg) + +> “微服务架构风格是一种将 **单个应用程序** 开发为一套 **小型服务** 的方法,每个服务都在 **自己的进程中运行,并使用轻量级的通信机制(通常是 HTTP 类型的 API)进行通信**。这些服务是围绕 **业务能力** 构建的,并且可以通过 **全自动化的部署机制** 进行 **独立部署**。目前对这些服务几乎没有集中的管理,这些服务可以用 **不同的编程语言** 编写,也能使用 **不同的数据存储技术**。” +> +> —— James Lewis 和 Martin Fowler (2014) [^6] + +### 介绍 + +预计在 2020 年,全球云端的微服务市场将以 22.5% 的速度增长,其中美国市场预计将保持 27.4% 的增长率[^5]。目前的趋势是,开发人员将从本地托管的应用程序转移到云端。这将有助于企业最大限度地减少停机时间、优化资源并降低基础设施成本。同时专家们还预测,到了 2022 年,90% 的应用程序将会使用微服务架构进行开发[^5]。本文将帮助你了解什么是微服务,以及目前的公司如何使用它的。 + +### 什么是微服务? + +微服务已经在全球范围内被广泛使用。但是,微服务到底是什么?微服务是一种基于许多小型、互联服务的体系结构模式。它们基于 **单一责任原则**。根据 Robert C. Martin 的说法,“将因相同原因而变化的事物聚集起来,将因不同原因而变化的事物分离开来”。[^2]微服务架构也被扩展到了 **松耦合服务** 中,可以 **独立地开发、部署和维护**[^2]。 + +### 远离单体架构 + +微服务通常和传统的单体软件架构做对比。在单体架构中,软件是被设计为自足的,也就是说,这个程序中的各个组件都是互相连通和互相依赖的,而不是松散耦合的。在一个紧耦合的架构中(单体monolithic),每个组件和它相关联的组件必须按照指定的顺序组合起来,才能被执行或编译[^7]。当其中有一个组件需要更新时,整个应用都要被重写。 + +而这个现象在使用微服务架构的应用中就不会出现。因为每一个模块都是独立的,每个模块都可以更新修改而不影响程序的其他部分。因此,降低了对更改一个组件会对其他组件造成影响的风险。 + +如果公司的架构很难升级,或者维护过于复杂和昂贵,那么他们可能会遇到麻烦,不能扩展单体架构的应用[^4]。把一个复杂的任务分解成小组件,彼此独立工作,就是解决这个问题的方法。 + +![][1] + +*单一体系架构 vs. 微服务架构 (图片来自 [^3])* + +### 开发者如何构建属于自己的微服务 + +微服务以提高*可扩展性*和*性能*而闻名。然而,这些是世界各地的开发者开发属于他们自己的微服务的主要原因吗?《微服务 2020 研究现状》[^1]披露了全球开发者如何构建他们的微服务,以及他们对微服务的看法。这份报告是在来自欧洲、北美、中南美洲、中东、东南亚、澳大利亚和新西兰的 660 名微服务专家的帮助下完成的。下表列出了微服务成熟度相关问题的平均评分[^1]: + +**分类** | **平均得分(满分为5分)** +---|--- +创建新项目 | 3.8 +维护与调试 | 3.4 +工作效率 | 3.9 +解决可扩展性问题 | 4.3 +解决性能问题 | 3.9 +团队合作 | 3.9 + +从上表可知,大部分专家都对使用微服务来解决可扩展性问题感到满意。与之相反的是,维护与调试对他们来说似乎是一个挑战。 + +从他们所使用的架构技术来说,大部分专家使用 Javascript/Typescript (大约 ⅔ 的微服务是使用这些语言构建的),其次使用的是 Java。 + +尽管有很多部署微服务的选择,但大多数专家使用 AWS(49%),其次是他们自己的服务器。另外,有 62% 的人更喜欢用 AWS Lambda 作为无服务器解决方案。 + +这些人所使用的大多数微服务都使用 HTTP 进行通信,其次是 events 和 gRPC。此外,大多数专家将 RabbitMQ 用于消息代理,其次是 Kafka 和 Redis。 + +而且,大多数人使用微服务持续集成(CI)。在报告中,87% 的受访者使用诸如 GitLab CI、Jenkins 或 GitHub Actions 等 CI 解决方案。 + +在 86% 的受访者中,最受欢迎的调试解决方案是日志,其中 27% 的受访者**只**使用日志。 + +最后,大多数人认为微服务架构将成为更复杂的系统或后端开发的标准。 + +### 微服务的成功案例 + +许多公司已经从单体架构转向微服务架构。 + +#### 亚马逊 + +在 2001 年,开发延迟、编码挑战和服务相互依赖性使得亚马逊Amazon无法满足其不断增长的用户群的可扩展性需求。由于需要从头开始重构他们的单体架构,亚马逊将其单体架构应用程序拆分为小型的、独立的、针对服务的应用程序[^3][^9]。 + +2001 年,在微服务这个词开始流行之前的几年,亚马逊决定改用微服务。这一变化使得亚马逊开发了好几种支持微服务架构的解决方案,比如亚马逊 AWS。随着对微服务的快速增长和适应,亚马逊成为全球市值最高的公司,截至 2020 年 7 月 1 日,亚马逊市值为 1.433 万亿美元[^8]。 + +#### 奈飞 + +奈飞Netflix于 2007 年开始提供电影流媒体服务,到了 2008 年,它也面临着规模扩张的挑战。期间,他们经历了一次严重的数据库损坏,在三天之内,他们不能将 DVD 发送给他们的会员[^10]。这一事故使他们意识到需要将单点故障(如关系数据库)转向云中更可伸缩和更可靠的分布式系统。于是 2009 年,奈飞开始将其单体架构的应用重构为微服务。他们首先将其非面向客户的电影编码平台迁移到云端作为独立的微服务运行[^11]。在改用微服务之后,使奈飞能够解决扩展性挑战和服务中断的问题。并且它还允许他们按照每个流数据而不是数据中心的成本来降低成本[^10]。今天,奈飞每天向 190 个国家的 1.39 亿订户发送约 2.5 亿小时的内容[^11]。 + +#### Uber + +在推出 Uber 服务之后,他们在开发和发布新功能、修复 bug,以及迅速整合新的变化方面遇到了困难。因此,他们决定改用微服务,并将应用程序结构拆分为基于云的微服务。换句话说,Uber 为每个功能创建了一个微服务,比如乘客管理和出行管理。转向微服务给 Uber 带来了很多好处,比如对每项服务的所有权都有一个清晰的概念。这提高了服务访问的速度和质量,通过允许团队只关注他们需要扩展的服务,在更新虚拟服务的同时而不中断其他服务,实现了更可靠的容错,从而促进了快速扩展[^11]。 + +### 这就是可扩展性! + +关于如何提供可伸缩性的一个很好的例子是看看中国。中国人口众多,必须通过创造和试验新的解决方案来适应规模化的新挑战。统计数据显示,中国目前为大约 9 亿互联网用户提供服务[^14]。2019 年“双十一”期间(相当于国外的黑色星期五),阿里巴巴旗下各购物平台的交易峰值为每秒 544000 笔交易。阿里云处理的数据总量约为 970 PB[^15]。那么,这些数量的用户在技术上意味着什么呢? + +为了解决可伸缩性问题,许多技术应运而生。例如,[Tars][2] 由腾讯于 2008 年创建,[2018 年贡献给 Linux 基金会][3]。它也在被大规模使用,并在 10 年内得到了很大的提升[^12]。TARS 是开源的,许多组织都在大力贡献和扩展框架的特性和价值[^12]。TARS 支持多种编程语言,包括 C++、Golang、java、node.js、PHP 和 Python;它可以快速构建系统并自动生成代码,使开发人员能够专注于业务逻辑,从而有效地提高操作效率。TARS 已广泛应用于腾讯的 QQ、微信社交网络、金融服务、边缘计算、汽车、视频、网络游戏、地图、应用市场、安全等诸多核心业务。[在 2020 三月,TARS 项目转变为 TARS 基金会][4],这是一个开源微服务基金会,在建立开放式微服务平台的社区方面中,致力于提升社区贡献和成员的快速增长[^12]。 + + +**一定要看看 Linux 基金会新的免费培训课程**:《[用 TARS 构建微服务平台][5]》 + +*关于作者:* + +*Isabella Ferreira 是 Linux 基金会旗下的开源微服务基金会 TARS 基金会的布道师* + +*Mark Shan(单致豪)是腾讯开源联盟的主席,也是 TARS 基金会的董事会主席。* + +[^1]: https://tsh.io/state-of-microservices/#ebook +[^2]: https://medium.com/hashmapinc/the-what-why-and-how-of-a-microservices-architecture-4179579423a9 +[^3]: https://www.plutora.com/blog/understanding-microservices +[^4]: https://www.leanix.net/en/blog/a-brief-history-of-microservices +[^5]: https://www.charterglobal.com/five-microservices-trends-in-2020/ +[^6]: https://martinfowler.com/articles/microservices.html#footnote-etymology +[^7]: https://whatis.techtarget.com/definition/monolithic-architecture +[^8]: https://ycharts.com/companies/AMZN/market_cap +[^9]: https://thenewstack.io/led-amazon-microservices-architecture/ +[^10]: https://media.netflix.com/en/company-blog/completing-the-netflix-cloud-migration +[^11]: https://blog.dreamfactory.com/microservices-examples/ +[^12]: https://www.linuxfoundation.org/blog/2020/03/the-tars-foundation-the-formation-of-a-microservices-ecosystem/ +[^13]: https://medium.com/microservices-architecture/top-10-microservices-framework-for-2020-eefb5e66d1a2 +[^14]: https://www.statista.com/statistics/265140/number-of-internet-users-in-china/ +[^15]: https://interconnected.blog/china-scale-technology-sandbox/ + +> 本篇 Linux 基金会白金赞助商内容由腾讯贡献。 + +-------------------------------------------------------------------------------- + +via: https://www.linux.com/news/the-state-of-the-art-of-microservices-in-2020/ + +作者:[Linux.com][a] +选题:[lujun9972][b] +译者:[zhangxiangping](https://github.com/zxp93) +校对:[wxy](https://github.com/wxy) + +本文由 [LCTT](https://github.com/LCTT/TranslateProject) 原创编译,[Linux中国](https://linux.cn/) 荣誉推出 + +[a]: https://www.linux.com/author/linuxdotcom/ +[b]: https://github.com/lujun9972 +[1]: https://www.linux.com/wp-content/uploads/2020/11/microservices_diagram_a.png +[2]: https://tarscloud.org/foundation/index +[3]: https://www.linuxfoundation.org/press-release/2018/06/tars-and-tseer-form-open-source-project-communities-under-the-linux-foundation-to-expand-adoption-and-pace-of-development/ +[4]: https://www.linuxfoundation.org/blog/2020/03/the-tars-foundation-the-formation-of-a-microservices-ecosystem/ +[5]: https://www.edx.org/course/building-microservice-platforms-with-tars diff --git a/published/202012/20201116 How to use Serializers in the Django Python web framework.md b/published/202012/20201116 How to use Serializers in the Django Python web framework.md new file mode 100644 index 0000000000..f3f83f18a1 --- /dev/null +++ b/published/202012/20201116 How to use Serializers in the Django Python web framework.md @@ -0,0 +1,242 @@ +[#]: collector: (lujun9972) +[#]: translator: (MjSeven) +[#]: reviewer: (wxy) +[#]: publisher: (wxy) +[#]: url: (https://linux.cn/article-12900-1.html) +[#]: subject: (How to use Serializers in the Django Python web framework) +[#]: via: (https://opensource.com/article/20/11/django-rest-framework-serializers) +[#]: author: (Renato Oliveira https://opensource.com/users/renato-oliveira) + +如何在 Python Web 框架 Django 中使用序列化器 +====== + +> 序列化用于将数据转换为方便存储或传输的格式,然后将其重新构建以供使用。DRF 是最具有知名的序列化器。 + +![](https://img.linux.net.cn/data/attachment/album/202012/08/220845q5tz7cfftze5oem5.jpg) + +序列化是将数据转换为可以存储或传输的格式,然后对其进行重新构建的过程。在开发应用程序或将数据存储在数据库、内存或将其转换为文件时,一直会用到它。 + +我最近帮助 [Labcodes][2] 的两名初级开发人员理解序列化器,我想也可以与诸位读者分享一下我的方法。 + +假设你正在编写一个电子商务网站,你有一个订单,该订单记录了某人在某个日期以某种价格购买了一个产品: + +``` +class Order: +    def __init__(self, product, customer, price, date): +        self.product = product +        self.customer = customer +        self.price = price +        self.date = date +``` + +现在,假设你想从一个键值数据库中存储和检索订单数据。幸运的是,它的接口可以接受和返回字典,因此你需要将对象转换成字典: + +``` +def serialize_order(order): +    return { +        'product': order.product, +        'customer': order.customer, +        'price': order.price, +        'date': order.date +    } +``` + +如果你想从数据库中获取一些数据,你可以获取字典数据并将其转换为订单对象(`Order`): + +``` +def deserialize_order(order_data): +    return Order( +        product=order_data['product'], +        customer=order_data['customer'], +        price=order_data['price'], +        date=order_data['date'], +    ) +``` + +这对于简单的数据非常直接了当,但是当你需要处理一些由复杂属性构成的复杂对象时,这种方法就无法很好地扩展。你还需要处理不同类型字段的验证,这需要手工完成大量工作。 + +此时框架的序列化可以很方便的派上用场。它们使你可以创建带有少量模板的序列化器,这将适用于复杂的情况。 + +[Django][3] 提供了一个序列化模块,允许你将模型“转换”为其它格式: + +``` +from django.core import serializers + +serializers.serialize('json', Order.objects.all()) +``` + +它涵盖了 Web 应用程序最常用的种类,例如 JSON、YAML 和 XML。但是你也可以使用第三方序列化器或创建自己的序列化器。你只需要在 `settings.py` 文件中注册它: + +``` +# settings.py +SERIALIZATION_MODULES = { +    'my_format': appname.serializers.MyFormatSerializer, +} +``` + +要创建自己的 `MyFormatSerializer`,你需要实现 `.serialize()` 方法并接受一个查询集和其它选项作为参数: + +``` +class MyFormatSerializer: +    def serialize(self, queryset, **options): +        # serious serialization happening +``` + +现在,你可以将查询集序列化为新格式: + +``` +from django.core import serializers + +serializers.serialize('my_format', Order.objects.all()) +``` + +你可以使用选项参数来定义序列化程序的行为。例如,如果要定义在处理 `ForeignKeys` 时要使用嵌套序列化,或者只希望数据返回其主键,你可以传递一个 `flat=True` 参数作为选项,并在方法中处理: + +``` +class MyFormatSerializer: +    def serializer(self, queryset, **options): +        if options.get('flat', False): +            # don't recursively serialize relationships +        # recursively serialize relationships +``` + +使用 Django 序列化的一种方法是使用 `loaddata` 和 `dumpdata` 管理命令。 + +### DRF 序列化器 + +在 Django 社区中,[Django REST 框架][4](DRF)提供了最著名的序列化器。尽管你可以使用 Django 的序列化器来构建将在 API 中响应的 JSON,但 REST 框架中的序列化器提供了更出色的功能,可以帮助你处理并轻松验证复杂的数据。 + +在订单的例子中,你可以像这样创建一个序列化器: + +``` +from restframework import serializers + +class OrderSerializer(serializers.Serializer): +    product = serializers.CharField(max_length=255) +    customer = serializers.CharField(max_lenght=255) +    price = serializers.DecimalField(max_digits=5, decimal_places=2) +    date = serializers.DateField() +``` + +轻松序列化其数据: + +``` +order = Order('pen', 'renato', 10.50, date.today()) +serializer = OrderSerializer(order) + +serializer.data +# {'product': 'pen', 'customer': 'renato', 'price': '10.50', 'date': '2020-08-16'} +``` + +为了能够从数据返回实例,你需要实现两个方法:`create` 和 `update`: + +``` +from rest_framework import serializers + +class OrderSerializer(serializers.Serializer): +    product = serializers.CharField(max_length=255) +    customer = serializers.CharField(max_length=255) +    price = serializers.DecimalField(max_digits=5, decimal_places=2) +    date = serializers.DateField() + +    def create(self, validated_data): +        # 执行订单创建 +        return order + +    def update(self, instance, validated_data): +       # 执行实例更新 +       return instance +``` + +之后,你可以通过调用 `is_valid()` 来验证数据,并通过调用 `save()` 来创建或更新实例: + +``` +serializer = OrderSerializer(**data) +## 若要验证数据,在调用 save 之前必须执行 +serializer.is_valid() +serializer.save() +``` + +### 模型序列化器 + +序列化数据时,通常需要从数据库(即你创建的模型)进行数据处理。`ModelSerializer` 与 `ModelForm` 一样,提供了一个 API,用于从模型创建序列化器。假设你有一个订单模型: + +``` +from django.db import models + +class Order(models.Model): +    product = models.CharField(max_length=255) +    customer = models.CharField(max_length=255) +    price = models.DecimalField(max_digits=5, decimal_places=2) +    date = models.DateField()     +``` + +你可以像这样为它创建一个序列化器: + +``` +from rest_framework import serializers + +class OrderSerializer(serializers.ModelSerializer): +    class Meta: +        model = Order +        fields = '__all__' +``` + +Django 会自动在序列化器中包含所有模型字段,并创建 `create` 和 `udpate` 方法。 + +### 在基于类的视图(CBV)中使用序列化器 + +像 Django CBV 中的 `Forms` 一样,序列化器可以很好地与 DRF 集成。你可以设置 `serializer_class` 属性,方便序列化器用于视图: + +``` +from rest_framework import generics + +class OrderListCreateAPIView(generics.ListCreateAPIView): +    queryset = Order.objects.all() +    serializer_class = OrderSerializer +``` + +你也可以定义 `get_serializer_class()` 方法: + +``` +from rest_framework import generics + +class OrderListCreateAPIView(generics.ListCreateAPIView): +    queryset = Order.objects.all() +    +    def get_serializer_class(self): +        if is_free_order(): +            return FreeOrderSerializer +        return OrderSerializer +``` + +在 CBV 中还有其它与序列化器交互的方法。例如,[get_serializer()][5] 返回一个已经实例化的序列化器,[get_serializer_context()][6] 返回创建实例时传递给序列化器的参数。对于创建或更新数据的视图,有 `create` 和 `update`,它们使用 `is_valid` 方法验证数据,还有 [perform_create][7] 和 [perform_update][8] 调用序列化器的 `save` 方法。 + +### 了解更多 + +要了解更多资源,参考我朋友 André Ericson 的[经典 Django REST 框架][9]网站。它是一个[基于类的经典视图][10]的 REST 框架版本,可让你深入查看组成 DRF 的类。当然,官方[文档][11]也是一个很棒的资源。 + +-------------------------------------------------------------------------------- + +via: https://opensource.com/article/20/11/django-rest-framework-serializers + +作者:[Renato Oliveira][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/renato-oliveira +[b]: https://github.com/lujun9972 +[1]: https://opensource.com/sites/default/files/styles/image-full-size/public/lead-images/data_analytics_cloud.png?itok=eE4uIoaB (Net catching 1s and 0s or data in the clouds) +[2]: http://www.labcodes.com.br +[3]: https://www.djangoproject.com/ +[4]: https://www.django-rest-framework.org/ +[5]: http://www.cdrf.co/3.9/rest_framework.generics/CreateAPIView.html#get_serializer +[6]: http://www.cdrf.co/3.9/rest_framework.generics/CreateAPIView.html#get_serializer_context +[7]: http://www.cdrf.co/3.9/rest_framework.generics/CreateAPIView.html#perform_create +[8]: http://www.cdrf.co/3.9/rest_framework.generics/RetrieveUpdateAPIView.html#perform_update +[9]: http://www.cdrf.co/ +[10]: https://ccbv.co.uk/ +[11]: https://www.django-rest-framework.org/api-guide/serializers/#serializers diff --git a/published/202012/20201118 How to Write, Compile and Run a C Program in Ubuntu and Other Linux Distributions -Beginner-s Tip.md b/published/202012/20201118 How to Write, Compile and Run a C Program in Ubuntu and Other Linux Distributions -Beginner-s Tip.md new file mode 100644 index 0000000000..c09bbbce67 --- /dev/null +++ b/published/202012/20201118 How to Write, Compile and Run a C Program in Ubuntu and Other Linux Distributions -Beginner-s Tip.md @@ -0,0 +1,136 @@ +[#]: collector: (lujun9972) +[#]: translator: (robsean) +[#]: reviewer: (wxy) +[#]: publisher: (wxy) +[#]: url: (https://linux.cn/article-12939-1.html) +[#]: subject: (How to Write, Compile and Run a C Program in Ubuntu and Other Linux Distributions [Beginner’s Tip]) +[#]: via: (https://itsfoss.com/run-c-program-linux/) +[#]: author: (Abhishek Prakash https://itsfoss.com/author/abhishek/) + +如何在 Ubuntu/Debian Linux 上编写、编译和运行一个 C 程序 +====== + +![][2] + +你是如何在 Linux 上使用 C 编写你的程序的?它确实是非常简单的,由三个简单的步骤组成。 + +**步骤 1**: 编写你的 C 程序,并使用一个 `.c` 的扩展名进行保存。例如,`my_program.c` 。 + +**步骤 2**: 在一个终端中使用 `gcc` 编译器来编译程序并生成目标文件,像这样: + +``` +gcc -o my_program my_program.c +``` + +**步骤 3**: 在 Linux 中,你可以以运行生成的对象文件的方式来运行你的 C 程序: + +``` +./my_program +``` + +![][1] + +这只是如何在 Linux 中编译和运行 C 程序的简要总结。假设你是 C 语言或 Linux 系统的新手,我将仔细演示这些步骤,以便你能在 Linux 环境中舒服地编写 C 程序。 + +事实上,我将讨论如何在 Linux 终端中以及在代码编辑器中运行 C 程序的两种方式。 + +### 方法 1: 在 Linux 终端中运行 C 程序 + +为了在 Linux 中运行一个 C 程序,你需要在你的系统上有一个 C 编译器。最流行的编译器是 `gcc`([GNU 编译器套件][3]GNU Compiler Collection)。 + +你可以使用你发行版的软件包管理器来安装 `gcc` 。在基于 Debian 和 Ubuntu 的 Linux 发行版中,使用 `apt` 命令: + +``` +sudo apt install gcc +``` + +切换到保存你的 C 程序的目录(或者提供路径),然后通过编译程序生成对象文件: + +``` +gcc -o my_program my_program.c +``` + +记住,提供输出对象文件(`-o my_program`)是可选的。如果你不提供,那么将自动生成一个名称为 `a.out` 的对象文件。但是这样并不好,因为编译每个 C 程序都会覆盖它,而且你也不知道这个 `a.out` 对象文件究竟属于哪个程序。 + +在你的对象文件生成后,运行它来运行 C 程序。它已经能够执行了。像这样简单地使用它: + +``` +./my_program +``` + +接下来,如果你的程序是正确的,它将显示出你所期望的输出。正如你所看到的,这和 [在 Linux 中运行 C++ 程序][4] 没什么不同。 + +*每更改一次你的程序,你都必须先重新编译它,然后再次运行生成的对象文件来运行这个新的 C 程序。* + +### 方法 2: 如何在 Linux 中使用一个诸如 VSCode 之类的代码编辑器来运行 C 程序 + +并不是每一个人都能适应命令行和终端,我完全理解这一点。 + +你可以使用一个诸如 Eclipse 或 Code Blocks 之类的真正的 C/C++ IDE ,但是它们是很重量级的程序,通常更适合于大型的项目。 + +我建议使用一个开源的代码编辑器,像 VSCode 或 Atom 。它们基本上是文本编辑器,但是你可以通过安装附加组件来直接在图形化的代码编辑器中编译和运行程序。 + +在这个示例中,我使用 [VSCode][5] 编辑器。它是一个来自微软的 [非常流行的开源的代码编辑器][6] 。 + +首先,在 Ubuntu 的 [软件中心中安装 VSCode][7] 。对于其它发行版来说,请检查你的 Linux 发行版的软件包管理器或软件中心。你可以参看它的官方网站来查看更多的信息。 + +启动 VSCode ,打开或创建一个工程,在这里创建你的 C 程序。我使用一个简单的 Hello World 程序作为示例。 + +![][8] + +你必须确保你已经在你的 Linux 系统上安装了 `gcc` 编译器。 + +``` +sudo apt install gcc +``` + +接下来你要做的事是使用一个允许你运行 C 代码的扩展。微软可能会提示你安装它的 C/C++ 程序扩展,但它的设置很复杂,因此我不推荐。 + +相反,我建议你使用 Code Runner 扩展。它是一个简单直接的扩展,你可以在不使用额外配置的情况下轻松地运行 C 和 C++ 代码。 + +转到扩展标签页,在其中搜索和安装 “Code Runner” 。 + +![安装 Code Runner 扩展来运行 C/C++ 程序][9] + +重新启动 VSCode 。现在,你能够使用下面方法中的其中一个来运行 C 代码: + + * 使用快捷键 `Ctrl+Alt+N` 。 + * 按下 `F1` ,接下来选择或输入 “Run Code” 。 + * 在文本编辑器中右键单击,从上下文菜单中单击 “Run code” 。 + +![右键单击程序文件,然后选择 Run Code][10] + +当你运行这个 C 程序时,它将会被自动编译和运行。你可以在编辑器底部打开的终端中看到输出。还有比这更好的事情吗? + +![程序输出显示在编辑器的底部][11] + +你更喜欢哪一种方法? + +在 Linux 命令行中运行一些 C 程序是没有问题的,但是使用一个代码编辑器会更容易一些,而且会节省时间。你不觉得吗? + +你可以自己决定想使用哪一种方法。 + +-------------------------------------------------------------------------------- + +via: https://itsfoss.com/run-c-program-linux/ + +作者:[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://i0.wp.com/itsfoss.com/wp-content/uploads/2020/11/running-c-program-linux.png?resize=795%2C399&ssl=1 +[2]: https://i1.wp.com/itsfoss.com/wp-content/uploads/2020/11/Run-C-Program-Linux.png?resize=800%2C450&ssl=1 +[3]: https://gcc.gnu.org/ +[4]: https://itsfoss.com/c-plus-plus-ubuntu/ +[5]: https://code.visualstudio.com +[6]: https://itsfoss.com/best-modern-open-source-code-editors-for-linux/ +[7]: https://itsfoss.com/install-visual-studio-code-ubuntu/ +[8]: https://i1.wp.com/itsfoss.com/wp-content/uploads/2020/11/c-program-visual-studio-code-linux.png?resize=800%2C441&ssl=1 +[9]: https://i2.wp.com/itsfoss.com/wp-content/uploads/2020/11/running-c-program-in-linux-with-visual-studio-code.png?resize=800%2C500&ssl=1 +[10]: https://i2.wp.com/itsfoss.com/wp-content/uploads/2020/11/running-c-program-in-linux-with-visual-studio-code.jpg?resize=800%2C500&ssl=1 +[11]: https://i0.wp.com/itsfoss.com/wp-content/uploads/2020/11/run-c-program-in-linux-with-visual-studio-code.jpg?resize=800%2C500&ssl=1 diff --git a/published/202012/20201122 How to Save the Output of a Command to a File in Linux Terminal -Beginner-s Tip.md b/published/202012/20201122 How to Save the Output of a Command to a File in Linux Terminal -Beginner-s Tip.md new file mode 100644 index 0000000000..1f62e1d9eb --- /dev/null +++ b/published/202012/20201122 How to Save the Output of a Command to a File in Linux Terminal -Beginner-s Tip.md @@ -0,0 +1,116 @@ +[#]: collector: (lujun9972) +[#]: translator: (Mjseven) +[#]: reviewer: (wxy) +[#]: publisher: (wxy) +[#]: url: (https://linux.cn/article-12920-1.html) +[#]: subject: (How to Save the Output of a Command to a File in Linux Terminal [Beginner’s Tip]) +[#]: via: (https://itsfoss.com/save-command-output-to-file-linux/) +[#]: author: (Abhishek Prakash https://itsfoss.com/author/abhishek/) + +如何将 Linux 终端中命令的输出保存到文件中 +====== + +![](https://img.linux.net.cn/data/attachment/album/202012/14/223956pidmznldldnnk87f.jpg) + +当你在 Linux 终端中运行命令或脚本时,它会在终端中打印输出方便你立即查看。 + +有时你需要将输出保存到文件中以备将来参考。[当然你可以在 Linux 终端中复制和粘贴][1],但是有更好的方法可以在 Linux 命令行中保存 shell 脚本或命令的输出,让我演示给你看。 + +### 方法 1:使用重定向将命令输出保存到文件中 + +你可以[在 Linux 中使用重定向来达成目的][2]。使用重定向操作符,它会将输出保存到文件中而不是在屏幕上显示。 + + * `>` 会将命令输出重定向到文件,它会替换文件中的所有内容。 + * `>>` 会将命令输出添加到文件现有内容的末尾。 + +使用标准输出重定向运算符 `>` 将输出重定向到文件: + +``` +command > file.txt +``` + +如果 `file.txt` 不存在,它会自动创建。如果你使用 `>` 再次重定向到相同的文件,文件内容将被替换为新的输出。 + +下面的示例将更好地演示它。它首先会保存 `ls -l` 命令的输出,然后,它将用 `ls *.c` 命令的输出替换文件的内容。 + +![将命令输出重定向到文件][3] + +如果你不想在保存脚本或命令的输出时丢失现有文件的内容,可以使用 `>>` : + +``` +command >> file.txt +``` + +下面这个例子更好地展示了它: + +![将命令输出重定向到文件][4] + +即使文件不存在,它也会自动创建。 + +温馨提示:将 Linux 命令输出和错误保存到一个文件中。 + +如果 Linux 命令返回错误,那么错误不会保存在文件中。你可以使用 `2>&1` 将命令的输出和错误保存到同一个文件中,如下所示: + +``` +command > file.txt 2>&1 +``` + +通常,`0` 代表标准输入,`1` 代表标准输出,`2` 代表标准错误。在这里,你要将标准错误(`2`) 重定向(`&`)到与标准输出(`1`)相同的地址。 + +### 方法 2:使用 tee 命令显示输出并将其保存到文件中 + +顺便说一句,你是否注意到,当你将命令输出发送到一个文件时,你再也无法在终端上看到它了?[Linux 的 tee 命令][5]解决了这个问题。 + +类似于将水流发送到两个方向的三通管,`tee` 命令将输出发送到终端以及文件(或作为另一个命令的输入)。你可以像这样使用它: + +``` +command | tee file.txt +``` + +同样,如果该文件不存在,它将自动创建。 + +你还可以使用 `tee` 命令 `-a` 选项进入附加模式: + +``` +command | tee -a file.txt +``` + +让我用一些简单的例子来演示: + +![][6] + +我在例子中使用了简单的 Linux 命令。但是请放心,你也可以使用这些方法来保存 bash 脚本的输出。 + +### 注意:将命令输出保存到文件时,避免管道陷阱 + +你可能对管道重定向很熟悉,可以使用它来组合 Linux 命令,但不能将输出通过管道传输到文件,它显示找不到 `output.txt` 命令: + +![][7] + +这是因为管道将一个命令的输出重定向到另一个命令的输入。在本例中,你向它传递一个了一个文件名而它期望一个命令。 + +如果你是一个 Linux 命令行新手,我希望这个快速教程对你的 Linux 知识有所帮助。[I/O 重定向][8]是一个需要注意的基本概念。 + +一如既往,欢迎提出问题和建议。 + +-------------------------------------------------------------------------------- + +via: https://itsfoss.com/save-command-output-to-file-linux/ + +作者:[Abhishek Prakash][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://itsfoss.com/author/abhishek/ +[b]: https://github.com/lujun9972 +[1]: https://itsfoss.com/copy-paste-linux-terminal/ +[2]: https://linuxhandbook.com/redirection-linux/ +[3]: https://i1.wp.com/itsfoss.com/wp-content/uploads/2020/11/redirecting_command_output_to_file_in_linux.png?resize=741%2C456&ssl=1 +[4]: https://i2.wp.com/itsfoss.com/wp-content/uploads/2020/11/redirecting_command_output_to_file.png?resize=741%2C494&ssl=1 +[5]: https://linuxhandbook.com/tee-command/ +[6]: https://i0.wp.com/itsfoss.com/wp-content/uploads/2020/11/display-and-save-linux-command-output.png?resize=741%2C494&ssl=1 +[7]: https://i0.wp.com/itsfoss.com/wp-content/uploads/2020/11/pipe-output-to-file-linux.png?resize=687%2C266&ssl=1 +[8]: https://tldp.org/LDP/abs/html/io-redirection.html#FTN.AEN17894 diff --git a/published/202012/20201125 Get started with Fossil, an alternative to Git.md b/published/202012/20201125 Get started with Fossil, an alternative to Git.md new file mode 100644 index 0000000000..f5f40fb054 --- /dev/null +++ b/published/202012/20201125 Get started with Fossil, an alternative to Git.md @@ -0,0 +1,227 @@ +[#]: collector: "lujun9972" +[#]: translator: "lxbwolf" +[#]: reviewer: "wxy" +[#]: publisher: "wxy" +[#]: url: "https://linux.cn/article-12875-1.html" +[#]: subject: "Get started with Fossil, an alternative to Git" +[#]: via: "https://opensource.com/article/20/11/fossil" +[#]: author: "Klaatu https://opensource.com/users/klaatu" + +了解一下 Fossil,一个 Git 的替代品 +====== + +> Fossil 是一个集版本控制系统、bug 追踪、维基、论坛以及文档解决方案于一体的系统。 + +![](https://img.linux.net.cn/data/attachment/album/202012/01/173057hfhyzyw921zll219.jpg) + +每个开发者都知道,追踪代码的修改是至关重要的。有时候你会处于好奇或者教育的目的需要展示你的项目开始和进化的历史。有时候你想让其他的开发者参与到你的项目中,因此你需要一种值得信赖的能合并不同代码分支的方法。更极端一点,有时候你为了解决一个问题而修改的代码导致已有的功能不能正常使用。 + +[Fossil][2] 源码管理系统是由著名的 [SQLite][3] 数据库的作者开发的一个集版本控制系统、bug 追踪、维基、论坛以及文档解决方案于一体的系统。 + +### 安装 Fossil + +Fossil 是一个独立的 C 程序,因此你可以从它的网站上[下载][4]后放在环境变量 [PATH][5] 中的任意位置。例如,假定 `/usr/local/bin` 已经在你的环境变量中(默认情况下是在的): + +``` +$ wget https://fossil-scm.org/home/uv/fossil-linux-x64-X.Y.tar.gz +$ sudo tar xvf fossil-linux-x64-X.Y.tar.gz --directory /usr/local/bin +``` + +你也可以通过包管理器从软件仓库中找到 Fossil,或者直接从源码编译。 + +### 创建一个 Fossil 仓库 + +如果你已经有一个代码项目,想用 Fossil 来追踪,那么第一步就是创建一个 Fossil 仓库: + +``` +$ fossil init myproject.fossil +project-id: 010836ac6112fefb0b015702152d447c8c1d8604 +server-id:  54d837e9dc938ba1caa56d31b99c35a4c9627f44 +admin-user: klaatu (initial password is "14b605") +``` + +创建 Fossil 仓库的过程中会返回三行信息:一个唯一的项目 ID、一个唯一的服务器 ID 以及管理员 ID 和密码。项目 ID 和服务器 ID 是版本数字。管理员凭证表明你对这个仓库的所有权,当你把 Fossil 作为服务器让其他用户来访问时可以使用管理员权限。 + +### Fossil 仓库工作流 + +在你使用 Fossil 仓库之前,你需要先为它的数据创建一个工作路径。你可以把这个过程类比为使用 Python 时创建一个虚拟环境或者解压一个只用来备份的 ZIP 文件。 + +创建一个工作目录并进入: + +``` +$ mkdir myprojectdir +$ cd myprojectdir +``` + +把你的 Fossil 打开到刚刚创建的目录: + +``` +$ fossil open ../myproject +project-name: +repository: /home/klaatu/myprojectdir/../myproject +local-root: /home/klaatu/myprojectdir/ +config-db: /home/klaatu/.fossil +project-code: 010836ac6112fefb0b015702152d447c8c1d8604 +checkout: 9e6cd96dd675544c58a246520ad58cdd460d1559 2020-11-09 04:09:35 UTC +tags: trunk +comment: initial empty check-in (user: klaatu) +check-ins: 1 +``` + +你可能注意到了,Fossil 在你的家目录下创建了一个名为 `.fossil` 的隐藏文件,用来追踪你的全局 Fossil 配置。这个配置不是只适用于你的一个项目的;这个文件只会在你第一次使用 Fossil 时生成。 + +#### 添加文件 + +使用 `add` 和 `commit` 子命令来向你的仓库添加文件。例如,创建一个简单的 `README` 文件,把它添加到仓库: + +``` +$ echo "My first Fossil project" > README +$ fossil add README +ADDED  README +$ fossil commit -m 'My first commit' +New_Version: 2472a43acd11c93d08314e852dedfc6a476403695e44f47061607e4e90ad01aa +``` + +#### 使用分支 + +Fossil 仓库开始时默认使用的主分支名为 `trunk`。当你想修改代码而又不影响主干代码时,你可以从 trunk 分支切走。创建新分支需要使用 `branch` 子命令,这个命令需要两个参数:一个新分支的名字,一个新分支的基分支名字。在本例中,只有一个分支 `trunk`,因此尝试创建一个名为 `dev` 的新分支: + +``` +$ fossil branch --help +Usage: fossil branch new BRANCH-NAME BASIS ?OPTIONS? +$ fossil branch new dev trunk +New branch: cb90e9c6f23a9c98e0c3656d7e18d320fa52e666700b12b5ebbc4674a0703695 +``` + +你已经创建了一个新分支,但是你当前所在的分支仍然是 `trunk`: + +``` +$ fossil branch current +trunk +``` + +使用 `checkout` 命令切换到你的新分支 `dev`: + +``` +$ fossil checkout dev +dev +``` + +#### 合并修改 + +假设你在 `dev` 分支中添加了一个新文件,完成了测试,现在想把它合并到 `trunk`。这个过程叫做*合并*。 + +首先,切回目标分支(本例中目标分支为 `trunk`): + + +``` +$ fossil checkout trunk +trunk +$ ls +README +``` + +这个分支中没有你的新文件(或者你对其他文件的修改),而那些内容是合并的过程需要的信息: + +``` +$ fossil merge dev + "fossil undo" is available to undo changes to the working checkout. +$ ls +myfile.lua  README +``` + +### 查看 Fossil 时间线 + +使用 `timeline` 选项来查看仓库的历史。这个命令列出了你的仓库的所有活动的详细信息,包括用来表示每次修改的哈希值、每次提交时填写的信息以及提交者: + +``` +$ fossil timeline +=== 2020-11-09 === +06:24:16 [5ef06e668b] added exciting new file (user: klaatu tags: dev) +06:11:19 [cb90e9c6f2] Create new branch named "dev" (user: klaatu tags: dev) +06:08:09 [a2bb73e4a3] *CURRENT* some additions were made (user: klaatu tags: trunk) +06:00:47 [2472a43acd] This is my first commit. (user: klaatu tags: trunk) +04:09:35 [9e6cd96dd6] initial empty check-in (user: klaatu tags: trunk) ++++ no more data (5) +++ +``` + +![Fossil UI][6] + +### 公开你的 Fossil 仓库 + +因为 Fossil 有个内置的 web 界面,所以 Fossil 不像 GitLab 和 Gitea 那样需要主机服务。Fossil 就是它自己的主机服务,只要你把它放在一台机器上就行了。在你公开你的 Fossil 仓库之前,你还需要通过 web 用户界面(UI)来配置一些信息: + +使用 `ui` 子命令启动一个本地的实例: + +``` +$ pwd +/home/klaatu/myprojectdir/ +$ fossil ui +``` + +“Users” 和 “Settings” 是安全相关的,“Configuration” 是项目属性相关的(包括一个合适的标题)。web 界面不仅仅是一个方便的功能。 它是能在生产环境中使用并作为 Fossil 项目的宿主机来使用的。它还有一些其他的高级选项,比如用户管理(或者叫自我管理)、在同一个服务器上与其他的 Fossil 仓库进行单点登录(SSO)。 + +当配置完成后,关掉 web 界面并按下 `Ctrl+C` 来停止 UI 引擎。像提交代码一样提交你的 web 修改。 + +``` +$ fossil commit -m 'web ui updates' +New_Version: 11fe7f2855a3246c303df00ec725d0fca526fa0b83fa67c95db92283e8273c60 +``` + +现在你可以配置你的 Fossil 服务器了。 + + 1. 把你的 Fossil 仓库(本例中是 `myproject.fossil`)复制到服务器,你只需要这一个文件。 + 2. 如果你的服务器没有安装 Fossil,就在你的服务器上安装 Fossil。在服务器上安装的过程跟在本地一样。 + 3. 在你的 `cgi-bin` 目录下(或它对应的目录,这取决于你的 HTTP 守护进程)创建一个名为 `repo_myproject.cgi` 的文件: + +``` +#!/usr/local/bin/fossil +repository: /home/klaatu/public_html/myproject.fossil +``` + +添加可执行权限: + +``` +$ chmod +x repo_myproject.cgi +``` + +你需要做的都已经做完了。现在可以通过互联网访问你的项目了。 + +你可以通过 CGI 脚本来访问 web UI,例如 `https://example.com/cgi-bin/repo_myproject.cgi`。 + +你也可以通过命令行来进行交互: + +``` +$ fossil clone https://klaatu@example.com/cgi-bin/repo_myproject.cgi +``` + +在本地的克隆仓库中工作时,你需要使用 `push` 子命令把本地的修改推送到远程的仓库,使用 `pull` 子命令把远程的修改拉取到本地仓库: + +``` +$ fossil push https://klaatu@example.com/cgi-bin/repo_myproject.cgi +``` + +### 使用 Fossil 作为独立的托管 + +Fossil 将大量的权力交到了你的手中(以及你的合作者的手中),让你不再依赖托管服务。本文只是简单的介绍了基本概念。你的代码项目还会用到很多有用的 Fossil 功能。尝试一下 Fossil。它不仅会改变你对版本控制的理解;它会让你不再考虑其他的版本控制系统。 + +-------------------------------------------------------------------------------- + +via: https://opensource.com/article/20/11/fossil + +作者:[Klaatu][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/klaatu +[b]: https://github.com/lujun9972 +[1]: https://opensource.com/sites/default/files/styles/image-full-size/public/lead-images/osdc_dinosaur_sunset.png?itok=lbzpbW5p "Dinosaurs on land at sunset" +[2]: https://fossil-scm.org/home/doc/trunk/www/index.wiki +[3]: https://www.sqlite.org/index.html +[4]: https://fossil-scm.org/home/uv/download.html +[5]: https://opensource.com/article/17/6/set-path-linux +[6]: https://opensource.com/sites/default/files/uploads/fossil-ui.jpg "Fossil UI" +[7]: https://creativecommons.org/licenses/by-sa/4.0/ diff --git a/published/202012/20201125 Keep track of multiple Git remote repositories.md b/published/202012/20201125 Keep track of multiple Git remote repositories.md new file mode 100644 index 0000000000..4c1ce8711e --- /dev/null +++ b/published/202012/20201125 Keep track of multiple Git remote repositories.md @@ -0,0 +1,94 @@ +[#]: collector: (lujun9972) +[#]: translator: (geekpi) +[#]: reviewer: (wxy) +[#]: publisher: (wxy) +[#]: url: (https://linux.cn/article-12911-1.html) +[#]: subject: (Keep track of multiple Git remote repositories) +[#]: via: (https://opensource.com/article/20/11/multiple-git-repositories) +[#]: author: (Peter Portante https://opensource.com/users/portante) + +跟踪多个 Git 远程仓库 +====== + +> 拥有一致的命名标准是保持本地和上游 Git 仓库保持一致的关键。 + +![](https://img.linux.net.cn/data/attachment/album/202012/11/220828tjt9qlpmg1opvibq.jpg) + +当本地 Git 仓库的命名与远程仓库不一致时,与远程仓库协作就会变得很混乱。 + +解决此问题的一个方法是标准化两个词的使用和含义:`origin` 指的是你个人的 `example.com//*` 仓库,而 `upstream` 指的是你从 `origin` 仓库复刻fork出来的 `example.com` 仓库。换句话说,`upstream` 指的是公开提交工作的上游仓库,而 `origin` 指的是你对上游仓库的本地复刻,例如,你从这里生成拉取请求pull request(PR)。 + +以 [pbench][2] 仓库为例,下面是一个逐步建立新的本地克隆的方法,其中 `origin` 和 `upstream` 的定义是一致的。 + +1、在大多数 Git 托管服务上,当你想在上面工作时,必须对它进行复刻。当你运行自己的 Git 服务器时,这并不是必要的,但对于一个公开的代码库来说,这是一个在贡献者之间传输差异的简单方法。 + +创建一个 Git 仓库的复刻。在这个例子中,假设你的复刻位于 `example.com//pbench`。 + +2、接下来,你必须获得一个统一资源标识符 ([URI][3]),以便通过 SSH 进行克隆cloning。在大多数 Git 托管服务上,比如 GitLab 或 GitHub,它在一个标有 “Clone” 或 “Clone over SSH” 的按钮或面板上,可以将克隆 URI 复制到剪贴板中。 + +3、在你的开发系统中,使用你复制的 URI 克隆仓库: + +``` +$ git clone git@example.com:/pbench.git +``` + +这将以默认名称 `origin` 来克隆 Git 仓库,作为你的 `pbench` 仓库复刻副本。 + +4、切换到刚才克隆的目录: + +``` +$ cd ~/pbench +``` + +5、下一步,获取源仓库的 SSH URI(你最初复刻的那个)。这可能和上面的方法一样。找到 “Clone” 按钮或面板,复制克隆地址。在软件开发中,这通常被称为“上游”,因为(理论上)这是大多数提交发生的地方,而你打算让这些提交流向下游的仓库。 + +6、将 URI 添加到你的本地仓库中。是的,将有*两个不同*的远程仓库分配给你的本地仓库副本: + +``` +$ git remote add upstream git@example.com:bigproject/pbench.git +``` + +7、现在你有两个命名远程仓库:`origin` 和 `upstream`。 你可以用 `remote` 子命令查看你的远程仓库: + +``` +$ git remote -v +``` + +现在,你的本地 `master` 分支正在跟踪 `origin` 的 `master`,这不一定是你想要的。你可能想跟踪这个分支的 `upstream` 版本,因为大多数开发都在上游进行。这个想法是,你要在从上游获得的内容的基础上添加更改。 + +8、将你的本地的 `master` 分支改成跟踪 `upstream/master`: + +``` +$ git fetch upstream +$ git branch --set-upstream-to=upstream/master master +``` + +你可以对任何你想要的分支这样做,而不仅仅是 `master`。例如,有些项目使用 `dev` 分支来处理所有不稳定的变化,而将 `master` 保留给已批准发布的代码。 + +9、一旦你设置了你的跟踪分支,一定要变基(`rebase`)你的 `master` 分支,使它与上游仓库的任何新变化保持一致: + +``` +$ git remote update +$ git checkout master +$ git rebase +``` + +这是一个保持 Git 仓库在不同复刻之间同步的好方法。如果你想自动完成这项工作,请阅读 Seth Kenlon 关于[使用 Ansible 托管 Git 仓库][4]的文章。 + +-------------------------------------------------------------------------------- + +via: https://opensource.com/article/20/11/multiple-git-repositories + +作者:[Peter Portante][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/portante +[b]: https://github.com/lujun9972 +[1]: https://opensource.com/sites/default/files/styles/image-full-size/public/lead-images/rh_003588_01_rd3os.combacktoschoolseriesk12_rh_021x_0.png?itok=fvorN0e- (Digital hand surrounding by objects, bike, light bulb, graphs) +[2]: https://github.com/distributed-system-analysis/pbench +[3]: https://en.wikipedia.org/wiki/Uniform_Resource_Identifier +[4]: https://opensource.com/article/19/11/how-host-github-gitlab-ansible diff --git a/published/202012/20201127 Getting started with Fedora CoreOS.md b/published/202012/20201127 Getting started with Fedora CoreOS.md new file mode 100644 index 0000000000..7f9a72b2da --- /dev/null +++ b/published/202012/20201127 Getting started with Fedora CoreOS.md @@ -0,0 +1,222 @@ +[#]: collector: (lujun9972) +[#]: translator: (wxy) +[#]: reviewer: (wxy) +[#]: publisher: (wxy) +[#]: url: (https://linux.cn/article-12912-1.html) +[#]: subject: (Getting started with Fedora CoreOS) +[#]: via: (https://fedoramagazine.org/getting-started-with-fedora-coreos/) +[#]: author: (Clément Verna https://fedoramagazine.org/author/cverna/) + +Fedora CoreOS 入门 +====== + +![Fedora CoreOS入门][1] + +现在被称为 DevOps 时代,操作系统的关注度似乎比工具要低一些。然而,这并不意味着操作系统没有创新。(编辑注:基于 Linux 内核的众多发行版所提供的多样化产品就是一个很好的例子)。[Fedora CoreOS][4] 就对这个 DevOps 时代的操作系统应该是什么样有着独特的理念。 + +### Fedora CoreOS 的理念 + +Fedora CoreOS(FCOS)是由 CoreOS Container Linux 和 Fedora Atomic Host 合并而来。它是一个专注于运行容器化应用程序的精简的独体操作系统。安全性是首要重点,FCOS 提供了自动更新,并带有 SELinux 强化。 + +为了使自动更新能够很好地工作,它们需要非常健壮,目标是运行 FCOS 的服务器在更新后不会崩溃。这是通过使用不同的发布流(stable、testing 和 next)来实现的。每个流每 2 周发布一次,更新内容会从一个流推广到另一个流(next -> testing -> stable)。这样落地在 stable 流中的更新就有机会经过长时间的测试。 + +### 入门 + +对于这个例子,让我们使用 stable 流和一个 QEMU 基础镜像,我们可以作为一个虚拟机运行。你可以使用 [coreos-installer][5] 来下载该镜像。 + +在你的(Workstation)终端上,更新镜像的链接后,运行以下命令(编辑注:在 Silverblue 上,基于容器的 coreos 工具是最简单的方法,可以尝试一下。说明可以在 中找到,特别是 “Setup with Podman or Docker” 一节。): + +``` +$ sudo dnf install coreos-installer +$ coreos-installer download --image-url https://builds.coreos.fedoraproject.org/prod/streams/stable/builds/32.20200907.3.0/x86_64/fedora-coreos-32.20200907.3.0-qemu.x86_64.qcow2.xz +$ xz -d fedora-coreos-32.20200907.3.0-qemu.x86_64.qcow2.xz +$ ls +fedora-coreos-32.20200907.3.0-qemu.x86_64.qcow2 +``` + +#### 创建一个配置 + +要定制一个 FCOS 系统,你需要提供一个配置文件,[Ignition][6] 将使用这个文件来配置系统。你可以用这个文件来配置诸如创建用户、添加受信任的 SSH 密钥、启用 systemd 服务等等。 + +以下配置创建了一个 `core` 用户,并在 `authorized_keys` 文件中添加了一个 SSH 密钥。它还创建了一个 systemd 服务,使用 [podman][7] 来运行一个简单的 “hello world” 容器: + +``` +version: "1.0.0" +variant: fcos +passwd: + users: + - name: core + ssh_authorized_keys: + - ssh-ed25519 my_public_ssh_key_hash fcos_key +systemd: + units: + - + contents: | + [Unit] + Description=Run a hello world web service + After=network-online.target + Wants=network-online.target + [Service] + ExecStart=/bin/podman run --pull=always --name=hello --net=host -p 8080:8080 quay.io/cverna/hello + ExecStop=/bin/podman rm -f hello + [Install] + WantedBy=multi-user.target + enabled: true + name: hello.service +``` + +在配置中加入你的 SSH 密钥后,将其保存为 `config.yaml`。接下来使用 Fedora CoreOS Config Transpiler(`fcct`)工具将这个 YAML 配置转换成有效的 Ignition 配置(JSON 格式)。 + +直接从 Fedora 的资源库中安装 `fcct`,或者从 [GitHub][8] 中获取二进制文件: + +``` +$ sudo dnf install fcct +$ fcct -output config.ign config.yaml +``` + +#### 安装并运行 Fedora CoreOS + +要运行镜像,你可以使用 libvirt 堆栈。要在 Fedora 系统上使用 `dnf` 软件包管理器安装它: + +``` +$ sudo dnf install @virtualization +``` + +现在让我们创建并运行一个 Fedora CoreOS 虚拟机: + +``` +$ chcon --verbose unconfined_u:object_r:svirt_home_t:s0 config.ign +$ virt-install --name=fcos \ +--vcpus=2 \ +--ram=2048 \ +--import \ +--network=bridge=virbr0 \ +--graphics=none \ +--qemu-commandline="-fw_cfg name=opt/com.coreos/config,file=${PWD}/config.ign" \ +--disk=size=20,backing_store=${PWD}/fedora-coreos-32.20200907.3.0-qemu.x86_64.qcow2 +``` + +安装成功后,会显示一些信息并提供登录提示符: + +``` +Fedora CoreOS 32.20200907.3.0 +Kernel 5.8.10-200.fc32.x86_64 on an x86_64 (ttyS0) +SSH host key: SHA256:BJYN7AQZrwKZ7ZF8fWSI9YRhI++KMyeJeDVOE6rQ27U (ED25519) +SSH host key: SHA256:W3wfZp7EGkLuM3z4cy1ZJSMFLntYyW1kqAqKkxyuZrE (ECDSA) +SSH host key: SHA256:gb7/4Qo5aYhEjgoDZbrm8t1D0msgGYsQ0xhW5BAuZz0 (RSA) +ens2: 192.168.122.237 fe80::5054:ff:fef7:1a73 +Ignition: user provided config was applied +Ignition: wrote ssh authorized keys file for user: core +``` + +Ignition 配置文件没有为 `core` 用户提供任何密码,因此无法通过控制台直接登录。(不过,也可以通过 Ignition 配置为用户配置密码。) + +使用 `Ctrl + ]` 组合键退出虚拟机的控制台。然后检查 `hello.service` 是否在运行: + +``` +$ curl http://192.168.122.237:8080 +Hello from Fedora CoreOS! +``` + +使用预先配置的 SSH 密钥,你还可以访问虚拟机并检查其上运行的服务: + +``` +$ ssh core@192.168.122.237 +$ systemctl status hello +● hello.service - Run a hello world web service +Loaded: loaded (/etc/systemd/system/hello.service; enabled; vendor preset: enabled) +Active: active (running) since Wed 2020-10-28 10:10:26 UTC; 42s ago +``` + +#### zincati、rpm-ostree 和自动更新 + +zincati 服务使用自动更新驱动 rpm-ostreed。 + +检查虚拟机上当前运行的 Fedora CoreOS 版本,并检查 zincati 是否找到了更新: + +``` +$ ssh core@192.168.122.237 +$ rpm-ostree status +State: idle +Deployments: +● ostree://fedora:fedora/x86_64/coreos/stable +Version: 32.20200907.3.0 (2020-09-23T08:16:31Z) +Commit: b53de8b03134c5e6b683b5ea471888e9e1b193781794f01b9ed5865b57f35d57 +GPGSignature: Valid signature by 97A1AE57C3A2372CCA3A4ABA6C13026D12C944D0 +$ systemctl status zincati +● zincati.service - Zincati Update Agent +Loaded: loaded (/usr/lib/systemd/system/zincati.service; enabled; vendor preset: enabled) +Active: active (running) since Wed 2020-10-28 13:36:23 UTC; 7s ago +… +Oct 28 13:36:24 cosa-devsh zincati[1013]: [INFO ] initialization complete, auto-updates logic enabled +Oct 28 13:36:25 cosa-devsh zincati[1013]: [INFO ] target release '32.20201004.3.0' selected, proceeding to stage it + +... zincati reboot ... +``` + +重启后,我们再远程登录一次,检查新版的 Fedora CoreOS: + +``` +$ ssh core@192.168.122.237 +$ rpm-ostree status +State: idle +Deployments: +● ostree://fedora:fedora/x86_64/coreos/stable +Version: 32.20201004.3.0 (2020-10-19T17:12:33Z) +Commit: 64bb377ae7e6949c26cfe819f3f0bd517596d461e437f2f6e9f1f3c24376fd30 +GPGSignature: Valid signature by 97A1AE57C3A2372CCA3A4ABA6C13026D12C944D0 +ostree://fedora:fedora/x86_64/coreos/stable +Version: 32.20200907.3.0 (2020-09-23T08:16:31Z) +Commit: b53de8b03134c5e6b683b5ea471888e9e1b193781794f01b9ed5865b57f35d57 +GPGSignature: Valid signature by 97A1AE57C3A2372CCA3A4ABA6C13026D12C944D0 +``` + +`rpm-ostree status` 现在显示了两个版本的 Fedora CoreOS,一个是 QEMU 镜像中的版本,一个是更新后的最新版本。有了这两个版本,就可以使用 `rpm-ostree rollback` 命令回滚到之前的版本。 + +最后,你可以确保 hello 服务仍在运行并提供内容: + +``` +$ curl http://192.168.122.237:8080 +Hello from Fedora CoreOS! +``` + +更多信息参见:[Fedora CoreOS 更新][9]。 + +#### 删除虚拟机 + +要进行事后清理,使用以下命令删除虚拟机和相关存储: + +``` +$ virsh destroy fcos +$ virsh undefine --remove-all-storage fcos +``` + +### 结论 + +Fedora CoreOS 为在容器中运行应用程序提供了一个坚实而安全的操作系统。它在推荐主机使用声明式配置文件进行配置的 DevOps 环境中表现出色。自动更新和回滚到以前版本的操作系统的能力,可以在服务的运行过程中带来安心的感觉。 + +通过关注项目[文档][10]中的教程,了解更多关于 Fedora CoreOS 的信息。 + +-------------------------------------------------------------------------------- + +via: https://fedoramagazine.org/getting-started-with-fedora-coreos/ + +作者:[Clément Verna][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://fedoramagazine.org/author/cverna/ +[b]: https://github.com/lujun9972 +[1]: https://fedoramagazine.org/wp-content/uploads/2020/11/fcos-gettingstarted-1-816x345.jpg +[2]: https://unsplash.com/@pawel_czerwinski?utm_source=unsplash&utm_medium=referral&utm_content=creditCopyText +[3]: https://unsplash.com/s/photos/core?utm_source=unsplash&utm_medium=referral&utm_content=creditCopyText +[4]: https://getfedora.org/coreos/ +[5]: https://github.com/coreos/coreos-installer/releases +[6]: https://github.com/coreos/ignition +[7]: https://podman.io/ +[8]: https://github.com/coreos/fcct/releases +[9]: https://docs.fedoraproject.org/en-US/fedora-coreos/auto-updates/ +[10]: https://docs.fedoraproject.org/en-US/fedora-coreos/tutorials/ diff --git a/published/202012/20201129 How to Go Full Dark Mode With LibreOffice.md b/published/202012/20201129 How to Go Full Dark Mode With LibreOffice.md new file mode 100644 index 0000000000..21ca4829cb --- /dev/null +++ b/published/202012/20201129 How to Go Full Dark Mode With LibreOffice.md @@ -0,0 +1,82 @@ +[#]: collector: (lujun9972) +[#]: translator: (geekpi) +[#]: reviewer: (wxy) +[#]: publisher: (wxy) +[#]: url: (https://linux.cn/article-12893-1.html) +[#]: subject: (How to Go Full Dark Mode With LibreOffice) +[#]: via: (https://itsfoss.com/libreoffice-dark-mode/) +[#]: author: (Dimitrios Savvopoulos https://itsfoss.com/author/dimitrios/) + +如何在 LibreOffice 中完全启用深色模式 +====== + +![](https://img.linux.net.cn/data/attachment/album/202012/07/083812n0zgss9qt175pm9z.jpg) + +[LibreOffice][1] 是一款自由开源的跨平台办公生产力软件。如果你没有充分利用它,那么必须看下 [LibreOffice 小技巧][2]。 + +甚至在非编程人员中,深色主题也越来越受欢迎。它减轻了眼睛的压力,特别适合长时间使用屏幕。有人认为,这使文本看起来清晰明了,有助于提高生产率。 + +如今,某些 Linux 发行版例如 [Ubuntu 带有深色模式][3],使你的系统具有更暗的色彩。当你打开深色模式dark mode时,某些应用将自动切换到深色模式。 + +LibreOffice 也会这样,但你编辑的主区域除外: + +![LibreOffice semi dark mode matching with the system theme][4] + +你可以更改它。如果要让 LibreOffice 进入完全深色模式,只需更改一些设置。让我告诉你如何做。 + +### 如何在 LibreOffice 中完全启用深色模式 + +如前所述,你需要先启用系统范围的深色模式。这样可以确保窗口颜色(或标题栏)与应用内深色完全融合。 + +接下来,打开套件中的**任意** LibreOffice 应用,例如 **Writer**。然后从菜单中,依次点击 **Tools -> Options -> Application Colors**,然后选择 **Document background 和 Application background** 为 **Black** 或 **Automatic**(任意适合你的方式)。 + +![][5] + +如果图标不是深色,那么可以从菜单(如下图所示)中更改它们,**Tools -> Options -> View** ,我在 MX Linux 上的个人选择是 Ubuntu 的 [Yaru][6] 图标样式(如果你使用的图标包为深色版本,请选择它) 。 + +![][7] + +当然,你也可以尝试其他 Linux 发行版的 [icon 主题][8]。 + +最终结果应如下所示: + +![][9] + +#### LibreOffice flatpak 软件包的其他技巧 + +如果你使用的是 LibreOffice 套件的 [Flatpak 软件包][10],那么 LibreOffice 的标题区域(或菜单区域)可能看起来是白色的。在这种情况下,你可以尝试进入 **Tools -> Options -> Personalization**,然后选择 “**灰色主题**”,如下截图所示。 + +![][11] + +它并不完全是黑色的,但应该可以使外观看起来更好。希望可以帮助你切换到深色主题的 LibreOffice 体验! + +#### 总结 + +深色主题逐渐开始在我们的台式机中占主导地位,它具有现代品味并减少了眼睛疲劳,尤其是在弱光条件下。 + +LibreOffice 使你可以自由地将工作环境切换为深色主题或保留浅色主题元素。实际上,你将有大量的自定义选项来调整你喜欢的内容。你是否已在 LibreOffice 上切换为深色主题?你首选哪种颜色组合?在下面的评论中让我们知道! + +-------------------------------------------------------------------------------- + +via: https://itsfoss.com/libreoffice-dark-mode/ + +作者:[Dimitrios Savvopoulos][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/dimitrios/ +[b]: https://github.com/lujun9972 +[1]: https://www.libreoffice.org +[2]: https://itsfoss.com/libreoffice-tips/ +[3]: https://itsfoss.com/dark-mode-ubuntu/ +[4]: https://i1.wp.com/itsfoss.com/wp-content/uploads/2020/11/libreOffice-dark-mode.png?resize=799%2C450&ssl=1 +[5]: https://i1.wp.com/itsfoss.com/wp-content/uploads/2020/11/1-libreoffice-application-colours.png?resize=800%2C551&ssl=1 +[6]: https://extensions.libreoffice.org/en/extensions/show/yaru-icon-theme +[7]: https://i0.wp.com/itsfoss.com/wp-content/uploads/2020/11/2-libreoffice-iconstyle-1.png?resize=800%2C531&ssl=1 +[8]: https://itsfoss.com/best-icon-themes-ubuntu-16-04/ +[9]: https://i2.wp.com/itsfoss.com/wp-content/uploads/2020/11/3-libreoffice-dark.png?resize=800%2C612&ssl=1 +[10]: https://itsfoss.com/what-is-flatpak/ +[11]: https://i2.wp.com/itsfoss.com/wp-content/uploads/2020/11/libre-office-personalization.png?resize=800%2C636&ssl=1 diff --git a/published/202012/20201130 8 Git aliases that make me more efficient.md b/published/202012/20201130 8 Git aliases that make me more efficient.md new file mode 100644 index 0000000000..67e9e75811 --- /dev/null +++ b/published/202012/20201130 8 Git aliases that make me more efficient.md @@ -0,0 +1,256 @@ +[#]: collector: (lujun9972) +[#]: translator: (wxy) +[#]: reviewer: (wxy) +[#]: publisher: (wxy) +[#]: url: (https://linux.cn/article-12904-1.html) +[#]: subject: (8 Git aliases that make me more efficient) +[#]: via: (https://opensource.com/article/20/11/git-aliases) +[#]: author: (Ricardo Gerardi https://opensource.com/users/rgerardi) + +8 个让我更有效率的 Git 别名 +====== + +> 使用别名为你最常用或复杂的 Git 命令创建快捷方式。 + +![](https://img.linux.net.cn/data/attachment/album/202012/09/202245q50ss5kncqc241sf.jpg) + +这篇出色的文章《[改变我使用 Git 工作方式的七个技巧][2]》启发了我写下另一个对我在命令行上使用 Git 的经验有重大影响的 Git 特性:别名。 + +定义 Git 的别名来替代命令有两大好处。 + + * 它简化了有许多选项的长命令,使它们更短,更容易记住。 + * 缩短了经常使用的命令,使你的工作更有效率。 + +### 如何定义和使用别名 + +要定义 Git 的别名,请使用 `git config` 命令,加上别名和要替换的命令。例如,要为 `git push` 创建别名 `p`: + +``` +$ git config --global alias.p 'push' +``` + +你可以通过将别名作为 `git` 的参数来使用别名,就像其他命令一样: + +``` +$ git p +``` + +要查看所有的别名,用 `git config` 列出你的配置: + +``` +$ git config --global -l +user.name=ricardo +user.email=ricardo@example.com +alias.p=push +``` + +你也可以用你喜欢的 shell 来定义别名,比如 Bash 或 Zsh。不过,用 Git 定义别名有几个功能是用 shell 无法实现的。首先,它允许你在不同的 shell 中使用别名,而无需额外配置。此外,它还集成了 Git 的自动更正功能,所以当你输入错误的命令时,Git 可以建议你正确的别名。最后,Git 还会将别名保存在用户配置文件中,你可以通过复制一个文件将别名转移到其他机器上。 + +无论使用哪种方法,定义别名都能改善你使用 Git 的整体体验。更多关于定义 Git 别名的信息,请看《[Git Book][4]》。 + +### 8 个有用的 Git 别名 + +现在你知道如何创建和使用别名了,来看看一些有用的别名。 + +#### 1、Git 状态 + +Git 命令行用户经常使用 `status` 命令来查看已更改或未跟踪的文件。默认情况下,这个命令提供了很多行的冗长输出,你可能不想要或不需要。你可以使用一个别名来处理这两个组件。定义别名 `st` 来缩短命令,并使用选项 `-sb` 来输出一个不那么啰嗦的状态和分支信息。 + +``` +$ git config --global alias.st 'status -sb' +``` + +如果你在一个干净的分支上使用这个别名,你的输出就像这样: + +``` +$  git st +## master +``` + +在一个带有已更改和未跟踪文件的分支上使用它,会产生这样的输出: + +``` +$ git st +## master + M test2 +?? test3 +``` + +#### 2、Git 单行日志 + +创建一个别名,以单行方式显示你的提交,使输出更紧凑: + +``` +$ git config --global alias.ll 'log --oneline' +``` + +使用这个别名可以提供所有提交的简短列表: + +``` +$ git ll +33559c5 (HEAD -> master) Another commit +17646c1 test1 +``` + +#### 3、Git 的最近一次提交 + +这将显示你最近一次提交的详细信息。这是扩展了《Git Book》中 [别名][4] 一章的例子: + +``` +$ git config --global alias.last 'log -1 HEAD --stat' +``` + +用它来查看最后的提交: + +``` +$ git last +commit f3dddcbaabb928f84f45131ea5be88dcf0692783 (HEAD -> branch1) +Author: ricardo +Date:   Tue Nov 3 00:19:52 2020 +0000 + +    Commit to branch1 + + test2 | 1 + + test3 | 0 + 2 files changed, 1 insertion(+) +``` + +#### 4、Git 提交 + +当你对 Git 仓库进行修改时,你会经常使用 `git commit`。使用 `cm` 别名使 `git commit -m` 命令更有效率: + +``` +$ git config --global alias.cm 'commit -m' +``` + +因为 Git 别名扩展了命令,所以你可以在执行过程中提供额外的参数: + +``` +$ git cm "A nice commit message" +[branch1 0baa729] A nice commit message + 1 file changed, 2 insertions(+) +``` + +#### 5、Git 远程仓库 + +`git remote -v` 命令列出了所有配置的远程仓库。用别名 `rv` 将其缩短: + +``` +$ git config --global alias.rv 'remote -v' +``` + +#### 6、Git 差异 + +`git diff` 命令可以显示不同提交的文件之间的差异,或者提交和工作树之间的差异。用 `d` 别名来简化它: + +``` +$ git config --global alias.d 'diff' +``` + +标准的 `git diff` 命令对小的改动很好用,但对于比较复杂的改动,外部工具如 `vimdiff` 就更有用。创建别名 `dv` 来使用 `vimdiff` 显示差异,并使用 `y` 参数跳过确认提示: + +``` +$ git config --global alias.dv 'difftool -t vimdiff -y' +``` + +使用这个别名来显示两个提交之间的 `file1` 差异: + +``` +$ git dv 33559c5 ca1494d file1 +``` + +![vim-diff results][5] + +#### 7、Git 配置列表 + +`gl` 别名可以更方便地列出所有用户配置: + +``` +$ git config --global alias.gl 'config --global -l' +``` + +现在你可以看到所有定义的别名(和其他配置选项): + +``` +$ git gl +user.name=ricardo +user.email=ricardo@example.com +alias.p=push +alias.st=status -sb +alias.ll=log --oneline +alias.last=log -1 HEAD --stat +alias.cm=commit -m +alias.rv=remote -v +alias.d=diff +alias.dv=difftool -t vimdiff -y +alias.gl=config --global -l +alias.se=!git rev-list --all | xargs git grep -F +``` + +#### 8、搜索提交 + +Git 别名允许你定义更复杂的别名,比如执行外部 shell 命令,可以在别名前加上 `!` 字符。你可以用它来执行自定义脚本或更复杂的命令,包括 shell 管道。 + +例如,定义 `se` 别名来搜索你的提交: + +``` +$ git config --global alias.se '!git rev-list --all | xargs git grep -F' +``` + +使用这个别名来搜索提交中的特定字符串: + +``` +$ git se test2 +0baa729c1d683201d0500b0e2f9c408df8f9a366:file1:test2 +ca1494dd06633f08519ec43b57e25c30b1c78b32:file1:test2 +``` + +### 自动更正你的别名 + +使用 Git 别名的一个很酷的好处是它与自动更正功能的原生集成。如果你犯了错误,默认情况下,Git 会建议使用与你输入的命令相似的命令,包括别名。例如,如果你把 `status` 打成了 `ts`,而不是 `st`,Git 会推荐正确的别名: + +``` +$ git ts +git: 'ts' is not a git command. See 'git --help'. + +The most similar command is +        st +``` + +如果你启用了自动更正功能,Git 会自动执行正确的命令: + +``` +$ git config --global help.autocorrect 20 +$ git ts +WARNING: You called a Git command named 'ts', which does not exist. +Continuing in 2.0 seconds, assuming that you meant 'st'. +## branch1 +?? test4 +``` + +### 优化 Git 命令 + +Git 别名是一个很有用的功能,它可以优化常见的重复性命令的执行,从而提高你的效率。Git 允许你定义任意数量的别名,有些用户会定义很多别名。我更喜欢只为最常用的命令定义别名 —— 定义太多别名会让人难以记忆,而且可能需要查找才能使用。 + +更多关于别名的内容,包括其他有用的内容,请参见 [Git 维基的别名页面][7]。 + +-------------------------------------------------------------------------------- + +via: https://opensource.com/article/20/11/git-aliases + +作者:[Ricardo Gerardi][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/rgerardi +[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-12894-1.html +[3]: mailto:ricardo@example.com +[4]: https://git-scm.com/book/en/v2/Git-Basics-Git-Aliases +[5]: https://opensource.com/sites/default/files/uploads/vimdiff.png (vim-diff results) +[6]: https://creativecommons.org/licenses/by-sa/4.0/ +[7]: https://git.wiki.kernel.org/index.php/Aliases diff --git a/published/202012/20201130 An attempt at implementing char-rnn with PyTorch.md b/published/202012/20201130 An attempt at implementing char-rnn with PyTorch.md new file mode 100644 index 0000000000..ba59937319 --- /dev/null +++ b/published/202012/20201130 An attempt at implementing char-rnn with PyTorch.md @@ -0,0 +1,194 @@ +[#]: collector: (lujun9972) +[#]: translator: (zxp93) +[#]: reviewer: (wxy) +[#]: publisher: (wxy) +[#]: url: (https://linux.cn/article-12932-1.html) +[#]: subject: (An attempt at implementing char-rnn with PyTorch) +[#]: via: (https://jvns.ca/blog/2020/11/30/implement-char-rnn-in-pytorch/) +[#]: author: (Julia Evans https://jvns.ca/) + +用 PyTorch 实现基于字符的循环神经网络 +====== + +![](https://img.linux.net.cn/data/attachment/album/202012/19/102319oe36em6d63bolg0i.jpg) + +在过去的几周里,我花了很多时间用 PyTorch 实现了一个 [char-rnn][1] 的版本。我以前从未训练过神经网络,所以这可能是一个有趣的开始。 + +这个想法(来自 [循环神经网络的不合理效应][1])可以让你在文本上训练一个基于字符的循环神经网络recurrent neural network(RNN),并得到一些出乎意料好的结果。 + +不过,虽然没有得到我想要的结果,但是我还是想分享一些示例代码和结果,希望对其他开始尝试使用 PyTorch 和 RNN 的人有帮助。 + +这是 Jupyter 笔记本格式的代码:[char-rnn in PyTorch.ipynb][2]。你可以点击这个网页最上面那个按钮 “Open in Colab”,就可以在 Google 的 Colab 服务中打开,并使用免费的 GPU 进行训练。所有的东西加起来大概有 75 行代码,我将在这篇博文中尽可能地详细解释。 + +### 第一步:准备数据 + +首先,我们要下载数据。我使用的是古登堡项目Project Gutenberg中的这个数据:[Hans Christian Anderson’s fairy tales][3]。 + +``` +!wget -O fairy-tales.txt +``` + +这个是准备数据的代码。我使用 `fastai` 库中的 `Vocab` 类进行数据处理,它能将一堆字母转换成“词表”,然后用这个“词表”把字母变成数字。 + +之后我们就得到了一个大的数字数组(`training_set`),我们可以用于训练我们的模型。 + +``` +from fastai.text import * +text = unidecode.unidecode(open('fairy-tales.txt').read()) +v = Vocab.create((x for x in text), max_vocab=400, min_freq=1) +training_set = torch.Tensor(v.numericalize([x for x in text])).type(torch.LongTensor).cuda() +num_letters = len(v.itos) +``` + +### 第二步:定义模型 + +这个是 PyTorch 中 `LSTM` 类的封装。除了封装 `LSTM` 类以外,它还做了三件事: + + 1. 对输入向量进行 one-hot 编码,使得它们具有正确的维度。 + 2. 在 `LSTM` 层后一层添加一个线性变换,因为 `LSTM` 输出的是一个长度为 `hidden_size` 的向量,我们需要的是一个长度为 `input_size` 的向量这样才能把它变成一个字符。 + 3. 把 `LSTM` 隐藏层的输出向量(实际上有 2 个向量)保存成实例变量,然后在每轮运行结束后执行 `.detach()` 函数。(我很难解释清 `.detach()` 的作用,但我的理解是,它在某种程度上“结束”了模型的求导计算)(LCTT 译注:`detach()` 函数是将该张量的 `requires_grad` 参数设置为 `False`,即反向传播到该张量就结束。) + +``` +class MyLSTM(nn.Module): + def __init__(self, input_size, hidden_size): + super().__init__() + self.lstm = nn.LSTM(input_size, hidden_size, batch_first=True) + self.h2o = nn.Linear(hidden_size, input_size) + self.input_size=input_size + self.hidden = None + + def forward(self, input): + input = torch.nn.functional.one_hot(input, num_classes=self.input_size).type(torch.FloatTensor).cuda().unsqueeze(0) + if self.hidden is None: + l_output, self.hidden = self.lstm(input) + else: + l_output, self.hidden = self.lstm(input, self.hidden) + self.hidden = (self.hidden[0].detach(), self.hidden[1].detach()) + + return self.h2o(l_output) +``` + +这个代码还做了一些比较神奇但是不太明显的功能。如果你的输入是一个向量(比如 `[1,2,3,4,5,6]`),对应六个字母,那么我的理解是 `nn.LSTM` 会在内部使用[沿时间反向传播][4]更新隐藏向量 6 次。 + +### 第三步:编写训练代码 + +模型不会自己训练的! + +我最开始的时候尝试用 `fastai` 库中的一个辅助类(也是 PyTorch 中的封装)。我有点疑惑因为我不知道它在做什么,所以最后我自己编写了模型训练代码。 + +下面这些代码(`epoch()` 方法)就是有关于一轮训练过程的基本信息。基本上就是重复做下面这几件事情: + + 1. 往 RNN 模型中传入一个字符串,比如 `and they ought not to teas`。(要以数字向量的形式传入) + 2. 得到下一个字母的预测结果 + 3. 计算 RNN 模型预测结果和真实的下一个字母之间的损失函数(`e`,因为 `tease` 这个单词是以 `e` 结尾的) + 4. 计算梯度(用 `loss.backward()` 函数) + 5. 沿着梯度下降的方向修改模型中参数的权重(用 `self.optimizer.step()` 函数) + +``` +class Trainer(): + def __init__(self): + self.rnn = MyLSTM(input_size, hidden_size).cuda() + self.optimizer = torch.optim.Adam(self.rnn.parameters(), amsgrad=True, lr=lr) + def epoch(self): + i = 0 + while i < len(training_set) - 40: + seq_len = random.randint(10, 40) + input, target = training_set[i:i+seq_len],training_set[i+1:i+1+seq_len] + i += seq_len + # forward pass + output = self.rnn(input) + loss = F.cross_entropy(output.squeeze()[-1:], target[-1:]) + # compute gradients and take optimizer step + self.optimizer.zero_grad() + loss.backward() + self.optimizer.step() +``` + +### 使用 nn.LSTM 沿着时间反向传播,不要自己写代码 + +开始的时候我自己写代码每次传一个字母到 LSTM 层中,之后定期计算导数,就像下面这样: + +``` +for i in range(20): + input, target = next(iter) + output, hidden = self.lstm(input, hidden) +loss = F.cross_entropy(output, target) +hidden = hidden.detach() +self.optimizer.zero_grad() +loss.backward() +self.optimizer.step() +``` + +这段代码每次传入 20 个字母,每次一个,并且在最后训练了一次。这个步骤就被称为[沿时间反向传播][4],Karpathy 在他的博客中就是用这种方法。 + +这个方法有些用处,我编写的损失函数开始能够下降一段时间,但之后就会出现峰值。我不知道为什么会出现这种现象,但之后我改为一次传入 20 个字符到 LSTM 之后(按 `seq_len` 维度),再进行反向传播,情况就变好了。 + +### 第四步:训练模型! + +我在同样的数据上重复执行了这个训练代码大概 300 次,直到模型开始输出一些看起来像英文的文本。差不多花了一个多小时吧。 + +这种情况下我也不关注模型是不是过拟合了,但是如果你在真实场景中训练模型,应该要在验证集上验证你的模型。 + +### 第五步:生成输出! + +最后一件要做的事就是用这个模型生成一些输出。我写了一个辅助方法从这个训练好的模型中生成文本(`make_preds` 和 `next_pred`)。这里主要是把向量的维度对齐,重要的一点是: + +``` +output = rnn(input) +prediction_vector = F.softmax(output/temperature) +letter = v.textify(torch.multinomial(prediction_vector, 1).flatten(), sep='').replace('_', ' ') +``` + +基本上做的事情就是这些: + + 1. RNN 层为字母表中的每一个字母或者符号输出一个数值向量(`output`)。 + 2. 这个 `output` 向量**并不是**一个概率向量,所以需要 `F.softmax(output/temperature)` 操作,将其转换为概率值(也就是所有数值加起来和为 1)。`temperature` 某种程度上控制了对更高概率的权重,在限制范围内,如果设置 `temperature=0.0000001`,它将始终选择概率最高的字母。 + 3. `torch.multinomial(prediction_vector)` 用于获取概率向量,并使用这些概率在向量中选择一个索引(如 `12`)。 + 4. `v.textify` 把 `12` 转换为字母。 + +如果我们想要处理的文本长度为 300,那么只需要重复这个过程 300 次就可以了。 + +### 结果! + +我把预测函数中的参数设置为 `temperature = 1` 得到了下面的这些由模型生成的结果。看起来有点像英语,这个结果已经很不错了,因为这个模型要从头开始“学习”英语,并且是在字符序列的级别上进行学习的。 + +虽然这些话没有什么*含义*,但我们也不知道到底想要得到什么输出。 + +> “An who was you colotal said that have to have been a little crimantable and beamed home the beetle. “I shall be in the head of the green for the sound of the wood. The pastor. “I child hand through the emperor’s sorthes, where the mother was a great deal down the conscious, which are all the gleam of the wood they saw the last great of the emperor’s forments, the house of a large gone there was nothing of the wonded the sound of which she saw in the converse of the beetle. “I shall know happy to him. This stories herself and the sound of the young mons feathery in the green safe.” +> +> “That was the pastor. The some and hand on the water sound of the beauty be and home to have been consider and tree and the face. The some to the froghesses and stringing to the sea, and the yellow was too intention, he was not a warm to the pastor. The pastor which are the faten to go and the world from the bell, why really the laborer’s back of most handsome that she was a caperven and the confectioned and thoughts were seated to have great made + +下面这些结果是当 `temperature=0.1` 时生成的,它选择字符的方式更接近于“每次都选择出现概率最高的字符”。这就使得输出结果有很多是重复的。 + +> ole the sound of the beauty of the beetle. “She was a great emperor of the sea, and the sun was so warm to the confectioned the beetle. “I shall be so many for the beetle. “I shall be so many for the beetle. “I shall be so standen for the world, and the sun was so warm to the sea, and the sun was so warm to the sea, and the sound of the world from the bell, where the beetle was the sea, and the sound of the world from the bell, where the beetle was the sea, and the sound of the wood flowers and the sound of the wood, and the sound of the world from the bell, where the world from the wood, and the sound of the + +这段输出对这几个单词 `beetles`、`confectioners`、`sun` 和 `sea` 有着奇怪的执念。 + +### 总结! + +至此,我的结果远不及 Karpathy 的好,可能有一下几个原因: + + 1. 没有足够多的训练数据。 + 2. 训练了一个小时之后我就没有耐心去查看 Colab 笔记本上的信息。 + 3. Karpathy 使用了两层LSTM,包含了更多的参数,而我只使用了一层。 + 4. 完全是另一回事。 + +但我得到了一些大致说得过去的结果!还不错! + +-------------------------------------------------------------------------------- + +via: https://jvns.ca/blog/2020/11/30/implement-char-rnn-in-pytorch/ + +作者:[Julia Evans][a] +选题:[lujun9972][b] +译者:[zhangxiangping](https://github.com/zxp93) +校对:[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://karpathy.github.io/2015/05/21/rnn-effectiveness/ +[2]: https://gist.github.com/jvns/b6dda36b2fdcc02b833ed5b0c7a09112 +[3]: https://www.gutenberg.org/cache/epub/27200/pg27200.txt +[4]: https://en.wikipedia.org/wiki/Backpropagation_through_time diff --git a/published/202012/20201130 Journal five minutes a day with Jupyter.md b/published/202012/20201130 Journal five minutes a day with Jupyter.md new file mode 100644 index 0000000000..d30d609646 --- /dev/null +++ b/published/202012/20201130 Journal five minutes a day with Jupyter.md @@ -0,0 +1,151 @@ +[#]: collector: (lujun9972) +[#]: translator: (wxy) +[#]: reviewer: (wxy) +[#]: publisher: (wxy) +[#]: url: (https://linux.cn/article-12887-1.html) +[#]: subject: (Journal five minutes a day with Jupyter) +[#]: via: (https://opensource.com/article/20/11/daily-journal-jupyter) +[#]: author: (Moshe Zadka https://opensource.com/users/moshez) + +每天用 Jupyter 写 5 分钟的日记 +====== + +> 用 Jupyter 和 Python 在你的日常写作背后实现一些自动化。 + +![](https://img.linux.net.cn/data/attachment/album/202012/05/131314woxpksatp2toe7tz.jpg) + +有些人会遵循传统,制定一年的计划。不过,一年的时间很长,所以我以季节性的主题或轨迹来规划。每个季度,我都会坐下来,看看即将到来的三个月的季节,并决定在这段时间里我将努力做什么。 + +对于我最新的主题,我决定要每天写一篇日记。我喜欢有明确的承诺,所以我承诺每天写 5 分钟。我也喜欢有可观察的承诺,哪怕只是对我而言,所以我把我的记录放在 Git 里。 + +我决定在写日记的过程中实现一些自动化,于是我使用了我最喜欢的自动化工具:[Jupyter][2]。Jupyter 有一个有趣的功能 [ipywidgets][3],这是一套用于 Jupyter Notebooks、JupyterLab 和 IPython 内核的交互式 HTML 组件。 + +如果你想跟着本文的代码走,请注意,让你的 JupyterLab 实例支持组件可能有点复杂,请按照[这些说明][4]来进行设置。 + +### 导入 ipywidgets 模块 + +首先,你需要导入一堆东西,比如 ipywidgets 和 [Twisted][5]。Twisted 模块可以用来创建一个异步时间计数器: + +``` +import twisted.internet.asyncioreactor +twisted.internet.asyncioreactor.install() +from twisted.internet import reactor, task +import ipywidgets, datetime, subprocess, functools, os +``` + +### 设置定时条目 + +用 Twisted 实现时间计数器是利用了 `task.LoopingCall`。然而,结束循环调用的唯一方法是用一个异常。倒计时时钟总会停止,所以你需要一个自定义的异常来指示“一切正常;计数器结束”: + +``` +class DoneError(Exception): +    pass +``` + +现在你已经写好了异常,你可以写定时器了。第一步是创建一个 `ipywidgets.Label` 的文本标签组件。循环使用 `divmod` 计算出分和秒,然后设置标签的文本值: + +``` +def time_out_counter(reactor): + label = ipywidgets.Label("Time left: 5:00") + current_seconds = datetime.timedelta(minutes=5).total_seconds() + def decrement(count): + nonlocal current_seconds + current_seconds -= count + time_left = datetime.timedelta(seconds=max(current_seconds, 0)) + minutes, left = divmod(time_left, minute) + seconds = int(left.total_seconds()) + label.value = f"Time left: {minutes}:{seconds:02}" + if current_seconds < 0: + raise DoneError("finished") + minute = datetime.timedelta(minutes=1) + call = task.LoopingCall.withCount(decrement) + call.reactor = reactor + d = call.start(1) + d.addErrback(lambda f: f.trap(DoneError)) + return d, label +``` + +### 从 Jupyter 组件中保存文本 + +下一步是写一些东西,将你输入的文字保存到一个文件中,并提交到 Git。另外,由于你要写 5 分钟的日记,你需要一个能给你提供写字区域的组件(滚动肯定是可以的,但一次能看到更多的文字就更好了)。 + +这就用到了组件 `Textarea`,这是一个你可以书写的文本字段,而 `Output` 则是用来给出反馈的。这一点很重要,因为 `git push` 可能会花点时间或失败,这取决于网络。如果备份失败,用反馈提醒用户很重要: + +``` +def editor(fname): +    textarea = ipywidgets.Textarea(continuous_update=False) +    textarea.rows = 20 +    output = ipywidgets.Output() +    runner = functools.partial(subprocess.run, capture_output=True, text=True, check=True) +    def save(_ignored): +        with output: +            with open(fname, "w") as fpout: +                fpout.write(textarea.value) +            print("Sending...", end='') +            try: +                runner(["git", "add", fname]) +                runner(["git", "commit", "-m", f"updated {fname}"]) +                runner(["git", "push"]) +            except subprocess.CalledProcessError as exc: +                print("Could not send") +                print(exc.stdout) +                print(exc.stderr) +            else: +                 print("Done") +    textarea.observe(save, names="value") +    return textarea, output, save +``` + +`continuous_update=False` 是为了避免每个字符都保存一遍并发送至 Git。相反,只要脱离输入焦点,它就会保存。这个函数也返回 `save` 函数,所以可以明确地调用它。 + +### 创建一个布局 + +最后,你可以使用 `ipywidgets.VBox` 把这些东西放在一起。这是一个包含一些组件并垂直显示的东西。还有一些其他的方法来排列组件,但这足够简单: + +``` +def journal(): +    date = str(datetime.date.today()) +    title = f"Log: Startdate {date}" +    filename = os.path.join(f"{date}.txt") +    d, clock = time_out_counter(reactor) +    textarea, output, save = editor(filename) +    box = ipywidgets.VBox([ +        ipywidgets.Label(title), +        textarea, +        clock, +        output +    ]) +    d.addCallback(save) +    return box +``` + +biu!你已经定义了一个写日记的函数了,所以是时候试试了。 + +``` +journal() +``` + +![Jupyter journal][6] + +你现在可以写 5 分钟了! + +-------------------------------------------------------------------------------- + +via: https://opensource.com/article/20/11/daily-journal-jupyter + +作者:[Moshe Zadka][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/moshez +[b]: https://github.com/lujun9972 +[1]: https://opensource.com/sites/default/files/styles/image-full-size/public/lead-images/tea-cup-mug-flowers-book-window.jpg?itok=JqThhl51 (Ceramic mug of tea or coffee with flowers and a book in front of a window) +[2]: https://jupyter.org/ +[3]: https://ipywidgets.readthedocs.io/en/latest/ +[4]: https://ipywidgets.readthedocs.io/en/latest/user_install.html +[5]: https://twistedmatrix.com/trac/ +[6]: https://opensource.com/sites/default/files/uploads/journaling_output_13_0.png (Jupyter journal) +[7]: https://creativecommons.org/licenses/by-sa/4.0/ diff --git a/published/202012/20201201 How this open source security tool halted significant DDoS attacks.md b/published/202012/20201201 How this open source security tool halted significant DDoS attacks.md new file mode 100644 index 0000000000..13224450d9 --- /dev/null +++ b/published/202012/20201201 How this open source security tool halted significant DDoS attacks.md @@ -0,0 +1,69 @@ +[#]: collector: (lujun9972) +[#]: translator: (geekpi) +[#]: reviewer: (wxy) +[#]: publisher: (wxy) +[#]: url: (https://linux.cn/article-12897-1.html) +[#]: subject: (How this open source security tool halted significant DDoS attacks) +[#]: via: (https://opensource.com/article/20/12/open-source-vs-ddos-attacks) +[#]: author: (Philippe Humeau https://opensource.com/users/philippe-humeau) + +如何在 1 分钟内阻止 7000 台机器的僵尸网络 +====== + +> 对 CrowdSec 的配置更改,在不到一分钟的时间内阻止了一个 7000 台机器的僵尸网络的攻击。 + +![](https://img.linux.net.cn/data/attachment/album/202012/07/220444x6kaedeu6ko0e7uo.jpg) + +2020 年,我们的生活和工作方式在短短几天内被彻底颠覆。随着 COVID-19 开始在全球范围内蔓延,我们将工作带回家,与同事、朋友和家人保持在线联系成为关键的必需品。这为黑客造成破坏打开了大门。例如,根据 Neustar 的数据,今年上半年全球的分布式拒绝服务(DDOS) 攻击[增长了 151%][2]。 + +[CrowdSec][3] 是一个开源的安全引擎,它可以分析访问者的行为,并提供适应各种攻击的响应。它能解析来自各种来源的日志,并应用启发式方案来识别攻击性行为,并防范大多数攻击类别。并且,它与其它安装的 CrowdSec 系统共享该情报。每次 IP 地址被阻止时,它都会通知整个用户社区。这就创建了一个[实时、协作的 IP 信誉数据库][4],利用人群的力量使互联网更加安全。 + +### CrowdSec 如何工作:案例研究 + +Sorf Networks 是一家总部位于土耳其的技术公司,为客户提供高配置的托管服务器和 DDoS 防护解决方案,它提供了一个 CrowdSec 工作的例子。Sorf 的一个客户每天都会遇到来自 1 万多台机器僵尸网络的 DDoS 攻击,并努力寻找一种能够满足技术要求的解决方案来及时处理这些攻击。 + +虽然客户采取了一般的预防措施来缓解这些攻击,比如引入 JavaScript(JS)挑战challenges、限速等,但这些措施在整个攻击面并不可行。一些 URL 需要被非常基本的软件使用,而这些软件不支持 JS 挑战。黑客就是黑客,这正是他们每天的目标:链条上最薄弱的环节。 + +Sorf Networks 首先使用 [Fail2ban][5](这启发了 CrowdSec)为其客户建立了一个 DDoS 缓解策略。它在一定程度上帮助了客户,但它太慢了。它需要 50 分钟来处理日志和处理 7000 到 10000 台机器的 DDoS 攻击。这使得它在这种情况下没有效果。另外,因为它没有禁止 IP,日志会持续堆积,它需要每秒处理几千条日志,这是不可能的。 + +在使用租用的僵尸网络进行的 DDoS 测试中,一次攻击可以高达每秒 6700 个左右的请求,这些请求来自 8600 个独立 IP。这是对一台服务器流量的捕捉: + +![Server traffic][6] + +虽然 CrowdSec 技术可以应对巨大的攻击,但其默认设置每秒只能处理约 1000 个端点。Sorf 需要一个量身定做的配置来处理单台机器上这么多的流量。 + +Sorf 的团队对 CrowdSec 的配置进行了修改,以显著提高其吞吐量来处理日志。首先,它去掉了高消耗且非关键的富集enrichment解析器,例如 [GeoIP 富集][7]。它还将允许的 goroutine 的默认数量从一个增加到五个。之后,团队又用 8000 到 9000 台主机做了一次实测,平均每秒 6000 到 7000 个请求。这个方案是有代价的,因为 CrowdSec 在运行过程中吃掉了 600% 的 CPU,但其内存消耗却保持在 270MB 左右。 + +然而,结果却显示出明显的成功: + + * 在一分钟内,CrowdSec 能够处理所有的日志 + * 95% 的僵尸网络被禁止,攻击得到有效缓解 + * 15 个域现在受到保护,不受 DDoS 攻击 + +根据 Sorf Networks 的总监 Cagdas Aydogdu 的说法,CrowdSec 的平台使团队“能够在令人难以置信的短时间内提供一个世界级的高效防御系统”。 + +* * * + +本文改编自[如何用 CrowdSec 在 1 分钟内阻止 7000 台机器的僵尸网络][8],原载于 CrowdSec 网站。 + +-------------------------------------------------------------------------------- + +via: https://opensource.com/article/20/12/open-source-vs-ddos-attacks + +作者:[Philippe Humeau][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/philippe-humeau +[b]: https://github.com/lujun9972 +[1]: https://opensource.com/sites/default/files/styles/image-full-size/public/lead-images/security_password_chaos_engineer_monster.png?itok=J31aRccu (Security monster) +[2]: https://www.businesswire.com/news/home/20200916005046/en/DDoS-Attacks-Increase-by-151-in-First-Half-Of-2020 +[3]: https://crowdsec.net/ +[4]: https://opensource.com/article/20/10/crowdsec +[5]: https://www.fail2ban.org +[6]: https://opensource.com/sites/default/files/uploads/crowdsec_servertraffic.png (Server traffic) +[7]: https://hub.crowdsec.net/author/crowdsecurity/configurations/geoip-enrich +[8]: https://crowdsec.net/2020/10/21/how-to-stop-a-botnet-with-crowdsec/ diff --git a/published/202012/20201201 Try Jed as your Linux terminal text editor.md b/published/202012/20201201 Try Jed as your Linux terminal text editor.md new file mode 100644 index 0000000000..b4197674e1 --- /dev/null +++ b/published/202012/20201201 Try Jed as your Linux terminal text editor.md @@ -0,0 +1,115 @@ +[#]: collector: (lujun9972) +[#]: translator: (geekpi) +[#]: reviewer: (wxy) +[#]: publisher: (wxy) +[#]: url: (https://linux.cn/article-12901-1.html) +[#]: subject: (Try Jed as your Linux terminal text editor) +[#]: via: (https://opensource.com/article/20/12/jed) +[#]: author: (Seth Kenlon https://opensource.com/users/seth) + +尝试将 Jed 作为你的 Linux 终端文本编辑器 +====== + +> Jed 方便的下拉菜单,让新用户可以轻松地使用终端文本编辑器。 + +![](https://img.linux.net.cn/data/attachment/album/202012/09/085456f7fmt74eu6eekpmt.jpg) + +你可能听说过 Emacs、Vim 和 Nano 这些典型的 Linux 文本编辑器,但 Linux 有大量的开源文本编辑器,我的目标是在 12 月份对其中的 31 个文本编辑器进行一次公平的测试。 + +在这篇文章中,我将介绍 [Jed][2],它是一个基于终端的编辑器,它的特点是有一个方便的下拉菜单,这让那些刚刚接触终端编辑器的用户,以及那些不喜欢记住每个功能的组合键的用户而言变得特别容易。 + +### 安装 Jed + +在 Linux 上,你的发行版软件仓库可能会让 Jed 通过你的软件包管理器安装: + +``` +$ sudo dnf install jed +``` + +并不是所有发行版都是如此,但它是一个很容易从源码编译的应用。首先,下载 [S 语言][3](Jed 的编写语言)并安装(其中 `x.y.z` 请替换为对应的版本号): + +``` +$ wget https://www.jedsoft.org/releases/slang/slang-x.y.z.tar.bz2 +$ tar xvf slang*bz2 +$ cd slang-x.y.z +$ ./configure ; make +$ sudo make install +``` + +安装好后,对 [Jed 源码][4]也同样操作(其中 `x.y.z` 请替换为对应的版本号): + +``` +$ wget https://www.jedsoft.org/releases/jed/jed-x.y.z.tar.bz2 +$ tar xvf jed*bz2 +$ cd jed-x.y.z +$ ./configure ; make +$ sudo make install +``` + +### 启动 Jed + +Jed 在终端中运行,所以要启动它,只需打开终端,输入 `jed`: + +``` +F10 key ==> File Edit Search Buffers Windows System Help + + + This is a scratch buffer. It is NOT saved when you exit. + + To access the menus, press F10 or ESC-m and the use the arrow + keys to navigate. + + Latest version information is available on the web from + . Other sources of JED + information include the usenet newsgroups comp.editors and + alt.lang.s-lang. To subscribe to the jed-users mailing list, see + . + + Copyright (C) 1994, 2000-2009 John E. Davis + Email comments or suggestions to . + +[ (Jed 0.99.19U) Emacs: *scratch* () 1/16 8:49am ] +``` + +### 如何使用 Jed + +Jed 自动加载的说明很清晰且很有帮助。你可以按 `F10` 键或 `Esc` 键,然后按字母 `M` 进入顶部菜单。这将使你的光标进入 Jed 顶部的菜单栏,但它不会打开菜单。要打开菜单,请按键盘上的回车键。使用方向键来浏览每个菜单。 + +屏幕上的菜单不仅对初次使用的用户很有帮助,对有经验的用户来说,它还提供了很好的键盘快捷键提醒。例如,你大概能猜到如何保存正在处理的文件。进入 **File** 菜单,选择 **Save**。如果你想加快这个过程,你可以记住 `Ctrl+X`,然后 `Ctrl+S` 的组合键(是的,这是连续的两个组合键)。 + +### 探索 Jed 的功能 + +对于一个简单的编辑器来说,Jed 拥有一系列令人惊讶的实用功能。它有一个内置的多路复用器,允许你同时打开多个文件,但它会“叠”在另一个文件之上,所以你可以在它们之间切换。你可以分割你的 Jed 窗口,让多个文件同时出现在屏幕上,改变你的颜色主题,或者打开一个 shell。 + +对于任何有 Emacs 使用经验的人来说,Jed 的许多“没有宣传”的功能,例如用于导航和控制的组合键,都是一目了然的。然而,当一个组合键与你所期望的大相径庭时,就会有一个轻微的学习(或者说没有学习)曲线。例如,GNU Emacs 中的 `Alt+B` 可以将光标向后移动一个字,但在 Jed 中,默认情况下,它是 **Buffers** 菜单的快捷键。这让我措手不及,大约本文每句话都遇到一次。 + +![Jed][8] + +Jed 也有**模式**,允许你加载模块或插件来帮助你编写特定种类的文本。例如,我使用默认的 text 模式写了这篇文章,但当我在编写 [Lua][9] 时,我能够切换到 lua 模式。这些模式提供语法高亮,并帮助匹配括号和其他分隔符。你可以在 `/usr/share/jed/lib` 中查看 Jed 捆绑了哪些模式,而且因为它们是用 S 语言编写的,你可以浏览代码,并可能学习一种新的语言。 + +### 尝试 Jed + +Jed 是一个令人愉快且清新的 Linux 终端文本编辑器。它轻量级,易于使用,设计相对简单。作为 Vi 的替代方案,你可以在你的 `~/.bashrc` 文件中(如果你是 root 用户,在 root 用户的 `~/.bashrc` 文件中)将 Jed 设置为 `EDITOR` 和 `VISUAL` 变量。今天就试试 Jed 吧。 + +-------------------------------------------------------------------------------- + +via: https://opensource.com/article/20/12/jed + +作者:[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/laptop_screen_desk_work_chat_text.png?itok=UXqIDRDD (Person using a laptop) +[2]: https://www.jedsoft.org/jed +[3]: https://www.jedsoft.org/releases/slang/ +[4]: https://www.jedsoft.org/releases/jed +[5]: http://www.jedsoft.org/jed/\> +[6]: http://www.jedsoft.org/jed/mailinglists.html\> +[7]: mailto:jed@jedsoft.org +[8]: https://opensource.com/sites/default/files/jed.png (Jed) +[9]: https://opensource.com/article/20/2/lua-cheat-sheet diff --git a/published/202012/20201201 Zotero- An Open Source App to Help You Collect - Share Research.md b/published/202012/20201201 Zotero- An Open Source App to Help You Collect - Share Research.md new file mode 100644 index 0000000000..b07ffa5d81 --- /dev/null +++ b/published/202012/20201201 Zotero- An Open Source App to Help You Collect - Share Research.md @@ -0,0 +1,109 @@ +[#]: collector: (lujun9972) +[#]: translator: (geekpi) +[#]: reviewer: (wxy) +[#]: publisher: (wxy) +[#]: url: (https://linux.cn/article-12905-1.html) +[#]: subject: (Zotero: An Open Source App to Help You Collect & Share Research) +[#]: via: (https://itsfoss.com/zotero/) +[#]: author: (Ankush Das https://itsfoss.com/author/ankush/) + +Zotero:一款帮助你收集和分享研究成果的开源应用 +====== + +> Zotero 是一款令人印象深刻的自由开源的应用,它让你可以收集、组织、引用和共享研究成果。你还可以使用 Zotero 为你的文档即时创建参考文献和书目。 + +![](https://img.linux.net.cn/data/attachment/album/202012/09/213010i6o78b6y5gifyjtf.jpg) + +通常,你可以[使用 Linux 上任何一款笔记应用][1]来收集和分享你的想法。但是,在这里,我想分享一些专门为你量身定做的东西,来帮助你收集、整理和分享你的研究成果,即 [Zotero][2]。 + +### Zotero:收集、整理和分享研究成果 + +![][3] + +Zotero 是一个完全开源的项目,你可以在 [GitHub][4] 上找到它。它的目的是帮助你轻松地收集、整理、添加笔记和分享你的研究成果。 + +而且,这一切都不需要基于云端的服务,它是完全离线的。所以,你的研究成果是属于你的。当然,除非你出于协作目的想将其同步,为此你可能需要参考[该文档][5]。 + +作为一个好的起点,你可以选择 [WebDAV 存储][6],或者直接创建一个 Zotero 帐户来轻松同步和分享你的研究成果。 + +例如,我创建了一个名为 `ankush9` 的 Zotero 账户,你可以在 找到我的研究合集(我添加到我的出版物中)。 + +![][7] + +这使得它很容易分享你组织的研究成果,你可以选择将哪些部分共享到出版物中。 + +让我着重介绍一下 Zotero 的主要功能,来帮助你决定是否需要尝试一下。 + +### Zotero 的功能 + +![][8] + + * 能够使用浏览器插件从网页直接添加信息 + * 为每份资料添加说明 + * 支持添加标签 + * 支持添加语音记录 + * 添加视频作为附件 + * 添加软件作为附件 + * 将电子邮件作为附件 + * 将播客作为附件 + * 添加博客文章 + * 添加一个文件链接 + * 根据项目建立书目 + * 离线快照存储(无需连接互联网即可访问保存的网页) + * 可以复制项目 + * 整理库中的项目 + * 提供了一个垃圾箱,可以删除你的项目,并在需要时轻松恢复。 + * 支持同步 + * 支持数据导出 + * 可整合 LibreOffice 插件 + * 使用你的 Zotero 个人资料链接轻松分享你的研究笔记。 + * 跨平台支持 + +如果你只是想快速创建书目,你可以尝试他们的另一个工具,[ZoteroBib][9]。 + +### 在 Linux 上安装 Zotero + +![][12] + +它适用于 Windows、macOS 和 Linux。对于 Linux,如果你使用的是基于 Ubuntu 的发行版(或 Ubuntu 本身),你可以下载一个 deb 文件(由第三方维护)并安装它。 + +安装 [deb 文件][13]很简单,它在 Pop OS 20.04 上工作得很好。如果你使用的是其他 Linux 发行版,你可以[解压 tar 包][14]并进行安装。 + +你可以按照[官方安装说明][15]来找到合适的方法。 + +- [下载 Zotero][2] + +### 总结 + +它有大量的功能,你可以组织、分享、引用和收集资源,以供你进行搜索。由于支持音频、视频、文本和链接,它应该适合几乎所有的东西。 + +当然,我会将它推荐给有经验的用户,让它发挥最大的作用。而且,如果你之前使用过树状图(思维导图)笔记工具的人,你就知道要做什么了。 + +你觉得 Zotero 怎么样?如果它不适合你,你有更好的替代品建议么?请在下面的评论中告诉我你的想法。 + +-------------------------------------------------------------------------------- + +via: https://itsfoss.com/zotero/ + +作者:[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/note-taking-apps-linux/ +[2]: https://www.zotero.org/ +[3]: https://i1.wp.com/itsfoss.com/wp-content/uploads/2020/11/zotero-app.png?resize=800%2C481&ssl=1 +[4]: https://github.com/zotero/zotero +[5]: https://www.zotero.org/support/ +[6]: https://en.wikipedia.org/wiki/WebDAV +[7]: https://i0.wp.com/itsfoss.com/wp-content/uploads/2020/11/zotero-online-publication.jpg?resize=800%2C600&ssl=1 +[8]: https://i2.wp.com/itsfoss.com/wp-content/uploads/2020/11/zotero-extension.jpg?resize=800%2C414&ssl=1 +[9]: https://zbib.org/ +[12]: https://i1.wp.com/itsfoss.com/wp-content/uploads/2020/11/zotero-preferences.png?resize=800%2C489&ssl=1 +[13]: https://itsfoss.com/install-deb-files-ubuntu/ +[14]: https://en.wikipedia.org/wiki/Tarball +[15]: https://www.zotero.org/support/installation diff --git a/published/202012/20201202 How to Add Third-Party Repositories in Fedora and Get Access to a Huge Number of Additional Software.md b/published/202012/20201202 How to Add Third-Party Repositories in Fedora and Get Access to a Huge Number of Additional Software.md new file mode 100644 index 0000000000..198b496a83 --- /dev/null +++ b/published/202012/20201202 How to Add Third-Party Repositories in Fedora and Get Access to a Huge Number of Additional Software.md @@ -0,0 +1,118 @@ +[#]: collector: (lujun9972) +[#]: translator: (robsean) +[#]: reviewer: (wxy) +[#]: publisher: (wxy) +[#]: url: (https://linux.cn/article-12898-1.html) +[#]: subject: (How to Add Third-Party Repositories in Fedora and Get Access to a Huge Number of Additional Software) +[#]: via: (https://itsfoss.com/fedora-third-party-repos/) +[#]: author: (John Paul https://itsfoss.com/author/john/) + +如何在 Fedora 中添加第三方存储库以访问大量附加软件 +====== + +![](https://img.linux.net.cn/data/attachment/album/202012/08/074323tkjpr2499rtjnjq0.jpg) + +在你安装 Fedora 后。你可能会发现你想要安装和使用的一些软件在软件商店中找不到。出于一些原因,这些软件包不能出现在 Fedora 存储库中。 + +不用担心,我将告诉你如何为 Fedora 添加第三方存储库来使这些软件包可使用。 + +### 在 Fedora 中的第三方存储库是什么? + +操作系统开发人员通常会决定哪些软件包可以在其存储库中使用,哪些软件包不可以在其存储库中使用。Fedora 也是如此。依据 [Fedora 文档][1] ,第三方存储库包含有 “拥有更为宽松的许可政策,并提供 Fedora 因各种原因所排除软件包” 的软件包。 + +Fedora 强制执行下面的 [准则][2] ,当它打包软件包时: + + * 如果它是专有的,它就不能包含在 Fedora 中 + * 如果它在法律上被限制,它就不能包含在 Fedora 中 + * 如果它违反美国法律(特别是联邦政府或适用于州政府的法律),它就不能包含在 Fedora 中 + +因此,有一些可以由用户自行添加的存储库。这使得用户能够访问附加的软件包。 + +### 在 Fedora 中启用 RPM Fusion 存储库 + +[RPM Fusion][3] 是 Fedora 的第三方应用程序的主要来源。RPM Fusion 是由三个项目(Dribble、Freshrpms 和 Livna)合并而成的。RPM Fusion 提供两种不同的软件存储库。 + + * free 存储库:包含开源软件。 + * nonfree 存储库:包含没有开源协议的软件,但是它们的源文件代码却是可以自由使用的。 + +这里有两种方法来启动 RPM Fusion:从终端启用,或通过点击几个按钮来启用。我们将逐一查看。 + +#### 方法 1:命令行方法 + +这是启用 RPM Fusion 存储库的最简单的方法。只需要输入下面的命令即可启用两个存储库: + +``` +sudo dnf install https://mirrors.rpmfusion.org/free/fedora/rpmfusion-free-release-$(rpm -E %fedora).noarch.rpm https://mirrors.rpmfusion.org/nonfree/fedora/rpmfusion-nonfree-release-$(rpm -E %fedora).noarch.rpm +``` + +会要求你输入密码、确认是否你想要安装这些存储库。在你确认后,安装过程将在几秒钟或几分钟内完成。 + +![通过命令行安装 RPM Fusion][4] + +#### 方法 2:图形用户界面方法 + +使用这个方法来启用 RPM Fusion 存储库,你需要访问 [RPM Fusion 网站][5] 。你将看到针对不同 Fedora 版本的两个存储库的链接。 + +RPM Fusion 建议先安装 free 存储库。因此,单击针对你 Fedora 版本的 free 存储库的链接。然后会打开一个窗口来询问你是否想安装该存储库。单击安装。 + +![通过图形用户界面安装 RPM Fusion][6] + +在安装过程完成后,返回并使用相同的步骤安装 nonfree 存储库。 + +### 启用 Fedora 的第三方存储库 + +Fedora 最近开始提供它自己的 [第三方应用程序存储库][7] 。在这个存储库中 [可使用的应用程序的数量][8] 是非常少的。你可以 [使用它来在 Fedora 上安装 Chrome 浏览器][9] 。除 Chrome 外,它也包含 Adobe Brackets、Atom、Steam、Vivaldi、Opera 等应用程序。 + +就像 RPM Fusion 一样,你可以通过终端或图形用户界面的方法来启用这个存储库。 + +#### 方法 1:命令行方法 + +为启用 Fedora 的第三方存储库,输入下面的命令到你的终端中: + +``` +sudo dnf install fedora-workstation-repositories +``` + +当被提示时,确保输入你的密码并输入 `Y` 来确认安装。 + +#### 方法 2:图形用户界面方法 + +如果你不习惯使用终端,你可以使用图形用户界面方法。 + +首先,你需要打开 Gnome “软件”。接下来,你需要单击右上角的汉堡菜单,并从菜单中选择“软件存储库”。 + +![Gnome 软件的菜单][10] + +在软件存储库窗口中,你将在其顶部看到写着 “第三方存储库” 字样的部分。单击“安装”按钮。当你被提示时,输入你的密码。 + +![Fedora 第三方存储库安装][11] + +随着这些附加存储库的启用,你可以安装软件到你的系统当中。你可以从软件中心管理器或使用 DNF 软件包管理器来轻松地安装它们。 + +如果你发现这篇文章很有趣,请花费一些时间来在社交媒体上分享它。 + +-------------------------------------------------------------------------------- + +via: https://itsfoss.com/fedora-third-party-repos/ + +作者:[John Paul][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/john/ +[b]: https://github.com/lujun9972 +[1]: https://docs.fedoraproject.org/en-US/quick-docs/setup_rpmfusion/#third-party-repositories +[2]: https://fedoraproject.org/wiki/Forbidden_items +[3]: https://rpmfusion.org/RPM%20Fusion +[4]: https://i2.wp.com/itsfoss.com/wp-content/uploads/2020/11/install-rpmfusion-cli.png?resize=800%2C604&ssl=1 +[5]: https://rpmfusion.org/Configuration +[6]: https://i0.wp.com/itsfoss.com/wp-content/uploads/2020/11/install-rpmfusion-gui.png?resize=800%2C582&ssl=1 +[7]: https://fedoraproject.org/wiki/Workstation/Third_Party_Software_Repositories +[8]: https://fedoraproject.org/wiki/Workstation/Third_party_software_list +[9]: https://itsfoss.com/install-google-chrome-fedora/ +[10]: https://i1.wp.com/itsfoss.com/wp-content/uploads/2020/11/software-meni.png?resize=800%2C672&ssl=1 +[11]: https://i0.wp.com/itsfoss.com/wp-content/uploads/2020/11/fedora-third-party-repo-gui.png?resize=746%2C800&ssl=1 +[12]: https://%0Areddit.com/r/linuxusersgroup diff --git a/published/202012/20201202 Why I love Emacs.md b/published/202012/20201202 Why I love Emacs.md new file mode 100644 index 0000000000..78f0c8781b --- /dev/null +++ b/published/202012/20201202 Why I love Emacs.md @@ -0,0 +1,92 @@ +[#]: collector: (lujun9972) +[#]: translator: (wxy) +[#]: reviewer: (wxy) +[#]: publisher: (wxy) +[#]: url: (https://linux.cn/article-12923-1.html) +[#]: subject: (Why I love Emacs) +[#]: via: (https://opensource.com/article/20/12/emacs) +[#]: author: (Seth Kenlon https://opensource.com/users/seth) + +为什么我喜欢 Emacs +====== + +> Emacs 并不是一个单纯的文本编辑器,它将掌控置于你手中,让你几乎可以解决你遇到的任何问题。 + +!["表情符号键盘"][1] + +我是一个典型的 [Emacs][2] 用户。不是我选择的 Emacs,而是它选择了我。早在我刚开始学习 Unix 的时候,我偶然发现了一个奇怪的名为 Emacs 的应用程序,它隐藏在我的电脑上,其中有一个鲜为人知的功能。传说中(而且被证明是真的),如果你在终端上输入 `emacs`,按 `Alt+X`,然后输入 `tetris`,你就可以玩一个掉方块的游戏。 + +![Tetris in Emacs][3] + +那就是我对 GNU Emacs 的印象。虽然这很肤浅,但它也准确地表明了 Emacs 的意义:用户可以重新编程他们的(虚拟)世界,并且可以用一个应用程序做*任何*他们想做的事情。在你的文本编辑器中玩俄罗斯方块可能不是你日常的主要目标,但这说明 Emacs 是一个值得骄傲的编程平台。事实上,你可以把它看作是 [Jupyter][4] 的一种先驱,它把一种强大的编程语言(准确的说叫 elisp)和自己的实时环境结合起来。因此,Emacs 作为一个文本编辑器是灵活的、可定制的、强大的。 + +如果你习惯于 Bash、Python 或类似的语言,elisp(以及扩展的 Common Lisp)不一定是最容易入门的语言。但是这种 LISP 方言是很强大的,而且因为 Emacs 是一个 LISP 解释器,所以你可以用它构建应用程序,不管它们是 Emacs 插件还是你想开发成一个独立项目的原型。极其流行的 [org 模式项目][5]就是一个例子:它是一个 Emacs 插件,同时也是一个标记语法,有移动应用可以解释和扩展其功能。类似的有用的 Emacs 内应用的例子还有很多,包括电子邮件客户端、PDF 浏览器、Web 浏览器、shell 和文件管理器。 + +### 两个界面 + +GNU Emacs 至少有两个用户界面:图形用户界面(GUI)和终端用户界面(TUI)。这有时会让人感到惊讶,因为 Emacs 经常与运行在终端中的 Vi 相提并论(尽管 gVim 为现代 Vi 的实现提供了一个 GUI)。如果你想把 GNU Emacs 以终端程序来运行,你可以用 `-nw` 选项来启动它。 + +``` +$ emacs -nw +``` + +有了 GUI 程序,你可以直接从应用程序菜单或终端启动 Emacs。 + +你可能会认为 GUI 会降低 Emacs 的效率,好像“真正的文本编辑器是在终端中运行的”,但 GUI 可以使 Emacs 更容易学习,因为它的 GUI 遵循了一些典型的惯例(菜单栏、可调节的组件、鼠标交互等)。 + +事实上,如果你把 Emacs 作为一个 GUI 应用程序来运行,你可能在一天的时间里会完全没有意识到你在 Emacs 中。只要你使用过 GUI,大多数常用的惯例都适用。例如,你可以用鼠标选择文本,导航到**编辑**菜单,选择**复制**,然后将光标放在其他地方,选择**粘贴**。要保存文档,你可以进入**文件**,然后选择**保存**或**另存为**。你可以按 `Ctrl` 键并向上滚动,使屏幕字体变大,你可以使用滚动条来浏览你的文档,等等。 + +了解 Emacs 的 GUI 形式是拉平学习曲线的好方法。 + +### Emacs 键盘快捷键 + +GNU Emacs 以复杂的键盘组合而恶名远扬。它们不仅陌生(`Alt+W` 来复制?`Ctrl+Y` 来粘贴?),而且还用晦涩难懂的术语来标注(`Alt` 被称为 `Meta`),有时它们成双成对(`Ctrl+X` 后是 `Ctrl+S` 来保存),有时则单独出现(`Ctrl+S` 来搜索)。为什么有人会故意选择使用这些呢? + +嗯,有些人不会。但那些喜欢这些的人是因为这些组合很容易融入到日常打字的节奏中(而且经常让 `Caps Lock` 键充当 `Ctrl` 键)。然而,那些喜欢不同的东西的人有几个选择: + + * “邪恶”模式让你在 Emacs 中使用 Vim 键绑定。就是这么简单。你可以保留你的肌肉记忆中的按键组合,并继承最强大的文本编辑器。 + * 通用用户访问(CUA)键保留了所有 Emacs 常用的组合键,但最令人头疼的键(复制、剪切、粘贴和撤消)都被映射到现代的键盘绑定中(分别为 `Ctrl+C`、`Ctrl+X`、`Ctrl+V` 和 `Ctrl+Z`)。 + * `global-set-key` 函数,是 Emacs 编程的一部分,允许你定义自己的键盘快捷键。传统上,用户定义的快捷键以 `Ctrl+C` 开头,但没有什么能阻止你发明自己的方案。Emacs 并不敝帚自珍,欢迎你按照自己的意愿来扭转它。 + +### 学习 Emacs + +要想很好地使用 Emacs 是需要时间的。对我来说,这意味着打印出一张[速记表][6],每天都把它放在键盘旁边。当我忘了一个键组合时,我就在我的速记表上查找它。如果它不在我的速记表上,我就学习这个键盘组合,要么通过执行该函数,并注意 Emacs 告诉我如何更快地访问它,要么通过使用 `describe-function`: + +``` +M-x describe-function: save-buffer + +save-buffer is an interactive compiled Lisp function in ‘files.el’. + +It is bound to C-x C-s, <menu-bar> <file> <save-buffer>. +[...] +``` + +当你使用它的时候,你就会学习它。你对它了解得越多,你就越有能力去改进它,使它变成你自己的。 + +### 尝试 Emacs + +人们常开玩笑说 Emacs 是一个包含文本编辑器的操作系统。也许这是在暗示 Emacs 臃肿和过于复杂,当然也有一种说法是文本编辑器根据其默认配置不应该需要 `libpoppler`(你可以不需要它来编译 Emacs)。 + +但这个笑话背后潜藏着一个更大的真相,它揭示了 Emacs 如此有趣的原因。将 Emacs 与其他文本编辑器,如 Vim、Nano,甚至 [VSCodium][7] 进行比较是没有意义的,因为 Emacs 真正重要的部分并不是你可以在窗口中输入东西并保存的这种思路。那是连 Bash 都能提供的基本功能。Emacs 的真正意义在于它如何将控制置身于你的手中,以及如何通过 Emacs Lisp([Elisp][8])解决几乎任何问题。 + +-------------------------------------------------------------------------------- + +via: https://opensource.com/article/20/12/emacs + +作者:[Seth Kenlon][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/seth +[b]: https://github.com/lujun9972 +[1]: https://opensource.com/sites/default/files/styles/image-full-size/public/lead-images/emoji-keyboard.jpg?itok=JplrSZ9c (Emoji keyboard) +[2]: https://en.wikipedia.org/wiki/Emacs +[3]: https://opensource.com/sites/default/files/tetris.png (Tetris in Emacs) +[4]: https://opensource.com/article/20/11/surprising-jupyter +[5]: https://opensource.com/article/19/1/productivity-tool-org-mode +[6]: https://opensource.com/downloads/emacs-cheat-sheet +[7]: https://opensource.com/article/20/6/open-source-alternatives-vs-code +[8]: https://www.gnu.org/software/emacs/manual/html_node/elisp/ diff --git a/published/202012/20201203 Download the 2020 Linux Foundation Annual Report.md b/published/202012/20201203 Download the 2020 Linux Foundation Annual Report.md new file mode 100644 index 0000000000..a7ecaa4c55 --- /dev/null +++ b/published/202012/20201203 Download the 2020 Linux Foundation Annual Report.md @@ -0,0 +1,73 @@ +[#]: collector: (lujun9972) +[#]: translator: (wxy) +[#]: reviewer: (wxy) +[#]: publisher: (wxy) +[#]: url: (https://linux.cn/article-12889-1.html) +[#]: subject: (Download the 2020 Linux Foundation Annual Report) +[#]: via: (https://www.linux.com/news/download-the-2020-linux-foundation-annual-report/) +[#]: author: (The Linux Foundation https://www.linuxfoundation.org/blog/2020/12/download-the-2020-linux-foundation-annual-report/) + +下载 2020 年度 Linux 基金会年度报告 +====== + +![][1] + +2020 年对于 Linux 基金会Linux Foundation(LF)和我们托管的社区来说,是充满挑战的一年。在这次大流行期间,我们都看到我们和世界各地许多同事、朋友和家人的日常生活完全改变了。在我们的社区中,有太多的人也为失去家人和朋友而悲痛。 + +看到 LF 的成员加入到对抗 COVID-19 的斗争中,令人振奋。我们在世界各地的成员为科研人员贡献了技术资源,为挣扎中的家庭和个人提供了援助,为国家和国际努力做出了贡献,有些人甚至一起在 [LF 公共卫生][3] 下创建了开源项目,以帮助各国应对这场大流行病。 + +今年,我们的项目社区在继续发展,在许多开放技术领域、开放标准、开放数据和开放硬件方面都有新的举措。今年,我们迎接了 150 多个新社区加入 LF,包括 [FINOS 基金会][4],它是开源金融服务项目的保护项目。 + +我们的 [活动团队][5] 不得不进行了重大转型,在几周内,从面对面的活动转变为虚拟活动,参与者从不足 100 人到数万人不等。这些虚拟聚会帮助我们社区中的许多人在这个困难时期建立了联系。我们也学到了很多关于未来可能通过提供虚拟体验的混合亲身活动hybrid in-person events来提供更具包容性的体验。今年,我们很想念在我们的社区中见到的许多朋友,并期待着在安全的情况下再次见到你们。 + +我们的 [培训和认证][6] 团队能够帮助 170 多万名报名参加我们免费培训课程的人。我要祝贺今年获得 LF 认证的 4 万多人。 + +《[LF 的 2020 年度工作报告][7]》显示,尽管商业环境充满挑战,但经过培训和认证的开源专业人员仍有大有需求,并能轻松地展示其价值。 + +作为我们正在进行的多元化努力的一部分,在加入反对不平等的斗争中,我们的社区专注于该如何在项目中使用语言,并寻找导师来指导下一代的贡献者。我们的社区,如 Linux 内核团队和在北美 KubeCon 上发起的 [包容性命名倡议][8]Inclusive Naming Initiative,在加强我们的互动方式上取得了进展。 + +今年是我们联合发展基金会Joint Development Foundation(JDF)和开放标准社区open standards communities的突破性一年。我们迎来了六个建立开放标准的新项目。[JDF 还被批准为 ISO/IEC JTC 1 公开发布规范(PAS)提交者][9]。今年还标志着我们的第一个开放标准社区 OpenChain 通过 PAS 程序,被正式认可为国际标准。今天,Linux 基金会可以把我们的社区,从开源仓库带到一个公认的全球标准。 + +今年,我们生态系统中的许多人已经站出来帮助安全工作。一个新的社区 [开源安全基金会][10]Open Source Security Foundation(OpenSSF)启动了,以协调专注于提高开源软件安全性的努力。 + +当我们继续在美国与挑战作斗争时,[我们也重申 LF 是全球社区的一部分][11]。 + +我们的成员必须得应对国际贸易政策变化的一年,并了解到开放源码在政治上的蓬勃发展。来自世界各地的我们的成员社区参与了开放合作open collaboration,因为它是开放、中立和透明的。这些参与者显然希望继续与全球同行合作,以应对大大小小的挑战。 + +在这困难的一年结束时,所有这些都让我们确信,开放合作是解决世界上最复杂挑战的模式。没有任何一个人、组织或政府能够单独创造出我们解决最紧迫问题所需的技术。我们代表整个 Linux 基金会团队,期待着帮助您和我们的社区应对接下来的任何挑战。 + +![][12] + +Jim Zemlin,Linux 基金会执行总监 + +- [下载 Linux 基金会 2020 年度报告][2] + +这篇文章首先发布于 [Linux 基金会][14]。 + +-------------------------------------------------------------------------------- + +via: https://www.linux.com/news/download-the-2020-linux-foundation-annual-report/ + +作者:[The Linux Foundation][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.linuxfoundation.org/blog/2020/12/download-the-2020-linux-foundation-annual-report/ +[b]: https://github.com/lujun9972 +[1]: https://www.linuxfoundation.org/wp-content/uploads/2020/12/2020-Linux-Foundation-Annual-Report_blogheader.png +[2]: http://linuxfoundation.org/2020-annual-report +[3]: https://www.lfph.io/ +[4]: https://www.finos.org/ +[5]: https://events.linuxfoundation.org/ +[6]: https://training.linuxfoundation.org/ +[7]: https://training.linuxfoundation.org/resources/2020-open-source-jobs-report/ +[8]: https://inclusivenaming.org/ +[9]: https://www.linuxfoundation.org/blog/2020/05/joint-development-foundation-recognized-as-an-iso-iec-jtc-1-pas-submitter-and-submits-openchain-for-international-review/ +[10]: https://openssf.org/ +[11]: https://www.linuxfoundation.org/blog/2020/08/open-source-collaboration-is-a-global-endeavor/ +[12]: https://www.linuxfoundation.org/wp-content/uploads/2020/12/JimZemlin_Sig-150x150.png +[13]: https://www.linuxfoundation.org/blog/2020/12/download-the-2020-linux-foundation-annual-report/ +[14]: https://www.linuxfoundation.org/ diff --git a/published/202012/20201203 Get the most out of the Vi text editor.md b/published/202012/20201203 Get the most out of the Vi text editor.md new file mode 100644 index 0000000000..18fba6c81c --- /dev/null +++ b/published/202012/20201203 Get the most out of the Vi text editor.md @@ -0,0 +1,94 @@ +[#]: collector: (lujun9972) +[#]: translator: (wxy) +[#]: reviewer: (wxy) +[#]: publisher: (wxy) +[#]: url: (https://linux.cn/article-12947-1.html) +[#]: subject: (Get the most out of the Vi text editor) +[#]: via: (https://opensource.com/article/20/12/vi-text-editor) +[#]: author: (Seth Kenlon https://opensource.com/users/seth) + +初识 Vi 文本编辑器 +====== + +> Vi 是典型的 Unix 文本编辑器。来了解一下它或它的各种化身:Vim、Neovim、gVim、nvi 或 Elvis,它适用于 Linux、macOS、Windows 或 BSD。 + +![](https://img.linux.net.cn/data/attachment/album/202012/23/222122wc8resp5zpo2yrcm.jpg) + +不管你用的是 Vim、Neovim、gVim、nvi,甚至是 Elvis,其实都是这个典型的 Unix 编辑器 Vi。可能每一个 Linux 和 BSD 发行版中都包含了 Vi,Vi 是一个轻量级的简约型文本编辑器,由于其简单简洁的键盘快捷键和双模式设计,很多用户都喜欢它。 + +最初的 Vi 编辑器是由 [C shell][2] 的创建者 Bill Joy 编写的应用程序。现代 Vi 的化身已经[增加了许多功能][3],包括多级撤销、插入模式下更好的导航、行折叠、语法高亮、插件支持等等。Vim 被认为是它的最流行的现代实现,大多数人在提到 Vi 时实际上是指 Vim。 + +所有这些化身都是为了同一个目标,所以本文将从通用的场景来探讨 Vi。你的计算机上的版本可能略有不同,但你仍然可以从 Vi 编辑文本的方式中获益。 + +### 安装 Vi + +如果你运行的是 Linux、macOS 或 BSD,那么你已经安装了 `vi` 命令。如果你在 Windows 上,你可以[下载 Vim 和 gVim][4]。 + +![gVim][5] + +在 [NetBSD][7]上,nvi 是 Vi 的常见替代品,而 Slackware 则提供了 [Elvis][8](和 Vim),流行的 [Neovim][9] 复刻旨在帮助用户用 [Lua][10] 扩展 Vim。 + +### 启动 Vi + +在终端中用 `vi` 命令启动 Vi 或 Vim。如果在你的系统中没有找到 `.vimrc` 文件,那么 Vim 就会以 Vi 兼容模式启动(也可以用 `-C` 选项强制启动该模式)。如果你想使用 gVim 以拥有一个图形用户界面(GUI),你可以从桌面的应用程序菜单中启动它。 + +如果你是一个刚刚学习 Vi 的新用户,使用图形用户界面是一个很好的方法,可以在你可能期望的文本编辑器的行为和 Vi 的设计行为之间提供一个缓冲带。图形用户界面版本有一个菜单栏,一些鼠标集成,一个工具栏和其他功能,这可以帮助你找到你可能认为在典型的文本编辑器中理所当然的基本功能,但还不知道如何在 Vi 中做。 + +### 如何使用 Vi + +学习 Vi 最简单的方法可能是使用 `vimtutor`,这是一个与 Vim 打包在一起的交互式教程。要开始学习该教程,启动 `vimtutor` 并阅读说明,尝试每个练习。正如教程中所说,学好 Vi 不是记住什么键做什么,而是建立肌肉记忆,以在输入时调用常用的动作。 + +#### Esc 键 + +学习 Vi 的第一件重要的事就是掌握 `Esc` 键。`Esc` 是激活*命令模式*的工具,很快你就会明白,在 Vi 中,只要你不确定,就按 `Esc`。在命令模式下,你按下的任何键都不会被输入到你正在处理的文本文档中,而是被 Vi 解释为一条命令。例如,要将光标向左移动,你可以按键盘上的 `H` 键。如果你处于*插入*模式,那么按 `H` 键就会输入字母 H,就像你期望的那样。但在*命令*模式下,按 `H` 向左移动,`L` 向右移动,`J` 向下移动,`K` 向上移动。 + +命令模式和插入模式的分离与其他文本编辑器的工作方式形成了鲜明的对比,由于这种设计,这可能是 Vi 最显著的差异化。不过有趣的是,理论上来说,它与你可能已有的工作方式并没有太大的区别。毕竟,当你把手从键盘上拿开,用鼠标选择文本时,你基本上是将自己置于一种命令模式中。在 Vi 中,你不需要把手从键盘上移开来移动鼠标,也不需要按功能键或 `Ctrl` 键,而是将*编辑器*放入一种特殊的操作模式中,使你的按键重新分配到命令上,而不是文字输入。 + +#### 扩展 Vi + +在 Vim 8.0 版本之前,Vi 在很大程度上“只是”一个文本编辑器。它有插件,但安装插件是一个手动的过程,很多用户从未想过要这么做。幸运的是,Vim 8 及以上版本提供了对插件管理的支持,使得安装和加载插件变得轻而易举。 + +安装 Vim 的插件可以通过 `vim-plug` 功能来完成。例如,要安装 Vi 文件浏览器 [NERDTree][11]: + +``` +:PlugInstall NERDTree +``` + +你也可以更新插件: + +``` +:PlugUpdate NERDTree +``` + +关于使用 `vim-plug` 和手动安装插件和主题的更多信息,请阅读我的文章《[如何安装 Vim 插件][12]》。 + +### 默认 Vi + +Vi 不仅仅流行,它还是一个 [POSIX][13] 标准。它是每个系统管理员都应该知道如何使用的应用程序,即使他们不打算每天使用它。它也是一个快速而简单的编辑器,所以一旦你熟练掌握了它,它可能就是你一直在寻找的编辑器。 + +-------------------------------------------------------------------------------- + +via: https://opensource.com/article/20/12/vi-text-editor + +作者:[Seth Kenlon][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/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/20/8/tcsh +[3]: https://vimhelp.org/vi_diff.txt.html#vi-differences +[4]: https://www.vim.org/download.php +[5]: https://opensource.com/sites/default/files/uploads/gvim.jpg (gVim) +[6]: https://creativecommons.org/licenses/by-sa/4.0/ +[7]: https://opensource.com/article/19/3/netbsd-raspberry-pi +[8]: https://github.com/mbert/elvis +[9]: http://neovim.io +[10]: https://opensource.com/article/20/2/lua-cheat-sheet +[11]: https://www.vim.org/scripts/script.php?script_id=1658 +[12]: https://opensource.com/article/20/2/how-install-vim-plugins +[13]: https://opensource.com/article/19/7/what-posix-richard-stallman-explains diff --git a/published/202012/20201205 Why 2020 is the best time to use the Kate text editor.md b/published/202012/20201205 Why 2020 is the best time to use the Kate text editor.md new file mode 100644 index 0000000000..1cabfff470 --- /dev/null +++ b/published/202012/20201205 Why 2020 is the best time to use the Kate text editor.md @@ -0,0 +1,69 @@ +[#]: collector: (lujun9972) +[#]: translator: (geekpi) +[#]: reviewer: (wxy) +[#]: publisher: (wxy) +[#]: url: (https://linux.cn/article-12928-1.html) +[#]: subject: (Why 2020 is the best time to use the Kate text editor) +[#]: via: (https://opensource.com/article/20/12/kate-text-editor) +[#]: author: (Seth Kenlon https://opensource.com/users/seth) + +为什么 2020 年是使用 Kate 文本编辑器的最佳时机? +====== + +> 了解更多关于长期受喜爱的文本编辑器的信息,它为每个用户提供了一些东西。 + +![](https://img.linux.net.cn/data/attachment/album/202012/17/133952wga2azisy8uy1ajz.jpg) + +KDE Plasma 桌面提供了很多东西:一个很棒的桌面、一个灵活的文件管理器,以及紧密集成的应用。然而,人们很容易忽视它的默认文本编辑器,其中之一就是 [Kate][2]。2020 年 12 月 14 日,[Kate 将迎来 20 岁生日][3],在其 20 年的发展历程中,它在一个简单明了的编辑器和一个适度的集成开发环境 (IDE) 之间取得了完美的平衡。 + +### 安装 Kate + +如果你正在运行 KDE Plasma 桌面,你可能已经安装了 Kate。如果还没有安装,不管你运行的是哪个桌面,你都可以在你的软件仓库中找到它。 + +另外,[你可以在 Linux 或 Chromebook 上从][4] [Flathub.org][5] 使用 Flatpak 安装 Kate。 + +在 Windows 上,[你可以从 Windows 商店获得 Kate][6]。 + +要在 macOS 上安装它,[从 KDE build 网站下载 macOS 版本][7]。 + +### 所有的功能 + +第一眼,Kate 似乎并不显眼。它看起来就像其他的文本编辑器一样:一个巨大的空白窗口,可以接受大量的输入,顶部有一个菜单栏,边缘有一些元数据来指示字符编码和行数。但当你开始使用它的那一刻,你会发现它拥有你所需要的所有功能,就在你想要的地方。 + +例如,沿着 Kate 窗口的左侧是行数,默认情况下是启用的。更好的是,当你输入常用的编码语言或标记语法时,代码折叠就会被激活。窗口右侧的文件导航面板可以快速、直观地访问文件的不同部分。而窗口底部则包含了常用模式设置,包括插入或覆盖、字符编码(如 UTF-8)和语法高亮。 + +![Kate][8] + +不过,这还不是全部。听起来可能有很多,但布局很方便,很直观。在菜单和设置中还有更多的功能。 + +Kate 的功能有集成 Git、文件浏览器、shell、打开文档或项目的面板、单词补全、XML 补全、标签式界面、分屏和插件结构,因此你可以进一步扩展其功能。 + +### 给所有用户使用的编辑器 + +Kate 的极强灵活性使它既是一个简单的文本编辑器,又是一个强大的 IDE。通过默认使用的熟悉的界面,它吸引了广大的用户;而通过提供与调试器、编译器和代码检查器集成的能力,它吸引了开发人员。 + +因为它允许用户控制它的 UI 布局,Kate 确保每个用户都能优化使用它的体验。传统上,这一直是一个难以平衡的问题:一个拥有太多功能的编辑器给人的感觉太像一个臃肿的 IDE,而一个界面简单、功能模糊的编辑器给人的感觉是基础的或不方便的。Kate 将真正有用的功能放在了 UI 的最前面,从而让每个人都能享受到,同时又让高级功能可以被发现,但又不碍事。 + +坦率地说,Kate 让人难以割舍。它使用起来很愉快,配置起来很简单,探索起来也很有趣。今天就安装 Kate 吧,试一试它。它在所有主要的平台上都可以使用,你没有什么理由不选择 Kate 作为你的新宠编辑器。 + +-------------------------------------------------------------------------------- + +via: https://opensource.com/article/20/12/kate-text-editor + +作者:[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/programming_code_keyboard_orange_hands.png?itok=G6tJ_64Y (Programming at a browser, orange hands) +[2]: http://kate-editor.org +[3]: https://kate-editor.org/post/2020/2020-11-08-kate-is-soon-20-years-old/ +[4]: https://flathub.org/apps/details/org.kde.kate +[5]: http://Flathub.org +[6]: https://www.microsoft.com/en-nz/p/kate/9nwmw7bb59hw?rtc=1&activetab=pivot:overviewtab +[7]: https://binary-factory.kde.org/view/MacOS/job/Kate_Release_macos/ +[8]: https://opensource.com/sites/default/files/kate.jpg (Kate) diff --git a/published/202012/20201206 Experience the useful features of the Xedit text editor.md b/published/202012/20201206 Experience the useful features of the Xedit text editor.md new file mode 100644 index 0000000000..c0c21ff7ca --- /dev/null +++ b/published/202012/20201206 Experience the useful features of the Xedit text editor.md @@ -0,0 +1,109 @@ +[#]: collector: (lujun9972) +[#]: translator: (geekpi) +[#]: reviewer: (wxy) +[#]: publisher: (wxy) +[#]: url: (https://linux.cn/article-12930-1.html) +[#]: subject: (Experience the useful features of the Xedit text editor) +[#]: via: (https://opensource.com/article/20/12/xedit) +[#]: author: (Seth Kenlon https://opensource.com/users/seth) + +体验 Xedit 文本编辑器的实用功能 +====== + +> Xedit 是 X11 图形服务器的一部分,它不算好看,但却有足够的隐藏功能,使它成为一个严肃的文本编辑器。 + +![](https://img.linux.net.cn/data/attachment/album/202012/18/075942uzhgjgxfxve7p2ot.jpg) + +X11 图形服务器由 [X.org][2] 发布,它有一些象征性的应用来展示如何使用它提供的工具进行编程。这些应用包括从 [TWM][3] 桌面到愚蠢但催眠的 Xeyes。它还包括一个名为 Xedit 的文本编辑器,它是一个看似简单的应用,却有足够的隐藏功能,使其成为一个严肃的编辑器。 + +### 安装 Xedit + +如果你使用的是 Linux 或 BSD,你可以从你的发行版软件仓库或 ports 树中安装 Xedit。它有时会出现在一个名为 X11-apps 的软件包中,与其他 X11 应用捆绑在一起。 + +在 macOS 上,你可以安装 [XQuartz][4],它提供了 Xedit、Xeyes 和其他一些小程序(以及一个 X11 图形服务器)。 + +### 启动 Xedit + +如果它被列在你的应用菜单的话,你可以从中启动 Xedit。尽管它绝对是一个 GUI 应用,但有些发行版将它视为命令而不是 GUI 应用,所以它可能不会被列在应用菜单中。这时,你可以从终端启动 Xedit。如果你输入 `xedit &` 来启动应用,它就会启动一个空的 Xedit 编辑器,可以随时输入。如果你在输入启动命令的同时输入一个现有的文件名,Xedit 启动时会将文件加载到缓冲区。 + +``` +$ xedit example.txt & +``` + +![Xedit][5] + +### 加载文件 + +在打开的 Xedit 实例中,你可以在顶部文本输入框中输入文件的路径来加载文件。点击 **Load** 按钮(在文本输入框的左边),将文件读入 Xedit 窗口。 + +![Load Xedit][7] + +你可以同时打开多个文件。当一个文件被加载时,它将获取焦点并出现在你的主 Xedit 缓冲区(主窗口中的大文本输入框),并将任何现有的文件切换到一个隐藏的缓冲区。 + +你可以使用组合键在缓冲区之间切换,这对 Emacs 用户而言很熟悉,但对其他用户会感到困惑。首先,按下 `Ctrl+X`。放开然后按 `Ctrl+B`。 + +### 组合键 + +一开始执行需要连续*两*个键盘快捷键的操作感觉很奇怪,但过了一段时间,你就会习惯。事实上,作为一个经常使用 Emacs 的用户,我发现复合键组合很有节奏感。我很惊讶也很高兴地发现,我最喜欢的一些快捷键在 Xedit 中也有效。 + +原来,Xedit 从几个灵感来源借用了键盘快捷键。如果你是 Emacs 用户,你会发现最常见的组合在 Xedit 中有效。例如,`C-x C-f` (即 `Ctrl+X` 后是 `Ctrl+F`)可以回到顶部的文本输入框来加载文件,而 `C-x C-s`(`Ctrl+X` 后是 `Ctrl+S`)可以保存文件。令人惊讶的是,`C-x 3` 甚至可以垂直分割窗口,而 `C-x 2` 则可以水平分割,`C-x 0` 或 `C-x 1` 则可以移除分割。 + +Emacs 或 Bash 用户熟悉的编辑命令也适用: + + * `Ctrl+A` 移动到行首。 + * `Ctrl+E` 移至行尾。 + * `Alt+B` 向后移动一个单词。 + * `Ctrl+B` 向后移动一个字符。 + * `Ctrl+F` 向前移动一个字符。 + * `Alt+F` 向前移动一个单词。 + * `Ctrl+D 删除下一个字符。 + +还有更多,它们都在 Xedit 手册页面上列出。 + +### 使用行编辑模式 + +Xedit 还含有一个类似 `ex` 的行编辑器,这对 [Vi][8] 和 `ed` 甚至 `sed` 用户应该很熟悉。要进入行编辑模式,按下 `Esc` 键。这将使你处于顶部的文本输入框,但处于命令模式。编辑命令使用的语法是:*行号*后面跟着一个*命令*和*参数*。 + +比如说你有这个文本文件: + +``` +ed is the standard Unix text editor. +This is line number two. +``` + +你决定将第 1 行的 `ed` 改为 `Xedit`。在 Xedit 中,移动到第 1 行,按下 `Esc`,然后输入 `.,s/ed/Xedit/`。 + +``` +Xedit is the standard Unix text editor. +This is line number two. +``` + +不用将光标移到下一行,你可以将 `two` 改为 `the second`。按下 `Esc`,然后输入 `2,s/two/the second/`。 + +各种命令和有效的参数在 Xedit 的手册页中列出。 + +### 简单但稳定 + +Xedit 并不算好看,它很简单,没有菜单可言,但它借鉴了一些最好的 Unix 编辑器的流行的便利性。下次你在寻找新的编辑器时,不妨试试 Xedit。 + +-------------------------------------------------------------------------------- + +via: https://opensource.com/article/20/12/xedit + +作者:[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/browser_screen_windows_files.png?itok=kLTeQUbY (Computer screen with files or windows open) +[2]: https://www.x.org/wiki/ +[3]: https://opensource.com/article/19/12/twm-linux-desktop +[4]: http://xquartz.org +[5]: https://opensource.com/sites/default/files/uploads/xedit.jpeg (Xedit) +[6]: https://creativecommons.org/licenses/by-sa/4.0/ +[7]: https://opensource.com/sites/default/files/uploads/xedit-load.jpg (Load Xedit) +[8]: https://opensource.com/article/20/12/vi-text-editor diff --git a/published/202012/20201207 Add storage to your Fedora system with LVM.md b/published/202012/20201207 Add storage to your Fedora system with LVM.md new file mode 100644 index 0000000000..9026ead2e4 --- /dev/null +++ b/published/202012/20201207 Add storage to your Fedora system with LVM.md @@ -0,0 +1,272 @@ +[#]: collector: (lujun9972) +[#]: translator: (geekpi) +[#]: reviewer: (wxy) +[#]: publisher: (wxy) +[#]: url: (https://linux.cn/article-12936-1.html) +[#]: subject: (Add storage to your Fedora system with LVM) +[#]: via: (https://fedoramagazine.org/add-storage-to-your-fedora-system-with-lvm/) +[#]: author: (Tim Bosse https://fedoramagazine.org/author/maztaim/) + +使用 LVM 为你的 Fedora 系统添加存储 +====== + +![][1] + +有时需要在系统中添加另一块磁盘。这就是逻辑卷管理Logical Volume Management(LVM)的用武之地。LVM 的好处之处在于它相当灵活。有几种方法可以添加一块磁盘。这篇文章介绍了一种方法。 + +### 注意! + +这篇文章并不包括将新的磁盘物理地安装到系统中的过程。请查阅你的系统和磁盘文档,了解如何正确地进行安装。 + +**重要:** 一定要确保你已经备份重要数据。如果新磁盘已有数据,那么本文中描述的步骤将破坏数据。 + +### 最好了解 + +本文并没有深入介绍 LVM 的每一个功能,重点是添加磁盘。但基本上你要了解,LVM 有卷组volume group(VG),它由一个或多个分区和/或磁盘组成。你把这些分区或磁盘以物理卷physical volume(PV)的方式添加到卷组。一个卷组可以分成许多逻辑卷logical volume(LV)。逻辑卷可以作为文件系统、ramdisk 等其他存储使用。更多信息可以在[这里][2]中找到。 + +可以看作是,把物理卷形成一个存储池(一个卷组),然后从这个存储池中划分出逻辑卷,供你的系统直接使用。 + +### 准备 + +确保你能看到你要添加的磁盘。在添加磁盘之前使用 `lsblk` 查看哪些存储空间已经可用或正在使用。 + +``` +$ lsblk +NAME MAJ:MIN RM SIZE RO TYPE MOUNTPOINT +zram0 251:0 0 989M 0 disk [SWAP] +vda 252:0 0 20G 0 disk +├─vda1 252:1 0 1G 0 part /boot +└─vda2 252:2 0 19G 0 part +└─fedora_fedora-root 253:0 0 19G 0 lvm / +``` + +本文使用的是带有虚拟存储的虚拟机,因此设备名称以 `vda` 开头代表第一个磁盘,`vdb` 代表第二个磁盘,以此类推。你的设备名称可能不同。许多系统会将 `sda` 作为第一个物理磁盘,`sdb` 代表第二个磁盘,以此类推。 + +当已连接新磁盘,并且你的系统已备份且正在运行,再次使用 `lsblk` 来查看新的块设备。 + +``` +$ lsblk +NAME MAJ:MIN RM SIZE RO TYPE MOUNTPOINT +zram0 251:0 0 989M 0 disk [SWAP] +vda 252:0 0 20G 0 disk +├─vda1 252:1 0 1G 0 part /boot +└─vda2 252:2 0 19G 0 part +└─fedora_fedora-root 253:0 0 19G 0 lvm / +vdb 252:16 0 10G 0 disk +``` + +现在有一个名为 `vdb` 的新设备。该设备的位置是 `/dev/vdb`。 + +``` +$ ls -l /dev/vdb +brw-rw----. 1 root disk 252, 16 Nov 24 12:56 /dev/vdb +``` + +我们可以看到磁盘,但我们还不能用 LVM 来使用它。如果你运行 `blkid`,你应该不会看到它被列出。对于这个和之后的命令,你需要确保你的系统[已配置好,这样你可以使用 sudo][3]: + +``` +$ sudo blkid +/dev/vda1: UUID="4847cb4d-6666-47e3-9e3b-12d83b2d2448" BLOCK_SIZE="4096" TYPE="ext4" PARTUUID="830679b8-01" +/dev/vda2: UUID="k5eWpP-6MXw-foh5-Vbgg-JMZ1-VEf9-ARaGNd" TYPE="LVM2_member" PARTUUID="830679b8-02" +/dev/mapper/fedora_fedora-root: UUID="f8ab802f-8c5f-4766-af33-90e78573f3cc" BLOCK_SIZE="4096" TYPE="ext4" +/dev/zram0: UUID="fc6d7a48-2bd5-4066-9bcf-f062b61f6a60" TYPE="swap" +``` + +### 将磁盘添加到 LVM 中 + +使用 `pvcreate` 初始化磁盘。你需要传递设备的完整路径。在这个例子中,它是 `/dev/vdb`。在你的系统中,它可能是 `/dev/sdb` 或其他设备名。 + +``` +$ sudo pvcreate /dev/vdb +Physical volume "/dev/vdb" successfully created. +``` + +当你运行 `blkid` 时,你应该看到磁盘已经被初始化为一个 `LVM2_member`: + +``` +$ sudo blkid +/dev/vda1: UUID="4847cb4d-6666-47e3-9e3b-12d83b2d2448" BLOCK_SIZE="4096" TYPE="ext4" PARTUUID="830679b8-01" +/dev/vda2: UUID="k5eWpP-6MXw-foh5-Vbgg-JMZ1-VEf9-ARaGNd" TYPE="LVM2_member" PARTUUID="830679b8-02" +/dev/mapper/fedora_fedora-root: UUID="f8ab802f-8c5f-4766-af33-90e78573f3cc" BLOCK_SIZE="4096" TYPE="ext4" +/dev/zram0: UUID="fc6d7a48-2bd5-4066-9bcf-f062b61f6a60" TYPE="swap" +/dev/vdb: UUID="4uUUuI-lMQY-WyS5-lo0W-lqjW-Qvqw-RqeroE" TYPE="LVM2_member" +``` + +你可以使用 `pvs` 列出当前所有可用的物理卷: + +``` +$ sudo pvs +PV VG Fmt Attr PSize PFree +/dev/vda2 fedora_fedora lvm2 a-- <19.00g 0 +/dev/vdb lvm2 --- 10.00g 10.00g +``` + +`/dev/vdb` 被列为一个 PV (物理卷),但还没有分配到一个 VG (卷组)。 + +### 将物理卷添加到一个卷组 + +你可以使用 `vgs` 找到可用的卷组列表: + +``` +$ sudo vgs +VG #PV #LV #SN Attr VSize VFree +fedora_fedora 1 1 0 wz--n- 19.00g 0 +``` + +在本例中,只有一个卷组可用。接下来,将物理卷添加到 `fedora_fedora`: + +``` +$ sudo vgextend fedora_fedora /dev/vdb +Volume group "fedora_fedora" successfully extended +``` + +你现在应该看到物理卷已被添加到卷组中: + +``` +$ sudo pvs +PV VG Fmt Attr PSize PFree +/dev/vda2 fedora_fedora lvm2 a– <19.00g 0 +/dev/vdb fedora_fedora lvm2 a– <10.00g <10.00g +``` + +看一下卷组: + +``` +$ sudo vgs +VG #PV #LV #SN Attr VSize VFree +fedora_fedora 2 1 0 wz–n- 28.99g <10.00g +``` + +你也可以获得具体卷组和物理卷的详细列表: + +``` +$ sudo vgdisplay fedora_fedora +--- Volume group --- +VG Name fedora_fedora +System ID +Format lvm2 +Metadata Areas 2 +Metadata Sequence No 3 +VG Access read/write +VG Status resizable +MAX LV 0 +Cur LV 1 +Open LV 1 +Max PV 0 +Cur PV 2 +Act PV 2 +VG Size 28.99 GiB +PE Size 4.00 MiB +Total PE 7422 +Alloc PE / Size 4863 / 19.00 GiB +Free PE / Size 2559 / 10.00 GiB +VG UUID C5dL2s-dirA-SQ15-TfQU-T3yt-l83E-oI6pkp +``` + +看下物理卷: + +``` +$ sudo pvdisplay /dev/vdb +--- Physical volume --- +PV Name /dev/vdb +VG Name fedora_fedora +PV Size 10.00 GiB / not usable 4.00 MiB +Allocatable yes +PE Size 4.00 MiB +Total PE 2559 +Free PE 2559 +Allocated PE 0 +PV UUID 4uUUuI-lMQY-WyS5-lo0W-lqjW-Qvqw-RqeroE +``` + +现在我们已经添加了磁盘,我们可以为逻辑卷 (LV) 分配空间: + +``` +$ sudo lvs +LV VG Attr LSize Pool Origin Data% Meta% Move Log Cpy%Sync Convert +root fedora_fedora -wi-ao---- 19.00g +``` + +看一下逻辑卷。下面是详细的逻辑卷信息: + +``` +$ sudo lvdisplay fedora_fedora/root +--- Logical volume --- +LV Path /dev/fedora_fedora/root +LV Name root +VG Name fedora_fedora +LV UUID yqc9cw-AvOw-G1Ni-bCT3-3HAa-qnw3-qUSHGM +LV Write Access read/write +LV Creation host, time fedora, 2020-11-24 11:44:36 -0500 +LV Status available +LV Size 19.00 GiB +Current LE 4863 +Segments 1 +Allocation inherit +Read ahead sectors auto +- currently set to 256 +Block device 253:0 +``` + +查看根文件系统(`/`)的大小,并将它与逻辑卷大小进行比较。 + +``` +$ df -h / +Filesystem Size Used Avail Use% Mounted on +/dev/mapper/fedora_fedora-root 19G 1.4G 17G 8% / +``` + +逻辑卷和文件系统大小都为 19G。让我们给根逻辑卷(`root`)增加 5G。 + +``` +$ sudo lvresize -L +5G fedora_fedora/root +Size of logical volume fedora_fedora/root changed from 19.00 GiB (4863 extents) to 24.00 GiB (6143 extents). +Logical volume fedora_fedora/root successfully resized. +``` + +我们现在有 24G 的逻辑卷可用。看看根文件系统(`/`)。 + +``` +$ df -h / +Filesystem Size Used Avail Use% Mounted on +/dev/mapper/fedora_fedora-root 19G 1.4G 17G 8% / +``` + +我们仍然显示只有 19G 的空闲空间,这是因为逻辑卷与文件系统不一样。要使用增加到逻辑卷的新空间,请调整文件系统的大小。 + +``` +$ sudo resize2fs /dev/fedora_fedora/root +resize2fs 1.45.6 (20-Mar-2020) +Filesystem at /dev/fedora_fedora/root is mounted on /; on-line resizing required +old_desc_blocks = 3, new_desc_blocks = 3 +The filesystem on /dev/fedora_fedora/root is now 6290432 (4k) blocks long. +``` + +看看文件系统的大小。 + +``` +$ df -h / +Filesystem Size Used Avail Use% Mounted on +/dev/mapper/fedora_fedora-root 24G 1.4G 21G 7% / +``` + +正如你所看到的,根文件系统(`/`)已经占用了逻辑卷上的所有可用空间,而且不需要重新启动。 + +现在你已经将一个磁盘初始化为物理卷,并使用新的物理卷扩展了卷组。之后,你增加了逻辑卷的大小,并调整了文件系统的大小,以使用逻辑卷的新空间。 + +-------------------------------------------------------------------------------- + +via: https://fedoramagazine.org/add-storage-to-your-fedora-system-with-lvm/ + +作者:[Tim Bosse][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/maztaim/ +[b]: https://github.com/lujun9972 +[1]: https://fedoramagazine.org/wp-content/uploads/2020/11/lvm-add-disk-816x345.jpg +[2]: https://en.wikipedia.org/wiki/Logical_Volume_Manager_(Linux) +[3]: https://fedoramagazine.org/howto-use-sudo/ \ No newline at end of file diff --git a/published/202012/20201207 Optimize your GNOME experience with the Gedit text editor.md b/published/202012/20201207 Optimize your GNOME experience with the Gedit text editor.md new file mode 100644 index 0000000000..23b7bfe389 --- /dev/null +++ b/published/202012/20201207 Optimize your GNOME experience with the Gedit text editor.md @@ -0,0 +1,70 @@ +[#]: collector: (lujun9972) +[#]: translator: (geekpi) +[#]: reviewer: (wxy) +[#]: publisher: (wxy) +[#]: url: (https://linux.cn/article-12933-1.html) +[#]: subject: (Optimize your GNOME experience with the Gedit text editor) +[#]: via: (https://opensource.com/article/20/12/gedit) +[#]: author: (Seth Kenlon https://opensource.com/users/seth) + +使用 gedit 文本编辑器优化你的 GNOME 体验 +====== + +> 它是一个可以完成工作的简约编辑器,并以隐藏的增强功能使得事情更简单。 + +![](https://img.linux.net.cn/data/attachment/album/202012/19/110419snchihpnjn8juxqc.jpg) + +作为默认的文本编辑器是一项吃力不讨好的工作。人们通常把默认文本编辑器几乎看作是一个演示应用、一个稍微好一点的 “hello World” 示例,说明应用在该平台上的是如何运行的。在极少数情况下,当用户需要将一些文本保存到一个可能永远不会再看的文件中时,用户会找到默认文本编辑器。对于“严肃”的工作,他们会转向文字处理器或 IDE,或终端中的编辑器,或者至少是一个不同的文本编辑器,必须像“真正的”应用一样下载和安装。 + +很奇怪,默认的文本编辑器很难被人重视,然而 GNOME 桌面的编辑器 gedit 却被广泛认为是一个真正有价值的文本编辑器,超越了它所在的桌面。它被用作网页设计课程的必备文本编辑器,是新手开发者和系统管理员的推荐工具,也是许多桌面 Linux 用户最喜欢的可靠伙伴。 + +### 安装 gedit + +如果你运行的是 GNOME 桌面,你可能已经安装了 gedit,尽管它可能只作为“文本编辑器”出现在你的应用菜单中。如果你不确定,只需在你的活动界面中输入 `gedit`,然后在打开的文本编辑器中进入 “About” 菜单项。 + +![gedit terminal box with black background and white letters][2] + +在 Windows 上,你可以[从微软商店下载并安装 gedit][3]。 + +在 Mac 上,你可以[使用 Homebrew][4]或 [MacPorts][5] 安装 gedit。 + +### 使用 gedit + +当你第一次启动 gedit 时,你会看到一个简约的界面,包括一个文本输入面板、一个标题栏和一个位于窗口底部的状态面板。底部的状态面板提供了一些常用的设置:你想使用哪种语法高亮模式、你喜欢的制表符宽度、以及一些流行的偏好,如行号、文本换行等等。这些选项中的大部分也可以在 “Preferences” 菜单中进行全局设置,它可在应用程序右上角的 “汉堡” 样式的菜单中找到。 + +### gedit 的隐藏功能 + +从表面上看,gedit 正是它所标榜的那样:一个不起眼的文本编辑器,它不会妨碍你的工作,因此你可以在屏幕上的框中输入字母。但是,这个简单的文本编辑器却隐藏着一些你可能不知道的令人兴奋的功能,即使你已经使用它多年。 + +这些键盘功能在 gedit 中并没有被记录下来: + + * `Ctrl+D` 删除当前行。这对于编码者或以标记格式(如 Asciidoc、reST 或 CommonMark)写作的人特别有用。 + * `Ctrl+I` 会弹出 “Go to Line” 下拉框。输入一个数字,你就会立即跳到该行。 + * `Alt+向上箭头` 或 `Alt+向下箭头` 会抓取当前行,并将它在文档中向上或向下移动。 + * `Alt+向左箭头` 或 `Alt+向右箭头` 抓取最近的单词(在光标左侧)并将其向左或向右移动。 + * 要输入特殊的 Unicode 字符,请按下 `Shift+Ctrl+U` 并松开,然后输入 Unicode 字符代码。你通常必须查找字符代码(除非你已经记住了一些,但谁有记性来记住这些字符代码?)例如,要打出一只企鹅,按下 `Shift+Ctrl+U` 然后松开。当你松开按键后,你会看到一个带下划线的 U,然后输入 `1F427`,后面跟一个空格,你的 Unicode 字符就会变成一个友好的 `🐧`。诚然,这并不完全是 gedit 所独有的,但这是个很有用的技巧,而且它在 gedit 中也确实有效。 + +### 稳定简单 + +Gedit 很像 GNOME 本身。它客观上比许多同类软件(比如 KDE 的 Kate)更简单,但它仍然能够满足你日常 80% 或 90% 的期望。 + +当然,可能会有一些任务 gedit 不是最佳工具。你可能会发现自己要深入研究一些独特的日志文件,或者需要一个精确的解析器或代码检查器,你会转向专门的应用。这没关系。gedit 并不意味着对所有用户都适用。但对于那些需要文本编辑器的人来说,它是一个很好的文本编辑器,有时这就是所需要的。在 Linux 或者在任何你正在使用的平台上,试一下 gedit,因为它很有可能是一个比默认应用的更好的选择。 + +-------------------------------------------------------------------------------- + +via: https://opensource.com/article/20/12/gedit + +作者:[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/wfh_work_home_laptop_work.png?itok=VFwToeMy (Working from home at a laptop) +[2]: https://opensource.com/sites/default/files/uploads/gedit-31_days_gedit-opensource.jpg (gedit terminal box with black background and white letters) +[3]: https://www.microsoft.com/en-nz/p/gedit +[4]: https://opensource.com/article/20/6/homebrew-mac +[5]: https://opensource.com/article/20/11/macports diff --git a/published/202012/20201208 Learn Bash by writing an interactive game.md b/published/202012/20201208 Learn Bash by writing an interactive game.md new file mode 100644 index 0000000000..9256415ebd --- /dev/null +++ b/published/202012/20201208 Learn Bash by writing an interactive game.md @@ -0,0 +1,123 @@ +[#]: collector: (lujun9972) +[#]: translator: (wxy) +[#]: reviewer: (wxy) +[#]: publisher: (wxy) +[#]: url: (https://linux.cn/article-12962-1.html) +[#]: subject: (Learn Bash by writing an interactive game) +[#]: via: (https://opensource.com/article/20/12/learn-bash) +[#]: author: (Jim Hall https://opensource.com/users/jim-hall) + +通过编写互动游戏学习 Bash +====== + +> 编程一个简单的游戏是练习一门新语言并与其他你掌握的语言进行比较的好方法。 + +![](https://img.linux.net.cn/data/attachment/album/202012/28/010432yq3vgsqtiol9zzi6.jpg) + +学习一门新的编程语言是很有趣的。每当我尝试学习一门新的语言时,我都会专注于定义变量、编写语句和评估表达式。一旦我对这些概念有了大致的了解,我通常可以自己弄清楚其余的概念。大多数编程语言都有一些相似之处,所以一旦你了解了一种编程语言,学习下一种编程语言就是要弄清楚其独特的细节,认识到其中的差异。 + +为了帮助我练习一种新的编程语言,我喜欢写一些测试程序。我经常写的一个示例程序是一个简单的“猜数字”程序,电脑在 1 到 100 之间选一个数字,让我猜这个数字。程序会一直循环,直到我猜对为止。 + +“猜数字”程序锻炼了编程语言中的几个概念:如何给变量赋值,如何写语句,如何进行条件判断和循环。对于学习一门新的编程语言来说,这是一个很好的实践实验。 + +### 用 Bash 猜数字 + +[Bash][2] 是大多数 Linux 系统的标准 shell。除了提供丰富的命令行用户界面外,Bash 还以*脚本*的形式支持完整的编程语言。 + +如果你对 Bash 不熟悉,我推荐你看这些介绍: + + * [什么是 Bash?][3]。 + * [开始使用 Bash 编程][4] + * [系统管理员的 Bash 脚本入门][5] + * [如何在 Bash 中编写函数][6] + * [阅读更多关于 Bash 的信息][7] + +你可以通过编写一个 Bash 版本的“猜数字”游戏来探索它。这是我的实现: + +``` +#!/bin/bash + +number=$(( $RANDOM % 100 + 1 )) + +echo "Guess a number between 1 and 100" + +guess=0 + +while [ "0$guess" -ne $number ] ; do + read guess + [ "0$guess" -lt $number ] && echo "Too low" + [ "0$guess" -gt $number ] && echo "Too high" +done + +echo "That's right!" +exit 0 +``` + +### 拆解这个脚本 + +脚本中的第一行,`#!/bin/bash` 告诉 Linux 使用 Bash shell 来运行这个脚本。每个脚本都以 `#!` 字符对(LCTT 译注:释伴)开始,这表示它是一个 shell 脚本。紧跟在`#!` 后面的是要运行的 shell。在本例中,`/bin/bash` 是指 Bash shell。 + +要给一个变量赋值,在变量名后面列出 `=` 号。例如,语句 `guess=0` 给 `guess` 变量分配一个零值。 + +你也可以使用 `read` 语句提示用户输入一个值。如果你写了 `read guess` 语句,Bash 会等待用户输入一些文本,然后把这个值存储在 `guess` 变量中。 + +要引用一个变量的值,在变量名前使用 `$`。所以, 在 `guess` 变量中存储了一个值后, 你可以使用 `$guess` 来检索它。 + +你可以使用任何你喜欢的变量名称,但是 Bash 为自己保留了一些特殊的变量名称。一个特殊的变量是 `RANDOM`,每次引用它都会产生一个很大的随机数。 + +如果你想在存储一个值的同时执行一个操作,你需要用特殊的括号把语句括起来。这将告诉 Bash 先执行该语句,而 `=` 则将结果值存储在变量中。要评估一个数学表达式,使用 `$(())` 围在你的语句上。双括号表示一个*算术表达式*。在我的例子中,`number=$(( $RANDOM % 100 + 1 ))` 评估表达式 `$RANDOM % 100 + 1`,然后将值存储在 `number` 变量中。 + +标准的算术运算符,如 `+`(加)、`-`(减)、`*`(乘)、`/`(除)和 `%`(模)都适用。 + +这意味着语句 `number=$(( $RANDOM % 100 + 1 ))` 产生一个 1 到 100 之间的随机数。模数运算符(`%`)返回两个数相除后的余数。在这种情况下,Bash 将一个随机数除以 100,剩下的余数范围是 0 到 99,通过在这个值上加 1,你可以得到一个介于 1 和 100 之间的随机数。 + +Bash 支持像循环这样的*条件表达式*和*流程控制*。在“猜数字”的游戏中,只要 `guess` 中的值不等于 `number`,Bash 就会继续循环。如果猜的数小于随机数,Bash 就会打印“太低”,如果猜的数大于数字,Bash 就会打印“太高”。 + +### 它是如何工作的 + +现在你已经写好了你的 Bash 脚本,你可以运行它来玩“猜数字”游戏。一直猜,直到你找到正确的数字: + +``` +Guess a number between 1 and 100 +50 +Too high +30 +Too high +20 +Too high +10 +Too low +15 +Too high +13 +Too low +14 +That's right! +``` + +每次运行这个脚本,Bash 都会随机选择一个不同的数字。 + +这个“猜数字”游戏是学习新的编程语言时的一个很好的入门程序,因为它以一种很直接的方式锻炼了几个常见的编程概念。通过在不同的编程语言中实现这个简单的游戏,你可以展示一些核心概念,并比较每种语言的细节。 + +你有喜欢的编程语言吗?你会如何用它来写“猜数字”游戏呢?请关注本系列文章,看看你可能感兴趣的其他编程语言的例子。 + +-------------------------------------------------------------------------------- + +via: https://opensource.com/article/20/12/learn-bash + +作者:[Jim Hall][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/jim-hall +[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://en.wikipedia.org/wiki/Bash_(Unix_shell) +[3]: https://opensource.com/resources/what-bash +[4]: https://opensource.com/article/20/4/bash-programming-guide +[5]: https://opensource.com/article/20/4/bash-sysadmins-ebook +[6]: https://opensource.com/article/20/6/bash-functions +[7]: https://opensource.com/tags/bash diff --git a/published/202012/20201209 How to Pretty Print JSON File in Linux Terminal.md b/published/202012/20201209 How to Pretty Print JSON File in Linux Terminal.md new file mode 100644 index 0000000000..1a9743ea6d --- /dev/null +++ b/published/202012/20201209 How to Pretty Print JSON File in Linux Terminal.md @@ -0,0 +1,116 @@ +[#]: collector: (lujun9972) +[#]: translator: (geekpi) +[#]: reviewer: (wxy) +[#]: publisher: (wxy) +[#]: url: (https://linux.cn/article-12915-1.html) +[#]: subject: (How to Pretty Print JSON File in Linux Terminal) +[#]: via: (https://itsfoss.com/pretty-print-json-linux/) +[#]: author: (Abhishek Prakash https://itsfoss.com/author/abhishek/) + +如何在 Linux 终端上漂亮地打印 JSON 文件 +====== + +![](https://img.linux.net.cn/data/attachment/album/202012/13/122331h00a3hc63ttoc630.jpg) + +[JSON][1] 文件非常棒,因为它们以人类可读的格式存储数据集合。然而,如果 JSON 文件被最小化过,那么阅读 JSON 文件可能会很痛苦。 + +以这个为例: + +![Minified JSON is difficult to read][2] + +计算机可以很容易地读取它。即使是人也能读,但如果 JSON 文件以合适的格式显示,那么阅读就会简单很多。我的意思是 JSON 文件应该是这样读的: + +![Pretty Printed JSON is easier to read][3] + +你可以使用大多数的文本编辑器和一些插件以合适的格式显示它。然而,如果你在终端中,或者你想在你的 shell 脚本中这么做,事情会有所不同。 + +如果你有一个已最小化过的 JSON 文件,让我来告诉你如何在 Linux 终端中漂亮地输出它。 + +### 在 Linux 中用 jq 命令漂亮地打印 JSON 文件 + +[jq][4] 是一个命令行 JSON 处理器。你可以用它来切分、过滤、映射和转换结构化数据。我在这里不打算详细介绍 `jq` 命令行工具的使用。 + +要使用 `jq`,你需要先安装它。你可以使用你的[发行版的包管理器][5]来安装它。如果启用了 [universe 仓库][6],你可以使用 `apt` 命令在 Ubuntu 上安装它: + +``` +sudo apt install jq +``` + +安装好后,用下面的方法在显示屏上漂亮地打印 JSON 文件: + +``` +jq . sample.json +``` + +![Pretty printed JSON file][7] + +你可能也想用 `cat`,但我认为 `cat` 在这里没用。 + +``` +cat sample.json | jq +``` + +请记住,上述命令不会影响原始 JSON 文件。不会向它写入任何更改。 + +你可能已经知道[如何在 Linux 中把命令输出重定向到一个文件][8]。你可能也知道不能重定向到同一个文件,而且 `tee` 命令也不能保证一直有效。 + +如果你想用漂亮的格式修改原来的 JSON 文件,可以把解析后的输出结果用管道传送到一个新的文件中,然后覆盖原来的 JSON 文件。 + +``` +jq . sample.json > pretty.json +``` + +![Pretty printing JSON file in Linux Terminal][9] + +#### 额外技巧:用 jq 命令对 JSON 文件最小化。 + +让我们反过来,对一个格式良好的 JSON 文件进行最小化。要最小化 JSON 文件,你可以使用选项 `-c`。 + +``` +jq -c < pretty.json +``` + +![Minified JSON file display][10] + +如果你愿意,你也可以使用 `cat` 和重定向: + +``` +cat pretty.json | jq -c +``` + +### 在 Linux 中使用 Python 来漂亮地打印 JSON 文件 + +你更有可能是在系统中安装了 Python。如果是这样的话,你可以用它在终端漂亮地打印 JSON 文件: + +``` +python3 -m json.tool sample.json +``` + +![Pretty printing JSON with Python][11] + +我知道还有其他方法可以解析 JSON 文件并以适当的格式打印出来。你可以自己去探索,但这两种方法足以完成漂亮地打印 JSON 文件的工作。 + +-------------------------------------------------------------------------------- + +via: https://itsfoss.com/pretty-print-json-linux/ + +作者:[Abhishek Prakash][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/abhishek/ +[b]: https://github.com/lujun9972 +[1]: https://www.json.org +[2]: https://i1.wp.com/itsfoss.com/wp-content/uploads/2020/12/print-json.png?resize=759%2C253&ssl=1 +[3]: https://i1.wp.com/itsfoss.com/wp-content/uploads/2020/12/pretty-printed-json.png?resize=696%2C538&ssl=1 +[4]: https://stedolan.github.io/jq/ +[5]: https://itsfoss.com/package-manager/ +[6]: https://itsfoss.com/ubuntu-repositories/ +[7]: https://i0.wp.com/itsfoss.com/wp-content/uploads/2020/12/pretty-print-json-linux-terminal.png?resize=750%2C557&ssl=1 +[8]: https://itsfoss.com/save-command-output-to-file-linux/ +[9]: https://i0.wp.com/itsfoss.com/wp-content/uploads/2020/12/pretty-printing-json-linux-terminal.png?resize=750%2C576&ssl=1 +[10]: https://i2.wp.com/itsfoss.com/wp-content/uploads/2020/12/minify-json-file-linux.png?resize=777%2C253&ssl=1 +[11]: https://i2.wp.com/itsfoss.com/wp-content/uploads/2020/12/pretty-print-json-with-python.png?resize=777%2C557&ssl=1 \ No newline at end of file diff --git a/published/202012/20201209 Make medit your next Linux terminal text editor.md b/published/202012/20201209 Make medit your next Linux terminal text editor.md new file mode 100644 index 0000000000..0f0470e5c9 --- /dev/null +++ b/published/202012/20201209 Make medit your next Linux terminal text editor.md @@ -0,0 +1,71 @@ +[#]: collector: (lujun9972) +[#]: translator: (geekpi) +[#]: reviewer: (wxy) +[#]: publisher: (wxy) +[#]: url: (https://linux.cn/article-12938-1.html) +[#]: subject: (Make medit your next Linux terminal text editor) +[#]: via: (https://opensource.com/article/20/12/medit) +[#]: author: (Seth Kenlon https://opensource.com/users/seth) + +让 medit 成为你的下一个 Linux 代码编辑器 +====== + +> 这款经典的文本编辑器提供了所有的基本功能和一些让你自定义你的体验的令人兴奋的功能。 + +![](https://img.linux.net.cn/data/attachment/album/202012/21/103921rqtvtsyvyvy5bsq7.jpg) + +有了 [XEDIT][2]、jEdit、NEdit、[gedit][3],最后还有 [medit][4]。  + +在我开始搜索我还没有尝试过的编辑器之前,我还没有听说过 medit,但我很高兴发现了它。如果你正在寻找经典的 gedit 体验(大约是 Gnome 2 上),那么 medit 可能无意间提供了一种出色且现代的近似体验。它也有许多额外的功能,比如可以使用 Python、Lua 或 C 语言编写插件,以及甚至可以将 shell 脚本集成到菜单系统。所有其他常用的功能也都在这里:标签式界面、一个即时的 shell、缩进管理、语法高亮等等。 + +### 安装 medit + +你可以从 [mooedit.sourceforge.net][5] 下载 medit。它确认可以在 Linux 和 Windows 上工作。如果你使用的是 Linux,你也可以在你的仓库中找到它。在 Slackware 上,我从 [slackbuilds.org][6] 安装了它。 + +![Medit terminal showing examples of Bash script in editor][7] + +### 使用 medit + +medit 宣称自己是一个“为编程和围绕编程”打造的编辑器,事实上,它的诞生是作为一个名为 GAP([群组、算法、编程][8]Groups、Algorithms、Programming)的更大项目的一部分。它的大部分功能都是针对典型的开发者的期望而开发。例如,在 **Edit** 菜单中,有增加和减少缩进的选项,这对于任何试图以可视方式指示范围的程序员来说都是一个常见的任务(对于 Python 程序员来说也是一个明文要求),还有注释或取消注释文本块的选项。 + +有些功能对普通用户也很有用。medit 有一个易于使用的标签式界面(既在窗口顶部,也在侧面的弹出式列表中),一个用于快速浏览文件系统的侧面板,在文件中添加书签的功能等等。它还具有针对两种编程语言以及标记语言和 Markdown 的语法高亮显示功能,因此它是可以用于编辑代码和普通文本的编辑器。 + +### 颜色方案 + +当编辑没有语法关联的纯文本或像 Asciidoc 这样的格式时,medit 没有预设的高亮方案,编辑器会采用你的系统默认值。我使用的是深色主题,所以 medit 在深灰色背景上显示白色文本。 + +不过对于语法高亮,文本会根据每个单词在其结构化语言中扮演的角色而变成彩色。一开始,我对 medit 的一些选择有些沮丧,很多颜色在我的深色背景下太暗,无法辨认,而且我觉得所有重要的元素都不够显眼。如果你不喜欢 medit 选择的方案,这个问题的答案在 **Preferences** 中,你可以更改颜色主题。我把我的颜色改成了 Tango,它呈现出一个日光照射的颜色阵列,在我的深色编辑器背景下非常出色,甚至给在 medit 主题下保持白色的元素添加了颜色。 + +![Medit terminal showing examples of Bash script in editor using Tango color scheme against dark background][9] + +### 弹出式 Python 控制台 + +在 medit 窗口的底部,有一个弹出的终端,用于快速访问 shell。这是一个很好的功能,但坦率地说,在你体验过 Emacs 和 [Kate][10]之后,这感觉很普通。medit 让我惊讶的是它的弹出式 Python 控制台,它从 **Tools** 菜单中启动,并预先导入了 **moo** 和 **gtk** 模块。换句话说,当你启动 medit 的 Python shell 时,你可以查看 medit 构建自身部分的 Python 和 GTK 模块。这是一个很好的功能,也许会给你写插件的灵感(这个弹出终端的是一个用 Python 编写的插件,所以你也可以通过它的代码来了解一个插件是如何编写的)。 + +### 经典编辑 + +medit 是一款出色的基于 GTK 的编辑器,它具有所有重要的基本功能和一些诱人的额外功能,可以帮助你扩展应用并使其成为你自己的。因为它接受 C、Python、Lua 和 Bash,所以你可以将它用于这几种用途。如果你正在为你的写作寻找一个有用的编辑器,无论是代码还是 Markdown 或介于两者之间的东西,给 medit 一个机会。 + +-------------------------------------------------------------------------------- + +via: https://opensource.com/article/20/12/medit + +作者:[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/coffee_tea_laptop_computer_work_desk.png?itok=D5yMx_Dr (Person drinking a hot drink at the computer) +[2]: https://linux.cn/article-12930-1.html +[3]: https://linux.cn/article-12933-1.html +[4]: http://mooedit.sourceforge.net/ +[5]: https://sourceforge.net/projects/mooedit/files/medit/ +[6]: https://slackbuilds.org/repository/14.2/development/medit +[7]: https://opensource.com/sites/default/files/uploads/medit-31_days_medit-opensource.png (Medit terminal showing examples of Bash script in editor) +[8]: https://www.gap-system.org/ +[9]: https://opensource.com/sites/default/files/uploads/medit-tango-colour-31_days_medit-opensource.png (Medit terminal showing examples of Bash script in editor using Tango color scheme against dark background) +[10]: https://opensource.com/article/20/12/kate-text-editor diff --git a/published/202012/20201210 Why Java developers love the jEdit text editor.md b/published/202012/20201210 Why Java developers love the jEdit text editor.md new file mode 100644 index 0000000000..f5b2cc3501 --- /dev/null +++ b/published/202012/20201210 Why Java developers love the jEdit text editor.md @@ -0,0 +1,68 @@ +[#]: collector: (lujun9972) +[#]: translator: (geekpi) +[#]: reviewer: (wxy) +[#]: publisher: (wxy) +[#]: url: (https://linux.cn/article-12942-1.html) +[#]: subject: (Why Java developers love the jEdit text editor) +[#]: via: (https://opensource.com/article/20/12/jedit) +[#]: author: (Seth Kenlon https://opensource.com/users/seth) + +为什么 Java 开发者喜欢 jEdit 文本编辑器 +====== + +> 这款编辑器打包了 Java 的功能,并提供了大量的插件来简化你的工作流程。 + +![](https://img.linux.net.cn/data/attachment/album/202012/22/133305j08dxrqx2fmp6s12.jpg) + +Java 是一门强大的语言。也许因为它经常被看作是一种“工业级”的工具,你可能不会想到它会成为文本编辑器的基础。毕竟,对于如此能力,文本编辑几乎是太容易了。事实上,在大多数现代编程工具包中,接受文本输入的组件是一个预编程的小部件。使用 Java 工具箱,一个简单的文本编辑器可以用 100 行左右的代码编写出来。那么 [jEdit][2] 能提供什么来证明它的存在价值呢? + +嗯,实际上,它有很多功能!jEdit 应用是一个令人耳目一新的提醒,提醒人们 Java 对于日常桌面应用是多么的实用和有用。它巧妙地展示了它的基础技术的活力,并且永远忠于 Java 的永恒承诺,在*所有*的平台上都能运作。 + +### 安装 jEdit + +jEdit 是用 Java 编写的,所以它适用于任何平台。[下载][3]通用安装程序或为所选的操作系统下载自定义安装程序。下载完成后(它很小,因此不会花费很长时间),请运行安装程序。 + +如果你没有安装 Java,请学习如何在 [Linux][4]、[Mac 或 Windows][5] 上安装 Java。 + +### 使用 jEdit + +在 jEdit 中编辑文本的方式和在任何桌面文本编辑器中编辑文本的方式是一样的。如果你使用过编辑器,那么你基本上已经会使用 jEdit 了。所有常用的键盘快捷键和惯例都适用。也有一些通常针对开发者的功能,如行号、折叠(该部分文本被隐藏,这样你就可以把注意力放在其他部分)和语法高亮。 + +但是,想象一下,从 [简单的 Vim][6] 到 [复杂的 Emacs][7]的各种文本编辑器中,你会发现 jEdit 与 Emacs 类似。虽然编辑组件和任何典型桌面编辑应用一样,但 jEdit 的附加功能包括插件、可以在编辑会话中实时录制的宏、特定于某些编辑模式的功能、缓冲区选项等。这是一个积极鼓励你把它变成你自己的编辑器。 + +你可以在三个地方对 jEdit 进行自定义:缓冲区选项、全局选项和插件管理器。 + +缓冲区选项(在 “Utilities” 菜单中)使你可以调整与当前文档关联的设置。通常,jEdit 会自动检测用于你正在执行的操作的适当模式。例如,编写 XML 会触发 jEdit 的 XML 高亮显示。但是,有时你想覆盖 jEdit 已检测到或未能检测到的内容。你还可以打开“显式折叠”模式,该模式允许你手动定义希望 jEdit 视为可折叠部分的文本。 + +全局选项(在 “Utilities” 菜单中)提供了数十种首选项,这些首选项被视为 jEdit 的默认值。这包括从外观到自定义快捷方式的所有内容。 + +插件可以扩展出来 jEdit 的开发者从未想过的功能。插件提供的工作方式对 jEdit 而言并非“常规”,但可能会将繁琐的任务转变为简单甚至有趣的事情。它以其出色的 XML 解析、可停靠的 Sidekick 面板中的 Outline 插件和 XSLT 集成,实际上改变了 XML 工作流程。如果我不是已经使用了 Netbeans 来编写 Java 代码,我想我可以使用 jEdit 来代替。 + +### 面向程序员的 jEdit + +选择哪种文本编辑器取决于你打算在编辑器中做的事。它称自己为“程序员的文本编辑器”,并且我认为它是严肃的 Java 和 XML 开发的有力竞争者。但是,在编辑 Lua 代码和 Bash 脚本时,它的功能不就没有这么强了。例如,与 Emacs 之类相比,jEdit 的代码折叠不那么灵活(我无法在没有附加标记的情况下折叠 Lua 函数)。尽管确实有丰富的插件选择,但我找不到用于 AsciiDoc 和其他非代码格式工作的特别有说服力的东西。 + +对我来说,jEdit 最吸引人的特点是它是以 Java 为基础。因为它在 JVM 中运行,所以你可以确信能够使用它,而无论你使用的平台是什么,也可以不管你是否有权限在自己的主目录之外安装应用。Java 是一种流行且活跃的语言,因此 jEdit 的功能和插件维护得很好。 + +如果你是一致性的忠实拥护者、Java 开发人员,或者只是 XML 极客而拼命试图摆脱 oXygen,那么你应该试试 jEdit。它很容易上手,并且探索起来很有趣。 + +-------------------------------------------------------------------------------- + +via: https://opensource.com/article/20/12/jedit + +作者:[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/coffee_tea_laptop_computer_work_desk.png?itok=D5yMx_Dr (Person drinking a hot drink at the computer) +[2]: http://jedit.org +[3]: http://www.jedit.org/index.php?page=download +[4]: https://linux.cn/article-11614-1.html +[5]: http://adoptopenjdk.org +[6]: https://opensource.com/article/20/12/vi-text-editor +[7]: https://linux.cn/article-12923-1.html diff --git a/published/202012/20201213 What web developers love about the Brackets text editor.md b/published/202012/20201213 What web developers love about the Brackets text editor.md new file mode 100644 index 0000000000..0fb85e3faa --- /dev/null +++ b/published/202012/20201213 What web developers love about the Brackets text editor.md @@ -0,0 +1,73 @@ +[#]: collector: (lujun9972) +[#]: translator: (geekpi) +[#]: reviewer: (wxy) +[#]: publisher: (wxy) +[#]: url: (https://linux.cn/article-12952-1.html) +[#]: subject: (What web developers love about the Brackets text editor) +[#]: via: (https://opensource.com/article/20/12/brackets) +[#]: author: (Seth Kenlon https://opensource.com/users/seth) + +Web 开发人员喜欢 Brackets 文本编辑器的原因 +====== + +> 这个基础的编辑器是面向 Web 开发人员的,它支持多种编程语言,并提供了大量的扩展,使其成为你自己的编辑器。 + +![](https://img.linux.net.cn/data/attachment/album/202012/25/092259zy4xvxs4axmysuf9.jpg) + +Brackets 文本编辑器是主要面向 Web 开发人员的编辑器。恰如其分的是,它的“编辑”菜单中充满了对 Web 编程语言用户特别有用的功能,主要是 HTML、CSS 和 Javascript 的经典组合。 + +但是,它还支持许多与互联网相关的语言和格式,包括 XML、Markdown、YAML 和 JSON、PHP、Lua、Java 和 Python,以及一些常见的通用语言,例如 C、C++,甚至是 `diff` 命令的输出。 + +### 安装 Brackets + +Brackets 可以从 [Brackets 网站][2]安装到 Linux、Windows 和 macOS 上。 + +另外,在 Linux 上,你可以从 [flathub.org][3] 以 Flatpak 安装。 + +![Brackets editor][4] + +### 使用 Brackets + +在大多数时候,Brackets 是一个“普通”的文本编辑器,其功能类似于 [jEdit][5] 或 [Medit][6]。有语法高亮、可配置的制表符间距、字符编码设置等等。这些都可以在窗口底部的状态栏中找到。 + +在“视图”菜单中,有主题设置、行号、自动换行,甚至还有分割窗口的选项,这样你可以在一个窗口中看到两个文件。 + +然而,在“编辑”菜单中,有一些的特别用于编程的功能。以下是我最喜欢的一些功能: + + * 使用 `Ctrl+[` 或 `Ctrl+]` 键盘快捷键来缩进和取消缩进文本块,这不仅对保持 HTML、CSS 和 Javascript 的整洁很有用,而且对 Python 代码也很重要。 + * 用 `Ctrl+/` 把一行变成注释。Brackets 标记注释的方式取决于你所使用的语言,所以无论你的文档是否使用斜线、破折号、箭头、井号或其他任何类型注释,这个功能都可以使用。 + * 用 `Shift+Ctrl+Up` 或 `Shift+Ctrl+Down` 在文档中将一行向上或向下移动。 + * 用 `Shift+Ctrl+D` 删除整个一行。 + * 用 `Ctrl+D` 复制整个一行。 + +这些都是看似小众的功能,你可能认为不会经常使用,但一旦你拥有了它们,你就会对它们产生依赖。 + +### 扩展 + +Brackets 还可以接受扩展,因此你和其他编码者可以添加扩展到功能中。要查看有哪些可用的扩展,请单击“文件”菜单并选择“扩展管理器”。有各种各样的扩展,包括用于调整代码格式的 Beautify、用于其他语言的多个支持包、用于转到标签开头或结尾的功能等等。 + +无论编辑器是否适合你,扩展可以使一个编辑器变得不同,所以如果你尝试 Brackets 并享受它的一切,但缺少一些重要的功能,在你放弃它之前,请浏览一下可用的扩展。 + +### 尝试 Brackets + +Brackets 是一个有点低调的编辑器。虽然它宣传自己是 “Web 代码编辑器”,但实际上它是一个不错的通用编辑器,并为常见的 Web 工具链加入了一些额外的功能。如果你喜欢 Brackets 的外观和它所提供的功能,不妨一试! + +-------------------------------------------------------------------------------- + +via: https://opensource.com/article/20/12/brackets + +作者:[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/browser_blue_text_editor_web.png?itok=lcf-m6N7 (Text editor on a browser, in blue) +[2]: http://brackets.io/ +[3]: https://flathub.org/apps/details/io.brackets.Brackets +[4]: https://opensource.com/sites/default/files/screenshot_2020-12-02_at_16.26.58.png (Brackets editor) +[5]: https://linux.cn/article-12942-1.html +[6]: https://linux.cn/article-12938-1.html \ No newline at end of file diff --git a/published/202012/20201214 Set up an Ansible lab in 20 minutes.md b/published/202012/20201214 Set up an Ansible lab in 20 minutes.md new file mode 100644 index 0000000000..6ae266a319 --- /dev/null +++ b/published/202012/20201214 Set up an Ansible lab in 20 minutes.md @@ -0,0 +1,300 @@ +[#]: collector: (lujun9972) +[#]: translator: (wxy) +[#]: reviewer: (wxy) +[#]: publisher: (wxy) +[#]: url: (https://linux.cn/article-12970-1.html) +[#]: subject: (Set up an Ansible lab in 20 minutes) +[#]: via: (https://opensource.com/article/20/12/ansible-lab) +[#]: author: (Mike Calizo https://opensource.com/users/mcalizo) + +20 分钟建立一个 Ansible 实验室 +====== + +> 建立一个支持学习和实验新软件的环境。 + +![](https://img.linux.net.cn/data/attachment/album/202012/31/112636h6ck5qd60d44t0mm.jpg) + +能够构建和拆解公有云环境是非常有用的,但我们大多数人都不能轻松访问公有云。退而求其次的最好办法就是在本地机器上建立一个实验室,但即使在本地机器上运行也会带来性能、灵活性和其他挑战。大多数时候,本地机器上额外的工作负载会干扰我们日常的工作,它们当然也会影响你提供一个现成的环境来玩耍和实验新软件。 + +几年前,当我和我的团队开始学习 [Ansible][2] 时,我们就遇到了这个挑战。我们找不到一个可以单独使用的环境,我们对这种情况的失望导致我们中的一些人停止了实验。我们知道需要找到一个解决方案。 + +我们花了很多时间研究各种方案,得出了一套工具,使我们的好奇心能够在我们完全控制的环境中学习。我们可以在本地机器上轮换和拆解实验室环境,而不需要访问内部实验室或公共云。 + +本文将解释如何在 20 分钟内以完全自动化的方式在本地机器上部署自己的实验室环境。 + +你可以在我的 [GitHub 仓库][3]中找到这个练习的所有代码。 + +### 工具和软件 + +本方案使用以下工具和软件: + + * [Ansible][4] 是我们选择的自动化工具,因为它易于使用,而且足够灵活,可以满足实验室的要求。 + * [Vagrant][5] 易于使用,用于构建和维护虚拟机。 + * [VirtualBox][6] 是一个托管管理程序,可以在 Windows 和 Linux 环境中使用。 + * [Fedora v30+][7] 是我本地机器上的操作系统。 + +你必须进行以下设置才能建立环境: + + * 一个互联网连接 + * 在 BIOS 中启用虚拟化技术支持(以下是在我的联想笔记本上的[过程][8]) + * Vagrant v2.2.9 + * 最新版本的 Ansible + * 最新版本的 VirtualBox + * Fedora v30+ 宿主机操作系统 + +### 这个实验室环境有什么? + +这个项目旨在部署一个带有 Ansible 引擎和多个 Linux 节点的 Ansible 主机,以及一些预加载和预配置的应用程序(httpd 和 MySQL)。它还启用了 [Cockpit][9],这样你就可以在测试过程中监控虚拟机(VM)的状态。使用预部署的应用程序的原因是为了提高效率(所以你不必花时间安装这些组件)。这样你就可以专注于创建角色和剧本,并针对上述工具部署的环境进行测试。 + +我们确定,对于我们的用例来说,最好的方案是多机 Vagrant 环境。Vagrant 文件创建了三个 CentOS 虚拟机,以模拟两个目标主机和一个 Ansible 控制机。 + + * Host1: 没有图形用户界面(GUI),安装 httpd 和 MySQL + * Host2: 没有 GUI,安装了 httpd 和 MySQL + * Ansible-host:没有 GUI,安装了 Ansible 引擎 + +### 启用多个管理程序 + +如果使用了多个管理程序,一些管理程序可能不允许你拉起虚拟机。要解决这个问题,请遵循以下步骤(基于 Vagrant 的[安装][10]说明)。 + +首先,找出管理程序的名称: + +``` +$ lsmod | grep kvm +kvm_intel             204800  6 +kvm                   593920  1 kvm_intel +irqbypass              16384  1 kvm +``` + +我感兴趣的是 `kvm_intel`,但你可能需要另一个(比如 `kvm_amd`)。 + +以 root 身份运行以下内容,将该管理程序列入黑名单: + +``` +$ echo 'blacklist kvm-intel' >> /etc/modprobe.d/blacklist.conf +``` + +重新启动你的机器并尝试再次运行 Vagrant。 + +### Vagrant 文件 + +``` +cat Vagrantfile +``` + +``` +# -*- mode: ruby -*- +# vi: set ft=ruby : + +Vagrant.configure("2") do |config| +# Define VMs with static private IP addresses, vcpu, memory and vagrant-box. + boxes = [ + { + :name => "web1.demo.com", ⇒ Host1 this is one of the target nodes + :box => "centos/8", ⇒ OS version + :ram => 1024, ⇒ Allocated memory + :vcpu => 1, ⇒ Allocated CPU + :ip => "192.168.29.2" ⇒ Allocated IP address of the node + }, + { + :name => "web2.demo.com", ⇒ Host2 this is one of the target nodes + :box => "centos/8", + :ram => 1024, + :vcpu => 1, + :ip => "192.168.29.3" + }, + { + :name => "ansible-host", ⇒ Ansible Host with Ansible Engine + :box => "centos/8", + :ram => 8048, + :vcpu => 1, + :ip => "192.168.29.4" + } + ] + + # Provision each of the VMs. + boxes.each do |opts| + config.vm.define opts[:name] do |config| +# Only Enable this if you are connecting to Proxy server +# config.proxy.http = "http://usernam:password@x.y:80"⇒ Needed if you have a proxy +# config.proxy.https = "http://usernam:password@x.y:80" +# config.proxy.no_proxy = "localhost,127.0.0.1" + config.vm.synced_folder ".", "/vagrant", id: "vagrant-root", disabled: true + config.ssh.insert_key = false + config.vm.box = opts[:box] + config.vm.hostname = opts[:name] + config.vm.provider :virtualbox do |v| ⇒ Defines the vagrant provider + v.memory = opts[:ram] + v.cpus = opts[:vcpu] + end + config.vm.network :private_network, ip: opts[:ip] + config.vm.provision :file do |file| + file.source = './keys/vagrant' ⇒ vagrant keys to allow access to the nodes + file.destination = '/tmp/vagrant' ⇒ the location to copy the vagrant key + end + config.vm.provision :shell, path: "bootstrap-node.sh" ⇒ script that copy hosts entry + config.vm.provision :ansible do |ansible| ⇒ declaration to run ansible playbook + ansible.verbose = "v" + ansible.playbook = "playbook.yml" ⇒ the playbook used to configure the hosts + end + end + end +end +``` + +这些是你需要注意的重要文件。 + + * `inventory-test.yaml`:连接到节点的清单文件 + * `playbook.yaml`:Vagrant 供应者调用的用于配置节点的剧本文件 + * `Vagrantfile':Vagrant 用来部署环境的文件 + * Vagrant 密钥文件:连接实验室环境中各节点的 Vagrant 密钥 + +你可以根据你的需要调整这些文件。Ansible 的灵活性使你有能力根据你的需要声明性地改变你的环境。 + +### 部署你的实验室环境 + +首先,克隆这个 [GitHub 仓库][11] 中的代码: + +``` +$ git clone https://github.com/mikecali/ansible-labs-101.git +Cloning into 'ansible-labs-101'... +remote: Enumerating objects: 15, done. +remote: Counting objects: 100% (15/15), done. +remote: Compressing objects: 100% (13/13), done. +remote: Total 15 (delta 2), reused 10 (delta 0), pack-reused 0 +Unpacking objects: 100% (15/15), 6.82 KiB | 634.00 KiB/s, done. +``` + +接下来,将你的目录改为 `vagrant-session-2`,并查看其内容: + +``` +$ ls +Bootstrap-node.sh   inventory   keys   playbook.yml   README.md Vagrantfile +``` + +现在你已经拥有了实验室环境所需的所有工件和配置文件。要部署环境,请运行: + +``` +$ vagrant up +``` + +只要有一个像样的网络连接,只需要 20 分钟左右就可以得到一个运行环境: + +``` +$ vagrant up +Bringing machine 'web1.demo.com' up with 'virtualbox' provider... +Bringing machine 'web2.demo.com' up with 'virtualbox' provider... +Bringing machine 'ansible-host' up with 'virtualbox' provider... +==> web1.demo.com: Importing base box 'centos/8'... +==> web1.demo.com: Matching MAC address for NAT networking... +==> web1.demo.com: Checking if box 'centos/8' version '1905.1' is up to date... +==> web1.demo.com: Setting the name of the VM: ansible-labs_web1democom_1606434176593_70913 +==> web1.demo.com: Clearing any previously set network interfaces... +==> web1.demo.com: Preparing network interfaces based on configuration... + web1.demo.com: Adapter 1: nat + web1.demo.com: Adapter 2: hostonly +==> web1.demo.com: Forwarding ports... + web1.demo.com: 22 (guest) => 2222 (host) (adapter 1) +==> web1.demo.com: Running 'pre-boot' VM customizations... +==> web1.demo.com: Booting VM... +==> web1.demo.com: Waiting for machine to boot. This may take a few minutes... + web1.demo.com: SSH address: 127.0.0.1:2222 + web1.demo.com: SSH username: vagrant + web1.demo.com: SSH auth method: private key +[...] +``` + +一旦该剧本执行完成,你会看到这样的输出: + +``` +PLAY RECAP ********************************* +Ansible-host     : ok=20 changed=11 unreachable=0 failed=0 skipped=0 rescued=0 ignored=3 + +Real 18m14.288s +User 2m26.978s +Sys 0m26.849s +``` + +确认所有虚拟机都在运行: + +``` +$ vagrant status +Current machine states: + +Web1.demo.com    running (virtualbox) +Web2.demo.com    running (virtualbox) +ansible-host     running (virtualbox) +[...] +``` + +你可以通过登录其中一个虚拟机进一步调查。访问 `ansible-host`: + +``` +> vagrant ssh ansible-host +Activate the web console with: systemctl enable --now cockpit.socket + +Last login: Thu Nov 26 12:21:23 2020 from 10.0.2.2 +[vagrant@ansible-host ~] uptime +16:46:42 up 1:24, 1 user, load average: 0.00, 0.01, 0.04 +``` + +最后,你可以使用 Ansible 模块来 ping 你创建的其他节点: + +``` +[vagrant@ansible-host]$ ansible -i inventory-test.yaml \ +webservers -m ping -u vagrant +192.168.29.2 | SUCCESS => { +  "Ansible-facts": { +      "Discovered_interpreter_python": "/usr/libexec/platform-python" +    }, +    "Changed": false; +    "Ping": "pong" +} +[...] +``` + +### 清理 + +运行如下命令来清理环境: + +``` +$ vagrant destroy [vagrant machine name] +``` + +你的输出会像这样: + +![Output from cleaning up environment][12] + +### 有创意的学习 + +在自己的实验室里利用自己的时间学习 Ansible 这样的软件是一个好习惯,但由于受到无法控制的限制,可能会很困难。 + +有时候,你需要发挥创意,找到另一种方法。在开源社区中,你可以选择很多方案;我们选择这些工具的主要原因之一是,它们是许多人常用和熟悉的。 + +另外,请注意,这些剧本并没有按照我的要求进行优化。请随时改进它们,并在评论中分享你的工作。 + +-------------------------------------------------------------------------------- + +via: https://opensource.com/article/20/12/ansible-lab + +作者:[Mike Calizo][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/mcalizo +[b]: https://github.com/lujun9972 +[1]: https://opensource.com/sites/default/files/styles/image-full-size/public/lead-images/science_experiment_beaker_lab.png?itok=plKWRhlU (Science lab with beakers) +[2]: https://opensource.com/resources/what-ansible +[3]: https://github.com/mikecali/ansible-labs-101 +[4]: https://www.ansible.com/ +[5]: https://www.vagrantup.com/ +[6]: https://www.virtualbox.org/ +[7]: https://getfedora.org/ +[8]: https://support.lenovo.com/pt/en/solutions/ht500006 +[9]: https://opensource.com/article/20/11/cockpit-server-management +[10]: https://www.vagrantup.com/docs/installation +[11]: https://github.com/mikecali/ansible-labs-101.git +[12]: https://opensource.com/sites/default/files/uploads/cleanup.png (Output from cleaning up environment) +[13]: https://creativecommons.org/licenses/by-sa/4.0/ diff --git a/published/202012/20201215 9 things to do in your first 10 minutes on a Linux server.md b/published/202012/20201215 9 things to do in your first 10 minutes on a Linux server.md new file mode 100644 index 0000000000..ac15ee340e --- /dev/null +++ b/published/202012/20201215 9 things to do in your first 10 minutes on a Linux server.md @@ -0,0 +1,167 @@ +[#]: collector: (lujun9972) +[#]: translator: (wxy) +[#]: reviewer: (wxy) +[#]: publisher: (wxy) +[#]: url: (https://linux.cn/article-12959-1.html) +[#]: subject: (9 things to do in your first 10 minutes on a Linux server) +[#]: via: (https://opensource.com/article/20/12/linux-server) +[#]: author: (Gaurav Kamathe https://opensource.com/users/gkamathe) + +初次登录 Linux 服务器马上要做的 9 件事 +====== + +> 在将新配置的服务器投入工作之前,请确保你知道你正在使用什么。 + +![](https://img.linux.net.cn/data/attachment/album/202012/27/112042zuz1lpudkypeppeu.jpg) + +当我在 Linux 上测试软件时(这是我工作中的一个常规部分),我需要使用多台运行 Linux 的不同架构的服务器。我整备机器,安装所需的软件包,运行我的测试,收集结果,并将机器返回到仓库中,以便其他人可以使用它进行测试。 + +由于我经常这样做(甚至一天多次),我初次登录 Linux 服务器的前 10 分钟内的工作已经成为每天的仪式。当我初次登录 Linux 服务器时,我会使用命令来收集我需要的信息来寻找某些东西。我将在本文中介绍我的过程,但请注意,在大多数情况下,我只给出命令名称,所以你需要确定这些命令的具体选项,以获得你需要的信息。阅读命令的手册页是一个很好的起点。 + +### 1、第一次接触 + +当我登录到一台服务器时,我做的第一件事就是检查它是否拥有我将要运行的测试所需的操作系统、内核和硬件架构。我经常会检查一台服务器已经运行了多久。虽然这对测试系统来说并不重要,因为它会被多次重启,但我还是发现这些信息很有帮助。 + +使用下面的命令来获取这些信息。我主要使用 Red Hat Linux 进行测试,所以如果你使用其他 Linux 发行版,请在文件名中使用 `*-release` 而不是 `redhat-release`: + +``` +cat /etc/redhat-release +uname -a +hostnamectl +uptime +``` + +### 2、有人登录在上面吗? + +一旦我知道这台机器符合我的测试需求,我需要确保没有其他人同时登录该系统运行他们自己的测试。虽然考虑到整备系统会帮我处理好这个问题,这种可能性很小,但偶尔检查一下还是有好处的 —— 尤其是当我第一次登录服务器的时候。我还会检查是否有其他用户(除了 root)可以访问系统。 + +使用下面的命令来查找这些信息。最后一条命令是查找 `/etc/passwd` 文件中具有 shell 访问权限的用户;它会跳过文件中没有 shell 访问权限或 shell 设置为 `nologin` 的其他服务: + +``` +who +who -Hu +grep sh$ /etc/passwd +``` + +### 3、物理机还是虚拟机 + +现在我有了属于自己的机器,我需要确定它是一台物理机还是一台虚拟机(VM)。如果是我自己整备的这台机器,我可以确定这是我要求的东西。但是,如果你使用的是一台不是你自己整备的机器,你应该检查该机器是物理机还是虚拟机。 + +使用以下命令来识别这些信息。如果是物理系统,你会看到供应商的名称(如 HP、IBM 等)以及服务器的品牌和型号;而在虚拟机中,你应该看到 KVM、VirtualBox 等,这取决于创建虚拟机时使用了什么虚拟化软件: + +``` +dmidecode -s system-manufacturer +dmidecode -s system-product-name +lshw -c system | grep product | head -1 +cat /sys/class/dmi/id/product_name +cat /sys/class/dmi/id/sys_vendor +``` + +### 4、硬件 + +因为我经常测试连接到 Linux 机器的硬件,所以我通常使用物理服务器,而不是虚拟机。在物理机器上,我的下一步是确定服务器的硬件能力 —— 例如,运行的是什么类型的 CPU,它有多少个核心,启用了哪些标志,以及有多少内存可用于运行测试。如果我正在运行网络测试,我会检查连接到服务器的以太网或其他网络设备的类型和容量。 + +使用以下命令来显示连接到 Linux 服务器的硬件。其中一些命令在新的操作系统版本中可能会被废弃,但你仍然可以从 yum 存储库中安装它们或切换到它们的等效新命令: + +``` +lscpu or cat /proc/cpuinfo +lsmem or cat /proc/meminfo +ifconfig -a +ethtool +lshw +lspci +dmidecode +``` + +### 5、已安装的软件 + +测试软件总是需要安装额外的依赖包、库等。然而,在安装任何东西之前,我都会检查已经安装了什么(包括是什么版本),以及配置了哪些存储库,这样我就知道软件来自哪里,并可以调试任何软件包安装问题。 + +使用下面的命令来确定安装了什么软件: + +``` +rpm -qa +rpm -qa | grep +rpm -qi +yum repolist +yum repoinfo +yum install +ls -l /etc/yum.repos.d/ +``` + +### 6、运行的进程和服务 + +检查了安装的软件之后,自然就会检查系统上有哪些进程在运行。当在系统上运行性能测试时,这一点至关重要 —— 如果一个正在运行的进程、守护进程、测试软件等占用了大部分 CPU/RAM,那么在运行测试之前停止该进程是有意义的。这也可以检查测试所需的进程或守护进程是否已经启动并运行。例如,如果测试需要 `httpd` 运行,那么即使安装了软件包,启动守护进程的服务也可能没有运行。 + +使用以下命令来识别系统上正在运行的进程和已启用的服务: + +``` +pstree -pa 1 +ps -ef +ps auxf +systemctl +``` + +### 7、网络连接 + +如今的机器网络化程度很高,它们需要与网络上的其他机器或服务进行通信。我会识别服务器上哪些端口是开放的,是否有到测试机器的任何网络连接,是否启用了防火墙,如果启用了,是否屏蔽了任何端口,以及机器与哪些 DNS 服务器对话。 + +使用以下命令来识别网络服务相关信息。如果一个过时的命令不可用,请从 yum 存储库中安装它或使用等效的新命令: + +``` +netstat -tulpn +netstat -anp +lsof -i +ss +iptables -L -n +cat /etc/resolv.conf +``` + +### 8、内核 + +在进行系统测试时,我发现了解内核相关的信息是很有帮助的,比如内核版本和加载了哪些内核模块。我还会列出任何[可调整的内核参数][2]以及它们的设置,并检查启动运行中的内核时使用的选项。 + +使用以下命令来识别这些信息: + +``` +uname -r +cat /proc/cmdline +lsmod +modinfo +sysctl -a +cat /boot/grub2/grub.cfg +``` + +### 9、日志 + +现在,我已经对服务器有了很好的了解,包括安装了哪些软件,运行了哪些进程。还有一件事我无法逃避,那就是日志文件 —— 我需要知道在哪里可以查看不断更新的信息。 + +使用以下命令查看系统的日志: + +``` +dmesg +tail -f /var/log/messages +journalctl +``` + +### 接下来的步骤 + +虽然命令和实用程序会发生变化,但它们所显示的基本信息大致不变。在你专注于掌握哪些命令之前,你需要对你要寻找的信息以及它属于什么类别有一个宏观的看法。 + +由于 Linux 将大部分信息保存在文件中,这些命令基本上是从文件中读取信息,并以一种易于理解的方式呈现出来。下一步的好做法是找出每个命令用来获取信息显示的文件。一个提示:寻找这些信息的方法是 `strace` 命令。 + +-------------------------------------------------------------------------------- + +via: https://opensource.com/article/20/12/linux-server + +作者:[Gaurav Kamathe][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/gkamathe +[b]: https://github.com/lujun9972 +[1]: https://opensource.com/sites/default/files/styles/image-full-size/public/lead-images/containers_modules_networking_hardware_parts.png?itok=rPpVj92- (Parts, modules, containers for software) +[2]: https://www.oreilly.com/library/view/red-hat-enterprise/9781785283550/ch10s05.html diff --git a/published/202012/20201215 Here are the Worthy Replacements of CentOS 8 for Your Production Linux Servers.md b/published/202012/20201215 Here are the Worthy Replacements of CentOS 8 for Your Production Linux Servers.md new file mode 100644 index 0000000000..1eec4fc85b --- /dev/null +++ b/published/202012/20201215 Here are the Worthy Replacements of CentOS 8 for Your Production Linux Servers.md @@ -0,0 +1,168 @@ +[#]: collector: (lujun9972) +[#]: translator: (wxy) +[#]: reviewer: (wxy) +[#]: publisher: (wxy) +[#]: url: (https://linux.cn/article-12921-1.html) +[#]: subject: (Here are the Worthy Replacements of CentOS 8 for Your Production Linux Servers) +[#]: via: (https://itsfoss.com/rhel-based-server-distributions/) +[#]: author: (Abhishek Prakash https://itsfoss.com/author/abhishek/) + +什么 Linux 系统可以替换生产环境的 Linux 服务器上的 CentOS 8 +====== + +CentOS 是世界上最流行的服务器发行版之一。它是红帽企业 LinuxRed Hat Enterprise Linux(RHEL)的一个开源分支,提供了 RHEL 的优点,却没有 RHEL 的相关成本。 + +然而,最近情况发生了变化,[红帽正在将稳定的 CentOS 转换为滚动发布模式,即 CentOS Stream的形式][1]。CentOS 8 本来应该支持到 2029 年,但现在到 2021 年底就被迫停止了。 + +如果你的服务器使用的是 CentOS,这可能会让你不知道该何去何从。 + +你看,取代 CentOS 8 的首要选择就是 CentOS Stream。将 CentOS 8 升级到 CentOS Stream 的[过程很简单][2],你不用担心需要重新安装任何东西。 + +不过,由于 CentOS Stream 是滚动发布性质的,你可能要考虑一些对生产服务器来说更稳定的东西。我将在本文中会推荐一些 Linux 系统来帮助你做出这个决定。 + +### 基于 RHEL 的服务器 Linux 发行版,你可以考虑用来取代 CentOS + +![][3] + +我将从一些正在开发的 RHEL 分支版本开始列举,其唯一目的是取代 CentOS 8。之后,我会列出你可以马上使用的服务器发行版。 + +#### Rocky Linux(正在开发中) + +![][4] + +就在红帽宣布计划用滚动发布的 CentOS Stream 取代稳定的 CentOS 8 的同一天,CentOS 的原开发者宣布了一个新项目,为 CentOS 用户提供 RHEL 分支。 + +这个新项目名为 [Rocky Linux][5]。它的名字是为了纪念原 CentOS 项目的共同创始人之一。它是从 RHEL 8 分支出来的,目标是“100% 与 RHEL 兼容”。 + +该项目正在快速开发中,目前可能无法使用。但这是在 2021 年底 CentOS 8 支持结束时取代它的首选之一。 + +#### Lenix 项目(开发中) + +![][6] + +这是在宣布 CentOS Stream 成为默认版本一天后创建的又一个 RHEL 分支。 + +[Lenix 项目][7]是由 CloudLinux 创建的,CloudLinux 是一家面向企业的服务机构,多年来一直在提供定制化的 CentOS 服务器,鉴于他们在 CentOS 和企业服务器方面的多年经验,Lenix 项目应该是一个很有前途的 RHEL 分支,可以取代 CentOS Stream。 + +#### Oracle Linux + +![][8] + +这可能是该列表中唯一能以最佳方式使用的 RHEL 分支。不仅可以随时使用,你甚至可以[从现有的 CentOS 安装迁移到 Oracle Linux][9],而无需重新安装。 + +Oracle Linux 自 2006 年起推出。它的应用二进制 100% 兼容 RHEL,并且它提供了与每个 RHEL 版本相对应的版本。而且,你不需要与 Oracle 签署任何协议来使用 Oracle Linux。 + +Oracle Linux 有两种 Linux 内核可供选择:Oracle Linux 的[坚不可摧企业级内核][10]Unbreakable Enterprise Kernel(UEK)或红帽兼容内核 Red Hat Compatible Kernel(RHCK)。 + +只是,甲骨文在开源项目上有些黑历史,可能这也是为什么选择 CentOS 这种真正的社区分支形式而不是甲骨文 Linux 的原因。随着 CentOS 被 CentOS Stream 所取代,也许现在正是给 Oracle 一个机会的时候? + +#### ClearOS(来自惠普) + +![][11] + +[ClearOS][12] 是惠普在其 HPE ProLiant 服务器上提供的。虽然他们的网站上没有明确提到,但 ClearOS 是基于 RHEL 和 CentOS 的。 + +[Clear Center][13] 和 HPE 在这个项目上进行了合作。开源的 ClearOS 免费提供给社区。他们有自己的应用市场,混杂了免费和付费应用。你不需要为操作系统付费,但如果你选择了付费应用,你可能需要为该应用付费。 + +它可能没有那么流行,但随着 CentOS Stream 成为默认,如果惠普能抓住这个时机,ClearOS 应该能获得一些用户。他们会这么做吗?我不太确定。甲骨文正在努力吸引 CentOS 用户,但我没有看到惠普的这种努力。 + +#### Springdale Linux(普林斯顿大学的学术项目) + +![][14] + +一个由院士维护的红帽分支?这就是 Scientific Linux 吧?但 Scientific Linux 已经死了一年多了。 + +[Springdale Linux][15](SDL)是普林斯顿大学的另一个这样的项目。它之前被称为 PUIAS Linux(普林斯顿大学高级研究所Princeton University Institute for Advanced Study)。 + +目前还没有 RHEL 8 对应的 Springdale Linux,我觉得他们的开发速度可以加快一些。 + +### 不基于红帽的服务器发行版 + +好吧,到目前为止,列表中已经提到了基于红帽的发行版。现在是时候看看一些与 RHEL 无关,但仍然是生产服务器的上好选择的服务器发行版了。 + +#### YunoHost(专门为 Web 服务器定制的) + +![][16] + +[YunoHost][17] 是基于 Debian 定制的,目的是为你提供一个托管 Web 服务器的系统。 + +你可以在[树莓派等 ARM 板][18]、旧台式机和计算机上使用它,当然也可以在虚拟专用服务器(VPS)上使用。 + +YunoHost 还提供了一个基于 Web 的管理界面(灵感来自于 [Webmin][19]?),这样你就可以用图形化的方式来管理系统。这对于一个想托管 Web 服务器但又不太会命令行的人来说,是一个很大的安慰。 + +#### Debian Linux + +![][20] + +这个通用操作系统提供了一个坚如磐石的服务器发行版。对于那些想要一个稳定系统的人来说,是一个理想的选择。 + +如果你在 CentOS 上投入了太多的时间和技术,你可能会发现 [Debian][21] 略有不同,尤其是软件包管理系统。不过,我相信,对于一个经验丰富的 Linux 系统管理员来说,这应该不是什么大问题。 + +#### openSUSE + +![][22] + +SUSE 是红帽的直接竞争对手之一。他们以 [SUSE Linux Enterprise][23] 的形式提供企业级产品。他们的开源产品 openSUSE 也相当受欢迎,无论是在桌面还是服务器领域。 + +[openSUSE][24] 是一个服务器 Linux 发行版的好选择。现在的人不会明白 [SUSE 的 YAST 工具][25]在上世纪 90 年代和 2000 年初给用户带来了怎样的解脱。它仍然是管理 SUSE 系统的一个方便的工具。 + +openSUSE 有两种形式:滚动发布的 Tumbleweed 和稳定的点发布版的 Leap。我猜测你追求的是稳定性,所以 Leap 是你应该追求的目标。 + +#### Ubuntu + +![][26] + +[Ubuntu][27] 是世界上最流行的发行版,[在服务器上][28]和台式机上都是如此。这就是为什么没有 Ubuntu 这份清单就不完整的原因。 + +因为我已经使用 Ubuntu 很长时间了,所以我觉得在 Ubuntu 上托管我的 Web 服务器很舒服。但这只是我个人的想法。如果你是从 RHEL 领域过来的,这里的包管理系统和一些网络和管理组件是不同的。 + +[Ubuntu LTS 版][29]带有五年的支持,这是 CentOS 版本提供的一半长短。如果你不想升级版本,你可以选择为过时的 LTS 版本购买付费的扩展支持。 + +#### 你的选择是什么? + +我已经列出了一些基于 RHEL 的发行版以及通用服务器发行版的顶级推荐。 + +现在轮到你了,在上面列出的发行版中,你最喜欢哪个?你有什么其他的建议可以添加到这个列表中吗?请在评论区留言。 + +-------------------------------------------------------------------------------- + +via: https://itsfoss.com/rhel-based-server-distributions/ + +作者:[Abhishek Prakash][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://itsfoss.com/author/abhishek/ +[b]: https://github.com/lujun9972 +[1]: https://linux.cn/article-12902-1.html +[2]: https://linuxhandbook.com/update-to-centos-stream/ +[3]: https://i2.wp.com/itsfoss.com/wp-content/uploads/2020/12/Replace-centos.png?resize=800%2C450&ssl=1 +[4]: https://i1.wp.com/itsfoss.com/wp-content/uploads/2020/12/rocky-linux.png?resize=800%2C350&ssl=1 +[5]: https://rockylinux.org +[6]: https://i2.wp.com/itsfoss.com/wp-content/uploads/2020/12/cloudlinux.png?resize=800%2C350&ssl=1 +[7]: https://www.reddit.com/r/ProjectLenix/ +[8]: https://i1.wp.com/itsfoss.com/wp-content/uploads/2020/12/oracle-linux.png?resize=800%2C350&ssl=1 +[9]: https://github.com/oracle/centos2ol +[10]: https://docs.oracle.com/en/operating-systems/uek/ +[11]: https://i0.wp.com/itsfoss.com/wp-content/uploads/2020/12/clear-os.jpg?resize=795%2C349&ssl=1 +[12]: https://www.clearos.com +[13]: https://www.clearcenter.com +[14]: https://i0.wp.com/itsfoss.com/wp-content/uploads/2020/12/springdale-linux.png?resize=800%2C350&ssl=1 +[15]: https://puias.math.ias.edu +[16]: https://i2.wp.com/itsfoss.com/wp-content/uploads/2020/12/yunohost.png?resize=720%2C400&ssl=1 +[17]: https://yunohost.org#/ +[18]: https://itsfoss.com/raspberry-pi-alternatives/ +[19]: https://linuxhandbook.com/use-webmin/ +[20]: https://i0.wp.com/itsfoss.com/wp-content/uploads/2020/12/debian-linux.png?resize=800%2C350&ssl=1 +[21]: https://www.debian.org +[22]: https://i0.wp.com/itsfoss.com/wp-content/uploads/2020/12/opensuse.jpg?resize=800%2C350&ssl=1 +[23]: https://www.suse.com/download/sles/ +[24]: https://www.opensuse.org +[25]: https://yast.opensuse.org +[26]: https://i2.wp.com/itsfoss.com/wp-content/uploads/2020/12/ubuntu.jpg?resize=800%2C350&ssl=1 +[27]: https://ubuntu.com/download/server +[28]: https://www.datanyze.com/market-share/operating-systems--443/ubuntu-market-share +[29]: https://itsfoss.com/long-term-support-lts/ diff --git a/published/202012/20201216 How to View Images from the Linux Terminal.md b/published/202012/20201216 How to View Images from the Linux Terminal.md new file mode 100644 index 0000000000..ba075e24c6 --- /dev/null +++ b/published/202012/20201216 How to View Images from the Linux Terminal.md @@ -0,0 +1,169 @@ +[#]: collector: (lujun9972) +[#]: translator: (geekpi) +[#]: reviewer: (wxy) +[#]: publisher: (wxy) +[#]: url: (https://linux.cn/article-12948-1.html) +[#]: subject: (How to View Images from the Linux Terminal) +[#]: via: (https://www.2daygeek.com/how-to-view-display-images-from-linux-terminal/) +[#]: author: (Magesh Maruthamuthu https://www.2daygeek.com/author/magesh/) + +如何在 Linux 终端查看图像 +====== + +![](https://img.linux.net.cn/data/attachment/album/202012/23/233513zcgmggmxfd0wf9g1.png) + +Linux 有很多用于查看图像的 GUI 应用。但我从来没有尝试过用任何命令行应用来查看它。 + +幸运的是,在使用 [ImageMagick 工具][1]时,我得到了一个从终端查看图像的命令。命令名是 `“display`,它是 ImageMagick 工具的一部分。这是一个很好的工具,允许类 UNIX 用户从终端查看图像。 + +此外,我还为此用途得到了另一个很好的工具,叫做 FIM。 + +我们将向你展示如何安装并使用它从 Linux 终端查看图像。这些命令使用系统的帧缓冲framebuffer直接从命令行显示图像。 + +### 如何使用 display 命令从终端查看图像 + +[ImageMagick][2] 是一个自由开源、功能丰富、基于命令行的图像处理工具。它用于创建、编辑、合成或转换位图图像。它可以读取和写入各种格式(超过 200 种)的图像,包括 PNG、JPEG、GIF、PDF、SVG 等。它可以调整图像的大小、镜像、旋转、转换图像、调整图像颜色、应用各种特殊效果等。它支持批处理,允许你一次处理所有图像。 + +### 如何安装 ImageMagick? + +ImageMagick 软件包包含在大多数 Linux 发行版的官方仓库中。使用发行版软件包管理器来安装它。 + +**需要注意的是:**确保你的 Linux 系统上已经安装了 “[Development Tools][3]” 包,这是安装的前提条件。 + +对于 RHEL/CentOS 6/7 系统,请使用 [yum 命令][4] 安装 ImageMagick: + +``` +$ sudo yum install -y ImageMagick ImageMagick-devel +``` + +在 RHEL/CentOS 8 和 Fedora 系统,使用 [dnf 命令][5] 安装 ImageMagick: + +``` +$ sudo dnf install -y ImageMagick ImageMagick-devel +``` + +对于 Debian/Ubuntu 系统,使用 [apt 命令][6] 或 [apt-get 命令][7] 安装 ImageMagick: + +``` +$ sudo apt-get update +$ sudo apt-get install imagemagick +``` + +对于 openSUSE 系统,使用 [zypper 命令][8] 安装 ImageMagick: + +``` +$ sudo zypper install -y ImageMagick +``` + +要查看任何图像文件,请运行 `display` 命令,如下所示。你可以按下 `Esc`/`q` 按钮关闭图像: + +``` +$ display bird.jpg +``` + +![](https://www.2daygeek.com/wp-content/uploads/2020/12/how-to-view-display-images-from-linux-terminal-2.jpg) + +如果你想用指定的窗口大小打开图像,请使用 `-geometry` 标志: + +``` +$ display -geometry 1000x600 ~/Downloads/bird.jpg +``` + +你也可以通过 `display` 命令输入图像的位置信息。下面的命令可以从桌面的距顶部 800 像素和据左上角 800 像素处打开图像: + +``` +$ display -geometry 1000x600+800+800 ~/Downloads/bird.jpg +``` + +如果你想用 `display` 命令调整图像的大小,请使用以下格式: + +``` +$ display -resize 600x400 ~/Downloads/bird.jp +``` + +另外,你也可以使用百分比来调整图片的大小: + +``` +$ display -resize 50% ~/Downloads/bird.jpg +``` + +### 如何使用 fim 命令从终端查看图像 + +[FIM][10] 是一个专门为 Linux 设计的轻量级全局图像查看器。但它并不局限于 Linux,它也可配置在其他操作系统上运行,如 MS-Windows。 + +对于熟悉 VIM 文本编辑器等软件的用户来说,它是高度可定制和可脚本化的图像查看器。它可以全屏显示图像,并且可以使用键盘快捷键轻松控制。它是一款非常轻量级的工具,因为它只依赖于某些库。 + +它可以打开许多文件格式,它可以在以下视频模式下显示图像: + + * 使用 Linux 帧缓冲设备图形化。 + * 在 X/Xorg 下,使用 SDL 库图形化 + * 在 X/Xorg 下,使用 Imlib2 库图形化。 + * 使用 AAlib 库,在任意文本控制台中以 ASCII 艺术形式呈现。 + +运行时自动检测或选择正确的视频模式,如果需要,可以在构建前配置时选择加入或去除。 + +FIM 是 “Fbi IMproved” 的缩写,是 Fbi Image Viewer 的复刻版本。 + +FIM 可以很容易地安装在基于 Debian/Ubuntu 的系统上,因为该软件包在发行版的官方仓库中是可用的。对于其他发行版,你可能需要从源码编译它: + +``` +$ sudo apt install fim +``` + +安装完毕后,你可以使用以下命令显示图像: + +``` +$ fim bird.jpg +``` + +你可以使用 `-a` 选项自动缩放图像: + +``` +$ fim -a bird.jpg +``` + +![](https://www.2daygeek.com/wp-content/uploads/2020/12/how-to-view-display-images-from-linux-terminal-3.jpg) + +如果你要打开当前目录中的多个图像文件,请使用通配符将它们全部打开。使用 `PageUp`/`PageDown` 键盘快捷键移动到下一张或上一张图像: + +``` +$ fim -a *.jpg +``` + +要以 ASCII 格式查看图像,可以使用 `-t` 标志: + +``` +$ fim -t bird.jpg +``` + +下面的键盘快捷键可以让你控制图像: + + * `PageUp`/`PageDown`:上一张/下一张图片。 + * `+`/`-`:放大/缩小 + * `a`:自动缩放 + * `w`:适应宽度 + * `ESC`/`q`:退出 + +-------------------------------------------------------------------------------- + +via: https://www.2daygeek.com/how-to-view-display-images-from-linux-terminal/ + +作者:[Magesh Maruthamuthu][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.2daygeek.com/author/magesh/ +[b]: https://github.com/lujun9972 +[1]: https://www.2daygeek.com/resize-convert-images-from-linux-command-line/ +[2]: https://imagemagick.org/ +[3]: https://www.2daygeek.com/install-development-tools-on-ubuntu-debian-arch-linux-mint-fedora-centos-rhel-opensuse/ +[4]: https://www.2daygeek.com/linux-yum-command-examples-manage-packages-rhel-centos-systems/ +[5]: https://www.2daygeek.com/linux-dnf-command-examples-manage-packages-fedora-centos-rhel-systems/ +[6]: https://www.2daygeek.com/apt-command-examples-manage-packages-debian-ubuntu-systems/ +[7]: https://www.2daygeek.com/apt-get-apt-cache-command-examples-manage-packages-debian-ubuntu-systems/ +[8]: https://www.2daygeek.com/zypper-command-examples-manage-packages-opensuse-system/ +[9]: data:image/gif;base64,R0lGODlhAQABAIAAAAAAAP///yH5BAEAAAAALAAAAAABAAEAAAIBRAA7 +[10]: https://www.nongnu.org/fbi-improved/#docs diff --git a/published/202012/20201216 Why Vim users will love the Kakoune text editor.md b/published/202012/20201216 Why Vim users will love the Kakoune text editor.md new file mode 100644 index 0000000000..b38d1d977b --- /dev/null +++ b/published/202012/20201216 Why Vim users will love the Kakoune text editor.md @@ -0,0 +1,108 @@ +[#]: collector: (lujun9972) +[#]: translator: (geekpi) +[#]: reviewer: (wxy) +[#]: publisher: (wxy) +[#]: url: (https://linux.cn/article-12955-1.html) +[#]: subject: (Why Vim users will love the Kakoune text editor) +[#]: via: (https://opensource.com/article/20/12/kakoune) +[#]: author: (Seth Kenlon https://opensource.com/users/seth) + +为什么 Vim 用户会喜欢 Kakoune 文本编辑器? +====== + +> 这个编辑器可能会让人联想到 Vim,但它也提供了很多自己独特的功能和特性。 + +![](https://img.linux.net.cn/data/attachment/album/202012/25/233039wpnwnwakzn1zwa33.jpg) + +[Kakoune][2] 文本编辑器的灵感来源于 Vi。它拥有简约的界面、简短的键盘快捷键以及独立的编辑和插入模式,乍一看确实[看起来和感觉很像 Vi][3]。然而,Kakoune 编辑器在设计和功能上都有自己独特的风格,与其说是另一个 Vim,不如说是它是它自己。 + +### 安装 + +在 Linux 和 BSD 上,你可以从你的发行版的软件仓库或 port 树上安装 Kakoune。例如,在 Fedora、CentOS 或 RHEL 上: + +``` +$ sudo dnf install kakoune +``` + +在 Debian、Ubuntu 或类似的系统上: + +``` +$ sudo apt install kakoune +``` + +在 macOS 上,你可以使用 Homebrew: + +``` +$ brew install kakoune +``` + +或者,你也可以[从源码构建][4]。 + +启动 Kakoune 的命令是 `kak`。你可以启动 Kakoune 打开空文件,也可以在启动时包含文件名让它打开: + +``` +$ kak example.txt +``` + +### 使用 Kakoune + +当你启动 Kakoune(不带文件名)时,除了在窗口底部有一个小的状态栏外,它在你的终端中打开的大部分是空的缓冲区。像 Vim 一样,Kakoune 以“正常”模式启动,它把按键作为命令,不向缓冲区输入文本。要进入*插入模式*,你必须按 `i`(代表插入Insert)或 `a`(代表追加Append)。 + +在插入模式下,Kakoune 的操作和其他编辑器一样。你在键盘上输入,然后你输入的字符就会显示在缓冲区里。在插入模式下,你可以使用方向键来浏览缓冲区。 + +### 正常模式 + +在正常模式下,你可以发出导航和文本编辑命令。这是从 Vi 传统中借用的最明显的功能。编辑命令包括复制、剪切(在传统的 Unix 编辑术语中,称为 “猛拉yank”)、粘贴单词和行、撤销、转换字符大小写等功能。下面是一些基础: + +* `d`:复制并删除当前选择(现代术语中的“剪切”) +* `c`:复制并删除当前选择,并进入插入模式 +* `Esc+Alt+d`:删除当前选择 +* `y`:复制选择 +* `p`:粘贴 +* `<`:取消所选行的缩进 +* `u`:撤消 +* `U`:重做 +* `:转为小写 +* `~`:转换为大写 + +### 选择 + +在 Kakoune 中,你的光标是一个单字符的移动选区。除非你扩展你的选区,否则任何影响选区的命令都只适用当前光标位置。例如,如果你的光标悬停在字母 `n` 上,那么复制命令(正常模式下的 `c`)会将字母 `n` 复制到剪贴板,而粘贴命令(正常模式下的 `p`)则会将字母 `n` 粘贴到缓冲区。 + +从单个字符扩展选区的最简单方法是进入正常模式,按下 `Shift` 键,同时用方向键移动光标。然而,有几种方法可以根据某些标准来扩展选区。例如,`Alt+l` 将选区从光标扩展到当前行的末端。 + +完整的文档可以在 中找到。 + +### 函数 + +除了这些基本的交互,你还可以执行命令来调用 Kakoune 的内置功能。要访问 Kakoune 的命令行,在普通模式下输入 `:`。在命令行中,你可以执行命令,包括打开文件的 `edit` 命令,保存缓冲区到文件的 `write` 命令,当然还有退出应用的 `quit`。 + +还有更多的函数,包括针对特定编程语言和文件格式的特殊选项、使用 [Ranger 文件浏览器][5]浏览文件系统的选项、改变颜色主题、搜索和替换文本等等。 + +![Kakoune][6] + +### 尝试 Kakoune + +如果你是一个有经验的 Vim 用户,或者甚至是一个只是略知一二的人,你可能会发现 Kakoune 一开始会让你感到迷惑。它与 Vim 的相似度足以让你陷入一种虚假的熟悉感。一切都与 Vim 一模一样,直到你发现了完全不同的地方。不过,如果你是一个刚接触 Vim 编辑器的新手,或者你是一个正在寻找新挑战的 Vim 用户,那么 Kakoune 可能是你的理想编辑器。 + +你自己试试吧! + +-------------------------------------------------------------------------------- + +via: https://opensource.com/article/20/12/kakoune + +作者:[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/osdc-docdish-typewriterkeys-3.png?itok=NyBwMdK_ (Typewriter keys in multicolor) +[2]: https://kakoune.org/ +[3]: https://linux.cn/article-12947-1.html +[4]: https://github.com/mawww/kakoune +[5]: https://opensource.com/article/20/3/ranger-file-navigator +[6]: https://opensource.com/sites/default/files/kakoune-screenshot.png (Kakoune) \ No newline at end of file diff --git a/published/202012/20201218 Find out how your text will be read with Norka.md b/published/202012/20201218 Find out how your text will be read with Norka.md new file mode 100644 index 0000000000..ef0c0c1b17 --- /dev/null +++ b/published/202012/20201218 Find out how your text will be read with Norka.md @@ -0,0 +1,71 @@ +[#]: collector: (lujun9972) +[#]: translator: (geekpi) +[#]: reviewer: (wxy) +[#]: publisher: (wxy) +[#]: url: (https://linux.cn/article-12961-1.html) +[#]: subject: (Find out how your text will be read with Norka) +[#]: via: (https://opensource.com/article/20/12/norka) +[#]: author: (Seth Kenlon https://opensource.com/users/seth) + +了解如何使用 Norka 编辑器阅读文本 +====== + +> 这是一个素颜朝天的文本编辑器,旨在让你的写作能被更好地阅读和理解。 + +![](https://img.linux.net.cn/data/attachment/album/202012/28/003505f3h3pppkg7enpxi9.jpg) + +有些文本编辑器是为编程而设计的,有些是为专门的文本格式而设计的,有些是为文档设计而设计的。Norka 文本编辑器是为阅读而设计的。创建一个为*阅读*而设计的文本编辑器似乎很奇怪,但实际上,如果你仔细想想,这是很有意义的。你的文字已经写了一次或三次,这取决于你个人对迭代的容忍度,但它的目的是为了在未来几年内被阅读。Norka 让你轻松地专注于你的文字如何被阅读。 + +### 安装 + +Norka 文本编辑器是 MIT 授权的,可以[作为 Flatpak 包安装在 Linux上][2]。它是开源的,所以如果你想尝试在不同的平台上安装它,你可以[克隆它的 Github 仓库][3]。 + +### Norka 的界面 + +Norka 的界面很简单。一个回到 Norka 文档集的按钮,一个导出按钮和一个偏好菜单。窗口的其余部分是供你写文字的空白空间,在右下角,有一个阅读时间计算器来帮助你了解读者可能需要多长时间才能看完你写的东西。 + +![Dark Norka terminal box with green and white text][4] + +这几乎就是 Norka 的全部内容。没有分页符或行号,没有代码折叠或正则搜索。这是一个用于文字书写的编辑器,而不设置文档样式或跟踪复杂的数据模式。 + +当然,它还有一些额外的功能。如预期那样,可以使用 `Ctrl+C` 和 `Ctrl+V` 复制和粘贴。你可以用 `Ctrl+Z` 撤销,用 `Ctrl+F` 查找。你甚至可以用 `Ctrl+:` 插入表情符号。 + +![Norka terminal box with pop up box of emoji search menu][5] + +#### 样式文本 + +虽然 Norka 绝对没有兴趣帮你设计,比如说,一本小册子或传单,但它确实有一些能力来指示你想要的文本样式。它通过 [Markdown][6] 来实现这一点,这是一个简单的纯文本书写的约定,但用特殊的符号来指示文本应该如何在 HTML、EPUB 或 PDF 或任何你的目标格式中呈现。 + +在大多数编辑器中,你必须知道 Markdown 才能使用 Markdown,但 Norka 翻译了常见的文字处理器键盘快捷键来为你生成 Markdown。例如,要使一个单词加粗,你可以按 `Ctrl+B`,它会在光标的两边插入四个星号。当你输入下一个单词时,它的两边都会有两个星号,这就是 Markdown 对粗体(默认为粗体)文本的标记。你可以在 Norka 窗口右上角的汉堡样式的菜单中查看所有的 Markdown 快捷方式。 + +#### 保存和导出 + +你可以把 Norka 想象成一个笔记本。你在 Norka 中打开的所有文档都会保留在 Norka 的内部数据库中,所有的文档都会默认自动保存。要在 Norka 外使用文件,你可以在打开的文件中点击右上角的**共享**按钮。另外,你也可以在 Norka 的文件视图中右击任何文件,选择**导出**。你可以将文档导出(或**共享**,Norka 可互换使用这两个术语)为**文本**、**HTML** 或 **Markdown**。 + +### 尝试 Norka + +Norka 便于尝试,也易于使用。它通过保持界面简单,几乎到了受限的程度,帮助你专注于写作。但限制有时也是一种强大的创意工具。 + +Norka 可能不是你进行大量修改或文本处理的最佳选择。它没有让人激动的功能,比如大小写转换、集成 `sed` 命令、字符交换等等。它是一个为读者服务的文本编辑器。如果你觉得有用,那么你可能正是 Norka 正在寻找的受众。 + +感谢你花 2 分 39 秒阅读本文! + +-------------------------------------------------------------------------------- + +via: https://opensource.com/article/20/12/norka + +作者:[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/reading_book_selfcare_wfh_learning_education_520.png?itok=H6satV2u (Reading a book, selfcare) +[2]: https://flathub.org/apps/details/com.github.tenderowl.norka +[3]: https://github.com/TenderOwl/Norka +[4]: https://opensource.com/sites/default/files/uploads/norka-31_days-norka-opensource.png (Dark Norka terminal box with green and white text) +[5]: https://opensource.com/sites/default/files/uploads/norka_emoji-31_days-norka-opensource.png (Norka terminal box with pop up box of emoji search menu) +[6]: https://opensource.com/article/19/9/introduction-markdown diff --git a/published/202012/20201218 How to Install RPM Files on Fedora Linux -Beginner-s Tutorial.md b/published/202012/20201218 How to Install RPM Files on Fedora Linux -Beginner-s Tutorial.md new file mode 100644 index 0000000000..b64d1e0683 --- /dev/null +++ b/published/202012/20201218 How to Install RPM Files on Fedora Linux -Beginner-s Tutorial.md @@ -0,0 +1,122 @@ +[#]: collector: (lujun9972) +[#]: translator: (robsean) +[#]: reviewer: (wxy) +[#]: publisher: (wxy) +[#]: url: (https://linux.cn/article-12958-1.html) +[#]: subject: (How to Install RPM Files on Fedora Linux [Beginner’s Tutorial]) +[#]: via: (https://itsfoss.com/install-rpm-files-fedora/) +[#]: author: (Abhishek Prakash https://itsfoss.com/author/abhishek/) + +如何在 Fedora Linux 上安装 RPM 文件 +====== + +![](https://img.linux.net.cn/data/attachment/album/202012/26/182851bxi1lstdz13siuif.jpg) + +> 这篇初学者文章介绍如何在 Fedora 和 Red Hat Linux 上安装 RPM 软件包。它也随后向你展示如何移除这些 RPM 软件包。 + +当你开始使用 Red Hat 系的 Fedora Linux 时,你早晚会偶然发现 .rpm 文件。就像在 Windows 中的 .exe 文件,以及在 Ubuntu 和 Debian 中的 .deb 文件一样,一个 rpm 文件能够使你在 [Fedora][1] 上快速安装一个软件。 + +你可以从软件中心中找到并安装大量的软件,特别是 [如果你在 Fedora 中启用附加的存储库的话][2]。但是有时你会在它们的网站上找到可用的 RPM 格式的软件包。 + +就像在 Windows 中的 .exe 文件一样,你可以通过 **下载 .rpm 文件并双击它来安装**。不用担心,我将向你展示详细的步骤。 + +### 在 Fedora 和 Red Hat Linux 上安装 RPM 文件 + +我将向你展示安装 RPM 文件的三个方法: + + * [使用软件中心安装 RPM 文件][3](GUI 方法) + * [使用 DNF 命令安装 RPM 文件][4](CLI 方法) + * [使用 Yum 命令安装 RPM 文件][5](Red Hat 的 CLI 方法) + +#### 方法 1: 使用软件中心 + +在 Fedora 中使用默认的软件中心是最简单的方法。它真地很简单。转到你下载的 .rpm 文件的文件夹位置。它通常在 “Downloads” 文件夹。 + +只需要 **双击 RPM 文件,它将会在软件中心中打开**。 + +或者,你可以在 RPM 文件上右键单击并选择通过软件中心来安装它。 + +![或者双击或者右键并选择软件安装][6] + +当它在软件中心打开时,你应该会看到“安装”选项。只需要点击“安装”按钮并在提示时输入你的账号密码。 + +![通过 Fedora 软件中心安装 RPM][7] + +它很简单,对吗? + +#### 方法 2: 使用 DNF 命令来安装 RPM 文件 + +这是命令行方法。Fedora 使用新的 `dnf` [软件包管理器][8] ,你也可以使用它来安装下载的 RPM 文件。 + +打开一个终端并切换到你下载 RPM 文件的目录下。你也可以通过到 RPM 文件的路径。像这样使用 `dnf` 命令: + +``` +sudo dnf install rpm_file_name +``` + +这是一个我 [在 Fedora 上使用 dnf 命令安装 Google Chrome][9] 屏幕截图: + +![使用 DNF 命令安装 RPM 文件][10] + +#### 方法 3: 在 Red Hat 中使用 Yum 命令安装 RPM 文件 + +不像 Fedora ,Red Hat 仍然使用很好的旧式的 Yum 软件包管理器。在这里你还不能找到 `dnf` 命令。 + +这个过程与 `dnf` 命令相同。转到 RPM 文件所在的目录或提供它的路径。 + +``` +sudo yum install path_to_RPM_file +``` + +就是这样。没有一点异常花哨的东西。 + +### 如何移除 RPM 软件包 + +移除一个 RPM 软件包也不是一个什么大的问题。并且,你不需要原始的用来安装程序的 rpm 文件。 + +你可以在软件中心中找到已安装的软件包,并从其中移除应用程序。 + +![移除 RPM 软件包][11] + +或者,你可以使用带有 `remove` 选项的 `dnf` 或 `yum` 命令。 + +使用 `dnf` ,使用这个命令: + +``` +sudo dnf remove rpm_package_name +``` + +使用 `yum` ,使用这个命令: + +``` +sudo yum remove rpm_package_name +``` + +你可能不记得准确的软件包名称,没有关系。你可以做的是输入软件包的前几个字母,然后敲击 `tab` 按键。这是假设你已经启用 `tab` 按键补全,通常是这样的。 + +这就是你需要做的全部。相当简单,对吧?作为一个初学者,你可能会为这样一个简单的任务而挣扎,我希望像这样的快速教程会让你对 Fedora 更自信一些。 + +-------------------------------------------------------------------------------- + +via: https://itsfoss.com/install-rpm-files-fedora/ + +作者:[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://getfedora.org/ +[2]: https://itsfoss.com/fedora-third-party-repos/ +[3]: tmp.TvkJtlRJ6T#gui-method +[4]: tmp.TvkJtlRJ6T#use-dnf +[5]: tmp.TvkJtlRJ6T#use-yum +[6]: https://i0.wp.com/itsfoss.com/wp-content/uploads/2020/12/installing-rpm-file-fedora.png?resize=800%2C449&ssl=1 +[7]: https://i1.wp.com/itsfoss.com/wp-content/uploads/2020/12/install-rpm-fedora-software-center.jpg?resize=799%2C193&ssl=1 +[8]: https://itsfoss.com/package-manager/ +[9]: https://itsfoss.com/install-google-chrome-fedora/ +[10]: https://i1.wp.com/itsfoss.com/wp-content/uploads/2020/12/install-rpm-using-dnf-install.jpg?resize=800%2C474&ssl=1 +[11]: https://i0.wp.com/itsfoss.com/wp-content/uploads/2020/12/remove-rpm-package-fedora.jpg?resize=790%2C190&ssl=1 diff --git a/published/202012/20201220 How to use this KDE Plasma text editor.md b/published/202012/20201220 How to use this KDE Plasma text editor.md new file mode 100644 index 0000000000..35662769db --- /dev/null +++ b/published/202012/20201220 How to use this KDE Plasma text editor.md @@ -0,0 +1,72 @@ +[#]: collector: (lujun9972) +[#]: translator: (geekpi) +[#]: reviewer: (wxy) +[#]: publisher: (wxy) +[#]: url: (https://linux.cn/article-12964-1.html) +[#]: subject: (How to use this KDE Plasma text editor) +[#]: via: (https://opensource.com/article/20/12/kwrite-kde-plasma) +[#]: author: (Seth Kenlon https://opensource.com/users/seth) + +如何使用这个 KDE Plasma 文本编辑器? +====== + +> 作为流行的 KDE Plasma 桌面的一部分,KWrite 在一个简单易用的界面中隐藏了大量有用的功能。 + +![](https://img.linux.net.cn/data/attachment/album/202012/29/010557o53b649j66a1snjv.jpg) + +KWrite 是一款适用于 KDE Plasma 桌面的文本编辑器。它的目的是成为一个通用的应用,任何人都可以在他们需要快速做笔记、写一篇学校论文、做一些编程,和/或任何其他你能想到的文本编辑器能做的事时用上它。它使用 [Kate 编辑器][2]的组件来创建一个简单的界面,但它利用这些相同的组件来提供了大量有用的功能。 + +### 安装 + +KWrite 不可用于所有环境,它是 [KDE Plasma 桌面][3]的一个组件,所以如果你正在运行 Plasma,那么你已经有了 KWrite。 + +如果你没有运行 Plasma,那么你可以安装 Plasma,这样你可以将它和 KWrite 一起开始使用,或者根据需要使用 KWrite。然而,它是作为 Plasma 桌面的默认文本编辑器,所以如果你真的想把它作为一个独立应用使用,那么安装 Kate 可能更容易。 + +### 使用 KWrite + +当你启动 KWrite 时,你会看到期望的编辑器的样子:一大块用于输入的区域,顶部有一个菜单栏和工具栏,底部有一个状态栏。这就是你在开始之前需要了解的全部内容。KWrite 是一个直观的应用,工具栏按钮用于重要的动作,如打开和保存文件,简单的菜单系统用于更高级的编辑任务。 + +![Kwrite terminal containing dark gray html code on white background][4] + +KWrite 的许多功能都是潜在的,不需要你自己去激活它们就会发生。例如,如果你打开一个用 HTML 编写的文件,那么 KWrite 会高亮显示关键字(如 `class` 和 `id`)和识别代码标签(如 `

` 或 `

`),并将它们与自然语言的单词区别对待。当你加载一个用 Python 编写的文件时,也会发生同样的情况,而对于主要用自然语言编写的文件,则不会发生任何事情。 + +当然,你不必只选择 HTML、Python 和你的母语。KWrite 支持很多语言和格式(对于很多语言和格式,它甚至有自动完成选项)。 + +对于那些想要除了自动加载功能之外更多功能的用户,在编辑、视图和工具菜单中都有一些选项。例如,你可以激活动态的拼写检查、运行脚本、调出命令行、注释或取消注释一行、调整缩进、显示行号等等。 + +当从终端启动 KWrite 时,也有一些有趣的选项。例如,如果你知道要到文件中的哪一行,你可以用行号参数启动 KWrite: + +``` +$ kwrite --line 101 example.txt +``` + +你也可以使用 `--stdin` (或简写 `-i`)选项方便地将命令的输出通过管道到 KWrite。例如,这个命令下载 [example.com][5] 的首页,并在一个新的 KWrite 窗口中显示 HTML: + +``` +$ curl http://example.com | kwrite --stdin +``` + +### 尝试 KWrite + +我一直觉得 KDE 的优势之一就是它的复杂性很灵活。如果你想要一个简单的桌面,你基本上可以选择忽略任何你不想要的功能。KWrite 就是这种灵活性也适用于开发人员的一个例子。由于 Kate 具有许多功能,所以开发者有能够重用这些功能的一个子集来创建一个更干净、更专注的应用版本。 + +KWrite 是一个单文档编辑器。它没有标签,也没有任何“项目”的意识。它的目的是为那些想一次只处理一个文档的人准备的,他们希望基本的功能在默认情况下是激活的,在需要的时候可以选择强大的编辑工具。安装优秀的 Plasma 桌面,今天就来试试吧! + +-------------------------------------------------------------------------------- + +via: https://opensource.com/article/20/12/kwrite-kde-plasma + +作者:[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/code_computer_laptop_hack_work.png?itok=aSpcWkcl (Coding on a computer) +[2]: https://opensource.com/article/20/12/kate-text-editor +[3]: https://opensource.com/article/19/12/linux-kde-plasma +[4]: https://opensource.com/sites/default/files/uploads/kwrite-31_days_kwrite-opensource.png (Kwrite terminal containing dark gray html code on white background) +[5]: http://example.com diff --git a/published/202012/20201221 4 cool new projects to try in COPR from December 2020.md b/published/202012/20201221 4 cool new projects to try in COPR from December 2020.md new file mode 100644 index 0000000000..b35553cb9d --- /dev/null +++ b/published/202012/20201221 4 cool new projects to try in COPR from December 2020.md @@ -0,0 +1,118 @@ +[#]: collector: (lujun9972) +[#]: translator: (geekpi) +[#]: reviewer: (wxy) +[#]: publisher: (wxy) +[#]: url: (https://linux.cn/article-12971-1.html) +[#]: subject: (4 cool new projects to try in COPR from December 2020) +[#]: via: (https://fedoramagazine.org/4-cool-new-projects-to-try-in-copr-from-december/) +[#]: author: (Jakub Kadlčík https://fedoramagazine.org/author/frostyx/) + +COPR 仓库中 4 个很酷的新项目(2020.12) +====== + +![][1] + +COPR 是个人软件仓库[集合][2],它不在 Fedora 中。这是因为某些软件不符合轻松打包的标准;或者它可能不符合其他 Fedora 标准,尽管它是自由而开源的。COPR 可以在 Fedora 套件之外提供这些项目。COPR 中的软件不受 Fedora 基础设施的支持,或者是由项目自己背书的。但是,这是一种尝试新的或实验性的软件的一种巧妙的方式。 + +本文介绍了 COPR 中一些有趣的新项目。如果你第一次使用 COPR,请参阅 [COPR 用户文档][3]。 + +### Blanket + +[Blanket][5] 是一款播放背景声音的应用,它可能会提高你的注意力,提高你的工作效率。另外,它还可以帮助你在嘈杂的环境中放松和入睡。无论何时何地,Blanket 都可以让你在鸟鸣中醒来,在咖啡店聊天声或远离城市交通喧嚣的友好氛围下工作,然后在外面淅淅沥沥的雨声中像木头一样沉睡在壁炉旁边。还有其他流行的背景音选择,如粉色和白色噪音。 + +![][6] + +#### 安装说明 + +目前[仓库][8]为 Fedora 32 和 33 提供了 Blanket。要安装它,请使用以下命令: + +``` +sudo dnf copr enable tuxino/blanket +sudo dnf install blanket +``` + +### k9s + +[k9s][10] 是一个管理 Kubernetes 集群的命令行工具。它可以让你列出正在运行的 pod 并与之交互,读取它们的日志,挖掘已使用的资源,并总体上使操作 Kubernetes 更轻松。通过插件和可定制的用户界面的可扩展性,k9s 受到有经验用户的欢迎。 + + +![][11] + +有关[更多预览截图][12],请参见[项目页面][10]。 + +#### 安装说明 + +目前[仓库][14]为 Fedora 32、33、Fedora Rawhide 以及 EPEL 7、8、Centos Stream 等提供 k9s。要安装它,请使用以下命令: + +``` +sudo dnf copr enable luminoso/k9s +sudo dnf install k9s +``` + +### rhbzquery + +[rhbzquery][16] 是一个简单的查询 Fedora Bugzilla 的工具。它提供了一个指定搜索查询的界面,但它并不在命令行中列出结果,而是由 rhbzquery 生成 Bugzilla 的 URL,并在浏览器中打开。 + +![][17] + +#### 安装说明 + +目前[仓库][19]为 Fedora 32、33 和 Fedora Rawhide 提供 rhbzquery。要安装它,请使用以下命令: + +``` +sudo dnf copr enable petersen/rhbzquery +sudo dnf install rhbzquery +``` + +### gping + +[gping][21] 是一个比标准的 `ping` 命令更有视觉吸引力的选择,因为它以图表的形式显示结果。也可以同时 ping 多个主机,以方便比较它们的响应时间。 + +![][22] + +#### 安装说明 + +目前[仓库][24]为 Fedora 32、33、Fedora Rawhide 以及 EPEL 7 和 8 提供了 gping。要安装它,请使用以下命令: + +``` +sudo dnf copr enable atim/gping +sudo dnf install gping +``` + +-------------------------------------------------------------------------------- + +via: https://fedoramagazine.org/4-cool-new-projects-to-try-in-copr-from-december/ + +作者:[Jakub Kadlčík][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/frostyx/ +[b]: https://github.com/lujun9972 +[1]: https://fedoramagazine.org/wp-content/uploads/2017/08/4-copr-945x400.jpg +[2]: https://copr.fedorainfracloud.org/ +[3]: https://docs.pagure.org/copr.copr/user_documentation.html +[4]: https://github.com/FrostyX/fedora-magazine/blob/main/2020-december.md#blanket +[5]: https://github.com/rafaelmardojai/blanket +[6]: https://github.com/FrostyX/fedora-magazine/raw/main/img/blanket.png +[7]: https://github.com/FrostyX/fedora-magazine/blob/main/2020-december.md#installation-instructions +[8]: https://copr.fedorainfracloud.org/coprs/tuxino/blanket/ +[9]: https://github.com/FrostyX/fedora-magazine/blob/main/2020-december.md#k9s +[10]: https://k9scli.io/ +[11]: https://github.com/FrostyX/fedora-magazine/raw/main/img/k9s.png +[12]: https://k9scli.io/#-previews +[13]: https://github.com/FrostyX/fedora-magazine/blob/main/2020-december.md#installation-instructions-1 +[14]: https://copr.fedorainfracloud.org/coprs/luminoso/k9s/ +[15]: https://github.com/FrostyX/fedora-magazine/blob/main/2020-december.md#rhbzquery +[16]: https://github.com/juhp/rhbzquery +[17]: https://github.com/FrostyX/fedora-magazine/raw/main/img/rhbzquery.png +[18]: https://github.com/FrostyX/fedora-magazine/blob/main/2020-december.md#installation-instructions-2 +[19]: https://copr.fedorainfracloud.org/coprs/petersen/rhbzquery/ +[20]: https://github.com/FrostyX/fedora-magazine/blob/main/2020-december.md#gping +[21]: https://github.com/orf/gping +[22]: https://github.com/FrostyX/fedora-magazine/raw/main/img/gping.png +[23]: https://github.com/FrostyX/fedora-magazine/blob/main/2020-december.md#installation-instructions-4 +[24]: https://copr.fedorainfracloud.org/coprs/atim/gping diff --git a/published/202012/20201222 4 reasons businesses adopted open source in 2020.md b/published/202012/20201222 4 reasons businesses adopted open source in 2020.md new file mode 100644 index 0000000000..fc777240bc --- /dev/null +++ b/published/202012/20201222 4 reasons businesses adopted open source in 2020.md @@ -0,0 +1,54 @@ +[#]: collector: (lujun9972) +[#]: translator: (geekpi) +[#]: reviewer: (wxy) +[#]: publisher: (wxy) +[#]: url: (https://linux.cn/article-12967-1.html) +[#]: subject: (4 reasons businesses adopted open source in 2020) +[#]: via: (https://opensource.com/article/20/12/open-source-survey) +[#]: author: (Chris Grams https://opensource.com/users/cgrams) + +2020 年企业采用开源的 4 个原因 +====== + +> 根据 Tidelift 的第三次开源管理调查,根据公司规模,出现了差异。 + +![](https://img.linux.net.cn/data/attachment/album/202012/30/062849dn8amhiait1cvnne.jpg) + +Tidelift 的[第三次开源管理调查][2]发现,企业在大流行期间正在转向开源,44% 的组织报告他们将增加使用开源进行应用开发。 + +我们以前见过类似现象。在以前的经济衰退中,组织转向开源[以节省成本][3],并因[其它一些转型收益][4]而留下来。我们想了解哪些长期收益对不同规模的组织最有帮助。以下是我们发现的摘要。 + +**开源正在推动成本和时间的节约,同时提高效率。** 68% 的组织提到的一个关键驱动力是节约资金和开发时间,因为使用开源减少了开发人员从头开始编写新代码的时间。近半数(48%)报告称,它提高了应用开发和维护效率。拥有超过 1000 名员工的组织更有可能将此作为鼓励使用更多开源的原因(61%,而少于 1000 人的组织为 41%)。 + +![Graph showing reasons for using open source][5] + +*(Tidelift ©2020)* + +**在组织使用更多的开源的原因中,消除供应商锁定是一个重要原因。** 我们发现 40% 的受访者将这视为主要原因。用开源软件取代昂贵的专有软件,可以确保组织更加灵活,避免对供应商的依赖。同样,规模较大的组织也倾向于这个原因。在拥有 1000 名以上员工的组织中,有 50% 的组织将此作为主要优势。 + +**增加开发人员的满意度是使用更多开源的另一个原因,有 31% 的组织提到了这一点。** 随着企业对人才的激烈竞争,他们了解确保开发人员在工作中和使用的工具中感到快乐的价值。调查发现,开发人员使用的前三种语言是 JavaScript(78%)、Python(52%)和 Java(41%)。 + +**此外,随着开源使用量的增加,83% 的组织继续对其贡献,近一半的组织制定了管理贡献的政策。** 这些政策包括:在工作时间对组织使用但不赞助或管理的项目的贡献、对他们赞助或管理的项目的贡献、在个人时间对与工作无关的(个人)项目的贡献、以及在工作时间对与工作无关的(个人)项目的贡献。 + +虽然向开源的长期迁移仍在继续,但很明显,COVID-19 的影响可能正在加速这一进程,组织继续从使用和贡献中获得更深层次的价值。 + +更多信息,请查看 [2020 年开源管理调查][2]的所有调查结果。 + +-------------------------------------------------------------------------------- + +via: https://opensource.com/article/20/12/open-source-survey + +作者:[Chris Grams][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/cgrams +[b]: https://github.com/lujun9972 +[1]: https://opensource.com/sites/default/files/styles/image-full-size/public/lead-images/metrics_graph_stats_blue.png?itok=OKCc_60D (Metrics and a graph illustration) +[2]: https://www.tidelift.com/subscription/2020-managed-open-source-survey +[3]: https://blog.tidelift.com/the-third-wave-of-open-source-migration?utm_source=opensource&utm_medium=referral&utm_campaign=2020-survey +[4]: https://blog.tidelift.com/theres-one-thing-stopping-developers-from-using-open-source-even-more?utm_source=opensource&utm_medium=referral&utm_campaign=2020-survey +[5]: https://opensource.com/sites/default/files/uploads/tidelift_reasons-for-using-open-source.png (Graph showing reasons for using open source) diff --git a/published/202012/20201222 Font Manager- A Simple Open-Source App for GTK- Desktop.md b/published/202012/20201222 Font Manager- A Simple Open-Source App for GTK- Desktop.md new file mode 100644 index 0000000000..e2ac8d1ebd --- /dev/null +++ b/published/202012/20201222 Font Manager- A Simple Open-Source App for GTK- Desktop.md @@ -0,0 +1,104 @@ +[#]: collector: (lujun9972) +[#]: translator: (geekpi) +[#]: reviewer: (wxy) +[#]: publisher: (wxy) +[#]: url: (https://linux.cn/article-12968-1.html) +[#]: subject: (Font Manager: A Simple Open-Source App for GTK+ Desktop) +[#]: via: (https://itsfoss.com/font-manager/) +[#]: author: (Ankush Das https://itsfoss.com/author/ankush/) + +Font Manager:一个简单的 GTK+ 桌面的开源应用 +====== + +![](https://img.linux.net.cn/data/attachment/album/202012/30/065754mx4363qxabe8y9z0.jpg) + +> 一个非常简单的字体管理器应用,让你专注于调整 Linux 系统上的字体。 + +如果你是一个有经验的 Linux 用户,你可能会利用终端或 [调整工具][1]来管理你的 Linux 系统的字体。 + +老实说,不管 GNOME 调整工具有多有用,但是用来管理字体可能会不太够用。因此,一个单独的应用可以很好地帮助你管理字体。 + +### Font Manager:一个帮助管理字体的开源应用 + +![][2] + +Font Manager(这就是应用的字面名称)是一个专门帮助你管理字体的应用。 + +你可以获得字体族的详细信息、可用的变体,以及根据字体的高度、宽度、间距等进行过滤和调整的功能。考虑到它是一个简单的应用,因此你找不到很多功能,但是我将在下面简要介绍一些功能。 + +### Font Manager 的功能 + +![][3] + +* 可以添加字体 +* 可以删除字体 +* 根据字体族、供应商、间距、高度等因素轻松筛选字体 +* 调整字体的缩放系数 +* 调整字体的抗锯齿(软度/锐度) +* 添加字体源,以便在安装前进行预览 +* 提供快速管理的键盘快捷键 +* 开箱即用的谷歌字体集成 +* 获取关于字体族中可用字符的详细信息、许可证、字体大小、供应商、文件类型、间距、宽度和样式 + +![][4] + +总的来说,你可以轻松安装或删除字体。但是,当你管理字体时,你会得到很多帮助,如上面的截图所示。 + +### 在 Linux 上安装 Font Manager + +你有多种选择(取决于你使用的 Linux 发行版)进行安装。 + +如果你使用的是基于 Ubuntu 的发行版,你可以通过下面的命令轻松添加 PPA 来安装 Font Manager: + +``` +sudo add-apt-repository ppa:font-manager/staging +sudo apt update +sudo apt install font-manager +``` + +如果你不喜欢 [PPA][5](我更喜欢这样安装),你也可以在任何 Linux 发行版上安装一个[可用的 Flatpak 包][6]。 + +你只需要在你的 Linux 系统上启用 Flatpak,然后在你的软件中心搜索它(如果它支持 Flatpak 集成的话),或者直接输入下面的命令安装它: + +``` +flatpak install flathub org.gnome.FontManager +``` + +如果你是 Arch 用户,你可以在 [AUR][8] 中找到[包][7]。 + + +更多的安装说明,你可以参考它的[官网][9]和 [GitHub 页面][10]。 + +- [下载 Font Manager][9] + +### 总结 + +Font Manager 是一个简单的解决方案,适用于任何基于 GTK+ 的桌面环境。主要用于 GNOME,但你在其他桌面环境使用它。 + +你可以得到很多有用的信息,同时可以添加或删除字体,我想这显然是一个真正的字体管理器。 + +你对 Font Manager 有什么看法?在下面的评论中告诉我你的想法吧! + +-------------------------------------------------------------------------------- + +via: https://itsfoss.com/font-manager/ + +作者:[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/gnome-tweak-tool/ +[2]: https://i1.wp.com/itsfoss.com/wp-content/uploads/2020/12/font-manager.png?resize=800%2C565&ssl=1 +[3]: https://i1.wp.com/itsfoss.com/wp-content/uploads/2020/12/font-manager-settings.jpg?resize=800%2C569&ssl=1 +[4]: https://i0.wp.com/itsfoss.com/wp-content/uploads/2020/12/font-manager-showcase.png?resize=800%2C571&ssl=1 +[5]: https://itsfoss.com/ppa-guide/ +[6]: https://flathub.org/apps/details/org.gnome.FontManager +[7]: https://aur.archlinux.org/packages/font-manager/ +[8]: https://itsfoss.com/aur-arch-linux/ +[9]: https://fontmanager.github.io/ +[10]: https://github.com/FontManager/font-manager diff --git a/published/202101/20160302 Go channels are bad and you should feel bad.md b/published/202101/20160302 Go channels are bad and you should feel bad.md new file mode 100644 index 0000000000..74c9a6d10f --- /dev/null +++ b/published/202101/20160302 Go channels are bad and you should feel bad.md @@ -0,0 +1,445 @@ +[#]: collector: (lujun9972) +[#]: translator: (gxlct008) +[#]: reviewer: (wxy) +[#]: publisher: (wxy) +[#]: url: (https://linux.cn/article-12984-1.html) +[#]: subject: (Go channels are bad and you should feel bad) +[#]: via: (https://www.jtolio.com/2016/03/go-channels-are-bad-and-you-should-feel-bad) +[#]: author: (jtolio.com https://www.jtolio.com/) + +Go 通道是糟糕的,你应该也觉得很糟糕 +====== + +![](https://img.linux.net.cn/data/attachment/album/202101/05/101049y2995vz8l9mdg4bz.jpg) + +更新:如果你是从一篇题为 《[糟糕的 Go 语言](https://github.com/ksimka/go-is-not-good)》 的汇编文章看到这篇博文的话,那么我想表明的是,我很惭愧被列在这样的名单上。Go 绝对是我使用过的最不糟糕的的编程语言。在我写作本文时,我是想遏制我所看到的一种趋势,那就是过度使用 Go 的一些较复杂的部分。我仍然认为 +通道Channel可以更好,但是总体而言,Go 很棒。这就像你最喜欢的工具箱中有 [这个工具][1];它可以有用途(甚至还可能有更多的用途),它仍然可以成为你最喜欢的工具箱! + +更新 2:如果我没有指出这项对真实问题的优秀调查,那我将是失职的:《[理解 Go 中的实际并发错误][2]》。这项调查的一个重要发现是...Go 通道会导致很多错误。 + +从 2010 年中后期开始,我就断断续续地在使用 Google 的 [Go 编程语言][3],自 2012 年 1 月开始(在 Go 1.0 之前!),我就用 Go 为 [Space Monkey][4] 编写了合规的产品代码。我对 Go 的最初体验可以追溯到我在研究 Hoare 的 [通信顺序进程][5] 并发模型和 [Matt Might][7] 的 [UCombinator 研究组][8] 下的 [π-演算][6] 时,作为我([现在已重定向][9])博士工作的一部分,以更好地支持多核开发。Go 就是在那时发布的(多么巧合啊!),我当即就开始学习尝试了。 + +它很快就成为了 Space Monkey 开发的核心部分。目前,我们在 Space Monkey 的生产系统有超过 42.5 万行的纯 Go 代码(_不_ 包括我们所有的 vendored 库中的代码量,这将使它接近 150 万行),所以也并不是你见过的最多的 Go 代码,但是对于相对年轻的语言,我们是重度用户。我们之前 [写了我们的 Go 使用情况][10]。也开源了一些使用率很高的库;许多人似乎是我们的 [OpenSSL 绑定][11](比 [crypto/tls][12] 更快,但请保持 openssl 本身是最新的!)、我们的 [错误处理库][13]、[日志库][14] 和 [度量标准收集库/zipkin 客户端][15] 的粉丝。我们使用 Go、我们热爱 Go、我们认为它是目前为止我们使用过的最不糟糕的、符合我们需求的编程语言。 + +尽管我也不认为我能说服自己不要提及我的广泛避免使用 [goroutine-local-storage 库][16] (尽管它是一个你不应该使用的魔改技巧,但它是一个漂亮的魔改),希望我的其他经历足以证明我在解释我故意煽动性的帖子标题之前知道我在说什么。 + +![][17] + +### 等等,什么? + +如果你在大街上问一个有名的程序员,Go 有什么特别之处? 她很可能会告诉你 Go 最出名的是通道Channels 和 goroutine。 Go 的理论基础很大程度上是建立在 Hoare 的 CSP(通信顺序进程Communicating Sequential Processes)模型上的,该模型本身令人着迷且有趣,我坚信,到目前为止,它产生的收益远远超过了我们的预期。 + +CSP(和 π-演算)都使用通信作为核心同步原语,因此 Go 会有通道是有道理的。Rob Pike 对 CSP 着迷(有充分的理由)[相当深][18] 已经有一段时间了。([当时][19] 和 [现在][20])。 + +但是从务实的角度来看(也是 Go 引以为豪的),Go 把通道搞错了。在这一点上,通道的实现在我的书中几乎是一个坚实的反模式。为什么这么说呢?亲爱的读者,让我细数其中的方法。 + +#### 你可能最终不会只使用通道 + +Hoare 的 “通信顺序进程” 是一种计算模型,实际上,唯一的同步原语是在通道上发送或接收的。一旦使用 互斥量mutex信号量semaphore条件变量condition variable、bam,你就不再处于纯 CSP 领域。 Go 程序员经常通过高呼 “[通过交流共享内存][22]” 的 [缓存的思想][21] 来宣扬这种模式和哲学。 + +那么,让我们尝试在 Go 中仅使用 CSP 编写一个小程序!让我们成为高分接收者。我们要做的就是跟踪我们看到的最大的高分值。如此而已。 + +首先,我们将创建一个 `Game` 结构体。 + +``` +type Game struct { + bestScore int + scores chan int +} +``` + +`bestScore` 不会受到互斥量mutex的保护!这很好,因为我们只需要一个 goroutine 来管理其状态并通过通道来接收新的分值即可。 + +``` +func (g *Game) run() { + for score := range g.scores { + if g.bestScore < score { + g.bestScore = score + } + } +} +``` + +好的,现在我们将创建一个有用的构造函数来开始 `Game`。 + +``` +func NewGame() (g *Game) { + g = &Game{ + bestScore: 0, + scores: make(chan int), + } + go g.run() + return g +} +``` + +接下来,假设有人给了我们一个可以返回分数的 `Player`。它也可能会返回错误,因为可能传入的 TCP 流可能会死掉或发生某些故障,或者玩家退出。 + +``` +type Player interface { + NextScore() (score int, err error) +} +``` + +为了处理 `Player`,我们假设所有错误都是致命的,并将获得的比分向下传递到通道。 + +``` +func (g *Game) HandlePlayer(p Player) error { + for { + score, err := p.NextScore() + if err != nil { + return err + } + g.scores <- score + } +} +``` + +好极了!现在我们有了一个 `Game` 类型,可以以线程安全的方式跟踪 `Player` 获得的最高分数。 + +你圆满完成了自己的开发工作,并开始拥有客户。你将这个游戏服务器公开,就取得了令人难以置信的成功!你的游戏服务器上也许正在创建许多游戏。 + +很快,你发现人们有时会离开你的游戏。许多游戏不再有任何玩家在玩,但没有任何东西可以阻止游戏运行的循环。死掉的 `(*Game).run` goroutines 让你不知所措。 + +**挑战:** 在无需互斥量或 panics 的情况下修复上面的 goroutine 泄漏。实际上,可以滚动到上面的代码,并想出一个仅使用通道来解决此问题的方案。 + +我等着。 + +就其价值而言,它完全可以只通过通道来完成,但是请观察以下解决方案的简单性,它甚至没有这个问题: + +``` +type Game struct { + mtx sync.Mutex + bestScore int +} + +func NewGame() *Game { + return &Game{} +} + +func (g *Game) HandlePlayer(p Player) error { + for { + score, err := p.NextScore() + if err != nil { + return err + } + g.mtx.Lock() + if g.bestScore < score { + g.bestScore = score + } + g.mtx.Unlock() + } +} +``` + +你想选择哪一个?不要被欺骗了,以为通道的解决方案可以使它在更复杂的情况下更具可读性和可理解性。拆解Teardown是非常困难的。这种拆解若用互斥量mutex来做那只是小菜一碟,但最困难的是只使用 Go 专用通道来解决。另外,如果有人回复说发送通道的通道更容易推理,我马上就是感到头疼。 + +重要的是,这个特殊的情况可能真的 **很容易** 解决,而通道有一些运行时的帮助,而 Go 没有提供!不幸的是,就目前的情况来看,与 Go 的 CSP 版本相比,使用传统的同步原语synchronization primitives可以更好地解决很多问题,这是令人惊讶的。稍后,我们将讨论 Go 可以做些什么来简化此案例。 + +**练习:** 还在怀疑? 试着让上面两种解决方案(只使用通道与只使用互斥量channel-only vs mutex-only)在一旦 `bestScore` 大于或等于 100 时,就停止向 `Players` 索要分数。继续打开你的文本编辑器。这是一个很小的玩具问题。 + +这里的总结是,如果你想做任何实际的事情,除了通道之外,你还会使用传统的同步原语。 + +#### 通道比你自己实现要慢一些 + +Go 如此重视 CSP 理论,我认为其中一点就是,运行时应该可以通过通道做一些杀手级的调度优化。也许通道并不总是最直接的原语,但肯定是高效且快速的,对吧? + +![][23] + +正如 [Dustin Hiatt][24] 在 [Tyler Treat’s post about Go][25] 上指出的那样, + +> 在幕后,通道使用锁来序列化访问并提供线程安全性。 因此,通过使用通道同步对内存的访问,你实际上就是在使用锁。 被包装在线程安全队列中的锁。 那么,与仅仅使用标准库 `sync` 包中的互斥量相比,Go 的花式锁又如何呢? 以下数字是通过使用 Go 的内置基准测试功能,对它们的单个集合连续调用 Put 得出的。 + +``` +> BenchmarkSimpleSet-8 3000000 391 ns/op +> BenchmarkSimpleChannelSet-8 1000000 1699 ns/o +> +``` + +无缓冲通道的情况与此类似,甚至是在争用而不是串行运行的情况下执行相同的测试。 + +也许 Go 调度器会有所改进,但与此同时,良好的旧互斥量和条件变量是非常好、高效且快速。如果你想要提高性能,请使用久经考验的方法。 + +#### 通道与其他并发原语组合不佳 + +好的,希望我已经说服了你,有时候,你至少还会与除了通道之外的原语进行交互。标准库似乎显然更喜欢传统的同步原语而不是通道。 + +你猜怎么着,正确地将通道与互斥量和条件变量一起使用,其实是有一定的挑战性的。 + +关于通道的一个有趣的事情是,通道发送是同步的,这在 CSP 中是有很大意义的。通道发送和通道接收的目的是为了成为同步屏蔽,发送和接收应该发生在同一个虚拟时间。如果你是在执行良好的 CSP 领域,那就太好了。 + +![][26] + +实事求是地说,Go 通道也有多种缓冲方式。你可以分配一个固定的空间来考虑可能的缓冲,以便发送和接收是不同的事件,但缓冲区大小是有上限的。Go 并没有提供一种方法来让你拥有任意大小的缓冲区 —— 你必须提前分配缓冲区大小。 *这很好*,我在邮件列表上看到有人在争论,*因为无论如何内存都是有限的*。 + +What。 + +这是个糟糕的答案。有各种各样的理由来使用一个任意缓冲的通道。如果我们事先知道所有的事情,为什么还要使用 `malloc` 呢? + +没有任意缓冲的通道意味着在 *任何* 通道上的幼稚发送可能会随时阻塞。你想在一个通道上发送,并在互斥下更新其他一些记账吗?小心!你的通道发送可能被阻塞! + +``` +// ... +s.mtx.Lock() +// ... +s.ch <- val // might block! +s.mtx.Unlock() +// ... +``` + +这是哲学家晚餐大战的秘诀。如果你使用了锁,则应该迅速更新状态并释放它,并且尽可能不要在锁下做任何阻塞。 + +有一种方法可以在 Go 中的通道上进行非阻塞发送,但这不是默认行为。假设我们有一个通道 `ch := make(chan int)`,我们希望在其上无阻塞地发送值 `1`。以下是在不阻塞的情况下你必须要做的最小量的输入: + +``` +select { +case ch <- 1: // it sent +default: // it didn't +} +``` + +对于刚入门的 Go程序员来说,这并不是自然而然就能想到的事情。 + +综上所述,因为通道上的很多操作都会阻塞,所以需要对哲学家及其就餐仔细推理,才能在互斥量的保护下,成功地将通道操作与之并列使用,而不会造成死锁。 + +#### 严格来说,回调更强大,不需要不必要的 goroutines + +![][27] + +每当 API 使用通道时,或者每当我指出通道使某些事情变得困难时,总会有人会指出我应该启动一个 goroutine 来读取该通道,并在读取该通道时进行所需的任何转换或修复。 + +呃,不。如果我的代码位于热路径中怎么办?需要通道的实例很少,如果你的 API 可以设计为使用互斥量mutexes信号量semaphores回调callbacks,而不使用额外的 goroutine (因为所有事件边缘都是由 API 事件触发的),那么使用通道会迫使我在资源使用中添加另一个内存分配堆栈。是的,goroutine 比线程轻得多,但更轻量并不意味着是最轻量。 + +正如我以前 [在一篇关于使用通道的文章的评论中争论过的][28](呵呵,互联网),如果你使用回调而不是通道,你的 API *总是* 可以更通用,*总是* 更灵活,而且占用的资源也会大大减少。“总是” 是一个可怕的词,但我在这里是认真的。有证据级的东西在进行。 + +如果有人向你提供了一个基于回调的 API,而你需要一个通道,你可以提供一个回调,在通道上发送,开销不大,灵活性十足。 + +另一方面,如果有人提供了一个基于通道的 API 给你,而你需要一个回调,你必须启动一个 goroutine 来读取通道,*并且* 你必须希望当你完成读取时,没有人试图在通道上发送更多的东西,这样你就会导致阻塞的 goroutine 泄漏。 + +对于一个超级简单的实际例子,请查看 [context 接口][29](顺便说一下,它是一个非常有用的包,你应该用它来代替 [goroutine 本地存储][16])。 + +``` +type Context interface { + ... + // Done returns a channel that closes when this work unit should be canceled. + // Done 返回一个通道,该通道在应该取消该工作单元时关闭。 + Done() <-chan struct{} + + // Err returns a non-nil error when the Done channel is closed + // 当 Done 通道关闭时,Err 返回一个非 nil 错误 + Err() error + ... +} +``` + +想象一下,你要做的只是在 `Done()` 通道触发时记录相应的错误。你该怎么办?如果你没有在通道中选择的好地方,则必须启动 goroutine 进行处理: + +``` +go func() { + <-ctx.Done() + logger.Errorf("canceled: %v", ctx.Err()) +}() +``` + +如果 `ctx` 在不关闭返回 `Done()` 通道的情况下被垃圾回收怎么办?哎呀!这正是一个 goroutine 泄露! + +现在假设我们更改了 `Done` 的签名: + +``` +// Done calls cb when this work unit should be canceled. +Done(cb func()) +``` + +首先,现在日志记录非常容易。看看:`ctx.Done(func() { log.Errorf ("canceled:%v", ctx.Err()) })`。但是假设你确实需要某些选择行为。你可以这样调用它: + +``` +ch := make(chan struct{}) +ctx.Done(func() { close(ch) }) +``` + +瞧!通过使用回调,不会失去表现力。 `ch` 的工作方式类似于用于返回的通道 `Done()`,在日志记录的情况下,我们不需要启动整个新堆栈。我必须保留堆栈跟踪信息(如果我们的日志包倾向于使用它们);我必须避免将其他堆栈分配和另一个 goroutine 分配给调度程序。 + +下次你使用通道时,问问你自己,如果你用互斥量和条件变量代替,是否可以消除一些 goroutine ? 如果答案是肯定的,那么修改这些代码将更加有效。而且,如果你试图使用通道只是为了在集合中使用 `range` 关键字,那么我将不得不请你放下键盘,或者只是回去编写 Python 书籍。 + +![more like Zooey De-channel, amirite][30] + +#### 通道 API 不一致,只是 cray-cray + +在通道已关闭的情况下,执行关闭或发送消息将会引发 panics!为什么呢? 如果想要关闭通道,你需要在外部同步它的关闭状态(使用互斥量等,这些互斥量的组合不是很好!),这样其他写入者才不会写入或关闭已关闭的通道,或者只是向前冲,关闭或写入已关闭的通道,并期望你必须恢复所有引发的 panics。 + +这是多么怪异的行为。 Go 中几乎所有其他操作都有避免 panic 的方法(例如,类型断言具有 `, ok =` 模式),但是对于通道,你只能自己动手处理它。 + +好吧,所以当发送失败时,通道会出现 panic。我想这是有一定道理的。但是,与几乎所有其他带有 nil 值的东西不同,发送到 nil 通道不会引发 panic。相反,它将永远阻塞!这很违反直觉。这可能是有用的行为,就像在你的除草器上附加一个开罐器,可能有用(在 Skymall 可以找到)一样,但这肯定是意想不到的。与 nil 映射(执行隐式指针解除引用),nil 接口(隐式指针解除引用),未经检查的类型断言以及其他所有类型交互不同,nil 通道表现出实际的通道行为,就好像为该操作实例化了一个全新的通道一样。 + +接收的情况稍微好一点。在已关闭的通道上执行接收会发生什么?好吧,那会是有效操作——你将得到一个零值。好吧,我想这是有道理的。奖励!接收允许你在收到值时进行 `, ok =` 样式的检查,以确定通道是否打开。谢天谢地,我们在这里得到了 `, ok =`。 + +但是,如果你从 nil 渠道接收会发生什么呢? *也是永远阻塞!* 耶!不要试图利用这样一个事实:如果你关闭了通道,那么你的通道是 nil! + +### 通道有什么好处? + +当然,通道对于某些事情是有好处的(毕竟它们是一个通用容器),有些事情你只能用它们来做(比如 `select`)。 + +#### 它们是另一种特殊情况下的通用数据结构 + +Go 程序员已经习惯于对泛型的争论,以至于我一提起这个词就能感觉到 PTSD(创伤后应激障碍)的到来。我不是来谈论这件事的,所以擦擦额头上的汗,让我们继续前进吧。 + +无论你对泛型的看法是什么,Go 的映射、切片和通道都是支持泛型元素类型的数据结构,因为它们已经被特殊封装到语言中了。 + +在一种不允许你编写自己的泛型容器的语言中,任何允许你更好地管理事物集合的东西都是有价值的。在这里,通道是一个支持任意值类型的线程安全数据结构。 + +所以这很有用!我想这可以省去一些陈词滥调。 + +我很难把这算作是通道的胜利。 + +#### Select + +使用通道可以做的主要事情是 `select` 语句。在这里,你可以等待固定数量的事件输入。它有点像 epoll,但你必须预先知道要等待多少个套接字。 + +这是真正有用的语言功能。如果不是 `select`,通道将被彻底清洗。但是我的天呐,让我告诉你,第一次决定可能需要在多个事物中选择,但是你不知道有多少项,因此必须使用 `reflect.Select`。 + +### 通道如何才能更好? + +很难说 Go 语言团队可以为 Go 2.0 做的最具战术意义的事情是什么(Go 1.0 兼容性保证很好,但是很费劲),但这并不能阻止我提出一些建议。 + +#### 在条件变量上的 Select ! + +我们可以不需要通道!这是我提议我们摆脱一些“圣牛sacred cows”(LCTT 译注:神圣不可质疑的事物)的地方,但是让我问你,如果你可以选择任何自定义同步原语,那会有多棒?(答:太棒了。)如果有的话,我们根本就不需要通道了。 + +#### GC 可以帮助我们吗? + +在第一个示例中,如果我们能够使用定向类型的通道垃圾回收(GC)来帮助我们进行清理,我们就可以轻松地解决通道的高分服务器清理问题。 + +![][31] + +如你所知,Go 具有定向类型的通道。 你可以使用仅支持读取的通道类型(`<-chan`)和仅支持写入的通道类型(`chan<-`)。 这太棒了! + +Go 也有垃圾回收功能。 很明显,某些类型的记账方式太繁琐了,我们不应该让程序员去处理它们。 我们清理未使用的内存! 垃圾回收非常有用且整洁。 + +那么,为什么不帮助清理未使用或死锁的通道读取呢? 与其让 `make(chan Whatever)` 返回一个双向通道,不如让它返回两个单向通道(`chanReader, chanWriter:= make(chan Type)`)。 + +让我们重新考虑一下最初的示例: + +``` +type Game struct { + bestScore int + scores chan<- int +} + +func run(bestScore *int, scores <-chan int) { + // 我们不会直接保留对游戏的引用,因为这样我们就会保留着通道的发送端。 + for score := range scores { + if *bestScore < score { + *bestScore = score + } + } +} + +func NewGame() (g *Game) { + // 这种 make(chan) 返回风格是一个建议 + scoreReader, scoreWriter := make(chan int) + g = &Game{ + bestScore: 0, + scores: scoreWriter, + } + go run(&g.bestScore, scoreReader) + return g +} + +func (g *Game) HandlePlayer(p Player) error { + for { + score, err := p.NextScore() + if err != nil { + return err + } + g.scores <- score + } +} +``` + +如果垃圾回收关闭了一个通道,而我们可以证明它永远不会有更多的值,那么这个解决方案是完全可行的。是的,是的,`run` 中的评论暗示着有一把相当大的枪瞄准了你的脚,但至少现在这个问题可以很容易地解决了,而以前确实不是这样。此外,一个聪明的编译器可能会做出适当的证明,以减少这种脚枪造成的损害。 + +#### 其他小问题 + +* **Dup 通道吗?** —— 如果我们可以在通道上使用等效于 `dup` 的系统调用,那么我们也可以很容易地解决多生产者问题。 每个生产者可以关闭自己的 `dup` 版通道,而不会破坏其他生产者。 +* **修复通道 API!** —— 关闭不是幂等的吗? 在已关闭的通道上发送信息引起的 panics 没有办法避免吗? 啊! +* **任意缓冲的通道** —— 如果我们可以创建没有固定的缓冲区大小限制的缓冲通道,那么我们可以创建非阻塞的通道。 + +### 那我们该怎么向大家介绍 Go 呢? + +如果你还没有,请看看我目前最喜欢的编程文章:《[你的函数是什么颜色][32]》。虽然不是专门针对 Go,但这篇博文比我更有说服力地阐述了为什么 goroutines 是 Go 最好的特性(这也是 Go 在某些应用程序中优于 Rust 的方式之一)。 + +如果你还在使用这样的一种编程语言写代码,它强迫你使用类似 `yield` 关键字来获得高性能、并发性或事件驱动的模型,那么你就是活在过去,不管你或其他人是否知道这一点。到目前为止,Go 是我所见过的实现 M:N 线程模型(非 1:1 )的语言中最好的入门者之一,而且这种模型非常强大。 + +所以,跟大家说说 goroutines 吧。 + +如果非要我选择 Go 的另一个主要特性,那就是接口。静态类型的 [鸭子模型][33]duck typing 使得扩展、使用你自己或他人的项目变得如此有趣而令人惊奇,这也许值得我改天再写一组完全不同的文章来介绍它。 + +### 所以… + +我一直看到人们争先恐后冲进 Go,渴望充分利用通道来发挥其全部潜力。这是我对你的建议。 + +**够了!** + +当你在编写 API 和接口时,尽管“绝不”的建议可能很糟糕,但我非常肯定,通道从来没有什么时候好过,我用过的每一个使用通道的 Go API,最后都不得不与之抗争。我从来没有想过“哦 太好了,这里是一个通道;”它总是被一些变体取代,_**这是什么新鲜的地狱?**_ + +所以,_请在适当的地方,并且只在适当的地方使用通道。_ + +在我使用的所有 Go 代码中,我可以用一只手数出有多少次通道真的是最好的选择。有时候是这样的。那很好!那就用它们吧。但除此之外,就不要再使用了。 + +![][34] + +_特别感谢我的校对读者 Jeff Wendling、[Andrew Harding][35]、[George Shank][36] 和 [Tyler Treat][37] 提供的宝贵反馈。_ + +如果你想和我们一起用 Go 在 Space Monkey 项目工作,请[给我打个招呼][38]! + +-------------------------------------------------------------------------------- + +via: https://www.jtolio.com/2016/03/go-channels-are-bad-and-you-should-feel-bad + +作者:[jtolds][a] +选题:[lujun9972][b] +译者:[gxlct008](https://github.com/gxlct008) +校对:[wxy](https://github.com/wxy) + +本文由 [LCTT](https://github.com/LCTT/TranslateProject) 原创编译,[Linux中国](https://linux.cn/) 荣誉推出 + +[a]: https://www.jtolio.com/ +[b]: https://github.com/lujun9972 +[1]: https://blog.codinghorror.com/content/images/uploads/2012/06/6a0120a85dcdae970b017742d249d5970d-800wi.jpg +[2]: https://songlh.github.io/paper/go-study.pdf +[3]: https://golang.org/ +[4]: http://www.spacemonkey.com/ +[5]: https://en.wikipedia.org/wiki/Communicating_sequential_processes +[6]: https://en.wikipedia.org/wiki/%CE%A0-calculus +[7]: http://matt.might.net +[8]: http://www.ucombinator.org/ +[9]: https://www.jtolio.com/writing/2015/11/research-log-cell-states-and-microarrays/ +[10]: https://www.jtolio.com/writing/2014/04/go-space-monkey/ +[11]: https://godoc.org/github.com/spacemonkeygo/openssl +[12]: https://golang.org/pkg/crypto/tls/ +[13]: https://godoc.org/github.com/spacemonkeygo/errors +[14]: https://godoc.org/github.com/spacemonkeygo/spacelog +[15]: https://godoc.org/gopkg.in/spacemonkeygo/monitor.v1 +[16]: https://github.com/jtolds/gls +[17]: https://www.jtolio.com/images/wat/darth-helmet.jpg +[18]: https://en.wikipedia.org/wiki/Newsqueak +[19]: https://en.wikipedia.org/wiki/Alef_%28programming_language%29 +[20]: https://en.wikipedia.org/wiki/Limbo_%28programming_language%29 +[21]: https://lesswrong.com/lw/k5/cached_thoughts/ +[22]: https://blog.golang.org/share-memory-by-communicating +[23]: https://www.jtolio.com/images/wat/jon-stewart.jpg +[24]: https://twitter.com/HiattDustin +[25]: http://bravenewgeek.com/go-is-unapologetically-flawed-heres-why-we-use-it/ +[26]: https://www.jtolio.com/images/wat/obama.jpg +[27]: https://www.jtolio.com/images/wat/yael-grobglas.jpg +[28]: http://www.informit.com/articles/article.aspx?p=2359758#comment-2061767464 +[29]: https://godoc.org/golang.org/x/net/context +[30]: https://www.jtolio.com/images/wat/zooey-deschanel.jpg +[31]: https://www.jtolio.com/images/wat/joel-mchale.jpg +[32]: http://journal.stuffwithstuff.com/2015/02/01/what-color-is-your-function/ +[33]: https://en.wikipedia.org/wiki/Duck_typing +[34]: https://www.jtolio.com/images/wat/michael-cera.jpg +[35]: https://github.com/azdagron +[36]: https://twitter.com/taterbase +[37]: http://bravenewgeek.com +[38]: https://www.jtolio.com/contact/ diff --git a/published/202101/20181009 GCC- Optimizing Linux, the Internet, and Everything.md b/published/202101/20181009 GCC- Optimizing Linux, the Internet, and Everything.md new file mode 100644 index 0000000000..641a77b740 --- /dev/null +++ b/published/202101/20181009 GCC- Optimizing Linux, the Internet, and Everything.md @@ -0,0 +1,93 @@ +GCC:优化 Linux、互联网和一切 +====== + +![](https://img.linux.net.cn/data/attachment/album/202101/22/122155ujfd62u6zbx3i4b3.jpg) + +软件如果不能被电脑运行,那么它就是无用的。而在处理运行时run-time性能的问题上,即使是最有才华的开发人员也会受编译器的支配 —— 因为如果没有可靠的编译器工具链,就无法构建任何重要的东西。GNU 编译器集合GNU Compiler Collection(GCC)提供了一个健壮、成熟和高性能的工具,以帮助你充分发挥你代码的潜能。经过数十年成千上万人的开发,GCC 成为了世界上最受尊敬的编译器之一。如果你在构建应用程序是没有使用 GCC,那么你可能错过了最佳解决方案。 + +根据 LLVM.org 的说法,GCC 是“如今事实上的标准开源编译器” [^1],也是用来构建完整系统的基础 —— 从内核开始。GCC 支持超过 60 种硬件平台,包括 ARM、Intel、AMD、IBM POWER、SPARC、HP PA-RISC 和 IBM Z,以及各种操作环境,包括 GNU、Linux、Windows、macOS、FreeBSD、NetBSD、OpenBSD、DragonFly BSD、Solaris、AIX、HP-UX 和 RTEMS。它提供了高度兼容的 C/C++ 编译器,并支持流行的 C 库,如 GNU C Library(glibc)、Newlib、musl 和各种 BSD 操作系统中包含的 C 库,以及 Fortran、Ada 和 GO 语言的前端。GCC 还可以作为一个交叉编译器,可以为运行编译器的平台以外的其他平台创建可执行代码。GCC 是紧密集成的 GNU 工具链的核心组件,由 GNU 项目产生,它包括 glibc、Binutils 和 GNU 调试器(GDB)。 + +“一直以来我最喜欢的 GNU 工具是 GCC,即GNU 编译器集合GNU Compiler Collection。在开发工具非常昂贵的时候,GCC 是第二个 GNU 工具,也是使社区能够编写和构建所有其他工具的工具。这个工具一手改变了这个行业,导致了自由软件运动的诞生,因为一个好的、自由的编译器是一个社区软件的先决条件。”—— Red Hat 开源和标准团队的 Dave Neary。[^2] + +### 优化 Linux + +作为 Linux 内核源代码的默认编译器,GCC 提供了可靠、稳定的性能以及正确构建内核所需的额外扩展。GCC 是流行的 Linux 发行版的标准组件,如 ArchLinux、CentOS、Debian、Fedora、openSUSE 和 Ubuntu 这些发行版中,GCC 通常用来编译支持系统的组件。这包括 Linux 使用的默认库(如 libc、libm、libintl、libssh、libssl、libcrypto、libexpat、libpthread 和 ncurses),这些库依赖于 GCC 来提供可靠性和高性能,并且使应用程序和系统程序可以访问 Linux 内核功能。发行版中包含的许多应用程序包也是用 GCC 构建的,例如 Python、Perl、Ruby、nginx、Apache HTTP 服务器、OpenStack、Docker 和 OpenShift。各个 Linux 发行版使用 GCC 构建的大量代码组成了内核、库和应用程序软件。对于 openSUSE 发行版,几乎 100% 的原生代码都是由 GCC 构建的,包括 6135 个源程序包、5705 个共享库和 38927 个可执行文件。这相当于每周编译 24540 个源代码包。[^3] + +Linux 发行版中包含的 GCC 的基本版本用于创建定义系统应用程序二进制接口Application Binary Interface(ABI)的内核和库。用户空间User space开发者可以选择下载 GCC 的最新稳定版本,以获得高级功能、性能优化和可用性改进。Linux 发行版提供安装说明或预构建的工具链,用于部署最新版本的 GCC 以及其他 GNU 工具,这些工具有助于提高开发人员的工作效率和缩短部署时间。 + +### 优化互联网 + +GCC 是嵌入式系统中被广泛采用的核心编译器之一,支持为日益增长的物联网设备开发软件。GCC 提供了许多扩展功能,使其非常适合嵌入式系统软件开发,包括使用编译器的内建函数、#语法、内联汇编和以应用程序为中心的命令行选项进行精细控制。GCC 支持广泛的嵌入式体系结构,包括 ARM、AMCC、AVR、Blackfin、MIPS、RISC-V、Renesas Electronics V850、NXP 和 Freescale Power 处理器,可以生成高效、高质量的代码。GCC提供的交叉编译能力对这个社区至关重要,而预制的交叉编译工具链 [^4] 是一个主要需求。例如,GNU ARM 嵌入式工具链是经过集成和验证的软件包,其中包含 ARM 嵌入式 GCC 编译器、库和其它裸机软件开发所需的工具。这些工具链可用于在 Windows、Linux 和 macOS 主机操作系统上对流行的 ARM Cortex-R 和 Cortex-M 处理器进行交叉编译,这些处理器已装载于数百亿台支持互联网的设备中。[^5] + +GCC 为云计算赋能,为需要直接管理计算资源的软件提供了可靠的开发平台,如数据库和 Web 服务引擎以及备份和安全软件。GCC 完全兼容 C++ 11 和 C++ 14,为 C++ 17 和 C++ 2a 提供实验支持 [^6](LCTT 译注:本文原文发布于 2018 年),可以创建性能优异的对象代码,并提供可靠的调试信息。使用 GCC 的应用程序的一些例子包括:MySQL 数据库管理系统,它需要 Linux 的 GCC [^7];Apache HTTP 服务器,它建议使用 GCC [^8];Bacula,一个企业级网络备份工具,它需要 GCC。[^9] + +### 优化一切 + +对于高性能计算High Performance Computing(HPC)中使用的科学代码的研究和开发,GCC 提供了成熟的 C、C++ 和 Fortran 前端,以及对 OpenMP 和 OpenACC API的支持,用于基于指令的并行编程。因为 GCC 提供了跨计算环境的可移植性,它使得代码能够更容易地在各种新的和传统的客户机和服务器平台上进行测试。GCC 为 C、C++ 和 Fortran 编译器提供了 OpenMP 4.0 的完整支持,为 C 和 C++ 编译器提供了 OpenMP 4.5 完整支持。对于 OpenACC、 GCC 支持大部分 2.5 规范和性能优化,并且是唯一提供 [OpenACC][1] 支持的非商业、非学术编译器。 + +代码性能是这个社区的一个重要参数,GCC 提供了一个坚实的性能基础。Colfax Research 于 2017 年 11 月发表的一篇论文评估了 C++ 编译器在使用 OpenMP 4.x 指令并行化编译代码的速度和编译后代码的运行速度。图 1 描绘了不同编译器编译并使用单个线程运行时计算内核的相对性能。性能值经过了归一化处理,以 G++ 的性能为 1.0。 + +![performance][3] + +*图 1 为由不同编译器编译的每个内核的相对性能。(单线程,越高越好)。* + +他的论文总结道:“GNU 编译器在我们的测试中也做得很好。G++ 在六种情况中的三种情况下生成的代码速度是第二快的,并且在编译时间方面是最快的编译器之一。”[^10] + +### 谁在用 GCC? + +在 JetBrains 2018 年的开发者生态状况调查中,在接受调查的 6000 名开发者中,66% 的 C++ 程序员和 73% 的 C 程序员经常使用 GCC。[^11] 以下简要介绍 GCC 的优点,正是这些优点使它在开发人员社区中如此受欢迎。 + + * 对于需要为各种新的和遗留的计算平台和操作环境编写代码的开发人员,GCC 提供了对最广泛的硬件和操作环境的支持。硬件供应商提供的编译器主要侧重于对其产品的支持,而其他开源编译器在所支持的硬件和操作系统方面则受到很大限制。[^12] + * 有各种各样的基于 GCC 的预构建工具链,这对嵌入式系统开发人员特别有吸引力。这包括 GNU ARM 嵌入式工具链和 Bootlin 网站上提供的 138 个预编译交叉编译器工具链。[^13] 虽然其他开源编译器(如 Clang/LLVM)可以取代现有交叉编译工具链中的 GCC,但这些工具集需要开发者完全重新构建。[^14] + * GCC 通过成熟的编译器平台向应用程序开发人员提供可靠、稳定的性能。《在 AMD EPYC 平台上用 GCC 8/9 与 LLVM Clang 6/7 编译器基准测试》这篇文章提供了 49 个基准测试的结果,这些测试的编译器在三个优化级别上运行。使用 `-O3 -march=native` 级别的 GCC 8.2 RC1 在 34% 的时间里排在第一位,而在相同的优化级别 LLVM Clang 6.0 在 20% 的时间里赢得了第二位。[^15] + * GCC 为编译调试 [^16] 提供了改进的诊断方法,并为运行时调试提供了准确而有用的信息。GCC 与 GDB 紧密集成,GDB 是一个成熟且功能齐全的工具,它提供“不间断”调试,可以在断点处停止单个线程。 + * GCC 是一个得到良好支持的平台,它有一个活跃的、有责任感的社区,支持当前版本和以前的两个版本。由于每年都有发布计划,这为一个版本提供了两年的支持。 + +### GCC:仍然在继续优化 + +GCC 作为一个世界级的编译器继续向前发展。GCC 的最新版本是 8.2,于 2018 年 7 月发布(LCTT 译注:本文原文发表于 2018 年),增加了对即将推出的 Intel CPU、更多 ARM CPU 的硬件支持,并提高了 AMD 的 ZEN CPU 的性能。增加了对 C17 的初步支持,同时也对 C++2A 进行了初步工作。诊断功能继续得到增强,包括更好的发射诊断,改进了定位、定位范围和修复提示,特别是在 C++ 前端。Red Hat 的 David Malcolm 在 2018 年 3 月撰写的博客概述了 GCC 8 中的可用性改进。[^17] + +新的硬件平台继续依赖 GCC 工具链进行软件开发,例如 RISC-V,这是一种自由开放的 ISA,机器学习、人工智能(AI)和物联网细分市场都对其感兴趣。GCC 仍然是 Linux 系统持续开发的关键组件。针对 Intel 架构的 Clear Linux 项目是一个为云、客户端和物联网用例构建的新兴发行版,它提供了一个很好的示例,说明如何使用和改进 GCC 编译器技术来提高基于 Linux 的系统的性能和安全性。GCC 还被用于微软 Azure Sphere 的应用程序开发,这是一个基于 Linux 的物联网应用程序操作系统,最初支持基于 ARM 的联发科 MT3620 处理器。在培养下一代程序员方面,GCC 也是树莓派的 Windows 工具链的核心组件,树莓派是一种运行基于 Debian 的 GNU/Linux 的低成本嵌入式板,用于促进学校和发展中国家的基础计算机科学教学。 + +GCC 由 GNU 项目的创始人理查德•斯托曼Richard Stallman首次发布 于 1987 年 3 月 22 日,由于它是第一个作为自由软件发布的可移植的 ANSI C 优化编译器,因此它被认为是一个重大突破。GCC 由来自世界各地的程序员组成的社区在指导委员会的指导下维护,以确保对项目进行广泛的、有代表性的监督。GCC 的社区方法是它的优势之一,它形成了一个由开发人员和用户组成的庞大而多样化的社区,他们为项目做出了贡献并提供支持。根据 Open Hub 的说法,“GCC 是世界上最大的开源团队之一,在 Open Hub 上的所有项目团队中排名前 2%。”[^18] + +关于 GCC 的许可问题,人们进行了大量的讨论,其中大多数是混淆而不是启发。GCC 在 GNU 通用公共许可证(GPL)版本 3 或更高版本下发布,但运行时库例外。这是一个左版许可,这意味着衍生作品只能在相同的许可条款下分发。GPLv3 旨在保护 GCC,防止其成为专有软件,并要求对 GCC 代码的更改可以自由公开地进行。对于“最终用户”来说,这个编译器与其他编译器完全相同;使用 GCC 对你为自己的代码所选择的任何许可都没有区别。[^19] + + [^1]: http://clang.llvm.org/features.html#gcccompat + [^2]: https://opensource.com/article/18/9/happy-birthday-gnu + [^3]: 由 SUSE 基于最近的构建统计提供的信息。在 openSUSE 中还有其他不生成可执行镜像的源码包,这些不包括在统计中。 + [^4]: https://community.arm.com/tools/b/blog/posts/gnu-toolchain-performance-in-2018 + [^5]: https://www.arm.com/products/processors/cortex-m + [^6]: https://gcc.gnu.org/projects/cxx-status.html#cxx17 + [^7]: https://mysqlserverteam.com/mysql-8-0-source-code-improvements/ + [^8]: http://httpd.apache.org/docs/2.4/install.html + [^9]: https://blog.bacula.org/what-is-bacula/system-requirements/ +[^10]: https://colfaxresearch.com/compiler-comparison/ +[^11]: https://www.jetbrains.com/research/devecosystem-2018/ +[^12]: http://releases.llvm.org/6.0.0/tools/clang/docs/UsersManual.html +[^13]: https://bootlin.com/blog/free-and-ready-to-use-cross-compilation-toolchains/ +[^14]: https://clang.llvm.org/docs/Toolchain.html +[^15]: https://www.phoronix.com/scan.php?page=article&item=gcclang-epyc-summer18&num=1 +[^16]: https://gcc.gnu.org/wiki/ClangDiagnosticsComparison +[^17]: https://developers.redhat.com/blog/2018/03/15/gcc-8-usability-improvements/ +[^18]: https://www.openhub.net/p/gcc/factoids#FactoidTeamSizeVeryLarge +[^19]: https://www.gnu.org/licenses/gcc-exception-3.1-faq.en.html + + +-------------------------------------------------------------------------------- + +via: https://www.linux.com/blog/2018/10/gcc-optimizing-linux-internet-and-everything + +作者:[Margaret Lewis][a] +选题:[lujun9972][b] +译者:[Chao-zhi](https://github.com/Chao-zhi) +校对:[wxy](https://github.com/wxy) + +本文由 [LCTT](https://github.com/LCTT/TranslateProject) 原创编译,[Linux中国](https://linux.cn/) 荣誉推出 + +[a]: https://www.linux.com/users/margaret-lewis +[b]: https://github.com/lujun9972 +[1]: https://www.openacc.org/tools +[2]: /files/images/gccjpg-0 +[3]: https://lcom.static.linuxfound.org/sites/lcom/files/gcc_0.jpg?itok=HbGnRqWX "performance" +[4]: https://www.linux.com/licenses/category/used-permission diff --git a/published/202101/20181123 Three SSH GUI Tools for Linux.md b/published/202101/20181123 Three SSH GUI Tools for Linux.md new file mode 100644 index 0000000000..63cc03c092 --- /dev/null +++ b/published/202101/20181123 Three SSH GUI Tools for Linux.md @@ -0,0 +1,148 @@ +[#]: collector: (lujun9972) +[#]: translator: (stevenzdg988) +[#]: reviewer: (wxy) +[#]: publisher: (wxy) +[#]: subject: (Three SSH GUI Tools for Linux) +[#]: via: (https://www.linux.com/blog/learn/intro-to-linux/2018/11/three-ssh-guis-linux) +[#]: author: (Jack Wallen https://www.linux.com/users/jlwallen) +[#]: url: (https://linux.cn/article-13010-1.html) + +三种 Linux 下的 SSH 图形界面工具 +====== + +![](https://lcom.static.linuxfound.org/sites/lcom/files/ssh.jpg) + +在你作为 Linux 系统管理员的职业生涯中,你可以使用 Secure Shell(SSH)远程访问 Linux 服务器或桌面系统。很有可能,你已经使用过了。在某些情况下,你会通过 SSH 一次性登录多个 Linux 服务器。实际上,SSH 很可能是 Linux 工具箱中最常用的工具之一。因此,你会希望操作尽可能高效。对于许多系统管理员来说,没有什么比命令行更有效的了。但是,有些用户确实更喜欢 GUI 工具,尤其是从一台桌面台式机远程连接到服务器上工作时。 + +如果你碰巧喜欢 GUI 工具,那么你肯定想了解一下 Linux 上的一些出色的 SSH 图形界面工具。将其与独特的终端窗口相结合,可以从同一窗口远程访问多台计算机,你便拥有了高效工作所需的一切。让我们看以下这三个工具,找出其中一个(或多个)是否完全适合你的需求。 + +我将在 [Elementary OS][1] 上演示这些工具,但是大多数流行的发行版都可以使用它们。 + +### PuTTY + +只要是久经沙场的人都知道 [PuTTY][2]。 实际上,PuTTY 是从 Windows 环境通过 SSH 连接到 Linux 服务器的事实标准工具。但是 PuTTY 不仅适用于 Windows。实际上,从其标准存储库中,PuTTY 也可以安装到 Linux 上。 PuTTY 的功能列表包括: + + * 保存会话 + * 通过 IP 地址或主机名链接 + * 定义备用 SSH 端口 + * 链接类型定义 + * 日志记录 + * 键盘、响铃、外观、连接等选项 + * 本地和远程隧道配置 + * 支持代理 + * 支持X11 隧道 + +PuTTY GUI 主要是一种保存 SSH 会话的方式,因此,你可以更轻松地管理那些你需要不断远程登录、登出的各种 Linux 服务器和桌面台式机。从 PuTTY 连接到 Linux 服务器后,你将拥有一个可以运行的终端窗口。此时,你可能会问自己,为什么不只在终端窗口中工作?对于某些人来说,保存会话的便捷性确实使 PuTTY 值得使用。 + +在 Linux 上安装 PuTTY 很简单。例如,你可以在基于 Debian 的发行版上执行命令: + +``` +sudo apt-get install -y putty +``` + +安装后,你可以从桌面菜单运行 PuTTY GUI 或执行命令 `putty`。在“PuTTY 配置PuTTY Configuration” 窗口(图 1)中,在 “主机名(或 IP 地址)HostName (or IP address)”位置键入主机名或 IP 地址,配置端口Port”(如果不是默认值 22),从“连接类型Connection type”中选择 “SSH” ,然后单击“打开Open”。 + +![PuTTY Connection][4] + +*图 1:PuTTY 连接配置窗口。* + +建立连接后,系统将提示你输入远程服务器上的用户凭据(图 2)。 + +![log in][7] + +*图 2:使用 PuTTY 登录到远程服务器。* + +要保存会话(以便不必总是键入远程服务器信息),填写 IP 地址(或主机名),配置端口和连接类型,然后(在单击 “打开Open” 之前),在 “保存会话Saved Sessions” 顶部文本区域中键入链接的名称,然后单击 “保存Save”。 这样将保存此会话的配置。若要连接到已保存的会话,请从 “已保存的会话Saved Sessions” 窗口中选择它,单击 “加载Load”,然后单击 “打开Open”。 然后,系统将提示你输入远程服务器上的远程凭据登录远程服务器。 + +### EasySSH + +尽管 [EasySSH][8] 没有提供 PuTTY 中提供的大量配置选项,但是(顾名思义)它非常易于使用。 EasySSH 的最佳功能之一是提供标签式界面,因此你可以打开多个 SSH 连接并在它们之间快速切换。 EasySSH 的功能包括: + + * 分组(你可以将选项卡分组以获得更高效的体验)。 + * 保存用户名/密码。 + * 外观选项。 + * 支持本地和远程隧道。 + +在 Linux 桌面上安装 EasySSH 很简单,因为可以通过 flatpak 安装该应用程序(这意味着你必须在系统上安装 Flatpak )。 安装 flatpak 后,使用以下命令添加 EasySSH : + +``` +sudo flatpak remote-add --if-not-exists flathub https://flathub.org/repo/flathub.flatpakrepo + +sudo flatpak install flathub com.github.muriloventuroso.easyssh +``` + +使用以下命令运行 EasySSH : + +``` +flatpak run com.github.muriloventuroso.easyssh +``` + +你可以在其中单击左上角的 “+” 按钮打开 EasySSH 应用程序。 在出现的窗口(图 3)中,根据需要配置 SSH 连接。 + +![Adding a connection][10] + +*图 3:在 EasySSH 中添加连接很简单。* + +添加连接后,它将显示在主窗口的左侧导航中(图 4)。 + +![EasySSH][12] + +*图 4:EasySSH 主窗口。* + +要在 EasySSH 中连接到远程服务器,请从左侧导航中选择它,然后单击 “连接Connect” 按钮(图 5)。 + +![Connecting][14] + +*图 5:使用 EasySSH 连接到远程服务器。* + +EasySSH 的一个注意事项是你必须在连接配置中保存用户名和密码(否则连接将失败)。这意味着有权访问运行 EasySSH 的桌面的任何人都可以在不知道密码的情况下远程访问你的服务器。因此,你必须始终记得在外出时锁定桌面屏幕(并确保使用强密码)。你最不希望的就是避免服务器受到不必要的登录攻击。 + +### Terminator + +Terminator 实际上不是 SSH GUI。相反,Terminator 的功能是作为一个单一窗口,使你可以一次运行多个终端(甚至一组终端)。实际上,你可以打开 Terminator,将窗口垂直和水平拆分(直到拥有所需的所有终端),然后通过标准 SSH 命令连接到所有远程 Linux 服务器(图 6)。 + +![Terminator][16] + +*图 6:Terminator 分为三个不同的窗口,每个窗口都连接到不同的 Linux 服务器。* + +要安装 Terminator,请执行以下命令: + +``` +sudo apt-get install -y terminator +``` + +安装后,从桌面菜单或用命令 `terminator` 打开该工具。打开窗口后,你可以在 Terminator 内部右键单击,然后选择 “水平分割Split Horizontally” 或 “垂直分割Split Vertically”。继续拆分终端,直到你打开所需的终端为止,然后开始远程管理这些服务器。使用 Terminator 的注意事项是它不是标准的 SSH GUI 工具,因为它不会保存你的会话或使你可以快速访问这些服务器。换句话说,你将始终必须手动登录到远程 Linux 服务器。但是,能够并行查看远程 Secure Shell 会话确实使管理多个远程计算机变得容易得多。 + +### 少而精的选择 + +Linux 没有多少可用的 SSH GUI 工具。为什么呢?因为大多数管理员更喜欢简单地打开终端窗口,并使用标准命令行工具来远程访问服务器。但是,如果需要 GUI 工具,则有两个可靠的选择,和一个使登录多台计算机稍微容易一些的终端。尽管对于那些寻找 SSH GUI 工具的人来说只有少数选择,但是可用的那些肯定值得你花时间,根据需要尝试其中之一。 + +-------------------------------------------------------------------------------- + +via: https://www.linux.com/blog/learn/intro-to-linux/2018/11/three-ssh-guis-linux + +作者:[Jack Wallen][a] +选题:[lujun9972][b] +译者:[stevenzdg988](https://github.com/stevenzdg988) +校对:[wxy](https://github.com/wxy) + +本文由 [LCTT](https://github.com/LCTT/TranslateProject) 原创编译,[Linux中国](https://linux.cn/) 荣誉推出 + +[a]: https://www.linux.com/users/jlwallen +[b]: https://github.com/lujun9972 +[1]: https://elementary.io/ +[2]: https://www.chiark.greenend.org.uk/~sgtatham/putty/latest.html +[3]: https://lcom.static.linuxfound.org/sites/lcom/files/ssh_guis_1.jpg +[4]: https://lcom.static.linuxfound.org/sites/lcom/files/ssh_guis_1.jpg (PuTTY Connection) +[5]: https://www.linux.com/licenses/category/used-permission +[6]: https://lcom.static.linuxfound.org/sites/lcom/files/ssh_guis_2.jpg +[7]: https://lcom.static.linuxfound.org/sites/lcom/files/ssh_guis_2.jpg (log in) +[8]: https://github.com/muriloventuroso/easyssh +[9]: https://lcom.static.linuxfound.org/sites/lcom/files/ssh_guis_3.jpg +[10]: https://lcom.static.linuxfound.org/sites/lcom/files/ssh_guis_3.jpg (Adding a connection) +[11]: https://lcom.static.linuxfound.org/sites/lcom/files/ssh_guis_4.jpg +[12]: https://lcom.static.linuxfound.org/sites/lcom/files/ssh_guis_4.jpg (EasySSH) +[13]: https://lcom.static.linuxfound.org/sites/lcom/files/ssh_guis_5.jpg +[14]: https://lcom.static.linuxfound.org/sites/lcom/files/ssh_guis_5.jpg (Connecting) +[15]: https://lcom.static.linuxfound.org/sites/lcom/files/ssh_guis_6.jpg +[16]: https://lcom.static.linuxfound.org/sites/lcom/files/ssh_guis_6.jpg (Terminator) diff --git a/published/202101/20190104 Search, Study And Practice Linux Commands On The Fly.md b/published/202101/20190104 Search, Study And Practice Linux Commands On The Fly.md new file mode 100644 index 0000000000..f5eab0b5ac --- /dev/null +++ b/published/202101/20190104 Search, Study And Practice Linux Commands On The Fly.md @@ -0,0 +1,219 @@ +[#]: collector: (lujun9972) +[#]: translator: (qfzy1233) +[#]: reviewer: (wxy) +[#]: publisher: (wxy) +[#]: url: (https://linux.cn/article-13005-1.html) +[#]: subject: (Search, Study And Practice Linux Commands On The Fly!) +[#]: via: (https://www.ostechnix.com/search-study-and-practice-linux-commands-on-the-fly/) +[#]: author: (SK https://www.ostechnix.com/author/sk/) + +光速!搜索、学习和实践 Linux 命令!! +====== + +![](https://www.ostechnix.com/wp-content/uploads/2019/01/tldr-720x340.png) + +这一标题可能看起来很粗略且吸睛。请允许我解释一下我在本教程中将要阐释的内容。假设你想下载一个压缩文件,将其解压缩,并从命令行中将文件从一个位置移动到另一个位置。根据上面的场景,我们可能需要至少三个 Linux 命令,一个用于下载文件,一个用于提取下载的文件,一个用于移动文件。如果你是中高级 Linux 用户,你可以通过[一行命令][16]或脚本在几秒钟/分钟内轻松完成这一任务。但是,如果你是一个不懂得太多 Linux 命令的菜鸟你可能就需要一些帮助了。 + +当然,谷歌的快速搜索可能会找到很多结果。或者,你可以使用 [手册页][1]。但是有些手册页实在很长,很全面,但缺少有用的示例。当你在特定的标志/选项上寻找特定的信息时,你可能需要向下检索相当长的时间。值得庆幸的是,有一些 [好的手册页替代品][2],它们主要关注于实用的命令。一个很好的选择是 **TLDR 手册**。使用 TLDR 手册,我们可以通过实际示例快速轻松地学习一个 Linux 命令。要使用 TLDR 手册,我们需要 TLDR 客户端。有很多客户。今天我们就来了解一个这样的客户端,名为 **“Tldr++”**。 + +Tldr++ 是一个快速和交互式的 Tldr 客户端,用 **Go** 编程语言编写。与其他 Tldr 客户端不同,它是完全交互式的。这意味着,你可以选择一个命令,读取所有示例,并立即运行任何命令,而不必在终端中重新键入或复制/粘贴每个命令。还是不明白?没有问题。请继续阅读,以便动态学习和实践 Linux 命令。 + +### 安装 Tldr++ + +安装 Tldr++ 非常简单。从 [发布页面][3] 下载 Tldr++ 最新版本。解压它并将 Tldr++ 二进制文件移动到你的 `$PATH` 中。 + +``` +$ wget https://github.com/isacikgoz/tldr/releases/download/v0.5.0/tldr_0.5.0_linux_amd64.tar.gz +$ tar xzf tldr_0.5.0_linux_amd64.tar.gz +$ sudo mv tldr /usr/local/bin +$ sudo chmod +x /usr/local/bin/tldr +``` + +现在,运行 `tldr` 二进制代码将 TLDR 手册部署到本地系统中。 + +``` +$ tldr +``` + +示例输出: + +``` +Enumerating objects: 6, done. +Counting objects: 100% (6/6), done. +Compressing objects: 100% (6/6), done. +Total 18157 (delta 0), reused 3 (delta 0), pack-reused 18151 +Successfully cloned into: /home/sk/.local/share/tldr +``` + +![](https://www.ostechnix.com/wp-content/uploads/2019/01/tldr-2.png) + +Tldr++ 可以在 AUR 中使用。如果你使用 Arch Linux 上,你可以使用任何 AUR 助手来安装它,例如 [YaY][4]。确保你已经从系统中删除了任何现有的 TLDR 客户端,并运行以下命令安装 Tldr++。 + +``` +$ yay -S tldr++ +``` + +或者,你也可以像下面描述的那样从源代码进行编译。因为 Tldr++ 是用 Go 语言编写的,所以请确保你 Linux 系统中已经安装了 Go 语言。如果还没有安装,请参考下面的指南。 + +- [如何在 Linux 系统中安装 Go 语言](https://www.ostechnix.com/install-go-language-linux/) + +在安装好 Go 语言之后, 运行以下的命令来安装 Tldr++。 + +``` +$ go get -u github.com/isacikgoz/tldr +``` + +该命令在当前工作目录中下载 `tldr` 代码库中的内容并存储到 `go` 文件夹中。 + +现在,运行 `tldr` 二进制代码将 TLDR 手册部署到本地系统中。 + +``` +$ go/bin/tldr +``` + +示例输出: + +![][6] + +最后,将 `tldr` 二进制文件复制到你的路径中。 + +``` +$ sudo mv tldr /usr/local/bin +``` + +现在是时候看一些例子了。 + +### Tldr++ 用法 + +输入不带任何选项的 `tldr` 命令,以字母顺序显示所有命令示例。 + +![][7] + +使用 **向上/向下箭头** 来浏览命令,键入任何字母来搜索或键入命令名称来查看相应命令的示例。 `?` 以浏览更多消息,按 `Ctrl+c` 返回/退出。 + +要显示特定命令的示例命令,例如 `apt`,可以这样做: + +``` +$ tldr apt +``` + +![][8] + +从列表中选择任意示例命令并按回车键。在选定的命令前会看到一个 `*` 符号。例如,我选择第一个命令即 `sudo apt update`。现在,它会问你是否继续。如果命令正确,只需键入 `y` 继续,并输入 `sudo` 密码运行所选命令。 + +![][9] + +看到了吗?你不需要在终端中复制/粘贴或键入实际的命令。只需从列表中选择它,并极速运行! + +Tldr 手册中有数百个 Linux 命令示例。你可以每天选择一个或两个命令,并彻底学习它们。每天坚持这样的练习,尽可能多的掌握。 + +### 使用 Tldr++ 动态学习和实践 Linux 命令 + +现在回到我在第一段中提到的场景。你需要下载一个文件,将其解压缩并将其移动到不同的位置,并使其可执行。让我们看看如何使用 Tldr++ 客户端进行交互。 + +#### 第一步 – 从网上下载文件 + +要使用命令行下载文件,我们主要使用 `curl` 或 `wget` 命令。让我使用 `wget` 下载文件。要打开 `wget` 命令的 TLDR 页面,只需执行以下命令: + +``` +$ tldr wget +``` + +下面是 `wget` 命令的示例。 + +![](https://www.ostechnix.com/wp-content/uploads/2019/01/wget-tldr.png) + +你可以使用 **向上/向下箭头** 来浏览命令列表。一旦你选择了你所选择的命令,按回车键。这里我选择了第一个命令。 + +现在,输入路径来下载文件。 + +![](https://www.ostechnix.com/wp-content/uploads/2019/01/tldr-3.png) + +然后将要求你确认该命令是否正确。如果命令正确,只需键入 `yes` 或 `y` 就可以开始下载文件。 + +![][10] + +我们已经下载了文件。让我们继续解压这个文件。 + +#### 第二步 – 解压已下载的文件 + +我们下载了 tar.gz 文件。所以我将打开 TLDR 手册的 `tar` 页面。 + +``` +$ tldr tar +``` + +你将看到示例命令列表。浏览这些示例,找出哪个命令适合提取 tar.gz(gzip 格式)文件,按回车键。在我们的例子中,它是第三个命令。 + +![][11] + +现在,系统将提示你输入 tar.gz 文件的路径。只需输入路径并按回车键。Tldr++ 支持智能文件提示。这意味着它会在你键入时自动补全文件名。只需按 `TAB` 键自动完成。 + +![][12] + +如果将文件下载到其他位置,只需键入完整路径,例如 `/home/sk/Downloads/tldr_0.5.0_linux_amd64.tar.gz`。 + +输入要解压的文件的路径后,按回车键,然后输入 `y` 进行确认。 + +![][13] + +#### 第三步 – 将文件从一个目录移动到另一个目录 + +我们解压了文件。现在我们需要将文件移动到另一个位置。为了将文件从一个位置移动到另一个位置,我们使用 `mv` 命令。所以,让我们打开 TLDR 手册的 `mv` 命令。 + +``` +$ tldr mv +``` + +选择正确的命令将文件从一个位置移动到另一个位置。在我们的例子中,第一个命令可以工作,所以让我们选中它。 + +![][14] + +输入要移动的文件路径,并输入目标路径并按回车键。 + +![][15] + +**附注:** 输入 `y!` 或 `yes!` 来以 `sudo` 权限运行命令。 + +正如你在上面的截图中看到的,我将名为 ``tldr` 的文件移动到 `/usr/local/bin/`。 + +要了解更多细节,请参考项目最后给出的 GitHub 页面。 + + +### 总结 + +别误会,毫无疑问 **手册页** 是伟大的!但是,正如我已经说过的,许多手册页都很全面,缺少有用的示例。我不可能记住带有复杂标志的冗长的所有命令。有时,我花了很多时间在手册页上,却还是一窍不通。Tldr 手册帮助我在几分钟内找到了我需要的东西。而且,我们偶尔会使用一些命令,然后就会完全忘记它们。另一方面,Tldr 手册实际上在使用那些使用率很低的命令时很有帮助。Tldr++ 客户端通过智能的用户交互使这个任务变得更容易。试试吧,在下面的评论区告诉我们你对这个工具的看法。 + +以上,更多的好的分享将会陆续推出,请继续保持关注! + +祝好! + +-------------------------------------------------------------------------------- + +via: https://www.ostechnix.com/search-study-and-practice-linux-commands-on-the-fly/ + +作者:[SK][a] +选题:[lujun9972][b] +译者:[qfzy1233](https://github.com/qfzy1233) +校对:[wxy](https://github.com/wxy) + +本文由 [LCTT](https://github.com/LCTT/TranslateProject) 原创编译,[Linux中国](https://linux.cn/) 荣誉推出 + +[a]: https://www.ostechnix.com/author/sk/ +[b]: https://github.com/lujun9972 +[1]: https://www.ostechnix.com/learn-use-man-pages-efficiently/ +[2]: https://www.ostechnix.com/3-good-alternatives-man-pages-every-linux-user-know/ +[3]: https://github.com/isacikgoz/tldr/releases +[4]: https://www.ostechnix.com/yay-found-yet-another-reliable-aur-helper/ +[5]: data:image/gif;base64,R0lGODlhAQABAIAAAAAAAP///yH5BAEAAAAALAAAAAABAAEAAAIBRAA7 +[6]: http://www.ostechnix.com/wp-content/uploads/2019/01/tldr-1.png +[7]: http://www.ostechnix.com/wp-content/uploads/2019/01/tldr-11.png +[8]: http://www.ostechnix.com/wp-content/uploads/2019/01/tldr-12.png +[9]: http://www.ostechnix.com/wp-content/uploads/2019/01/tldr-13.png +[10]: http://www.ostechnix.com/wp-content/uploads/2019/01/tldr-4.png +[11]: http://www.ostechnix.com/wp-content/uploads/2019/01/tldr-6.png +[12]: http://www.ostechnix.com/wp-content/uploads/2019/01/tldr-7.png +[13]: http://www.ostechnix.com/wp-content/uploads/2019/01/tldr-8.png +[14]: http://www.ostechnix.com/wp-content/uploads/2019/01/tldr-9.png +[15]: http://www.ostechnix.com/wp-content/uploads/2019/01/tldr-10.png +[16]: https://ostechnix.com/random-one-liner-linux-commands-part-1/ \ No newline at end of file diff --git a/published/202101/20190204 Getting started with Git- Terminology 101.md b/published/202101/20190204 Getting started with Git- Terminology 101.md new file mode 100644 index 0000000000..42b3d0ba0f --- /dev/null +++ b/published/202101/20190204 Getting started with Git- Terminology 101.md @@ -0,0 +1,124 @@ +[#]: collector: (lujun9972) +[#]: translator: (wxy) +[#]: reviewer: (wxy) +[#]: publisher: (wxy) +[#]: url: (https://linux.cn/article-12994-1.html) +[#]: subject: (Getting started with Git: Terminology 101) +[#]: via: (https://opensource.com/article/19/2/git-terminology) +[#]: author: (Matthew Broberg https://opensource.com/users/mbbroberg) + +Git 入门:术语基础 +====== + +> 想学习 Git?看看这个最重要的术语和命令的快速总结。 + +![](https://img.linux.net.cn/data/attachment/album/202101/08/171156gu9l8dvulxmxom6d.jpg) + +如今,对于任何希望跟踪他们的变化的人来说,版本控制是一个重要的工具。它对程序员、系统管理员和网站可靠性工程师site reliability engineers(SRE)都特别有用。确保可以从错误中恢复到已知的良好状态是一个巨大的胜利,比以前给复制的文件添加 `.old` 后缀的策略更友好。 + +但学习 Git 这件事往往被告诉大家“投身开源”的好心同行们过度简化了。在你还不明白之前,就有人要你给一个从上游upstream 变基rebase拉取请求pull request(PR)或合并请求merge request(MR),然后他们才能从你的远程版本库remote合并 —— 而且一定会删除合并提交merge commits。无论你想给开源项目做出什么好的贡献,当你看到这些你不认识的单词时,都会觉得难以融入。 + +![Git 速查表封面图][2] + +- [下载][3] 我们的 Git 速查表。 + +如果你有一两个月的时间和足够的好奇心,[Git SCM][4] 是你需要学习所有术语的权威来源。但如果你正在寻找来自实践的总结,请继续阅读。 + +### 提交就是提醒 + +对我来说,Git 最难理解的部分是 Git 最简单的概念:一个提交commit就是一个内容的集合,包括一个关于描述的信息,以及之前的提交。没有固有的代码发布策略,甚至没有内置的明确建议。这个内容甚至不一定是代码 —— 可以是*任何*你想添加到版本库的东西。提交消息commit message会对这些内容进行注释。 + +我喜欢把提交信息看作是给未来的自己的礼物:它可能会提到你编辑的文件,但更重要的是它提醒你修改这些文件的意图。添加更多关于你为什么编辑这些内容的信息,可以帮助任何使用你的版本库的人,即使那个人是你。 + +### origin/master 在哪里? + +要知道自己在 Git 项目中的位置,首先把它想成一棵树。所有 Git 项目都有一个根目录,类似于文件系统的根目录。所有的提交都是这个根目录下的分支。这样一来,分支只是一个提交的指针。按照惯例,`master` 是根目录下默认的分支名称。(LCTT 译注:世界变得快,原文发表于 2019 年,而现在有些地方开始用 `main` 替代这个名字。) + +由于 Git 是一个分布式的版本控制系统,同一个代码库分布在多个地方,所以人们经常用版本库repository这个词来表示同一个项目的所有副本。(LCTT 译注:“repository” 英文原意是仓库、存储库,在计算机环境中,常用于版本控制、软件分发等方面,有时候会统一译作“仓库”、“存储库”。但我们认为,应该根据不同语境采用更有指向性的译法。在 Git 等版本控制语境中,采用“版本库”;在软件分发方面,采用“软件库”;其它泛指或不确定的语境中,可采用“仓库”、“存储库”译法。)有本地版本库local repository,这是你编辑代码的地方(稍后会有更多的介绍),还有远程版本库remote repository,这是你完成后想把代码发送到的地方。远程版本库可以在任何地方,甚至在你的本地版本库所在的同一台计算机上,但它们通常托管在 GitLab 或 GitHub 等版本库服务上。 + +### 我在哪里? + +虽然不是官方的卖点,但迷路也是 Git 仓库的“乐趣”之一。你可以通过这套可靠的命令来找到自己的方向: + + * `git branch` —— 找到你所在的分支。 + * `git log` —— 查看你正在进行的提交。 + * `git status` —— 查看自上次提交以来你所做的编辑。 + * `git remote` —— 查看你正在跟踪的远程仓库。 + +用这些命令来定位自己的方向,当你被卡住的时候,会让你有一种方向感。 + +### 我是否已将我的提交暂存或缓存起来? + +你电脑上的代码俗称为你的工作空间workspace。但不是很明显的是,当你在 Git 仓库中时,你还有两个(是的,两个!)其他位置:索引index暂存stash。当你写了一些内容,然后**添加**时,你是把它添加到索引中,也就是准备提交的缓存内容。有的时候,你的索引中的文件还没有准备好提交,但你想查看另一个分支。这时,暂存就派上用场了。你可以使用 `git stash` 将索引了但尚未提交的文件存储到暂存区中。当你准备好取回文件时,运行 `git stash pop` 将更改带回索引中。 + +下面是一些你需要使用暂存区和缓存区的命令: + + * `git diff ...origin/master` —— 显示最近的本地提交和远程的 `origin` 版本库的 `master` 分支之间的差异。 + * `git diff --cached` —— 显示最近的本地提交与添加到本地索引的内容之间的任何差异。 + * `git stash` —— 将索引的(已添加但未提交的)文件放在暂存区堆栈中。 + * `git stash list` —— 显示暂存区堆栈中的变化。 + * `git stash pop` —— 将最近的变化从暂存库中删除。 + +### 无头骑士 + +Git 里面有各种比喻。当我想到 `HEAD` 是哪里的时候,我就会想到火车线路。如果你最终处于脱离的 HEADdetached HEAD模式,就意味着你已经脱离了这个隐喻的轨道。 + +`HEAD` 是指向当前签出分支中最近一次提交的指针。默认的“签出checkout”是指当你创建一个 Git 仓库并进入到 `master` 分支的时候。每次创建或修改到另一个分支时,你都会切换到该分支行。如果你在当前分支的某处进行 `git checkout `,`HEAD` 就会移动到该提交。如果没有提交历史记录将你的当前提交连接到已签出的提交,那么你将处于脱离的 `HEAD` 状态。如果你找不到 `HEAD` 的位置,你可以随时用 `git reset --hard origin/master` 来删除修改,回到已知状态。*警告:这将删除你上次推送到 `master` 后的任何改动。* + +### 你是上游还是下游? + +你的项目的本地副本被认为是你的本地版本库,它可能有也可能没有远程版本库 —— 远程版本库的副本是用于协作或保存的。也可能还有一个上游upstream版本库,在那里,项目的第三个副本由不同的贡献者托管和维护。 + +例如,假设我想为 Kubernetes 做贡献。我会首先将 `kubernetes/kubernetes` 项目复刻fork到我的账户下 `mbbroberg/kubernetes`。然后我会将我的项目克隆到我的本地工作区。在这种情况下,我的本地克隆是我的本地仓库,`mbbroberg/kubernetes` 是我的远程仓库,`kubernetes/kubernetes` 是上游。 + +### 合并的隐喻 + +当你深入 Git 分支时,根系统的视觉效果就会和火车轨道的形象合二为一。分支通常被用作开发一个新功能的方式,最终你想把它合并merge到主分支中。当这样做时,Git 会按顺序保留共同的提交历史,然后将你的分支的新提交追加到历史中。这个过程有一大堆的细节:是否变基rebase,是否添加一个合并提交merge commit,[Brent Laster][5] 在《[如何在 Git 中重置、恢复和返回之前的状态][6]》中会有更详细的探讨。 + +### 我想现在就去 Git + +要掌握 Git 命令的世界,有大量的术语和需要探索的地方。我希望这篇关于日常使用术语的第一人称探索能帮助你适应这一切。如果你觉得自己被卡住了或者遇到了挫折,欢迎在 Twitter [@mbbroberg][7] 上联系我。 + +#### 回顾 + + * 提交Commit —— 将当前索引的内容保存在一个新的提交中,并附上用户描述更改的日志信息。 + * 分支Branch —— 指向一个提交的指针。 + * `master` —— 第一个分支的默认名称。 + * `HEAD` —— 指向当前分支上最近一次提交的指针。 + * 合并Merge —— 合并两个或多个提交的历史。 + * 工作空间Workspace —— Git 仓库本地副本的通俗名称。 + * 工作树Working tree —— 工作区中的当前分支;任何时候你都可以在 `git status` 的输出中看到这个。 + * 缓存Cache —— 用于临时存储未提交的变更的空间。 + * 索引Index —— 变更提交前存储其变化的缓存。 + * 跟踪和未跟踪的文件 —— 没有被索引缓存的文件或尚未加入其中的文件。 + * 暂存Stash —— 另一个缓存,作为一个堆栈,在这里可以存储更改而不需要提交它们。 + * `origin` —— 远程版本库的默认名称。 + * 本地仓库Local repository —— 也就是你在工作站上保存 Git 仓库副本的地方。 + * 远程存储库Remote repository —— Git 存储库的第二副本,你可以在这里推送变更以便协作或备份。 + * 上游存储库Upstream repository —— 你跟踪的远程存储库的通俗说法。 + * 拉取请求Pull request —— 这是 GitHub 的专用术语,用于让其他人知道你推送到仓库分支的变化。 + * 合并请求Merge request —— 这是 GitLab 的专用术语,用于让其他人知道你推送到仓库分支的变化。 + * `origin/master` —— 远程版本库及其主要分支的默认名称。 + +后记:双关语是 Git 最好的部分之一,愿你喜欢。 + +-------------------------------------------------------------------------------- + +via: https://opensource.com/article/19/2/git-terminology + +作者:[Matthew Broberg][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/mbbroberg +[b]: https://github.com/lujun9972 +[1]: https://opensource.com/sites/default/files/styles/image-full-size/public/lead-images/rh_003588_01_rd3os.combacktoschoolseriesk12_rh_021x_0.png?itok=fvorN0e- (Digital hand surrounding by objects, bike, light bulb, graphs) +[2]: https://opensource.com/sites/default/files/uploads/git_cheat_sheet_cover.jpg (Git Cheat Sheet cover image) +[3]: https://opensource.com/downloads/cheat-sheet-git +[4]: https://git-scm.com/about +[5]: https://opensource.com/users/bclaster +[6]: https://opensource.com/article/18/6/git-reset-revert-rebase-commands +[7]: https://twitter.com/mbbroberg diff --git a/published/202101/20190205 5 Streaming Audio Players for Linux.md b/published/202101/20190205 5 Streaming Audio Players for Linux.md new file mode 100644 index 0000000000..82babefc3c --- /dev/null +++ b/published/202101/20190205 5 Streaming Audio Players for Linux.md @@ -0,0 +1,134 @@ +[#]: collector: (lujun9972) +[#]: translator: (Chao-zhi) +[#]: reviewer: (wxy) +[#]: publisher: (wxy) +[#]: url: (https://linux.cn/article-13029-1.html) +[#]: subject: (5 Streaming Audio Players for Linux) +[#]: via: (https://www.linux.com/blog/2019/2/5-streaming-audio-players-linux) +[#]: author: (Jack Wallen https://www.linux.com/users/jlwallen) + +5 个适用于 Linux 的流式音频播放器 +====== + +![](https://img.linux.net.cn/data/attachment/album/202101/18/220035k8mmbl1blmkb97f8.jpg) + +当我工作的时候,我会一直在后台播放音乐。大多数情况下,这些音乐是以黑胶唱片的形式在转盘上旋转。但有时我不想用这种单纯的方法听音乐时,我会选择听流媒体音频应用程序的方式。然而,由于我工作在 Linux 平台上,所以我只可以使用在我的操作系统上运行良好的软件。幸运的是,对于想在 Linux 桌面听流式音频的人来说,有很多工具可以选择。 + +事实上,Linux 为音乐流媒体提供了许多可靠的产品,我将重点介绍我最喜欢的五种用于此任务的工具。警告一句,并不是所有的玩意都是开源的。但是如果你不介意在你的开源桌面上运行一个专有的应用程序,你有一些非常棒的选择。让我们来看看有什么可用的。 + +### Spotify + +Linux 版的 Spotify 不是那种在你启动就闪退的愚蠢的、半生不熟的应用程序,也没有阉割什么功能。事实上,Spotify 的 Linux 版本与其他平台上的版本完全相同。使用 Spotify 流媒体客户端,你可以收听音乐和播客、创建播放列表、发现新的艺术家等等。Spotify 界面(图 1)非常易于导航和使用。 + +![Spotify][2] + +*图 1:Spotify 界面可以很容易地找到新的音乐和旧的收藏。* + +你可以使用 snap(使用 `sudo snap install Spotify` 命令)安装 Spotify,也可以使用以下命令从官方存储库安装 Spotify: + +``` +sudo apt-key adv --keyserver hkp://keyserver.ubuntu.com:80 --recv-keys 931FF8E79F0876134EDDBDCCA87FF9DF48BF1C90 +sudo echo deb http://repository.spotify.com stable non-free | sudo tee /etc/apt/sources.list.d/spotify.list +sudo apt-get update +sudo apt-get install spotify-client +``` + +一旦安装,你就可以登录你的 Spotify 帐户,这样你就可以开始听好听的音乐,以帮助激励你完成你的工作。如果你已在其他设备上安装了 Spotify(并登录到同一帐户),则可以指定音乐应该流式传输到哪个设备(通过单击 Spotify 窗口右下角附近的“可用设备”图标)。 + +### Clementine + +Clementine 是 Linux 平台上最好的音乐播放器之一。Clementine 不仅允许用户播放本地存储的音乐,还可以连接到许多流媒体音频服务,例如: + + * Amazon Cloud Drive + * Box + * Dropbox + * Icecast + * Jamendo + * Magnatune + * RockRadio.com + * Radiotunes.com + * SomaFM + * SoundCloud + * Spotify + * Subsonic + * Vk.com + * 或其他有趣的电台 + +使用 Clementine 有两个注意事项。首先,你必须使用最新版本(因为某些软件库中可用的构建版本已过时,并且不会安装必要的流式处理插件)。第二,即使是最新的构建版本,一些流媒体服务也不会像预期的那样工作。例如,接入 Spotify 频道时,你只能使用最热门的曲目(而无法使用播放列表,或搜索歌曲的功能)。 + +使用 Clementine 互联网流媒体服务时,你会发现其中有很多你从来没有听说过的音乐家和乐队(图 2)。 + +![Clementine][5] + +*图 2:Clementine 互联网广播是寻找新音乐的好方法。* + +### Odio + +Odio 是一个跨平台的专有应用程序(可用于 Linux、MacOS 和 Windows),它允许你流式传输各种类型的互联网音乐站。广播的内容是取自 [www.radio-browser.info][6],而应用程序本身在为你呈现流方面做了令人难以置信的工作(图 3)。 + +![Odio][8] + +*图 3:Odio 接口是你能找到的最好的接口之一。* + +Odio 让你很容易找到独特的互联网广播电台,甚至可以把你找到并收藏的电台添加到你的库中。目前,在 Linux 上安装 Odio 的唯一方法是通过 Snap。如果你的发行版支持 snap 软件包,请使用以下命令安装此流应用程序: + +``` +sudo snap install odio +``` + +安装后,你可以打开应用程序并开始使用它。无需登录(或创建)帐户。Odio 的设置非常有限。实际上,它只提供了在设置窗口中选择暗色主题或亮色主题的选项。然而,尽管它可能功能有限,但 Odio 是在 Linux 上播放互联网广播的最佳选择之一。 + +### StreamTuner2 + +Streamtuner2 是一个优秀的互联网电台 GUI 工具。使用它,你可以流式播放以下音乐: + + * Internet radio stations + * Jameno + * MyOggRadio + * Shoutcast.com + * SurfMusic + * TuneIn + * Xiph.org + * YouTube + +Streamtuner2 提供了一个很好的界面(如果不是有点过时的话),可以很容易地找到和播放你喜爱的音乐。StreamTuner2 的一个警告是,它实际上只是一个用于查找你想要听到的流媒体的 GUI。当你找到一个站点时,双击它打开与流相关的应用程序。这意味着你必须安装必要的应用程序,才能播放流媒体。如果你没有合适的应用程序,你就不能播放流媒体。因此,你将花费大量的时间来确定要为某些流媒体安装哪些应用程序(图 4)。 + +![Streamtuner2][10] + +*图4:配置 Streamtuner2 需要一个坚强的心脏。* + +### VLC + +很长一段时间以来,VLC 一直被称为 Linux 最好的媒体播放工具。这是有充分理由的,因为几乎所有你丢给它的东西它都能播放。其中包括流媒体广播电台。虽然你无法让 VLC 连接到 Spotify 这样的网站,但你可以直接访问互联网广播,点击播放列表,而 VLC 毫无疑问可以打开它。考虑到目前有很多互联网广播电台,你在寻找适合自己口味的音乐方面不会有任何问题。VLC 还包括可视化工具、均衡器(图 5)等工具。 + +![VLC ][12] + +*图 5:VLC 可视化工具和均衡器特性。* + +VLC 唯一需要注意的是,你必须有一个你希望听到的互联网广播的 URL,因为这个工具本身并不能进行管理。但是有了这些链接,你就找不到比 VLC 更好的媒体播放器了。 + +### 这些工具软件怎么来的 + +如果这五个工具都不太不适合你的需要,我建议你打开你发行版的应用商店,搜索一个适合你的。有很多工具可以制作流媒体音乐、播客等等,不仅可以在 Linux 上实现,而且很简单。 + +-------------------------------------------------------------------------------- + +via: https://www.linux.com/blog/2019/2/5-streaming-audio-players-linux + +作者:[Jack Wallen][a] +选题:[lujun9972][b] +译者:[Chao-zhi](https://github.com/Chao-zhi) +校对:[wxy](https://github.com/wxy) + +本文由 [LCTT](https://github.com/LCTT/TranslateProject) 原创编译,[Linux中国](https://linux.cn/) 荣誉推出 + +[a]: https://www.linux.com/users/jlwallen +[b]: https://github.com/lujun9972 +[2]: https://lcom.static.linuxfound.org/sites/lcom/files/spotify_0.jpg?itok=8-Ym-R61 (Spotify) +[3]: https://www.linux.com/licenses/category/used-permission +[5]: https://lcom.static.linuxfound.org/sites/lcom/files/clementine_0.jpg?itok=5oODJO3b (Clementine) +[6]: http://www.radio-browser.info +[8]: https://lcom.static.linuxfound.org/sites/lcom/files/odio.jpg?itok=sNPTSS3c (Odio) +[10]: https://lcom.static.linuxfound.org/sites/lcom/files/streamtuner2.jpg?itok=1MSbafWj (Streamtuner2) +[12]: https://lcom.static.linuxfound.org/sites/lcom/files/vlc_0.jpg?itok=QEOsq7Ii (VLC ) +[13]: https://training.linuxfoundation.org/linux-courses/system-administration-training/introduction-to-linux diff --git a/published/202101/20190205 Install Apache, MySQL, PHP (LAMP) Stack On Ubuntu 18.04 LTS.md b/published/202101/20190205 Install Apache, MySQL, PHP (LAMP) Stack On Ubuntu 18.04 LTS.md new file mode 100644 index 0000000000..4f74e02e9e --- /dev/null +++ b/published/202101/20190205 Install Apache, MySQL, PHP (LAMP) Stack On Ubuntu 18.04 LTS.md @@ -0,0 +1,436 @@ +[#]: collector: (lujun9972) +[#]: translator: (stevenzdg988) +[#]: reviewer: (wxy) +[#]: publisher: (wxy) +[#]: url: (https://linux.cn/article-13041-1.html) +[#]: subject: (Install Apache, MySQL, PHP \(LAMP\) Stack On Ubuntu 18.04 LTS) +[#]: via: (https://www.ostechnix.com/install-apache-mysql-php-lamp-stack-on-ubuntu-18-04-lts/) +[#]: author: (SK https://www.ostechnix.com/author/sk/) + +在 Ubuntu 中安装 Apache、MySQL、PHP(LAMP)套件 +====== + +![](https://www.ostechnix.com/wp-content/uploads/2019/02/lamp-720x340.jpg) + +**LAMP** 套件是一种流行的开源 Web 开发平台,可用于运行和部署动态网站和基于 Web 的应用程序。通常,LAMP 套件由 Apache Web 服务器、MariaDB/MySQL 数据库、PHP/Python/Perl 程序设计(脚本)语言组成。 LAMP 是 **L**inux,**M**ariaDB/**M**YSQL,**P**HP/**P**ython/**P**erl 的缩写。 本教程描述了如何在 Ubuntu 18.04 LTS 服务器中安装 Apache、MySQL、PHP(LAMP 套件)。 + +就本教程而言,我们将使用以下 Ubuntu 测试。 + + * **操作系统**:Ubuntu 18.04.1 LTS Server Edition + * **IP 地址** :192.168.225.22/24 + +### 1. 安装 Apache Web 服务器 + +首先,利用下面命令更新 Ubuntu 服务器: + +``` +$ sudo apt update +$ sudo apt upgrade +``` + +然后,安装 Apache Web 服务器(命令如下): + +``` +$ sudo apt install apache2 +``` + +检查 Apache Web 服务器是否已经运行: + +``` +$ sudo systemctl status apache2 +``` + +输出结果大概是这样的: + +``` +● apache2.service - The Apache HTTP Server + Loaded: loaded (/lib/systemd/system/apache2.service; enabled; vendor preset: en + Drop-In: /lib/systemd/system/apache2.service.d + └─apache2-systemd.conf + Active: active (running) since Tue 2019-02-05 10:48:03 UTC; 1min 5s ago + Main PID: 2025 (apache2) + Tasks: 55 (limit: 2320) + CGroup: /system.slice/apache2.service + ├─2025 /usr/sbin/apache2 -k start + ├─2027 /usr/sbin/apache2 -k start + └─2028 /usr/sbin/apache2 -k start + +Feb 05 10:48:02 ubuntuserver systemd[1]: Starting The Apache HTTP Server... +Feb 05 10:48:03 ubuntuserver apachectl[2003]: AH00558: apache2: Could not reliably +Feb 05 10:48:03 ubuntuserver systemd[1]: Started The Apache HTTP Server. +``` + +祝贺你! Apache 服务已经启动并运行了!! + +#### 1.1 调整防火墙允许 Apache Web 服务器 + +默认情况下,如果你已在 Ubuntu 中启用 UFW 防火墙,则无法从远程系统访问 Apache Web 服务器。 必须按照以下步骤开启 `http` 和 `https` 端口。 + +首先,使用以下命令列出 Ubuntu 系统上可用的应用程序配置文件: + +``` +$ sudo ufw app list +``` + +输出结果: + +``` +Available applications: +Apache +Apache Full +Apache Secure +OpenSSH +``` + +如你所见,Apache 和 OpenSSH 应用程序已安装 UFW 配置文件。你可以使用 `ufw app info "Profile Name"` 命令列出有关每个配置文件及其包含的规则的信息。 + +让我们研究一下 “Apache Full” 配置文件。 为此,请运行: + +``` +$ sudo ufw app info "Apache Full" +``` + +输出结果: + +``` +Profile: Apache Full +Title: Web Server (HTTP,HTTPS) +Description: Apache v2 is the next generation of the omnipresent Apache web +server. + +Ports: +80,443/tcp +``` + +如你所见,“Apache Full” 配置文件包含了启用经由端口 **80** 和 **443** 的传输规则: + +现在,运行以下命令配置允许 HTTP 和 HTTPS 传入通信: + +``` +$ sudo ufw allow in "Apache Full" +Rules updated +Rules updated (v6) +``` + +如果你不想允许 HTTP 通信,而只允许 HTTP(80) 通信,请运行: + +``` +$ sudo ufw app info "Apache" +``` + +#### 1.2 测试 Apache Web 服务器 + +现在,打开 Web 浏览器并导航到 来访问 Apache 测试页。 + +![](https://www.ostechnix.com/wp-content/uploads/2016/06/apache-2.png) + +如果看到上面类似的显示内容,那就成功了。 Apache 服务器正在工作! + +### 2. 安装 MySQL + +在 Ubuntu 安装 MySQL 请运行: + +``` +$ sudo apt install mysql-server +``` + +使用以下命令验证 MySQL 服务是否正在运行: + +``` +$ sudo systemctl status mysql +``` + +输出结果: + +``` +● mysql.service - MySQL Community Server +Loaded: loaded (/lib/systemd/system/mysql.service; enabled; vendor preset: enab +Active: active (running) since Tue 2019-02-05 11:07:50 UTC; 17s ago +Main PID: 3423 (mysqld) +Tasks: 27 (limit: 2320) +CGroup: /system.slice/mysql.service +└─3423 /usr/sbin/mysqld --daemonize --pid-file=/run/mysqld/mysqld.pid + +Feb 05 11:07:49 ubuntuserver systemd[1]: Starting MySQL Community Server... +Feb 05 11:07:50 ubuntuserver systemd[1]: Started MySQL Community Server. +``` + +MySQL 正在运行! + +#### 2.1 配置数据库管理用户(root)密码 + +默认情况下,MySQL root 用户密码为空。你需要通过运行以下脚本使你的 MySQL 服务器安全: + +``` +$ sudo mysql_secure_installation +``` + +系统将询问你是否要安装 “VALIDATE PASSWORD plugin(密码验证插件)”。该插件允许用户为数据库配置强密码凭据。如果启用,它将自动检查密码的强度并强制用户设置足够安全的密码。**禁用此插件是安全的**。但是,必须为数据库使用唯一的强密码凭据。如果不想启用此插件,只需按任意键即可跳过密码验证部分,然后继续其余步骤。 + +如果回答是 `y`,则会要求你选择密码验证级别。 + +``` +Securing the MySQL server deployment. + +Connecting to MySQL using a blank password. + +VALIDATE PASSWORD PLUGIN can be used to test passwords +and improve security. It checks the strength of password +and allows the users to set only those passwords which are +secure enough. Would you like to setup VALIDATE PASSWORD plugin? + +Press y|Y for Yes, any other key for No y +``` + +可用的密码验证有 “low(低)”、 “medium(中)” 和 “strong(强)”。只需输入适当的数字(0 表示低,1 表示中,2 表示强密码)并按回车键。 + +``` +There are three levels of password validation policy: + +LOW Length >= 8 +MEDIUM Length >= 8, numeric, mixed case, and special characters +STRONG Length >= 8, numeric, mixed case, special characters and dictionary file + +Please enter 0 = LOW, 1 = MEDIUM and 2 = STRONG: +``` + +现在,输入 MySQL root 用户的密码。请注意,必须根据上一步中选择的密码策略,为 MySQL root 用户使用密码。如果你未启用该插件,则只需使用你选择的任意强度且唯一的密码即可。 + +``` +Please set the password for root here. + +New password: + +Re-enter new password: + +Estimated strength of the password: 50 +Do you wish to continue with the password provided?(Press y|Y for Yes, any other key for No) : y +``` + +两次输入密码后,你将看到密码强度(在此示例情况下为 50)。如果你确定可以,请按 `y` 继续提供的密码。如果对密码长度不满意,请按其他任意键并设置一个强密码。我现在的密码可以,所以我选择了`y`。 + +对于其余的问题,只需键入 `y` 并按回车键。这将删除匿名用户、禁止 root 用户远程登录并删除 `test`(测试)数据库。 + +``` +Remove anonymous users? (Press y|Y for Yes, any other key for No) : y +Success. + +Normally, root should only be allowed to connect from +'localhost'. This ensures that someone cannot guess at +the root password from the network. + +Disallow root login remotely? (Press y|Y for Yes, any other key for No) : y +Success. + +By default, MySQL comes with a database named 'test' that +anyone can access. This is also intended only for testing, +and should be removed before moving into a production +environment. + +Remove test database and access to it? (Press y|Y for Yes, any other key for No) : y +- Dropping test database... +Success. + +- Removing privileges on test database... +Success. + +Reloading the privilege tables will ensure that all changes +made so far will take effect immediately. + +Reload privilege tables now? (Press y|Y for Yes, any other key for No) : y +Success. + +All done! +``` + +以上就是为 MySQL root 用户设置密码。 + +#### 2.2 更改 MySQL 超级用户的身份验证方法 + +默认情况下,Ubuntu 系统的 MySQL root 用户为 MySQL 5.7 版本及更新的版本使用插件 `auth_socket` 设置身份验证。尽管它增强了安全性,但是当你使用任何外部程序(例如 phpMyAdmin)访问数据库服务器时,也会变得更困难。要解决此问题,你需要将身份验证方法从 `auth_socket` 更改为 `mysql_native_password`。为此,请使用以下命令登录到你的 MySQL 提示符下: + +``` +$ sudo mysql +``` + +在 MySQL 提示符下运行以下命令,找到所有 MySQL 当前用户帐户的身份验证方法: + +``` +SELECT user,authentication_string,plugin,host FROM mysql.user; +``` + +输出结果: + +``` ++------------------|-------------------------------------------|-----------------------|-----------+ +| user | authentication_string | plugin | host | ++------------------|-------------------------------------------|-----------------------|-----------+ +| root | | auth_socket | localhost | +| mysql.session | *THISISNOTAVALIDPASSWORDTHATCANBEUSEDHERE | mysql_native_password | localhost | +| mysql.sys | *THISISNOTAVALIDPASSWORDTHATCANBEUSEDHERE | mysql_native_password | localhost | +| debian-sys-maint | *F126737722832701DD3979741508F05FA71E5BA0 | mysql_native_password | localhost | ++------------------|-------------------------------------------|-----------------------|-----------+ +4 rows in set (0.00 sec) +``` + +![][2] + +如你所见,Mysql root 用户使用 `auth_socket` 插件进行身份验证。 + +要将此身份验证更改为 `mysql_native_password` 方法,请在 MySQL 提示符下运行以下命令。 别忘了用你选择的强大唯一的密码替换 `password`。 如果已启用 VALIDATION 插件,请确保已根据当前策略要求使用了强密码。 + +``` +ALTER USER 'root'@'localhost' IDENTIFIED WITH mysql_native_password BY 'password'; +``` + +使用以下命令更新数据库: + +``` +FLUSH PRIVILEGES; +``` + +使用命令再次检查身份验证方法是否已更改: + +``` +SELECT user,authentication_string,plugin,host FROM mysql.user; +``` + +输出结果: + +![][3] + +好!MySQL root 用户就可以使用密码进行身份验证来访问 `mysql shell`。 + +从 MySQL 提示符下退出: + +``` +exit +``` + +### 3. 安装 PHP + +安装 PHP 请运行: + +``` +$ sudo apt install php libapache2-mod-php php-mysql +``` + +安装 PHP 后,在 Apache 文档根目录中创建 `info.php` 文件。通常,在大多数基于 Debian 的 Linux 发行版中,Apache 文档根目录为 `/var/www/html/` 或 `/var/www/`。Ubuntu 18.04 LTS 系统下,文档根目录是 `/var/www/html/`。 + +在 Apache 根目录中创建 `info.php` 文件: + +``` +$ sudo vi /var/www/html/info.php +``` + +在此文件中编辑如下内容: + +``` + +``` + +然后按下 `ESC` 键并且输入 `:wq` 保存并退出此文件。重新启动 Apache 服务使更改生效。 + +``` +$ sudo systemctl restart apache2 +``` + +#### 3.1 测试 PHP + +打开 Web 浏览器,然后导航到 URL 。 + +你就将看到 PHP 测试页面。 + +![](https://www.ostechnix.com/wp-content/uploads/2019/02/php-test-page.png) + +通常,当用户向 Web 服务器发出请求时,Apache 首先会在文档根目录中查找名为 `index.html` 的文件。如果你想将 Apache 更改为 `php` 文件提供服务而不是其他文件,请将 `dir.conf` 配置文件中的 `index.php` 移至第一个位置,如下所示: + +``` +$ sudo vi /etc/apache2/mods-enabled/dir.conf +``` + +上面的配置文件(`dir.conf`) 内容如下: + +``` + +DirectoryIndex index.html index.cgi index.pl index.php index.xhtml index.htm + + +# vim: syntax=apache ts=4 sw=4 sts=4 sr noet +``` + +将 `index.php` 移动到最前面。更改后,`dir.conf` 文件内容看起来如下所示。 + +``` + +DirectoryIndex index.php index.html index.cgi index.pl index.xhtml index.htm + + +# vim: syntax=apache ts=4 sw=4 sts=4 sr noet +``` + +然后按下 `ESC` 键并且输入 `:wq` 保存并关闭此文件。重新启动 Apache 服务使更改生效。 + +``` +$ sudo systemctl restart apache2 +``` + +#### 3.2 安装 PHP 模块 + +为了增加 PHP 的功能,可以安装一些其他的 PHP 模块。 + +要列出可用的 PHP 模块,请运行: + +``` +$ sudo apt-cache search php- | less +``` + +输出结果: + +![][4] + +使用方向键浏览结果。要退出,请输入 `q` 并按下回车键。 + +要查找任意 `php` 模块的详细信息,例如 `php-gd`,请运行: + +``` +$ sudo apt-cache show php-gd +``` + +安装 PHP 模块请运行: + +``` +$ sudo apt install php-gd +``` + +安装所有的模块(虽然没有必要),请运行: + +``` +$ sudo apt-get install php* +``` + +安装任何 `php` 模块后,请不要忘记重新启动 Apache 服务。要检查模块是否已加载,请在浏览器中打开 `info.php` 文件并检查是否存在。 + +接下来,你可能需要安装数据库管理工具,以通过 Web 浏览器轻松管理数据库。如果是这样,请按照以下链接中的说明安装 `phpMyAdmin`。 + +祝贺你!我们已经在 Ubuntu 服务器中成功配置了 LAMP 套件。 + +-------------------------------------------------------------------------------- + +via: https://www.ostechnix.com/install-apache-mysql-php-lamp-stack-on-ubuntu-18-04-lts/ + +作者:[SK][a] +选题:[lujun9972][b] +译者:[stevenzdg988](https://github.com/stevenzdg988) +校对:[wxy](https://github.com/wxy) + +本文由 [LCTT](https://github.com/LCTT/TranslateProject) 原创编译,[Linux中国](https://linux.cn/) 荣誉推出 + +[a]: https://www.ostechnix.com/author/sk/ +[b]: https://github.com/lujun9972 +[1]: data:image/gif;base64,R0lGODlhAQABAIAAAAAAAP///yH5BAEAAAAALAAAAAABAAEAAAIBRAA7 +[2]: http://www.ostechnix.com/wp-content/uploads/2019/02/mysql-1.png +[3]: http://www.ostechnix.com/wp-content/uploads/2019/02/mysql-2.png +[4]: http://www.ostechnix.com/wp-content/uploads/2016/06/php-modules.png diff --git a/published/202101/20190215 Make websites more readable with a shell script.md b/published/202101/20190215 Make websites more readable with a shell script.md new file mode 100644 index 0000000000..a84cdfaa40 --- /dev/null +++ b/published/202101/20190215 Make websites more readable with a shell script.md @@ -0,0 +1,261 @@ +[#]: collector: (lujun9972) +[#]: translator: (stevenzdg988) +[#]: reviewer: (wxy) +[#]: publisher: (wxy) +[#]: url: (https://linux.cn/article-13052-1.html) +[#]: subject: (Make websites more readable with a shell script) +[#]: via: (https://opensource.com/article/19/2/make-websites-more-readable-shell-script) +[#]: author: (Jim Hall https://opensource.com/users/jim-hall) + +利用 Shell 脚本让网站更具可读性 +====== + +> 测算网站的文本和背景之间的对比度,以确保站点易于阅读。 + +![](https://img.linux.net.cn/data/attachment/album/202101/25/231152ce5ufhjtufxj1eeu.jpg) + +如果希望人们发现你的网站实用,那么他们需要能够阅读它。为文本选择的颜色可能会影响网站的可读性。不幸的是,网页设计中的一种流行趋势是在打印输出文本时使用低对比度的颜色,就像在白色背景上的灰色文本。对于 Web 设计师来说,这也许看起来很酷,但对于许多阅读它的人来说确实很困难。 + +W3C 提供了《Web 内容可访问性指南Web Content Accessibility Guidelines》,其中包括帮助 Web 设计人员选择易于区分文本和背景色的指导。z这就是所谓的“对比度contrast ratio”。 W3C 定义的对比度需要进行一些计算:给定两种颜色,首先计算每种颜色的相对亮度,然后计算对比度。对比度在 1 到 21 的范围内(通常写为 1:1 到 21:1)。对比度越高,文本在背景下的突出程度就越高。例如,白色背景上的黑色文本非常醒目,对比度为 21:1。对比度为 1:1 的白色背景上的白色文本不可读。 + +[W3C 说,正文][1] 的对比度至少应为 4.5:1,标题至少应为 3:1。但这似乎是最低限度的要求。W3C 还建议正文至少 7:1,标题至少 4.5:1。 + +计算对比度可能比较麻烦,因此最好将其自动化。我已经用这个方便的 Bash 脚本做到了这一点。通常,脚本执行以下操作: + + 1. 获取文本颜色和背景颜色 + 2. 计算相对亮度 + 3. 计算对比度 + +### 获取颜色 + +你可能知道显示器上的每种颜色都可以用红色、绿色和蓝色(R、G 和 B)来表示。要计算颜色的相对亮度,脚本需要知道颜色的红、绿和蓝的各个分量。理想情况下,脚本会将这些信息读取为单独的 R、G 和 B 值。 Web 设计人员可能知道他们喜欢的颜色的特定 RGB 代码,但是大多数人不知道不同颜色的 RGB 值。作为一种替代的方法是,大多数人通过 “red” 或 “gold” 或 “maroon” 之类的名称来引用颜色。 + +幸运的是,GNOME 的 [Zenity][2] 工具有一个颜色选择器应用程序,可让你使用不同的方法选择颜色,然后用可预测的格式 `rgb(R,G,B)` 返回 RGB 值。使用 Zenity 可以轻松获得颜色值: + +``` +color=$( zenity --title 'Set text color' --color-selection --color='black' ) +``` + +如果用户(意外地)单击 “Cancel(取消)” 按钮,脚本将假定一种颜色: + +``` +if [ $? -ne 0 ] ; then +        echo '** color canceled .. assume black' +        color='rgb(0,0,0)' +fi +``` + +脚本对背景颜色值也执行了类似的操作,将其设置为 `$background`。 + +### 计算相对亮度 + +一旦你在 `$color` 中设置了前景色,并在 `$background` 中设置了背景色,下一步就是计算每种颜色的相对亮度。 [W3C 提供了一个算法][3] 用以计算颜色的相对亮度。 + +> 对于 sRGB 色彩空间,一种颜色的相对亮度定义为: +> +> L = 0.2126 * R + 0.7152 * G + 0.0722 * B +> +> R、G 和 B 定义为: +> +> if $R_{sRGB}$ <= 0.03928 then R = $R_{sRGB}$/12.92 +> +> else R = (($R_{sRGB}$+0.055)/1.055) $^{2.4}$ +> +> if $G_{sRGB}$ <= 0.03928 then G = $G_{sRGB}$/12.92 +> +> else G = (($G_{sRGB}$+0.055)/1.055) $^{2.4}$ +> +> if $B_{sRGB}$ <= 0.03928 then B = $B_{sRGB}$/12.92 +> +> else B = (($B_{sRGB}$+0.055)/1.055) $^{2.4}$ +> +> $R_{sRGB}$、$G_{sRGB}$ 和 $B_{sRGB}$ 定义为: +> +> $R_{sRGB}$ = $R_{8bit}$/255 +> +> $G_{sRGB}$ = $G_{8bit}$/255 +> +> $B_{sRGB}$ = $B_{8bit}$/255 + +由于 Zenity 以 `rgb(R,G,B)` 的格式返回颜色值,因此脚本可以轻松拉取分隔开的 R、B 和 G 的值以计算相对亮度。AWK 可以使用逗号作为字段分隔符(`-F,`),并使用 `substr()` 字符串函数从 `rgb(R,G,B)` 中提取所要的颜色值: + +``` +R=$( echo $color | awk -F, '{print substr($1,5)}' ) +G=$( echo $color | awk -F, '{print $2}' ) +B=$( echo $color | awk -F, '{n=length($3); print substr($3,1,n-1)}' ) +``` + +*有关使用 AWK 提取和显示数据的更多信息,[查看 AWK 备忘表][4]* + +最好使用 BC 计算器来计算最终的相对亮度。BC 支持计算中所需的简单 `if-then-else`,这使得这一过程变得简单。但是由于 BC 无法使用非整数指数直接计算乘幂,因此需要使用自然对数替代它做一些额外的数学运算: + +``` +echo "scale=4 +rsrgb=$R/255 +gsrgb=$G/255 +bsrgb=$B/255 +if ( rsrgb <= 0.03928 ) r = rsrgb/12.92 else r = e( 2.4 * l((rsrgb+0.055)/1.055) ) +if ( gsrgb <= 0.03928 ) g = gsrgb/12.92 else g = e( 2.4 * l((gsrgb+0.055)/1.055) ) +if ( bsrgb <= 0.03928 ) b = bsrgb/12.92 else b = e( 2.4 * l((bsrgb+0.055)/1.055) ) +0.2126 * r + 0.7152 * g + 0.0722 * b" | bc -l +``` + +这会将一些指令传递给 BC,包括作为相对亮度公式一部分的 `if-then-else` 语句。接下来 BC 打印出最终值。 + +### 计算对比度 + +利用文本颜色和背景颜色的相对亮度,脚本就可以计算对比度了。 [W3C 确定对比度][5] 是使用以下公式: + +> (L1 + 0.05) / (L2 + 0.05),这里的 +> L1 是颜色较浅的相对亮度, +> L2 是颜色较深的相对亮度。 + +给定两个相对亮度值 `$r1` 和 `$r2`,使用 BC 计算器很容易计算对比度: + +``` +echo "scale=2 +if ( $r1 > $r2 ) { l1=$r1; l2=$r2 } else { l1=$r2; l2=$r1 } +(l1 + 0.05) / (l2 + 0.05)" | bc +``` + +使用 `if-then-else` 语句确定哪个值(`$r1` 或 `$r2`)是较浅还是较深的颜色。BC 执行结果计算并打印结果,脚本可以将其存储在变量中。 + +### 最终脚本 + +通过以上内容,我们可以将所有内容整合到一个最终脚本。 我使用 Zenity 在文本框中显示最终结果: + +``` +#!/bin/sh +# script to calculate contrast ratio of colors + +# read color and background color: +# zenity returns values like 'rgb(255,140,0)' and 'rgb(255,255,255)' + +color=$( zenity --title 'Set text color' --color-selection --color='black' ) +if [ $? -ne 0 ] ; then + echo '** color canceled .. assume black' + color='rgb(0,0,0)' +fi + +background=$( zenity --title 'Set background color' --color-selection --color='white' ) +if [ $? -ne 0 ] ; then + echo '** background canceled .. assume white' + background='rgb(255,255,255)' +fi + +# compute relative luminance: + +function luminance() +{ + R=$( echo $1 | awk -F, '{print substr($1,5)}' ) + G=$( echo $1 | awk -F, '{print $2}' ) + B=$( echo $1 | awk -F, '{n=length($3); print substr($3,1,n-1)}' ) + + echo "scale=4 +rsrgb=$R/255 +gsrgb=$G/255 +bsrgb=$B/255 +if ( rsrgb <= 0.03928 ) r = rsrgb/12.92 else r = e( 2.4 * l((rsrgb+0.055)/1.055) ) +if ( gsrgb <= 0.03928 ) g = gsrgb/12.92 else g = e( 2.4 * l((gsrgb+0.055)/1.055) ) +if ( bsrgb <= 0.03928 ) b = bsrgb/12.92 else b = e( 2.4 * l((bsrgb+0.055)/1.055) ) +0.2126 * r + 0.7152 * g + 0.0722 * b" | bc -l +} + +lum1=$( luminance $color ) +lum2=$( luminance $background ) + +# compute contrast + +function contrast() +{ + echo "scale=2 +if ( $1 > $2 ) { l1=$1; l2=$2 } else { l1=$2; l2=$1 } +(l1 + 0.05) / (l2 + 0.05)" | bc +} + +rel=$( contrast $lum1 $lum2 ) + +# print results + +( cat< 容器构建有两大趋势:使用基本镜像和从头开始构建。每个都有工程上的权衡。 + +![](https://img.linux.net.cn/data/attachment/album/202101/16/223919aubhguedlt8sk8i8.jpg) + +有人说 Linux 发行版不再与容器有关。像 distroless 和 scratch 容器等可替代的方法,似乎是风靡一时。看来,我们在考虑和做出技术决策时,更多的是基于时尚感和即时的情感满足,而不是考虑我们选择的次要影响。我们应该问这样的问题:这些选择将如何影响未来六个月的维护?工程权衡是什么?这种范式转换如何影响我们的大规模构建系统? + +这真让人沮丧。如果我们忘记了工程是一个零和游戏,有可衡量的利弊权衡,有不同方法的成本和收益 —— 这样对我们自己不利,对雇主不利,对最终维护我们的代码的同事不利。最后,我们对所有的维护人员([向维护人员致敬!][1] )都是一种伤害,因为我们不欣赏他们所做的工作。 + +### 理解问题所在 + +为了理解这个问题,我们必须首先研究为什么我们使用 Linux 发行版。我将把原因分为两大类:内核和其他包。编译内核实际上相当容易。Slackware 和 Gentoo( 我的小心脏还是有点害怕)教会了我们这一点。 + +另一方面,对于一个可用的 Linux 系统需要打包大量的开发软件和应用软件,这可能会让人望而生畏。此外,确保数百万个程序包可以一起安装和工作的唯一方法是使用旧的范例:即编译它并将它作为一个工件(即 Linux 发行版)一起发布。那么,为什么 Linux 发行版要将内核和所有包一起编译呢?很简单:确保事情协调一致。 + +首先,我们来谈谈内核。内核很特别。在没有编译好的内核的情况下引导 Linux 系统有点困难。它是 Linux 操作系统的核心,也是我们在系统启动时首先依赖的。内核在编译时有很多不同的配置选项,这些选项会对硬件和软件如何在一个内核上运行产生巨大影响。这方面中的第二个问题是,系统软件(如编译器 、C 库和解释器)必须针对内核中内置的选项进行调优。Gentoo 的维基以一种发自内心的方式教我们这一点,它把每个人都变成了一个微型的开发版维护者。 + +令人尴尬的是(因为我在过去五年里一直在使用容器),我必须承认我最近才编译过内核。我必须让嵌套的 KVM 在 RHEL7 上工作,这样我才能在笔记本电脑上的 KVM 虚拟机中运行 [OpenShift on OpenStack][2] 虚拟机,以及我的 [Container Development Kit(CDK)][3]。我只想说,当时我在一个全新的 4.X 内核上启动了 RHEL7。和任何优秀的系统管理员一样,我有点担心自己错过了一些重要的配置选项和补丁。当然,我也的确错过了一些东西。比如睡眠模式无法正常工作,我的扩展底座无法正常工作,还有许多其他小的随机错误。但它在我的笔记本电脑上的一个 KVM 虚拟机上,对于 OpenStack 上的 OpenShift 的实时演示来说已经足够好了。来吧,这很有趣,对吧?但我离题了…… + +现在,我们来谈谈其他的软件包。虽然内核和相关的系统软件可能很难编译,但从工作负载的角度来看,更大的问题是编译成千上万的包,以提供一个可用的 Linux 系统。每个软件包都需要专业知识。有些软件只需要运行三个命令:`./configure`、`make` 和 `make install`。另一些则需要大量的专业知识,从在 `etc` 中添加用户和配置特定的默认值到运行安装后脚本和添加 systemd 单元文件。对于任何一个人来说,调试好你可能用得到的成千上万种不同软件所需要的一套技能都是令人望而生畏的。但是,如果你想要一个可以随时尝试新软件的可用系统,你必须学会如何编译和安装新软件,然后才能开始学习使用它。这就是没有 Linux 发行版的 Linux。当你放弃使用 Linux 发行版时,那么你就得自己编译软件。 + +关键是,你必须将所有内容构建在一起,以确保它能够以任何合理的可靠性级别协同工作,而且构建一个可用的包群需要大量的知识。这是任何一个开发人员或系统管理员都无法合理地学习和保留的知识。我描述的每个问题都适用于你的 [容器主机][4](内核和系统软件)和 [容器镜像][5](系统软件和所有其他包)——请注意:在容器镜像中还包含有编译器 、C 库、解释器和 JVM。 + +### 解决方案 + +所以你也看到了,其实使用 Linux 发行版就是解决方案。别再看了,给离你最近的软件包维护者(再次向维护人员致敬!)发张电子卡吧(等等,我是不是把我的年龄告诉别人了?)。不过说真的,这些人做了大量的工作,这真的是被低估了。Kubernetes、Istio、Prometheus,还有 Knative:我在看着你们。你们的时代要来了,到时候你们会进入维护模式,被过度使用,被低估。大约七到十年后,我将再次写这篇文章,可能是关于 Kubernetes 的。 + +### 容器构建的首要原则 + +从零开始构建和从基础镜像构建之间存在权衡。 + +#### 从基础镜像构建 + +从基础镜像构建的优点是,大多数构建操作只不过是安装或更新包。它依赖于 Linux 发行版中包维护人员所做的大量工作。它还有一个优点,即六个月甚至十年后的修补事件(使用 RHEL)是运维/系统管理员事件 (`yum update`),而不是开发人员事件(这需要通过代码找出某些函数参数不再工作的原因)。 + +你想想,应用程序代码依赖于许多库,从 JSON mung 库到对象关系映射器。与 Linux 内核和 Glibc 不同,这些类型的库很少改变 API 兼容性。这意味着三年后你的修补事件可能会变成代码更改事件,而不是 yum 更新事件。因此让他自己深入下去吧。开发人员,如果安全团队找不到防火墙黑客来阻止攻击,你将在凌晨 2 点收到短信。 + +从基础镜像构建不是完美的;还有一些缺点,比如所有被拖入的依赖项的大小。这几乎总是会使容器镜像比从头开始构建的镜像更大。另一个缺点是你并不总是能够访问最新的上游代码。这可能会让开发人员感到沮丧,尤其是当你只想使用依赖项中的一部分功能时,但是你仍然不得不将你根本用不着的东西一起打包带走,因为上游的维护人员一直在改变这个库。 + +如果你是一个 web 开发人员,正在对我翻白眼,我有一个词可以形容你:DevOps。那意味着你带着寻呼机,我的朋友。 + +#### Scratch 构建 + +Scratch 构建的优点是镜像非常小。当你不依赖容器中的 Linux 发行版时,你有很多控制权,这意味着你可以根据需要定制所有内容。这是一个最佳模型,在某些用例中是很有效的。另一个优势是你可以访问最新的软件包。你不必等待 Linux 发行版更新任何内容。是你自己在控制,所以你可以自行选择什么时候去费功夫纳入新的软件。 + +记住,控制一切都是有代价的。通常,更新到具有新特性的新库会拖如不必要的 API 更改,这意味着修复代码中的不兼容(换句话说,这就像[给牦牛剪毛][6])。在凌晨 2 点应用程序不起作用的时候给牦牛剪毛是不好玩的。幸运的是,使用容器,你可以在下一个工作日回滚并给牦牛剪毛,但它仍会占用你为业务提供新价值、为应用程序提供新功能的时间。欢迎来到系统管理员的生活。 + +好吧,也就是说,有些时候,Scratch 构建是有意义的。我完全承认,静态编译的 Golang 程序和 C 程序是 scratch/distorless 构建的两个不错的候选程序。对于这些类型的程序,每个容器构建都是一个编译事件。三年后你仍然需要担心 API 的损坏,但是如果你是一个 Golang 商店,你应该有能力随着时间的推移修复问题。 + +### 结论 + +基本上,Linux 发行版做了大量工作来节省你在常规 Linux 系统或容器上的时间。维护人员所拥有的知识是巨大的,而且没有得到真正的赞赏。容器的采用使得问题更加严重,因为它被进一步抽象了。 + +通过容器主机,Linux 发行版可以让你访问广泛的硬件生态系统,从微型 ARM 系统到 128 核 CPU x86 巨型机箱,再到云服务商的虚拟机。他们提供可工作的容器引擎和开箱即用的容器运行时环境,所以你只需启动你的容器,让其他人担心事情的进展。 + +对于容器镜像,Linux 发行版为你的项目提供了对大量软件的轻松访问。即使你从头开始构建,你也可能会看到一个包维护人员是如何构建和运送东西的 —— 一个好的艺术家是一个好的偷学者,所以不要低估这项工作的价值。 + +所以,感谢 Fedora、RHEL(Frantisek,你是我的英雄 )、Debian、Gentoo 和其他 Linux 发行版的所有维护人员。我很感激你所做的工作,尽管我是个“容器工人” + +-------------------------------------------------------------------------------- + +via: https://opensource.com/article/19/2/linux-distributions-still-matter-containers + +作者:[Scott McCarty][a] +选题:[lujun9972][b] +译者:[Chao-zhi](https://github.com/Chao-zhi) +校对:[wxy](https://github.com/wxy) + +本文由 [LCTT](https://github.com/LCTT/TranslateProject) 原创编译,[Linux中国](https://linux.cn/) 荣誉推出 + +[a]: https://opensource.com/users/fatherlinux +[b]: https://github.com/lujun9972 +[1]: https://aeon.co/essays/innovation-is-overvalued-maintenance-often-matters-more +[2]: https://blog.openshift.com/openshift-on-openstack-delivering-applications-better-together/ +[3]: https://developers.redhat.com/blog/2018/02/13/red-hat-cdk-nested-kvm/ +[4]: https://developers.redhat.com/blog/2018/02/22/container-terminology-practical-introduction/#h.8tyd9p17othl +[5]: https://developers.redhat.com/blog/2018/02/22/container-terminology-practical-introduction/#h.dqlu6589ootw +[6]: https://en.wiktionary.org/wiki/yak_shaving diff --git a/published/202101/20190322 Printing from the Linux command line.md b/published/202101/20190322 Printing from the Linux command line.md new file mode 100644 index 0000000000..a497906293 --- /dev/null +++ b/published/202101/20190322 Printing from the Linux command line.md @@ -0,0 +1,175 @@ +[#]: collector: (lujun9972) +[#]: translator: (stevenzdg988) +[#]: reviewer: (wxy) +[#]: publisher: (wxy) +[#]: url: (https://linux.cn/article-13012-1.html) +[#]: subject: (Printing from the Linux command line) +[#]: via: (https://www.networkworld.com/article/3373502/printing-from-the-linux-command-line.html) +[#]: author: (Sandra Henry-Stocker https://www.networkworld.com/author/Sandra-Henry_Stocker/) + +从 Linux 命令行进行打印 +====== + +> 在 Linux 命令行进行打印的内容比单单一个 `lp` 命令多得多,让我们来看一些可用选项。 + +![Sherry \(CC BY 2.0\)][1] + +Linux 命令行打印很容易。你可以使用 `lp` 命令来请求打印,并使用 `lpq` 命令来查看队列中有哪些打印作业,但是当你要双面打印或使用纵向模式时,这些会变得有些复杂。你可能还需要做很多其他事情,例如打印多份文档副本或取消打印作业。让我们来看看一些选项,当你从命令行打印时,如何让你的打印输出看起来如你所愿。 + +### 显示打印机配置 + +要从命令行查看打印机设置,请使用 `lpoptions` 命令。 输出应如下所示: + +``` +$ lpoptions +copies=1 device-uri=dnssd://HP%20Color%20LaserJet%20CP2025dn%20(F47468)._pdl-datastream._tcp.local/ finishings=3 job-cancel-after=10800 job-hold-until=no-hold job-priority=50 job-sheets=none,none marker-change-time=1553023232 marker-colors=#000000,#00FFFF,#FF00FF,#FFFF00 marker-levels=18,62,62,63 marker-names='Black\ Cartridge\ HP\ CC530A,Cyan\ Cartridge\ HP\ CC531A,Magenta\ Cartridge\ HP\ CC533A,Yellow\ Cartridge\ HP\ CC532A' marker-types=toner,toner,toner,toner number-up=1 printer-commands=none printer-info='HP Color LaserJet CP2025dn (F47468)' printer-is-accepting-jobs=true printer-is-shared=true printer-is-temporary=false printer-location printer-make-and-model='HP Color LaserJet cp2025dn pcl3, hpcups 3.18.7' printer-state=3 printer-state-change-time=1553023232 printer-state-reasons=none printer-type=167964 printer-uri-supported=ipp://localhost/printers/Color-LaserJet-CP2025dn sides=one-sided +``` + +如果将其空格转换为回车符,输出可能会更人性化,请注意列出了多少设置选项。 + +注意:在下面的输出中,一些行被重新链接,以使输出更具可读性。 + +``` +$ lpoptions | tr " " '\n' +copies=1 +device-uri=dnssd://HP%20Color%20LaserJet%20CP2025dn%20(F47468)._pdl-datastream._tcp.local/ +finishings=3 +job-cancel-after=10800 +job-hold-until=no-hold +job-priority=50 +job-sheets=none,none +marker-change-time=1553023232 +marker-colors=#000000,#00FFFF,#FF00FF,#FFFF00 +marker-levels=18,62,62,63 +marker-names='Black\ Cartridge\ HP\ CC530A, +Cyan\ Cartridge\ HP\ CC531A, +Magenta\ Cartridge\ HP\ CC533A, +Yellow\ Cartridge\ HP\ CC532A' +marker-types=toner,toner,toner,toner +number-up=1 +printer-commands=none +printer-info='HP Color LaserJet CP2025dn (F47468)' +printer-is-accepting-jobs=true +printer-is-shared=true +printer-is-temporary=false +printer-location +printer-make-and-model='HP Color LaserJet cp2025dn pcl3, hpcups 3.18.7' +printer-state=3 +printer-state-change-time=1553023232 +printer-state-reasons=none +printer-type=167964 +printer-uri-supported=ipp://localhost/printers/Color-LaserJet-CP2025dn +sides=one-sided +``` + +使用 `-v` 选项时,`lpinfo` 命令将列出驱动程序和相关信息: + +``` +$ lpinfo -v +network ipp +network https +network socket +network beh +direct hp +network lpd +file cups-brf:/ +network ipps +network http +direct hpfax +network dnssd://HP%20Color%20LaserJet%20CP2025dn%20(F47468)._pdl-datastream._tcp.local/ <== printer +network socket://192.168.0.23 <== printer IP +``` + +`lpoptions` 命令将显示默认打印机的设置。使用 `-p` 选项指定其中一个可用打印机代号: + +``` +$ lpoptions -p LaserJet +``` + +`lpstat -p` 命令显示打印机的状态,而 `lpstat -p -d` 列出可用打印机列表。 + +``` +$ lpstat -p -d +printer Color-LaserJet-CP2025dn is idle. enabled since Tue 19 Mar 2019 05:07:45 PM EDT +system default destination: Color-LaserJet-CP2025dn +``` + +### 非常有用的命令 + +要在默认打印机上打印文档,只需使用 `lp` 命令,后跟要打印的文件名即可。 如果文件名包含空格(在 Linux 系统上很少见),请将该名称放在引号中或开始输入文件名并按 `Tab` 键调用空格的转义标志(如下面的第二个示例所示)。 + +``` +$ lp "never leave home angry" +$ lp never\ leave\ home\ angry +``` + +`lpq` 命令显示打印队列: + +``` +$ lpq +Color-LaserJet-CP2025dn is ready and printing +Rank Owner Job File(s) Total Size +active shs 234 agenda 2048 bytes +``` + +使用 `-n` 选项时,`lp` 命令可用来指定所需打印输出的份数: + +``` +$ lp -n 11 agenda +``` + +要取消打印作业,可以使用 `cancel` 或 `lprm` 命令。如果没来得及执行,则可能会看到以下信息: + +``` +$ cancel 229 +cancel: cancel-job failed: Job #229 is already completed - can't cancel. +``` + +### 双面打印 + +要以双面模式打印,你可以在 `lp` 命令中使用 `sides` 选项,该选项不但表示了在纸张的正反面进行打印,还表示了从纸张的哪个边开始打印。这个设置代表了你期望以双面纵向文档的正常方式打印。 + +``` +$ lp -o sides=two-sided-long-edge Notes.pdf +``` + +如果要所有文档以双面模式打印,则可以使用 `lpoptions` 命令更改 `sides` 设置以修改 `lp` 的设置。 + +``` +$ lpoptions -o sides=two-sided-short-edge +``` + +要恢复为单面打印,可以使用如下命令: + +``` +$ lpoptions -o sides=one-sided +``` + +#### 横向打印 + +要以横向模式打印,可以在 `lp` 命令中使用 `landscape` 选项。 + +``` +$ lp -o landscape penguin.jpg +``` + +### CUPS(Unix 通用打印系统) + +Linux 系统上使用的打印系统是基于标准的开源打印系统,称为 **CUPS**,原意是Unix 通用打印系统Common Unix Printing System。 它允许计算机充当打印服务器。 + +-------------------------------------------------------------------------------- + +via: https://www.networkworld.com/article/3373502/printing-from-the-linux-command-line.html + +作者:[Sandra Henry-Stocker][a] +选题:[lujun9972][b] +译者:[stevenzdg988](https://github.com/stevenzdg988) +校对:[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://images.idgesg.net/images/article/2019/03/printouts-paper-100791390-large.jpg +[2]: https://www.facebook.com/NetworkWorld/ +[3]: https://www.linkedin.com/company/network-world diff --git a/published/202101/20190516 Monitor and Manage Docker Containers with Portainer.io (GUI tool) - Part-2.md b/published/202101/20190516 Monitor and Manage Docker Containers with Portainer.io (GUI tool) - Part-2.md new file mode 100644 index 0000000000..f9e59dc291 --- /dev/null +++ b/published/202101/20190516 Monitor and Manage Docker Containers with Portainer.io (GUI tool) - Part-2.md @@ -0,0 +1,264 @@ +[#]: collector: (lujun9972) +[#]: translator: (Chao-zhi) +[#]: reviewer: (wxy) +[#]: publisher: (wxy) +[#]: url: (https://linux.cn/article-13015-1.html) +[#]: subject: (Monitor and Manage Docker Containers with Portainer.io \(GUI tool\) – Part-2) +[#]: via: (https://www.linuxtechi.com/monitor-manage-docker-containers-portainer-io-part-2/) +[#]: author: (Shashidhar Soppin https://www.linuxtechi.com/author/shashidhar/) + +用 Portainer.io 来监控和管理 Docker 容器(2) +====== + +![](https://img.linux.net.cn/data/attachment/album/202101/14/204401knuxjru53n5su6ns.jpg) + +作为[第 1 部分](https://linux.cn/article-12634-1.html)的延续,本第 2 部分将介绍 Portainer 的其余功能。 + +### 监控 docker 容器镜像 + +``` +root@linuxtechi ~}$ docker ps -a +CONTAINER ID IMAGE COMMAND CREATED STATUS PORTS NAMES +9ab9aa72f015 ubuntu "/bin/bash" 14 seconds ago Exited (0) 12 seconds ago suspicious_shannon +305369d3b2bb centos "/bin/bash" 24 seconds ago Exited (0) 22 seconds ago admiring_mestorf +9a669f3dc4f6 portainer/portainer "/portainer" 7 minutes ago Up 7 minutes 0.0.0.0:9000->9000/tcp trusting_keller +``` + +包括 `portainer`(docker 容器镜像),所有已退出和当前正在运行的 docker 镜像都会显示出来。下面的 Portainer GUI 屏幕截图显示了相同的情况。 + +![Docker_status][1] + +### 监视事件 + +单击 portainer 网页中的“Events”选项,如下所示。 + +基于 docker 容器活动生成和创建的各种事件将被提取并显示在此页面中. + +![Container-Events-Poratiner-GUI][3] + +现在检查并验证“Events”部分是如何工作的。创建一个新的 docker 容器镜像 `redis`,如下所述,在 docker 命令行检查状态:`docker ps –a`: + +``` +root@linuxtechi ~}$ docker ps -a +CONTAINER ID IMAGE COMMAND CREATED STATUS PORTS NAMES +cdbfbef59c31 redis "docker-entrypoint.s…" About a minute ago Up About a minute 6379/tcp angry_varahamihira +9ab9aa72f015 ubuntu "/bin/bash" 10 minutes ago Exited (0) 10 minutes ago suspicious_shannon +305369d3b2bb centos "/bin/bash" 11 minutes ago Exited (0) 11 minutes ago admiring_mestorf +9a669f3dc4f6 portainer/portainer "/portainer" 17 minutes ago Up 17 minutes 0.0.0.0:9000->9000/tcp trusting_keller +``` + +单击顶部的“Event List”刷新事件列表, + +![events_updated][5] + +现在事件的页面也更新了这个变化, + +### 主机状态 + +下面是 portainer 显示主机状态的屏幕截图。这是一个简单的窗口。这显示了主机 Linux 机器的基本信息,如“CPU”、“主机名”、“操作系统信息”等。这个页面在不需要登录主机命令行的情况下提供了非常有用的信息,以便快速浏览。 + +![Host-names-Portainer][7] + +### Portainer 中的仪表板 + +到目前为止,我们已经在“Local”部分看到了基于 portainer 的各种特性。现在跳到所选 Docker 容器镜像的“Dashboard”部分。 + +在 Portainer 的网页中单击“EndPoint”选项时,会出现以下窗口: + +![End_Point_Settings][9] + +对于主机容器镜像,此仪表板有许多状态和选项。 + +#### Stacks + +单击此选项可提供任何堆栈(如果有的话)的状态。因为这里没有堆栈,所以显示为零。 + +#### Images + +单击此选项可提供主机中可用的容器镜像。此选项将显示所有活动和退出的容器镜像。 + +![Docker-Container-Images-Portainer][11] + +例如,再创建一个“Nginx”容器并刷新此列表以查看更新: + +``` +root@linuxtechi ~}$ sudo docker run nginx +Unable to find image 'nginx:latest' locally +latest: Pulling from library/nginx +27833a3ba0a5: Pull complete +ea005e36e544: Pull complete +d172c7f0578d: Pull complete +Digest: sha256:e71b1bf4281f25533cf15e6e5f9be4dac74d2328152edf7ecde23abc54e16c1c +Status: Downloaded newer image for nginx:latest +``` + +下面是刷新后的镜像界面: + +![Nginx_Image_creation][13] + +当 Nginx 镜像处于 `stopped`/`killed` 状态时,docker 的容器镜像会改变为 `unused` 状态。 + +**注**:你可以看到这里所有的镜像的细节都非常清楚,比如内存使用,创建日期和时间。与命令行选项相比,从这里维护和监视容器将非常容易。 + +#### Networks + +此选项用于网络操作。例如分配 IP 地址、创建子网、提供 IP 地址范围、访问控制(管理员和普通用户)。下面的窗口提供了各种可能选项的详细信息。根据你的需要,可以进一步去自行研究这些选项。 + +![Conatiner-Network-Portainer][15] + +输入所有各种网络参数后,单击“create network”按钮即可创建网络。 + +#### Container + +此选项将提供容器状态。此列表将提供有关活动的和未运行的容器状态的详细信息。此输出类似于 docker ps 命令选项。 + +![Containers-Status-Portainer][17] + +在该窗口中,通过选中复选框并选择上述按钮可以根据需要控制容器停止和启动。一个例子如下: + +例如,“CentOS”和“Ubuntu”容器都处于停止状态,现在可以通过选中复选框并点击“Start”按钮来启动它们。 + +![start_containers1][19] + +![start_containers2][21] + +**注意:** 因为这两个都是 Linux 容器镜像,所以不会被启动。Portainer 尝试启动,但稍后又停止。试试启动“Nginx”,你会看到它变成了 `running` 状态。 + +![start_containers3][23] + +#### Volume + +参见本文章第一部分。 + +### Portainer 中的设置选项 + +到目前为止,我们已经在“Local”部分看到了基于 portainer 的各种特性。现在跳到所选 Docker 容器图像的“Settings”部分。 + +在 Portainer 的网页中单击“Settings”选项时,可以使用以下的配置选项: + +#### Extensions + +这是一个简单的 Portainer CE 订阅程序。详细信息和用途可以从附加的窗口中看到。这主要用于维护相应版本的许可证和订阅。 + +![Extensions][25] + +#### Users + +此选项用于添加具有或不具有管理权限的“用户”。下面的示例提供了相同的示例。 + +在本例中输入你的想好的用户名比如“shashi”和你选择的密码,然后点击下面的“Create User”按钮。 + +![create_user_portainer][27] + +![create_user2_portainer][29] + +![Internal-user-Portainer][31] + +类似地,可以通过选中复选框并点击 “remove” 按钮来删除刚刚创建的用户“shashi”。 + +![user_remove_portainer][33] + +#### Endpoints + +此选项用于端点终端管理。终端可以添加和删除,如附加窗口中所示。 + +![Endpoint-Portainer-GUI][35] + +新终端“shashi”是使用如下所示的各种默认参数创建的, + +![Endpoint2-Portainer-GUI][37] + +类似地,可以通过单击复选框并单击移除按钮来移除此端点。 + +#### Registries + +此选项用于注册管理。由于 docker hub 有各种镜像的注册,因此此功能可用于类似的目的。 + +![Registry-Portainer-GUI][39] + +使用默认选项就可以创建“shashi-registry”。 + +![Registry2-Portainer-GUI][41] + +同样,如果不需要了,就可以移除它。 + +#### Settings + +此选项用于设置以下各种选项, + +* 设置快照间隔 +* 设置自定义徽标 +* 创建外部模板 +* 安全功能,如:为非管理员禁用和启用 bin 挂载,为非管理员禁用/启用权限,启用主机管理功能 + +下面的屏幕截图显示了出于演示目的启用和禁用的一些选项。一旦全部完成点击“保存设置”按钮保存所有这些选项。 + +![Portainer-GUI-Settings][43] + +现在点开“Authentication settings”就会弹出 LDAP、Internal 和 OAuth(extension)选项,如下所示: + +![Authentication-Portainer-GUI-Settings][45] + +根据我们想要的环境安全特性级别,选择相应的选项。 + +以上就是本文的内容,我希望这些介绍 portainer 的文章能帮助你更有效地管理和监视容器。请分享你的反馈和意见。 + +-------------------------------------------------------------------------------- + +via: https://www.linuxtechi.com/monitor-manage-docker-containers-portainer-io-part-2/ + +作者:[Shashidhar Soppin][a] +选题:[lujun9972][b] +译者:[Chao-zhi](https://github.com/Chao-zhi) +校对:[wxy](https://github.com/wxy) + +本文由 [LCTT](https://github.com/LCTT/TranslateProject) 原创编译,[Linux中国](https://linux.cn/) 荣誉推出 + +[a]: https://www.linuxtechi.com/author/shashidhar/ +[b]: https://github.com/lujun9972 +[1]: https://www.linuxtechi.com/wp-content/uploads/2019/05/Docker_status-1024x423.jpg +[2]: https://www.linuxtechi.com/wp-content/uploads/2019/05/Docker_status.jpg +[3]: https://www.linuxtechi.com/wp-content/uploads/2019/05/Events-1024x404.jpg +[4]: https://www.linuxtechi.com/wp-content/uploads/2019/05/Events.jpg +[5]: https://www.linuxtechi.com/wp-content/uploads/2019/05/events_updated-1024x414.jpg +[6]: https://www.linuxtechi.com/wp-content/uploads/2019/05/events_updated.jpg +[7]: https://www.linuxtechi.com/wp-content/uploads/2019/05/Host_names-1024x408.jpg +[8]: https://www.linuxtechi.com/wp-content/uploads/2019/05/Host_names.jpg +[9]: https://www.linuxtechi.com/wp-content/uploads/2019/05/End_Point_Settings-1024x471.jpg +[10]: https://www.linuxtechi.com/wp-content/uploads/2019/05/End_Point_Settings.jpg +[11]: https://www.linuxtechi.com/wp-content/uploads/2019/05/Images-1024x398.jpg +[12]: https://www.linuxtechi.com/wp-content/uploads/2019/05/Images.jpg +[13]: https://www.linuxtechi.com/wp-content/uploads/2019/05/Nginx_Image_creation-1024x439.jpg +[14]: https://www.linuxtechi.com/wp-content/uploads/2019/05/Nginx_Image_creation.jpg +[15]: https://www.linuxtechi.com/wp-content/uploads/2019/05/Network-1024x463.jpg +[16]: https://www.linuxtechi.com/wp-content/uploads/2019/05/Network.jpg +[17]: https://www.linuxtechi.com/wp-content/uploads/2019/05/Containers-1024x364.jpg +[18]: https://www.linuxtechi.com/wp-content/uploads/2019/05/Containers.jpg +[19]: https://www.linuxtechi.com/wp-content/uploads/2019/05/start_containers1-1024x432.jpg +[20]: https://www.linuxtechi.com/wp-content/uploads/2019/05/start_containers1.jpg +[21]: https://www.linuxtechi.com/wp-content/uploads/2019/05/start_containers2-1024x307.jpg +[22]: https://www.linuxtechi.com/wp-content/uploads/2019/05/start_containers2.jpg +[23]: https://www.linuxtechi.com/wp-content/uploads/2019/05/start_containers3-1024x435.jpg +[24]: https://www.linuxtechi.com/wp-content/uploads/2019/05/start_containers3.jpg +[25]: https://www.linuxtechi.com/wp-content/uploads/2019/05/Extensions-1024x421.jpg +[26]: https://www.linuxtechi.com/wp-content/uploads/2019/05/Extensions.jpg +[27]: https://www.linuxtechi.com/wp-content/uploads/2019/05/create_user-1024x350.jpg +[28]: https://www.linuxtechi.com/wp-content/uploads/2019/05/create_user.jpg +[29]: https://www.linuxtechi.com/wp-content/uploads/2019/05/create_user2-1024x372.jpg +[30]: https://www.linuxtechi.com/wp-content/uploads/2019/05/create_user2.jpg +[31]: https://www.linuxtechi.com/wp-content/uploads/2019/05/Internal-user-Portainer-1024x257.jpg +[32]: https://www.linuxtechi.com/wp-content/uploads/2019/05/Internal-user-Portainer.jpg +[33]: https://www.linuxtechi.com/wp-content/uploads/2019/05/user_remove-1024x318.jpg +[34]: https://www.linuxtechi.com/wp-content/uploads/2019/05/user_remove.jpg +[35]: https://www.linuxtechi.com/wp-content/uploads/2019/05/Endpoint-1024x349.jpg +[36]: https://www.linuxtechi.com/wp-content/uploads/2019/05/Endpoint.jpg +[37]: https://www.linuxtechi.com/wp-content/uploads/2019/05/Endpoint2-1024x379.jpg +[38]: https://www.linuxtechi.com/wp-content/uploads/2019/05/Endpoint2.jpg +[39]: https://www.linuxtechi.com/wp-content/uploads/2019/05/Registry-1024x420.jpg +[40]: https://www.linuxtechi.com/wp-content/uploads/2019/05/Registry.jpg +[41]: https://www.linuxtechi.com/wp-content/uploads/2019/05/Registry2-1024x409.jpg +[42]: https://www.linuxtechi.com/wp-content/uploads/2019/05/Registry2.jpg +[43]: https://www.linuxtechi.com/wp-content/uploads/2019/05/Portainer-GUI-Settings-1024x418.jpg +[44]: https://www.linuxtechi.com/wp-content/uploads/2019/05/Portainer-GUI-Settings.jpg +[45]: https://www.linuxtechi.com/wp-content/uploads/2019/05/Authentication-Portainer-GUI-Settings-1024x344.jpg +[46]: https://www.linuxtechi.com/wp-content/uploads/2019/05/Authentication-Portainer-GUI-Settings.jpg diff --git a/published/202101/20190924 Integrate online documents editors, into a Python web app using ONLYOFFICE.md b/published/202101/20190924 Integrate online documents editors, into a Python web app using ONLYOFFICE.md new file mode 100644 index 0000000000..b1404ac687 --- /dev/null +++ b/published/202101/20190924 Integrate online documents editors, into a Python web app using ONLYOFFICE.md @@ -0,0 +1,391 @@ +[#]: collector: (lujun9972) +[#]: translator: (stevenzdg988) +[#]: reviewer: (wxy) +[#]: publisher: (wxy) +[#]: url: (https://linux.cn/article-13037-1.html) +[#]: subject: (Integrate online documents editors, into a Python web app using ONLYOFFICE) +[#]: via: (https://opensourceforu.com/2019/09/integrate-online-documents-editors-into-a-python-web-app-using-onlyoffice/) +[#]: author: (Aashima Sharma https://opensourceforu.com/author/aashima-sharma/) + +利用 ONLYOFFICE 将在线文档编辑器集成到 Python Web 应用程序中 +====== + +![][1] + +[ONLYOFFICE][3] 是根据 GNU AGPL v.3 许可证条款分发的开源协作办公套件。它包含三个用于文本文档、电子表格和演示文稿的编辑器,并具有以下功能: + + * 查看,编辑和协同编辑 `.docx`、`.xlsx`、`.pptx` 文件。OOXML 作为一种核心格式,可确保与 Microsoft Word、Excel 和 PowerPoint 文件的高度兼容性。 + * 通过内部转换为 OOXML,编辑其他流行格式(`.odt`、`.rtf`、`.txt`、`.html`、`.ods`、`.csv`、`.odp`)。 + * 熟悉的选项卡式界面。 + * 协作工具:两种协同编辑模式(快速和严谨),跟踪更改,评论和集成聊天。 + * 灵活的访问权限管理:完全访问权限、只读、审阅、表单填写和评论。 + * 使用 API 构建附加组件。 + * 250 种可用语言和象形字母表。 + +通过 API,开发人员可以将 ONLYOFFICE 编辑器集成到网站和利用程序设计语言编写的应用程序中,并能配置和管理编辑器。 + +要集成 ONLYOFFICE 编辑器,我们需要一个集成应用程序来连接编辑器(ONLYOFFICE 文档服务器)和服务。 要在你的界面中使用编辑器,因该授予 ONLYOFFICE 以下权限: + + * 添加并执行自定义代码。 + * 用于下载和保存文件的匿名访问权限。这意味着编辑器仅与服务器端的服务通信,而不包括客户端的任何用户授权数据(浏览器 cookies)。 + * 在用户界面添加新按钮(例如,“在 ONLYOFFICE 中打开”、“在 ONLYOFFICE 中编辑”)。 + * 开启一个新页面,ONLYOFFICE 可以在其中执行脚本以添加编辑器。 + * 能够指定文档服务器连接设置。 + +流行的协作解决方案的成功集成案例有很多,如 Nextcloud、ownCloud、Alfresco、Confluence 和 SharePoint,都是通过 ONLYOFFICE 提供的官方即用型连接器实现的。 + +实际的集成案例之一是 ONLYOFFICE 编辑器与以 C# 编写的开源协作平台的集成。该平台具有文档和项目管理、CRM、电子邮件聚合器、日历、用户数据库、博客、论坛、调查、Wiki 和即时通讯程序的功能。 + +将在线编辑器与 CRM 和项目模块集成,你可以: + + * 文档关联到 CRM 时机和容器、项目任务和讨论,甚至创建一个单独的文件夹,其中包含与项目相关的文档、电子表格和演示文稿。 + * 直接在 CRM 或项目模块中创建新的文档、工作表和演示文稿。 + * 打开和编辑关联的文档,或者下载和删除。 + * 将联系人从 CSV 文件批量导入到 CRM 中,并将客户数据库导出为 CSV 文件。 + +在“邮件”模块中,你可以关联存储在“文档模块”中的文件,或者将指向所需文档的链接插入到邮件正文中。 当 ONLYOFFICE 用户收到带有附件的文档的消息时,他们可以:下载附件、在浏览器中查看文件、打开文件进行编辑或将其保存到“文档模块”。 如上所述,如果格式不同于 OOXML ,则文件将自动转换为 `.docx`、`.xlsx`、`.pptx`,并且其副本也将以原始格式保存。 + +在本文中,你将看到 ONLYOFFICE 与最流行的编程语言之一的 Python 编写的文档管理系统的集成过程。 以下步骤将向你展示如何创建所有必要的部分,以使在 DMS(文档管理系统Document Management System)界面内的文档中可以进行协同工作成为可能:查看、编辑、协同编辑、保存文件和用户访问管理,并可以作为服务的示例集成到 Python 应用程序中。 + +### 1、前置需求 + +首先,创建集成过程的关键组件:[ONLYOFFICE 文档服务器][4] 和用 Python 编写的文件管理系统。 + +#### 1.1、ONLYOFFICE 文档服务器 + +要安装 ONLYOFFICE 文档服务器,你可以从多个安装选项中进行选择:编译 GitHub 上可用的源代码,使用 `.deb` 或 `.rpm` 软件包亦或 Docker 镜像。 + +我们推荐使用下面这条命令利用 Docker 映像安装文档服务器和所有必需的依赖。请注意,选择此方法,你需要安装最新的 Docker 版本。 + +``` +docker run -itd -p 80:80 onlyoffice/documentserver-de +``` + +#### 1.2、利用 Python 开发 DMS + +如果已经拥有一个,请检查它是否满足以下条件: + + * 包含需要打开以查看/编辑的保留文件 + * 允许下载文件 + +对于该应用程序,我们将使用 Bottle 框架。我们将使用以下命令将其安装在工作目录中: + +``` +pip install bottle +``` + +然后我们创建应用程序代码 `main.py` 和模板 `index.tpl`。 + +我们将以下代码添加到 `main.py` 文件中: + +``` +from bottle import route, run, template, get, static_file # connecting the framework and the necessary components +@route('/') # setting up routing for requests for / +def index(): + return template('index.tpl') # showing template in response to request + +run(host="localhost", port=8080) # running the application on port 8080 +``` + +一旦我们运行该应用程序,点击 就会在浏览器上呈现一个空白页面 。 +为了使文档服务器能够创建新文档,添加默认文件并在模板中生成其名称列表,我们应该创建一个文件夹 `files` 并将3种类型文件(`.docx`、`.xlsx` 和 `.pptx`)放入其中。 + +要读取这些文件的名称,我们使用 `listdir` 组件(模块): + +``` +from os import listdir +``` + +现在让我们为文件夹中的所有文件名创建一个变量: + +``` +sample_files = [f for f in listdir('files')] +``` + +要在模板中使用此变量,我们需要通过 `template` 方法传递它: + +``` +def index(): + return template('index.tpl', sample_files=sample_files) +``` + +这是模板中的这个变量: + +``` +% for file in sample_files: +
+ {{file}} +
+% end +``` + +我们重新启动应用程序以查看页面上的文件名列表。 + +使这些文件可用于所有应用程序用户的方法如下: + +``` +@get("/files/") +def show_sample_files(filepath): + return static_file(filepath, root="files") +``` + +### 2、查看文档 + +所有组件准备就绪后,让我们添加函数以使编辑者可以利用应用接口操作。 + +第一个选项使用户可以打开和查看文档。连接模板中的文档编辑器 API : + +``` + +``` + +`editor_url` 是文档编辑器的链接接口。 + +打开每个文件以供查看的按钮: + +``` + +``` + +现在我们需要添加带有 `id` 的 `div` 标签,打开文档编辑器: + +``` +
+``` + +要打开编辑器,必须调用调用一个函数: + +``` + +``` + +DocEditor 函数有两个参数:将在其中打开编辑器的元素 `id` 和带有编辑器设置的 `JSON`。 +在此示例中,使用了以下必需参数: + + * `documentType` 由其格式标识(`.docx`、`.xlsx`、`.pptx` 用于相应的文本、电子表格和演示文稿) + * `document.url` 是你要打开的文件链接。 + * `editorConfig.mode`。 + +我们还可以添加将在编辑器中显示的 `title`。 + +接下来,我们可以在 Python 应用程序中查看文档。 + +### 3、编辑文档 + +首先,添加 “Edit”(编辑)按钮: + +``` + +``` + +然后创建一个新功能,打开文件进行编辑。类似于查看功能。 + +现在创建 3 个函数: + +``` + +``` + +`destroyEditor` 被调用以关闭一个打开的编辑器。 + +你可能会注意到,`edit()` 函数中缺少 `editorConfig` 参数,因为默认情况下它的值是:`{"mode":"edit"}`。 + +现在,我们拥有了打开文档以在 Python 应用程序中进行协同编辑的所有功能。 + +### 4、如何在 Python 应用中利用 ONLYOFFICE 协同编辑文档 + +通过在编辑器中设置对同一文档使用相同的 `document.key` 来实现协同编辑。 如果没有此键值,则每次打开文件时,编辑器都会创建编辑会话。 + +为每个文档设置唯一键,以使用户连接到同一编辑会话时进行协同编辑。 密钥格式应为以下格式:`filename +"_key"`。下一步是将其添加到当前文档的所有配置中。 + +``` +document: { + url: "host_url" + '/' + filepath, + title: filename, + key: filename + '_key' +}, +``` + +### 5、如何在 Python 应用中利用 ONLYOFFICE 保存文档 + +每次我们更改并保存文件时,ONLYOFFICE 都会存储其所有版本。 让我们仔细看看它是如何工作的。 关闭编辑器后,文档服务器将构建要保存的文件版本并将请求发送到 `callbackUrl` 地址。 该请求包含 `document.key`和指向刚刚构建的文件的链接。 + +`document.key` 用于查找文件的旧版本并将其替换为新版本。 由于这里没有任何数据库,因此仅使用 `callbackUrl` 发送文件名。 + +在 `editorConfig.callbackUrl` 的设置中指定 `callbackUrl` 参数并将其添加到 `edit()` 方法中: + +``` + function edit(filename) { + const filepath = 'files/' + filename; + if (editor) { + editor.destroyEditor() + } + editor = new DocsAPI.DocEditor("editor", + { + documentType: get_file_type(filepath), + document: { + url: "host_url" + '/' + filepath, + title: filename, + key: filename + '_key' + } + , + editorConfig: { + mode: 'edit', + callbackUrl: "host_url" + '/callback' + '&filename=' + filename // add file name as a request parameter + } + }); + } +``` + +编写一种方法,在获取到 POST 请求发送到 `/callback` 地址后将保存文件: + +``` +@post("/callback") # processing post requests for /callback +def callback(): + if request.json['status'] == 2: + file = requests.get(request.json['url']).content + with open('files/' + request.query['filename'], 'wb') as f: + f.write(file) + return "{\"error\":0}" +​ +``` + +`# status 2` 是已生成的文件,当我们关闭编辑器时,新版本的文件将保存到存储器中。 + +### 6、管理用户 + +如果应用中有用户,并且你需要查看谁在编辑文档,请在编辑器的配置中输入其标识符(`id`和`name`)。 + +在界面中添加选择用户的功能: + +``` + +``` + +如果在标记 ` + + + + +``` + +要在浏览器中运行此文件,请双击文件或打开你喜欢的浏览器,点击菜单,然后选择**文件->打开文件**。(如果使用 Brackets 软件,也可以使用角落处的闪电图标在浏览器中打开文件)。 + +### 生成伪随机数 + +猜谜游戏的第一步是为玩家生成一个数字供玩家猜测。JavaScript 包含几个内置的全局对象,可帮助你编写代码。要生成随机数,请使用 `Math` 对象。 + +JavaScript中的 [Math][17] 具有处理和数学相关的属性和功能。你将使用两个数学函数来生成随机数,供你的玩家猜测。 + +[Math.random()][18],会将生成一个介于 0 和 1 之间的伪随机数。(`Math.random` 包含 0 但不包含 1。这意味着该函数可以生成 0 ,永远不会产生 1) + +对于此游戏,请将随机数设置在 1 到 100 之间以缩小玩家的选择范围。取刚刚生成的小数,然后乘以 100,以产生一个介于 0 到……甚至不是 100 之间的小数。至此,你将需要其他步骤来解决这个问题。 + +现在,你的数字仍然是小数,但你希望它是一个整数。为此,你可以使用属于 `Math` 对象的另一个函数 [Math.floor()][19]。`Math.floor()` 的目的是返回小于或等于你作为参数指定的数字的最大整数,这意味着它会四舍五入为最接近的整数: + +``` +Math.floor(Math.random() * 100) +``` + +这样你将得到 0 到 99 之间的整数,这不是你想要的范围。你可以在最后一步修复该问题,即在结果中加 1。瞧!现在,你有一个(有点)随机生成的数字,介于 1 到 100 之间: + +``` +Math.floor(Math.random() * 100) + 1 +``` + +### 变量 + +现在,你需要存储随机生成的数字,以便可以将其与玩家的猜测进行比较。为此,你可以将其存储到一个 **变量**。 + +JavaScript 具有不同类型的变量,你可以选择这些类型,具体取决于你要如何使用该变量。对于此游戏,请使用 `const` 和 `let`。 + + * `let` 用于指示变量在整个程序中可以改变。 + * `const` 用于指示变量不应该被修改。 + +`const` 和 `let` 还有很多要说的,但现在知道这些就足够了。 + +随机数在游戏中仅生成一次,因此你将使用 `const` 变量来保存该值。你想给变量起一个清楚地表明要存储什么值的名称,因此将其命名为 `randomNumber`: + +``` +const randomNumber +``` + +有关命名的注意事项:JavaScript 中的变量和函数名称以驼峰形式编写。如果只有一个单词,则全部以小写形式书写。如果有多个单词,则第一个单词均为小写,其他任何单词均以大写字母开头,且单词之间没有空格。 + +### 打印到控制台 + +通常,你不想向任何人显示随机数,但是开发人员可能想知道生成的数字以使用它来帮助调试代码。 使用 JavaScript,你可以使用另一个内置函数 [console.log()][20] 将数字输出到浏览器的控制台。 + +大多数浏览器都包含开发人员工具,你可以通过按键盘上的 `F12` 键来打开它们。从那里,你应该看到一个 **控制台** 标签。打印到控制台的所有信息都将显示在此处。由于到目前为止编写的代码将在浏览器加载后立即运行,因此,如果你查看控制台,你应该会看到刚刚生成的随机数! + +![Javascript game with console][21] + +### 函数 + +接下来,你需要一种方法来从数字输入字段中获得玩家的猜测,将其与你刚刚生成的随机数进行比较,并向玩家提供反馈,让他们知道他们是否正确猜到了。为此,编写一个函数。 **函数** 是执行一定任务的代码块。函数是可以重用的,这意味着如果你需要多次运行相同的代码,则可以调用函数,而不必重写执行任务所需的所有步骤。 + +根据你使用的 JavaScript 版本,有许多不同的方法来编写或声明函数。由于这是该语言的基础入门,因此请使用基本函数语法声明函数。 + +以关键字 `function` 开头,然后起一个函数名。好的做法是使用一个描述该函数的功能的名称。在这个例子中,你正在检查玩家的猜测的数,因此此函数的名字可以是 `checkGuess`。在函数名称之后,写上一组小括号,然后写上一组花括号。 你将在以下花括号之间编写函数的主体: + +``` +function checkGuess() {} +``` + +### 使用 DOM + +JavaScript 的目的之一是与网页上的 HTML 交互。它通过文档对象模型(DOM)进行此操作,DOM 是 JavaScript 用于访问和更改网页信息的对象。现在,你需要从 HTML 中获取数字输入字段中玩家的猜测。你可以使用分配给 HTML 元素的 `id` 属性(在这种情况下为 `guess`)来做到这一点: + +``` + +``` + +JavaScript 可以通过访问玩家输入到数字输入字段中的数来获取其值。你可以通过引用元素的 ID 并在末尾添加 `.value` 来实现。这次,使用 `let` 定义的变量来保存用户的猜测值: + +``` +let myGuess = guess.value +``` + +玩家在数字输入字段中输入的任何数字都将被分配给 `checkGuess` 函数中的 `myGuess` 变量。 + +### 条件语句 + +下一步是将玩家的猜测与游戏产生的随机数进行比较。你还想给玩家反馈,让他们知道他们的猜测是太高,太低还是正确。 + +你可以使用一系列条件语句来决定玩家将收到的反馈。**条件语句** 在运行代码块之前检查是否满足条件。如果不满足条件,则代码停止,继续检查下一个条件,或者继续执行其余代码,而无需执行条件块中的代码: + +``` +if (myGuess === randomNumber){ +  feedback.textContent = "You got it right!" +} +else if(myGuess > randomNumber) { +  feedback.textContent = "Your guess was " + myGuess + ". That's too high. Try Again!" +} +else if(myGuess < randomNumber) { +  feedback.textContent = "Your guess was " + myGuess + ". That's too low. Try Again!" +} +``` + +第一个条件块使用比较运算符 `===` 将玩家的猜测与游戏生成的随机数进行比较。比较运算符检查右侧的值,将其与左侧的值进行比较,如果匹配则返回布尔值 `true`,否则返回布尔值 `false`。 + +如果数字匹配(猜对了!),为了让玩家知道。通过将文本添加到具有 `id` 属性 `feedback` 的 `

` 标记中来操作 DOM。就像上面的 `guess.value` 一样,除了不是从 DOM 获取信息,而是更改其中的信息。`

` 元素没有像 `` 元素那样的值,而是具有文本,因此请使用 `.textContent` 访问元素并设置要显示的文本: + +``` +feedback.textContent = "You got it right!" +``` + +当然,玩家很有可能在第一次尝试时就猜错了,因此,如果 `myGuess` 和 `randomNumber` 不匹配,请给玩家一个线索,以帮助他们缩小猜测范围。如果第一个条件失败,则代码将跳过该 `if` 语句中的代码块,并检查下一个条件是否为 `true`。 这使你进入 `else if` 块: + +``` +else if(myGuess > randomNumber) { +  feedback.textContent = "Your guess was " + myGuess + ". That's too high. Try Again!" +} +``` + +如果你将其作为句子阅读,则可能是这样的:“如果玩家的猜测等于随机数,请让他们知道他们猜对了。否则,请检查玩家的猜测是否大于 `randomNumber`,如果是,则显示玩家的猜测并告诉他们太高了。” + +最后一种可能性是玩家的猜测低于随机数。 要检查这一点,再添加一个 `else if` 块: + +``` +else if(myGuess < randomNumber) { +  feedback.textContent = "Your guess was " + myGuess + ". That's too low. Try Again!" +} +``` + +### 用户事件和事件监听器 + +如果你看上面的代码,则会看到某些代码在页面加载时自动运行,但有些则不会。你想在玩游戏之前生成随机数,但是你不想在玩家将数字输入到数字输入字段并准备检查它之前检查其猜测。 + +生成随机数并将其打印到控制台的代码不在函数的范围内,因此它将在浏览器加载脚本时自动运行。 但是,要使函数内部的代码运行,你必须对其进行调用。 + +调用函数有几种方法。在此,你希望该函数在用户单击 “Check My Guess” 按钮时运行。单击按钮将创建一个用户事件,然后 JavaScript 可以 “监听” 这个事件,以便知道何时需要运行函数。 + +代码的最后一行将事件侦听器添加到按钮上,以在单击按钮时调用函数。当它“听到”该事件时,它将运行分配给事件侦听器的函数: + +``` +submitGuess.addEventListener('click', checkGuess) +``` + +就像访问 DOM 元素的其他实例一样,你可以使用按钮的 ID 告诉 JavaScript 与哪个元素进行交互。 然后,你可以使用内置的 `addEventListener` 函数来告诉 JavaScript 要监听的事件。 + +你已经看到了带有参数的函数,但花点时间看一下它是如何工作的。参数是函数执行其任务所需的信息。并非所有函数都需要参数,但是 `addEventListener` 函数需要两个参数。它采用的第一个参数是将为其监听的用户事件的名称。用户可以通过多种方式与 DOM 交互,例如键入、移动鼠标,键盘上的 `TAB` 键和粘贴文本。在这种情况下,你正在监听的用户事件是单击按钮,因此第一个参数将是 `click`。 + +`addEventListener`的第二个所需的信息是用户单击按钮时要运行的函数的名称。 这里我们需要 `checkGuess` 函数。 + +现在,当玩家按下 “Check My Guess” 按钮时,`checkGuess` 函数将获得他们在数字输入字段中输入的值,将其与随机数进行比较,并在浏览器中显示反馈,以使玩家知道他们猜的怎么样。 太棒了!你的游戏已准备就绪。 + +### 学习 JavaScript 以获取乐趣和收益 + +这一点点的平凡无奇的 JavaScript 只是这个庞大的生态系统所提供功能的一小部分。这是一种值得花时间投入学习的语言,我鼓励你继续挖掘并学习更多。 + +-------------------------------------------------------------------------------- + +via: https://opensource.com/article/21/1/learn-javascript + +作者:[Mandy Kendall][a] +选题:[lujun9972][b] +译者:[amwps290](https://github.com/amwps290) +校对:[wxy](https://github.com/wxy) + +本文由 [LCTT](https://github.com/LCTT/TranslateProject) 原创编译,[Linux中国](https://linux.cn/) 荣誉推出 + +[a]: https://opensource.com/users/mkendall +[b]: https://github.com/lujun9972 +[1]: https://opensource.com/sites/default/files/styles/image-full-size/public/lead-images/code_javascript.jpg?itok=60evKmGl "Javascript code close-up with neon graphic overlay" +[2]: https://opensource.com/tags/javascript +[3]: https://opensource.com/article/20/11/reactjs-tutorial +[4]: https://opensource.com/article/18/9/open-source-javascript-chart-libraries +[5]: https://opensource.com/article/20/12/brackets +[6]: http://december.com/html/4/element/html.html +[7]: http://december.com/html/4/element/head.html +[8]: http://december.com/html/4/element/meta.html +[9]: http://december.com/html/4/element/title.html +[10]: http://december.com/html/4/element/body.html +[11]: http://december.com/html/4/element/h1.html +[12]: http://december.com/html/4/element/p.html +[13]: http://december.com/html/4/element/label.html +[14]: http://december.com/html/4/element/input.html +[15]: http://december.com/html/4/element/form.html +[16]: http://december.com/html/4/element/script.html +[17]: https://developer.mozilla.org/en-US/docs/Web/JavaScript/Reference/Global_Objects/Math +[18]: https://developer.mozilla.org/en-US/docs/Web/JavaScript/Reference/Global_Objects/Math/random +[19]: https://developer.mozilla.org/en-US/docs/Web/JavaScript/Reference/Global_Objects/Math/floor +[20]: https://developer.mozilla.org/en-US/docs/Web/API/Console/log +[21]: https://opensource.com/sites/default/files/javascript-game-with-console.png "Javascript game with console" diff --git a/published/202102/20210121 How Nextcloud is the ultimate open source productivity suite.md b/published/202102/20210121 How Nextcloud is the ultimate open source productivity suite.md new file mode 100644 index 0000000000..397dfea81f --- /dev/null +++ b/published/202102/20210121 How Nextcloud is the ultimate open source productivity suite.md @@ -0,0 +1,70 @@ +[#]: collector: (lujun9972) +[#]: translator: (geekpi) +[#]: reviewer: (wxy) +[#]: publisher: (wxy) +[#]: url: (https://linux.cn/article-13077-1.html) +[#]: subject: (How Nextcloud is the ultimate open source productivity suite) +[#]: via: (https://opensource.com/article/21/1/nextcloud-productivity) +[#]: author: (Kevin Sonney https://opensource.com/users/ksonney) + +Nextcloud 是如何成为终极开源生产力套件的 +====== + +> Nextcloud 可以取代你用于协作、组织和任务管理的许多在线应用。 + +![](https://img.linux.net.cn/data/attachment/album/202102/02/121553uhl3pjljjkhj0h8p.jpg) + +在前几年,这个年度系列涵盖了单个的应用。今年,我们除了关注 2021 年的策略外,还将关注一体化解决方案。欢迎来到 2021 年 21 天生产力的第十一天。 + +基于 Web 的服务几乎可以在任何地方访问你的数据,它们每小时可以支持数百万用户。不过对于我们中的一些人来说,由于各种原因,运行自己的服务比使用大公司的服务更可取。也许我们的工作是受监管的或有明确安全要求。也许我们有隐私方面的考虑,或者只是喜欢能够自己构建、运行和修复事物。不管是什么情况,[Nextcloud][2] 都可以提供你所需要的大部分服务,但是是在你自己的硬件上。 + +![NextCloud Dashboard displaying service options][3] + +*Nextcloud 控制面板(Kevin Sonney, [CC BY-SA 4.0][4])* + +大多数时候,当我们想到 Nextcloud 时,我们会想到文件共享和同步,类似于 Dropbox、OneDrive 和 Google Drive 等商业产品。然而,如今,它是一个完整的生产力套件,拥有电子邮件客户端、日历、任务和笔记本。 + +有几种方法可以安装和运行 Nextcloud。你可以把它安装到裸机服务器上、在 Docker 容器中运行,或者作为虚拟机运行。如果可以考虑,还有一些托管服务将为你运行 Nextcloud。最后,有适用于所有主流操作系统的应用,包括移动应用,以便随时访问。 + +![Nextcloud virtual machine][5] + +*Nextcloud 虚拟机(Kevin Sonney, [CC BY-SA 4.0][4])* + +默认情况下,Nextcloud 会安装文件共享和其他一些相关应用(或附加组件)。你可以在管理界面中找到“应用”页面,这里允许你安装单个附加组件和一些预定义的相关应用捆绑。对我而言,我选择了 “Groupware Bundle”,其中包括“邮件”、“日历”、“联系人”和 “Deck”。“Deck” 是一个轻量级的看板,用于处理任务。我也安装了“记事本”和“任务”应用。 + +Nextcloud “邮件” 是一个非常直白的 IMAP 邮件客户端。虽然 Nextcloud 没有将 IMAP 或 SMTP 服务器作为软件包的一部分,但你可以很容易地在操作系统中添加一个或使用远程服务。“日历”应用是相当标准的,也允许你订阅远程日历。有一个缺点是,远程日历(例如,来自大型云提供商)是只读的,所以你可以查看但不能修改它们。 + +![NextCoud App Interface][6] + +*Nextcloud 应用界面 (Kevin Sonney, [CC BY-SA 4.0][4])* + +“记事本” 是一个简单的文本记事本,允许你创建和更新简短的笔记、日记和相关的东西。“任务” 是一款待办事项应用,支持多个列表、任务优先级、完成百分比以及其他一些用户期待的标准功能。如果你安装了 “Deck”,它的任务卡也会被列出来。每个看板都会显示自己的列表,所以你可以使用 “Deck” 或 “任务” 来跟踪完成的内容。 + +“Deck” 本身就是一个看板应用,将任务以卡片的形式呈现在流程中。如果你喜欢看板流程,它是一个追踪进度的优秀应用。 + +![Taking notes][7] + +*做笔记 (Kevin Sonney, [CC BY-SA 4.0][4])* + +Nextcloud 中所有的应用都原生支持通过标准协议进行共享。与一些类似的解决方案不同,它的分享并不是为了完成功能列表中的一项而加上去的。分享是 Nextcloud 存在的主要原因之一,所以使用起来非常简单。你还可以将链接分享到社交媒体、通过电子邮件分享等。你可以用一个 Nextcloud 取代多个在线服务,它在任何地方都可以访问,以协作为先。 + +-------------------------------------------------------------------------------- + +via: https://opensource.com/article/21/1/nextcloud-productivity + +作者:[Kevin Sonney][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/ksonney +[b]: https://github.com/lujun9972 +[1]: https://opensource.com/sites/default/files/styles/image-full-size/public/lead-images/team_dev_email_chat_video_work_wfm_desk_520.png?itok=6YtME4Hj (Working on a team, busy worklife) +[2]: https://nextcloud.com/ +[3]: https://opensource.com/sites/default/files/day11-image1_0.png +[4]: https://creativecommons.org/licenses/by-sa/4.0/ +[5]: https://opensource.com/sites/default/files/pictures/nextcloud-vm.png (Nextcloud virtual machine) +[6]: https://opensource.com/sites/default/files/pictures/nextcloud-app-interface.png (NextCoud App Interface) +[7]: https://opensource.com/sites/default/files/day11-image3.png (Taking notes in Nextcloud) diff --git a/published/202102/20210122 3 tips for automating your email filters.md b/published/202102/20210122 3 tips for automating your email filters.md new file mode 100644 index 0000000000..f3644bb0e5 --- /dev/null +++ b/published/202102/20210122 3 tips for automating your email filters.md @@ -0,0 +1,60 @@ +[#]: collector: (lujun9972) +[#]: translator: (geekpi) +[#]: reviewer: (wxy) +[#]: publisher: (wxy) +[#]: url: (https://linux.cn/article-13073-1.html) +[#]: subject: (3 tips for automating your email filters) +[#]: via: (https://opensource.com/article/21/1/email-filter) +[#]: author: (Kevin Sonney https://opensource.com/users/ksonney) + +3 个自动化电子邮件过滤器的技巧 +====== + +> 通过这些简单的建议,减少你的电子邮件并让你的生活更轻松。 + +![](https://img.linux.net.cn/data/attachment/album/202102/01/103638ozdejmy6eycm6omx.jpg) + +在前几年,这个年度系列涵盖了单个的应用。今年,我们除了关注 2021 年的策略外,还将关注一体化解决方案。欢迎来到 2021 年 21 天生产力的第十二天。 + +如果有一件事是我喜欢的,那就是自动化。只要有机会,我就会把小任务进行自动化。早起打开鸡舍的门?我买了一扇门,可以在日出和日落时开门和关门。每天从早到晚实时监控鸡群?用 Node-RED 和 [OBS-Websockets][2] 稍微花点时间,就能搞定。 + +我们还有电子邮件。几天前,我写过关于处理邮件的文章,也写过关于标签和文件夹的文章。只要做一点前期的工作,你就可以在邮件进来的时候,你就可以自动摆脱掉大量管理邮件的开销。 + +![Author has 480 filters][3] + +*是的,我有很多过滤器。(Kevin Sonney, [CC BY-SA 4.0][4])* + +有两种主要方式来过滤你的电子邮件:在服务端或者客户端上。我更喜欢在服务端上做,因为我不断地在尝试新的和不同的电子邮件客户端。(不,真的,我光这个星期就已经使用了五个不同的客户端。我可能有问题。) + +无论哪种方式,我都喜欢用电子邮件过滤规则做几件事,以使我的电子邮件更容易浏览,并保持我的收件箱不混乱。 + + 1. 将不紧急的邮件移到“稍后阅读”文件夹中。对我而言,这包括来自社交网络、新闻简报和邮件列表的通知。 + 2. 按列表或主题给消息贴上标签。我属于几个组织,虽然它们经常会被放在“稍后阅读”文件夹中,但我会添加第二个或第三个标签,以说明该来源或项目的内容,以帮助搜索时找到相关的东西。 + 3. 不要把规则搞得太复杂。这个想法让我困难了一段时间。我想把邮件发送到某个文件夹的所有可能情况都加到一个规则里。如果有什么问题或需要添加或删除的东西,有一个大规则只是让它更难修复。 + +![Unsubscribe from email][5] + +*点击它,点击它就行!(Kevin Sonney, [CC BY-SA 4.0][4])* + +说了这么多,还有一件事我一直在做,它有助于减少我花在电子邮件上的时间:退订邮件。两年前我感兴趣的那个邮件列表已经不感兴趣了,所以就不订阅了。产品更新通讯是我去年停止使用的商品?退订!这一直在积极解放我。我每年都会试着评估几次列表中的邮件信息是否(仍然)有用。 + +过滤器和规则可以是非常强大的工具,让你的电子邮件保持集中,减少花在它们身上的时间。而点击取消订阅按钮是一种解放。试试就知道了! + +-------------------------------------------------------------------------------- + +via: https://opensource.com/article/21/1/email-filter + +作者:[Kevin Sonney][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/ksonney +[b]: https://github.com/lujun9972 +[1]: https://opensource.com/sites/default/files/styles/image-full-size/public/lead-images/innovation_lightbulb_gears_devops_ansible.png?itok=TSbmp3_M (gears and lightbulb to represent innovation) +[2]: https://opensource.com/article/20/6/obs-websockets-streaming +[3]: https://opensource.com/sites/default/files/day12-image1_0.png +[4]: https://creativecommons.org/licenses/by-sa/4.0/ +[5]: https://opensource.com/sites/default/files/day12-image2_0.png diff --git a/published/202102/20210125 Explore binaries using this full-featured Linux tool.md b/published/202102/20210125 Explore binaries using this full-featured Linux tool.md new file mode 100644 index 0000000000..ffa4c8554b --- /dev/null +++ b/published/202102/20210125 Explore binaries using this full-featured Linux tool.md @@ -0,0 +1,635 @@ +[#]: collector: (lujun9972) +[#]: translator: (wxy) +[#]: reviewer: (wxy) +[#]: publisher: (wxy) +[#]: url: (https://linux.cn/article-13074-1.html) +[#]: subject: (Explore binaries using this full-featured Linux tool) +[#]: via: (https://opensource.com/article/21/1/linux-radare2) +[#]: author: (Gaurav Kamathe https://opensource.com/users/gkamathe) + +全功能的二进制文件分析工具 Radare2 指南 +====== + +> Radare2 是一个为二进制分析定制的开源工具。 + +![](https://img.linux.net.cn/data/attachment/album/202102/01/112611baw4gpqlch10ps1c.jpg) + +在《[Linux 上分析二进制文件的 10 种方法][2]》中,我解释了如何使用 Linux 上丰富的原生工具集来分析二进制文件。但如果你想进一步探索你的二进制文件,你需要一个为二进制分析定制的工具。如果你是二进制分析的新手,并且大多使用的是脚本语言,这篇文章《[GNU binutils 里的九种武器][3]》可以帮助你开始学习编译过程和什么是二进制。 + +### 为什么我需要另一个工具? + +如果现有的 Linux 原生工具也能做类似的事情,你自然会问为什么需要另一个工具。嗯,这和你用手机做闹钟、做笔记、做相机、听音乐、上网、偶尔打电话和接电话的原因是一样的。以前,使用单独的设备和工具处理这些功能 —— 比如拍照的实体相机,记笔记的小记事本,起床的床头闹钟等等。对用户来说,有一个设备来做多件(但相关的)事情是*方便的*。另外,杀手锏就是独立功能之间的*互操作性*。 + +同样,即使许多 Linux 工具都有特定的用途,但在一个工具中捆绑类似(和更好)的功能是非常有用的。这就是为什么我认为 [Radare2][4] 应该是你需要处理二进制文件时的首选工具。 + +根据其 [GitHub 简介][5],Radare2(也称为 r2)是一个“类 Unix 系统上的逆向工程框架和命令行工具集”。它名字中的 “2” 是因为这个版本从头开始重写的,使其更加模块化。 + +### 为什么选择 Radare2? + +有大量(非原生的)Linux 工具可用于二进制分析,为什么要选择 Radare2 呢?我的理由很简单。 + +首先,它是一个开源项目,有一个活跃而健康的社区。如果你正在寻找新颖的功能或提供着 bug 修复的工具,这很重要。 + +其次,Radare2 可以在命令行上使用,而且它有一个功能丰富的图形用户界面(GUI)环境,叫做 Cutter,适合那些对 GUI 比较熟悉的人。作为一个长期使用 Linux 的用户,我对习惯于在 shell 上输入。虽然熟悉 Radare2 的命令稍微有一点学习曲线,但我会把它比作 [学习 Vim][6]。你可以先学习基本的东西,一旦你掌握了它们,你就可以继续学习更高级的东西。很快,它就变成了肌肉记忆。 + +第三,Radare2 通过插件可以很好的支持外部工具。例如,最近开源的 [Ghidra][7] 二进制分析和逆向工具reversing tool很受欢迎,因为它的反编译器功能是逆向软件的关键要素。你可以直接从 Radare2 控制台安装 Ghidra 反编译器并使用,这很神奇,让你两全其美。 + +### 开始使用 Radare2 + +要安装 Radare2,只需克隆其存储库并运行 `user.sh` 脚本。如果你的系统上还没有一些预备软件包,你可能需要安装它们。一旦安装完成,运行 `r2 -v` 命令来查看 Radare2 是否被正确安装: + +``` +$ git clone https://github.com/radareorg/radare2.git +$ cd radare2 +$ ./sys/user.sh + +# version + +$ r2 -v +radare2 4.6.0-git 25266 @ linux-x86-64 git.4.4.0-930-g48047b317 +commit: 48047b3171e6ed0480a71a04c3693a0650d03543 build: 2020-11-17__09:31:03 +$ +``` + +#### 获取二进制测试样本 + +现在 `r2` 已经安装好了,你需要一个样本二进制程序来试用它。你可以使用任何系统二进制文件(`ls`、`bash` 等),但为了使本教程的内容简单,请编译以下 C 程序: + +``` +$ cat adder.c +``` + +``` +#include + +int adder(int num) { + return num + 1; +} + +int main() { + int res, num1 = 100; + res = adder(num1); + printf("Number now is : %d\n", res); + return 0; +} +``` + +``` +$ gcc adder.c -o adder +$ file adder +adder: ELF 64-bit LSB executable, x86-64, version 1 (SYSV), dynamically linked, interpreter /lib64/ld-linux-x86-64.so.2, for GNU/Linux 3.2.0, BuildID[sha1]=9d4366f7160e1ffb46b14466e8e0d70f10de2240, not stripped +$ ./adder +Number now is : 101 +``` + +#### 加载二进制文件 + +要分析二进制文件,你必须在 Radare2 中加载它。通过提供文件名作为 `r2` 命令的一个命令行参数来加载它。你会进入一个独立的 Radare2 控制台,这与你的 shell 不同。要退出控制台,你可以输入 `Quit` 或 `Exit` 或按 `Ctrl+D`: + +``` +$ r2 ./adder + -- Learn pancake as if you were radare! +[0x004004b0]> quit +$ +``` + +#### 分析二进制 + +在你探索二进制之前,你必须让 `r2` 为你分析它。你可以通过在 `r2` 控制台中运行 `aaa` 命令来实现: + +``` +$ r2 ./adder + -- Sorry, radare2 has experienced an internal error. +[0x004004b0]> +[0x004004b0]> +[0x004004b0]> aaa +[x] Analyze all flags starting with sym. and entry0 (aa) +[x] Analyze function calls (aac) +[x] Analyze len bytes of instructions for references (aar) +[x] Check for vtables +[x] Type matching analysis for all functions (aaft) +[x] Propagate noreturn information +[x] Use -AA or aaaa to perform additional experimental analysis. +[0x004004b0]> +``` + +这意味着每次你选择一个二进制文件进行分析时,你必须在加载二进制文件后输入一个额外的命令 `aaa`。你可以绕过这一点,在命令后面跟上 `-A` 来调用 `r2`;这将告诉 `r2` 为你自动分析二进制: + +``` +$ r2 -A ./adder +[x] Analyze all flags starting with sym. and entry0 (aa) +[x] Analyze function calls (aac) +[x] Analyze len bytes of instructions for references (aar) +[x] Check for vtables +[x] Type matching analysis for all functions (aaft) +[x] Propagate noreturn information +[x] Use -AA or aaaa to perform additional experimental analysis. + -- Already up-to-date. +[0x004004b0]> +``` + +#### 获取一些关于二进制的基本信息 + +在开始分析一个二进制文件之前,你需要一些背景信息。在许多情况下,这可以是二进制文件的格式(ELF、PE 等)、二进制的架构(x86、AMD、ARM 等),以及二进制是 32 位还是 64 位。方便的 `r2` 的 `iI` 命令可以提供所需的信息: + +``` +[0x004004b0]> iI +arch x86 +baddr 0x400000 +binsz 14724 +bintype elf +bits 64 +canary false +class ELF64 +compiler GCC: (GNU) 8.3.1 20190507 (Red Hat 8.3.1-4) +crypto false +endian little +havecode true +intrp /lib64/ld-linux-x86-64.so.2 +laddr 0x0 +lang c +linenum true +lsyms true +machine AMD x86-64 architecture +maxopsz 16 +minopsz 1 +nx true +os linux +pcalign 0 +pic false +relocs true +relro partial +rpath NONE +sanitiz false +static false +stripped false +subsys linux +va true + +[0x004004b0]> +[0x004004b0]> +``` + +### 导入和导出 + +通常情况下,当你知道你要处理的是什么样的文件后,你就想知道二进制程序使用了什么样的标准库函数,或者了解程序的潜在功能。在本教程中的示例 C 程序中,唯一的库函数是 `printf`,用来打印信息。你可以通过运行 `ii` 命令看到这一点,它显示了该二进制所有导入的库: + +``` +[0x004004b0]> ii +[Imports] +nth vaddr bind type lib name +――――――――――――――――――――――――――――――――――――― +1 0x00000000 WEAK NOTYPE _ITM_deregisterTMCloneTable +2 0x004004a0 GLOBAL FUNC printf +3 0x00000000 GLOBAL FUNC __libc_start_main +4 0x00000000 WEAK NOTYPE __gmon_start__ +5 0x00000000 WEAK NOTYPE _ITM_registerTMCloneTable +``` + +该二进制也可以有自己的符号、函数或数据。这些函数通常显示在 `Exports` 下。这个测试的二进制导出了两个函数:`main` 和 `adder`。其余的函数是在编译阶段,当二进制文件被构建时添加的。加载器需要这些函数来加载二进制文件(现在不用太关心它们): + +``` +[0x004004b0]> +[0x004004b0]> iE +[Exports] + +nth paddr vaddr bind type size lib name +―――――――――――――――――――――――――――――――――――――――――――――――――――――― +82 0x00000650 0x00400650 GLOBAL FUNC 5 __libc_csu_fini +85 ---------- 0x00601024 GLOBAL NOTYPE 0 _edata +86 0x00000658 0x00400658 GLOBAL FUNC 0 _fini +89 0x00001020 0x00601020 GLOBAL NOTYPE 0 __data_start +90 0x00000596 0x00400596 GLOBAL FUNC 15 adder +92 0x00000670 0x00400670 GLOBAL OBJ 0 __dso_handle +93 0x00000668 0x00400668 GLOBAL OBJ 4 _IO_stdin_used +94 0x000005e0 0x004005e0 GLOBAL FUNC 101 __libc_csu_init +95 ---------- 0x00601028 GLOBAL NOTYPE 0 _end +96 0x000004e0 0x004004e0 GLOBAL FUNC 5 _dl_relocate_static_pie +97 0x000004b0 0x004004b0 GLOBAL FUNC 47 _start +98 ---------- 0x00601024 GLOBAL NOTYPE 0 __bss_start +99 0x000005a5 0x004005a5 GLOBAL FUNC 55 main +100 ---------- 0x00601028 GLOBAL OBJ 0 __TMC_END__ +102 0x00000468 0x00400468 GLOBAL FUNC 0 _init + +[0x004004b0]> +``` + +### 哈希信息 + +如何知道两个二进制文件是否相似?你不能只是打开一个二进制文件并查看里面的源代码。在大多数情况下,二进制文件的哈希值(md5sum、sha1、sha256)是用来唯一识别它的。你可以使用 `it` 命令找到二进制的哈希值: + +``` +[0x004004b0]> it +md5 7e6732f2b11dec4a0c7612852cede670 +sha1 d5fa848c4b53021f6570dd9b18d115595a2290ae +sha256 13dd5a492219dac1443a816ef5f91db8d149e8edbf26f24539c220861769e1c2 +[0x004004b0]> +``` + +### 函数 + +代码按函数分组;要列出二进制中存在的函数,请运行 `afl` 命令。下面的列表显示了 `main` 函数和 `adder` 函数。通常,以 `sym.imp` 开头的函数是从标准库(这里是 glibc)中导入的: + +``` +[0x004004b0]> afl +0x004004b0    1 46           entry0 +0x004004f0    4 41   -> 34   sym.deregister_tm_clones +0x00400520    4 57   -> 51   sym.register_tm_clones +0x00400560    3 33   -> 32   sym.__do_global_dtors_aux +0x00400590    1 6            entry.init0 +0x00400650    1 5            sym.__libc_csu_fini +0x00400658    1 13           sym._fini +0x00400596    1 15           sym.adder +0x004005e0    4 101          loc..annobin_elf_init.c +0x004004e0    1 5            loc..annobin_static_reloc.c +0x004005a5    1 55           main +0x004004a0    1 6            sym.imp.printf +0x00400468    3 27           sym._init +[0x004004b0]> +``` + +### 交叉引用 + +在 C 语言中,`main` 函数是一个程序开始执行的地方。理想情况下,其他函数都是从 `main` 函数调用的,在退出程序时,`main` 函数会向操作系统返回一个退出状态。这在源代码中是很明显的,然而,二进制程序呢?如何判断 `adder` 函数的调用位置呢? + +你可以使用 `axt` 命令,后面加上函数名,看看 `adder` 函数是在哪里调用的;如下图所示,它是从 `main` 函数中调用的。这就是所谓的交叉引用cross-referencing。但什么调用 `main` 函数本身呢?从下面的 `axt main` 可以看出,它是由 `entry0` 调用的(关于 `entry0` 的学习我就不说了,留待读者练习)。 + +``` +[0x004004b0]> axt sym.adder +main 0x4005b9 [CALL] call sym.adder +[0x004004b0]> +[0x004004b0]> axt main +entry0 0x4004d1 [DATA] mov rdi, main +[0x004004b0]> +``` + +### 寻找定位 + +在处理文本文件时,你经常通过引用行号和行或列号在文件内移动;在二进制文件中,你需要使用地址。这些是以 `0x` 开头的十六进制数字,后面跟着一个地址。要找到你在二进制中的位置,运行 `s` 命令。要移动到不同的位置,使用 `s` 命令,后面跟上地址。 + +函数名就像标签一样,内部用地址表示。如果函数名在二进制中(未剥离的),可以使用函数名后面的 `s` 命令跳转到一个特定的函数地址。同样,如果你想跳转到二进制的开始,输入 `s 0`: + +``` +[0x004004b0]> s +0x4004b0 +[0x004004b0]> +[0x004004b0]> s main +[0x004005a5]> +[0x004005a5]> s +0x4005a5 +[0x004005a5]> +[0x004005a5]> s sym.adder +[0x00400596]> +[0x00400596]> s +0x400596 +[0x00400596]> +[0x00400596]> s 0 +[0x00000000]> +[0x00000000]> s +0x0 +[0x00000000]> +``` + +### 十六进制视图 + +通常情况下,原始二进制没有意义。在十六进制模式下查看二进制及其等效的 ASCII 表示法会有帮助: + +``` +[0x004004b0]> s main +[0x004005a5]> +[0x004005a5]> px +- offset -   0 1  2 3  4 5  6 7  8 9  A B  C D  E F  0123456789ABCDEF +0x004005a5  5548 89e5 4883 ec10 c745 fc64 0000 008b  UH..H....E.d.... +0x004005b5  45fc 89c7 e8d8 ffff ff89 45f8 8b45 f889  E.........E..E.. +0x004005c5  c6bf 7806 4000 b800 0000 00e8 cbfe ffff  ..x.@........... +0x004005d5  b800 0000 00c9 c30f 1f40 00f3 0f1e fa41  .........@.....A +0x004005e5  5749 89d7 4156 4989 f641 5541 89fd 4154  WI..AVI..AUA..AT +0x004005f5  4c8d 2504 0820 0055 488d 2d04 0820 0053  L.%.. .UH.-.. .S +0x00400605  4c29 e548 83ec 08e8 57fe ffff 48c1 fd03  L).H....W...H... +0x00400615  741f 31db 0f1f 8000 0000 004c 89fa 4c89  t.1........L..L. +0x00400625  f644 89ef 41ff 14dc 4883 c301 4839 dd75  .D..A...H...H9.u +0x00400635  ea48 83c4 085b 5d41 5c41 5d41 5e41 5fc3  .H...[]A\A]A^A_. +0x00400645  9066 2e0f 1f84 0000 0000 00f3 0f1e fac3  .f.............. +0x00400655  0000 00f3 0f1e fa48 83ec 0848 83c4 08c3  .......H...H.... +0x00400665  0000 0001 0002 0000 0000 0000 0000 0000  ................ +0x00400675  0000 004e 756d 6265 7220 6e6f 7720 6973  ...Number now is +0x00400685  2020 3a20 2564 0a00 0000 0001 1b03 3b44    : %d........;D +0x00400695  0000 0007 0000 0000 feff ff88 0000 0020  ............... +[0x004005a5]> +``` + +### 反汇编 + +如果你使用的是编译后的二进制文件,则无法查看源代码。编译器将源代码转译成 CPU 可以理解和执行的机器语言指令;其结果就是二进制或可执行文件。然而,你可以查看汇编指令(的助记词)来理解程序正在做什么。例如,如果你想查看 `main` 函数在做什么,你可以使用 `s main` 寻找 `main` 函数的地址,然后运行 `pdf` 命令来查看反汇编的指令。 + +要理解汇编指令,你需要参考体系结构手册(这里是 x86),它的应用二进制接口(ABI,或调用惯例),并对堆栈的工作原理有基本的了解: + +``` +[0x004004b0]> s main +[0x004005a5]> +[0x004005a5]> s +0x4005a5 +[0x004005a5]> +[0x004005a5]> pdf +            ; DATA XREF from entry0 @ 0x4004d1 +┌ 55: int main (int argc, char **argv, char **envp); +│           ; var int64_t var_8h @ rbp-0x8 +│           ; var int64_t var_4h @ rbp-0x4 +│           0x004005a5      55             push rbp +│           0x004005a6      4889e5         mov rbp, rsp +│           0x004005a9      4883ec10       sub rsp, 0x10 +│           0x004005ad      c745fc640000.  mov dword [var_4h], 0x64    ; 'd' ; 100 +│           0x004005b4      8b45fc         mov eax, dword [var_4h] +│           0x004005b7      89c7           mov edi, eax +│           0x004005b9      e8d8ffffff     call sym.adder +│           0x004005be      8945f8         mov dword [var_8h], eax +│           0x004005c1      8b45f8         mov eax, dword [var_8h] +│           0x004005c4      89c6           mov esi, eax +│           0x004005c6      bf78064000     mov edi, str.Number_now_is__:__d ; 0x400678 ; "Number now is  : %d\n" ; const char *format +│           0x004005cb      b800000000     mov eax, 0 +│           0x004005d0      e8cbfeffff     call sym.imp.printf         ; int printf(const char *format) +│           0x004005d5      b800000000     mov eax, 0 +│           0x004005da      c9             leave +└           0x004005db      c3             ret +[0x004005a5]> +``` + +这是 `adder` 函数的反汇编结果: + +``` +[0x004005a5]> s sym.adder +[0x00400596]> +[0x00400596]> s +0x400596 +[0x00400596]> +[0x00400596]> pdf +            ; CALL XREF from main @ 0x4005b9 +┌ 15: sym.adder (int64_t arg1); +│           ; var int64_t var_4h @ rbp-0x4 +│           ; arg int64_t arg1 @ rdi +│           0x00400596      55             push rbp +│           0x00400597      4889e5         mov rbp, rsp +│           0x0040059a      897dfc         mov dword [var_4h], edi     ; arg1 +│           0x0040059d      8b45fc         mov eax, dword [var_4h] +│           0x004005a0      83c001         add eax, 1 +│           0x004005a3      5d             pop rbp +└           0x004005a4      c3             ret +[0x00400596]> +``` + +### 字符串 + +查看二进制中存在哪些字符串可以作为二进制分析的起点。字符串是硬编码到二进制中的,通常会提供重要的提示,可以让你将重点转移到分析某些区域。在二进制中运行 `iz` 命令来列出所有的字符串。这个测试二进制中只有一个硬编码的字符串: + +``` +[0x004004b0]> iz +[Strings] +nth paddr      vaddr      len size section type  string +――――――――――――――――――――――――――――――――――――――――――――――――――――――― +0   0x00000678 0x00400678 20  21   .rodata ascii Number now is  : %d\n + +[0x004004b0]> +``` + +### 交叉引用字符串 + +和函数一样,你可以交叉引用字符串,看看它们是从哪里被打印出来的,并理解它们周围的代码: + +``` +[0x004004b0]> ps @ 0x400678 +Number now is  : %d + +[0x004004b0]> +[0x004004b0]> axt 0x400678 +main 0x4005c6 [DATA] mov edi, str.Number_now_is__:__d +[0x004004b0]> +``` + +### 可视模式 + +当你的代码很复杂,有多个函数被调用时,很容易迷失方向。如果能以图形或可视化的方式查看哪些函数被调用,根据某些条件采取了哪些路径等,会很有帮助。在移动到感兴趣的函数后,可以通过 `VV` 命令来探索 `r2` 的可视化模式。例如,对于 `adder` 函数: + +``` +[0x004004b0]> s sym.adder +[0x00400596]> +[0x00400596]> VV +``` + +![Radare2 Visual mode][8] + +*(Gaurav Kamathe, [CC BY-SA 4.0][9])* + +### 调试器 + +到目前为止,你一直在做的是静态分析 —— 你只是在看二进制文件中的东西,而没有运行它,有时你需要执行二进制文件,并在运行时分析内存中的各种信息。`r2` 的内部调试器允许你运行二进制文件、设置断点、分析变量的值、或者转储寄存器的内容。 + +用 `-d` 标志启动调试器,并在加载二进制时添加 `-A` 标志进行分析。你可以通过使用 `db ` 命令在不同的地方设置断点,比如函数或内存地址。要查看现有的断点,使用 `dbi` 命令。一旦你放置了断点,使用 `dc` 命令开始运行二进制文件。你可以使用 `dbt` 命令查看堆栈,它可以显示函数调用。最后,你可以使用 `drr` 命令转储寄存器的内容: + +``` +$ r2 -d -A ./adder +Process with PID 17453 started... += attach 17453 17453 +bin.baddr 0x00400000 +Using 0x400000 +asm.bits 64 +[x] Analyze all flags starting with sym. and entry0 (aa) +[x] Analyze function calls (aac) +[x] Analyze len bytes of instructions for references (aar) +[x] Check for vtables +[x] Type matching analysis for all functions (aaft) +[x] Propagate noreturn information +[x] Use -AA or aaaa to perform additional experimental analysis. + -- git checkout hamster +[0x7f77b0a28030]> +[0x7f77b0a28030]> db main +[0x7f77b0a28030]> +[0x7f77b0a28030]> db sym.adder +[0x7f77b0a28030]> +[0x7f77b0a28030]> dbi +0 0x004005a5 E:1 T:0 +1 0x00400596 E:1 T:0 +[0x7f77b0a28030]> +[0x7f77b0a28030]> afl | grep main +0x004005a5    1 55           main +[0x7f77b0a28030]> +[0x7f77b0a28030]> afl | grep sym.adder +0x00400596    1 15           sym.adder +[0x7f77b0a28030]> +[0x7f77b0a28030]> dc +hit breakpoint at: 0x4005a5 +[0x004005a5]> +[0x004005a5]> dbt +0  0x4005a5           sp: 0x0                 0    [main]  main sym.adder+15 +1  0x7f77b0687873     sp: 0x7ffe35ff6858      0    [??]  section..gnu.build.attributes-1345820597 +2  0x7f77b0a36e0a     sp: 0x7ffe35ff68e8      144  [??]  map.usr_lib64_ld_2.28.so.r_x+65034 +[0x004005a5]> dc +hit breakpoint at: 0x400596 +[0x00400596]> dbt +0  0x400596           sp: 0x0                 0    [sym.adder]  rip entry.init0+6 +1  0x4005be           sp: 0x7ffe35ff6838      0    [main]  main+25 +2  0x7f77b0687873     sp: 0x7ffe35ff6858      32   [??]  section..gnu.build.attributes-1345820597 +3  0x7f77b0a36e0a     sp: 0x7ffe35ff68e8      144  [??]  map.usr_lib64_ld_2.28.so.r_x+65034 +[0x00400596]> +[0x00400596]> +[0x00400596]> dr +rax = 0x00000064 +rbx = 0x00000000 +rcx = 0x7f77b0a21738 +rdx = 0x7ffe35ff6948 +r8 = 0x7f77b0a22da0 +r9 = 0x7f77b0a22da0 +r10 = 0x0000000f +r11 = 0x00000002 +r12 = 0x004004b0 +r13 = 0x7ffe35ff6930 +r14 = 0x00000000 +r15 = 0x00000000 +rsi = 0x7ffe35ff6938 +rdi = 0x00000064 +rsp = 0x7ffe35ff6838 +rbp = 0x7ffe35ff6850 +rip = 0x00400596 +rflags = 0x00000202 +orax = 0xffffffffffffffff +[0x00400596]> +``` + +### 反编译器 + +能够理解汇编是二进制分析的前提。汇编语言总是与二进制建立和预期运行的架构相关。一行源代码和汇编代码之间从来没有 1:1 的映射。通常,一行 C 源代码会产生多行汇编代码。所以,逐行读取汇编代码并不是最佳的选择。 + +这就是反编译器的作用。它们试图根据汇编指令重建可能的源代码。这与用于创建二进制的源代码绝不完全相同,它是基于汇编的源代码的近似表示。另外,要考虑到编译器进行的优化,它会生成不同的汇编代码以加快速度,减小二进制的大小等,会使反编译器的工作更加困难。另外,恶意软件作者经常故意混淆代码,让恶意软件的分析人员望而却步。 + +Radare2 通过插件提供反编译器。你可以安装任何 Radare2 支持的反编译器。使用 `r2pm -l` 命令可以查看当前插件。使用 `r2pm install` 命令来安装一个示例的反编译器 `r2dec`: + +``` +$ r2pm  -l +$ +$ r2pm install r2dec +Cloning into 'r2dec'... +remote: Enumerating objects: 100, done. +remote: Counting objects: 100% (100/100), done. +remote: Compressing objects: 100% (97/97), done. +remote: Total 100 (delta 18), reused 27 (delta 1), pack-reused 0 +Receiving objects: 100% (100/100), 1.01 MiB | 1.31 MiB/s, done. +Resolving deltas: 100% (18/18), done. +Install Done For r2dec +gmake: Entering directory '/root/.local/share/radare2/r2pm/git/r2dec/p' +[CC] duktape/duktape.o +[CC] duktape/duk_console.o +[CC] core_pdd.o +[CC] core_pdd.so +gmake: Leaving directory '/root/.local/share/radare2/r2pm/git/r2dec/p' +$ +$ r2pm  -l +r2dec +$ +``` + +### 反编译器视图 + +要反编译一个二进制文件,在 `r2` 中加载二进制文件并自动分析它。在本例中,使用 `s sym.adder` 命令移动到感兴趣的 `adder` 函数,然后使用 `pdda` 命令并排查看汇编和反编译后的源代码。阅读这个反编译后的源代码往往比逐行阅读汇编更容易: + +``` +$ r2 -A ./adder +[x] Analyze all flags starting with sym. and entry0 (aa) +[x] Analyze function calls (aac) +[x] Analyze len bytes of instructions for references (aar) +[x] Check for vtables +[x] Type matching analysis for all functions (aaft) +[x] Propagate noreturn information +[x] Use -AA or aaaa to perform additional experimental analysis. + -- What do you want to debug today? +[0x004004b0]> +[0x004004b0]> s sym.adder +[0x00400596]> +[0x00400596]> s +0x400596 +[0x00400596]> +[0x00400596]> pdda +    ; assembly                               | /* r2dec pseudo code output */ +                                             | /* ./adder @ 0x400596 */ +                                             | #include <stdint.h> +                                             |   +    ; (fcn) sym.adder ()                     | int32_t adder (int64_t arg1) { +                                             |     int64_t var_4h; +                                             |     rdi = arg1; +    0x00400596 push rbp                      |     +    0x00400597 mov rbp, rsp                  |     +    0x0040059a mov dword [rbp - 4], edi      |     *((rbp - 4)) = edi; +    0x0040059d mov eax, dword [rbp - 4]      |     eax = *((rbp - 4)); +    0x004005a0 add eax, 1                    |     eax++; +    0x004005a3 pop rbp                       |     +    0x004005a4 ret                           |     return eax; +                                             | } +[0x00400596]> +``` + +### 配置设置 + +随着你对 Radare2 的使用越来越熟悉,你会想改变它的配置,以适应你的工作方式。你可以使用 `e` 命令查看 `r2` 的默认配置。要设置一个特定的配置,在 `e` 命令后面添加 `config = value`: + +``` +[0x004005a5]> e | wc -l +593 +[0x004005a5]> e | grep syntax +asm.syntax = intel +[0x004005a5]> +[0x004005a5]> e asm.syntax = att +[0x004005a5]> +[0x004005a5]> e | grep syntax +asm.syntax = att +[0x004005a5]> +``` + +要使配置更改永久化,请将它们放在 `r2` 启动时读取的名为 `.radare2rc` 的启动文件中。这个文件通常在你的主目录下,如果没有,你可以创建一个。一些示例配置选项包括: + +``` +$ cat ~/.radare2rc +e asm.syntax = att +e scr.utf8 = true +eco solarized +e cmd.stack = true +e stack.size = 256 +$ +``` + +### 探索更多 + +你已经看到了足够多的 Radare2 功能,对这个工具有了一定的了解。因为 Radare2 遵循 Unix 哲学,即使你可以从它的主控台做各种事情,它也会在下面使用一套独立的二进制来完成它的任务。 + +探索下面列出的独立二进制文件,看看它们是如何工作的。例如,用 `iI` 命令在控制台看到的二进制信息也可以用 `rabin2 ` 命令找到: + +``` +$ cd bin/ +$ +$ ls +prefix  r2agent    r2pm  rabin2   radiff2  ragg2    rarun2   rasm2 +r2      r2-indent  r2r   radare2  rafind2  rahash2  rasign2  rax2 +$ +``` + +你觉得 Radare2 怎么样?请在评论中分享你的反馈。 + +-------------------------------------------------------------------------------- + +via: https://opensource.com/article/21/1/linux-radare2 + +作者:[Gaurav Kamathe][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/gkamathe +[b]: https://github.com/lujun9972 +[1]: https://opensource.com/sites/default/files/styles/image-full-size/public/lead-images/binary_code_computer_screen.png?itok=7IzHK1nn (Binary code on a computer screen) +[2]: https://linux.cn/article-12187-1.html +[3]: https://linux.cn/article-11441-1.html +[4]: https://rada.re/n/ +[5]: https://github.com/radareorg/radare2 +[6]: https://opensource.com/article/19/3/getting-started-vim +[7]: https://ghidra-sre.org/ +[8]: https://opensource.com/sites/default/files/uploads/radare2_visual-mode_0.png (Radare2 Visual mode) +[9]: https://creativecommons.org/licenses/by-sa/4.0/ diff --git a/published/202102/20210125 Use Joplin to find your notes faster.md b/published/202102/20210125 Use Joplin to find your notes faster.md new file mode 100644 index 0000000000..13e6be8bdf --- /dev/null +++ b/published/202102/20210125 Use Joplin to find your notes faster.md @@ -0,0 +1,63 @@ +[#]: collector: (lujun9972) +[#]: translator: (geekpi) +[#]: reviewer: (wxy) +[#]: publisher: (wxy) +[#]: url: (https://linux.cn/article-13080-1.html) +[#]: subject: (Use Joplin to find your notes faster) +[#]: via: (https://opensource.com/article/21/1/notes-joplin) +[#]: author: (Kevin Sonney https://opensource.com/users/ksonney) + +使用 Joplin 更快地找到你的笔记 +====== + +> 在多个手写和数字平台上整理笔记是一个严峻的挑战。这里有一个小技巧,可以更好地组织你的笔记,并快速找到你需要的东西。 + +![](https://img.linux.net.cn/data/attachment/album/202102/03/120141dkiqil1vlqiz6wql.jpg) + +在前几年,这个年度系列涵盖了单个的应用。今年,我们除了关注 2021 年的策略外,还将关注一体化解决方案。欢迎来到 2021 年 21 天生产力的第十五天。 + +保持生产力也意味着(在某种程度上)要有足够的组织能力,以便找到笔记并在需要时参考它们。这不仅是对我自己的挑战,也是与我交谈的很多人的挑战。 + +多年来,我在应用中单独或使用数字笔记、纸质笔记、便签、数字便签、Word 文档、纯文本文件以及一堆我忘记的其他格式的组合。这不仅让寻找笔记变得困难,而且知道把它们放在哪里是一个更大的挑战。 + +![Stacks of paper notes on a desk][2] + +*一堆笔记 (Jessica Cherry, [CC BY-SA 4.0][3])* + +还有就是做笔记最重要的一点:如果你以后找不到它,笔记就没有任何价值。知道含有你所需信息的笔记存在于你保存笔记的*某处*,根本没有任何帮助。 + +我是如何为自己解决这个问题的呢?正如他们所说,这是一个过程,我希望这也是一个对其他人有效的过程。 + +我首先看了看自己所做的笔记种类。不同的主题需要用不同的方式保存吗?由于我为我的播客手写笔记,而几乎所有其他的东西都使用纯文本笔记,我需要两种不同的方式来维护它们。对于手写的笔记,我把它们都放在一个文件夹里,方便我参考。 + +![Man holding a binder full of notes][4] + +*三年多的笔记 (Kevin Sonney, [CC BY-SA 4.0][3])* + +为了保存我的数字笔记,我需要将它们全部集中到一个地方。这个工具需要能够从多种设备上访问,具有有用的搜索功能,并且能够导出或共享我的笔记。在尝试了很多很多不同的选项之后,我选择了 [Joplin][5]。Joplin 可以让我用 Markdown 写笔记,有一个相当不错的搜索功能,有适用于所有操作系统(包括手机)的应用,并支持几种不同的设备同步方式。另外,它还有文件夹*和*标签,因此我可以按照对我有意义的方式将笔记分组。 + +![Organized Joplin notes management page][6] + +*我的 Joplin* + +我花了一些时间才把所有的东西都放在我想要的地方,但最后,这真的是值得的。现在,我可以找到我所做的笔记,而不是让它们散落在我的办公室、不同的机器和各种服务中。 + +-------------------------------------------------------------------------------- + +via: https://opensource.com/article/21/1/notes-joplin + +作者:[Kevin Sonney][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/ksonney +[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://opensource.com/sites/default/files/day15-image1.jpg +[3]: https://creativecommons.org/licenses/by-sa/4.0/ +[4]: https://opensource.com/sites/default/files/day15-image2.png +[5]: https://joplinapp.org/ +[6]: https://opensource.com/sites/default/files/day15-image3.png diff --git a/published/202102/20210125 Why you need to drop ifconfig for ip.md b/published/202102/20210125 Why you need to drop ifconfig for ip.md new file mode 100644 index 0000000000..c4370c6f6d --- /dev/null +++ b/published/202102/20210125 Why you need to drop ifconfig for ip.md @@ -0,0 +1,201 @@ +[#]: collector: "lujun9972" +[#]: translator: "MjSeven" +[#]: reviewer: "wxy" +[#]: publisher: "wxy" +[#]: url: "https://linux.cn/article-13089-1.html" +[#]: subject: "Why you need to drop ifconfig for ip" +[#]: via: "https://opensource.com/article/21/1/ifconfig-ip-linux" +[#]: author: "Rajan Bhardwaj https://opensource.com/users/rajabhar" + +放弃 ifconfig,拥抱 ip 命令 +====== + +> 开始使用现代方法配置 Linux 网络接口。 + +![](https://img.linux.net.cn/data/attachment/album/202102/05/233847lpg1lnz7kl2czgfj.jpg) + +在很长一段时间内,`ifconfig` 命令是配置网络接口的默认方法。它为 Linux 用户提供了很好的服务,但是网络很复杂,所以配置网络的命令必须健壮。`ip` 命令是现代系统中新的默认网络命令,在本文中,我将向你展示如何使用它。 + +`ip` 命令工作在 [OSI 网络栈][2] 的两个层上:第二层(数据链路层)和第三层(网络 或 IP)层。它做了之前 `net-tools` 包的所有工作。 + +### 安装 ip + +`ip` 命令包含在 `iproute2util` 包中,它可能已经在你的 Linux 发行版中安装了。如果没有,你可以从发行版的仓库中进行安装。 + +### ifconfig 和 ip 使用对比 + +`ip` 和 `ifconfig` 命令都可以用来配置网络接口,但它们做事方法不同。接下来,作为对比,我将用它们来执行一些常见的任务。 + +#### 查看网口和 IP 地址 + +如果你想查看主机的 IP 地址或网络接口信息,`ifconfig` (不带任何参数)命令提供了一个很好的总结。 + +``` +$ ifconfig + +eth0: flags=4099 mtu 1500 + ether bc:ee:7b:5e:7d:d8 txqueuelen 1000 (Ethernet) + RX packets 0 bytes 0 (0.0 B) + RX errors 0 dropped 0 overruns 0 frame 0 + TX packets 0 bytes 0 (0.0 B) + TX errors 0 dropped 0 overruns 0 carrier 0 collisions 0 + +lo: flags=73 mtu 65536 + inet 127.0.0.1 netmask 255.0.0.0 + inet6 ::1 prefixlen 128 scopeid 0x10 + loop txqueuelen 1000 (Local Loopback) + RX packets 41 bytes 5551 (5.4 KiB) + RX errors 0 dropped 0 overruns 0 frame 0 + TX packets 41 bytes 5551 (5.4 KiB) + TX errors 0 dropped 0 overruns 0 carrier 0 collisions 0 + +wlan0: flags=4163 mtu 1500 + inet 10.1.1.6 netmask 255.255.255.224 broadcast 10.1.1.31 + inet6 fdb4:f58e:49f:4900:d46d:146b:b16:7212 prefixlen 64 scopeid 0x0 + inet6 fe80::8eb3:4bc0:7cbb:59e8 prefixlen 64 scopeid 0x20 + ether 08:71:90:81:1e:b5 txqueuelen 1000 (Ethernet) + RX packets 569459 bytes 779147444 (743.0 MiB) + RX errors 0 dropped 0 overruns 0 frame 0 + TX packets 302882 bytes 38131213 (36.3 MiB) + TX errors 0 dropped 0 overruns 0 carrier 0 collisions 0 +``` + +新的 `ip` 命令提供了类似的结果,但命令是 `ip address show`,或者简写为 `ip a`: + +``` +$ ip a + +1: lo: mtu 65536 qdisc noqueue state UNKNOWN group default qlen 1000 + link/loopback 00:00:00:00:00:00 brd 00:00:00:00:00:00 + inet 127.0.0.1/8 scope host lo + valid_lft forever preferred_lft forever + inet6 ::1/128 scope host + valid_lft forever preferred_lft forever +2: eth0: mtu 1500 qdisc pfifo_fast state DOWN group default qlen 1000 + link/ether bc:ee:7b:5e:7d:d8 brd ff:ff:ff:ff:ff:ff +3: wlan0: mtu 1500 qdisc noqueue state UP group default qlen 1000 + link/ether 08:71:90:81:1e:b5 brd ff:ff:ff:ff:ff:ff + inet 10.1.1.6/27 brd 10.1.1.31 scope global dynamic wlan0 + valid_lft 83490sec preferred_lft 83490sec + inet6 fdb4:f58e:49f:4900:d46d:146b:b16:7212/64 scope global noprefixroute dynamic + valid_lft 6909sec preferred_lft 3309sec + inet6 fe80::8eb3:4bc0:7cbb:59e8/64 scope link + valid_lft forever preferred_lft forever +``` + +#### 添加 IP 地址 + +使用 `ifconfig` 命令添加 IP 地址命令为: + +``` +$ ifconfig eth0 add 192.9.203.21 +``` + +`ip` 类似: + +``` +$ ip address add 192.9.203.21 dev eth0 +``` + +`ip` 中的子命令可以缩短,所以下面这个命令同样有效: + +``` +$ ip addr add 192.9.203.21 dev eth0 +``` + +你甚至可以更短些: + +``` +$ ip a add 192.9.203.21 dev eth0 +``` + +#### 移除一个 IP 地址 + +添加 IP 地址与删除 IP 地址正好相反。 + +使用 `ifconfig`,命令是: + +``` +$ ifconfig eth0 del 192.9.203.21 +``` + +`ip` 命令的语法是: + +``` +$ ip a del 192.9.203.21 dev eth0 +``` + +#### 启用或禁用组播 + +使用 `ifconfig` 接口来启用或禁用 [组播][3]multicast: + +``` +# ifconfig eth0 multicast +``` + +对于 `ip`,使用 `set` 子命令与设备(`dev`)以及一个布尔值和 `multicast` 选项: + +``` +# ip link set dev eth0 multicast on +``` + +#### 启用或禁用网络 + +每个系统管理员都熟悉“先关闭,然后打开”这个技巧来解决问题。对于网络接口来说,即打开或关闭网络。 + +`ifconfig` 命令使用 `up` 或 `down` 关键字来实现: + +``` +# ifconfig eth0 up +``` + +或者你可以使用一个专用命令: + +``` +# ifup eth0 +``` + +`ip` 命令使用 `set` 子命令将网络设置为 `up` 或 `down` 状态: + +``` +# ip link set eth0 up +``` + +#### 开启或关闭地址解析功能(ARP) + +使用 `ifconfig`,你可以通过声明它来启用: + +``` +# ifconfig eth0 arp +``` + +使用 `ip`,你可以将 `arp` 属性设置为 `on` 或 `off`: + +``` +# ip link set dev eth0 arp on +``` + +### ip 和 ipconfig 的优缺点 + +`ip` 命令比 `ifconfig` 更通用,技术上也更有效,因为它使用的是 `Netlink` 套接字,而不是 `ioctl` 系统调用。 + +`ip` 命令可能看起来比 `ifconfig` 更详细、更复杂,但这是它拥有更多功能的一个原因。一旦你开始使用它,你会了解它的内部逻辑(例如,使用 `set` 而不是看起来随意混合的声明或设置)。 + +最后,`ifconfig` 已经过时了(例如,它缺乏对网络命名空间的支持),而 `ip` 是为现代网络而生的。尝试并学习它,使用它,你会由衷高兴的! + +-------------------------------------------------------------------------------- + +via: https://opensource.com/article/21/1/ifconfig-ip-linux + +作者:[Rajan Bhardwaj][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/rajabhar +[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://en.wikipedia.org/wiki/OSI_model +[3]: https://en.wikipedia.org/wiki/Multicast diff --git a/published/202102/20210126 Use your Raspberry Pi as a productivity powerhouse.md b/published/202102/20210126 Use your Raspberry Pi as a productivity powerhouse.md new file mode 100644 index 0000000000..d7deca1036 --- /dev/null +++ b/published/202102/20210126 Use your Raspberry Pi as a productivity powerhouse.md @@ -0,0 +1,75 @@ +[#]: collector: (lujun9972) +[#]: translator: (geekpi) +[#]: reviewer: (wxy) +[#]: publisher: (wxy) +[#]: url: (https://linux.cn/article-13084-1.html) +[#]: subject: (Use your Raspberry Pi as a productivity powerhouse) +[#]: via: (https://opensource.com/article/21/1/raspberry-pi-productivity) +[#]: author: (Kevin Sonney https://opensource.com/users/ksonney) + +将你的树莓派用作生产力源泉 +====== + +> 树莓派已经从主要为黑客和业余爱好者服务,成为了小型生产力工作站的可靠选择。 + +![](https://img.linux.net.cn/data/attachment/album/202102/04/103826pjbxb7j1m8ok6ezf.jpg) + +在前几年,这个年度系列涵盖了单个的应用。今年,我们除了关注 2021 年的策略外,还将关注一体化解决方案。欢迎来到 2021 年 21 天生产力的第十六天。 + +[树莓派][2]是一台相当棒的小电脑。它体积小,功能却出奇的强大,而且非常容易设置和使用。我曾将它们用于家庭自动化项目、面板和专用媒体播放器。但它也能成为生产力的动力源泉么? + +答案相当简单:是的。 + +![Geary and Calendar apps on the Raspberry Pi][3] + +*Geary 和 Calendar 应用 (Kevin Sonney, [CC BY-SA 4.0][4])* + +基本的 [Raspbian][5] 安装包括 [Claw Mail][6],这是一个轻量级的邮件客户端。它的用户界面有点过时了,而且非常的简陋。如果你是一个 [Mutt 用户][7],它可能会满足你的需求。 + +我更喜欢安装 [Geary][8],因为它也是轻量级的,而且有一个现代化的界面。另外,与 Claws 不同的是,Geary 默认支持富文本 (HTML) 邮件。我不喜欢富文本电子邮件,但它已经成为必要的,所以对它有良好的支持是至关重要的。 + +默认的 Raspbian 安装不包含日历,所以我添加了 [GNOME 日历][9] ,因为它可以与远程服务通信(因为我的几乎所有日历都在云提供商那里)。 + +![GTG and GNote open on Raspberry Pi][10] + +*GTG 和 GNote(Kevin Sonney, [CC BY-SA 4.0][4])* + +那笔记和待办事项清单呢?有很多选择,但我喜欢用 [GNote][11] 来做笔记,用 [Getting-Things-GNOME!][12] 来做待办事项。两者都相当轻量级,并且可以相互同步,也可以同步到其他服务。 + +你会注意到,我在这里使用了不少 GNOME 应用。为什么不直接安装完整的 GNOME 桌面呢?在内存为 4Gb(或 8Gb)的树莓派 4 上,GNOME 工作得很好。你需要采取一些额外的步骤来禁用 Raspbian 上的默认 wifi 设置,并用 Network Manager 来代替它,但这个在网上有很好的文档,而且真的很简单。 + +GNOME 中包含了 [Evolution][13],它将邮件、日历、笔记、待办事项和联系人管理整合到一个应用中。与 Geary 和 GNOME Calendar 相比,它有点重,但在树莓派 4 上却很稳定。这让我很惊讶,因为我习惯了 Evolution 有点消耗资源,但树莓派 4 却和我的品牌笔记本一样运行良好,而且资源充足。 + +![Evolution on Raspbian][14] + +*Raspbian 上的 Evolution (Kevin Sonney, [CC BY-SA 4.0][4])* + +树莓派在过去的几年里进步很快,已经从主要为黑客和业余爱好者服务,成为了小型生产力工作站的可靠选择。 + +-------------------------------------------------------------------------------- + +via: https://opensource.com/article/21/1/raspberry-pi-productivity + +作者:[Kevin Sonney][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/ksonney +[b]: https://github.com/lujun9972 +[1]: https://opensource.com/sites/default/files/styles/image-full-size/public/lead-images/todo_checklist_team_metrics_report.png?itok=oB5uQbzf (Team checklist and to dos) +[2]: https://www.raspberrypi.org/ +[3]: https://opensource.com/sites/default/files/day16-image1.png +[4]: https://creativecommons.org/licenses/by-sa/4.0/ +[5]: https://www.raspbian.org/ +[6]: https://www.claws-mail.org/ +[7]: http://www.mutt.org/ +[8]: https://wiki.gnome.org/Apps/Geary +[9]: https://wiki.gnome.org/Apps/Calendar +[10]: https://opensource.com/sites/default/files/day16-image2.png +[11]: https://wiki.gnome.org/Apps/Gnote +[12]: https://wiki.gnome.org/Apps/GTG +[13]: https://opensource.com/business/18/1/desktop-email-clients +[14]: https://opensource.com/sites/default/files/day16-image3.png diff --git a/published/202102/20210126 Write GIMP scripts to make image processing faster.md b/published/202102/20210126 Write GIMP scripts to make image processing faster.md new file mode 100644 index 0000000000..4caa8357ff --- /dev/null +++ b/published/202102/20210126 Write GIMP scripts to make image processing faster.md @@ -0,0 +1,234 @@ +[#]: collector: (lujun9972) +[#]: translator: (amwps290) +[#]: reviewer: (wxy) +[#]: publisher: (wxy) +[#]: url: (https://linux.cn/article-13093-1.html) +[#]: subject: (Write GIMP scripts to make image processing faster) +[#]: via: (https://opensource.com/article/21/1/gimp-scripting) +[#]: author: (Cristiano L. Fontana https://opensource.com/users/cristianofontana) + +编写 GIMP 脚本使图像处理更快 +====== + +> 通过向一批图像添加效果来学习 GIMP 的脚本语言 Script-Fu。 + +![](https://img.linux.net.cn/data/attachment/album/202102/06/231011c0xhvxitxjv899qv.jpg) + +前一段时间,我想给方程图片加一个黑板式的外观。我开始是使用 [GIMP][2] 来处理的,我对结果很满意。问题是我必须对图像执行几个操作,当我想再次使用此样式,不想对所有图像重复这些步骤。此外,我确信我会很快忘记这些步骤。 + +![Fourier transform equations][3] + +*傅立叶变换方程式(Cristiano Fontana,[CC BY-SA 4.0] [4])* + +GIMP 是一个很棒的开源图像编辑器。尽管我已经使用了多年,但从未研究过其批处理功能或 [Script-Fu][5] 菜单。这是探索它们的绝好机会。 + +### 什么是 Script-Fu? + +[Script-Fu][6] 是 GIMP 内置的脚本语言。是一种基于 [Scheme][7] 的编程语言。如果你从未使用过 Scheme,请尝试一下,因为它可能非常有用。我认为 Script-Fu 是一个很好的入门方法,因为它对图像处理具有立竿见影的效果,所以你可以很快感觉到自己的工作效率的提高。你也可以使用 [Python][8] 编写脚本,但是 Script-Fu 是默认选项。 + +为了帮助你熟悉 Scheme,GIMP 的文档提供了深入的 [教程][9]。Scheme 是一种类似于 [Lisp][10] 的语言,因此它的主要特征是使用 [前缀][11] 表示法和 [许多括号][12]。函数和运算符通过前缀应用到操作数列表中: + +``` +(函数名 操作数 操作数 ...) + +(+ 2 3) +↳ 返回 5 + +(list 1 2 3 5) +↳ 返回一个列表,包含 1、 2、 3 和 5 +``` + +我花了一些时间才找到完整的 GIMP 函数列表文档,但实际上很简单。在 **Help** 菜单中,有一个 **Procedure Browser**,其中包含所有可用的函数的丰富详尽文档。 + +![GIMP Procedure Browser][13] + +### 使用 GIMP 的批处理模式 + +你可以使用 `-b` 选项以批处理的方式启动 GIMP。`-b` 选项的参数可以是你想要运行的脚本,或者用一个 `-` 来让 GIMP 进入交互模式而不是命令行模式。正常情况下,当你启动 GIMP 的时候,它会启动图形界面,但是你可以使用 `-i` 选项来禁用它。 + +### 开始编写你的第一个脚本 + +创建一个名为 `chalk.scm` 的文件,并把它保存在 **Preferences** 窗口中 **Folders** 选项下的 **Script** 中指定的 `script` 文件夹下。就我而言,是在 `$HOME/.config/GIMP/2.10/scripts`。 + +在 `chalk.scm` 文件中,写入下面的内容: + +``` +(define (chalk filename grow-pixels spread-amount percentage) + (let* ((image (car (gimp-file-load RUN-NONINTERACTIVE filename filename))) + (drawable (car (gimp-image-get-active-layer image))) + (new-filename (string-append "modified_" filename))) + (gimp-image-select-color image CHANNEL-OP-REPLACE drawable '(0 0 0)) + (gimp-selection-grow image grow-pixels) + (gimp-context-set-foreground '(0 0 0)) + (gimp-edit-bucket-fill drawable BUCKET-FILL-FG LAYER-MODE-NORMAL 100 255 TRUE 0 0) + (gimp-selection-none image) + (plug-in-spread RUN-NONINTERACTIVE image drawable spread-amount spread-amount) + (gimp-drawable-invert drawable TRUE) + (plug-in-randomize-hurl RUN-NONINTERACTIVE image drawable percentage 1 TRUE 0) + (gimp-file-save RUN-NONINTERACTIVE image drawable new-filename new-filename) + (gimp-image-delete image))) +``` + +### 定义脚本变量 + +在脚本中, `(define (chalk filename grow-pixels spread-amound percentage) ...)` 函数定义了一个名叫 `chalk` 的新函数。它的函数参数是 `filename`、`grow-pixels`、`spread-amound` 和 `percentage`。在 `define` 中的所有内容都是 `chalk` 函数的主体。你可能已经注意到,那些名字比较长的变量中间都有一个破折号来分割。这是类 Lisp 语言的惯用风格。 + +`(let* ...)` 函数是一个特殊过程procedure,可以让你定义一些只有在这个函数体中才有效的临时变量。临时变量有 `image`、`drawable` 以及 `new-filename`。它使用 `gimp-file-load` 来载入图片,这会返回它所包含的图片的一个列表。并通过 `car` 函数来选取第一项。然后,它选择第一个活动层并将其引用存储在 `drawable` 变量中。最后,它定义了包含图像新文件名的字符串。 + +为了帮助你更好地了解该过程,我将对其进行分解。首先,启动带 GUI 的 GIMP,然后你可以通过依次点击 **Filters → Script-Fu → Console** 来打开 Script-Fu 控制台。 在这种情况下,不能使用 `let *`,因为变量必须是持久的。使用 `define` 函数定义 `image` 变量,并为其提供查找图像的正确路径: + +``` +(define image (car (gimp-file-load RUN-NONINTERACTIVE "Fourier.png" "Fourier.png"))) +``` + +似乎在 GUI 中什么也没有发生,但是图像已加载。 你需要通过以下方式来让图像显示: + +``` +(gimp-display-new image) +``` + +![GUI with the displayed image][14] + +现在,获取活动层并将其存储在 `drawable` 变量中: + +``` +(define drawable (car (gimp-image-get-active-layer image))) +``` + +最后,定义图像的新文件名: + +``` +(define new-filename "modified_Fourier.png") +``` + +运行命令后,你将在 Script-Fu 控制台中看到以下内容: + +![Script-Fu console][15] + +在对图像执行操作之前,需要定义将在脚本中作为函数参数的变量: + +``` +(define grow-pixels 2) +(define spread-amount 4) +(define percentage 3) +``` + +### 处理图片 + +现在,所有相关变量都已定义,你可以对图像进行操作了。 脚本的操作可以直接在控制台上执行。第一步是在活动层上选择黑色。颜色被写成一个由三个数字组成的列表,即 `(list 0 0 0)` 或者是 `'(0 0 0)`: + +``` +(gimp-image-select-color image CHANNEL-OP-REPLACE drawable '(0 0 0)) +``` + +![Image with the selected color][16] + +扩大选取两个像素: + +``` +(gimp-selection-grow image grow-pixels) +``` + +![Image with the selected color][17] + +将前景色设置为黑色,并用它填充选区: + +``` +(gimp-context-set-foreground '(0 0 0)) +(gimp-edit-bucket-fill drawable BUCKET-FILL-FG LAYER-MODE-NORMAL 100 255 TRUE 0 0) +``` + +![Image with the selection filled with black][18] + +删除选区: + +``` +(gimp-selection-none image) +``` + +![Image with no selection][19] + +随机移动像素: + +``` +(plug-in-spread RUN-NONINTERACTIVE image drawable spread-amount spread-amount) +``` + +![Image with pixels moved around][20] + +反转图像颜色: + +``` +(gimp-drawable-invert drawable TRUE) +``` + +![Image with pixels moved around][21] + +随机化像素: + +``` +(plug-in-randomize-hurl RUN-NONINTERACTIVE image drawable percentage 1 TRUE 0) +``` + +![Image with pixels moved around][22] + +将图像保存到新文件: + +``` +(gimp-file-save RUN-NONINTERACTIVE image drawable new-filename new-filename) +``` + +![Equations of the Fourier transform and its inverse][23] + +*傅立叶变换方程 (Cristiano Fontana, [CC BY-SA 4.0][4])* + +### 以批处理模式运行脚本 + +现在你知道了脚本的功能,可以在批处理模式下运行它: + +``` +gimp -i -b '(chalk "Fourier.png" 2 4 3)' -b '(gimp-quit 0)' +``` + +在运行 `chalk` 函数之后,它将使用 `-b` 选项调用第二个函数 `gimp-quit` 来告诉 GIMP 退出。 + +### 了解更多 + +本教程向你展示了如何开始使用 GIMP 的内置脚本功能,并介绍了 GIMP 的 Scheme 实现:Script-Fu。如果你想继续前进,建议你查看官方文档及其[入门教程][9]。如果你不熟悉 Scheme 或 Lisp,那么一开始的语法可能有点吓人,但我还是建议你尝试一下。这可能是一个不错的惊喜。 + +-------------------------------------------------------------------------------- + +via: https://opensource.com/article/21/1/gimp-scripting + +作者:[Cristiano L. Fontana][a] +选题:[lujun9972][b] +译者:[amwps290](https://github.com/amwps290) +校对:[wxy](https://github.com/wxy) + +本文由 [LCTT](https://github.com/LCTT/TranslateProject) 原创编译,[Linux中国](https://linux.cn/) 荣誉推出 + +[a]: https://opensource.com/users/cristianofontana +[b]: https://github.com/lujun9972 +[1]: https://opensource.com/sites/default/files/styles/image-full-size/public/lead-images/painting_computer_screen_art_design_creative.png?itok=LVAeQx3_ (Painting art on a computer screen) +[2]: https://www.gimp.org/ +[3]: https://opensource.com/sites/default/files/uploads/fourier.png (Fourier transform equations) +[4]: https://creativecommons.org/licenses/by-sa/4.0/ +[5]: https://docs.gimp.org/en/gimp-filters-script-fu.html +[6]: https://docs.gimp.org/en/gimp-concepts-script-fu.html +[7]: https://en.wikipedia.org/wiki/Scheme_(programming_language) +[8]: https://docs.gimp.org/en/gimp-filters-python-fu.html +[9]: https://docs.gimp.org/en/gimp-using-script-fu-tutorial.html +[10]: https://en.wikipedia.org/wiki/Lisp_%28programming_language%29 +[11]: https://en.wikipedia.org/wiki/Polish_notation +[12]: https://xkcd.com/297/ +[13]: https://opensource.com/sites/default/files/uploads/procedure_browser.png (GIMP Procedure Browser) +[14]: https://opensource.com/sites/default/files/uploads/gui01_image.png (GUI with the displayed image) +[15]: https://opensource.com/sites/default/files/uploads/console01_variables.png (Script-Fu console) +[16]: https://opensource.com/sites/default/files/uploads/gui02_selected.png (Image with the selected color) +[17]: https://opensource.com/sites/default/files/uploads/gui03_grow.png (Image with the selected color) +[18]: https://opensource.com/sites/default/files/uploads/gui04_fill.png (Image with the selection filled with black) +[19]: https://opensource.com/sites/default/files/uploads/gui05_no_selection.png (Image with no selection) +[20]: https://opensource.com/sites/default/files/uploads/gui06_spread.png (Image with pixels moved around) +[21]: https://opensource.com/sites/default/files/uploads/gui07_invert.png (Image with pixels moved around) +[22]: https://opensource.com/sites/default/files/uploads/gui08_hurl.png (Image with pixels moved around) +[23]: https://opensource.com/sites/default/files/uploads/modified_fourier.png (Equations of the Fourier transform and its inverse) diff --git a/published/202102/20210127 3 email mistakes and how to avoid them.md b/published/202102/20210127 3 email mistakes and how to avoid them.md new file mode 100644 index 0000000000..4e0b3c8cc9 --- /dev/null +++ b/published/202102/20210127 3 email mistakes and how to avoid them.md @@ -0,0 +1,77 @@ +[#]: collector: (lujun9972) +[#]: translator: (geekpi) +[#]: reviewer: (wxy) +[#]: publisher: (wxy) +[#]: url: (https://linux.cn/article-13086-1.html) +[#]: subject: (3 email mistakes and how to avoid them) +[#]: via: (https://opensource.com/article/21/1/email-mistakes) +[#]: author: (Kevin Sonney https://opensource.com/users/ksonney) + +3 个电子邮件错误以及如何避免它们 +====== + +> 自动化是美好的,但也不总是那样。确保你的电子邮件自动回复和抄送配置正确,这样你就不会浪费大家的时间。 + +![](https://img.linux.net.cn/data/attachment/album/202102/05/090335a888nqn7pcolblzn.jpg) + +在前几年,这个年度系列涵盖了单个的应用。今年,我们除了关注 2021 年的策略外,还将关注一体化解决方案。欢迎来到 2021 年 21 天生产力的第十七天。 + +好了,我们已经谈到了一些我们应该对电子邮件做的事情:[不要再把它当作即时通讯工具][2]、[优先处理事情][3]、[努力达到收件箱 0 新邮件][4],以及[有效过滤][5]。但哪些事情是我们不应该做的呢? + +![Automated email reply][6] + +*你真幸运 (Kevin Sonney, [CC BY-SA 4.0][7])* + +### 1、请不要对所有事情自动回复 + +邮件列表中总有些人,他们去度假了,并设置了一个“我在度假”的自动回复信息。然而,他们没有正确地设置,所以它对列表上的每一封邮件都会回复“我在度假”,直到管理员将其屏蔽或取消订阅。 + +我们都感受到了这种痛苦,我承认过去至少有一次,我就是那个人。 + +从我的错误中吸取教训,并确保你的自动回复器或假期信息对它们将回复谁和多久回复一次有限制。 + +![An actual email with lots of CC'd recipients][8] + +*这是一封真实的电子邮件 (Kevin Sonney, [CC BY-SA 4.0][7])* + +### 2、请不要抄送给所有人 + +我们都至少做过一次。我们需要发送邮件的人员众多,因此我们只需抄送他们*所有人*。有时这是有必要的,但大多数时候,它并不是。当然,你邀请每个人在庭院吃生日蛋糕,或者你的表姐要结婚了,或者公司刚拿到一个大客户,这都是好事。如果你有邮件列表的话,请用邮件列表,如果没有的话,请给每个人密送。说真的,密送是你的朋友。 + +### 3、回复所有人不是你的朋友 + +![Reply options in Kmail][9] + +这一条与上一条是相辅相成的。我不知道有多少次看到有人向一个名单(或者是一个大群的人)发送信息,而这个信息本来是要发给一个人的。我见过这样发送的相对好的邮件,以及随之而来的纪律处分邮件。 + +认真地说,除非必须,不要使用“回复全部”按钮。即使是这样,也要确保你*真的*需要这样做。 + +有些电子邮件应用比其他应用管理得更好。Kmail,[KDE Kontact][10] 的电子邮件组件,在**回复**工具栏按钮的子菜单中,有几个不同的回复选项。你可以选择只回复给**发件人**字段中的任何实体(通常是一个人,但有时是一个邮件列表),或者回复给作者(在抄送或密送中去除每一个人),或者只回复给一个邮件列表,或者回复*所有人*(不要这样做)。看到明确列出的选项,的确可以帮助你了解谁会收到你要发送的邮件副本,这有时比你想象的更发人深省。我曾经发现,当我意识到一个评论并不一定会对一个复杂的讨论的最终目标有所帮助时,我就会把邮件的收件人改为只是作者,而不是整个列表。 + +(另外,如果你写的邮件可能会给你的 HR 或公司带来麻烦,请在点击发送之前多考虑下。—— + +希望你已经*不再*在电子邮件中这么做了。如果你认识的人是这样的呢?欢迎与他们分享。 + +-------------------------------------------------------------------------------- + +via: https://opensource.com/article/21/1/email-mistakes + +作者:[Kevin Sonney][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/ksonney +[b]: https://github.com/lujun9972 +[1]: https://opensource.com/sites/default/files/styles/image-full-size/public/lead-images/browser_screen_windows_files.png?itok=kLTeQUbY (Computer screen with files or windows open) +[2]: https://opensource.com/article/21/1/email-rules +[3]: https://opensource.com/article/21/1/prioritize-tasks +[4]: https://opensource.com/article/21/1/inbox-zero +[5]: https://opensource.com/article/21/1/email-filter +[6]: https://opensource.com/sites/default/files/day17-image1.png +[7]: https://creativecommons.org/licenses/by-sa/4.0/ +[8]: https://opensource.com/sites/default/files/day17-image2.png +[9]: https://opensource.com/sites/default/files/kmail-replies.jpg (Reply options in Kmail) +[10]: https://opensource.com/article/21/1/kde-kontact diff --git a/published/202102/20210127 Why I use the D programming language for scripting.md b/published/202102/20210127 Why I use the D programming language for scripting.md new file mode 100644 index 0000000000..63618522ea --- /dev/null +++ b/published/202102/20210127 Why I use the D programming language for scripting.md @@ -0,0 +1,176 @@ +[#]: collector: (lujun9972) +[#]: translator: (geekpi) +[#]: reviewer: (wxy) +[#]: publisher: (wxy) +[#]: url: (https://linux.cn/article-13100-1.html) +[#]: subject: (Why I use the D programming language for scripting) +[#]: via: (https://opensource.com/article/21/1/d-scripting) +[#]: author: (Lawrence Aberba https://opensource.com/users/aberba) + +我为什么要用 D 语言写脚本? +====== + +> D 语言以系统编程语言而闻名,但它也是编写脚本的一个很好的选择。 + +![](https://img.linux.net.cn/data/attachment/album/202102/09/134351j4m3hrhll0h38plp.jpg) + +D 语言由于其静态类型和元编程能力,经常被宣传为系统编程语言。然而,它也是一种非常高效的脚本语言。 + +由于 Python 在自动化任务和快速实现原型想法方面的灵活性,它通常被选为脚本语言。这使得 Python 对系统管理员、[管理者][2]和一般的开发人员非常有吸引力,因为它可以自动完成他们可能需要手动完成的重复性任务。 + +我们自然也可以期待任何其他的脚本编写语言具有 Python 的这些特性和能力。以下是我认为 D 是一个不错的选择的两个原因。 + +### 1、D 很容易读和写 + +作为一种类似于 C 的语言,D 应该是大多数程序员所熟悉的。任何使用 JavaScript、Java、PHP 或 Python 的人对 D 语言都很容易上手。 + +如果你还没有安装 D,请[安装 D 编译器][3],这样你就可以[运行本文中的 D 代码][4]。你也可以使用[在线 D 编辑器][5]。 + +下面是一个 D 代码的例子,它从一个名为 `words.txt` 的文件中读取单词,并在命令行中打印出来: + +``` +open +source +is +cool +``` + +用 D 语言写脚本: + +``` +#!/usr/bin/env rdmd +// file print_words.d + +// import the D standard library +import std; + +void main(){ + // open the file + File("./words.txt") + + //iterate by line + .byLine + + // print each number + .each!writeln; +} +``` + +这段代码以 [释伴][6] 开头,它将使用 [rdmd][7] 来运行这段代码,`rdmd` 是 D 编译器自带的编译和运行代码的工具。假设你运行的是 Unix 或 Linux,在运行这个脚本之前,你必须使用` chmod` 命令使其可执行: + +``` +chmod u+x print_words.d +``` + +现在脚本是可执行的,你可以运行它: + +``` +./print_words.d +``` + +这将在你的命令行中打印以下内容: + +``` +open +source +is +cool +``` + +恭喜你,你写了第一个 D 语言脚本。你可以看到 D 是如何让你按顺序链式调用函数,这让阅读代码的感觉很自然,类似于你在头脑中思考问题的方式。这个[功能让 D 成为我最喜欢的编程语言][8]。 + +试着再写一个脚本:一个非营利组织的管理员有一个捐款的文本文件,每笔金额都是单独的一行。管理员想把前 10 笔捐款相加,然后打印出金额: + +``` +#!/usr/bin/env rdmd +// file sum_donations.d + +import std; + +void main() +{ + double total = 0; + + // open the file + File("monies.txt") + + // iterate by line + .byLine + + // pick first 10 lines + .take(10) + + // remove new line characters (\n) + .map!(strip) + + // convert each to double + .map!(to!double) + + // add element to total + .tee!((x) { total += x; }) + + // print each number + .each!writeln; + + // print total + writeln("total: ", total); +} +``` + +与 `each` 一起使用的 `!` 操作符是[模板参数][9]的语法。 + +### 2、D 是快速原型设计的好帮手 + +D 是灵活的,它可以快速地将代码敲打在一起,并使其发挥作用。它的标准库中包含了丰富的实用函数,用于执行常见的任务,如操作数据(JSON、CSV、文本等)。它还带有一套丰富的通用算法,用于迭代、搜索、比较和 mutate 数据。这些巧妙的算法通过定义通用的 [基于范围的接口][10] 而按照序列进行处理。 + +上面的脚本显示了 D 中的链式调用函数如何提供顺序处理和操作数据的要领。D 的另一个吸引人的地方是它不断增长的用于执行普通任务的第三方包的生态系统。一个例子是,使用 [Vibe.d][11] web 框架构建一个简单的 web 服务器很容易。下面是一个例子: + +``` +#!/usr/bin/env dub +/+ dub.sdl: +dependency "vibe-d" version="~>0.8.0" ++/ +void main() +{ + import vibe.d; + listenHTTP(":8080", (req, res) { + res.writeBody("Hello, World: " ~ req.path); + }); + runApplication(); +} +``` + +它使用官方的 D 软件包管理器 [Dub][12],从 [D 软件包仓库][13]中获取 vibe.d Web 框架。Dub 负责下载 Vibe.d 包,然后在本地主机 8080 端口上编译并启动一个 web 服务器。 + +### 尝试一下 D 语言 + +这些只是你可能想用 D 来写脚本的几个原因。 + +D 是一种非常适合开发的语言。你可以很容易从 D 下载页面安装,因此下载编译器,看看例子,并亲自体验 D 语言。 + +-------------------------------------------------------------------------------- + +via: https://opensource.com/article/21/1/d-scripting + +作者:[Lawrence Aberba][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/aberba +[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/20/3/automating-community-management-python +[3]: https://tour.dlang.org/tour/en/welcome/install-d-locally +[4]: https://tour.dlang.org/tour/en/welcome/run-d-program-locally +[5]: https://run.dlang.io/ +[6]: https://en.wikipedia.org/wiki/Shebang_(Unix) +[7]: https://dlang.org/rdmd.html +[8]: https://opensource.com/article/20/7/d-programming +[9]: http://ddili.org/ders/d.en/templates.html +[10]: http://ddili.org/ders/d.en/ranges.html +[11]: https://vibed.org +[12]: https://dub.pm/getting_started +[13]: https://code.dlang.org diff --git a/published/202102/20210128 4 tips for preventing notification fatigue.md b/published/202102/20210128 4 tips for preventing notification fatigue.md new file mode 100644 index 0000000000..843364bb91 --- /dev/null +++ b/published/202102/20210128 4 tips for preventing notification fatigue.md @@ -0,0 +1,75 @@ +[#]: collector: (lujun9972) +[#]: translator: (geekpi) +[#]: reviewer: (wxy) +[#]: publisher: (wxy) +[#]: url: (https://linux.cn/article-13094-1.html) +[#]: subject: (4 tips for preventing notification fatigue) +[#]: via: (https://opensource.com/article/21/1/alert-fatigue) +[#]: author: (Kevin Sonney https://opensource.com/users/ksonney) + +防止通知疲劳的 4 个技巧 +====== + +> 不要让提醒淹没自己:设置重要的提醒,让其它提醒消失。你会感觉更好,工作效率更高。 + +![W】(https://img.linux.net.cn/data/attachment/album/202102/06/234924mo3okotjlv7lo3yo.jpg) + +在前几年,这个年度系列涵盖了单个的应用。今年,我们除了关注 2021 年的策略外,还将关注一体化解决方案。欢迎来到 2021 年 21 天生产力的第十八天。 + +当我和人们谈论生产力时,我注意到一件事,那就是几乎每个人都是为了保持更清晰的头脑。我们不是把所有的约会都记在脑子里,而是把它们放在一个数字日历上,在事件发生前提醒我们。我们有数字或实体笔记,这样我们就不必记住某件事的每一个小细节。我们有待办事项清单,提醒我们去做该做的事情。 + +![Text box offering to send notifications][2] + +*NOPE(Kevin Sonney, [CC BY-SA 4.0][3])* + +如此多的应用、网站和服务想要提醒我们每一件小事,我们很容易就把它们全部调出来。而且,如果我们不这样做,我们将开始遭受**提醒疲劳**的困扰 —— 这时我们处于边缘的状态,只是等待下一个提醒,并生活在恐惧之中。 + +提醒疲劳在那些因工作而被随叫随到的人中非常常见。它也发生在那些 **FOMO** (错失恐惧症)的人身上,从而对每一个关键词、标签或在社交媒体上提到他们感兴趣的事情都会设置提醒。 + +此时,设置能引起我们的注意,但不会被忽略的提醒是件棘手的事情。不过,我确实有一些有用的提示,这样重要的提醒可能会在这个忙碌的世界中越过我们自己的心理过滤器。 + +![Alert for a task][4] + +*我可以忽略这个,对吧?(Kevin Sonney, [CC BY-SA 4.0][3])* + + 1. 弄清楚什么更适合你:视觉提醒或声音提醒。我使用视觉弹出和声音的组合,但这对我是有效的。有些人需要触觉提醒。比如手机或手表的震动。找到适合你的那一种。 + 2. 为重要的提醒指定独特的音调或视觉效果。我有一个朋友,他的工作页面的铃声最响亮、最讨厌。这旨在吸引他的注意力,让他看到提醒。我的显示器上有一盏灯,当我在待命时收到工作提醒时,它就会闪烁红灯,以及发送通知到我手机上。 + 3. 关掉那些实际上无关紧要的警报。社交网络、网站和应用都希望得到你的关注。它们不会在意你是否错过会议、约会迟到,或者熬夜到凌晨 4 点。关掉那些不重要的,让那些重要的可以被看到。 + 4. 每隔一段时间就改变一下。上个月有效的东西,下个月可能就不行了。我们会适应、习惯一些东西,然后我们会忽略。如果有些东西不奏效,就换个东西试试吧!它不会伤害你,即使无法解决问题,也许你也会学到一些新知识。 + +![Blue alert indicators light][5] + +*蓝色是没问题。红色是有问题。(Kevin Sonney, [CC BY-SA 4.0][3])* + +### 开源和选择 + +一个好的应用可以通知提供很多选择。我最喜欢的一个是 Android 的 Etar 日历应用。[Etar 可以从开源 F-droid 仓库中获得][6]。 + +Etar 和许多开源应用一样,为你提供了很多选项,尤其是通知设置。 + +![Etar][7] + +通过 Etar,你可以激活或停用弹出式通知,设置打盹时间、打盹延迟、是否提醒你已拒绝的事件等。结合有计划的日程安排策略,你可以通过控制数字助手对你需要做的事情进行提示的频率来改变你一天的进程。 + +提醒和警报真的很有用,只要我们收到重要的提醒并予以注意即可。这可能需要做一些实验,但最终,少一些噪音是好事,而且更容易注意到真正需要我们注意的提醒。 + +-------------------------------------------------------------------------------- + +via: https://opensource.com/article/21/1/alert-fatigue + +作者:[Kevin Sonney][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/ksonney +[b]: https://github.com/lujun9972 +[1]: https://opensource.com/sites/default/files/styles/image-full-size/public/lead-images/team_dev_email_chat_video_work_wfm_desk_520.png?itok=6YtME4Hj (Working on a team, busy worklife) +[2]: https://opensource.com/sites/default/files/day18-image1.png +[3]: https://creativecommons.org/licenses/by-sa/4.0/ +[4]: https://opensource.com/sites/default/files/day18-image2.png +[5]: https://opensource.com/sites/default/files/day18-image3.png +[6]: https://f-droid.org/en/packages/ws.xsoh.etar/ +[7]: https://opensource.com/sites/default/files/etar.jpg (Etar) diff --git a/published/202102/20210128 How to Run a Shell Script in Linux -Essentials Explained for Beginners.md b/published/202102/20210128 How to Run a Shell Script in Linux -Essentials Explained for Beginners.md new file mode 100644 index 0000000000..f2c5fd298c --- /dev/null +++ b/published/202102/20210128 How to Run a Shell Script in Linux -Essentials Explained for Beginners.md @@ -0,0 +1,168 @@ +[#]: collector: (lujun9972) +[#]: translator: (robsean) +[#]: reviewer: (wxy) +[#]: publisher: (wxy) +[#]: url: (https://linux.cn/article-13106-1.html) +[#]: subject: (How to Run a Shell Script in Linux [Essentials Explained for Beginners]) +[#]: via: (https://itsfoss.com/run-shell-script-linux/) +[#]: author: (Abhishek Prakash https://itsfoss.com/author/abhishek/) + +基础:如何在 Linux 中运行一个 Shell 脚本 +====== + +![](https://img.linux.net.cn/data/attachment/album/202102/10/235325tkv7h8dvlp4makkk.jpg) + +在 Linux 中有两种运行 shell 脚本的方法。你可以使用: + +``` +bash script.sh +``` + +或者,你可以像这样执行 shell 脚本: + +``` +./script.sh +``` + +这可能很简单,但没太多解释。不要担心,我将使用示例来进行必要的解释,以便你能理解为什么在运行一个 shell 脚本时要使用给定的特定语法格式。 + +我将使用这一行 shell 脚本来使需要解释的事情变地尽可能简单: + +``` +abhishek@itsfoss:~/Scripts$ cat hello.sh + +echo "Hello World!" +``` + +### 方法 1:通过将文件作为参数传递给 shell 以运行 shell 脚本 + +第一种方法涉及将脚本文件的名称作为参数传递给 shell 。 + +考虑到 bash 是默认 shell,你可以像这样运行一个脚本: + +``` +bash hello.sh +``` + +你知道这种方法的优点吗?**你的脚本不需要执行权限**。对于简单的任务非常方便快速。 + +![在 Linux 中运行一个 Shell 脚本][1] + +如果你还不熟悉,我建议你 [阅读我的 Linux 文件权限详细指南][2] 。 + +记住,将其作为参数传递的需要是一个 shell 脚本。一个 shell 脚本是由命令组成的。如果你使用一个普通的文本文件,它将会抱怨错误的命令。 + +![运行一个文本文件为脚本][3] + +在这种方法中,**你要明确地具体指定你想使用 bash 作为脚本的解释器** 。 + +shell 只是一个程序,并且 bash 只是 Shell 的一种实现。还有其它的 shell 程序,像 ksh 、[zsh][4] 等等。如果你安装有其它的 shell ,你也可以使用它们来代替 bash 。 + +例如,我已安装了 zsh ,并使用它来运行相同的脚本: + +![使用 Zsh 来执行 Shell 脚本][5] + +### 方法 2:通过具体指定 shell 脚本的路径来执行脚本 + +另外一种运行一个 shell 脚本的方法是通过提供它的路径。但是要这样做之前,你的文件必须是可执行的。否则,当你尝试执行脚本时,你将会得到 “权限被拒绝” 的错误。 + +因此,你首先需要确保你的脚本有可执行权限。你可以 [使用 chmod 命令][8] 来给予你自己脚本的这种权限,像这样: + +``` +chmod u+x script.sh +``` + +使你的脚本是可执行之后,你只需输入文件的名称及其绝对路径或相对路径。大多数情况下,你都在同一个目录中,因此你可以像这样使用它: + +``` +./script.sh +``` + +如果你与你的脚本不在同一个目录中,你可以具体指定脚本的绝对路径或相对路径: + +![在其它的目录中运行 Shell 脚本][9] + +在脚本前的这个 `./` 是非常重要的(当你与脚本在同一个目录中)。 + +![][10] + +为什么当你在同一个目录下,却不能使用脚本名称?这是因为你的 Linux 系统会在 `PATH` 环境变量中指定的几个目录中查找可执行的文件来运行。 + +这里是我的系统的 `PATH` 环境变量的值: + +``` +abhishek@itsfoss:~$ echo $PATH +/home/abhishek/.local/bin:/usr/local/sbin:/usr/local/bin:/usr/sbin:/usr/bin:/sbin:/bin:/usr/games:/usr/local/games:/snap/bin +``` + +这意味着在下面目录中具有可执行权限的任意文件都可以在系统的任何位置运行: + + * `/home/abhishek/.local/bin` + * `/usr/local/sbin` + * `/usr/local/bin` + * `/usr/sbin` + * `/usr/bin` + * `/sbin` + * `/bin` + * `/usr/games` + * `/usr/local/games` + * `/snap/bin` + +Linux 命令(像 `ls`、`cat` 等)的二进制文件或可执行文件都位于这些目录中的其中一个。这就是为什么你可以在你系统的任何位置通过使用命令的名称来运作这些命令的原因。看看,`ls` 命令就是位于 `/usr/bin` 目录中。 + +![][11] + +当你使用脚本而不具体指定其绝对路径或相对路径时,系统将不能在 `PATH` 环境变量中找到提及的脚本。 + +> 为什么大多数 shell 脚本在其头部包含 #! /bin/bash ? +> +> 记得我提过 shell 只是一个程序,并且有 shell 程序的不同实现。 +> +> 当你使用 `#! /bin/bash` 时,你是具体指定 bash 作为解释器来运行脚本。如果你不这样做,并且以 `./script.sh` 的方式运行一个脚本,它通常会在你正在运行的 shell 中运行。 +> +> 有问题吗?可能会有。看看,大多数的 shell 语法是大多数种类的 shell 中通用的,但是有一些语法可能会有所不同。 +> +> 例如,在 bash 和 zsh 中数组的行为是不同的。在 zsh 中,数组索引是从 1 开始的,而不是从 0 开始。 +> +>![Bash Vs Zsh][12] +> +> 使用 `#! /bin/bash` 来标识该脚本是 bash 脚本,并且应该使用 bash 作为脚本的解释器来运行,而不受在系统上正在使用的 shell 的影响。如果你使用 zsh 的特殊语法,你可以通过在脚本的第一行添加 `#! /bin/zsh` 的方式来标识其是 zsh 脚本。 +> +> 在 `#!` 和 `/bin/bash` 之间的空格是没有影响的。你也可以使用 `#!/bin/bash` 。 + +### 它有帮助吗? + +我希望这篇文章能够增加你的 Linux 知识。如果你还有问题或建议,请留下评论。 + +专家用户可能依然会挑出我遗漏的东西。但这种初级题材的问题是,要找到信息的平衡点,避免细节过多或过少,并不容易。 + +如果你对学习 bash 脚本感兴趣,在我们专注于系统管理的网站 [Linux Handbook][14] 上,我们有一个 [完整的 Bash 初学者系列][13] 。如果你想要,你也可以 [购买带有附加练习的电子书][15] ,以支持 Linux Handbook。 + +-------------------------------------------------------------------------------- + +via: https://itsfoss.com/run-shell-script-linux/ + +作者:[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://i0.wp.com/itsfoss.com/wp-content/uploads/2021/01/run-a-shell-script-linux.png?resize=741%2C329&ssl=1 +[2]: https://linuxhandbook.com/linux-file-permissions/ +[3]: https://i0.wp.com/itsfoss.com/wp-content/uploads/2021/01/running-text-file-as-script.png?resize=741%2C329&ssl=1 +[4]: https://www.zsh.org +[5]: https://i2.wp.com/itsfoss.com/wp-content/uploads/2021/01/execute-shell-script-with-zsh.png?resize=741%2C253&ssl=1 +[6]: https://i2.wp.com/itsfoss.com/wp-content/uploads/2020/09/run-multiple-commands-in-linux.png?fit=800%2C450&ssl=1 +[7]: https://itsfoss.com/run-multiple-commands-linux/ +[8]: https://linuxhandbook.com/chmod-command/ +[9]: https://i2.wp.com/itsfoss.com/wp-content/uploads/2021/01/running-shell-script-in-other-directory.png?resize=795%2C272&ssl=1 +[10]: https://i0.wp.com/itsfoss.com/wp-content/uploads/2021/01/executing-shell-scripts-linux.png?resize=800%2C450&ssl=1 +[11]: https://i0.wp.com/itsfoss.com/wp-content/uploads/2021/01/locating-command-linux.png?resize=795%2C272&ssl=1 +[12]: https://i1.wp.com/itsfoss.com/wp-content/uploads/2021/01/bash-vs-zsh.png?resize=795%2C386&ssl=1 +[13]: https://linuxhandbook.com/tag/bash-beginner/ +[14]: https://linuxhandbook.com +[15]: https://www.buymeacoffee.com/linuxhandbook diff --git a/published/202102/20210129 Manage containers with Podman Compose.md b/published/202102/20210129 Manage containers with Podman Compose.md new file mode 100644 index 0000000000..d1d3ce6286 --- /dev/null +++ b/published/202102/20210129 Manage containers with Podman Compose.md @@ -0,0 +1,174 @@ +[#]: collector: (lujun9972) +[#]: translator: (geekpi) +[#]: reviewer: (wxy) +[#]: publisher: (wxy) +[#]: url: (https://linux.cn/article-13125-1.html) +[#]: subject: (Manage containers with Podman Compose) +[#]: via: (https://fedoramagazine.org/manage-containers-with-podman-compose/) +[#]: author: (Mehdi Haghgoo https://fedoramagazine.org/author/powergame/) + +用 Podman Compose 管理容器 +====== + +![][1] + +容器很棒,让你可以将你的应用连同其依赖项一起打包,并在任何地方运行。从 2013 年的 Docker 开始,容器已经让软件开发者的生活变得更加轻松。 + +Docker 的一个缺点是它有一个中央守护进程,它以 root 用户的身份运行,这对安全有影响。但这正是 Podman 的用武之地。Podman 是一个 [无守护进程容器引擎][2],用于开发、管理和在你的 Linux 系统上以 root 或无 root 模式运行 OCI 容器。 + +下面这些文章可以用来了解更多关于 Podman 的信息: + + * [使用 Podman 以非 root 用户身份运行 Linux 容器][11] + * [在 Fedora 上使用 Podman 的 Pod][3] + * [在 Fedora 中结合权能使用 Podman][4] + +如果你使用过 Docker,你很可能也知道 Docker Compose,它是一个用于编排多个可能相互依赖的容器的工具。要了解更多关于 Docker Compose 的信息,请看它的[文档][5]。 + +### 什么是 Podman Compose? + +[Podman Compose][6] 项目的目标是作为 Docker Compose 的替代品,而不需要对 docker-compose.yaml 文件进行任何修改。由于 Podman Compose 使用吊舱pod 工作,所以最好看下“吊舱”的最新定义。 + +> 一个“吊舱pod ”(如一群鲸鱼或豌豆荚)是由一个或多个[容器][7]组成的组,具有共享的存储/网络资源,以及如何运行容器的规范。 +> +> [Pods - Kubernetes 文档][8] + +(LCTT 译注:容器技术领域大量使用了航海比喻,pod 一词,意为“豆荚”,在航海领域指“吊舱” —— 均指盛装多个物品的容器。常不翻译,考虑前后文,可译做“吊舱”。) + +Podman Compose 的基本思想是,它选中 `docker-compose.yaml` 文件里面定义的服务,为每个服务创建一个容器。Docker Compose 和 Podman Compose 的一个主要区别是,Podman Compose 将整个项目的容器添加到一个单一的吊舱中,而且所有的容器共享同一个网络。如你在例子中看到的,在创建容器时使用 `--add-host` 标志,它甚至用和 Docker Compose 一样的方式命名容器。 + +### 安装 + +Podman Compose 的完整安装说明可以在[项目页面][6]上找到,它有几种方法。要安装最新的开发版本,使用以下命令: + +``` +pip3 install https://github.com/containers/podman-compose/archive/devel.tar.gz +``` + +确保你也安装了 [Podman][9],因为你也需要它。在 Fedora 上,使用下面的命令来安装Podman: + +``` +sudo dnf install podman +``` + +### 例子:用 Podman Compose 启动一个 WordPress 网站 + +想象一下,你的 `docker-compose.yaml` 文件在一个叫 `wpsite` 的文件夹里。一个典型的 WordPress 网站的 `docker-compose.yaml` (或 `docker-compose.yml`) 文件是这样的: + +``` +version: "3.8" +services: + web: + image: wordpress + restart: always + volumes: + - wordpress:/var/www/html + ports: + - 8080:80 + environment: + WORDPRESS_DB_HOST: db + WORDPRESS_DB_USER: magazine + WORDPRESS_DB_NAME: magazine + WORDPRESS_DB_PASSWORD: 1maGazine! + WORDPRESS_TABLE_PREFIX: cz + WORDPRESS_DEBUG: 0 + depends_on: + - db + networks: + - wpnet + db: + image: mariadb:10.5 + restart: always + ports: + - 6603:3306 + + volumes: + - wpdbvol:/var/lib/mysql + + environment: + MYSQL_DATABASE: magazine + MYSQL_USER: magazine + MYSQL_PASSWORD: 1maGazine! + MYSQL_ROOT_PASSWORD: 1maGazine! + networks: + - wpnet +volumes: + wordpress: {} + wpdbvol: {} + +networks: + wpnet: {} +``` + +如果你用过 Docker,你就会知道你可运行 `docker-compose up` 来启动这些服务。Docker Compose 会创建两个名为 `wpsite_web_1` 和 `wpsite_db_1` 的容器,并将它们连接到一个名为 `wpsite_wpnet` 的网络。 + +现在,看看当你在项目目录下运行 `podman-compose up` 时会发生什么。首先,一个以执行命令的目录命名的吊舱被创建。接下来,它寻找 YAML 文件中定义的任何名称的卷,如果它们不存在,就创建卷。然后,在 YAML 文件的 `services` 部分列出的每个服务都会创建一个容器,并添加到吊舱中。 + +容器的命名与 Docker Compose 类似。例如,为你的 web 服务创建一个名为 `wpsite_web_1` 的容器。Podman Compose 还为每个命名的容器添加了 `localhost` 别名。之后,容器仍然可以通过名字互相解析,尽管它们并不像 Docker 那样在一个桥接网络上。要做到这一点,使用选项 `-add-host`。例如,`-add-host web:localhost`。 + +请注意,`docker-compose.yaml` 包含了一个从主机 8080 端口到容器 80 端口的 Web 服务的端口转发。现在你应该可以通过浏览器访问新 WordPress 实例,地址为 `http://localhost:8080`。 + +![WordPress Dashboard][10] + +### 控制 pod 和容器 + +要查看正在运行的容器,使用 `podman ps`,它可以显示 web 和数据库容器以及吊舱中的基础设施容器。 + +``` +CONTAINER ID  IMAGE                               COMMAND               CREATED      STATUS          PORTS                                         NAMES +a364a8d7cec7  docker.io/library/wordpress:latest  apache2-foregroun...  2 hours ago  Up 2 hours ago  0.0.0.0:8080-&gt;80/tcp, 0.0.0.0:6603-&gt;3306/tcp  wpsite_web_1 +c447024aa104  docker.io/library/mariadb:10.5      mysqld                2 hours ago  Up 2 hours ago  0.0.0.0:8080-&gt;80/tcp, 0.0.0.0:6603-&gt;3306/tcp  wpsite_db_1 +12b1e3418e3e  k8s.gcr.io/pause:3.2 +``` + +你也可以验证 Podman 已经为这个项目创建了一个吊舱,以你执行命令的文件夹命名。 + +``` +POD ID        NAME             STATUS    CREATED      INFRA ID      # OF CONTAINERS +8a08a3a7773e  wpsite           Degraded  2 hours ago  12b1e3418e3e  3 +``` + +要停止容器,在另一个命令窗口中输入以下命令: + +``` +podman-compose down +``` + +你也可以通过停止和删除吊舱来实现。这实质上是停止并移除所有的容器,然后再删除包含的吊舱。所以,同样的事情也可以通过这些命令来实现: + +``` +podman pod stop podname +podman pod rm podname +``` + +请注意,这不会删除你在 `docker-compose.yaml` 中定义的卷。所以,你的 WordPress 网站的状态被保存下来了,你可以通过运行这个命令来恢复它。 + +``` +podman-compose up +``` + +总之,如果你是一个 Podman 粉丝,并且用 Podman 做容器工作,你可以使用 Podman Compose 来管理你的开发和生产中的容器。 + +-------------------------------------------------------------------------------- + +via: https://fedoramagazine.org/manage-containers-with-podman-compose/ + +作者:[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/2021/01/podman-compose-1-816x345.jpg +[2]: https://podman.io +[3]: https://fedoramagazine.org/podman-pods-fedora-containers/ +[4]: https://linux.cn/article-12859-1.html +[5]: https://docs.docker.com/compose/ +[6]: https://github.com/containers/podman-compose +[7]: https://kubernetes.io/docs/concepts/containers/ +[8]: https://kubernetes.io/docs/concepts/workloads/pods/ +[9]: https://podman.io/getting-started/installation +[10]: https://fedoramagazine.org/wp-content/uploads/2021/01/Screenshot-from-2021-01-08-06-27-29-1024x767.png +[11]: https://linux.cn/article-10156-1.html \ No newline at end of file diff --git a/published/202102/20210131 3 wishes for open source productivity in 2021.md b/published/202102/20210131 3 wishes for open source productivity in 2021.md new file mode 100644 index 0000000000..4517bae151 --- /dev/null +++ b/published/202102/20210131 3 wishes for open source productivity in 2021.md @@ -0,0 +1,64 @@ +[#]: collector: (lujun9972) +[#]: translator: (geekpi) +[#]: reviewer: (wxy) +[#]: publisher: (wxy) +[#]: url: (https://linux.cn/article-13113-1.html) +[#]: subject: (3 wishes for open source productivity in 2021) +[#]: via: (https://opensource.com/article/21/1/productivity-wishlist) +[#]: author: (Kevin Sonney https://opensource.com/users/ksonney) + +2021 年开源生产力的 3 个愿望 +====== + +> 2021年,开源世界可以拓展的有很多。这是我特别感兴趣的三个领域。 + +![Looking at a map for career journey][1] + +在前几年,这个年度系列涵盖了单个的应用。今年,我们除了关注 2021 年的策略外,还将关注一体化解决方案。欢迎来到 2021 年 21 天生产力的最后一天。 + +我们已经到了又一个系列的结尾处。因此,让我们谈谈我希望在 2021 年看到的更多事情。 + +### 断网 + +![Large Lego set built by the author][2] + +*我在假期期间制作的(Kevin Sonney, [CC BY-SA 4.0][3])* + +对*许多、许多的*人来说,2020 年是非常困难的一年。疫情大流行、各种政治事件、24 小时的新闻轰炸等等,都对我们的精神健康造成了伤害。虽然我确实谈到了 [抽出时间进行自我护理][4],但我只是想断网:也就是关闭提醒、手机、平板等,暂时无视这个世界。我公司的一位经理实际上告诉我们,如果放假或休息一天,就把所有与工作有关的东西都关掉(除非我们在值班)。我最喜欢的“断网”活动之一就是听音乐和搭建大而复杂的乐高。 + +### 可访问性 + +尽管我谈论的许多技术都是任何人都可以做的,但是软件方面的可访问性都有一定难度。相对于自由软件运动之初,Linux 和开源世界在辅助技术方面已经有了长足发展。但是,仍然有太多的应用和系统不会考虑有些用户没有与设计者相同的能力。我一直在关注这一领域的发展,因为每个人都应该能够访问事物。 + +### 更多的一体化选择 + +![JPilot all in one organizer software interface][5] + +*JPilot(Kevin Sonney, [CC BY-SA 4.0][3])* + +在 FOSS 世界中,一体化的个人信息管理解决方案远没有商业软件世界中那么多。总体趋势是使用单独的应用,它们必须通过配置来相互通信或通过中介服务(如 CalDAV 服务器)。移动市场在很大程度上推动了这一趋势,但我仍然向往像 [JPilot][6] 这样无需额外插件或服务就能完成几乎所有我需要的事情的日子。 + +非常感谢大家阅读这个年度系列。如果你认为我错过了什么,或者明年需要注意什么,请在下方评论。 + +就像我在 [生产力炼金术][7] 上说的那样,尽最大努力保持生产力! + +-------------------------------------------------------------------------------- + +via: https://opensource.com/article/21/1/productivity-wishlist + +作者:[Kevin Sonney][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/ksonney +[b]: https://github.com/lujun9972 +[1]: https://opensource.com/sites/default/files/styles/image-full-size/public/lead-images/career_journey_road_gps_path_map_520.png?itok=PpL6jJgY (Looking at a map for career journey) +[2]: https://opensource.com/sites/default/files/day21-image1.png +[3]: https://creativecommons.org/licenses/by-sa/4.0/ +[4]: https://opensource.com/article/21/1/self-care +[5]: https://opensource.com/sites/default/files/day21-image2.png +[6]: http://www.jpilot.org/ +[7]: https://productivityalchemy.com diff --git a/published/202102/20210201 Generate QR codes with this open source tool.md b/published/202102/20210201 Generate QR codes with this open source tool.md new file mode 100644 index 0000000000..bc554bf5cb --- /dev/null +++ b/published/202102/20210201 Generate QR codes with this open source tool.md @@ -0,0 +1,81 @@ +[#]: collector: (lujun9972) +[#]: translator: (geekpi) +[#]: reviewer: (wxy) +[#]: publisher: (wxy) +[#]: url: (https://linux.cn/article-13097-1.html) +[#]: subject: (Generate QR codes with this open source tool) +[#]: via: (https://opensource.com/article/21/2/zint-barcode-generator) +[#]: author: (Don Watkins https://opensource.com/users/don-watkins) + +Zint:用这个开源工具生成二维码 +====== + +> Zint 可以轻松生成 50 多种类型的自定义条码。 + +![](https://img.linux.net.cn/data/attachment/album/202102/07/231854y8ffstg0m6l2fcmz.jpg) + +二维码是一种很好的可以向人们提供信息的方式,且没有打印的麻烦和费用。大多数人的智能手机都支持二维码扫描,无论其操作系统是什么。 + +你可能想使用二维码的原因有很多。也许你是一名教师,希望通过补充材料来测试你的学生,以增强学习效果,或者是一家餐厅,需要在遵守社交距离准则的同时提供菜单。我经常行走于自然小径,那里贴有树木和其他植物的标签。用二维码来补充这些小标签是一种很好的方式,它可以提供关于公园展品的额外信息,而无需花费和维护标识牌。在这些和其他情况下,二维码是非常有用的。 + +在互联网上搜索一个简单的、开源的方法来创建二维码时,我发现了 [Zint][2]。Zint 是一个优秀的开源 (GPLv3.0) 生成条码的解决方案。根据该项目的 [GitHub 仓库][3]:“Zint 是一套可以方便地对任何一种公共领域条形码标准的数据进行编码的程序,并允许你将这种功能集成到你自己的程序中。” + +Zint 支持 50 多种类型的条形码,包括二维码(ISO 18004),你可以轻松地创建这些条形码,然后复制和粘贴到 word 文档、博客、维基和其他数字媒体中。人们可以用智能手机扫描这些二维码,快速链接到信息。 + +### 安装 Zint + +Zint 适用于 Linux、macOS 和 Windows。 + +你可以在基于 Ubuntu 的 Linux 发行版上使用 `apt` 安装 Zint 命令: + +``` +$ sudo apt install zint +``` + +我还想要一个图形用户界面(GUI),所以我安装了 Zint-QT: + +``` +$ sudo apt install zint-qt +``` + +请参考手册的[安装部分][4],了解 macOS 和 Windows 的说明。 + +### 用 Zint 生成二维码 + +安装好后,我启动了它,并创建了我的第一个二维码,这是一个指向 Opensource.com 的链接。 + +![Generating QR code with Zint][5] + +Zint 的 50 多个其他条码选项包括许多国家的邮政编码、DotCode、EAN、EAN-14 和通用产品代码 (UPC)。[项目文档][2]中包含了它可以渲染的所有代码的完整列表。 + +你可以将任何条形码复制为 BMP 或 SVG,或者将输出保存为你应用中所需要的任何尺寸的图像文件。这是我的 77x77 像素的二维码。 + +![QR code][7] + +该项目维护了一份出色的用户手册,其中包含了在[命令行][8]和 [GUI][9] 中使用 Zint 的说明。你甚至可以[在线][10]试用 Zint。对于功能请求或错误报告,请[访问网站][11]或[发送电子邮件][12]。 + +-------------------------------------------------------------------------------- + +via: https://opensource.com/article/21/2/zint-barcode-generator + +作者:[Don Watkins][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/don-watkins +[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]: http://www.zint.org.uk/ +[3]: https://github.com/zint/zint +[4]: http://www.zint.org.uk/Manual.aspx?type=p&page=2 +[5]: https://opensource.com/sites/default/files/uploads/zintqrcode_generation.png (Generating QR code with Zint) +[6]: https://creativecommons.org/licenses/by-sa/4.0/ +[7]: https://opensource.com/sites/default/files/uploads/zintqrcode_77px.png (QR code) +[8]: http://zint.org.uk/Manual.aspx?type=p&page=4 +[9]: http://zint.org.uk/Manual.aspx?type=p&page=3 +[10]: http://www.barcode-generator.org/ +[11]: https://lists.sourceforge.net/lists/listinfo/zint-barcode +[12]: mailto:zint-barcode@lists.sourceforge.net diff --git a/published/202102/20210202 Filmulator is a Simple, Open Source, Raw Image Editor for Linux Desktop.md b/published/202102/20210202 Filmulator is a Simple, Open Source, Raw Image Editor for Linux Desktop.md new file mode 100644 index 0000000000..12f6aa8801 --- /dev/null +++ b/published/202102/20210202 Filmulator is a Simple, Open Source, Raw Image Editor for Linux Desktop.md @@ -0,0 +1,86 @@ +[#]: collector: (lujun9972) +[#]: translator: (geekpi) +[#]: reviewer: (wxy) +[#]: publisher: (wxy) +[#]: url: (https://linux.cn/article-13119-1.html) +[#]: subject: (Filmulator is a Simple, Open Source, Raw Image Editor for Linux Desktop) +[#]: via: (https://itsfoss.com/filmulator/) +[#]: author: (Abhishek Prakash https://itsfoss.com/author/abhishek/) + +Filmulator:一个简单的、开源的 Raw 图像编辑器 +====== + +![](https://img.linux.net.cn/data/attachment/album/202102/15/100616o54wb5h4aqgmq4qe.jpg) + +> Filmulator 是一个开源的具有库管理功能的 raw 照片编辑应用,侧重于简单、易用和简化的工作流程。 + +### Filmulator:适用于 Linux(和 Windows)的 raw 图像编辑器 + +[Linux 中有一堆 raw 照片编辑器][1],[Filmulator][2] 就是其中之一。Filmulator 的目标是仅提供基本要素,从而使 raw 图像编辑变得简单。它还增加了库处理的功能,如果你正在为你的相机图像寻找一个不错的应用,这是一个加分项。 + +对于那些不知道 raw 的人来说,[raw 图像文件][3]是一个最低限度处理、未压缩的文件。换句话说,它是未经压缩的数字文件,并且只经过了最低限度的处理。专业摄影师更喜欢用 raw 文件拍摄照片,并自行处理。普通人从智能手机拍摄照片,它通常被压缩为 JPEG 格式或被过滤。 + +让我们来看看在 Filmulator 编辑器中会有什么功能。 + +### Filmulator 的功能 + +![Filmulator interface][4] + +Filmulator 宣称,它不是典型的“胶片效果滤镜” —— 这只是复制了胶片的外在特征。相反,Filmulator 从根本上解决了胶片的魅力所在:显影过程。 + +它模拟了胶片的显影过程:从胶片的“曝光”,到每个像素内“银晶”的生长,再到“显影剂”在相邻像素之间与储槽中大量显影剂的扩散。 + +Fimulator 开发者表示,这种模拟带来了以下好处: + + * 大的明亮区域变得更暗,压缩了输出动态范围。 + * 小的明亮区域使周围环境变暗,增强局部对比度。 + * 在明亮区域,饱和度得到增强,有助于保留蓝天、明亮肤色和日落的色彩。 + * 在极度饱和的区域,亮度会被减弱,有助于保留细节,例如花朵。 + +以下是经 Filmulator 处理后的 raw 图像的对比,以自然的方式增强色彩,而不会引起色彩剪切。 + +![原图][5] + +![处理后][10] + +### 在 Ubuntu/Linux 上安装 Filmulator + +Filmulator 有一个 AppImage 可用,这样你就可以在 Linux 上轻松使用它。使用 [AppImage 文件][6]真的很简单。下载后,使它可执行,然后双击运行。 + +- [下载 Filmulator for Linux][7] + +对 Windows 用户也有一个 Windows 版本。除此之外,你还可以随时前往[它的 GitHub 仓库][8]查看它的源代码。 + +有一份[小文档][9]来帮助你开始使用 Fimulator。 + +### 总结 + +Fimulator 的设计理念是为任何工作提供最好的工具,而且只有这一个工具。这意味着牺牲了灵活性,但获得了一个大大简化和精简的用户界面。 + +我连业余摄影师都不是,更别说是专业摄影师了。我没有单反或其他高端摄影设备。因此,我无法测试和分享我对 Filmulator 的实用性的经验。 + +如果你有更多处理 raw 图像的经验,请尝试下 Filmulator,并分享你的意见。有一个 AppImage 可以让你快速测试它,看看它是否适合你的需求。 + +-------------------------------------------------------------------------------- + +via: https://itsfoss.com/filmulator/ + +作者:[Abhishek Prakash][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/abhishek/ +[b]: https://github.com/lujun9972 +[1]: https://itsfoss.com/raw-image-tools-linux/ +[2]: https://filmulator.org/ +[3]: https://www.findingtheuniverse.com/what-is-raw-in-photography/ +[4]: https://i2.wp.com/itsfoss.com/wp-content/uploads/2021/02/Filmulate.jpg?resize=799%2C463&ssl=1 +[5]: https://i1.wp.com/itsfoss.com/wp-content/uploads/2021/02/image-without-filmulator.jpeg?ssl=1 +[6]: https://itsfoss.com/use-appimage-linux/ +[7]: https://filmulator.org/download/ +[8]: https://github.com/CarVac/filmulator-gui +[9]: https://github.com/CarVac/filmulator-gui/wiki +[10]: https://i1.wp.com/itsfoss.com/wp-content/uploads/2021/02/image-with-filmulator.jpeg?ssl=1 \ No newline at end of file diff --git a/published/202102/20210203 Paru - A New AUR Helper and Pacman Wrapper Based on Yay.md b/published/202102/20210203 Paru - A New AUR Helper and Pacman Wrapper Based on Yay.md new file mode 100644 index 0000000000..c30c45aaab --- /dev/null +++ b/published/202102/20210203 Paru - A New AUR Helper and Pacman Wrapper Based on Yay.md @@ -0,0 +1,153 @@ +[#]: collector: (lujun9972) +[#]: translator: (geekpi) +[#]: reviewer: (wxy) +[#]: publisher: (wxy) +[#]: url: (https://linux.cn/article-13122-1.html) +[#]: subject: (Paru – A New AUR Helper and Pacman Wrapper Based on Yay) +[#]: via: (https://itsfoss.com/paru-aur-helper/) +[#]: author: (Dimitrios Savvopoulos https://itsfoss.com/author/dimitrios/) + +Paru:基于 Yay 的新 AUR 助手 +====== + +![](https://img.linux.net.cn/data/attachment/album/202102/16/101301ldekk9kkpqlplke6.jpg) + +[用户选择 Arch Linux][1] 或 [基于 Arch 的 Linux 发行版][2]的主要原因之一就是 [Arch 用户仓库(AUR)][3]。 + +遗憾的是,[pacman][4],也就是 Arch 的包管理器,不能以类似官方仓库的方式访问 AUR。AUR 中的包是以 [PKGBUILD][5] 的形式存在的,需要手动过程来构建。 + +AUR 助手可以自动完成这个过程。毫无疑问,[yay][6] 是最受欢迎和备受青睐的 AUR 助手之一。 + +最近,`yay` 的两位开发者之一的 [Morganamilo][7][宣布][8]将退出 `yay` 的维护工作,以开始自己的 AUR 助手 [paru][9]。`paru` 是用 [Rust][10] 编写的,而 `yay` 是用 [Go][11] 编写的,它的设计是基于 yay 的。 + +请注意,`yay` 还没有结束支持,它仍然由 [Jguer][12] 积极维护。他还[评论][13]说,`paru` 可能适合那些寻找丰富功能的 AUR 助手的用户。因此我推荐大家尝试一下。 + +### 安装 Paru AUR 助手 + +要安装 `paru`,打开你的终端,逐一输入以下命令: + +``` +sudo pacman -S --needed base-devel +git clone https://aur.archlinux.org/paru.git +cd paru +makepkg -si +``` + +现在已经安装好了,让我们来看看如何使用它。 + +### 使用 Paru AUR 助手的基本命令 + +在我看来,这些都是 `paru` 最基本的命令。你可以在 [GitHub][9] 的官方仓库中探索更多。 + + * `paru <用户输入>`:搜索并安装“用户输入” + * `paru -`:`paru -Syu` 的别名 + * `paru -Sua`:仅升级 AUR 包。 + * `paru -Qua`:打印可用的 AUR 更新 + * `paru -Gc <用户输入>`:显示“用户输入”的 AUR 评论 + +### 充分使用 Paru AUR 助手 + +你可以在 GitHub 上访问 `paru` 的[更新日志][14]来查看完整的变更日志历史,或者你可以在[首次发布][15]中查看对 `yay` 的变化。 + +#### 在 Paru 中启用颜色 + +要在 `paru` 中启用颜色,你必须先在 `pacman` 中启用它。所有的[配置文件][16]都在 `/etc` 目录下。在此例中,我[使用 Nano 文本编辑器][17],但是,你可以选择使用任何[基于终端的文本编辑器][18]。 + +``` +sudo nano /etc/pacman.conf +``` + +打开 `pacman` 配置文件后,取消 `Color` 的注释,即可启用此功能。 + +![][19] + +#### 反转搜索顺序 + +根据你的搜索条件,最相关的包通常会显示在搜索结果的顶部。在 `paru` 中,你可以反转搜索顺序,使你的搜索更容易。 + +与前面的例子类似,打开 `paru` 配置文件: + +``` +sudo nano /etc/paru.conf +``` + +取消注释 `BottomUp` 项,然后保存文件。 + +![][20] + +如你所见,顺序是反转的,第一个包出现在了底部。 + +![][21] + +#### 编辑 PKGBUILD (对于高级用户) + +如果你是一个有经验的 Linux 用户,你可以通过 `paru` 编辑 AUR 包。要做到这一点,你需要在 `paru` 配置文件中启用该功能,并设置你所选择的文件管理器。 + +在此例中,我将使用配置文件中的默认值,即 vifm 文件管理器。如果你还没有使用过它,你可能需要安装它。 + +``` +sudo pacman -S vifm +sudo nano /etc/paru.conf +``` + +打开配置文件,如下所示取消注释。 + +![][22] + +让我们回到 [Google Calendar][23] 的 AUR 包,并尝试安装它。系统会提示你审查该软件包。输入 `Y` 并按下回车。 + +![][24] + +从文件管理器中选择 PKGBUILD,然后按下回车查看软件包。 + +![][25] + +你所做的任何改变都将是永久性的,下次升级软件包时,你的改变将与上游软件包合并。 + +![][26] + +### 总结 + +`paru` 是 [AUR 助手家族][27]的又一个有趣的新成员,前途光明。此时,我不建议更换 `yay`,因为它还在维护,但一定要试试 `paru`。你可以把它们两个都安装到你的系统中,然后得出自己的结论。 + +-------------------------------------------------------------------------------- + +via: https://itsfoss.com/paru-aur-helper/ + +作者:[Dimitrios Savvopoulos][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/dimitrios/ +[b]: https://github.com/lujun9972 +[1]: https://itsfoss.com/why-arch-linux/ +[2]: https://itsfoss.com/arch-based-linux-distros/ +[3]: https://itsfoss.com/aur-arch-linux/ +[4]: https://itsfoss.com/pacman-command/ +[5]: https://wiki.archlinux.org/index.php/PKGBUILD +[6]: https://news.itsfoss.com/qt-6-released/ +[7]: https://github.com/Morganamilo +[8]: https://www.reddit.com/r/archlinux/comments/jjn1c1/paru_v100_and_stepping_away_from_yay/ +[9]: https://github.com/Morganamilo/paru +[10]: https://www.rust-lang.org/ +[11]: https://golang.org/ +[12]: https://github.com/Jguer +[13]: https://aur.archlinux.org/packages/yay/#pinned-788241 +[14]: https://github.com/Morganamilo/paru/releases +[15]: https://github.com/Morganamilo/paru/releases/tag/v1.0.0 +[16]: https://linuxhandbook.com/linux-directory-structure/#-etc-configuration-files +[17]: https://itsfoss.com/nano-editor-guide/ +[18]: https://itsfoss.com/command-line-text-editors-linux/ +[19]: https://i0.wp.com/itsfoss.com/wp-content/uploads/2021/01/pacman.conf-color.png?resize=800%2C480&ssl=1 +[20]: https://i1.wp.com/itsfoss.com/wp-content/uploads/2021/01/paru.conf-bottomup.png?resize=800%2C480&ssl=1 +[21]: https://i2.wp.com/itsfoss.com/wp-content/uploads/2021/01/paru.conf-bottomup-2.png?resize=800%2C480&ssl=1 +[22]: https://i2.wp.com/itsfoss.com/wp-content/uploads/2021/01/paru.conf-vifm.png?resize=732%2C439&ssl=1 +[23]: https://aur.archlinux.org/packages/gcalcli/ +[24]: https://i2.wp.com/itsfoss.com/wp-content/uploads/2021/01/paru-proceed-for-review.png?resize=800%2C480&ssl=1 +[25]: https://i0.wp.com/itsfoss.com/wp-content/uploads/2021/01/paru-proceed-for-review-2.png?resize=800%2C480&ssl=1 +[26]: https://i1.wp.com/itsfoss.com/wp-content/uploads/2021/01/paru-proceed-for-review-3.png?resize=800%2C480&ssl=1 +[27]: https://itsfoss.com/best-aur-helpers/ +[28]: https://news.itsfoss.com/ \ No newline at end of file diff --git a/published/202102/20210204 A hands-on tutorial of SQLite3.md b/published/202102/20210204 A hands-on tutorial of SQLite3.md new file mode 100644 index 0000000000..057e0ce98e --- /dev/null +++ b/published/202102/20210204 A hands-on tutorial of SQLite3.md @@ -0,0 +1,255 @@ +[#]: collector: "lujun9972" +[#]: translator: "amwps290" +[#]: reviewer: "wxy" +[#]: publisher: "wxy" +[#]: url: "https://linux.cn/article-13117-1.html" +[#]: subject: "A hands-on tutorial of SQLite3" +[#]: via: "https://opensource.com/article/21/2/sqlite3-cheat-sheet" +[#]: author: "Klaatu https://opensource.com/users/klaatu" + +SQLite3 实践教程 +====== + +> 开始使用这个功能强大且通用的数据库吧。 + +![](https://img.linux.net.cn/data/attachment/album/202102/14/131146jsx2kvyobwxwswct.jpg) + +应用程序经常需要保存数据。无论你的用户是创建简单的文本文档、复杂的图形布局、游戏进度还是错综复杂的客户和订单号列表,软件通常都意味着生成数据。有很多方法可以存储数据以供重复使用。你可以将文本转储为 INI、[YAML][2]、XML 或 JSON 等配置格式,可以输出原始的二进制数据,也可以将数据存储在结构化数据库中。SQLite 是一个自包含的、轻量级数据库,可轻松创建、解析、查询、修改和传输数据。 + +- 下载 [SQLite3 备忘录][3] + +SQLite 专用于 [公共领域][4],[从技术上讲,这意味着它没有版权,因此不需要许可证][5]。如果你需要许可证,则可以 [购买所有权担保][6]。SQLite 非常常见,大约有 1 万亿个 SQLite 数据库正在使用中。在每个基于 Webkit 的 Web 浏览器,现代电视机,汽车多媒体系统以及无数其他软件应用程序中,Android 和 iOS 设备, macOS 和 Windows 10 计算机,大多数 Linux 系统上都包含多个这种数据库。 + +总而言之,它是用于存储和组织数据的一个可靠而简单的系统。 + +### 安装 + +你的系统上可能已经有 SQLite 库,但是你需要安装其命令行工具才能直接使用它。在 Linux上,你可能已经安装了这些工具。该工具提供的命令是 `sqlite3` (而不仅仅是 sqlite)。 + +如果没有在你的 Linux 或 BSD 上安装 SQLite,你则可以从软件仓库中或 ports 树中安装 SQLite,也可以从源代码或已编译的二进制文件进行[下载并安装][7]。 + +在 macOS 或 Windows 上,你可以从 [sqlite.org][7] 下载并安装 SQLite 工具。 + +### 使用 SQLite + +通过编程语言与数据库进行交互是很常见的。因此,像 Java、Python、Lua、PHP、Ruby、C++ 以及其他编程语言都提供了 SQLite 的接口(或“绑定”)。但是,在使用这些库之前,了解数据库引擎的实际情况以及为什么你对数据库的选择很重要是有帮助的。本文向你介绍 SQLite 和 `sqlite3` 命令,以便你熟悉该数据库如何处理数据的基础知识。 + +### 与 SQLite 交互 + +你可以使用 `sqlite3` 命令与 SQLite 进行交互。 该命令提供了一个交互式的 shell 程序,以便你可以查看和更新数据库。 + +``` +$ sqlite3 +SQLite version 3.34.0 2020-12-01 16:14:00 +Enter ".help" for usage hints. +Connected to a transient in-memory database. +Use ".open FILENAME" to reopen on a persistent database. +sqlite> +``` + +该命令将使你处于 SQLite 的子 shell 中,因此现在的提示符是 SQLite 的提示符。你以前使用的 Bash 命令在这里将不再适用。你必须使用 SQLite 命令。要查看 SQLite 命令列表,请输入 `.help`: + +``` +sqlite> .help +.archive ... Manage SQL archives +.auth ON|OFF SHOW authorizer callbacks +.backup ?DB? FILE Backup DB (DEFAULT "main") TO FILE +.bail ON|off Stop after hitting an error. DEFAULT OFF +.binary ON|off Turn BINARY output ON OR off. DEFAULT OFF +.cd DIRECTORY CHANGE the working directory TO DIRECTORY +[...] +``` + +这些命令中的其中一些是二进制的,而其他一些则需要唯一的参数(如文件名、路径等)。这些是 SQLite Shell 的管理命令,不是用于数据库查询。数据库以结构化查询语言(SQL)进行查询,许多 SQLite 查询与你从 [MySQL][8] 和 [MariaDB][9] 数据库中已经知道的查询相同。但是,数据类型和函数有所不同,因此,如果你熟悉另一个数据库,请特别注意细微的差异。 + +### 创建数据库 + +启动 SQLite 时,可以打开内存数据库,也可以选择要打开的数据库: + +``` +$ sqlite3 mydatabase.db +``` + +如果还没有数据库,则可以在 SQLite 提示符下创建一个数据库: + +``` +sqlite> .open mydatabase.db +``` + +现在,你的硬盘驱动器上有一个空文件,可以用作 SQLite 数据库。 文件扩展名 `.db` 是任意的。你也可以使用 `.sqlite` 或任何你想要的后缀。 + +### 创建一个表 + +数据库包含一些table,可以将其可视化为电子表格。有许多的行(在数据库中称为记录record)和列。行和列的交集称为字段field。 + +结构化查询语言(SQL)以其提供的内容而命名:一种以可预测且一致的语法查询数据库内容以接收有用的结果的方法。SQL 读起来很像普通的英语句子,即使有点机械化。当前,你的数据库是一个没有任何表的空数据库。 + +你可以使用 `CREATE` 来创建一个新表,你可以和 `IF NOT EXISTS` 结合使用。以便不会破坏现在已有的同名的表。 + +你无法在 SQLite 中创建一个没有任何字段的空表,因此在尝试 `CREATE` 语句之前,必须考虑预期表将存储的数据类型。在此示例中,我将使用以下列创建一个名为 `member` 的表: + + * 唯一标识符 + * 人名 + * 记录创建的时间和日期 + +#### 唯一标识符 + +最好用唯一的编号来引用记录,幸运的是,SQLite 认识到这一点,创建一个名叫 `rowid` 的列来为你自动实现这一点。 + +无需 SQL 语句即可创建此字段。 + +#### 数据类型 + +对于我的示例表中,我正在创建一个 `name` 列来保存 `TEXT` 类型的数据。为了防止在没有指定字段数据的情况下创建记录,可以添加 `NOT NULL` 指令。 + +用 `name TEXT NOT NULL` 语句来创建。 + +SQLite 中有五种数据类型(实际上是 _储存类别_): + + * `TEXT`:文本字符串 + * `INTEGER`:一个数字 + * `REAL`:一个浮点数(小数位数无限制) + * `BLOB`:二进制数据(例如,.jpeg 或 .webp 图像) + * `NULL`:空值 + +#### 日期和时间戳 + +SQLite 有一个方便的日期和时间戳功能。它本身不是数据类型,而是 SQLite 中的一个函数,它根据所需的格式生成字符串或整数。 在此示例中,我将其保留为默认值。 + +创建此字段的 SQL 语句是:`datestamp DATETIME DEFAULT CURRENT_TIMESTAMP`。 + +### 创建表的语句 + +在 SQLite 中创建此示例表的完整 SQL: + +``` +sqlite> CREATE TABLE +...> IF NOT EXISTS +...> member (name TEXT NOT NULL, +...> datestamp DATETIME DEFAULT CURRENT_TIMESTAMP); +``` + +在此代码示例中,我在语句的分句后按了回车键。以使其更易于阅读。除非以分号(`;`)终止,否则 SQLite 不会运行你的 SQL 语句。 + +你可以使用 SQLite 命令 `.tables` 验证表是否已创建: + +``` +sqlite> .tables +member +``` + +### 查看表中的所有列 + +你可以使用 `PRAGMA` 语句验证表包含哪些列和行: + +``` +sqlite> PRAGMA table_info(member); +0|name|TEXT|1||0 +1|datestamp|DATETIME|0|CURRENT_TIMESTAMP|0 +``` + +### 数据输入 + +你可以使用 `INSERT` 语句将一些示例数据填充到表中: + +``` +> INSERT INTO member (name) VALUES ('Alice'); +> INSERT INTO member (name) VALUES ('Bob'); +> INSERT INTO member (name) VALUES ('Carol'); +> INSERT INTO member (name) VALUES ('David'); +``` + +查看表中的数据: + +``` +> SELECT * FROM member; +Alice|2020-12-15 22:39:00 +Bob|2020-12-15 22:39:02 +Carol|2020-12-15 22:39:05 +David|2020-12-15 22:39:07 +``` + +#### 添加多行数据 + +现在创建第二个表: + +``` +> CREATE TABLE IF NOT EXISTS linux ( +...> distro TEXT NOT NULL); +``` + +填充一些示例数据,这一次使用小的 `VALUES` 快捷方式,因此你可以在一个命令中添加多行。关键字 `VALUES` 期望以括号形式列出列表,而用多个逗号分隔多个列表: + +``` +> INSERT INTO linux (distro) +...> VALUES ('Slackware'), ('RHEL'), +...> ('Fedora'),('Debian'); +``` + +### 修改表结构 + +你现在有两个表,但是到目前为止,两者之间没有任何关系。它们每个都包含独立的数据,但是可能你可能需要将第一个表的成员与第二个表中列出的特定项相关联。 + +为此,你可以为第一个表创建一个新列,该列对应于第二个表。由于两个表都设计有唯一标识符(这要归功于 SQLite 的自动创建),所以连接它们的最简单方法是将其中一个的 `rowid` 字段用作另一个的选择器。 + +在第一个表中创建一个新列,以存储第二个表中的值: + +``` +> ALTER TABLE member ADD os INT; +``` + +使用 `linux` 表中的唯一标识符作为 `member` 表中每一条记录中 `os` 字段的值。因为记录已经存在。因此你可以使用 `UPDATE` 语句而不是使用 `INSERT` 语句来更新数据。需要特别注意的是,你首先需要选中特定的一行来然后才能更新其中的某个字段。从句法上讲,这有点相反,更新首先发生,选择匹配最后发生: + +``` +> UPDATE member SET os=1 WHERE name='Alice'; +``` + +对 `member` 表中的其他行重复相同的过程。更新 `os` 字段,为了数据多样性,在四行记录上分配三种不同的发行版(其中一种加倍)。 + +### 联接表 + +现在,这两个表相互关联,你可以使用 SQL 显示关联的数据。数据库中有多种 _联接方式_,但是一旦掌握了基础知识,就可以尝试所有的联接形式。这是一个基本联接,用于将 `member` 表的 `os` 字段中的值与 linux 表的 `rowid` 字段相关联: + +``` +> SELECT * FROM member INNER JOIN linux ON member.os=linux.rowid; +Alice|2020-12-15 22:39:00|1|Slackware +Bob|2020-12-15 22:39:02|3|Fedora +Carol|2020-12-15 22:39:05|3|Fedora +David|2020-12-15 22:39:07|4|Debian +``` + +`os` 和 `rowid` 字段形成了关联。 + +在一个图形应用程序中,你可以想象 `os` 字段是一个下拉选项菜单,其中的值是 `linux` 表中 `distro` 字段中的数据。将相关的数据集通过唯一的字段相关联,可以确保数据的一致性和有效性,并且借助 SQL,你可以在以后动态地关联它们。 + +### 了解更多 + +SQLite 是一个非常有用的自包含的、可移植的开源数据库。学习以交互方式使用它是迈向针对 Web 应用程序进行管理或通过编程语言库使用它的重要的第一步。 + +如果你喜欢 SQLite,也可以尝试由同一位作者 Richard Hipp 博士的 [Fossil][10]。 + +在学习和使用 SQLite 时,有一些常用命令可能会有所帮助,所以请立即下载我们的 [SQLite3 备忘单][3]! + +-------------------------------------------------------------------------------- + +via: https://opensource.com/article/21/2/sqlite3-cheat-sheet + +作者:[Klaatu][a] +选题:[lujun9972][b] +译者:[amwps290](https://github.com/amwps290) +校对:[wxy](https://github.com/wxy) + +本文由 [LCTT](https://github.com/LCTT/TranslateProject) 原创编译,[Linux中国](https://linux.cn/) 荣誉推出 + +[a]: https://opensource.com/users/klaatu +[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://www.redhat.com/sysadmin/yaml-beginners +[3]: https://opensource.com/downloads/sqlite-cheat-sheet +[4]: https://sqlite.org/copyright.html +[5]: https://directory.fsf.org/wiki/License:PublicDomain +[6]: https://www.sqlite.org/purchase/license? +[7]: https://www.sqlite.org/download.html +[8]: https://www.mysql.com/ +[9]: https://mariadb.org/ +[10]: https://opensource.com/article/20/11/fossil diff --git a/published/202102/20210207 Why the success of open source depends on empathy.md b/published/202102/20210207 Why the success of open source depends on empathy.md new file mode 100644 index 0000000000..6905d890a1 --- /dev/null +++ b/published/202102/20210207 Why the success of open source depends on empathy.md @@ -0,0 +1,58 @@ +[#]: collector: (lujun9972) +[#]: translator: (scvoet) +[#]: reviewer: (wxy) +[#]: publisher: (wxy) +[#]: url: (https://linux.cn/article-13120-1.html) +[#]: subject: (Why the success of open source depends on empathy) +[#]: via: (https://opensource.com/article/21/2/open-source-empathy) +[#]: author: (Bronagh Sorota https://opensource.com/users/bsorota) + +为何开源的成功取决于同理心? +====== + +> 随着对同理心认识的提高和传播同理心的激励,开源生产力将得到提升,协作者将会聚拢,可以充分激发开源软件开发的活力。 + +![](https://img.linux.net.cn/data/attachment/album/202102/15/110606rc48qf05904m9n7p.jpg) + +开源开发的协调创新精神和社区精神改变了世界。Jim Whitehurst 在[《开放式组织》][2]中解释说,开源的成功源于“将人们视为社区的一份子,从交易思维转变为基于承诺基础的思维方式”。 但是,开源开发模型的核心仍然存在障碍:它经常性地缺乏人类的同理心empathy。 + +同理心是理解或感受他人感受的能力。在开源社区中,面对面的人际互动和协作是很少的。任何经历过 GitHub 拉取请求Pull request议题Issue的开发者都曾收到过来自他们可能从未见过的人的评论,这些人往往身处地球的另一端,而他们的交流也可能同样遥远。现代开源开发就是建立在这种异步、事务性的沟通基础之上。因此,人们在社交媒体平台上所经历的同类型的网络欺凌和其他虐待行为,在开源社区中也不足为奇。 + +当然,并非所有开源交流都会事与愿违。许多人在工作中发展出了尊重并秉持着良好的行为标准。但是很多时候,人们的沟通也常常缺乏常识性的礼仪,他们将人们像机器而非人类一般对待。这种行为是激发开源创新模型全部潜力的障碍,因为它让许多潜在的贡献者望而却步,并扼杀了灵感。 + +### 恶意交流的历史 + +代码审查中存在的敌意言论对开源社区来说并不新鲜,它多年来一直被社区所容忍。开源教父莱纳斯·托瓦尔兹Linus Torvalds经常在代码不符合他的标准时[抨击][3] Linux 社区,并将贡献者赶走。埃隆大学计算机科学教授 Megan Squire 借助[机器学习][4]分析了托瓦尔兹的侮辱行为,发现它们在四年内的数量高达数千次。2018 年,莱纳斯因自己的不良行为而自我放逐,责成自己学习同理心,道歉并为 Linux 社区制定了行为准则。 + +2015 年,[Sage Sharp][5] 虽然在技术上受人尊重,但因其缺乏对个人的尊重,被辞去了 FOSS 女性外展计划中的 Linux 内核协调员一职。 + +PR 审核中存在的贬低性评论对开发者会造成深远的影响。它导致开发者在提交 PR 时产生畏惧感,让他们对预期中的反馈感到恐惧。这吞噬了开发者对自己能力的信心。它逼迫工程师每次都只能追求完美,从而减缓了开发速度,这与许多社区采用的敏捷方法论背道而驰。 + +### 如何缩小开源中的同理心差距? + +通常情况下,冒犯的评论常是无意间的,而通过一些指导,作者则可以学会如何在不带负面情绪的情况下表达意见。GitHub 不会监控议题和 PR 的评论是否有滥用内容,相反,它提供了一些工具,使得社区能够对其内容进行审查。仓库的所有者可以删除评论和锁定对话,所有贡献者可以报告滥用和阻止用户。 + +制定社区行为准则可为所有级别的贡献者提供一个安全且包容的环境,并且能让所有级别的贡献者参与并定义降低协作者之间冲突的过程。 + +我们能够克服开源中存在的同理心问题。面对面的辩论比文字更有利于产生共鸣,所以尽可能选择视频通话。以同理心的方式分享反馈,树立榜样。如果你目睹了一个尖锐的评论,请做一个指导者而非旁观者。如果你是受害者,请大声说出来。在面试候选人时,评估同理心能力,并将同理心能力与绩效评估和奖励挂钩。界定并执行社区行为准则,并管理好你的社区。 + +随着对同理心认识的提高和传播同理心的激励,开源生产力将得到提升,协作者将会聚拢,可以充分激发开源软件开发的活力。 + +-------------------------------------------------------------------------------- + +via: https://opensource.com/article/21/2/open-source-empathy + +作者:[Bronagh Sorota][a] +选题:[lujun9972][b] +译者:[scvoet](https://github.com/scvoet) +校对:[wxy](https://github.com/wxy) + +本文由 [LCTT](https://github.com/LCTT/TranslateProject) 原创编译,[Linux中国](https://linux.cn/) 荣誉推出 + +[a]: https://opensource.com/users/bsorota +[b]: https://github.com/lujun9972 +[1]: https://opensource.com/sites/default/files/styles/image-full-size/public/lead-images/practicing-empathy.jpg?itok=-A7fj6NF (Practicing empathy) +[2]: https://www.redhat.com/en/explore/the-open-organization-book +[3]: https://arstechnica.com/information-technology/2013/07/linus-torvalds-defends-his-right-to-shame-linux-kernel-developers/ +[4]: http://flossdata.syr.edu/data/insults/hicssInsultsv2.pdf +[5]: https://en.wikipedia.org/wiki/Sage_Sharp diff --git a/published/202102/20210208 3 open source tools that make Linux the ideal workstation.md b/published/202102/20210208 3 open source tools that make Linux the ideal workstation.md new file mode 100644 index 0000000000..82a71b31f7 --- /dev/null +++ b/published/202102/20210208 3 open source tools that make Linux the ideal workstation.md @@ -0,0 +1,76 @@ +[#]: collector: (lujun9972) +[#]: translator: (wxy) +[#]: reviewer: (wxy) +[#]: publisher: (wxy) +[#]: url: (https://linux.cn/article-13133-1.html) +[#]: subject: (3 open source tools that make Linux the ideal workstation) +[#]: via: (https://opensource.com/article/21/2/linux-workday) +[#]: author: (Seth Kenlon https://opensource.com/users/seth) + +让 Linux 成为理想的工作站的 3 个开源工具 +====== + +> Linux 不但拥有你认为所需的一切,还有更多可以让你高效工作的工具。 + +![](https://img.linux.net.cn/data/attachment/album/202102/19/134935qhe252ifbvbpnzxk.jpg) + +在 2021 年,有更多让人们喜欢 Linux 的理由。在这个系列中,我将分享 21 种使用 Linux 的不同理由。今天,我将与你分享为什么 Linux 是你工作的最佳选择。 + +每个人都希望在工作期间提高工作效率。如果你的工作通常涉及到文档、演示文稿和电子表格的工作,那么你可能已经习惯了特定的例行工作。问题在于,这个*惯常的例行工作*通常是由一两个特定的应用程序决定的,无论是某个办公套件还是桌面操作系统。当然,习惯并不意味着它是理想的,但是它往往会毫无疑义地持续存在,甚至影响到企业的运作架构。 + +### 更聪明地工作 + +如今,许多办公应用程序都在云端运行,因此如果你愿意的话,你可以在 Linux 上使用相同的方式。然而,由于许多典型的知名办公应用程序并不符合 Linux 上的文化预期,因此你可能会发现自己受到启发,想去探索其他的选择。正如任何渴望走出“舒适区”的人所知道的那样,这种微妙的打破可能会出奇的有用。很多时候,你不知道自己效率低下,因为你实际上并没有尝试过以不同的方式做事。强迫自己去探索其他方式,你永远不知道会发现什么。你甚至不必完全知道要寻找的内容。 + +### LibreOffice + +Linux(或任何其他平台)上显而易见的开源办公主力之一是 [LibreOffice][2]。它具有多个组件,包括文字处理器、演示软件、电子表格、关系型数据库界面、矢量绘图等。它可以从其他流行的办公应用程序中导入许多文档格式,因此从其他工具过渡到 LibreOffice 通常很容易。 + +然而,LibreOffice 不仅仅是一个出色的办公套件。LibreOffice 支持宏,所以机智的用户可以自动完成重复性任务。它还具有终端命令的功能,因此你可以在不启动 LibreOffice 界面的情况下执行许多任务。 + +想象一下,比如要打开 21 个文档,导航到**文件**菜单,到**导出**或**打印**菜单项,并将文件导出为 PDF 或 EPUB。这至少需要 84 次以上的点击,可能要花费一个小时的时间。相比之下,打开一个文档文件夹,并转换所有文件为 PDF 或 EPUB,只需要执行一个迅速的命令或菜单操作。转换将在后台运行,而你可以处理其他事情。只需要四分之一的时间,可能更少。 + +``` +$ libreoffice --headless --convert-to epub *.docx +``` + +这是一个小改进,是由 Linux 工具集和你可以自定义环境和工作流程的便利性所潜在带来的鼓励。 + +### Abiword 和 Gnumeric + +有时,你并不需要一个大而全的办公套件。如果你喜欢简化你的办公室工作,那么使用一个轻量级和针对特定任务的应用程序可能更好。例如,我大部分时间都是用文本编辑器写文章,因为我知道在转换为 HTML 的过程中,所有的样式都会被丢弃。但有些时候,文字处理器是很有用的,无论是打开别人发给我的文档,还是因为我想用一种快速简单的方法来生成一些样式漂亮的文本。 + +[Abiword][3] 是一款简单的文字处理器,它基本支持流行的文档格式,并具备你所期望的文字处理器的所有基本功能。它并不意味着是一个完整的办公套件,这是它最大的特点。虽然没有太多的选择,但我们仍然处于信息过载的时代,这正是一个完整的办公套件或文字处理器有时会犯的错误。如果你想避免这种情况,那就用一些简单的东西来代替。 + +同样,[Gnumeric][4] 项目提供了一个简单的电子表格应用程序。Gnumeric 避免了任何严格意义上的电子表格所不需要的功能,所以你仍然可以获得强大的公式语法、大量的函数,以及样式和操作单元格的所有选项。我不怎么使用电子表格,所以我发现自己在极少数需要查看或处理分类账中的数据时,对 Gnumeric 相当满意。 + +### Pandoc + +通过专门的命令和文件处理程序,可以最小化。`pandoc` 命令专门用于文件转换。它就像 `libreoffice --headless` 命令一样,只是要处理的文档格式数量是它的十倍。你甚至可以用它来生成演示文稿! 如果你的工作之一是从一个文档中提取源文本,并以多种格式交付它,那么 Pandoc 是必要的,所以你应该[下载我们的攻略][5]看看。 + +广义上讲,Pandoc 代表的是一种完全不同的工作方式。它让你脱离了办公应用的束缚。它将你从试图将你的想法写成文字,并同时决定这些文字应该使用什么字体的工作中分离出来。在纯文本中工作,然后转换为各种交付格式,让你可以使用任何你想要的应用程序,无论是移动设备上的记事本,还是你碰巧坐在电脑前的简单文本编辑器,或者是云端的文本编辑器。 + +### 寻找替代品 + +Linux 有很多意想不到的替代品。你可以从你正在做的事情中退后一步,分析你的工作流程,评估你所需的结果,并调查那些声称可以完全你的需求的新应用程序来找到它们。 + +改变你所使用的工具、工作流程和日常工作可能会让你迷失方向,特别是当你不知道你要找的到底是什么的时候。但 Linux 的优势在于,你有机会重新评估你在多年的计算机使用过程中潜意识里形成的假设。如果你足够努力地寻找答案,你最终会意识到问题所在。通常,你最终会欣赏你学到的东西。 + +-------------------------------------------------------------------------------- + +via: https://opensource.com/article/21/2/linux-workday + +作者:[Seth Kenlon][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/seth +[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]: http://libreoffice.org +[3]: https://www.abisource.com +[4]: http://www.gnumeric.org +[5]: https://opensource.com/article/20/5/pandoc-cheat-sheet diff --git a/published/202102/20210208 Why choose Plausible for an open source alternative to Google Analytics.md b/published/202102/20210208 Why choose Plausible for an open source alternative to Google Analytics.md new file mode 100644 index 0000000000..ed909d31a1 --- /dev/null +++ b/published/202102/20210208 Why choose Plausible for an open source alternative to Google Analytics.md @@ -0,0 +1,80 @@ +[#]: collector: (lujun9972) +[#]: translator: (geekpi) +[#]: reviewer: (wxy) +[#]: publisher: (wxy) +[#]: url: (https://linux.cn/article-13135-1.html) +[#]: subject: (Why choose Plausible for an open source alternative to Google Analytics) +[#]: via: (https://opensource.com/article/21/2/plausible) +[#]: author: (Ben Rometsch https://opensource.com/users/flagsmith) + +为什么选择 Plausible 作为 Google Analytics 的开源替代品? +====== + +> Plausible 作为 Google Analytics 的可行、有效的替代方案正在引起用户的关注。 + +![](https://img.linux.net.cn/data/attachment/album/202102/19/233627sb7mvtt7hn93lvvr.jpg) + +替代 Google Analytics 似乎是一个巨大的挑战。实际上,你可以说这听起来似乎不合理(LCTT 译注:Plausible 意即“貌似合理”)。但这正是 [Plausible.io][2] 取得巨大成功的原因,自 2018 年以来已注册了数千名新用户。 + +Plausible 的联合创始人 Uku Taht 和 Marko Saric 最近出现在 [The Craft of Open Source][3] 播客上,谈论了这个项目以及他们是如何: + +* 创建了一个可行的替代 Google Analytics 的方案 +* 在不到两年的时间里获得了如此大的发展势头 +* 通过开源他们的项目实现其目标 + +请继续阅读他们与播客主持人和 Flagsmith 创始人 Ben Rometsch 的对话摘要。 + +### Plausible 是如何开始的 + +2018 年冬天,Uku 开始编写一个他认为急需的项目:一个可行的、有效的 Google Analytics 替代方案。因为他对 Google 产品的发展方向感到失望,而且所有其他数据解决方案似乎都把 Google 当作“数据处理中间人”。 + +Uku 的第一直觉是利用现有的数据库解决方案专注于分析方面的工作。马上,他就遇到了一些挑战。开始尝试使用了 PostgreSQL,这在技术上很幼稚,因为它很快就变得不堪重负,效率低下。因此,他的目标蜕变成了做一个分析产品,可以处理大量的数据点,而且性能不会有明显的下降。简而言之,Uku 成功了,Plausible 现在每月可以收取超过 8000 万条记录。 + +Plausible 的第一个版本于 2019 年夏天发布。2020 年 3 月,Marko 加入,负责项目的传播和营销方面的工作。从那时起,它它的受欢迎程度有了很大的增长。 + +### 为什么要开源? + +Uku 热衷于遵循“独立黑客”的软件开发路线:创建一个产品,把它投放出去,然后看看它如何成长。开源在这方面是有意义的,因为你可以迅速发展一个社区并获得人气。 + +但 Plausible 一开始并不是开源的。Uku 最初担心软件的敏感代码,比如计费代码,但他很快就发布了,因为这对没有 API 令牌的人来说是没有用的。 + +现在,Plausible 是在 [AGPL][4] 下完全开源的,他们选择了 AGPL 而不是 MIT 许可。Uku 解释说,在 MIT 许可下,任何人都可以不受限制地对代码做任何事情。在 AGPL 下,如果有人修改代码,他们必须将他们的修改开源,并将代码回馈给社区。这意味着,大公司不能拿着原始代码在此基础上进行构建,然后获得所有的回报。他们必须共享,使得竞争环境更加公平。例如,如果一家公司想插入他们的计费或登录系统,他们有法律义务发布代码。 + +在播客中,Uku 向我询问了关于 Flagsmith 的授权,目前 Flagsmith 的授权采用 BSD 三句版许可,该许可证是高度开放的,但我即将把一些功能移到更严格的许可后面。到目前为止,Flagsmith 社区已经理解了这一变化,因为他们意识到这将带来更多更好的功能。 + +### Plausible vs. Google Analytics + +Uku 说,在他看来,开源的精神是,代码应该是开放的,任何人都可以进行商业使用,并与社区共享,但你可以把一个闭源的 API 模块作为专有附加组件保留下来。这样一来,Plausible 和其他公司就可以通过创建和销售定制的 API 附加许可来满足不同的使用场景。 + +Marko 职位上是一名开发者,但从营销方面来说,他努力让这个项目在 Hacker News 和 Lobster 等网站上得到报道,并建立了 Twitter 帐户以帮助产生动力。这种宣传带来的热潮也意味着该项目在 GitHub 上起飞,从 500 颗星到 4300 颗星。随着流量的增长,Plausible 出现在 GitHub 的趋势列表中,这让其受欢迎程度像滚雪球一样。 + +Marko 还非常注重发布和推广博客文章。这一策略得到了回报,在最初的 6 个月里,有四五篇文章进入了病毒式传播,他利用这些峰值来放大营销信息,加速了增长。 + +Plausible 成长过程中最大的挑战是让人们从 Google Analytics 上转换过来。这个项目的主要目标是创建一个有用、高效、准确的网络分析产品。它还需要符合法规,并为企业和网站访问者提供高度的隐私。 + +Plausible 现在已经在 8000 多个网站上运行。通过与客户的交谈,Uku 估计其中约 90% 的客户运行过 Google Analytics。 + +Plausible 以标准的软件即服务 (SaaS) 订阅模式运行。为了让事情更公平,它按月页面浏览量收费,而不是按网站收费。对于季节性网站来说,这可能会有麻烦,比如说电子商务网站在节假日会激增,或者美国大选网站每四年激增一次。这些可能会导致月度订阅模式下的定价问题,但它通常对大多数网站很好。 + +### 查看播客 + +想要了解更多关于 Uku 和 Marko 如何以惊人的速度发展开源 Plausible 项目,并使其获得商业上的成功,请[收听播客][3],并查看[其他剧集][5],了解更多关于“开源软件社区的来龙去脉”。 + +-------------------------------------------------------------------------------- + +via: https://opensource.com/article/21/2/plausible + +作者:[Ben Rometsch][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/flagsmith +[b]: https://github.com/lujun9972 +[1]: https://opensource.com/sites/default/files/styles/image-full-size/public/lead-images/analytics-graphs-charts.png?itok=sersoqbV (Analytics: Charts and Graphs) +[2]: https://plausible.io/ +[3]: https://www.flagsmith.com/podcast/02-plausible +[4]: https://www.gnu.org/licenses/agpl-3.0.en.html +[5]: https://www.flagsmith.com/podcast \ No newline at end of file diff --git a/published/202102/20210209 Viper Browser- A Lightweight Qt5-based Web Browser With A Focus on Privacy and Minimalism.md b/published/202102/20210209 Viper Browser- A Lightweight Qt5-based Web Browser With A Focus on Privacy and Minimalism.md new file mode 100644 index 0000000000..78f9f8bc07 --- /dev/null +++ b/published/202102/20210209 Viper Browser- A Lightweight Qt5-based Web Browser With A Focus on Privacy and Minimalism.md @@ -0,0 +1,106 @@ +[#]: collector: (lujun9972) +[#]: translator: (geekpi) +[#]: reviewer: (wxy) +[#]: publisher: (wxy) +[#]: url: (https://linux.cn/article-13139-1.html) +[#]: subject: (Viper Browser: A Lightweight Qt5-based Web Browser With A Focus on Privacy and Minimalism) +[#]: via: (https://itsfoss.com/viper-browser/) +[#]: author: (Ankush Das https://itsfoss.com/author/ankush/) + +Viper 浏览器:一款注重隐私和简约的轻量级 Qt5 浏览器 +====== + +![](https://img.linux.net.cn/data/attachment/album/202102/21/110148d7r3hlurczc1ci73.jpg) + +> Viper 浏览器是一个基于 Qt 的浏览器,它提供了简单易用的用户体验,同时考虑到隐私问题。 + +虽然大多数流行的浏览器都运行在 Chromium 之上,但像 [Firefox][1]、[Beaker 浏览器][2]以及其他一些 [chrome 替代品][3]这样独特的替代品不应该停止存在。 + +尤其是考虑到谷歌最近可能想到从 Chromium 中剥离[谷歌浏览器特有的功能][4],并给出了滥用的借口。 + +在寻找更多的 Chrome 替代品时,我在 [Mastodon][6] 上看到了一个有趣的项目 “[Viper 浏览器][5]”。 + +### Viper 浏览器:一个基于 Qt5 的开源浏览器 + +**注意**:Viper 浏览器是一个只有几个贡献者的相当新的项目。它缺乏某些功能,我将在下文提及。 + +Viper 是一款有趣的 Web 浏览器,在利用 [QtWebEngine][8] 的同时,它专注于成为一个强大而又轻巧的选择。 + +QtWebEngine 借用了 Chromium 的代码,但它不包括连接到 Google 平台的二进制文件和服务。 + +我花了一些时间使用它并进行一些日常浏览活动,我必须说,我对它相当感兴趣。不仅仅是因为它是一个简单易用的东西(浏览器可以那么复杂),而且它还专注于增强你的隐私,为你提供添加不同的广告阻止选项以及一些有用的选项。 + +![][9] + +虽然我认为它并不是为所有人准备的,但还是值得一看的。在你继续尝试之前,让我简单介绍一下它的功能。 + +### Viper 浏览器的功能 + +![][10] + +我将列出一些你会发现有用的关键功能: + +* 管理 cookies 的能力 +* 多个预设选项以选择不同的广告屏蔽器网络。 +* 简单且易于使用 +* 隐私友好的默认搜索引擎 - [Startpage][11] (你可以更改) +* 能够添加用户脚本 +* 能够添加新的 user-agent +* 禁用 JavaScript 的选项 +* 能够阻止图像加载 + +除了这些亮点之外,你还可以轻松地调整隐私设置,以删除你的历史记录、清理已有 cookies,以及一些更多的选项。 + +![][12] + +### 在 Linux 上安装 Viper 浏览器 + +它只是在[发布页][13]提供了一个 AppImage 文件,你可以利用它在任何 Linux 发行版上进行测试。 + +如果你需要帮助,你也可以参考我们的[在 Linux 上使用 AppImage 文件][14]指南。如果你好奇,你可以在 [GitHub][5] 上探索更多关于它的内容。 + +- [Viper 浏览器][5] + +### 我对使用 Viper 浏览器的看法 + +我不认为这是一个可以立即取代你当前浏览器的东西,但如果你有兴趣测试尝试提供 Chrome 替代品的新项目,这肯定是其中之一。 + +当我试图登录我的谷歌账户时,它阻止了我,说它可能是一个不安全的浏览器或不支持的浏览器。因此,如果你依赖你的谷歌帐户,这是一个令人失望的消息。 + +但是,其他社交媒体平台也可以与 YouTube 一起正常运行(无需登录)。不支持 Netflix,但总体上浏览体验是相当快速和可用的。 + +你可以安装用户脚本,但 Chrome 扩展还不支持。当然,这要么是有意为之,要么是在开发过程中特别考虑到它是一款隐私友好型的网络浏览器。 + +### 总结 + +考虑到这是一个鲜为人知但对某些人来说很有趣的东西,你对我们有什么建议吗? 是一个值得关注的开源项目么? + +请在下面的评论中告诉我。 + +-------------------------------------------------------------------------------- + +via: https://itsfoss.com/viper-browser/ + +作者:[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://www.mozilla.org/en-US/firefox/new/ +[2]: https://itsfoss.com/beaker-browser-1-release/ +[3]: https://itsfoss.com/open-source-browsers-linux/ +[4]: https://www.bleepingcomputer.com/news/google/google-to-kill-chrome-sync-feature-in-third-party-browsers/ +[5]: https://github.com/LeFroid/Viper-Browser +[6]: https://mastodon.social/web/accounts/199851 +[7]: https://i0.wp.com/itsfoss.com/wp-content/uploads/2021/02/viper-browser.png?resize=800%2C583&ssl=1 +[8]: https://wiki.qt.io/QtWebEngine +[9]: https://i2.wp.com/itsfoss.com/wp-content/uploads/2021/02/viper-browser-setup.jpg?resize=793%2C600&ssl=1 +[10]: https://i0.wp.com/itsfoss.com/wp-content/uploads/2021/02/viper-preferences.jpg?resize=800%2C660&ssl=1 +[11]: https://www.startpage.com +[12]: https://i1.wp.com/itsfoss.com/wp-content/uploads/2021/02/viper-browser-tools.jpg?resize=800%2C262&ssl=1 +[13]: https://github.com/LeFroid/Viper-Browser/releases +[14]: https://itsfoss.com/use-appimage-linux/ diff --git a/published/202102/20210212 4 reasons to choose Linux for art and design.md b/published/202102/20210212 4 reasons to choose Linux for art and design.md new file mode 100644 index 0000000000..fbb040cf2e --- /dev/null +++ b/published/202102/20210212 4 reasons to choose Linux for art and design.md @@ -0,0 +1,95 @@ +[#]: collector: (lujun9972) +[#]: translator: (amorsu) +[#]: reviewer: (wxy) +[#]: publisher: (wxy) +[#]: url: (https://linux.cn/article-13157-1.html) +[#]: subject: (4 reasons to choose Linux for art and design) +[#]: via: (https://opensource.com/article/21/2/linux-art-design) +[#]: author: (Seth Kenlon https://opensource.com/users/seth) + +选择 Linux 来做艺术设计的 4 个理由 +====== + +> 开源会强化你的创造力。因为它把你带出专有的思维定势,开阔你的视野,从而带来更多的可能性。让我们探索一些开源的创意项目。 + +![](https://img.linux.net.cn/data/attachment/album/202102/27/135654k1x4um187i1i7wm1.jpg) + +2021 年,人们比以前的任何时候都更有理由来爱上 Linux。在这个系列,我会分享 21 个选择 Linux 的原因。今天,让我来解释一下,为什么 Linux 是艺术设计的绝佳选择。 + +Linux 在服务器和云计算方面获得很多的赞誉。让不少人感到惊讶的是,Linux 刚好也有一系列的很棒的创意设计工具,并且这些工具在用户体验和质量方面可以媲美那些流行的创意设计工具。我第一次使用开源的设计工具时,并不是因为我没有其他工具可以选择。相反的,我是在接触了大量的这些领先的公司提供的专有设计工具后,才开始使用开源设计工具。我之所以最后选择开源设计工具是因为开源更有意义,而且我能获得更好的产出。这些都是一些笼统的说法,所以请允许我解释一下。 + +### 高可用性意味着高生产力 + +“生产力”这一次对于不同的人来说含义不一样。当我想到生产力,就是当你坐下来做事情,并能够完成你给自己设定的所有任务的时候,这时就很有成就感。但是当你总是被一些你无法掌控的事情打断,那你的生产力就下降了。 + +计算机看起来是不可预测的,诚然有很多事情会出错。电脑是由很多的硬件组成的,它们任何一个都有可能在任何时间出问题。软件会有 bug,也有修复这些 bug 的更新,而更新后又会带来新的 bug。如果你对电脑不了解,它可能就像一个定时炸弹,等着爆发。带着数字世界里的这么多的潜在问题,去接受一个当某些条件不满足(比如许可证,或者订阅费)就会不工作的软件,对我来说就显得很不理智。 + +![Inkscape 应用][2] + +开源的创意设计应用不需要订阅费,也不需要许可证。在你需要的时候,它们都能获取得到,并且通常都是跨平台的。这就意味着,当你坐在工作的电脑面前,你就能确定你能用到那些必需的软件。而如果某天你很忙碌,却发现你面前的电脑不工作了,解决办法就是找到一个能工作的,安装你的创意设计软件,然后开始工作。 + +例如,要找到一台无法运行 Inkscape 的电脑,比找到一台可以运行那些专有软件的电脑要难得多。这就叫做高可用。这是游戏规则的改变者。我从来不曾遇到因为软件用不了而不得不干等,浪费我数小时时间的事情。 + +### 开放访问更有利于多样性 + +我在设计行业工作的时候,我的很多同事都是通过自学的方式来学习艺术和技术方面的知识,这让我感到惊讶。有的通过使用那些最新的昂贵的“专业”软件来自学,但总有一大群人是通过使用自由和开源的软件来完善他们的数字化的职业技能。因为,对于孩子,或者没钱的大学生来说,这才是他们能负担的起,而且很容易就能获得的。 + +这是一种不同的高可用性,但这对我和许多其他用户来说很重要,如果不是因为开源,他们就不会从事创意行业。即使那些有提供付费订阅的开源项目,比如 Ardour,都能确保他的用户在不需要支付任何费用的时候也能使用软件。 + +![Ardour 界面][4] + +当你不限制别人用你的软件的时候,你其实拥有了更多的潜在用户。如果你这样做了,那么你就开放了一个接收多样的创意声音的窗口。艺术钟爱影响力,你可以借鉴的经验和想法越多就越好。这就是开源设计软件所带来的可能性。 + +### 文件格式支持更具包容性 + +我们都知道在几乎所有行业里面包容性的价值。在各种意义上,邀请更多的人到派对可以造就更壮观的场面。知道这一点,当看到有的项目或者创新公司只邀请某些人去合作,只接受某些文件格式,就让我感到很痛苦。这看起来很陈旧,就像某个远古时代的精英主义的遗迹,而这是即使在今天都在发生的真实问题。 + +令人惊讶和不幸的是,这不是因为技术上的限制。专有软件可以访问开源的文件格式,因为这些格式是开源的,而且可以自由地集成到各种应用里面。集成这些格式不需要任何回报。而相比之下,专有的文件格式被笼罩在秘密之中,只被限制于提供给几个愿意付钱的人使用。这很糟糕,而且常常,你无法在没有这些专有软件的情况下打开一些文件来获取你的数据。令人惊喜的是,开源的设计软件却是尽力的支持更多的专有文件格式。以下是一些 Inkscape 所支持的令人难以置信的列表样本: + +![可用的 Inkscape 文件格式][5] + +而这大部分都是在没有这些专有格式厂商的支持下开发出来的。 + +支持开放的文件格式可以更包容,对所有人都更好。 + +### 对新的创意没有限制 + +我之所以爱上开源的其中一个原因是,解决一个指定任务时,有彻底的多样性。当你在专有软件周围时,你所看到的世界是基于你所能够获取得到的东西。比如说,你过你打算处理一些照片,你通常会把你的意图局限在你所知道的可能性上面。你从你的架子上的 4 款或 10 款应用中,挑选出 3 款,因为它们是目前你唯一能够获取得到的选项。 + +在开源领域,你通常会有好几个“显而易见的”必备解决方案,但同时你还有一打的角逐者在边缘转悠,供你选择。这些选项有时只是半成品,或者它们超级专注于某项任务,又或者它们学起来有点挑战性,但最主要的是,它们是独特的,而且充满创新的。有时候,它们是被某些不按“套路”出牌的人所开发的,因此处理的方法和市场上现有的产品截然不同。其他时候,它们是被那些熟悉做事情的“正确”方式,但还是在尝试不同策略的人所开发的。这就像是一个充满可能性的巨大的动态的头脑风暴。 + +这种类型的日常创新能够引领出闪现的灵感、光辉时刻,或者影响广泛的通用性改进。比如说,著名的 GIMP 滤镜,(用于从图像中移除项目并自动替换背景)是如此的受欢迎以至于后来被专有图片编辑软件商拿去“借鉴”。这是成功的一步,但是对于一个艺术家而言,个人的影响才是最关键的。我常感叹于新的 Linux 用户的创意,而我只是在技术展会上展示给他们一个简单的音频,或者视频滤镜,或者绘图应用。没有任何的指导,或者应用场景,从简单的交互中喷发出来的关于新的工具的主意,是令人兴奋和充满启发的,通过实验中一些简单的工具,一个全新的艺术系列可以轻而易举的浮现出来。 + +只要在适当的工具集都有的情况下,有很多方式来更有效的工作。虽然私有软件通常也不会反对更聪明的工作习惯的点子,专注于实现自动化任务让用户可以更轻松的工作,对他们也没有直接的收益。Linux 和开源软件就是很大程度专为 [自动化和编排][6] 而建的,而不只是服务器。像 [ImageMagick][7] 和 [GIMP 脚本][8] 这样的工具改变了我的处理图片的方式,包括批量处理方面和纯粹实验方面。 + +你永远不知道你可以创造什么,如果你有一个你从来想象不到会存在的工具的话。 + +### Linux 艺术家 + +这里有 [使用开源的艺术家社区][9],从 [photography][10] 到 [makers][11] 到 [musicians][12],还有更多更多。如果你想要创新,试试 Linux 吧。 + +-------------------------------------------------------------------------------- + +via: https://opensource.com/article/21/2/linux-art-design + +作者:[Seth Kenlon][a] +选题:[lujun9972][b] +译者:[amorsu](https://github.com/amorsu) +校对:[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/painting_computer_screen_art_design_creative.png?itok=LVAeQx3_ (Painting art on a computer screen) +[2]: https://opensource.com/sites/default/files/inkscape_0.jpg +[3]: https://community.ardour.org/subscribe +[4]: https://opensource.com/sites/default/files/ardour.jpg +[5]: https://opensource.com/sites/default/files/formats.jpg +[6]: https://opensource.com/article/20/11/orchestration-vs-automation +[7]: https://opensource.com/life/16/6/fun-and-semi-useless-toys-linux#imagemagick +[8]: https://opensource.com/article/21/1/gimp-scripting +[9]: https://librearts.org +[10]: https://pixls.us +[11]: https://www.redhat.com/en/blog/channel/red-hat-open-studio +[12]: https://linuxmusicians.com diff --git a/published/202102/20210215 A practical guide to JavaScript closures.md b/published/202102/20210215 A practical guide to JavaScript closures.md new file mode 100644 index 0000000000..cebf757a5a --- /dev/null +++ b/published/202102/20210215 A practical guide to JavaScript closures.md @@ -0,0 +1,136 @@ +[#]: collector: (lujun9972) +[#]: translator: (wxy) +[#]: reviewer: (wxy) +[#]: publisher: (wxy) +[#]: url: (https://linux.cn/article-13140-1.html) +[#]: subject: (A practical guide to JavaScript closures) +[#]: via: (https://opensource.com/article/21/2/javascript-closures) +[#]: author: (Nimisha Mukherjee https://opensource.com/users/nimisha) + +JavaScript 闭包实践 +====== + +> 通过深入了解 JavaScript 的高级概念之一:闭包,更好地理解 JavaScript 代码的工作和执行方式。 + +![](https://img.linux.net.cn/data/attachment/album/202102/21/162941ogyb74z3ahfbfe35.jpg) + +在《[JavaScript 如此受欢迎的 4 个原因][2]》中,我提到了一些高级 JavaScript 概念。在本文中,我将深入探讨其中的一个概念:闭包closure。 + +根据 [Mozilla 开发者网络][3](MDN),“闭包是将一个函数和对其周围的状态(词法环境)的引用捆绑在一起(封闭)的组合。”简而言之,这意味着在一个函数内部的函数可以访问其外部(父)函数的变量。 + +为了更好地理解闭包,可以看看作用域及其执行上下文。 + +下面是一个简单的代码片段: + +``` +var hello = "Hello"; + +function sayHelloWorld() { + var world = "World"; +    function wish() { +        var year = "2021"; +        console.log(hello + " " + world + " "+ year); + } + wish(); +} +sayHelloWorld(); +``` + +下面是这段代码的执行上下文: + +![JS 代码的执行上下文][4] + +每次创建函数时(在函数创建阶段)都会创建闭包。每个闭包有三个作用域。 + + * 本地作用域(自己的作用域) + * 外部函数范围 + * 全局范围 + +我稍微修改一下上面的代码来演示一下闭包: + +``` +var hello = "Hello"; + +var sayHelloWorld = function() { + var world = "World"; +    function wish() { +        var year = "2021"; +        console.log(hello + " " + world + " "+ year); + } + return wish; +} +var callFunc = sayHelloWorld(); +callFunc(); +``` + +内部函数 `wish()` 在执行之前就从外部函数返回。这是因为 JavaScript 中的函数形成了**闭包**。 + + * 当 `sayHelloWorld` 运行时,`callFunc` 持有对函数 `wish` 的引用。 + * `wish` 保持对其周围(词法)环境的引用,其中存在变量 `world`。 + +### 私有变量和方法 + +本身,JavaScript 不支持创建私有变量和方法。闭包的一个常见和实用的用途是模拟私有变量和方法,并允许数据隐私。在闭包范围内定义的方法是有特权的。 + +这个代码片段捕捉了 JavaScript 中闭包的常用编写和使用方式: + +``` +var resourceRecord = function(myName, myAddress) { +  var resourceName = myName; +  var resourceAddress = myAddress; +  var accessRight = "HR"; +  return { +    changeName: function(updateName, privilege) { +      // only HR can change the name +      if (privilege === accessRight ) { +        resourceName = updateName; +        return true; +      } else { +        return false; +      } +    },   +    changeAddress: function(newAddress) { +      // any associate can change the address +      resourceAddress = newAddress;           +    },   +    showResourceDetail: function() { +      console.log ("Name:" + resourceName + " ; Address:" + resourceAddress); +    } +  } +} +// Create first record +var resourceRecord1 = resourceRecord("Perry","Office"); +// Create second record +var resourceRecord2 = resourceRecord("Emma","Office"); +// Change the address on the first record +resourceRecord1.changeAddress("Home"); +resourceRecord1.changeName("Perry Berry", "Associate"); // Output is false as only an HR can change the name +resourceRecord2.changeName("Emma Freeman", "HR"); // Output is true as HR changes the name +resourceRecord1.showResourceDetail(); // Output - Name:Perry ; Address:Home +resourceRecord2.showResourceDetail(); // Output - Name:Emma Freeman ; Address:Office +``` + +资源记录(`resourceRecord1` 和 `resourceRecord2`)相互独立。每个闭包通过自己的闭包引用不同版本的 `resourceName` 和 `resourceAddress` 变量。你也可以应用特定的规则来处理私有变量,我添加了一个谁可以修改 `resourceName` 的检查。 + +### 使用闭包 + +理解闭包是很重要的,因为它可以更深入地了解变量和函数之间的关系,以及 JavaScript 代码如何工作和执行。 + +-------------------------------------------------------------------------------- + +via: https://opensource.com/article/21/2/javascript-closures + +作者:[Nimisha Mukherjee][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/nimisha +[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://linux.cn/article-12830-1.html +[3]: https://developer.mozilla.org/en-US/docs/Web/JavaScript/Closures +[4]: https://opensource.com/sites/default/files/uploads/execution-context.png (Execution context for JS code) +[5]: https://creativecommons.org/licenses/by-sa/4.0/ diff --git a/published/202102/20210216 Meet Plots- A Mathematical Graph Plotting App for Linux Desktop.md b/published/202102/20210216 Meet Plots- A Mathematical Graph Plotting App for Linux Desktop.md new file mode 100644 index 0000000000..1232812fab --- /dev/null +++ b/published/202102/20210216 Meet Plots- A Mathematical Graph Plotting App for Linux Desktop.md @@ -0,0 +1,98 @@ +[#]: collector: (lujun9972) +[#]: translator: (geekpi) +[#]: reviewer: (wxy) +[#]: publisher: (wxy) +[#]: url: (https://linux.cn/article-13151-1.html) +[#]: subject: (Meet Plots: A Mathematical Graph Plotting App for Linux Desktop) +[#]: via: (https://itsfoss.com/plots-graph-app/) +[#]: author: (Abhishek Prakash https://itsfoss.com/author/abhishek/) + +认识 Plots:一款适用于 Linux 桌面的数学图形绘图应用 +====== + +![](https://img.linux.net.cn/data/attachment/album/202102/25/140338su2fju6016t5q2tz.jpg) + +Plots 是一款图形绘图应用,它可以轻松实现数学公式的可视化。你可以用它来绘制任意三角函数、双曲函数、指数函数和对数函数的和与积。 + +### 在 Linux 上使用 Plots 绘制数学图形 + +[Plots][1] 是一款简单的应用,它的灵感来自于像 [Desmos][2] 这样的 Web 图形绘图应用。它能让你绘制不同数学函数的图形,你可以交互式地输入这些函数,还可以自定义绘图的颜色。 + +Plots 是用 Python 编写的,它使用 [OpenGL][3] 来利用现代硬件。它使用 GTK 3,因此可以很好地与 GNOME 桌面集成。 + +![][4] + +使用 Plots 非常直白。要添加一个新的方程,点击加号。点击垃圾箱图标可以删除方程。还可以选择撤销和重做。你也可以放大和缩小。 + +![][5] + +你输入方程的文本框是友好的。菜单中有一个“帮助”选项可以访问文档。你可以在这里找到关于如何编写各种数学符号的有用提示。你也可以复制粘贴方程。 + +![][6] + +在深色模式下,侧栏公式区域变成了深色,但主绘图区域仍然是白色。我相信这也许是这样设计的。 + +你可以使用多个函数,并将它们全部绘制在一张图中: + +![][7] + +我发现它在尝试粘贴一些它无法理解的方程时崩溃了。如果你写了一些它不能理解的东西,或者与现有的方程冲突,所有图形都会消失,去掉不正确的方程就会恢复图形。 + +不幸的是,没有导出绘图或复制到剪贴板的选项。你可以随时 [在 Linux 中截图][8],并在你要添加图像的文档中使用它。 + +### 在 Linux 上安装 Plots + +Plots 为各种发行版提供了不同的安装方式。 + +Ubuntu 20.04 和 20.10 用户可以[使用 PPA][11]: + +``` +sudo add-apt-repository ppa:apandada1/plots +sudo apt update +sudo apt install plots +``` + +对于其他基于 Debian 的发行版,你可以使用 [这里][13] 的 [deb 文件安装][12]。 + +我没有在 AUR 软件包列表中找到它,但是作为 Arch Linux 用户,你可以使用 Flatpak 软件包或者使用 Python 安装它。 + +- [Plots Flatpak 软件包][14] + +如果你感兴趣,可以在它的 GitHub 仓库中查看源代码。如果你喜欢这款应用,请考虑在 GitHub 上给它 star。 + +- [GitHub 上的 Plots 源码][1] + +### 结论 + +Plots 主要用于帮助学生学习数学或相关科目,但它在很多其他场景下也能发挥作用。我知道不是每个人都需要,但肯定会对学术界和学校的人有帮助。 + +不过我倒是希望能有导出图片的功能。也许开发者可以在未来的版本中加入这个功能。 + +你知道有什么类似的绘图应用吗?Plots 与它们相比如何? + +-------------------------------------------------------------------------------- + +via: https://itsfoss.com/plots-graph-app/ + +作者:[Abhishek Prakash][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/abhishek/ +[b]: https://github.com/lujun9972 +[1]: https://github.com/alexhuntley/Plots/ +[2]: https://www.desmos.com/ +[3]: https://www.opengl.org/ +[4]: https://i0.wp.com/itsfoss.com/wp-content/uploads/2021/02/fourier-graph-plots.png?resize=800%2C492&ssl=1 +[5]: https://i1.wp.com/itsfoss.com/wp-content/uploads/2021/02/plots-app-linux-1.png?resize=800%2C518&ssl=1 +[6]: https://i2.wp.com/itsfoss.com/wp-content/uploads/2021/02/plots-app-linux.png?resize=800%2C527&ssl=1 +[7]: https://i1.wp.com/itsfoss.com/wp-content/uploads/2021/02/multiple-equations-plots.png?resize=800%2C492&ssl=1 +[8]: https://itsfoss.com/take-screenshot-linux/ +[10]: https://itsfoss.com/keenwrite/ +[11]: https://itsfoss.com/ppa-guide/ +[12]: https://itsfoss.com/install-deb-files-ubuntu/ +[13]: https://launchpad.net/~apandada1/+archive/ubuntu/plots/+packages +[14]: https://flathub.org/apps/details/com.github.alexhuntley.Plots diff --git a/published/202102/20210217 5 reasons to use Linux package managers.md b/published/202102/20210217 5 reasons to use Linux package managers.md new file mode 100644 index 0000000000..76842524a3 --- /dev/null +++ b/published/202102/20210217 5 reasons to use Linux package managers.md @@ -0,0 +1,75 @@ +[#]: collector: (lujun9972) +[#]: translator: (geekpi) +[#]: reviewer: (wxy) +[#]: publisher: (wxy) +[#]: url: (https://linux.cn/article-13160-1.html) +[#]: subject: (5 reasons to use Linux package managers) +[#]: via: (https://opensource.com/article/21/2/linux-package-management) +[#]: author: (Seth Kenlon https://opensource.com/users/seth) + +使用 Linux 软件包管理器的 5 个理由 +====== + +> 包管理器可以跟踪你安装的软件的所有组件,使得更新、重装和故障排除更加容易。 + +![](https://img.linux.net.cn/data/attachment/album/202102/28/123014kuhttz1kkkexwh9j.jpg) + +在 2021 年,人们喜欢 Linux 的理由比以往任何时候都多。在这个系列中,我将分享 21 个使用 Linux 的不同理由。今天,我将谈谈软件仓库。 + +在我使用 Linux 之前,我认为在计算机上安装的应用是理所当然的。我会根据需要安装应用,如果我最后没有使用它们,我就会把它们忘掉,让它们占用我的硬盘空间。终于有一天,我的硬盘空间会变得稀缺,我就会疯狂地删除应用,为更重要的数据腾出空间。但不可避免的是,应用只能释放出有限的空间,所以我将注意力转移到与这些应用一起安装的所有其他零碎内容上,无论是媒体内容还是配置文件和文档。这不是一个管理电脑的好方法。我知道这一点,但我并没有想过要有其他的选择,因为正如人们所说,你不知道自己不知道什么。 + +当我改用 Linux 时,我发现安装应用的方式有些不同。在 Linux 上,会建议你不要去网站上找应用的安装程序。取而代之的是,运行一个命令,应用就会被安装到系统上,并记录每个单独的文件、库、配置文件、文档和媒体资产。 + +### 什么是软件仓库? + +在 Linux 上安装应用的默认方法是从发行版软件仓库中安装。这可能听起来像应用商店,那是因为现代应用商店借鉴了很多软件仓库的概念。[Linux 也有应用商店][2],但软件仓库是独一无二的。你通过一个*包管理器*从软件仓库中获得一个应用,它使你的 Linux 系统能够记录和跟踪你所安装的每一个组件。 + +这里有五个原因可以让你确切地知道你的系统上有什么东西,可以说是非常有用。 + +#### 1、移除旧应用 + +当你的计算机知道应用安装的每一个文件时,卸载你不再需要的文件真的很容易。在 Linux 上,安装 [31 个不同的文本编辑器][3],然后卸载 30 个你不喜欢的文本编辑器是没有问题的。当你在 Linux 上卸载的时候,你就真的卸载了。 + +#### 2、按你的意思重新安装 + +不仅卸载要彻底,*重装*也很有意义。在许多平台上,如果一个应用出了问题,有时会建议你重新安装它。通常情况下,谁也说不清为什么要重装一个应用。不过,人们还是经常会隐隐约约地怀疑某个地方的文件已经损坏了(换句话说,数据写入错误),所以希望重装可以覆盖坏的文件以让软件重新工作。这是个不错的建议,但对于任何技术人员来说,不知道是什么地方出了问题都是令人沮丧的。更糟糕的是,如果不仔细跟踪,就不能保证所有的文件都会在重装过程中被刷新,因为通常没有办法知道与应用程序一起安装的所有文件在第一时间就删除了。有了软件包管理器,你可以强制彻底删除旧文件,以确保新文件的全新安装。同样重要的是,你可以研究每个文件并可能找出导致问题的文件,但这是开源和 Linux 的一个特点,而不是包管理。 + +#### 3、保持你应用的更新 + +不要听别人告诉你的 Linux 比其他操作系统“更安全”。计算机是由代码组成的,而我们人类每天都会以新的、有趣的方式找到利用这些代码的方法。因为 Linux 上的绝大多数应用都是开源的,所以许多漏洞都会以“常见漏洞和暴露Common Vulnerability and Exposures”(CVE)的形式公开。大量涌入的安全漏洞报告似乎是一件坏事,但这绝对是一个*知道*远比*不知道*好的案例。毕竟,没有人告诉你有问题,并不意味着没有问题。漏洞报告是好的。它们对每个人都有好处。而且,当开发人员修复安全漏洞时,对你而言,及时获得这些修复程序很重要,最好不用自己记着动手修复。 + +包管理器正是为了实现这一点而设计的。当应用收到更新时,无论是修补潜在的安全问题还是引入令人兴奋的新功能,你的包管理器应用都会提醒你可用的更新。 + +#### 4、保持轻便 + +假设你有应用 A 和应用 B,这两个应用都需要库 C。在某些操作系统上,通过得到 A 和 B,就会得到了两个 C 的副本。这显然是多余的,所以想象一下,每个应用都会发生几次。冗余的库很快就会增加,而且由于对一个给定的库没有单一的“正确”来源,所以几乎不可能确保你使用的是最新的甚至是一致的版本。 + +我承认我不会整天坐在这里琢磨软件库,但我确实记得我琢磨的日子,尽管我不知道这就是困扰我的原因。在我还没有改用 Linux 之前,我在处理工作用的媒体文件时遇到错误,或者在玩不同的游戏时出现故障,或者在阅读 PDF 时出现怪异的现象,等等,这些都不是什么稀奇的事情。当时我花了很多时间去调查这些错误。我仍然记得,我的系统上有两个主要的应用分别捆绑了相同(但有区别)的图形后端技术。当一个程序的输出导入到另一个程序时,这种不匹配会导致错误。它本来是可以工作的,但是由于同一个库文件集合的旧版本中的一个错误,一个应用的热修复程序并没有给另一个应用带来好处。 + +包管理器知道每个应用需要哪些后端(被称为*依赖关系*),并且避免重新安装已经在你系统上的软件。 + +#### 5、保持简单 + +作为一个 Linux 用户,我要感谢包管理器,因为它帮助我的生活变得简单。我不必考虑我安装的软件,我需要更新的东西,也不必考虑完成后是否真的将其卸载了。我毫不犹豫地试用软件。而当我在安装一台新电脑时,我运行 [一个简单的 Ansible 脚本][4] 来自动安装我所依赖的所有软件的最新版本。这很简单,很智能,也是一种独特的解放。 + +### 更好的包管理 + +Linux 从整体看待应用和操作系统。毕竟,开源是建立在其他开源工作基础上的,所以发行版维护者理解依赖*栈*的概念。Linux 上的包管理了解你的整个系统、系统上的库和支持文件以及你安装的应用。这些不同的部分协调工作,为你提供了一套高效、优化和强大的应用。 + +-------------------------------------------------------------------------------- + +via: https://opensource.com/article/21/2/linux-package-management + +作者:[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/OSDC_gift_giveaway_box_520x292.png?itok=w1YQhNH1 (Gift box opens with colors coming out) +[2]: http://flathub.org +[3]: https://opensource.com/article/21/1/text-editor-roundup +[4]: https://opensource.com/article/20/9/install-packages-ansible diff --git a/published/202102/20210217 Use this bootable USB drive on Linux to rescue Windows users.md b/published/202102/20210217 Use this bootable USB drive on Linux to rescue Windows users.md new file mode 100644 index 0000000000..73d93d1246 --- /dev/null +++ b/published/202102/20210217 Use this bootable USB drive on Linux to rescue Windows users.md @@ -0,0 +1,82 @@ +[#]: collector: (lujun9972) +[#]: translator: (geekpi) +[#]: reviewer: (wxy) +[#]: publisher: (wxy) +[#]: url: (https://linux.cn/article-13143-1.html) +[#]: subject: (Use this bootable USB drive on Linux to rescue Windows users) +[#]: via: (https://opensource.com/article/21/2/linux-woeusb) +[#]: author: (Don Watkins https://opensource.com/users/don-watkins) + +如何在 Linux 中创建 USB 启动盘来拯救 Windows 用户 +====== + +> WoeUSB 可以在 Linux 中制作 Windows 启动盘,并帮助你的朋友解锁他们罢工的机器。 + +![](https://img.linux.net.cn/data/attachment/album/202102/22/143829x0gm1gkmw1yb1zu8.jpg) + +人们经常要求我帮助他们恢复被锁死或损坏的 Windows 电脑。有时,我可以使用 Linux USB 启动盘来挂载 Windows 分区,然后从损坏的系统中传输和备份文件。 + +有的时候,客户丢失了他们的密码或以其他方式锁死了他们的登录账户凭证。解锁账户的一种方法是创建一个 Windows 启动盘来修复计算机。微软允许你从网站下载 Windows 的副本,并提供创建 USB 启动盘的工具。但要使用它们,你需要一台 Windows 电脑,这意味着,作为一个 Linux 用户,我需要其他方法来创建一个 DVD 或 USB 启动盘。我发现在 Linux 上创建 Windows USB 很困难。我的可靠工具,如 [Etcher.io][2]、[Popsicle][3](适用于 Pop!_OS)和 [UNetbootin][4],或者从命令行使用 `dd` 来创建可启动媒体,都不是很成功。 + +直到我发现了 [WoeUSB-ng][5],一个 [GPL 3.0][6] 许可的 Linux 工具,它可以为 Windows Vista、7、8 和 10 创建一个 USB 启动盘。这个开源软件有两个程序:一个命令行工具和一个图形用户界面 (GUI) 版本。 + +### 安装 WoeUSB-ng + +GitHub 仓库包含了在 Arch、Ubuntu、Fedora 或使用 pip3 [安装][7] WoeUSB-ng 的说明。 + +如果你是受支持的 Linux 发行版,你可以使用你的包管理器安装 WoeUSB-ng。或者,你可以使用 Python 的包管理器 [pip][8] 来安装应用程序。这在任何 Linux 发行版中都是通用的。这些方法在功能上没有区别,所以使用你熟悉的任何一种。 + +我运行的是 Pop!_OS,它是 Ubuntu 的衍生版本,但由于对 Python 很熟悉,我选择了 pip3 安装: + +``` +$ sudo pip3 install WoeUSB-ng +``` + +### 创建一个启动盘 + +你可以从命令行或 GUI 版本使用 WoeUSB-ng。 + +要从命令行创建一个启动盘,语法要求命令包含 Windows ISO 文件的路径和一个设备。(本例中是 `/dev/sdX`。使用 `lsblk` 命令来确定你的驱动器) + +``` +$ sudo woeusb --device Windows.iso /dev/sdX +``` + +你也可以启动该程序,以获得简单易用的界面。在 WoeUSB-ng 应用程序窗口中,找到 `Windows.iso` 文件并选择它。选择你的 USB 目标设备(你想变成 Windows 启动盘的驱动器)。这将会删除这个驱动器上的所有信息,所以要谨慎选择,然后仔细检查(再三检查)你的选择! + +当你确认正确选择目标驱动器后,点击 **Install** 按钮。 + +![WoeUSB-ng UI][9] + +创建该介质需要 5 到 10 分钟,这取决于你的 Linux 电脑的处理器、内存、USB 端口速度等。请耐心等待。 + +当这个过程完成并验证后,你将有可用的 Windows USB 启动盘,以帮助其他人修复 Windows 计算机。 + +### 帮助他人 + +开源就是为了帮助他人。很多时候,你可以通过使用基于 Linux 的[系统救援 CD][11] 来帮助 Windows 用户。但有时,唯一的帮助方式是直接从 Windows 中获取,而 WoeUSB-ng 是一个很好的开源工具,它可以让这成为可能。 + +-------------------------------------------------------------------------------- + +via: https://opensource.com/article/21/2/linux-woeusb + +作者:[Don Watkins][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/don-watkins +[b]: https://github.com/lujun9972 +[1]: https://opensource.com/sites/default/files/styles/image-full-size/public/lead-images/puzzle_computer_solve_fix_tool.png?itok=U0pH1uwj (Puzzle pieces coming together to form a computer screen) +[2]: https://etcher.io/ +[3]: https://github.com/pop-os/popsicle +[4]: https://github.com/unetbootin/unetbootin +[5]: https://github.com/WoeUSB/WoeUSB-ng +[6]: https://github.com/WoeUSB/WoeUSB-ng/blob/master/COPYING +[7]: https://github.com/WoeUSB/WoeUSB-ng#installation +[8]: https://opensource.com/downloads/pip-cheat-sheet +[9]: https://opensource.com/sites/default/files/uploads/woeusb-ng-gui.png (WoeUSB-ng UI) +[10]: https://creativecommons.org/licenses/by-sa/4.0/ +[11]: https://www.system-rescue.org/ diff --git a/published/202102/20210218 5 must-have Linux media players.md b/published/202102/20210218 5 must-have Linux media players.md new file mode 100644 index 0000000000..1125465ae2 --- /dev/null +++ b/published/202102/20210218 5 must-have Linux media players.md @@ -0,0 +1,90 @@ +[#]: collector: (lujun9972) +[#]: translator: (geekpi) +[#]: reviewer: (wxy) +[#]: publisher: (wxy) +[#]: url: (https://linux.cn/article-13148-1.html) +[#]: subject: (5 must-have Linux media players) +[#]: via: (https://opensource.com/article/21/2/linux-media-players) +[#]: author: (Seth Kenlon https://opensource.com/users/seth) + +5 款值得拥有的 Linux 媒体播放器 +====== + +> 无论是电影还是音乐,Linux 都能为你提供一些优秀的媒体播放器。 + +![](https://img.linux.net.cn/data/attachment/album/202102/24/101806k2g26zfcamiffhlb.jpg) + +在 2021 年,人们有更多的理由喜欢 Linux。在这个系列中,我将分享 21 个使用 Linux 的不同理由。媒体播放是我最喜欢使用 Linux 的理由之一。 + +你可能更喜欢黑胶唱片和卡带,或者录像带和激光影碟,但你很有可能还是在数字设备上播放你喜欢的大部分媒体。电脑上的媒体有一种无法比拟的便利性,这主要是因为我们大多数人一天中的大部分时间都在电脑附近。许多现代电脑用户并没有过多考虑有哪些应用可以用来听音乐和看电影,因为大多数操作系统都默认提供了媒体播放器,或者因为他们订阅了流媒体服务,因此并没有把媒体文件放在自己身边。但如果你的口味超出了通常的热门音乐和节目列表,或者你以媒体工作为乐趣或利润,那么你就会有你想要播放的本地文件。你可能还对现有用户界面有意见。在 Linux 上,*选择*是一种权利,因此你可以选择无数种播放媒体的方式。 + +以下是我在 Linux 上必备的五个媒体播放器。 + +### 1、mpv + +![mpv interface][2] + +一个现代、干净、简约的媒体播放器。得益于它的 Mplayer、[ffmpeg][3] 和 `libmpv` 后端,它可以播放你可能会扔给它的任何类型媒体。我说“扔给它”,是因为播放一个文件的最快捷、最简单的方法就是把文件拖到 mpv 窗口中。如果你拖动多个文件,mpv 会为你创建一个播放列表。 + +当你把鼠标放在上面时,它提供了直观的覆盖控件,但最好还是通过键盘操作界面。例如,`Alt+1` 会使 mpv 窗口变成全尺寸,而 `Alt+0` 会使其缩小到一半大小。你可以使用 `,` 和 `.` 键逐帧浏览视频,`[` 和 `]` 键调整播放速度,`/` 和 `*` 调整音量,`m` 静音等等。这些主控功能可以让你快速调整,一旦你学会了这些功能,你几乎可以在想到要调整播放的时候快速调整。无论是工作还是娱乐,mpv 都是我播放媒体的首选。 + +### 2、Kaffeine 和 Rhythmbox + +![Kaffeine interface][4] + +KDE Plasma 和 GNOME 桌面都提供了音乐应用([Kaffeine][5] 和 [Rhythmbox][]),可以作为你个人音乐库的前端。它们会让你为你的音乐文件提供一个标准的位置,然后扫描你的音乐收藏,这样你就可以根据专辑、艺术家等来浏览。这两款软件都很适合那些你无法完全决定你想听什么,而又想用一种简单的方式来浏览现有音乐的时候。 + +[Kaffeine][5] 其实不仅仅是一个音乐播放器。它可以播放视频文件、DVD、CD,甚至数字电视(假设你有输入信号)。我已经整整几天没有关闭 Kaffeine 了,因为不管我是想听音乐还是看电影,Kaffeine 都能让我轻松地开始播放。 + +### 3、Audacious + +![Audacious interface][6] + +[Audacious][7] 媒体播放器是一个轻量级的应用,它可以播放你的音乐文件(甚至是 MIDI 文件)或来自互联网的流媒体音乐。对我来说,它的主要吸引力在于它的模块化架构,它鼓励开发插件。这些插件可以播放几乎所有你能想到的音频媒体格式,用图形均衡器调整声音,应用效果,甚至可以重塑整个应用,改变其界面。 + +很难把 Audacious 仅仅看作是一个应用,因为它很容易让它变成你想要的应用。无论你是 Linux 上的 XMMS、Windows 上的 WinAmp,还是任何其他替代品,你大概都可以用 Audacious 来近似它们。Audacious 还提供了一个终端命令,`audtool`,所以你可以从命令行控制一个正在运行的 Audacious 实例,所以它甚至可以近似于一个终端媒体播放器! + +### 4、VLC + +![vlc interface][8] + +[VLC][9] 播放器可能是向用户介绍开源的应用之首。作为一款久经考验的多媒体播放器,VLC 可以播放音乐、视频、光盘。它还可以通过网络摄像头或麦克风进行流式传输和录制,从而使其成为捕获快速视频或语音消息的简便方法。像 mpv 一样,大多数情况下都可以通过按单个字母的键盘操作来控制它,但它也有一个有用的右键菜单。它可以将媒体从一种格式转换为另一种格式、创建播放列表、跟踪你的媒体库等。VLC 是最好的,大多数播放器甚至无法在功能上与之匹敌。无论你在什么平台上,它都是一款必备的应用。 + +### 5、Music player daemon + +![mpd with the ncmpc interface][10] + +[music player daemon(mpd)][11] 是一个特别有用的播放器,因为它在服务器上运行。这意味着你可以在 [树莓派][12] 上启动它,然后让它处于空闲状态,这样你就可以在任何时候播放一首曲子。mpd 的客户端有很多,但我用的是 [ncmpc][13]。有了 ncmpc 或像 [netjukebox][14] 这样的 Web 客户端,我可以从本地主机或远程机器上连接 mpd,选择一张专辑,然后从任何地方播放它。 + +### Linux 上的媒体播放 + +在 Linux 上播放媒体是很容易的,这要归功于它出色的编解码器支持和惊人的播放器选择。我只提到了我最喜欢的五个播放器,但还有更多的播放器供你探索。试试它们,找到最好的,然后坐下来放松一下。 + +-------------------------------------------------------------------------------- + +via: https://opensource.com/article/21/2/linux-media-players + +作者:[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/LIFE_film.png?itok=aElrLLrw (An old-fashioned video camera) +[2]: https://opensource.com/sites/default/files/mpv_0.png +[3]: https://opensource.com/article/17/6/ffmpeg-convert-media-file-formats +[4]: https://opensource.com/sites/default/files/kaffeine.png +[5]: https://apps.kde.org/en/kaffeine +[6]: https://opensource.com/sites/default/files/audacious.png +[7]: https://audacious-media-player.org/ +[8]: https://opensource.com/sites/default/files/vlc_0.png +[9]: http://videolan.org +[10]: https://opensource.com/sites/default/files/mpd-ncmpc.png +[11]: https://www.musicpd.org/ +[12]: https://opensource.com/article/21/1/raspberry-pi-hifi +[13]: https://www.musicpd.org/clients/ncmpc/ +[14]: http://www.netjukebox.nl/ +[15]: https://wiki.gnome.org/Apps/Rhythmbox \ No newline at end of file diff --git a/published/202102/20210219 7 Ways to Customize Cinnamon Desktop in Linux -Beginner-s Guide.md b/published/202102/20210219 7 Ways to Customize Cinnamon Desktop in Linux -Beginner-s Guide.md new file mode 100644 index 0000000000..5fd5bdcd1a --- /dev/null +++ b/published/202102/20210219 7 Ways to Customize Cinnamon Desktop in Linux -Beginner-s Guide.md @@ -0,0 +1,132 @@ +[#]: collector: (lujun9972) +[#]: translator: (geekpi) +[#]: reviewer: (wxy) +[#]: publisher: (wxy) +[#]: url: (https://linux.cn/article-13145-1.html) +[#]: subject: (7 Ways to Customize Cinnamon Desktop in Linux [Beginner’s Guide]) +[#]: via: (https://itsfoss.com/customize-cinnamon-desktop/) +[#]: author: (Dimitrios https://itsfoss.com/author/dimitrios/) + +初级:在 Linux 中自定义 Cinnamon 桌面的 7 种方法 +====== + +![](https://img.linux.net.cn/data/attachment/album/202102/23/095703u8t88l0rpf4o4p5o.jpg) + +Linux Mint 是最好的 [适合初学者的 Linux 发行版][1] 之一。尤其是想 [转战 Linux][2] 的 Windows 用户,会发现它的 Cinnamon 桌面环境非常熟悉。 + +Cinnamon 给人一种传统的桌面体验,很多用户喜欢它的样子。这并不意味着你必须满足于它提供的东西。Cinnamon 提供了几种自定义桌面的方式。 + +在阅读了 [MATE][3] 和 [KDE 自定义][4] 指南后,很多读者要求为 Linux Mint Cinnamon 也提供类似的教程。因此,我创建了这个关于调整 Cinnamon 桌面的外观和感觉的基本指南。 + +### 7 种自定义 Cinnamon 桌面的不同方法 + +在本教程中,我使用的是 [Linux Mint Debian Edition][5](LMDE 4)。你可以在任何运行 Cinnamon 的 Linux 发行版上使用这篇文章的方法。如果你不确定,这里有 [如何检查你使用的桌面环境][6]。 + +当需要改变 Cinnamon 桌面外观时,我发现非常简单,因为只需点击两下即可。如下图所示,点击菜单图标,然后点击“设置”。 + +![][7] + +所有的外观设置都放在该窗口的顶部。在“系统设置”窗口上的一切都显得整齐划一。 + +![][8] + +#### 1、效果 + +效果选项简单,不言自明,一目了然。你可以开启或关闭桌面不同元素的特效,或者通过改变特效风格来改变窗口过渡。如果你想改变效果的速度,可以通过自定义标签来实现。 + +![][9] + +#### 2、字体选择 + +在这个部分,你可以区分整个系统中使用的字体大小和类型,通过字体设置,你可以对外观进行微调。 + +![][10] + +#### 3、主题和图标 + +我曾经做了几年的 Linux Mint 用户,一个原因是你不需要到处去改变你想要的东西。窗口管理器、图标和面板定制都在一个地方! + +你可以将面板改成深色或浅色,窗口边框也可以根据你要的而改变。默认的 Cinnamon 外观设置在我眼里是最好的,我甚至在测试 [Ubuntu Cinnamon Remix][11] 时也应用了一模一样的设置,不过是橙色的。 + +![][12] + +#### 4、Cinnamon 小程序 + +Cinnamon 小程序是所有包含在底部面板的元素,如日历或键盘布局切换器。在管理选项卡中,你可以添加/删除已经安装的小程序。 + +你一定要探索一下可以下载的小程序,如天气和 [CPU 温度][13]指示小程序是我额外选择的。 + +![][14] + +#### 5、Cinnamon Desklets + +Cinnamon Desklets 是可以直接放置在桌面上的应用。和其他所有的自定义选项一样,Desklets 可以从设置菜单中访问,各种各样的选择可以吸引任何人的兴趣。谷歌日历是一个方便的应用,可以直接在桌面上跟踪你的日程安排。 + +![][15] + +#### 6、桌面壁纸 + +要改变 Cinnamon 桌面的背景,只需在桌面上点击右键,选择“改变桌面背景”。它将打开一个简单易用的窗口,在左侧列出了可用的背景系统文件夹,右侧有每个文件夹内的图片预览。 + +![][16] + +你可以通过点击加号(`+`)并选择路径来添加自己的文件夹。在“设置”选项卡中,你可以选择你的背景是静态还是幻灯片,以及背景在屏幕上的位置。 + +![][17] + +#### 7、自定义桌面屏幕上的内容 + +背景并不是你唯一可以改变的桌面元素。如果你在桌面上点击右键,然后点击“自定义”,你可以找到更多的选项。 + +![][18] + +你可以改变图标的大小,将摆放方式从垂直改为水平,并改变它们在两个轴上的间距。如果你不喜欢你所做的,点击重置网格间距回到默认值。 + +![][19] + +此外,如果你点击“桌面设置”,将显示更多的选项。你可以禁用桌面上的图标,将它们放在主显示器或副显示器上,甚至两个都可以。如你所见,你可以选择一些图标出现在桌面上。 + +![][20] + +### 总结 + +Cinnamon 桌面是最好的选择之一,尤其是当你正在 [从 windows 切换到 Linux][21] 的时候,同时对一个简单而优雅的桌面追求者也是如此。 + +Cinnamon 桌面非常稳定,在我手上从来没有崩溃过,这也是在各种 Linux 发行版之间,我使用它这么久的主要原因之一。 + +我没有讲得太详细,但给了你足够的指导,让你自己去探索设置。欢迎反馈你对 Cinnamon 的定制。 + +-------------------------------------------------------------------------------- + +via: https://itsfoss.com/customize-cinnamon-desktop/ + +作者:[Dimitrios][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/dimitrios/ +[b]: https://github.com/lujun9972 +[1]: https://itsfoss.com/best-linux-beginners/ +[2]: https://itsfoss.com/reasons-switch-linux-windows-xp/ +[3]: https://itsfoss.com/ubuntu-mate-customization/ +[4]: https://itsfoss.com/kde-customization/ +[5]: https://itsfoss.com/lmde-4-release/ +[6]: https://itsfoss.com/find-desktop-environment/ +[7]: https://i1.wp.com/itsfoss.com/wp-content/uploads/2021/02/6-Cinnamon-settings.png?resize=800%2C680&ssl=1 +[8]: https://i0.wp.com/itsfoss.com/wp-content/uploads/2021/02/7-Cinnamon-Settings.png?resize=800%2C630&ssl=1 +[9]: https://i0.wp.com/itsfoss.com/wp-content/uploads/2021/02/8-cinnamon-effects.png?resize=800%2C630&ssl=1 +[10]: https://i1.wp.com/itsfoss.com/wp-content/uploads/2021/02/11-font-selection.png?resize=800%2C650&ssl=1 +[11]: https://itsfoss.com/ubuntu-cinnamon-remix-review/ +[12]: https://i1.wp.com/itsfoss.com/wp-content/uploads/2021/02/10-cinnamon-themes-and-icons.png?resize=800%2C630&ssl=1 +[13]: https://itsfoss.com/check-laptop-cpu-temperature-ubuntu/ +[14]: https://i0.wp.com/itsfoss.com/wp-content/uploads/2021/02/12-cinnamon-applets.png?resize=800%2C630&ssl=1 +[15]: https://i0.wp.com/itsfoss.com/wp-content/uploads/2021/02/13-cinnamon-desklets.png?resize=800%2C630&ssl=1 +[16]: https://i0.wp.com/itsfoss.com/wp-content/uploads/2021/02/1.-Cinnamon-change-desktop-background.png?resize=800%2C400&ssl=1 +[17]: https://i0.wp.com/itsfoss.com/wp-content/uploads/2021/02/2-Cinnamon-change-desktop-background.png?resize=800%2C630&ssl=1 +[18]: https://i1.wp.com/itsfoss.com/wp-content/uploads/2021/02/1.-desktop-additional-customization.png?resize=800%2C400&ssl=1 +[19]: https://i1.wp.com/itsfoss.com/wp-content/uploads/2021/02/4-desktop-additional-customization.png?resize=800%2C480&ssl=1 +[20]: https://i2.wp.com/itsfoss.com/wp-content/uploads/2021/02/5-desktop-additional-customization.png?resize=800%2C630&ssl=1 +[21]: https://itsfoss.com/guide-install-linux-mint-16-dual-boot-windows/ diff --git a/published/202102/20210219 Unlock your Chromebook-s hidden potential with Linux.md b/published/202102/20210219 Unlock your Chromebook-s hidden potential with Linux.md new file mode 100644 index 0000000000..7612fa716f --- /dev/null +++ b/published/202102/20210219 Unlock your Chromebook-s hidden potential with Linux.md @@ -0,0 +1,127 @@ +[#]: collector: (lujun9972) +[#]: translator: (max27149) +[#]: reviewer: (wxy) +[#]: publisher: (wxy) +[#]: url: (https://linux.cn/article-13149-1.html) +[#]: subject: (Unlock your Chromebook's hidden potential with Linux) +[#]: via: (https://opensource.com/article/21/2/chromebook-linux) +[#]: author: (Seth Kenlon https://opensource.com/users/seth) + +用 Linux 释放你 Chromebook 的隐藏潜能 +====== + +> Chromebook 是令人惊叹的工具,但通过解锁它内部的 Linux 系统,你可以让它变得更加不同凡响。 + +![](https://img.linux.net.cn/data/attachment/album/202102/24/114254qstdq1dhj288jh1z.jpg) + +Google Chromebook 运行在 Linux 系统之上,但通常它运行的 Linux 系统对普通用户而言,并不是十分容易就能访问得到。Linux 被用作基于开源的 [Chromium OS][2] 运行时环境的后端技术,然后 Google 将其转换为 Chrome OS。大多数用户体验到的界面是一个电脑桌面,可以用来运行 Chrome 浏览器及其应用程序。然而,在这一切的背后,有一个 Linux 系统等待被你发现。如果你知道怎么做,你可以在 Chromebook 上启用 Linux,把一台可能价格相对便宜、功能相对基础的电脑变成一个严谨的笔记本,获取数百个应用和你需要的所有能力,使它成为一个通用计算机。 + +### 什么是 Chromebook? + +Chromebook 是专为 Chrome OS 创造的笔记本电脑,它本身专为特定的笔记本电脑型号而设计。Chrome OS 不是像 Linux 或 Windows 这样的通用操作系统,而是与 Android 或 iOS 有更多的共同点。如果你决定购买 Chromebook,你会发现有许多不同制造商的型号,包括惠普、华硕和联想等等。有些是为学生而设计,而另一些是为家庭或商业用户而设计的。主要的区别通常分别集中在电池功率或处理能力上。 + +无论你决定买哪一款,Chromebook 都会运行 Chrome OS,并为你提供现代计算机所期望的基本功能。有连接到互联网的网络管理器、蓝牙、音量控制、文件管理器、桌面等等。 + +![Chrome OS desktop][3] + +*Chrome OS 桌面截图* + +不过,想从这个简单易用的操作系统中获得更多,你只需要激活 Linux。 + +### 启用 Chromebook 的开发者模式 + +如果我让你觉得启用 Linux 看似简单,那是因为它确实简单但又有欺骗性。之所以说有欺骗性,是因为在启用 Linux 之前,你*必须*备份数据。 + +这个过程虽然简单,但它确实会将你的计算机重置回出厂默认状态。你必须重新登录到你的笔记本电脑中,如果你有数据存储在 Google 云盘帐户上,你必须得把它重新同步回计算机中。启用 Linux 还需要为 Linux 预留硬盘空间,因此无论你的 Chromebook 硬盘容量是多少,都将减少一半或四分之一(自主选择)。 + +在 Chromebook 上接入 Linux 仍被 Google 视为测试版功能,因此你必须选择使用开发者模式。开发者模式的目的是允许软件开发者测试新功能,安装新版本的操作系统等等,但它可以为你解锁仍在开发中的特殊功能。 + +要启用开发者模式,请首先关闭你的 Chromebook。假定你已经备份了设备上的所有重要信息。 + +接下来,按下键盘上的 `ESC` 和 `⟳`,再按 **电源键** 启动 Chromebook。 + +![ESC and refresh buttons][4] + +*ESC 键和 ⟳ 键* + +当提示开始恢复时,按键盘上的 `Ctrl+D`。 + +恢复结束后,你的 Chromebook 已重置为出厂设置,且没有默认的使用限制。 + +### 开机启动进入开发者模式 + +在开发者模式下运行意味着每次启动 Chromebook 时,都会提醒你处于开发者模式。你可以按 `Ctrl+D` 跳过启动延迟。有些 Chromebook 会在几秒钟后发出蜂鸣声来提醒你处于开发者模式,使得 `Ctrl+D` 操作几乎是强制的。从理论上讲,这个操作很烦人,但在实践中,我不经常启动我的 Chromebook,因为我只是唤醒它,所以当我需要这样做的时候,`Ctrl+D` 只不过是整个启动过程中小小的一步。 + +启用开发者模式后的第一次启动时,你必须重新设置你的设备,就好像它是全新的一样。你只需要这样做一次(除非你在未来某个时刻停用开发者模式)。 + +### 启用 Chromebook 上的 Linux + +现在,你已经运行在开发者模式下,你可以激活 Chrome OS 中的 **Linux Beta** 功能。要做到这一点,请打开 **设置**,然后单击左侧列表中的 **Linux Beta**。 + +激活 **Linux Beta**,并为你的 Linux 系统和应用程序分配一些硬盘空间。在最糟糕的时候,Linux 是相当轻量级的,所以你真的不需要分配太多硬盘空间,但它显然取决于你打算用 Linux 来做多少事。4 GB 的空间对于 Linux 以及几百个终端命令还有二十多个图形应用程序是足够的。我的 Chromebook 有一个 64 GB 的存储卡,我给了 Linux 系统 30 GB,那是因为我在 Chromebook 上所做的大部分事情都是在 Linux 内完成的。 + +一旦你的 **Linux Beta** 环境准备就绪,你可以通过按键盘上的**搜索**按钮和输入 `terminal` 来启动终端。如果你还是 Linux 新手,你可能不知道当前进入的终端能用来安装什么。当然,这取决于你想用 Linux 来做什么。如果你对 Linux 编程感兴趣,那么你可能会从 Bash(它已经在终端中安装和运行了)和 Python 开始。如果你对 Linux 中的那些迷人的开源应用程序感兴趣,你可以试试 GIMP、MyPaint、LibreOffice 或 Inkscape 等等应用程序。 + +Chrome OS 的 **Linux Beta** 模式不包含图形化的软件安装程序,但 [应用程序可以从终端安装][5]。可以使用 `sudo apt install` 命令安装应用程序。 + + * `sudo` 命令可以允许你使用超级管理员权限来执行某些命令(即 Linux 中的 `root`)。 + * `apt` 命令是一个应用程序的安装工具。 + * `install` 是命令选项,即告诉 `apt` 命令要做什么。 + +你还必须把想要安装的软件包的名字和 `apt` 命令写在一起。以安装 LibreOffice 举例: + +``` +sudo apt install libreoffice +``` +当有提示是否继续时,输入 `y`(代表“确认”),然后按 **回车键**。 + +一旦应用程序安装完毕,你可以像在 Chrome OS 上启动任何应用程序一样启动它:只需要在应用程序启动器输入它的名字。 + +了解 Linux 应用程序的名字和它的包名需要花一些时间,但你也可以用 `apt search` 命令来搜索。例如,可以用以下的方法是找到关于照片的应用程序: + +``` +apt search photo +``` + +因为 Linux 中有很多的应用程序,所以你可以找一些感兴趣的东西,然后尝试一下! + +### 与 Linux 共享文件和设备 + + **Linux Beta** 环境运行在 [容器][7] 中,因此 Chrome OS 需要获得访问 Linux 文件的权限。要授予 Chrome OS 与你在 Linux 上创建的文件的交互权限,请右击要共享的文件夹并选择 **管理 Linux 共享**。 + +![Chrome OS Manage Linux sharing interface][8] + +*Chrome OS 的 Linux 管理共享界面* + +你可以通过 Chrome OS 的 **设置** 程序来管理共享设置以及其他设置。 + +![Chrome OS Settings menu][9] + +*Chrome OS 设置菜单* + +### 学习 Linux + +如果你肯花时间学习 Linux,你不仅能够解锁你 Chromebook 中隐藏的潜力,还能最终学到很多关于计算机的知识。Linux 是一个有价值的工具,一个非常有趣的玩具,一个通往比常规计算更令人兴奋的事物的大门。去了解它吧,你可能会惊讶于你自己和你 Chromebook 的无限潜能。 + +--- + +源自: https://opensource.com/article/21/2/chromebook-linux + +作者:[Seth Kenlon][a] +选题:[lujun9972][b] +译者:[max27149](https://github.com/max27149) +校对:[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/wfh_work_home_laptop_work.png?itok=VFwToeMy (Working from home at a laptop) +[2]: https://www.chromium.org/chromium-os +[3]: https://opensource.com/sites/default/files/chromeos.png +[4]: https://opensource.com/sites/default/files/esc-refresh.png +[5]: https://opensource.com/article/18/1/how-install-apps-linux +[6]: https://opensource.com/tags/linux +[7]: https://opensource.com/resources/what-are-linux-containers +[8]: https://opensource.com/sites/default/files/chromeos-manage-linux-sharing.png +[9]: https://opensource.com/sites/default/files/chromeos-beta-linux.png diff --git a/published/202102/20210220 Starship- Open-Source Customizable Prompt for Any Shell.md b/published/202102/20210220 Starship- Open-Source Customizable Prompt for Any Shell.md new file mode 100644 index 0000000000..0f04781757 --- /dev/null +++ b/published/202102/20210220 Starship- Open-Source Customizable Prompt for Any Shell.md @@ -0,0 +1,180 @@ +[#]: collector: (lujun9972) +[#]: translator: (wxy) +[#]: reviewer: (wxy) +[#]: publisher: (wxy) +[#]: url: (https://linux.cn/article-13152-1.html) +[#]: subject: (Starship: Open-Source Customizable Prompt for Any Shell) +[#]: via: (https://itsfoss.com/starship/) +[#]: author: (Ankush Das https://itsfoss.com/author/ankush/) + +Starship:跨 shell 的可定制的提示符 +====== + +![](https://img.linux.net.cn/data/attachment/album/202102/25/142817taqq2ahab0t61zss.jpg) + +> 如果你很在意你的终端的外观的话,一个跨 shell 的提示符可以让你轻松地定制和配置 Linux 终端提示符。 + +虽然我已经介绍了一些帮助你 [自定义终端外观][1] 的技巧,但我也发现了一些有趣的跨 shell 提示符的建议。 + +### Starship:轻松地调整你的 Linux Shell 提示符 + +![][2] + +[Starship][3] 是一个用 [Rust][4] 编写的开源项目,它可以帮助你建立一个精简、快速、可定制的 shell 提示符。 + +无论你是使用 bash、fish、还是 Windows 上的 PowerShell,抑或其他 shell,你都可以利用Starship 来定制外观。 + +请注意,你必须了解它的 [官方文档][5] 才能对所有你喜欢的东西进行高级配置,但在这里,我将包括一个简单的示例配置,以有一个良好的开端,以及一些关于 Startship 的关键信息。 + +Startship 专注于为你提供一个精简的、快速的、有用的默认 shell 提示符。它甚至会记录并显示执行一个命令所需的时间。例如,这里有一张截图: + +![][6] + +不仅如此,根据自己的喜好定制提示符也相当简单。下面是一张官方 GIF,展示了它的操作: + +![][7] + +让我帮你设置一下。我是在 Ubuntu 上使用 bash shell 来测试的。你可以参考我提到的步骤,或者你可以看看 [官方安装说明][8],以获得在你的系统上安装它的更多选择。 + +### Starship 的亮点 + + * 跨平台 + * 跨 shell 支持 + * 能够添加自定义命令 + * 定制 git 体验 + * 定制使用特定编程语言时的体验 + * 轻松定制提示符的每一个方面,而不会对性能造成实质影响 + +### 在 Linux 上安装 Starship + +> 安装 Starship 需要下载一个 bash 脚本,然后用 root 权限运行该脚本。 +> +> 如果你不习惯这样做,你可以使用 snap。 +> +> ``` +> sudo snap install starship +> ``` + +**注意**:你需要安装 [Nerd 字体][9] 才能获得完整的体验。 + +要开始使用,请确保你安装了 [curl][10]。你可以通过键入如下命令来轻松安装它: + +``` +sudo apt install curl +``` + +完成后,输入以下内容安装 Starship: + +``` +curl -fsSL https://starship.rs/install.sh | bash +``` + +这应该会以 root 身份将 Starship 安装到 `usr/local/bin`。你可能会被提示输入密码。看起来如下: + +![][11] + +### 在 bash 中添加 Starship + +如截图所示,你会在终端本身得到设置的指令。在这里,我们需要在 `.bashrc` 用户文件的末尾添加以下一行: + +``` +eval "$(starship init bash)" +``` + +要想轻松添加,只需键入: + +``` +nano .bashrc +``` + +然后,通过向下滚动导航到文件的末尾,并在文件末尾添加如下图所示的行: + +![][12] + +完成后,只需重启终端或重启会话即可看到一个精简的提示符。对于你的 shell 来说,它可能看起来有点不同,但默认情况下应该是一样的。 + +![][13] + +设置好后,你就可以继续自定义和配置提示符了。让我给你看一个我做的配置示例: + +### 配置 Starship 提示符:基础 + +开始你只需要在 `.config` 目录下制作一个配置文件([TOML文件][14])。如果你已经有了这个目录,直接导航到该目录并创建配置文件。 + +下面是创建目录和配置文件时需要输入的内容: + +``` +mkdir -p ~/.config && touch ~/.config/starship.toml +``` + +请注意,这是一个隐藏目录。所以,当你试图使用文件管理器从主目录访问它时,请确保在继续之前 [启用查看隐藏文件][15]。 + +接下来如果你想探索一些你喜欢的东西,你应该参考配置文档。 + +举个例子,我配置了一个简单的自定义提示,看起来像这样: + +![][16] + +为了实现这个目标,我的配置文件是这样的: + +![][17] + +根据他们的官方文档,这是一个基本的自定义格式。但是,如果你不想要自定义格式,只是想用一种颜色或不同的符号来自定义默认的提示,那就会像这样: + +![][18] + +上述定制的配置文件是这样的: + +![][19] + +当然,这不是我能做出的最好看的提示符,但我希望你能理解其配置方式。 + +你可以通过包括图标或表情符来定制目录的外观,你可以调整变量、格式化字符串、显示 git 提交,或者根据使用特定编程语言而调整。 + +不仅如此,你还可以创建在你的 shell 中使用的自定义命令,让事情变得更简单或舒适。 + +你可以在他们的 [官方网站][3] 和它的 [GitHub 页面][20] 中探索更多的信息。 + +- [Starship.rs][3] + +### 结论 + +如果你只是想做一些小的调整,这文档可能会太复杂了。但是,即使如此,它也可以让你用很少的努力实现一个自定义的提示符或精简的提示符,你可以应用于任何普通的 shell 和你正在使用的系统。 + +总的来说,我不认为它非常有用,但有几个读者建议使用它,看来人们确实喜欢它。我很想看看你是如何 [自定义 Linux 终端][1] 以适应不同的使用方式。 + +欢迎在下面的评论中分享你的看法,如果你喜欢的话。 + +-------------------------------------------------------------------------------- + +via: https://itsfoss.com/starship/ + +作者:[Ankush Das][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://itsfoss.com/author/ankush/ +[b]: https://github.com/lujun9972 +[1]: https://itsfoss.com/customize-linux-terminal/ +[2]: https://i2.wp.com/itsfoss.com/wp-content/uploads/2021/02/starship-screenshot.png?resize=800%2C577&ssl=1 +[3]: https://starship.rs/ +[4]: https://www.rust-lang.org/ +[5]: https://starship.rs/config/ +[6]: https://i2.wp.com/itsfoss.com/wp-content/uploads/2021/02/starship-time.jpg?resize=800%2C281&ssl=1 +[7]: https://i2.wp.com/itsfoss.com/wp-content/uploads/2021/02/starship-demo.gif?resize=800%2C501&ssl=1 +[8]: https://starship.rs/guide/#%F0%9F%9A%80-installation +[9]: https://www.nerdfonts.com +[10]: https://curl.se/ +[11]: https://i2.wp.com/itsfoss.com/wp-content/uploads/2021/02/install-starship.png?resize=800%2C534&ssl=1 +[12]: https://i1.wp.com/itsfoss.com/wp-content/uploads/2021/02/startship-bashrc-file.png?resize=800%2C545&ssl=1 +[13]: https://i0.wp.com/itsfoss.com/wp-content/uploads/2021/02/starship-prompt.png?resize=800%2C552&ssl=1 +[14]: https://en.wikipedia.org/wiki/TOML +[15]: https://itsfoss.com/hide-folders-and-show-hidden-files-in-ubuntu-beginner-trick/ +[16]: https://i2.wp.com/itsfoss.com/wp-content/uploads/2021/02/starship-custom.png?resize=800%2C289&ssl=1 +[17]: https://i2.wp.com/itsfoss.com/wp-content/uploads/2021/02/starship-custom-config.png?resize=800%2C320&ssl=1 +[18]: https://i0.wp.com/itsfoss.com/wp-content/uploads/2021/02/starship-different-symbol.png?resize=800%2C224&ssl=1 +[19]: https://i2.wp.com/itsfoss.com/wp-content/uploads/2021/02/starship-symbol-change.jpg?resize=800%2C167&ssl=1 +[20]: https://github.com/starship/starship diff --git a/published/202102/20210221 Not Comfortable Using youtube-dl in Terminal- Use These GUI Apps.md b/published/202102/20210221 Not Comfortable Using youtube-dl in Terminal- Use These GUI Apps.md new file mode 100644 index 0000000000..e41e61a54c --- /dev/null +++ b/published/202102/20210221 Not Comfortable Using youtube-dl in Terminal- Use These GUI Apps.md @@ -0,0 +1,161 @@ +[#]: collector: (lujun9972) +[#]: translator: (geekpi) +[#]: reviewer: (wxy) +[#]: publisher: (wxy) +[#]: url: (https://linux.cn/article-13158-1.html) +[#]: subject: (Not Comfortable Using youtube-dl in Terminal? Use These GUI Apps) +[#]: via: (https://itsfoss.com/youtube-dl-gui-apps/) +[#]: author: (Ankush Das https://itsfoss.com/author/ankush/) + +不习惯在终端使用 youtube-dl?可以使用这些 GUI 应用 +====== + +![](https://img.linux.net.cn/data/attachment/album/202102/27/143909m29a8m8kgkzmmskc.jpg) + +如果你一直在关注我们,可能已经知道 [youtube-dl 项目曾被 GitHub 暂时下架][1] 以合规。但它现在已经恢复并完全可以访问,可以说它并不是一个非法的工具。 + +它是一个非常有用的命令行工具,可以让你 [从 YouTube][2] 和其他一些网站下载视频。使用 [youtube-dl][3] 并不复杂,但我明白使用命令来完成这种任务并不是每个人都喜欢的方式。 + +好在有一些应用为 `youtube-dl` 工具提供了 GUI 前端。 + +### 使用 youtube-dl GUI 应用的先决条件 + +在你尝试下面提到的一些选择之前,你可能需要在你的系统上安装 `youtube-dl` 和 [FFmpeg][4],才能够下载/选择不同的格式进行下载。 + +你可以按照我们的 [ffmpeg 使用完整指南][5] 进行设置,并探索更多关于它的内容。 + +要安装 [youtube-dl][6],你可以在 Linux 终端输入以下命令: + +``` +sudo curl -L https://yt-dl.org/downloads/latest/youtube-dl -o /usr/local/bin/youtube-dl +``` + +下载最新版本后,你只需要输入以下内容使其可执行就可使用: + +``` +sudo chmod a+rx /usr/local/bin/youtube-dl +``` + +如果你需要其他方法安装它,也可以按照[官方安装说明][7]进行安装。 + +### Youtube-dl GUI 应用 + +大多数 Linux 上的下载管理器也允许你从 YouTube 和其他网站下载视频。然而,youtube-dl GUI 应用可能有额外的选项,如只提取音频或下载特定分辨率和视频格式。 + +请注意,下面的列表没有特别的排名顺序。你可以根据你的要求选择。 + +#### 1、AllTube Download + +![][8] + +**主要特点:** + + * Web GUI + * 开源 + * 可以自托管 + +AllTube 是一个开源的 web GUI,你可以通过 来访问。 + +如果你选择使用这款软件,你不需要在系统上安装 youtube-dl 或 ffmpeg。它提供了一个简单的用户界面,你只需要粘贴视频的 URL,然后继续选择你喜欢的文件格式下载。你也可以选择将其部署在你的服务器上。 + +请注意,你不能使用这个工具提取视频的 MP3 文件,它只适用于视频。你可以通过他们的 [GitHub 页面][9]探索更多关于它的信息。 + +- [AllTube Download Web GUI][10] + +#### 2、youtube-dl GUI + +![][11] + +**主要特点:** + + * 跨平台 + * 显示预计下载大小 + * 有音频和视频下载选择 + +一个使用 electron 和 node.js 制作的有用的跨平台 GUI 应用。你可以很容易地下载音频和视频,以及选择各种可用的文件格式的选项。 + +如果你愿意的话,你还可以下载一个频道或播放列表的部分内容。特别是当你下载高质量的视频文件时,预计的下载大小绝对是非常方便的。 + +如上所述,它也适用于 Windows 和 MacOS。而且,你会在它的 [GitHub 发布][12]中得到一个适用于 Linux 的 AppImage 文件。 + +- [Youtube-dl GUI][13] + +#### 3、Videomass + +![][14] + +**主要特点:** + + * 跨平台 + * 转换音频/视频格式 + * 支持多个 URL + * 适用于也想使用 FFmpeg 的用户 + +如果你想从 YouTube 下载视频或音频,并将它们转换为你喜欢的格式,Videomass 可以是一个不错的选择。 + +要做到这点,你需要在你的系统上同时安装 youtube-dl 和 ffmpeg。你可以轻松的添加多个 URL 来下载,还可以根据自己的喜好设置输出目录。 + +![][15] + +你还可以获得一些高级设置来禁用 youtube-dl,改变文件首选项,以及随着你的探索,还有一些更方便的选项。 + +它为 Ubuntu 用户提供了一个 PPA,为任何其他 Linux 发行版提供了一个 AppImage 文件。在它的 [Github 页面][16]探索更多信息。 + +- [Videomass][17] + +#### 附送:Haruna Video Player + +![][18] + +**主要特点:** + + * 播放/流式传输 YouTube 视频 + +Haruna Video Player 原本是 [MPV][19] 的前端。虽然使用它不能下载 YouTube 视频,但可以通过 youtube-dl 观看/流式传输 YouTube 视频。 + +你可以在我们的[文章][20]中探索更多关于视频播放器的内容。 + +### 总结 + +尽管你可能会在 GitHub 和其他平台上找到更多的 youtube-dl GUI,但它们中的大多数都不能很好地运行,最终会显示出多个错误,或者不再积极开发。 + +[Tartube][21] 就是这样的一个选择,你可以尝试一下,但可能无法达到预期的效果。我用 Pop!_OS 和 Ubuntu MATE 20.04(全新安装)进行了测试。每次我尝试下载一些东西时,无论我怎么做都会失败(即使系统中安装了 youtube-dl 和 ffmpeg)。 + +所以,我个人最喜欢的似乎是 Web GUI([AllTube Download][9]),它不依赖于安装在你系统上的任何东西,也可以自托管。 + +如果我错过了你最喜欢的选择,请在评论中告诉我什么是最适合你的。 + +-------------------------------------------------------------------------------- + +via: https://itsfoss.com/youtube-dl-gui-apps/ + +作者:[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/youtube-dl-github-takedown/ +[2]: https://itsfoss.com/download-youtube-videos-ubuntu/ +[3]: https://itsfoss.com/download-youtube-linux/ +[4]: https://ffmpeg.org/ +[5]: https://itsfoss.com/ffmpeg/#install +[6]: https://youtube-dl.org/ +[7]: https://ytdl-org.github.io/youtube-dl/download.html +[8]: https://i1.wp.com/itsfoss.com/wp-content/uploads/2021/02/alltube-download.jpg?resize=772%2C593&ssl=1 +[9]: https://github.com/Rudloff/alltube +[10]: https://alltubedownload.net/ +[11]: https://i2.wp.com/itsfoss.com/wp-content/uploads/2021/02/youtube-dl-gui.jpg?resize=800%2C548&ssl=1 +[12]: https://github.com/jely2002/youtube-dl-gui/releases/tag/v1.8.7 +[13]: https://github.com/jely2002/youtube-dl-gui +[14]: https://i1.wp.com/itsfoss.com/wp-content/uploads/2021/02/videomass.jpg?resize=800%2C537&ssl=1 +[15]: https://i0.wp.com/itsfoss.com/wp-content/uploads/2021/02/videomass-1.jpg?resize=800%2C542&ssl=1 +[16]: https://github.com/jeanslack/Videomass +[17]: https://jeanslack.github.io/Videomass/ +[18]: https://i1.wp.com/itsfoss.com/wp-content/uploads/2021/01/haruna-video-player-dark.jpg?resize=800%2C512&ssl=1 +[19]: https://mpv.io/ +[20]: https://itsfoss.com/haruna-video-player/ +[21]: https://github.com/axcore/tartube diff --git a/published/202103/20160921 lawyer The MIT License, Line by Line.md b/published/202103/20160921 lawyer The MIT License, Line by Line.md new file mode 100644 index 0000000000..8679330528 --- /dev/null +++ b/published/202103/20160921 lawyer The MIT License, Line by Line.md @@ -0,0 +1,296 @@ +[#]: collector: (lujun9972) +[#]: translator: (bestony) +[#]: reviewer: (wxy) +[#]: publisher: (wxy) +[#]: url: (https://linux.cn/article-13180-1.html) +[#]: subject: (lawyer The MIT License, Line by Line) +[#]: via: (https://writing.kemitchell.com/2016/09/21/MIT-License-Line-by-Line.html) +[#]: author: (Kyle E. Mitchell https://kemitchell.com/) + +逐行解读 MIT 许可证 +====== + +![](https://img.linux.net.cn/data/attachment/album/202103/06/224509d0zt70ctxtt7iibo.png) + +> 每个程序员都应该明白的 171 个字。 + +[MIT 许可证][1] 是世界上最流行的开源软件许可证。以下是它的逐行解读。 + +### 阅读许可证 + +如果你参与了开源软件,但还没有花时间从头到尾的阅读过这个许可证(它只有 171 个单词),你需要现在就去读一下。尤其是如果许可证不是你日常每天都会接触的,把任何看起来不对劲或不清楚的地方记下来,然后继续阅读。我会分段、按顺序、加入上下文和注释,把每一个词再重复一遍。但最重要的还是要有个整体概念。 + +> The MIT License (MIT) +> +> Copyright (c) \ \ +> +> Permission is hereby granted, free of charge, to any person obtaining a copy of this software and associated documentation files (the “Software”), to deal in the Software without restriction, including without limitation the rights to use, copy, modify, merge, publish, distribute, sublicense, and/or sell copies of the Software, and to permit persons to whom the Software is furnished to do so, subject to the following conditions: +> +> The above copyright notice and this permission notice shall be included in all copies or substantial portions of the Software. +> +> *The Software is provided “as is”, without warranty of any kind, express or implied, including but not limited to the warranties of merchantability, fitness for a particular purpose and noninfringement. In no event shall the authors or copyright holders be liable for any claim, damages or other liability, whether in an action of contract, tort or otherwise, arising from, out of or in connection with the software or the use or other dealings in the Software.* + +(LCTT 译注:MIT 许可证并无官方的中文文本,我们也没找到任何可靠的、精确的非官方中文文本。在本文中,我们仅作为参考目的提供一份逐字逐行而没有经过润色的中文翻译文本,但该文本及对其的理解**不能**作为 MIT 许可证使用,我们也不为此中文翻译文本的使用承担任何责任,这份中文文本,我们贡献给公共领域。) + +> MIT 许可证(MIT) +> +> 版权 (c) <年份> <版权人> +> +> 特此免费授予任何获得本软件副本和相关文档文件(下称“软件”)的人不受限制地处置该软件的权利,包括不受限制地使用、复制、修改、合并、发布、分发、转授许可和/或出售该软件副本,以及再授权被配发了本软件的人如上的权利,须在下列条件下: +> +> 上述版权声明和本许可声明应包含在该软件的所有副本或实质成分中。 +> +> 本软件是“如此”提供的,没有任何形式的明示或暗示的保证,包括但不限于对适销性、特定用途的适用性和不侵权的保证。在任何情况下,作者或版权持有人都不对任何索赔、损害或其他责任负责,无论这些追责来自合同、侵权或其它行为中,还是产生于、源于或有关于本软件以及本软件的使用或其它处置。 + +该许可证分为五段,按照逻辑划分如下: + + * **头部** + * **许可证名称**:“MIT 许可证” + * **版权说明**:“版权 (c) …” + * **许可证授予**:“特此授予 …” + * **授予范围**:“… 处置软件 …” + * **条件**:“… 须在 …” + * **归因和声明**:“上述 … 应包含在 …” + * **免责声明**:“本软件是‘如此’提供的 …” + * **责任限制**:“在任何情况下 …” + +接下来详细看看。 + +### 头部 + +#### 许可证名称 + +> The MIT License (MIT) + +> MIT 许可证(MIT) + +“MIT 许可证”不是一个单一的许可证,而是根据麻省理工学院Massachusetts Institute of Technology(MIT)为发行版本准备的语言衍生出来一系列许可证形式。多年来,无论是对于使用它的原始项目,还是作为其他项目的范本,它经历了许多变化。Fedora 项目一直保持着 [收藏 MIT 许可证的好奇心][2],以纯文本的方式记录了那些平淡的变化,如同泡在甲醛中的解剖标本一般,追溯了它的各种演变。 + +幸运的是,[开放源码倡议组织][3]Open Source Initiative(OSI) 和 [软件数据包交换][4]Software Package Data eXchange组织(SPDX)已经将一种通用的 MIT 式的许可证形式标准化为“MIT 许可证The MIT License”。OSI 反过来又采用了 SPDX 通用开源许可证的标准化 [字符串标志符][5],并将其中的 “MIT” 明确指向了标准化形式的“MIT 许可证”。如果你想为一个新项目使用 MIT 式的条款,请使用其 [标准化的形式][1]。 + +即使你在 `LICENSE` 文件中包含 “The MIT License” 或 “SPDX:MIT”,任何负责的审查者仍会将文本与标准格式进行比较,以确保安全。尽管自称为“MIT 许可证”的各种许可证形式只在细微的细节上有所不同,但所谓的“MIT 许可证”的松散性已经诱使了一些作者加入麻烦的“自定义”。典型的糟糕、不好的、非常坏的例子是 [JSON 许可证][6],一个 MIT 家族的许可证被加上了“本软件应用于善,而非恶”。这件事情可能是“非常克罗克福特”的(LCTT 译者注,Crockford 是 JSON 格式和 JSON.org 的作者)。这绝对是一件麻烦事,也许这个玩笑本来是开在律师身上的,但他们却笑得前仰后合。 + +这个故事的寓意是:“MIT 许可证”本身就是模棱两可的。大家可能很清楚你的意思,但你只需要把标准的 MIT 许可证文本复制到你的项目中,就可以节省每个人的时间。如果使用元数据(如包管理器中的元数据文件)来指定 “MIT 许可证”,请确保 `LICENSE` 文件和任何头部的注释都使用标准的许可证文本。所有的这些都可以 [自动化完成][7]。 + +#### 版权声明 + +> Copyright (c) + +> 版权 (c) <年份> <版权持有人> + +在 1976 年(美国)《版权法》颁布之前,美国的版权法规要求采取具体的行动,即所谓的“手续”来确保创意作品的版权。如果你不遵守这些手续,你起诉他人未经授权使用你的作品的权力就会受到限制,往往会完全丧失权力,其中一项手续就是“声明notice”。在你的作品上打上记号,以其他方式让市场知道你拥有版权。“©” 是一个标准符号,用于标记受版权保护的作品,以发出版权声明。ASCII 字符集没有 © 符号,但 `Copyright (c)` 可以表达同样的意思。 + +1976 年的《版权法》“落实”了国际《伯尔尼公约Berne Convention》的许多要求,取消了确保版权的手续。至少在美国,著作权人在起诉侵权之前,仍然需要对自己的版权作品进行登记,如果在侵权行为开始之前进行登记,可能会获得更高的赔偿。但在实践中,很多人在对某个人提起诉讼之前,都会先注册版权。你并不会因为没有在上面贴上声明、注册它、向国会图书馆寄送副本等而失去版权。 + +即使版权声明不像过去那样绝对必要,但它们仍然有很多用处。说明作品的创作年份和版权属于谁,可以让人知道作品的版权何时到期,从而使作品纳入公共领域。作者或作者们的身份也很有用。美国法律对个人作者和“公司”作者的版权条款的计算方式不同。特别是在商业用途中,公司在使用已知竞争对手的软件时,可能也要三思而行,即使许可条款给予了非常慷慨的许可。如果你希望别人看到你的作品并想从你这里获得许可,版权声明可以很好地起到归属作用。 + +至于“版权持有人copyright holder”。并非所有标准形式的许可证都有写明这一点的空间。最新的许可证形式,如 [Apache 2.0][8] 和 [GPL 3.0][9],发布的许可证文本是要逐字复制的,并在其他地方加上标题注释和单独文件,以表明谁拥有版权并提供许可证。这些办法巧妙地阻止了对“标准”文本的意外或故意的修改。这还使自动许可证识别更加可靠。 + +MIT 许可证是从为机构发布的代码而写的语言演变而来。对于机构发布的代码,只有一个明确的“版权持有人”,即发布代码的机构。其他机构抄袭了这些许可证,用他们自己的名字代替了 “MIT”,最终形成了我们现在拥有的通用形式。这一过程同样适用于该时代的其他简短的机构许可证,特别是加州大学伯克利分校的最初的 [四条款 BSD 许可证][10]four-clause BSD License 成为了现在使用的 [三条款][11] 和 [两条款][12] 变体,以及 MIT 许可证的变体互联网系统联盟Internet Systems Consortium的 [ISC 许可证][13]。 + +在每一种情况下,该机构都根据版权所有权规则将自己列为版权持有人,这些规则称为“[雇佣作品][14]”规则,这些规则赋予雇主和客户在其雇员和承包商代表其从事的某些工作中的版权所有权。这些规则通常不适用于自愿提交代码的分布式协作者。这给项目监管型基金会(如 Apache 基金会和 Eclipse 基金会)带来了一个问题,因为它们接受来自更多不同的贡献者的贡献。到目前为止,通常的基础方法是使用一个单一的许可证,它规定了一个版权持有者,如 [Apache 2.0][8] 和 [EPL 1.0][15],并由贡献者许可协议contributor license agreements [Apache CLA][16] 以及 [Eclipse CLA][17] 为后盾,以从贡献者中收集权利。在像 GPL 这样的左版copyleft许可证下,将版权所有权收集在一个地方就更加重要了,因为 GPL 依靠版权所有者来执行许可证条件,以促进软件自由的价值。 + +如今,大量没有机构或商业管理人的项目都在使用 MIT 风格的许可条款。SPDX 和 OSI 通过标准化不涉及特定实体或机构版权持有人的 MIT 和 ISC 之类的许可证形式,为这些用例提供了帮助。有了这些许可证形式,项目作者的普遍做法是在许可证的版权声明中尽早填上自己的名字...也许还会在这里或那里填上年份。至少根据美国的版权法,由此产生的版权声明并不能说明全部情况。 + +软件的原始所有者保留其工作的所有权。但是,尽管 MIT 风格的许可条款赋予了他人开发和更改软件的权利,创造了法律上所谓的“衍生作品”,但它们并没有赋予原始作者对他人的贡献的所有权。相反,每个贡献者在以现有代码为起点所做的任何作品都拥有版权,[即使是稍做了一点创意][18]。 + +这些项目大多数也对接受贡献者许可协议contributor license agreements(CLA)的想法嗤之以鼻,更不用说签署版权转让协议了。这既幼稚又可以理解。尽管一些较新的开源开发人员认为,在 GitHub 上发送拉取请求Pull Request,就会“自动”根据项目现有的许可证条款授权分发贡献,但美国法律不承认任何此类规则。强有力的版权保护是默认的,而不是宽松许可。 + +> 更新:GitHub 后来修改了全站的服务条款,包括试图至少在 GitHub.com 上改变这一默认值。我在 [另一篇文章][19] 中写了一些对这一发展的想法,并非所有想法都是积极的。 + +为了填补法律上有效的、有据可查的贡献权利授予与完全没有纸质痕迹之间的差距,一些项目采用了 [开发者原创证书][20]Developer Certificate of Origin,这是贡献者在 Git 提交中使用 `Signed-Off-By` 元数据标签暗示的标准声明。开发者原创证书是在臭名昭著的 SCO 诉讼之后为 Linux 内核开发而开发的,该诉讼称 Linux 的大部分代码源自 SCO 拥有的 Unix 源代码。作为创建显示 Linux 的每一行都来自贡献者的书面记录的一种方法,开发者原创证书的功能良好。尽管开发者原创证书不是许可证,但它确实提供了大量证据,证明提交代码的人希望项目分发其代码,并让其他人根据内核现有的许可证条款使用该代码。内核还维护着一个机器可读的 `CREDITS` 文件,其中列出了贡献者的名字、所属机构、贡献领域和其他元数据。我做了 [一些][21] [实验][22],把这种方法改编成适用于不使用内核开发流程的项目。 + +### 许可证授权 + +> Permission is hereby granted, free of charge, to any person obtaining a copy of this software and associated documentation files (the “Software”), + +> 特此免费授予任何获得本软件副本和相关文档文件(下称“软件”)的人 + +MIT 许可证的实质是许可证(你猜对了)。一般来说,许可证是一个人或法律实体(“许可人licensor”)给予另一个人(“被许可人licensee”)做一些法律允许他们起诉的事情的许可。MIT 许可证是一种不起诉的承诺。 + +法律有时将许可证与给予许可证的承诺区分开来。如果有人违背了提供许可证的承诺,你可以起诉他们违背了承诺,但你最终可能得不到许可证。“特此Hereby”是律师们永远摆脱不了的一个矫揉造作、老生常谈的词。这里使用它来表明,许可证文本本身提供了许可证,而不仅仅是许可证的承诺。这是一个合法的 [即调函数表达式(IIFE)][23]。 + +尽管许多许可证都是授予特定的、指定的被许可人的,但 MIT 许可证是一个“公共许可证public license”。公共许可证授予所有人(整个公众)许可。这是开源许可中的三大理念之一。MIT 许可证通过“向任何获得……软件副本的人”授予许可证来体现这一思想。稍后我们将看到,获得此许可证还有一个条件,以确保其他人也可以了解他们的许可。 + +在美国式法律文件中,括号中带引号的首字母大写词汇是赋予术语特定含义的标准方式(“定义”)。当法庭看到文件中其他地方使用了一个已定义的大写术语时,法庭会可靠地回顾定义中的术语。 + +#### 授权范围 + +> to deal in the Software without restriction, + +> 不受限制地处置该软件的权利, + +从被许可人的角度来看,这是 MIT 许可证中最重要的七个字。主要的法律问题就是因侵犯版权而被起诉,和因侵犯专利而被起诉。无论是版权法还是专利法都没有将 “处置to deal in” 作为一个术语,它在法庭上没有特定的含义。因此,任何法庭在裁决许可人和被许可人之间的纠纷时,都会询问当事人对这一措辞的含义和理解。法庭将看到的是,该措辞有意宽泛和开放。它为被许可人提供了一个强有力的论据,反对许可人提出的任何主张 —— 即他们不允许被许可人使用该软件做那件特定的事情,即使在授予许可证时双方都没有明显想到。 + +> including without limitation the rights to use, copy, modify, merge, publish, distribute, sublicense, and/or sell copies of the Software, and to permit persons to whom the Software is furnished to do so, + +> 包括不受限制地使用、复制、修改、合并、发布、分发、转授许可和/或出售该软件副本,以及再授权被配发了本软件的人如上的权利, + +没有一篇法律是完美的、“意义上完全确定”、或明确无误的。小心那些假装不然的人。这是 MIT 许可证中最不完美的部分。主要有三个问题: + +首先,“包括不受限制地including without limitation”是一种法律反模式。它有多种衍生: + + * 包括,但不受限制including, without limitation + * 包括,但不限于前述的一般性including, without limiting the generality of the foregoing + * 包括,但不限于including, but not limited to + * 很多、很多毫无意义的变化 + +所有这些都有一个共同的目标,但都未能可靠地实现。从根本上说,使用它们的起草者也会尽量试探着去做。在 MIT 许可证中,这意味着引入“处置软件dealing in the Software”的具体例子 — “使用、复制、修改”等等,但不意味着被许可方的行为必须与给出的例子类似,才能算作“处置”。问题是,如果你最终需要法庭来审查和解释许可证的条款,法庭将把它的工作看作是找出这些语言的含义。如果法庭需要决定“处置deal in”的含义,它不能“无视”这些例子,即使你告诉它。我认为,“不受限制地处置本软件”本身对被许可人更好,也更短。 + +其次,作为“处置deal in”的例子的那些动词是一个大杂烩。有些在版权法或专利法下有特定的含义,有些稍微有或根本没有含义: + + * “使用use”出现在 [《美国法典》第 35 篇,第 271(a)节][24],这是专利法中专利权人可以起诉他人未经许可的行为的清单。 + * “复制copy”出现在 [《美国法典》第 17 篇,第 106 节][25],即版权法列出的版权所有人可以起诉他人未经许可的行为。 + * “修改modify”既不出现在版权法中,也不出现在专利法中。它可能最接近版权法下的“准备衍生作品prepare derivative works”,但也可能涉及改进或其他衍生发明。 + * 无论是在版权法还是专利法中,“合并merge”都没有出现。“合并merger”在版权方面有特定的含义,但这显然不是这里的意图。相反,法庭可能会根据其在行业中的含义来解读“合并”,如“合并代码”。 + * 无论是在版权法还是专利法中,都没有“发布publish”。由于“软件”是被发布的内容,根据《[版权法][25]》,它可能最接近于“分发distribute”。该法令还包括“公开”表演和展示作品的权利,但这些权利只适用于特定类型的受版权保护的作品,如戏剧、录音和电影。 + * “分发distribute”出现在《[版权法][25]》中。 + * “转授许可sublicense”是知识产权法中的一个总称。转授许可的权利是指把自己的许可证授予他人,有权进行你所许可的部分或全部活动。实际上,MIT 许可证的转授许可的权利在开源代码许可证中并不常见。通常的做法是 Heather Meeker 所说的“直接许可direct licensing”方式,在这种方法中,每个获得该软件及其许可证条款副本的人都直接从所有者那里获得授权。任何可能根据 MIT 许可证获得转授许可的人都可能会得到一份许可证副本,告诉他们其也有直接许可证。 + * “出售副本sell copies”是个混杂品。它接近于《[专利法][24]》中的“要约出售offer to sell”和“出售sell”,但指的是“副本coyies”,这是一种版权概念。在版权方面,它似乎接近于“分发distribute”,但《[版权法][25]》没有提到销售。 + * “允许被配发了本软件的人这样做permit persons to whom the Software is furnished to do so”似乎是多余的“转授许可”。这也是不必要的,因为获得副本的人也可以直接获得许可证。 + +最后,由于这种法律、行业、一般知识产权和一般使用条款的混杂,并不清楚 MIT 许可证是否包括专利许可。一般性语言“处置deal in”和一些例子动词,尤其是“使用”,指向了一个专利许可,尽管是一个非常不明确的许可。许可证来自于版权持有人,而版权持有人可能对软件中的发明拥有或不拥有专利权,以及大多数的例子动词和“软件the Software”本身的定义,都强烈地指向版权许可证。诸如 [Apache 2.0][8] 之类的较新的宽容开源许可分别具体地处理了版权、专利甚至商标问题。 + +#### 三个许可条件 + +> subject to the following conditions: + +> 须在下列条件下: + +总有一个陷阱!MIT 许可证有三个! + +如果你不遵守 MIT 许可证的条件,你就得不到许可证提供的许可。因此,如果不能履行条件,至少从理论上说,会让你面临一场诉讼,很可能是一场版权诉讼。 + +开源软件的第二个伟大思想是,利用软件对被许可人的价值来激励被许可人遵守条件,即使被许可人没有支付任何许可费用。最后一个伟大思想,在 MIT 许可证中没有,它构建了许可证条件:像 [GNU 通用公共许可证][9](GPL)这样的左版许可证,使用许可证条件来控制如何对修改后的版本进行许可和发布。 + +#### 声明条件 + +> The above copyright notice and this permission notice shall be included in all copies or substantial portions of the Software. + +> 上述版权声明和本许可声明应包含在该软件的所有副本或实质成分中。 + +如果你给别人一份软件的副本,你需要包括许可证文本和任何版权声明。这有几个关键目的: + + 1. 给别人一个声明,说明他们有权使用该公共许可证下的软件。这是直接授权模式的一个关键部分,在这种模式下,每个用户直接从版权持有人那里获得许可证。 + 2. 让人们知道谁是软件的幕后人物,这样他们就可以得到赞美、荣耀和冷冰冰的现金捐赠。 + 3. 确保保修免责声明和责任限制(在后面)伴随该软件。每个得到该副本的人也应该得到一份这些许可人保护的副本。 + +没有什么可以阻止你对提供一个副本、甚至是一个没有源代码的编译形式的副本而收费。但是当你这么做的时候,你不能假装 MIT 代码是你自己的专有代码,也不能在其他许可证下提供。接受的人要知道自己在“公共许可证”下的权利。 + +坦率地说,遵守这个条件正在崩溃。几乎所有的开源许可证都有这样的“归因attribution”条件。系统和装机软件的制作者往往明白,他们需要为自己的每一个发行版本编制一个声明文件或“许可证信息”屏,并附上库和组件的许可证文本副本。项目监管型基金会在教授这些做法方面起到了重要作用。但是整个 Web 开发者群体还没有取得这种经验。这不能用缺乏工具来解释,工具有很多,也不能用 npm 和其他资源库中的包的高度模块化来解释,它们统一了许可证信息的元数据格式。所有好的 JavaScript 压缩器都有保存许可证标题注释的命令行标志。其他工具可以从包树中串联 `LICENSE` 文件。这实在是没有借口。 + +#### 免责声明 + +> The Software is provided “as is”, without warranty of any kind, express or implied, including but not limited to the warranties of merchantability, fitness for a particular purpose and noninfringement. + +> 本软件是“如此”提供的,没有任何形式的明示或暗示的保证,包括但不限于对适销性、特定用途的适用性和不侵权的保证。 + +美国几乎每个州都颁布了一个版本的《统一商业法典Uniform Commercial Code》(UCC),这是一部规范商业交易的示范性法律。UCC 的第 2 条(加利福尼亚州的“第 2 部分”)规定了商品销售合同,包括了从二手汽车的购买到向制造厂运送大量工业化学品。 + +UCC 关于销售合同的某些规则是强制性的。这些规则始终适用,无论买卖双方是否喜欢。其他只是“默认”。除非买卖双方以书面形式选择不适用这些默认,否则 UCC 潜在视作他们希望在 UCC 文本中找到交易的基准规则。默认规则中包括隐含的“免责warranties”,或卖方对买方关于所售商品的质量和可用性的承诺。 + +关于诸如 MIT 许可证之类的公共许可证是合同(许可方和被许可方之间的可执行协议)还是仅仅是许可证(单向的,但可能有附加条件),这在理论上存在很大争议。关于软件是否被视为“商品”,从而触发 UCC 规则的争论较少。许可人之间没有就赔偿责任进行辩论:如果他们免费提供的软件出现故障、导致问题、无法正常工作或以其他方式引起麻烦,他们不想被起诉和被要求巨额赔偿。这与“默示保证implied warranty”的三个默认规则完全相反: + + 1. 据 [UCC 第 2-314 节][26],“适销性merchantability”的默示保证是一种承诺:“商品”(即软件)的质量至少为平均水平,并经过适当包装和标记,并适用于其常规用途。仅当提供该软件的人是该软件的“商人”时,此保证才适用,这意味着他们从事软件交易,并表现出对软件的熟练程度。 + 2. 据 [UCC 第 2-315 节][27],当卖方知道买方依靠他们提供用于特定目的的货物时,“适用于某一特定目的fitness for a particular purpose”的默示保证就会生效。商品实际上需要“适用”这一目的。 + 3. “非侵权noninfringement”的默示保证不是 UCC 的一部分,而是一般合同法的共同特征。如果事实证明买方收到的商品侵犯了他人的知识产权,则这种默示的承诺将保护买方。如果根据 MIT 许可证获得的软件实际上并不属于尝试许可该软件的许可人,或者属于他人拥有的专利,那就属于这种情况。 + +UCC 的 [第2-316(3)节][28] 要求,选择不适用或“排除”适销性和适用于某一特定目的的默示保证措辞必须醒目。“醒目”意味着书面化或格式化,以引起人们的注意,这与旨在从不小心的消费者身边溜走的细小字体相反。各州法律可以对不侵权的免责声明提出类似的引人注目的要求。 + +长期以来,律师们都有一种错觉,认为用“全大写”写任何东西都符合明显的要求。这是不正确的。法庭曾批评律师协会自以为是,而且大多数人都认为,全大写更多的是阻止阅读,而不是强制阅读。同样的,大多数开源许可证的形式都将其免责声明设置为全大写,部分原因是这是在纯文本的 `LICENSE` 文件中唯一明显的方式。我更喜欢使用星号或其他 ASCII 艺术,但那是很久很久以前的事了。 + +#### 责任限制 + +> In no event shall the authors or copyright holders be liable for any claim, damages or other liability, whether in an action of contract, tort or otherwise, arising from, out of or in connection with the Software or the use or other dealings in the Software. + +> 在任何情况下,作者或版权持有人都不对任何索赔、损害或其他责任负责,无论这些追责来自合同、侵权或其它行为中,还是产生于、源于或有关于本软件以及本软件的使用或其它处置。 + +MIT 许可证授予软件“免费”许可,但法律并不认为接受免费许可证的人在出错时放弃了起诉的权利,而许可人应该受到责备。“责任限制”,通常与“损害赔偿排除”条款搭配使用,其作用与许可证很像,是不起诉的承诺。但这些都是保护许可人免受被许可人起诉的保护措施。 + +一般来说,法庭对责任限制和损害赔偿排除条款的解读非常谨慎,因为这些条款可以将大量的风险从一方转移到另一方。为了保护社会的切身利益,让民众有办法纠正在法庭上所犯的错误,他们“严格地”用措辞限制责任,尽可能地对受其保护的一方进行解读。责任限制必须具体才能成立。特别是在“消费者”合同和其他放弃起诉权的人缺乏成熟度或讨价还价能力的情况下,法庭有时会拒绝尊重那些似乎被埋没在视线之外的措辞。部分是出于这个原因,部分是出于习惯,律师们往往也会给责任限制以全大写处理。 + +再往下看,“责任限制”部分是对被许可人可以起诉的金额上限。在开源许可证中,这个上限总是没有钱,0 元,“不承担责任”。相比之下,在商业许可证中,它通常是过去 12 个月内支付的许可证费用的倍数,尽管它通常是经过谈判的。 + +“排除”部分具体列出了各种法律主张,即请求赔偿的理由,许可人不能使用。像许多其他法律形式一样,MIT 许可证 提到了“违约of contract”行为(即违反合同)和“侵权of tort”行为。侵权规则是防止粗心或恶意伤害他人的一般规则。如果你在发短信时在路上撞倒了人,你就犯了侵权行为。如果你的公司销售的有问题的耳机会烧伤人们的耳朵,则说明贵公司已经侵权。如果合同没有明确排除侵权索赔,那么法庭有时会在合同中使用排除措辞以防止合同索赔。出于很好的考虑,MIT 许可证抛出“或其它”字样,只是为了截住奇怪的海事法或其它异国情调的法律主张。 + +“产生于、源于或有关于arising from, out of or in connection with”这句话是法律起草人固有的、焦虑的不安全感反复出现的症状。关键是,任何与软件有关的诉讼都被这些限制和排除范围所覆盖。万一某些事情可以“产生于arising from”,但不能“源于out of”或“有关于in connection with”,那就最好把这三者都写在里面,所以要把它们打包在一起。更不用说,任何被迫在这部分内容中斤斤计较的法庭将不得不为每个词提出不同的含义,前提是专业的起草者不会在一行中使用不同的词来表示同一件事。更不用说,在实践中,如果法庭对一开始就不利的限制感觉不好,那么他们会更愿意狭隘地解读范围触发器。但我离题了,同样的语言出现在数以百万计的合同中。 + +### 总结 + +所有这些诡辩都有点像在进教堂的路上吐口香糖。MIT 许可证是一个法律经典,且有效。它绝不是解决所有软件知识产权弊病的灵丹妙药,尤其是它比已经出现的软件专利灾难还要早几十年。但 MIT 风格的许可证发挥了令人钦佩的作用,实现了一个狭隘的目的,用最少的、谨慎的法律工具组合扭转了版权、销售和合同法等棘手的默认规则。在计算机技术的大背景下,它的寿命是惊人的。MIT 许可证已经超过、并将要超过绝大多数软件许可证。我们只能猜测,当它最终失去青睐时,它能提供多少年的忠实法律服务。对于那些无法提供自己的律师的人来说,这尤其慷慨。 + +我们已经看到,我们今天所知道的 MIT 许可证是如何成为一套具体的、标准化的条款,使机构特有的、杂乱无章的变化终于有了秩序。 + +我们已经看到了它对归因和版权声明的处理方法如何为学术、标准、商业和基金会机构的知识产权管理实践提供信息。 + +我们已经看到了 MIT 许可证是如何运行所有人免费试用软件的,但前提是要保护许可人不受担保和责任的影响。 + +我们已经看到,尽管有一些生硬的措辞和律师的矫揉造作,但一百七十一个小词可以完成大量的法律工作,为开源软件在知识产权和合同的密集丛林中开辟一条道路。 + +我非常感谢所有花时间阅读这篇相当长的文章的人,让我知道他们发现它很有用,并帮助改进它。一如既往,我欢迎你通过 [e-mail][29]、[Twitter][30] 和 [GitHub][31] 发表评论。 + +--- + +有很多人问,他们在哪里可以读到更多的东西,或者找到其他许可证,比如 GNU 通用公共许可证或 Apache 2.0 许可证。无论你的兴趣是什么,我都会向你推荐以下书籍: + + * Andrew M. St. Laurent 的 [Understanding Open Source & Free Software Licensing][32],来自 O’Reilly。 + > 我先说这本,因为虽然它有些过时,但它的方法也最接近上面使用的逐行方法。O'Reilly 已经把它[放在网上][33]。 + * Heather Meeker 的 [Open (Source) for Business][34] + > 在我看来,这是迄今为止关于 GNU 通用公共许可证和更广泛的左版的最佳著作。这本书涵盖了历史、许可证、它们的发展,以及兼容性和合规性。这本书是我给那些考虑或处理 GPL 的客户的书。 + * Larry Rosen 的 [Open Source Licensing][35],来自 Prentice Hall。 + > 一本很棒的入门书,也可以免费 [在线阅读][36]。对于从零开始的程序员来说,这是开源许可和相关法律的最好介绍。这本在一些具体细节上也有点过时了,但 Larry 的许可证分类法和对开源商业模式的简洁总结经得起时间的考验。 + +所有这些都对我作为一个开源许可律师的教育至关重要。它们的作者都是我的职业英雄。请读一读吧 — K.E.M + +我将此文章基于 [Creative Commons Attribution-ShareAlike 4.0 license][37] 授权 + +-------------------------------------------------------------------------------- + +via: https://writing.kemitchell.com/2016/09/21/MIT-License-Line-by-Line.html + +作者:[Kyle E. Mitchell][a] +选题:[lujun9972][b] +译者:[bestony](https://github.com/bestony) +校对:[wxy](https://github.com/wxy) + +本文由 [LCTT](https://github.com/LCTT/TranslateProject) 原创编译,[Linux中国](https://linux.cn/) 荣誉推出 + +[a]: https://kemitchell.com/ +[b]: https://github.com/lujun9972 +[1]: http://spdx.org/licenses/MIT +[2]: https://fedoraproject.org/wiki/Licensing:MIT?rd=Licensing/MIT +[3]: https://opensource.org +[4]: https://spdx.org +[5]: http://spdx.org/licenses/ +[6]: https://spdx.org/licenses/JSON +[7]: https://www.npmjs.com/package/licensor +[8]: https://www.apache.org/licenses/LICENSE-2.0 +[9]: https://www.gnu.org/licenses/gpl-3.0.en.html +[10]: http://spdx.org/licenses/BSD-4-Clause +[11]: https://spdx.org/licenses/BSD-3-Clause +[12]: https://spdx.org/licenses/BSD-2-Clause +[13]: http://www.isc.org/downloads/software-support-policy/isc-license/ +[14]: http://worksmadeforhire.com/ +[15]: https://www.eclipse.org/legal/epl-v10.html +[16]: https://www.apache.org/licenses/#clas +[17]: https://wiki.eclipse.org/ECA +[18]: https://en.wikipedia.org/wiki/Feist_Publications,_Inc.,_v._Rural_Telephone_Service_Co. +[19]: https://writing.kemitchell.com/2017/02/16/Against-Legislating-the-Nonobvious.html +[20]: http://developercertificate.org/ +[21]: https://github.com/berneout/berneout-pledge +[22]: https://github.com/berneout/authors-certificate +[23]: https://en.wikipedia.org/wiki/Immediately-invoked_function_expression +[24]: https://www.govinfo.gov/app/details/USCODE-2017-title35/USCODE-2017-title35-partIII-chap28-sec271 +[25]: https://www.govinfo.gov/app/details/USCODE-2017-title17/USCODE-2017-title17-chap1-sec106 +[26]: https://leginfo.legislature.ca.gov/faces/codes_displaySection.xhtml?sectionNum=2314.&lawCode=COM +[27]: https://leginfo.legislature.ca.gov/faces/codes_displaySection.xhtml?sectionNum=2315.&lawCode=COM +[28]: https://leginfo.legislature.ca.gov/faces/codes_displaySection.xhtml?sectionNum=2316.&lawCode=COM +[29]: mailto:kyle@kemitchell.com +[30]: https://twitter.com/kemitchell +[31]: https://github.com/kemitchell/writing/tree/master/_posts/2016-09-21-MIT-License-Line-by-Line.md +[32]: https://lccn.loc.gov/2006281092 +[33]: http://www.oreilly.com/openbook/osfreesoft/book/ +[34]: https://www.amazon.com/dp/1511617772 +[35]: https://lccn.loc.gov/2004050558 +[36]: http://www.rosenlaw.com/oslbook.htm +[37]: https://creativecommons.org/licenses/by-sa/4.0/legalcode \ No newline at end of file diff --git a/published/202103/20190221 Testing Bash with BATS.md b/published/202103/20190221 Testing Bash with BATS.md new file mode 100644 index 0000000000..f41ea939b7 --- /dev/null +++ b/published/202103/20190221 Testing Bash with BATS.md @@ -0,0 +1,262 @@ +[#]: collector: (lujun9972) +[#]: translator: (stevenzdg988) +[#]: reviewer: (wxy) +[#]: publisher: (wxy) +[#]: url: (https://linux.cn/article-13194-1.html) +[#]: subject: (Testing Bash with BATS) +[#]: via: (https://opensource.com/article/19/2/testing-bash-bats) +[#]: author: (Darin London https://opensource.com/users/dmlond) + +利用 BATS 测试 Bash 脚本和库 +====== + +> Bash 自动测试系统可以使 Bash 代码也通过 Java、Ruby 和 Python 开发人员所使用的同类测试过程。 + +![](https://img.linux.net.cn/data/attachment/album/202103/11/214705wcjm3vjpn9g69gl3.jpg) + +用 Java、Ruby 和 Python 等语言编写应用程序的软件开发人员拥有复杂的库,可以帮助他们随着时间的推移保持软件的完整性。他们可以创建测试,以在结构化环境中通过执行一系列动作来运行应用程序,以确保其软件所有的方面均按预期工作。 + +当这些测试在持续集成(CI)系统中自动进行时,它们的功能就更加强大了,每次推送到源代码库都会触发测试,并且在测试失败时会立即通知开发人员。这种快速反馈提高了开发人员对其应用程序功能完整性的信心。 + +Bash 自动测试系统Bash Automated Testing System([BATS][1])使编写 Bash 脚本和库的开发人员能够将 Java、Ruby、Python 和其他开发人员所使用的相同惯例应用于其 Bash 代码中。 + +### 安装 BATS + +BATS GitHub 页面包含了安装指令。有两个 BATS 辅助库提供更强大的断言或允许覆写 BATS 使用的 Test Anything Protocol([TAP][2])输出格式。这些库可以安装在一个标准位置,并被所有的脚本引用。更方便的做法是,将 BATS 及其辅助库的完整版本包含在 Git 仓库中,用于要测试的每组脚本或库。这可以通过 [git 子模块][3] 系统来完成。 + +以下命令会将 BATS 及其辅助库安装到 Git 知识库中的 `test` 目录中。 + +``` +git submodule init +git submodule add https://github.com/sstephenson/bats test/libs/bats +git submodule add https://github.com/ztombol/bats-assert test/libs/bats-assert +git submodule add https://github.com/ztombol/bats-support test/libs/bats-support +git add . +git commit -m 'installed bats' +``` + +要克隆 Git 仓库并同时安装其子模块,请在 `git clone` 时使用 +`--recurse-submodules` 标记。 + +每个 BATS 测试脚本必须由 `bats` 可执行文件执行。如果你将 BATS 安装到源代码仓库的 `test/libs` 目录中,则可以使用以下命令调用测试: + +``` +./test/libs/bats/bin/bats <测试脚本的路径> +``` + +或者,将以下内容添加到每个 BATS 测试脚本的开头: + +``` +#!/usr/bin/env ./test/libs/bats/bin/bats +load 'libs/bats-support/load' +load 'libs/bats-assert/load' +``` + +并且执行命令 `chmod +x <测试脚本的路径>`。 这将 a、使它们可与安装在 `./test/libs/bats` 中的 BATS 一同执行,并且 b、包含这些辅助库。BATS 测试脚本通常存储在 `test` 目录中,并以要测试的脚本命名,扩展名为 `.bats`。例如,一个测试 `bin/build` 的 BATS 脚本应称为 `test/build.bats`。 + +你还可以通过向 BATS 传递正则表达式来运行一整套 BATS 测试文件,例如 `./test/lib/bats/bin/bats test/*.bats`。 + +### 为 BATS 覆盖率而组织库和脚本 + +Bash 脚本和库必须以一种有效地方式将其内部工作原理暴露给 BATS 进行组织。通常,在调用或执行时库函数和运行诸多命令的 Shell 脚本不适合进行有效的 BATS 测试。 + +例如,[build.sh][4] 是许多人都会编写的典型脚本。本质上是一大堆代码。有些人甚至可能将这堆代码放入库中的函数中。但是,在 BATS 测试中运行一大堆代码,并在单独的测试用例中覆盖它可能遇到的所有故障类型是不可能的。测试这堆代码并有足够的覆盖率的唯一方法就是把它分解成许多小的、可重用的、最重要的是可独立测试的函数。 + +向库添加更多的函数很简单。额外的好处是其中一些函数本身可以变得出奇的有用。将库函数分解为许多较小的函数后,你可以在 BATS 测试中援引source这些库,并像测试任何其他命令一样运行这些函数。 + +Bash 脚本也必须分解为多个函数,执行脚本时,脚本的主要部分应调用这些函数。此外,还有一个非常有用的技巧,可以让你更容易地用 BATS 测试 Bash 脚本:将脚本主要部分中执行的所有代码都移到一个函数中,称为 `run_main`。然后,将以下内容添加到脚本的末尾: + +``` +if [[ "${BASH_SOURCE[0]}" == "${0}" ]] +then +  run_main +fi +``` + +这段额外的代码做了一些特别的事情。它使脚本在作为脚本执行时与使用援引source进入环境时的行为有所不同。通过援引并测试单个函数,这个技巧使得脚本的测试方式和库的测试方式变得一样。例如,[这是重构的 build.sh,以获得更好的 BATS 可测试性][5]。 + +### 编写和运行测试 + +如上所述,BATS 是一个 TAP 兼容的测试框架,其语法和输出对于使用过其他 TAP 兼容测试套件(例如 JUnit、RSpec 或 Jest)的用户来说将是熟悉的。它的测试被组织成单个测试脚本。测试脚本被组织成一个或多个描述性 `@test` 块中,它们描述了被测试应用程序的单元。每个 `@test` 块将运行一系列命令,这些命令准备测试环境、运行要测试的命令,并对被测试命令的退出和输出进行断言。许多断言函数是通过 `bats`、`bats-assert` 和 `bats-support` 库导入的,这些库在 BATS 测试脚本的开头加载到环境中。下面是一个典型的 BATS 测试块: + +``` +@test "requires CI_COMMIT_REF_SLUG environment variable" { +  unset CI_COMMIT_REF_SLUG +  assert_empty "${CI_COMMIT_REF_SLUG}" +  run some_command +  assert_failure +  assert_output --partial "CI_COMMIT_REF_SLUG" +} +``` + +如果 BATS 脚本包含 `setup`(安装)和/或 `teardown`(拆卸) 函数,则 BATS 将在每个测试块运行之前和之后自动执行它们。这样就可以创建环境变量、测试文件以及执行一个或所有测试所需的其他操作,然后在每次测试运行后将其拆卸。[Build.bats][6] 是对我们新格式化的 `build.sh` 脚本的完整 BATS 测试。(此测试中的 `mock_docker` 命令将在以下关于模拟/打标的部分中进行说明。) + +当测试脚本运行时,BATS 使用 `exec`(执行)来将每个 `@test` 块作为单独的子进程运行。这样就可以在一个 `@test` 中导出环境变量甚至函数,而不会影响其他 `@test` 或污染你当前的 Shell 会话。测试运行的输出是一种标准格式,可以被人理解,并且可以由 TAP 使用端以编程方式进行解析或操作。下面是 `CI_COMMIT_REF_SLUG` 测试块失败时的输出示例: + +``` + ✗ requires CI_COMMIT_REF_SLUG environment variable +   (from function `assert_output' in file test/libs/bats-assert/src/assert.bash, line 231, +    in test file test/ci_deploy.bats, line 26) +     `assert_output --partial "CI_COMMIT_REF_SLUG"' failed + +   -- output does not contain substring -- +   substring (1 lines): +     CI_COMMIT_REF_SLUG +   output (3 lines): +     ./bin/deploy.sh: join_string_by: command not found +     oc error +     Could not login +   -- + +   ** Did not delete , as test failed ** + +1 test, 1 failure +``` + +下面是成功测试的输出: + +``` +✓ requires CI_COMMIT_REF_SLUG environment variable +``` + +### 辅助库 + +像任何 Shell 脚本或库一样,BATS 测试脚本可以包括辅助库,以在测试之间共享通用代码或增强其性能。这些辅助库,例如 `bats-assert` 和 `bats-support` 甚至可以使用 BATS 进行测试。 + +库可以和 BATS 脚本放在同一个测试目录下,如果测试目录下的文件数量过多,也可以放在 `test/libs` 目录下。BATS 提供了 `load` 函数,该函数接受一个相对于要测试的脚本的 Bash 文件的路径(例如,在我们的示例中的 `test`),并援引该文件。文件必须以后缀 `.bash` 结尾,但是传递给 `load` 函数的文件路径不能包含后缀。`build.bats` 加载 `bats-assert` 和 `bats-support` 库、一个小型 [helpers.bash][7] 库以及 `docker_mock.bash` 库(如下所述),以下代码位于测试脚本的开头,解释器魔力行下方: + +``` +load 'libs/bats-support/load' +load 'libs/bats-assert/load' +load 'helpers' +load 'docker_mock' +``` + +### 打标测试输入和模拟外部调用 + +大多数 Bash 脚本和库运行时都会执行函数和/或可执行文件。通常,它们被编程为基于这些函数或可执行文件的输出状态或输出(`stdout`、`stderr`)以特定方式运行。为了正确地测试这些脚本,通常需要制作这些命令的伪版本,这些命令被设计成在特定测试过程中以特定方式运行,称为“打标stubbing”。可能还需要监视正在测试的程序,以确保其调用了特定命令,或者使用特定参数调用了特定命令,此过程称为“模拟mocking”。有关更多信息,请查看在 Ruby RSpec 中 [有关模拟和打标的讨论][8],它适用于任何测试系统。 + +Bash shell 提供了一些技巧,可以在你的 BATS 测试脚本中使用这些技巧进行模拟和打标。所有这些都需要使用带有 `-f` 标志的 Bash `export` 命令来导出一个覆盖了原始函数或可执行文件的函数。必须在测试程序执行之前完成此操作。下面是重写可执行命令 `cat` 的简单示例: + +``` +function cat() { echo "THIS WOULD CAT ${*}" } +export -f cat +``` + +此方法以相同的方式覆盖了函数。如果一个测试需要覆盖要测试的脚本或库中的函数,则在对函数进行打标或模拟之前,必须先声明已测试脚本或库,这一点很重要。否则,在声明脚本时,打标/模拟将被原函数替代。另外,在运行即将进行的测试命令之前确认打标/模拟。下面是`build.bats` 的示例,该示例模拟 `build.sh` 中描述的`raise` 函数,以确保登录函数会引发特定的错误消息: + +``` +@test ".login raises on oc error" { +  source ${profile_script} +  function raise() { echo "${1} raised"; } +  export -f raise +  run login +  assert_failure +  assert_output -p "Could not login raised" +} +``` + +一般情况下,没有必要在测试后复原打标/模拟的函数,因为 `export`(输出)仅在当前 `@test` 块的 `exec`(执行)期间影响当前子进程。但是,可以模拟/打标 BATS `assert` 函数在内部使用的命令(例如 `cat`、`sed` 等)是可能的。在运行这些断言命令之前,必须对这些模拟/打标函数进行 `unset`(复原),否则它们将无法正常工作。下面是 `build.bats` 中的一个示例,该示例模拟 `sed`,运行 `build_deployable` 函数并在运行任何断言之前复原 `sed`: + +``` +@test ".build_deployable prints information, runs docker build on a modified Dockerfile.production and publish_image when its not a dry_run" { +  local expected_dockerfile='Dockerfile.production' +  local application='application' +  local environment='environment' +  local expected_original_base_image="${application}" +  local expected_candidate_image="${application}-candidate:${environment}" +  local expected_deployable_image="${application}:${environment}" +  source ${profile_script} +  mock_docker build --build-arg OAUTH_CLIENT_ID --build-arg OAUTH_REDIRECT --build-arg DDS_API_BASE_URL -t "${expected_deployable_image}" - +  function publish_image() { echo "publish_image ${*}"; } +  export -f publish_image +  function sed() { +    echo "sed ${*}" >&2; +    echo "FROM application-candidate:environment"; +  } +  export -f sed +  run build_deployable "${application}" "${environment}" +  assert_success +  unset sed +  assert_output --regexp "sed.*${expected_dockerfile}" +  assert_output -p "Building ${expected_original_base_image} deployable ${expected_deployable_image} FROM ${expected_candidate_image}" +  assert_output -p "FROM ${expected_candidate_image} piped" +  assert_output -p "build --build-arg OAUTH_CLIENT_ID --build-arg OAUTH_REDIRECT --build-arg DDS_API_BASE_URL -t ${expected_deployable_image} -" +  assert_output -p "publish_image ${expected_deployable_image}" +} +``` + +有的时候相同的命令,例如 `foo`,将在被测试的同一函数中使用不同的参数多次调用。这些情况需要创建一组函数: + + * `mock_foo`:将期望的参数作为输入,并将其持久化到 TMP 文件中 + * `foo`:命令的模拟版本,该命令使用持久化的预期参数列表处理每个调用。必须使用 `export -f` 将其导出。 + * `cleanup_foo`:删除 TMP 文件,用于拆卸函数。这可以进行测试以确保在删除之前成功完成 `@test` 块。 + +由于此功能通常在不同的测试中重复使用,因此创建一个可以像其他库一样加载的辅助库会变得有意义。 + +[docker_mock.bash][9] 是一个很棒的例子。它被加载到 `build.bats` 中,并在任何测试调用 Docker 可执行文件的函数的测试块中使用。使用 `docker_mock` 典型的测试块如下所示: + +``` +@test ".publish_image fails if docker push fails" { +  setup_publish +  local expected_image="image" +  local expected_publishable_image="${CI_REGISTRY_IMAGE}/${expected_image}" +  source ${profile_script} +  mock_docker tag "${expected_image}" "${expected_publishable_image}" +  mock_docker push "${expected_publishable_image}" and_fail +  run publish_image "${expected_image}" +  assert_failure +  assert_output -p "tagging ${expected_image} as ${expected_publishable_image}" +  assert_output -p "tag ${expected_image} ${expected_publishable_image}" +  assert_output -p "pushing image to gitlab registry" +  assert_output -p "push ${expected_publishable_image}" +} +``` + +该测试建立了一个使用不同的参数两次调用 Docker 的预期。在对Docker 的第二次调用失败时,它会运行测试命令,然后测试退出状态和对 Docker 调用的预期。 + +一方面 BATS 利用 `mock_docker.bash` 引入 `${BATS_TMPDIR}` 环境变量,BATS 在测试开始的位置对其进行了设置,以允许测试和辅助程序在标准位置创建和销毁 TMP 文件。如果测试失败,`mock_docker.bash` 库不会删除其持久化的模拟文件,但会打印出其所在位置,以便可以查看和删除它。你可能需要定期从该目录中清除旧的模拟文件。 + +关于模拟/打标的一个注意事项:`build.bats` 测试有意识地违反了关于测试声明的规定:[不要模拟没有拥有的!][10] 该规定要求调用开发人员没有编写代码的测试命令,例如 `docker`、`cat`、`sed` 等,应封装在自己的库中,应在使用它们脚本的测试中对其进行模拟。然后应该在不模拟外部命令的情况下测试封装库。 + +这是一个很好的建议,而忽略它是有代价的。如果 Docker CLI API 发生变化,则测试脚本不会检测到此变化,从而导致错误内容直到经过测试的 `build.sh` 脚本在使用新版本 Docker 的生产环境中运行后才显示出来。测试开发人员必须确定要严格遵守此标准的程度,但是他们应该了解其所涉及的权衡。 + +### 总结 + +在任何软件开发项目中引入测试制度,都会在以下两方面产生权衡: a、增加开发和维护代码及测试所需的时间和组织,b、增加开发人员在对应用程序整个生命周期中完整性的信心。测试制度可能不适用于所有脚本和库。 + +通常,满足以下一个或多个条件的脚本和库才可以使用 BATS 测试: + + * 值得存储在源代码管理中 + * 用于关键流程中,并依靠它们长期稳定运行 + * 需要定期对其进行修改以添加/删除/修改其功能 + * 可以被其他人使用 + +一旦决定将测试规则应用于一个或多个 Bash 脚本或库,BATS 就提供其他软件开发环境中可用的全面测试功能。 + +致谢:感谢 [Darrin Mann][11] 向我引荐了 BATS 测试。 + +-------------------------------------------------------------------------------- + +via: https://opensource.com/article/19/2/testing-bash-bats + +作者:[Darin London][a] +选题:[lujun9972][b] +译者:[stevenzdg988](https://github.com/stevenzdg988) +校对:[wxy](https://github.com/wxy) + +本文由 [LCTT](https://github.com/LCTT/TranslateProject) 原创编译,[Linux中国](https://linux.cn/) 荣誉推出 + +[a]: https://opensource.com/users/dmlond +[b]: https://github.com/lujun9972 +[1]: https://github.com/sstephenson/bats +[2]: http://testanything.org/ +[3]: https://git-scm.com/book/en/v2/Git-Tools-Submodules +[4]: https://github.com/dmlond/how_to_bats/blob/preBats/build.sh +[5]: https://github.com/dmlond/how_to_bats/blob/master/bin/build.sh +[6]: https://github.com/dmlond/how_to_bats/blob/master/test/build.bats +[7]: https://github.com/dmlond/how_to_bats/blob/master/test/helpers.bash +[8]: https://www.codewithjason.com/rspec-mocks-stubs-plain-english/ +[9]: https://github.com/dmlond/how_to_bats/blob/master/test/docker_mock.bash +[10]: https://github.com/testdouble/contributing-tests/wiki/Don't-mock-what-you-don't-own +[11]: https://github.com/dmann diff --git a/published/202103/20190730 Using Python to explore Google-s Natural Language API.md b/published/202103/20190730 Using Python to explore Google-s Natural Language API.md new file mode 100644 index 0000000000..5141eae275 --- /dev/null +++ b/published/202103/20190730 Using Python to explore Google-s Natural Language API.md @@ -0,0 +1,299 @@ +[#]: collector: (lujun9972) +[#]: translator: (stevenzdg988) +[#]: reviewer: (wxy) +[#]: publisher: (wxy) +[#]: url: (https://linux.cn/article-13233-1.html) +[#]: subject: (Using Python to explore Google's Natural Language API) +[#]: via: (https://opensource.com/article/19/7/python-google-natural-language-api) +[#]: author: (JR Oakes https://opensource.com/users/jroakes) + +利用 Python 探究 Google 的自然语言 API +====== + +> Google API 可以凸显出有关 Google 如何对网站进行分类的线索,以及如何调整内容以改进搜索结果的方法。 + +![](https://img.linux.net.cn/data/attachment/album/202103/24/232018q66pz2uc5uuq1p03.jpg) + +作为一名技术性的搜索引擎优化人员,我一直在寻找以新颖的方式使用数据的方法,以更好地了解 Google 如何对网站进行排名。我最近研究了 Google 的 [自然语言 API][2] 能否更好地揭示 Google 是如何分类网站内容的。 + +尽管有 [开源 NLP 工具][3],但我想探索谷歌的工具,前提是它可能在其他产品中使用同样的技术,比如搜索。本文介绍了 Google 的自然语言 API,并探究了常见的自然语言处理(NLP)任务,以及如何使用它们来为网站内容创建提供信息。 + +### 了解数据类型 + +首先,了解 Google 自然语言 API 返回的数据类型非常重要。 + +#### 实体 + +实体Entities是可以与物理世界中的某些事物联系在一起的文本短语。命名实体识别Named Entity Recognition(NER)是 NLP 的难点,因为工具通常需要查看关键字的完整上下文才能理解其用法。例如,同形异义字homographs拼写相同,但是具有多种含义。句子中的 “lead” 是指一种金属:“铅”(名词),使某人移动:“牵领”(动词),还可能是剧本中的主要角色(也是名词)?Google 有 12 种不同类型的实体,还有第 13 个名为 “UNKNOWN”(未知)的统称类别。一些实体与维基百科的文章相关,这表明 [知识图谱][4] 对数据的影响。每个实体都会返回一个显著性分数,即其与所提供文本的整体相关性。 + +![实体][5] + +#### 情感 + +情感Sentiment,即对某事的看法或态度,是在文件和句子层面以及文件中发现的单个实体上进行衡量。情感的得分score范围从 -1.0(消极)到 1.0(积极)。幅度magnitude代表情感的非归一化non-normalized强度;它的范围是 0.0 到无穷大。 + +![情感][6] + +#### 语法 + +语法Syntax解析包含了大多数在较好的库中常见的 NLP 活动,例如 [词形演变][7]lemmatization[词性标记][8]part-of-speech tagging[依赖树解析][9]dependency-tree parsing。NLP 主要处理帮助机器理解文本和关键字之间的关系。语法解析是大多数语言处理或理解任务的基础部分。 + +![语法][10] + +#### 分类 + +分类Categories是将整个给定内容分配给特定行业或主题类别,其置信度confidence得分从 0.0 到 1.0。这些分类似乎与其他 Google 工具使用的受众群体和网站类别相同,如 AdWords。 + +![分类][11] + +### 提取数据 + +现在,我将提取一些示例数据进行处理。我使用 Google 的 [搜索控制台 API][12] 收集了一些搜索查询及其相应的网址。Google 搜索控制台是一个报告人们使用 Google Search 查找网站页面的术语的工具。这个 [开源的 Jupyter 笔记本][13] 可以让你提取有关网站的类似数据。在此示例中,我在 2019 年 1 月 1 日至 6 月 1 日期间生成的一个网站(我没有提及名字)上提取了 Google 搜索控制台数据,并将其限制为至少获得一次点击(而不只是曝光impressions)的查询。 + +该数据集包含 2969 个页面和在 Google Search 的结果中显示了该网站网页的 7144 条查询的信息。下表显示,绝大多数页面获得的点击很少,因为该网站侧重于所谓的长尾(越特殊通常就更长尾)而不是短尾(非常笼统,搜索量更大)搜索查询。 + +![所有页面的点击次数柱状图][14] + +为了减少数据集的大小并仅获得效果最好的页面,我将数据集限制为在此期间至少获得 20 次曝光的页面。这是精炼数据集的按页点击的柱状图,其中包括 723 个页面: + +![部分网页的点击次数柱状图][15] + +### 在 Python 中使用 Google 自然语言 API 库 + +要测试 API,在 Python 中创建一个利用 [google-cloud-language][16] 库的小脚本。以下代码基于 Python 3.5+。 + +首先,激活一个新的虚拟环境并安装库。用环境的唯一名称替换 `` 。 + +``` +virtualenv +source /bin/activate +pip install --upgrade google-cloud-language +pip install --upgrade requests +``` + +该脚本从 URL 提取 HTML,并将 HTML 提供给自然语言 API。返回一个包含 `sentiment`、 `entities` 和 `categories` 的字典,其中这些键的值都是列表。我使用 Jupyter 笔记本运行此代码,因为使用同一内核注释和重试代码更加容易。 + +``` +# Import needed libraries +import requests +import json + +from google.cloud import language +from google.oauth2 import service_account +from google.cloud.language import enums +from google.cloud.language import types + +# Build language API client (requires service account key) +client = language.LanguageServiceClient.from_service_account_json('services.json') + +# Define functions +def pull_googlenlp(client, url, invalid_types = ['OTHER'], **data): + + html = load_text_from_url(url, **data) + + if not html: + return None + + document = types.Document( + content=html, + type=language.enums.Document.Type.HTML ) + + features = {'extract_syntax': True, + 'extract_entities': True, + 'extract_document_sentiment': True, + 'extract_entity_sentiment': True, + 'classify_text': False + } + + response = client.annotate_text(document=document, features=features) + sentiment = response.document_sentiment + entities = response.entities + + response = client.classify_text(document) + categories = response.categories + + def get_type(type): + return client.enums.Entity.Type(entity.type).name + + result = {} + + result['sentiment'] = [] + result['entities'] = [] + result['categories'] = [] + + if sentiment: + result['sentiment'] = [{ 'magnitude': sentiment.magnitude, 'score':sentiment.score }] + + for entity in entities: + if get_type(entity.type) not in invalid_types: + result['entities'].append({'name': entity.name, 'type': get_type(entity.type), 'salience': entity.salience, 'wikipedia_url': entity.metadata.get('wikipedia_url', '-') }) + + for category in categories: + result['categories'].append({'name':category.name, 'confidence': category.confidence}) + + + return result + + +def load_text_from_url(url, **data): + + timeout = data.get('timeout', 20) + + results = [] + + try: + + print("Extracting text from: {}".format(url)) + response = requests.get(url, timeout=timeout) + + text = response.text + status = response.status_code + + if status == 200 and len(text) > 0: + return text + + return None + + + except Exception as e: + print('Problem with url: {0}.'.format(url)) + return None +``` + +要访问该 API,请按照 Google 的 [快速入门说明][17] 在 Google 云主控台中创建一个项目,启用该 API 并下载服务帐户密钥。之后,你应该拥有一个类似于以下内容的 JSON 文件: + +![services.json 文件][18] + +命名为 `services.json`,并上传到项目文件夹。 + +然后,你可以通过运行以下程序来提取任何 URL(例如 Opensource.com)的 API 数据: + +``` +url = "https://opensource.com/article/19/6/how-ssh-running-container" +pull_googlenlp(client,url) +``` + +如果设置正确,你将看到以下输出: + +![拉取 API 数据的输出][19] + +为了使入门更加容易,我创建了一个 [Jupyter 笔记本][20],你可以下载并使用它来测试提取网页的实体、类别和情感。我更喜欢使用 [JupyterLab][21],它是 Jupyter 笔记本的扩展,其中包括文件查看器和其他增强的用户体验功能。如果你不熟悉这些工具,我认为利用 [Anaconda][22] 是开始使用 Python 和 Jupyter 的最简单途径。它使安装和设置 Python 以及常用库变得非常容易,尤其是在 Windows 上。 + +### 处理数据 + +使用这些函数,可抓取给定页面的 HTML 并将其传递给自然语言 API,我可以对 723 个 URL 进行一些分析。首先,我将通过查看所有页面中返回的顶级分类的数量来查看与网站相关的分类。 + +#### 分类 + +![来自示例站点的分类数据][23] + +这似乎是该特定站点的关键主题的相当准确的代表。通过查看一个效果最好的页面进行排名的单个查询,我可以比较同一查询在 Google 搜索结果中的其他排名页面。 + + * URL 1 |顶级类别:/法律和政府/与法律相关的(0.5099999904632568)共 1 个类别。 + * 未返回任何类别。 + * URL 3 |顶级类别:/互联网与电信/移动与无线(0.6100000143051147)共 1 个类别。 + * URL 4 |顶级类别:/计算机与电子产品/软件(0.5799999833106995)共有 2 个类别。 + * URL 5 |顶级类别:/互联网与电信/移动与无线/移动应用程序和附件(0.75)共有 1 个类别。 + * 未返回任何类别。 + * URL 7 |顶级类别:/计算机与电子/软件/商业与生产力软件(0.7099999785423279)共 2 个类别。 + * URL 8 |顶级类别:/法律和政府/与法律相关的(0.8999999761581421)共 3 个类别。 + * URL 9 |顶级类别:/参考/一般参考/类型指南和模板(0.6399999856948853)共有 1 个类别。 + * 未返回任何类别。 + +上方括号中的数字表示 Google 对页面内容与该分类相关的置信度。对于相同分类,第八个结果比第一个结果具有更高的置信度,因此,这似乎不是定义排名相关性的灵丹妙药。此外,分类太宽泛导致无法满足特定搜索主题的需要。 + +通过排名查看平均置信度,这两个指标之间似乎没有相关性,至少对于此数据集而言如此: + +![平均置信度排名分布图][24] + +这两种方法对网站进行规模审查是有意义的,以确保内容类别易于理解,并且样板或销售内容不会使你的页面与你的主要专业知识领域无关。想一想,如果你出售工业用品,但是你的页面返回 “Marketing(销售)” 作为主要分类。似乎没有一个强烈的迹象表明,分类相关性与你的排名有什么关系,至少在页面级别如此。 + +#### 情感 + +我不会在情感上花很多时间。在所有从 API 返回情感的页面中,它们分为两个区间:0.1 和 0.2,这几乎是中立的情感。根据直方图,很容易看出情感没有太大价值。对于新闻或舆论网站而言,测量特定页面的情感到中位数排名之间的相关性将是一个更加有趣的指标。 + +![独特页面的情感柱状图][25] + +#### 实体 + +在我看来,实体是 API 中最有趣的部分。这是在所有页面中按显著性salience(或与页面的相关性)选择的顶级实体。请注意,对于相同的术语(销售清单),Google 会推断出不同的类型,可能是错误的。这是由于这些术语出现在内容中的不同上下文中引起的。 + +![示例网站的顶级实体][26] + +然后,我分别查看了每个实体类型,并一起查看了该实体的显著性与页面的最佳排名位置之间是否存在任何关联。对于每种类型,我匹配了与该类型匹配的顶级实体的显著性(与页面的整体相关性),按显著性排序(降序)。 + +有些实体类型在所有示例中返回的显著性为零,因此我从下面的图表中省略了这些结果。 + +![显著性与最佳排名位置的相关性][27] + +“Consumer Good(消费性商品)” 实体类型具有最高的正相关性,皮尔森相关度Pearson correlation为 0.15854,尽管由于较低编号的排名更好,所以 “Person” 实体的结果最好,相关度为 -0.15483。这是一个非常小的样本集,尤其是对于单个实体类型,我不能对数据做太多的判断。我没有发现任何具有强相关性的值,但是 “Person” 实体最有意义。网站通常都有关于其首席执行官和其他主要雇员的页面,这些页面很可能在这些查询的搜索结果方面做得好。 + +继续,当从整体上看站点,根据实体名称和实体类型,出现了以下主题。 + +![基于实体名称和实体类型的主题][28] + +我模糊了几个看起来过于具体的结果,以掩盖网站的身份。从主题上讲,名称信息是在你(或竞争对手)的网站上局部查看其核心主题的一种好方法。这样做仅基于示例网站的排名网址,而不是基于所有网站的可能网址(因为 Search Console 数据仅记录 Google 中展示的页面),但是结果会很有趣,尤其是当你使用像 [Ahrefs][29] 之类的工具提取一个网站的主要排名 URL,该工具会跟踪许多查询以及这些查询的 Google 搜索结果。 + +实体数据中另一个有趣的部分是标记为 “CONSUMER_GOOD” 的实体倾向于 “看起来” 像我在看到 “知识结果Knowledge Results”的结果,即页面右侧的 Google 搜索结果。 + +![Google 搜索结果][30] + +在我们的数据集中具有三个或三个以上关键字的 “Consumer Good(消费性商品)” 实体名称中,有 5.8% 的知识结果与 Google 对该实体命名的结果相同。这意味着,如果你在 Google 中搜索术语或短语,则右侧的框(例如,上面显示 Linux 的知识结果)将显示在搜索结果页面中。由于 Google 会 “挑选” 代表实体的示例网页,因此这是一个很好的机会,可以在搜索结果中识别出具有唯一特征的机会。同样有趣的是,5.8% 的在 Google 中显示这些知识结果名称中,没有一个实体的维基百科 URL 从自然语言 API 中返回。这很有趣,值得进行额外的分析。这将是非常有用的,特别是对于传统的全球排名跟踪工具(如 Ahrefs)数据库中没有的更深奥的主题。 + +如前所述,知识结果对于那些希望自己的内容在 Google 中被收录的网站所有者来说是非常重要的,因为它们在桌面搜索中加强高亮显示。假设,它们也很可能与 Google [Discover][31] 的知识库主题保持一致,这是一款适用于 Android 和 iOS 的产品,它试图根据用户感兴趣但没有明确搜索的主题为用户浮现内容。 + +### 总结 + +本文介绍了 Google 的自然语言 API,分享了一些代码,并研究了此 API 对网站所有者可能有用的方式。关键要点是: + + * 学习使用 Python 和 Jupyter 笔记本可以为你的数据收集任务打开到一个由令人难以置信的聪明和有才华的人建立的不可思议的 API 和开源项目(如 Pandas 和 NumPy)的世界。 + * Python 允许我为了一个特定目的快速提取和测试有关 API 值的假设。 + * 通过 Google 的分类 API 传递网站页面可能是一项很好的检查,以确保其内容分解成正确的主题分类。对于竞争对手的网站执行此操作还可以提供有关在何处进行调整或创建内容的指导。 + * 对于示例网站,Google 的情感评分似乎并不是一个有趣的指标,但是对于新闻或基于意见的网站,它可能是一个有趣的指标。 + * Google 发现的实体从整体上提供了更细化的网站的主题级别视图,并且像分类一样,在竞争性内容分析中使用将非常有趣。 + * 实体可以帮助定义机会,使你的内容可以与搜索结果或 Google Discover 结果中的 Google 知识块保持一致。我们将 5.8% 的结果设置为更长的(字计数)“Consumer Goods(消费商品)” 实体,显示这些结果,对于某些网站来说,可能有机会更好地优化这些实体的页面显著性分数,从而有更好的机会在 Google 搜索结果或 Google Discovers 建议中抓住这个重要作用的位置。 + +-------------------------------------------------------------------------------- + +via: https://opensource.com/article/19/7/python-google-natural-language-api + +作者:[JR Oakes][a] +选题:[lujun9972][b] +译者:[stevenzdg988](https://github.com/stevenzdg988) +校对:[wxy](https://github.com/wxy) + +本文由 [LCTT](https://github.com/LCTT/TranslateProject) 原创编译,[Linux中国](https://linux.cn/) 荣誉推出 + +[a]: https://opensource.com/users/jroakes +[b]: https://github.com/lujun9972 +[1]: https://opensource.com/sites/default/files/styles/image-full-size/public/lead-images/search_find_code_issue_bug_programming.png?itok=XPrh7fa0 (magnifying glass on computer screen) +[2]: https://cloud.google.com/natural-language/#natural-language-api-demo +[3]: https://opensource.com/article/19/3/natural-language-processing-tools +[4]: https://en.wikipedia.org/wiki/Knowledge_Graph +[5]: https://opensource.com/sites/default/files/uploads/entities.png (Entities) +[6]: https://opensource.com/sites/default/files/uploads/sentiment.png (Sentiment) +[7]: https://en.wikipedia.org/wiki/Lemmatisation +[8]: https://en.wikipedia.org/wiki/Part-of-speech_tagging +[9]: https://en.wikipedia.org/wiki/Parse_tree#Dependency-based_parse_trees +[10]: https://opensource.com/sites/default/files/uploads/syntax.png (Syntax) +[11]: https://opensource.com/sites/default/files/uploads/categories.png (Categories) +[12]: https://developers.google.com/webmaster-tools/ +[13]: https://github.com/MLTSEO/MLTS/blob/master/Demos.ipynb +[14]: https://opensource.com/sites/default/files/uploads/histogram_1.png (Histogram of clicks for all pages) +[15]: https://opensource.com/sites/default/files/uploads/histogram_2.png (Histogram of clicks for subset of pages) +[16]: https://pypi.org/project/google-cloud-language/ +[17]: https://cloud.google.com/natural-language/docs/quickstart +[18]: https://opensource.com/sites/default/files/uploads/json_file.png (services.json file) +[19]: https://opensource.com/sites/default/files/uploads/output.png (Output from pulling API data) +[20]: https://github.com/MLTSEO/MLTS/blob/master/Tutorials/Google_Language_API_Intro.ipynb +[21]: https://github.com/jupyterlab/jupyterlab +[22]: https://www.anaconda.com/distribution/ +[23]: https://opensource.com/sites/default/files/uploads/categories_2.png (Categories data from example site) +[24]: https://opensource.com/sites/default/files/uploads/plot.png (Plot of average confidence by ranking position ) +[25]: https://opensource.com/sites/default/files/uploads/histogram_3.png (Histogram of sentiment for unique pages) +[26]: https://opensource.com/sites/default/files/uploads/entities_2.png (Top entities for example site) +[27]: https://opensource.com/sites/default/files/uploads/salience_plots.png (Correlation between salience and best ranking position) +[28]: https://opensource.com/sites/default/files/uploads/themes.png (Themes based on entity name and entity type) +[29]: https://ahrefs.com/ +[30]: https://opensource.com/sites/default/files/uploads/googleresults.png (Google search results) +[31]: https://www.blog.google/products/search/introducing-google-discover/ diff --git a/published/202103/20200122 9 favorite open source tools for Node.js developers.md b/published/202103/20200122 9 favorite open source tools for Node.js developers.md new file mode 100644 index 0000000000..361c8a87d4 --- /dev/null +++ b/published/202103/20200122 9 favorite open source tools for Node.js developers.md @@ -0,0 +1,232 @@ +[#]: collector: (lujun9972) +[#]: translator: (stevenzdg988) +[#]: reviewer: (wxy) +[#]: publisher: (wxy) +[#]: url: (https://linux.cn/article-13206-1.html) +[#]: subject: (9 favorite open source tools for Node.js developers) +[#]: via: (https://opensource.com/article/20/1/open-source-tools-nodejs) +[#]: author: (Hiren Dhadhuk https://opensource.com/users/hirendhadhuk) + +9 个 Node.js 开发人员最喜欢的开源工具 +====== + +> 在众多可用于简化 Node.js 开发的工具中,以下 9 种是最佳选择。 + +![](https://img.linux.net.cn/data/attachment/album/202103/15/233658i99wxvzin13o5319.png) + +我最近在 [StackOverflow][2] 上读到了一项调查,该调查称超过 49% 的开发人员在其项目中使用了 Node.js。这结果对我来说并不意外。 + +作为一个狂热的技术使用者,我可以肯定地说 Node.js 的引入引领了软件开发的新时代。现在,它是软件开发最受欢迎的技术之一,仅次于JavaScript。 + +### Node.js 是什么,为什么如此受欢迎? + +Node.js 是一个跨平台的开源运行环境,用于在浏览器之外执行 JavaScript 代码。它也是建立在 Chrome 的 JavaScript 运行时之上的首选运行时环境,主要用于构建快速、可扩展和高效的网络应用程序。 + +我记得当时我们要花费几个小时来协调前端和后端开发人员,他们分别编写不同脚本。当 Node.js 出现后,所有这些都改变了。我相信,促使开发人员采用这项技术是因为它的双向效率。 + +使用 Node.js,你可以让你的代码同时运行在客户端和服务器端,从而加快了整个开发过程。Node.js 弥合了前端和后端开发之间的差距,并使开发过程更加高效。 + +### Node.js 工具浪潮 + +对于 49% 的开发人员(包括我)来说,Node.js 处于在前端和后端开发的金字塔顶端。有大量的 [Node.js 用例][3] 帮助我和我的团队在截止日期之内交付复杂的项目。幸运的是,Node.js 的日益普及也产生了一系列开源项目和工具,以帮助开发人员使用该环境。 + +近来,对使用 Node.js 构建的项目的需求突然增加。有时,我发现管理这些项目,并同时保持交付高质量项目的步伐非常具有挑战性。因此,我决定使用为 Node.js 开发人员提供的许多开源工具中一些最高效的,使某些方面的开发自动化。 + +根据我在 Node.js 方面的丰富经验,我使用了许多的工具,这些工具对整个开发过程都非常有帮助:从简化编码过程,到监测再到内容管理。 + +为了帮助我的 Node.js 开发同道,我整理了这个列表,其中包括我最喜欢的 9 个简化 Node.js 开发的开源工具。 + +### Webpack + +[Webpack][4] 是一个容易使用的 JavaScript 模块捆绑程序module bundler,用于简化前端开发。它会检测具有依赖的模块,并将其转换为描述模块的静态素材asset。 + +可以通过软件包管理器 npm 或 Yarn 安装该工具。 + +利用 npm 命令安装如下: + +``` +npm install --save-dev webpack +``` + +利用 Yarn 命令安装如下: + +``` +yarn add webpack --dev +``` + +Webpack 可以创建在运行时异步加载的单个捆绑包或多个素材链。不必单独加载。使用 Webpack 工具可以快速高效地打包这些素材并提供服务,从而改善用户整体体验,并减少开发人员在管理加载时间方面的困难。 + +### Strapi + +[Strapi][5] 是一个开源的无界面headless内容管理系统(CMS)。无界面 CMS 是一种基础软件,可以管理内容而无需预先构建好的前端。它是一个使用 RESTful API 函数的只有后端的系统。 + +可以通过软件包管理器 Yarn 或 npx 安装 Strapi。 + +利用 Yarn 命令安装如下: + +``` +yarn create strapi-app my-project --quickstart +``` + +利用 npx 命令安装如下: + +``` +npx create-strapi-app my-project --quickstart +``` + +Strapi 的目标是在任何设备上以结构化的方式获取和交付内容。CMS 可以使你轻松管理应用程序的内容,并确保它们是动态的,可以在任何设备上访问。 + +它提供了许多功能,包括文件上传、内置的电子邮件系统、JSON Web Token(JWT)验证和自动生成文档。我发现它非常方便,因为它简化了整个 CMS,并为我提供了编辑、创建或删除所有类型内容的完全自主权。 + +另外,通过 Strapi 构建的内容结构非常灵活,因为你可以创建和重用内容组和可定制的 API。 + +### Broccoli + +[Broccoli][6] 是一个功能强大的构建工具,运行在 [ES6][7] 模块上。构建工具是一种软件,可让你将应用程序或网站中的所有各种素材(例如图像、CSS、JavaScript 等)组合成一种可分发的格式。Broccoli 将自己称为 “雄心勃勃的应用程序的素材管道”。 + +使用 Broccoli 你需要一个项目目录。有了项目目录后,可以使用以下命令通过 npm 安装 Broccoli: + +``` +npm install --save-dev broccoli +npm install --global broccoli-cli +``` + +你也可以使用 Yarn 进行安装。 + +当前版本的 Node.js 就是使用该工具的最佳版本,因为它提供了长期支持。它可以帮助你避免进行更新和重新安装过程中的麻烦。安装过程完成后,可以在 `Brocfile.js` 文件中包含构建规范。 + +在 Broccoli 中,抽象单位是“树”,该树将文件和子目录存储在特定子目录中。因此,在构建之前,你必须有一个具体的想法,你希望你的构建是什么样子的。 + +最好的是,Broccoli 带有用于开发的内置服务器,可让你将素材托管在本地 HTTP 服务器上。Broccoli 非常适合流线型重建,因为其简洁的架构和灵活的生态系统可提高重建和编译速度。Broccoli 可让你井井有条,以节省时间并在开发过程中最大限度地提高生产力。 + +### Danger + +[Danger][8] 是一个非常方便的开源工具,用于简化你的拉取请求pull request(PR)检查。正如 Danger 库描述所说,该工具可通过管理 PR 检查来帮助 “正规化” 你的代码审查系统。Danger 可以与你的 CI 集成在一起,帮助你加快审核过程。 + +将 Danger 与你的项目集成是一个简单的逐步过程:你只需要包括 Danger 模块,并为每个项目创建一个 Danger 文件。然而,创建一个 Danger 帐户(通过 GitHub 或 Bitbucket 很容易做到),并且为开源软件项目设置访问令牌更加方便。 + +可以通过 NPM 或 Yarn 安装 Danger。要使用 Yarn,请添加 `danger -D` 到 `package.JSON` 中。 + +将 Danger 添加到 CI 后,你可以: + + * 高亮显示重要的创建工件 + * 通过强制链接到 Trello 和 Jira 之类的工具来管理 sprint + * 强制生成更新日志 + * 使用描述性标签 + * 以及更多 + +例如,你可以设计一个定义团队文化并为代码审查和 PR 检查设定特定规则的系统。根据 Danger 提供的元数据及其广泛的插件生态系统,可以解决常见的议题issue。 + +### Snyk + +网络安全是开发人员的主要关注点。[Snyk][9] 是修复开源组件中漏洞的最著名工具之一。它最初是一个用于修复 Node.js 项目漏洞的项目,并且已经演变为可以检测并修复 Ruby、Java、Python 和 Scala 应用程序中的漏洞。Snyk 主要分四个阶段运行: + + * 查找漏洞依赖性 + * 修复特定漏洞 + * 通过 PR 检查预防安全风险 + * 持续监控应用程序 + +Snyk 可以集成在项目的任何阶段,包括编码、CI/CD 和报告。我发现这对于测试 Node.js 项目非常有帮助,可以测试或构建 npm 软件包时检查是否存在安全风险。你还可以在 GitHub 中为你的应用程序运行 PR 检查,以使你的项目更安全。Synx 还提供了一系列集成,可用于监控依赖关系并解决特定问题。 + +要在本地计算机上运行 Snyk,可以通过 NPM 安装它: + +``` +npm install -g snyk +``` + +### Migrat + +[Migrat][10] 是一款使用纯文本的数据迁移工具,非常易于使用。 它可在各种软件堆栈和进程中工作,从而使其更加实用。你可以使用简单的代码行安装 Migrat: + +``` +$ npm install -g migrat +``` + +Migrat 并不需要特别的数据库引擎。它支持多节点环境,因为迁移可以在一个全局节点上运行,也可以在每个服务器上运行一次。Migrat 之所以方便,是因为它便于向每个迁移传递上下文。 + +你可以定义每个迁移的用途(例如,数据库集、连接、日志接口等)。此外,为了避免随意迁移,即多个服务器在全局范围内进行迁移,Migrat 可以在进程运行时进行全局锁定,从而使其只能在全局范围内运行一次。它还附带了一系列用于 SQL 数据库、Slack、HipChat 和 Datadog 仪表盘的插件。你可以将实时迁移状况发送到这些平台中的任何一个。 + +### Clinic.js + +[Clinic.js][11] 是一个用于 Node.js 项目的开源监视工具。它结合了三种不同的工具 Doctor、Bubbleprof 和 Flame,帮助你监控、检测和解决 Node.js 的性能问题。 + +你可以通过运行以下命令从 npm 安装 Clinic.js: + +``` +$ npm install clinic +``` + +你可以根据要监视项目的某个方面以及要生成的报告,选择要使用的 Clinic.js 包含的三个工具中的一个: + + * Doctor 通过注入探针来提供详细的指标,并就项目的总体运行状况提供建议。 + * Bubbleprof 非常适合分析,并使用 `async_hooks` 生成指标。 + * Flame 非常适合发现代码中的热路径和瓶颈。 + +### PM2 + +监视是后端开发过程中最重要的方面之一。[PM2][12] 是一款 Node.js 的进程管理工具,可帮助开发人员监视项目的多个方面,例如日志、延迟和速度。该工具与 Linux、MacOS 和 Windows 兼容,并支持从 Node.js 8.X 开始的所有 Node.js 版本。 + +你可以使用以下命令通过 npm 安装 PM2: + +``` +$ npm install pm2 --g +``` + +如果尚未安装 Node.js,则可以使用以下命令安装: + +``` +wget -qO- https://getpm2.com/install.sh | bash +``` + +安装完成后,使用以下命令启动应用程序: + +``` +$ pm2 start app.js +``` + +关于 PM2 最好的地方是可以在集群模式下运行应用程序。可以同时为多个 CPU 内核生成一个进程。这样可以轻松增强应用程序性能并最大程度地提高可靠性。PM2 也非常适合更新工作,因为你可以使用 “热重载” 选项更新应用程序并以零停机时间重新加载应用程序。总体而言,它是为 Node.js 应用程序简化进程管理的好工具。 + +### Electrode + +[Electrode][13] 是 Walmart Labs 的一个开源应用程序平台。该平台可帮助你以结构化方式构建大规模通用的 React/Node.js 应用程序。 + +Electrode 应用程序生成器使你可以构建专注于代码的灵活内核,提供一些出色的模块以向应用程序添加复杂功能,并附带了广泛的工具来优化应用程序的 Node.js 包。 + +可以使用 npm 安装 Electrode。安装完成后,你可以使用 Ignite 启动应用程序,并深入研究 Electrode 应用程序生成器。 + +你可以使用 NPM 安装 Electrode: + +``` +npm install -g electrode-ignite xclap-cli +``` + +### 你最喜欢哪一个? + +这些只是不断增长的开源工具列表中的一小部分,在使用 Node.js 时,这些工具可以在不同阶段派上用场。你最喜欢使用哪些开源 Node.js 工具?请在评论中分享你的建议。 + +-------------------------------------------------------------------------------- + +via: https://opensource.com/article/20/1/open-source-tools-nodejs + +作者:[Hiren Dhadhuk][a] +选题:[lujun9972][b] +译者:[stevenzdg988](https://github.com/stevenzdg988) +校对:[wxy](https://github.com/wxy) + +本文由 [LCTT](https://github.com/LCTT/TranslateProject) 原创编译,[Linux中国](https://linux.cn/) 荣誉推出 + +[a]: https://opensource.com/users/hirendhadhuk +[b]: https://github.com/lujun9972 +[1]: https://opensource.com/sites/default/files/styles/image-full-size/public/lead-images/tools_hardware_purple.png?itok=3NdVoYhl (Tools illustration) +[2]: https://insights.stackoverflow.com/survey/2019#technology-_-other-frameworks-libraries-and-tools +[3]: https://www.simform.com/nodejs-use-case/ +[4]: https://webpack.js.org/ +[5]: https://strapi.io/ +[6]: https://broccoli.build/ +[7]: https://en.wikipedia.org/wiki/ECMAScript#6th_Edition_-_ECMAScript_2015 +[8]: https://danger.systems/ +[9]: https://snyk.io/ +[10]: https://github.com/naturalatlas/migrat +[11]: https://clinicjs.org/ +[12]: https://pm2.keymetrics.io/ +[13]: https://www.electrode.io/ diff --git a/published/202103/20200127 Managing processes on Linux with kill and killall.md b/published/202103/20200127 Managing processes on Linux with kill and killall.md new file mode 100644 index 0000000000..1d5e76b80e --- /dev/null +++ b/published/202103/20200127 Managing processes on Linux with kill and killall.md @@ -0,0 +1,152 @@ +[#]: collector: "lujun9972" +[#]: translator: "wyxplus" +[#]: reviewer: "wxy" +[#]: publisher: "wxy" +[#]: url: "https://linux.cn/article-13215-1.html" +[#]: subject: "Managing processes on Linux with kill and killall" +[#]: via: "https://opensource.com/article/20/1/linux-kill-killall" +[#]: author: "Jim Hall https://opensource.com/users/jim-hall" + +在 Linux 上使用 kill 和 killall 命令来管理进程 +====== + +> 了解如何使用 ps、kill 和 killall 命令来终止进程并回收系统资源。 + +![](https://img.linux.net.cn/data/attachment/album/202103/18/230625q6g65gz6ugdk8ygr.jpg) + +在 Linux 中,每个程序和守护程序daemon都是一个“进程process”。 大多数进程代表一个正在运行的程序。而另外一些程序可以派生出其他进程,比如说它会侦听某些事件的发生,然后对其做出响应。并且每个进程都需要一定的内存和处理能力。你运行的进程越多,所需的内存和 CPU 使用周期就越多。在老式电脑(例如我使用了 7 年的笔记本电脑)或轻量级计算机(例如树莓派)上,如果你关注过后台运行的进程,就能充分利用你的系统。 + +你可以使用 `ps` 命令来查看正在运行的进程。你通常会使用 `ps` 命令的参数来显示出更多的输出信息。我喜欢使用 `-e` 参数来查看每个正在运行的进程,以及 `-f` 参数来获得每个进程的全部细节。以下是一些例子: + +``` +$ ps + PID TTY TIME CMD + 88000 pts/0 00:00:00 bash + 88052 pts/0 00:00:00 ps + 88053 pts/0 00:00:00 head +``` +``` +$ ps -e | head + PID TTY TIME CMD + 1 ? 00:00:50 systemd + 2 ? 00:00:00 kthreadd + 3 ? 00:00:00 rcu_gp + 4 ? 00:00:00 rcu_par_gp + 6 ? 00:00:02 kworker/0:0H-events_highpri + 9 ? 00:00:00 mm_percpu_wq + 10 ? 00:00:01 ksoftirqd/0 + 11 ? 00:00:12 rcu_sched + 12 ? 00:00:00 migration/0 +``` +``` +$ ps -ef | head +UID PID PPID C STIME TTY TIME CMD +root 1 0 0 13:51 ? 00:00:50 /usr/lib/systemd/systemd --switched-root --system --deserialize 36 +root 2 0 0 13:51 ? 00:00:00 [kthreadd] +root 3 2 0 13:51 ? 00:00:00 [rcu_gp] +root 4 2 0 13:51 ? 00:00:00 [rcu_par_gp] +root 6 2 0 13:51 ? 00:00:02 [kworker/0:0H-kblockd] +root 9 2 0 13:51 ? 00:00:00 [mm_percpu_wq] +root 10 2 0 13:51 ? 00:00:01 [ksoftirqd/0] +root 11 2 0 13:51 ? 00:00:12 [rcu_sched] +root 12 2 0 13:51 ? 00:00:00 [migration/0] +``` + +最后的例子显示最多的细节。在每一行,`UID`(用户 ID)显示了该进程的所有者。`PID`(进程 ID)代表每个进程的数字 ID,而 `PPID`(父进程 ID)表示其父进程的数字 ID。在任何 Unix 系统中,进程是从 1 开始编号,是内核启动后运行的第一个进程。在这里,`systemd` 是第一个进程,它催生了 `kthreadd`,而 `kthreadd` 还创建了其他进程,包括 `rcu_gp`、`rcu_par_gp` 等一系列进程。 + +### 使用 kill 命令来管理进程 + +系统会处理大多数后台进程,所以你不需要操心这些进程。你只需要关注那些你所运行的应用创建的进程。虽然许多应用一次只运行一个进程(如音乐播放器、终端模拟器或游戏等),但其他应用则可能创建后台进程。其中一些应用可能当你退出后还在后台运行,以便下次你使用的时候能快速启动。 + +当我运行 Chromium(作为谷歌 Chrome 浏览器所基于的开源项目)时,进程管理便成了问题。 Chromium 在我的笔记本电脑上运行非常吃力,并产生了许多额外的进程。现在我仅打开五个选项卡,就能看到这些 Chromium 进程: + +``` +$ ps -ef | fgrep chromium +jhall 66221 [...] /usr/lib64/chromium-browser/chromium-browser [...] +jhall 66230 [...] /usr/lib64/chromium-browser/chromium-browser [...] +[...] +jhall 66861 [...] /usr/lib64/chromium-browser/chromium-browser [...] +jhall 67329 65132 0 15:45 pts/0 00:00:00 grep -F chromium +``` + +我已经省略一些行,其中有 20 个 Chromium 进程和一个正在搜索 “chromium" 字符的 `grep` 进程。 + +``` +$ ps -ef | fgrep chromium | wc -l +21 +``` + +但是在我退出 Chromium 之后,这些进程仍旧运行。如何关闭它们并回收这些进程占用的内存和 CPU 呢? + +`kill` 命令能让你终止一个进程。在最简单的情况下,你告诉 `kill` 命令终止你想终止的进程的 PID。例如,要终止这些进程,我需要对 20 个 Chromium 进程 ID 都执行 `kill` 命令。一种方法是使用命令行获取 Chromium 的 PID,而另一种方法针对该列表运行 `kill`: + + +``` +$ ps -ef | fgrep /usr/lib64/chromium-browser/chromium-browser | awk '{print $2}' +66221 +66230 +66239 +66257 +66262 +66283 +66284 +66285 +66324 +66337 +66360 +66370 +66386 +66402 +66503 +66539 +66595 +66734 +66848 +66861 +69702 + +$ ps -ef | fgrep /usr/lib64/chromium-browser/chromium-browser | awk '{print $2}' > /tmp/pids +$ kill $(cat /tmp/pids) +``` + +最后两行是关键。第一个命令行为 Chromium 浏览器生成一个进程 ID 列表。第二个命令行针对该进程 ID 列表运行 `kill` 命令。 + +### 介绍 killall 命令 + +一次终止多个进程有个更简单方法,使用 `killall` 命令。你或许可以根据名称猜测出,`killall` 会终止所有与该名字匹配的进程。这意味着我们可以使用此命令来停止所有流氓 Chromium 进程。这很简单: + +``` +$ killall /usr/lib64/chromium-browser/chromium-browser +``` + +但是要小心使用 `killall`。该命令能够终止与你所给出名称相匹配的所有进程。这就是为什么我喜欢先使用 `ps -ef` 命令来检查我正在运行的进程,然后针对要停止的命令的准确路径运行 `killall`。 + +你也可以使用 `-i` 或 `--interactive` 参数,来让 `killkill` 在停止每个进程之前提示你。 + +`killall` 还支持使用 `-o` 或 `--older-than` 参数来查找比特定时间更早的进程。例如,如果你发现了一组已经运行了好几天的恶意进程,这将会很有帮助。又或是,你可以查找比特定时间更晚的进程,例如你最近启动的失控进程。使用 `-y` 或 `--young-than` 参数来查找这些进程。 + +### 其他管理进程的方式 + +进程管理是系统维护重要的一部分。在我作为 Unix 和 Linux 系统管理员的早期职业生涯中,杀死非法作业的能力是保持系统正常运行的关键。在如今,你可能不需要亲手在 Linux 上的终止流氓进程,但是知道 `kill` 和 `killall` 能够在最终出现问题时为你提供帮助。 + +你也能寻找其他方式来管理进程。在我这个案例中,我并不需要在我退出浏览器后,使用 `kill` 或 `killall` 来终止后台 Chromium 进程。在 Chromium 中有个简单设置就可以进行控制: + +![Chromium background processes setting][2] + +不过,始终关注系统上正在运行哪些进程,并且在需要的时候进行干预是一个明智之举。 + +-------------------------------------------------------------------------------- + +via: https://opensource.com/article/20/1/linux-kill-killall + +作者:[Jim Hall][a] +选题:[lujun9972][b] +译者:[wyxplus](https://github.com/wyxplus) +校对:[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/linux_penguin_green.png?itok=ENdVzW22 "Penguin with green background" +[2]: https://opensource.com/sites/default/files/uploads/chromium-settings-continue-running.png "Chromium background processes setting" diff --git a/published/202103/20200129 Ansible Playbooks Quick Start Guide with Examples.md b/published/202103/20200129 Ansible Playbooks Quick Start Guide with Examples.md new file mode 100644 index 0000000000..bf14ca23c7 --- /dev/null +++ b/published/202103/20200129 Ansible Playbooks Quick Start Guide with Examples.md @@ -0,0 +1,341 @@ +[#]: collector: "lujun9972" +[#]: translator: "MjSeven" +[#]: reviewer: "wxy" +[#]: publisher: "wxy" +[#]: url: "https://linux.cn/article-13167-1.html" +[#]: subject: "Ansible Playbooks Quick Start Guide with Examples" +[#]: via: "https://www.2daygeek.com/ansible-playbooks-quick-start-guide-with-examples/" +[#]: author: "Magesh Maruthamuthu https://www.2daygeek.com/author/magesh/" + +Ansible 剧本快速入门指南 +====== + +我们已经写了两篇关于 Ansible 的文章,这是第三篇。 + +如果你是 Ansible 新手,我建议你阅读下面这两篇文章,它会教你一些 Ansible 的基础以及它是什么。 + + * 第一篇: [Ansible 自动化工具安装、配置和快速入门指南][1] + * 第二篇: [Ansible 点对点命令快速入门指南示例][2] + +如果你已经阅读过了,那么在阅读本文时你才不会感到突兀。 + +### 什么是 Ansible 剧本? + +剧本playbook比点对点命令模式更强大,而且完全不同。 + +它使用了 `/usr/bin/ansible-playbook` 二进制文件,并且提供丰富的特性使得复杂的任务变得更容易。 + +如果你想经常运行一个任务,剧本是非常有用的。此外,如果你想在服务器组上执行多个任务,它也是非常有用的。 + +剧本是由 YAML 语言编写。YAML 代表一种标记语言,它比其它常见的数据格式(如 XML 或 JSON)更容易读写。 + +下面这张 Ansible 剧本流程图将告诉你它的详细结构。 + +![][3] + +### 理解 Ansible 剧本的术语 + + * 控制节点Control node:Ansible 安装的机器,它负责管理客户端节点。 + * 受控节点Managed node:控制节点管理的主机列表。 + * 剧本playbook:一个剧本文件包含一组自动化任务。 + * 主机清单Inventory:这个文件包含有关管理的服务器的信息。 + * 任务Task:每个剧本都有大量的任务。任务在指定机器上依次执行(一个主机或多个主机)。 + * 模块Module: 模块是一个代码单元,用于从客户端节点收集信息。 + * 角色Role:角色是根据已知文件结构自动加载一些变量文件、任务和处理程序的方法。 + * 动作Play:每个剧本含有大量的动作,一个动作从头到尾执行一个特定的自动化。 + * 处理程序Handler: 它可以帮助你减少在剧本中的重启任务。处理程序任务列表实际上与常规任务没有什么不同,更改由通知程序通知。如果处理程序没有收到任何通知,它将不起作用。 + +### 基本的剧本是怎样的? + +下面是一个剧本的模板: + +``` +--- [YAML 文件应该以三个破折号开头] +- name: [脚本描述] + hosts: group [添加主机或主机组] + become: true [如果你想以 root 身份运行任务,则标记它] + tasks: [你想在任务下执行什么动作] + - name: [输入模块选项] + module: [输入要执行的模块] + module_options-1: value [输入模块选项] + module_options-2: value + . + module_options-N: value +``` + +### 如何理解 Ansible 的输出 + +Ansible 剧本的输出有四种颜色,下面是具体含义: + + * **绿色**:`ok` 代表成功,关联的任务数据已经存在,并且已经根据需要进行了配置。 + * **黄色**:`changed` 指定的数据已经根据任务的需要更新或修改。 + * **红色**:`FAILED` 如果在执行任务时出现任何问题,它将返回一个失败消息,它可能是任何东西,你需要相应地修复它。 + * **白色**:表示有多个参数。 + +为此,创建一个剧本目录,将它们都放在同一个地方。 + +``` +$ sudo mkdir /etc/ansible/playbooks +``` + +### 剧本-1:在 RHEL 系统上安装 Apache Web 服务器 + +这个示例剧本允许你在指定的目标机器上安装 Apache Web 服务器: + +``` +$ sudo nano /etc/ansible/playbooks/apache.yml + +--- +- hosts: web + become: yes + name: "Install and Configure Apache Web server" + tasks: + - name: "Install Apache Web Server" + yum: + name: httpd + state: latest + - name: "Ensure Apache Web Server is Running" + service: + name: httpd + state: started +``` + +``` +$ ansible-playbook apache1.yml +``` + +![][3] + +### 如何理解 Ansible 中剧本的执行 + +使用以下命令来查看语法错误。如果没有发现错误,它只显示剧本文件名。如果它检测到任何错误,你将得到一个如下所示的错误,但内容可能根据你的输入文件而有所不同。 + +``` +$ ansible-playbook apache1.yml --syntax-check + +ERROR! Syntax Error while loading YAML. + found a tab character that violate indentation +The error appears to be in '/etc/ansible/playbooks/apache1.yml': line 10, column 1, but may +be elsewhere in the file depending on the exact syntax problem. +The offending line appears to be: + state: latest +^ here +There appears to be a tab character at the start of the line. + +YAML does not use tabs for formatting. Tabs should be replaced with spaces. +For example: + - name: update tooling + vars: + version: 1.2.3 +# ^--- there is a tab there. +Should be written as: + - name: update tooling + vars: + version: 1.2.3 +# ^--- all spaces here. +``` + +或者,你可以使用这个 URL [YAML Lint][4] 在线检查 Ansible 剧本内容。 + +执行以下命令进行“演练”。当你运行带有 `--check` 选项的剧本时,它不会对远程机器进行任何修改。相反,它会告诉你它将要做什么改变但不是真的执行。 + +``` +$ ansible-playbook apache.yml --check + +PLAY [Install and Configure Apache Webserver] ******************************************************************** + +TASK [Gathering Facts] ******************************************************************************************* +ok: [node2.2g.lab] +ok: [node1.2g.lab] + +TASK [Install Apache Web Server] ********************************************************************************* +changed: [node2.2g.lab] +changed: [node1.2g.lab] + +TASK [Ensure Apache Web Server is Running] *********************************************************************** +changed: [node1.2g.lab] +changed: [node2.2g.lab] + +PLAY RECAP ******************************************************************************************************* +node1.2g.lab : ok=3 changed=2 unreachable=0 failed=0 skipped=0 rescued=0 ignored=0 +node2.2g.lab : ok=3 changed=2 unreachable=0 failed=0 skipped=0 rescued=0 ignored=0 +``` + +如果你想要知道 ansible 剧本实现的详细信息,使用 `-vv` 选项,它会展示如何收集这些信息。 + +``` +$ ansible-playbook apache.yml --check -vv + +ansible-playbook 2.9.2 + config file = /etc/ansible/ansible.cfg + configured module search path = ['/home/daygeek/.ansible/plugins/modules', '/usr/share/ansible/plugins/modules'] + ansible python module location = /usr/lib/python3.8/site-packages/ansible + executable location = /usr/bin/ansible-playbook + python version = 3.8.1 (default, Jan 8 2020, 23:09:20) [GCC 9.2.0] +Using /etc/ansible/ansible.cfg as config file + +PLAYBOOK: apache.yml ***************************************************************************************************** +1 plays in apache.yml + +PLAY [Install and Configure Apache Webserver] **************************************************************************** + +TASK [Gathering Facts] *************************************************************************************************** +task path: /etc/ansible/playbooks/apache.yml:2 +ok: [node2.2g.lab] +ok: [node1.2g.lab] +META: ran handlers + +TASK [Install Apache Web Server] ***************************************************************************************** +task path: /etc/ansible/playbooks/apache.yml:6 +changed: [node2.2g.lab] => {"changed": true, "msg": "Check mode: No changes made, but would have if not in check mod +e", "rc": 0, "results": ["Installed: httpd"]} +changed: [node1.2g.lab] => {"changed": true, "changes": {"installed": ["httpd"], "updated": []}, "msg": "", "obsolet +es": {"urw-fonts": {"dist": "noarch", "repo": "@anaconda", "version": "2.4-16.el7"}}, "rc": 0, "results": []} + +TASK [Ensure Apache Web Server is Running] ******************************************************************************* +task path: /etc/ansible/playbooks/apache.yml:10 +changed: [node1.2g.lab] => {"changed": true, "msg": "Service httpd not found on host, assuming it will exist on full run"} +changed: [node2.2g.lab] => {"changed": true, "msg": "Service httpd not found on host, assuming it will exist on full run"} +META: ran handlers +META: ran handlers + +PLAY RECAP *************************************************************************************************************** +node1.2g.lab : ok=3 changed=2 unreachable=0 failed=0 skipped=0 rescued=0 ignored=0 +node2.2g.lab : ok=3 changed=2 unreachable=0 failed=0 skipped=0 rescued=0 ignored=0 +``` + +### 剧本-2:在 Ubuntu 系统上安装 Apache Web 服务器 + +这个示例剧本允许你在指定的目标节点上安装 Apache Web 服务器。 + +``` +$ sudo nano /etc/ansible/playbooks/apache-ubuntu.yml + +--- +- hosts: web + become: yes + name: "Install and Configure Apache Web Server" + tasks: + - name: "Install Apache Web Server" + yum: + name: apache2 + state: latest + + - name: "Start the Apache Web Server" + service: + name: apaceh2 + state: started + + - name: "Enable mod_rewrite module" + apache2_module: + name: rewrite + state: present + + notify: + - start apache + + handlers: + - name: "Ensure Apache Web Server is Running" + service: + name: apache2 + state: restarted + enabled: yes +``` + +### 剧本-3:在 Red Hat 系统上安装软件包列表 + +这个示例剧本允许你在指定的目标节点上安装软件包。 + +**方法-1:** + +``` +$ sudo nano /etc/ansible/playbooks/packages-redhat.yml + +--- +- hosts: web + become: yes + name: "Install a List of Packages on Red Hat Based System" + tasks: + - name: "Installing a list of packages" + yum: + name: + - curl + - httpd + - nano + - htop +``` + +**方法-2:** + +``` +$ sudo nano /etc/ansible/playbooks/packages-redhat-1.yml + +--- +- hosts: web + become: yes + name: "Install a List of Packages on Red Hat Based System" + tasks: + - name: "Installing a list of packages" + yum: name={{ item }} state=latest + with_items: + - curl + - httpd + - nano + - htop +``` + +**方法-3:使用数组变量** + +``` +$ sudo nano /etc/ansible/playbooks/packages-redhat-2.yml + +--- +- hosts: web + become: yes + name: "Install a List of Packages on Red Hat Based System" + vars: + packages: [ 'curl', 'git', 'htop' ] + tasks: + - name: Install a list of packages + yum: name={{ item }} state=latest + with_items: "{{ packages }}" +``` + +### 剧本-4:在 Linux 系统上安装更新 + +这个示例剧本允许你在基于 Red Hat 或 Debian 的 Linux 系统上安装更新。 + +``` +$ sudo nano /etc/ansible/playbooks/security-update.yml + +--- +- hosts: web + become: yes + name: "Install Security Update" + tasks: + - name: "Installing Security Update on Red Hat Based System" + yum: name=* update_cache=yes security=yes state=latest + when: ansible_facts['distribution'] == "CentOS" + + - name: "Installing Security Update on Ubuntu Based System" + apt: upgrade=dist update_cache=yes + when: ansible_facts['distribution'] == "Ubuntu" +``` + +-------------------------------------------------------------------------------- + +via: https://www.2daygeek.com/ansible-playbooks-quick-start-guide-with-examples/ + +作者:[Magesh Maruthamuthu][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://www.2daygeek.com/author/magesh/ +[b]: https://github.com/lujun9972 +[1]: https://linux.cn/article-13142-1.html +[2]: https://linux.cn/article-13163-1.html +[3]: https://www.2daygeek.com/wp-content/uploads/2020/01/ansible-playbook-structure-flow-chart-explained.png +[4]: http://www.yamllint.com/ diff --git a/published/202103/20200219 Multicloud, security integration drive massive SD-WAN adoption.md b/published/202103/20200219 Multicloud, security integration drive massive SD-WAN adoption.md new file mode 100644 index 0000000000..42239ba15a --- /dev/null +++ b/published/202103/20200219 Multicloud, security integration drive massive SD-WAN adoption.md @@ -0,0 +1,74 @@ +[#]: collector: (lujun9972) +[#]: translator: (cooljelly) +[#]: reviewer: (wxy) +[#]: publisher: (wxy) +[#]: url: (https://linux.cn/article-13239-1.html) +[#]: subject: (Multicloud, security integration drive massive SD-WAN adoption) +[#]: via: (https://www.networkworld.com/article/3527194/multicloud-security-integration-drive-massive-sd-wan-adoption.html) +[#]: author: (Michael Cooney https://www.networkworld.com/author/Michael-Cooney/) + +多云融合和安全集成推动 SD-WAN 的大规模应用 +====== + +> 2022 年 SD-WAN 市场 40% 的同比增长主要来自于包括 Cisco、VMWare、Juniper 和 Arista 在内的网络供应商和包括 AWS、Microsoft Azure,Google Anthos 和 IBM RedHat 在内的服务提供商之间的紧密联系。 + +![](https://img.linux.net.cn/data/attachment/album/202103/27/095154f0625f3k8455800x.jpg) + +越来越多的云应用,以及越来越完善的网络安全性、可视化特性和可管理性,正以惊人的速度推动企业软件定义广域网software-defined WAN([SD-WAN][3])的部署。 + +IDC(LCTT 译注:International Data Corporation)公司的网络基础架构副总裁 Rohit Mehra 表示,根据 IDC 的研究,过去一年中,特别是软件和基础设施即服务(SaaS 和 IaaS)产品推动了 SD-WAN 的实施。 + +例如,IDC 表示,根据其最近的客户调查结果,有 95% 的客户将在两年内使用 [SD-WAN][7] 技术,而 42% 的客户已经部署了它。IDC 还表示,到 2022 年,SD-WAN 基础设施市场将达到 45 亿美元,此后每年将以每年 40% 的速度增长。 + +“SD-WAN 的增长是一个广泛的趋势,很大程度上是由企业希望优化远程站点的云连接性的需求推动的。” Mehra 说。 + +思科最近撰文称,多云网络的发展正在促使许多企业改组其网络,以更好地使用 SD-WAN 技术。SD-WAN 对于采用云服务的企业至关重要,它是园区网、分支机构、[物联网][8]、[数据中心][9] 和云之间的连接中间件。思科公司表示,根据调查,平均每个思科的企业客户有 30 个付费的 SaaS 应用程序,而他们实际使用的 SaaS 应用会更多——在某些情况下甚至超过 100 种。 + +这种趋势的部分原因是由网络供应商(例如 Cisco、VMware、Juniper、Arista 等)(LCTT 译注:这里的网络供应商指的是提供硬件或软件并可按需组网的厂商)与服务提供商(例如 Amazon AWS、Microsoft Azure、Google Anthos 和 IBM RedHat 等)建立的关系推动的。 + +去年 12 月,AWS 为其云产品发布了关键服务,其中包括诸如 [AWS Transit Gateway][10] 等新集成技术的关键服务,这标志着 SD-WAN 与多云场景关系的日益重要。使用 AWS Transit Gateway 技术,客户可以将 AWS 中的 VPC(虚拟私有云Virtual Private Cloud)和其自有网络均连接到相同的网关。Aruba、Aviatrix Cisco、Citrix Systems、Silver Peak 和 Versa 已经宣布支持该技术,这将简化和增强这些公司的 SD-WAN 产品与 AWS 云服务的集成服务的性能和表现。 + +Mehra 说,展望未来,对云应用的友好兼容和完善的性能监控等增值功能将是 SD-WAN 部署的关键部分。 + +随着 SD-WAN 与云的关系不断发展,SD-WAN 对集成安全功能的需求也在不断增长。 + +Mehra 说,SD-WAN 产品集成安全性的方式比以往单独打包的广域网安全软件或服务要好得多。SD-WAN 是一个更加敏捷的安全环境。SD-WAN 公认的主要组成部分包括安全功能,数据分析功能和广域网优化功能等,其中安全功能则是下一代 SD-WAN 解决方案的首要需求。 + +Mehra 说,企业将越来越少地关注仅解决某个具体问题的 SD-WAN 解决方案,而将青睐于能够解决更广泛的网络管理和安全需求的 SD-WAN 平台。他们将寻找可以与他们的 IT 基础设施(包括企业数据中心网络、企业园区局域网、[公有云][12] 资源等)集成更紧密的 SD-WAN 平台。他说,企业将寻求无缝融合的安全服务,并希望有其他各种功能的支持,例如可视化、数据分析和统一通信功能。 + +“随着客户不断将其基础设施与软件集成在一起,他们可以做更多的事情,例如根据其局域网和广域网上的用户、设备或应用程序的需求,实现一致的管理和安全策略,并最终获得更好的整体使用体验。” Mehra 说。 + +一个新兴趋势是 SD-WAN 产品包需要支持 [SD-branch][13] 技术。 Mehra 说,超过 70% 的 IDC 受调查客户希望在明年使用 SD-Branch。在最近几周,[Juniper][14] 和 [Aruba][15] 公司已经优化了 SD-branch 产品,这一趋势预计将在今年持续下去。 + +SD-Branch 技术建立在 SD-WAN 的概念和支持的基础上,但更专注于满足分支机构中局域网的组网和管理需求。展望未来,SD-Branch 如何与其他技术集成,例如数据分析、音视频、统一通信等,将成为该技术的主要驱动力。 + +-------------------------------------------------------------------------------- + +via: https://www.networkworld.com/article/3527194/multicloud-security-integration-drive-massive-sd-wan-adoption.html + +作者:[Michael Cooney][a] +选题:[lujun9972][b] +译者:[cooljelly](https://github.com/cooljelly) +校对:[wxy](https://github.com/wxy) + +本文由 [LCTT](https://github.com/LCTT/TranslateProject) 原创编译,[Linux中国](https://linux.cn/) 荣誉推出 + +[a]: https://www.networkworld.com/author/Michael-Cooney/ +[b]: https://github.com/lujun9972 +[1]: https://images.idgesg.net/images/article/2018/07/branches_branching_trees_bare_black_and_white_by_gratisography_cc0_via_pexels_1200x800-100763250-large.jpg +[2]: https://creativecommons.org/publicdomain/zero/1.0/ +[3]: https://www.networkworld.com/article/3031279/sd-wan-what-it-is-and-why-you-ll-use-it-one-day.html +[4]: https://www.networkworld.com/article/3291790/data-center/how-edge-networking-and-iot-will-reshape-data-centers.html +[5]: https://www.networkworld.com/article/3331978/lan-wan/edge-computing-best-practices.html +[6]: https://www.networkworld.com/article/3331905/internet-of-things/how-edge-computing-can-help-secure-the-iot.html +[7]: https://www.networkworld.com/article/3489938/what-s-hot-at-the-edge-for-2020-everything.html +[8]: https://www.networkworld.com/article/3207535/what-is-iot-the-internet-of-things-explained.html +[9]: https://www.networkworld.com/article/3223692/what-is-a-data-centerhow-its-changed-and-what-you-need-to-know.html +[10]: https://aws.amazon.com/transit-gateway/ +[11]: 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) +[12]: https://www.networkworld.com/article/2159885/cloud-computing-gartner-5-things-a-private-cloud-is-not.html +[13]: https://www.networkworld.com/article/3250664/sd-branch-what-it-is-and-why-youll-need-it.html +[14]: https://www.networkworld.com/article/3487801/juniper-broadens-sd-branch-management-switch-options.html +[15]: https://www.networkworld.com/article/3513357/aruba-reinforces-sd-branch-with-security-management-upgrades.html +[16]: https://www.facebook.com/NetworkWorld/ +[17]: https://www.linkedin.com/company/network-world diff --git a/published/202103/20200410 Get started with Bash programming.md b/published/202103/20200410 Get started with Bash programming.md new file mode 100644 index 0000000000..84b9aeca70 --- /dev/null +++ b/published/202103/20200410 Get started with Bash programming.md @@ -0,0 +1,148 @@ +[#]: collector: (lujun9972) +[#]: translator: (stevenzdg988) +[#]: reviewer: (wxy) +[#]: publisher: (wxy) +[#]: url: (https://linux.cn/article-13210-1.html) +[#]: subject: (Get started with Bash programming) +[#]: via: (https://opensource.com/article/20/4/bash-programming-guide) +[#]: author: (Seth Kenlon https://opensource.com/users/seth) + +如何入门 Bash 编程 +====== + +> 了解如何在 Bash 中编写定制程序以自动执行重复性操作任务。 + +![](https://img.linux.net.cn/data/attachment/album/202103/17/110745ctcuzcnt0dv0toi7.jpg) + +Unix 最初的希望之一是,让计算机的日常用户能够微调其计算机,以适应其独特的工作风格。几十年来,人们对计算机定制的期望已经降低,许多用户认为他们的应用程序和网站的集合就是他们的 “定制环境”。原因之一是许多操作系统的组件未不开源,普通用户无法使用其源代码。 + +但是对于 Linux 用户而言,定制程序是可以实现的,因为整个系统都围绕着可通过终端使用的命令啦进行的。终端不仅是用于快速命令或深入排除故障的界面;也是一个脚本环境,可以通过为你处理日常任务来减少你的工作量。 + +### 如何学习编程 + +如果你以前从未进行过任何编程,可能面临考虑两个不同的挑战:一个是了解怎样编写代码,另一个是了解要编写什么代码。你可以学习 _语法_,但是如果你不知道 _语言_ 中有哪些可用的关键字,你将无法继续。在实践中,要同时开始学习这两个概念,是因为如果没有关键字的堆砌就无法学习语法,因此,最初你要使用基本命令和基本编程结构来编写简单的任务。一旦熟悉了基础知识,就可以探索更多编程语言的内容,从而使你的程序能够做越来越重要的事情。 + +在 [Bash][2] 中,你使用的大多数 _关键字_ 是 Linux 命令。 _语法_ 就是 Bash。如果你已经频繁地使用过了 Bash,则向 Bash 编程的过渡相对容易。但是,如果你不曾使用过 Bash,你会很高兴地了解到它是一种为清晰和简单而构建的简单语言。 + +### 交互设计 + +有时,学习编程时最难搞清楚的事情就是计算机可以为你做些什么。显然,如果一台计算机可以自己完成你要做的所有操作,那么你就不必再碰计算机了。但是现实是,人类很重要。找到你的计算机可以帮助你的事情的关键是注意到你一周内需要重复执行的任务。计算机特别擅长于重复的任务。 + +但是,为了能告知计算机为你做某事,你必须知道怎么做。这就是 Bash 擅长的领域:交互式编程。在终端中执行一个动作时,你也在学习如何编写脚本。 + +例如,我曾经负责将大量 PDF 书籍转换为低墨和友好打印的版本。一种方法是在 PDF 编辑器中打开 PDF,从数百张图像(页面背景和纹理都算作图像)中选择每张图像,删除它们,然后将其保存到新的 PDF中。仅仅是一本书,这样就需要半天时间。 + +我的第一个想法是学习如何编写 PDF 编辑器脚本,但是经过数天的研究,我找不到可以编写编辑 PDF 应用程序的脚本(除了非常丑陋的鼠标自动化技巧)。因此,我将注意力转向了从终端内找出完成任务的方法。这让我有了几个新发现,包括 GhostScript,它是 PostScript 的开源版本(PDF 基于的打印机语言)。通过使用 GhostScript 处理了几天的任务,我确认这是解决我的问题的方法。 + +编写基本的脚本来运行命令,只不过是复制我用来从 PDF 中删除图像的命令和选项,并将其粘贴到文本文件中而已。将这个文件作为脚本运行,大概也会产生同样的结果。 + +### 向 Bash 脚本传参数 + +在终端中运行命令与在 Shell 脚本中运行命令之间的区别在于前者是交互式的。在终端中,你可以随时进行调整。例如,如果我刚刚处理 `example_1.pdf` 并准备处理下一个文档,以适应我的命令,则只需要更改文件名即可。 + +Shell 脚本不是交互式的。实际上,Shell _脚本_ 存在的唯一原因是让你不必亲自参与。这就是为什么命令(以及运行它们的 Shell 脚本)会接受参数的原因。 + +在 Shell 脚本中,有一些预定义的可以反映脚本启动方式的变量。初始变量是 `$0`,它代表了启动脚本的命令。下一个变量是 `$1` ,它表示传递给 Shell 脚本的第一个 “参数”。例如,在命令 `echo hello` 中,命令 `echo` 为 `$0,`,关键字 `hello` 为 `$1`,而 `world` 是 `$2`。 + +在 Shell 中交互如下所示: + +``` +$ echo hello world +hello world +``` + +在非交互式 Shell 脚本中,你 _可以_ 以非常直观的方式执行相同的操作。将此文本输入文本文件并将其另存为 `hello.sh`: + +``` +echo hello world +``` + +执行这个脚本: + +``` +$ bash hello.sh +hello world +``` + +同样可以,但是并没有利用脚本可以接受输入这一优势。将 `hello.sh` 更改为: + +``` +echo $1 +``` + +用引号将两个参数组合在一起来运行脚本: + +``` +$ bash hello.sh "hello bash" +hello bash +``` + +对于我的 PDF 瘦身项目,我真的需要这种非交互性,因为每个 PDF 都花了几分钟来压缩。但是通过创建一个接受我的输入的脚本,我可以一次将几个 PDF 文件全部提交给脚本。该脚本按顺序处理了每个文件,这可能需要半小时或稍长一点时间,但是我可以用半小时来完成其他任务。 + +### 流程控制 + +创建 Bash 脚本是完全可以接受的,从本质上讲,这些脚本是你开始实现需要重复执行任务的准确过程的副本。但是,可以通过控制信息流的方式来使脚本更强大。管理脚本对数据响应的常用方法是: + + * `if`/`then` 选择结构语句 + * `for` 循环结构语句 + * `while` 循环结构语句 + * `case` 语句 + +计算机不是智能的,但是它们擅长比较和分析数据。如果你在脚本中构建一些数据分析,则脚本会变得更加智能。例如,基本的 `hello.sh` 脚本运行后不管有没有内容都会显示: + +``` +$ bash hello.sh foo +foo +$ bash hello.sh + +$ +``` + +如果在没有接收输入的情况下提供帮助消息,将会更加容易使用。如下是一个 `if`/`then` 语句,如果你以一种基本的方式使用 Bash,则你可能不知道 Bash 中存在这样的语句。但是编程的一部分是学习语言,通过一些研究,你将了解 `if/then` 语句: + +``` +if [ "$1" = "" ]; then +        echo "syntax: $0 WORD" +        echo "If you provide more than one word, enclose them in quotes." +else +        echo "$1" +fi +``` + +运行新版本的 `hello.sh` 输出如下: + +``` +$ bash hello.sh +syntax: hello.sh WORD +If you provide more than one word, enclose them in quotes. +$ bash hello.sh "hello world" +hello world +``` + +### 利用脚本工作 + +无论你是从 PDF 文件中查找要删除的图像,还是要管理混乱的下载文件夹,抑或要创建和提供 Kubernetes 镜像,学习编写 Bash 脚本都需要先使用 Bash,然后学习如何将这些脚本从仅仅是一个命令列表变成响应输入的东西。通常这是一个发现的过程:你一定会找到新的 Linux 命令来执行你从未想象过可以通过文本命令执行的任务,你会发现 Bash 的新功能,使你的脚本可以适应所有你希望它们运行的不同方式。 + +学习这些技巧的一种方法是阅读其他人的脚本。了解人们如何在其系统上自动化死板的命令。看看你熟悉的,并寻找那些陌生事物的更多信息。 + +另一种方法是下载我们的 [Bash 编程入门][3] 电子书。它向你介绍了特定于 Bash 的编程概念,并且通过学习的构造,你可以开始构建自己的命令。当然,它是免费的,并根据 [创作共用许可证][4] 进行下载和分发授权,所以今天就来获取它吧。 + +- [下载我们介绍用 Bash 编程的电子书!][3] + +-------------------------------------------------------------------------------- + +via: https://opensource.com/article/20/4/bash-programming-guide + +作者:[Seth Kenlon][a] +选题:[lujun9972][b] +译者:[stevenzdg988](https://github.com/stevenzdg988) +校对:[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/command_line_prompt.png?itok=wbGiJ_yg (Command line prompt) +[2]: https://opensource.com/resources/what-bash +[3]: https://opensource.com/downloads/bash-programming-guide +[4]: https://opensource.com/article/20/1/what-creative-commons diff --git a/published/202103/20200415 How to automate your cryptocurrency trades with Python.md b/published/202103/20200415 How to automate your cryptocurrency trades with Python.md new file mode 100644 index 0000000000..f310476575 --- /dev/null +++ b/published/202103/20200415 How to automate your cryptocurrency trades with Python.md @@ -0,0 +1,414 @@ +[#]: collector: (lujun9972) +[#]: translator: (wyxplus) +[#]: reviewer: (wxy) +[#]: publisher: (wxy) +[#]: url: (https://linux.cn/article-13242-1.html) +[#]: subject: (How to automate your cryptocurrency trades with Python) +[#]: via: (https://opensource.com/article/20/4/python-crypto-trading-bot) +[#]: author: (Stephan Avenwedde https://opensource.com/users/hansic99) + + +如何使用 Python 来自动交易加密货币 +====== + +> 在本教程中,教你如何设置和使用 Pythonic 来编程。它是一个图形化编程工具,用户可以很容易地使用现成的函数模块创建 Python 程序。 + +![](https://img.linux.net.cn/data/attachment/album/202103/28/093858qu0bh3w2sd3rh20s.jpg) + +然而,不像纽约证券交易所这样的传统证券交易所一样,有一段固定的交易时间。对于加密货币而言,则是 7×24 小时交易,这使得任何人都无法独自盯着市场。 + +在以前,我经常思考与加密货币交易相关的问题: + +- 一夜之间发生了什么? +- 为什么没有日志记录? +- 为什么下单? +- 为什么不下单? + +通常的解决手段是使用加密交易机器人,当在你做其他事情时,例如睡觉、与家人在一起或享受空闲时光,代替你下单。虽然有很多商业解决方案可用,但是我选择开源的解决方案,因此我编写了加密交易机器人 [Pythonic][2]。 正如去年 [我写过的文章][3] 一样,“Pythonic 是一种图形化编程工具,它让用户可以轻松使用现成的函数模块来创建 Python 应用程序。” 最初它是作为加密货币机器人使用,并具有可扩展的日志记录引擎以及经过精心测试的可重用部件,例如调度器和计时器。 + +### 开始 + +本教程将教你如何开始使用 Pythonic 进行自动交易。我选择 [币安][6]Binance 交易所的 [波场][4]Tron[比特币][3]Bitcoin 交易对为例。我之所以选择这个加密货币对,是因为它们彼此之间的波动性大,而不是出于个人喜好。 + +机器人将根据 [指数移动平均][7]exponential moving averages (EMA)来做出决策。 + +![TRX/BTC 1-hour candle chart][8] + +*TRX/BTC 1 小时 K 线图* + +EMA 指标通常是一个加权的移动平均线,可以对近期价格数据赋予更多权重。尽管移动平均线可能只是一个简单的指标,但我对它很有经验。 + +上图中的紫色线显示了 EMA-25 指标(这表示要考虑最近的 25 个值)。 + +机器人监视当前的 EMA-25 值(t0)和前一个 EMA-25 值(t-1)之间的差距。如果差值超过某个值,则表示价格上涨,机器人将下达购买订单。如果差值低于某个值,则机器人将下达卖单。 + +差值将是做出交易决策的主要指标。在本教程中,它称为交易参数。 + +### 工具链 + +将在本教程使用如下工具: + +- 币安专业交易视图(已经有其他人做了数据可视化,所以不需要重复造轮子) +- Jupyter 笔记本:用于数据科学任务 +- Pythonic:作为整体框架 +- PythonicDaemon :作为终端运行(仅适用于控制台和 Linux) + +### 数据挖掘 + +为了使加密货币交易机器人尽可能做出正确的决定,以可靠的方式获取资产的美国线open-high-low-close chart([OHLC][9])数据是至关重要。你可以使用 Pythonic 的内置元素,还可以根据自己逻辑来对其进行扩展。 + +一般的工作流程: + +1. 与币安时间同步 +2. 下载 OHLC 数据 +3. 从文件中把 OHLC 数据加载到内存 +4. 比较数据集并扩展更新数据集 + +这个工作流程可能有点夸张,但是它能使得程序更加健壮,甚至在停机和断开连接时,也能平稳运行。 + +一开始,你需要 **币安 OHLC 查询**Binance OHLC Query 元素和一个 **基础操作**Basic Operation 元素来执行你的代码。 + +![Data-mining workflow][10] + +*数据挖掘工作流程* + +OHLC 查询设置为每隔一小时查询一次 **TRXBTC** 资产对(波场/比特币)。 + +![Configuration of the OHLC query element][11] + +*配置 OHLC 查询元素* + +其中输出的元素是 [Pandas DataFrame][12]。你可以在 **基础操作** 元素中使用 **输入**input 变量来访问 DataFrame。其中,将 Vim 设置为 **基础操作** 元素的默认代码编辑器。 + +![Basic Operation element set up to use Vim][13] + +*使用 Vim 编辑基础操作元素* + +具体代码如下: + +``` +import pickle, pathlib, os +import pandas as pd + +outout = None + +if isinstance(input, pd.DataFrame): + file_name = 'TRXBTC_1h.bin' + home_path = str(pathlib.Path.home()) + data_path = os.path.join(home_path, file_name) + + try: + df = pickle.load(open(data_path, 'rb')) + n_row_cnt = df.shape[0] + df = pd.concat([df,input], ignore_index=True).drop_duplicates(['close_time']) + df.reset_index(drop=True, inplace=True) + n_new_rows = df.shape[0] - n_row_cnt + log_txt = '{}: {} new rows written'.format(file_name, n_new_rows) + except: + log_txt = 'File error - writing new one: {}'.format(e) + df = input + + pickle.dump(df, open(data_path, "wb" )) + output = df +``` + +首先,检查输入是否为 DataFrame 元素。然后在用户的家目录(`~/`)中查找名为 `TRXBTC_1h.bin` 的文件。如果存在,则将其打开,执行新代码段(`try` 部分中的代码),并删除重复项。如果文件不存在,则触发异常并执行 `except` 部分中的代码,创建一个新文件。 + +只要启用了复选框 **日志输出**log output,你就可以使用命令行工具 `tail` 查看日志记录: + + +``` +$ tail -f ~/Pythonic_2020/Feb/log_2020_02_19.txt +``` + +出于开发目的,现在跳过与币安时间的同步和计划执行,这将在下面实现。 + +### 准备数据 + +下一步是在单独的 网格Grid 中处理评估逻辑。因此,你必须借助**返回元素**Return element 将 DataFrame 从网格 1 传递到网格 2 的第一个元素。 + +在网格 2 中,通过使 DataFrame 通过 **基础技术分析**Basic Technical Analysis 元素,将 DataFrame 扩展包含 EMA 值的一列。 + +![Technical analysis workflow in Grid 2][14] + +*在网格 2 中技术分析工作流程* + +配置技术分析元素以计算 25 个值的 EMA。 + +![Configuration of the technical analysis element][15] + +*配置技术分析元素* + +当你运行整个程序并开启 **技术分析**Technical Analysis 元素的调试输出时,你将发现 EMA-25 列的值似乎都相同。 + +![Missing decimal places in output][16] + +*输出中精度不够* + +这是因为调试输出中的 EMA-25 值仅包含六位小数,即使输出保留了 8 个字节完整精度的浮点值。 + +为了能进行进一步处理,请添加 **基础操作** 元素: + +![Workflow in Grid 2][17] + +*网格 2 中的工作流程* + +使用 **基础操作** 元素,将 DataFrame 与添加的 EMA-25 列一起转储,以便可以将其加载到 Jupyter 笔记本中; + +![Dump extended DataFrame to file][18] + +*将扩展后的 DataFrame 存储到文件中* + +### 评估策略 + +在 Juypter 笔记本中开发评估策略,让你可以更直接地访问代码。要加载 DataFrame,你需要使用如下代码: + +![Representation with all decimal places][19] + +*用全部小数位表示* + +你可以使用 [iloc][20] 和列名来访问最新的 EMA-25 值,并且会保留所有小数位。 + +你已经知道如何来获得最新的数据。上面示例的最后一行仅显示该值。为了能将该值拷贝到不同的变量中,你必须使用如下图所示的 `.at` 方法方能成功。 + +你也可以直接计算出你下一步所需的交易参数。 + +![Buy/sell decision][21] + +*买卖决策* + +### 确定交易参数 + +如上面代码所示,我选择 0.009 作为交易参数。但是我怎么知道 0.009 是决定交易的一个好参数呢? 实际上,这个参数确实很糟糕,因此,你可以直接计算出表现最佳的交易参数。 + +假设你将根据收盘价进行买卖。 + +![Validation function][22] + +*回测功能* + +在此示例中,`buy_factor` 和 `sell_factor` 是预先定义好的。因此,发散思维用直接计算出表现最佳的参数。 + +![Nested for loops for determining the buy and sell factor][23] + +*嵌套的 for 循环,用于确定购买和出售的参数* + +这要跑 81 个循环(9x9),在我的机器(Core i7 267QM)上花费了几分钟。 + +![System utilization while brute forcing][24] + +*在暴力运算时系统的利用率* + +在每个循环之后,它将 `buy_factor`、`sell_factor` 元组和生成的 `profit` 元组追加到 `trading_factors` 列表中。按利润降序对列表进行排序。 + +![Sort profit with related trading factors in descending order][25] + +*将利润与相关的交易参数按降序排序* + +当你打印出列表时,你会看到 0.002 是最好的参数。 + +![Sorted list of trading factors and profit][26] + +*交易要素和收益的有序列表* + +当我在 2020 年 3 月写下这篇文章时,价格的波动还不足以呈现出更理想的结果。我在 2 月份得到了更好的结果,但即使在那个时候,表现最好的交易参数也在 0.002 左右。 + +### 分割执行路径 + +现在开始新建一个网格以保持逻辑清晰。使用 **返回** 元素将带有 EMA-25 列的 DataFrame 从网格 2 传递到网格 3 的 0A 元素。 + +在网格 3 中,添加 **基础操作** 元素以执行评估逻辑。这是该元素中的代码: + +![Implemented evaluation logic][27] + +*实现评估策略* + +如果输出 `1` 表示你应该购买,如果输出 `2` 则表示你应该卖出。 输出 `0` 表示现在无需操作。使用 **分支**Branch 元素来控制执行路径。 + +![Branch element: Grid 3 Position 2A][28] + +*分支元素:网格 3,2A 位置* + +因为 `0` 和 `-1` 的处理流程一样,所以你需要在最右边添加一个分支元素来判断你是否应该卖出。 + +![Branch element: Grid 3 Position 3B][29] + +*分支元素:网格 3,3B 位置* + +网格 3 应该现在如下图所示: + +![Workflow on Grid 3][30] + +*网格 3 的工作流程* + +### 下单 + +由于无需在一个周期中购买两次,因此必须在周期之间保留一个持久变量,以指示你是否已经购买。 + +你可以利用 **栈**Stack 元素来实现。顾名思义,栈元素表示可以用任何 Python 数据类型来放入的基于文件的栈。 + +你需要定义栈仅包含一个布尔类型,该布尔类型决定是否购买了(`True`)或(`False`)。因此,你必须使用 `False` 来初始化栈。例如,你可以在网格 4 中简单地通过将 `False` 传递给栈来进行设置。 + +![Forward a False-variable to the subsequent Stack element][31] + +*将 False 变量传输到后续的栈元素中* + +在分支树后的栈实例可以进行如下配置: + +![Configuration of the Stack element][32] + +*设置栈元素* + +在栈元素设置中,将 对输入的操作Do this with input 设置成 Nothing。否则,布尔值将被 `1` 或 `0` 覆盖。 + +该设置确保仅将一个值保存于栈中(`True` 或 `False`),并且只能读取一个值(为了清楚起见)。 + +在栈元素之后,你需要另外一个 **分支** 元素来判断栈的值,然后再放置 币安订单Binance Order 元素。 + +![Evaluate the variable from the stack][33] + +*判断栈中的变量* + +将币安订单元素添加到分支元素的 `True` 路径。网格 3 上的工作流现在应如下所示: + +![Workflow on Grid 3][34] + +*网格 3 的工作流程* + +币安订单元素应如下配置: + +![Configuration of the Binance Order element][35] + +*编辑币安订单元素* + +你可以在币安网站上的帐户设置中生成 API 和密钥。 + +![Creating an API key in Binance][36] + +*在币安账户设置中创建一个 API 密钥* + +在本文中,每笔交易都是作为市价交易执行的,交易量为 10,000 TRX(2020 年 3 月约为 150 美元)(出于教学的目的,我通过使用市价下单来演示整个过程。因此,我建议至少使用限价下单。) + +如果未正确执行下单(例如,网络问题、资金不足或货币对不正确),则不会触发后续元素。因此,你可以假定如果触发了后续元素,则表示该订单已下达。 + +这是一个成功的 XMRBTC 卖单的输出示例: + +![Output of a successfully placed sell order][37] + +*成功卖单的输出* + +该行为使后续步骤更加简单:你可以始终假设只要成功输出,就表示订单成功。因此,你可以添加一个 **基础操作** 元素,该元素将简单地输出 **True** 并将此值放入栈中以表示是否下单。 + +如果出现错误的话,你可以在日志信息中查看具体细节(如果启用日志功能)。 + +![Logging output of Binance Order element][38] + +*币安订单元素中的输出日志信息* + +### 调度和同步 + +对于日程调度和同步,请在网格 1 中将整个工作流程置于 币安调度器Binance Scheduler 元素的前面。 + +![Binance Scheduler at Grid 1, Position 1A][39] + +*在网格 1,1A 位置的币安调度器* + +由于币安调度器元素只执行一次,因此请在网格 1 的末尾拆分执行路径,并通过将输出传递回币安调度器来强制让其重新同步。 + +![Grid 1: Split execution path][40] + +*网格 1:拆分执行路径* + +5A 元素指向 网格 2 的 1A 元素,并且 5B 元素指向网格 1 的 1A 元素(币安调度器)。 + +### 部署 + +你可以在本地计算机上全天候 7×24 小时运行整个程序,也可以将其完全托管在廉价的云系统上。例如,你可以使用 Linux/FreeBSD 云系统,每月约 5 美元,但通常不提供图形化界面。如果你想利用这些低成本的云,可以使用 PythonicDaemon,它能在终端中完全运行。 + +![PythonicDaemon console interface][41] + +*PythonicDaemon 控制台* + +PythonicDaemon 是基础程序的一部分。要使用它,请保存完整的工作流程,将其传输到远程运行的系统中(例如,通过安全拷贝协议Secure Copy SCP),然后把工作流程文件作为参数来启动 PythonicDaemon: + +``` +$ PythonicDaemon trading_bot_one +``` + +为了能在系统启动时自启 PythonicDaemon,可以将一个条目添加到 crontab 中: + +``` +# crontab -e +``` + +![Crontab on Ubuntu Server][42] + +*在 Ubuntu 服务器上的 Crontab* + +### 下一步 + +正如我在一开始时所说的,本教程只是自动交易的入门。对交易机器人进行编程大约需要 10% 的编程和 90% 的测试。当涉及到让你的机器人用金钱交易时,你肯定会对编写的代码再三思考。因此,我建议你编码时要尽可能简单和易于理解。 + +如果你想自己继续开发交易机器人,接下来所需要做的事: + +- 收益自动计算(希望你有正收益!) +- 计算你想买的价格 +- 比较你的预订单(例如,订单是否填写完整?) + +你可以从 [GitHub][2] 上获取完整代码。 + +-------------------------------------------------------------------------------- + +via: https://opensource.com/article/20/4/python-crypto-trading-bot + +作者:[Stephan Avenwedde][a] +选题:[lujun9972][b] +译者:[wyxplus](https://github.com/wyxplus) +校对:[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/calculator_money_currency_financial_tool.jpg?itok=2QMa1y8c "scientific calculator" +[2]: https://github.com/hANSIc99/Pythonic +[3]: https://opensource.com/article/19/5/graphically-programming-pythonic +[4]: https://tron.network/ +[5]: https://bitcoin.org/en/ +[6]: https://www.binance.com/ +[7]: https://www.investopedia.com/terms/e/ema.asp +[8]: https://opensource.com/sites/default/files/uploads/1_ema-25.png "TRX/BTC 1-hour candle chart" +[9]: https://en.wikipedia.org/wiki/Open-high-low-close_chart +[10]: https://opensource.com/sites/default/files/uploads/2_data-mining-workflow.png "Data-mining workflow" +[11]: https://opensource.com/sites/default/files/uploads/3_ohlc-query.png "Configuration of the OHLC query element" +[12]: https://pandas.pydata.org/pandas-docs/stable/getting_started/dsintro.html#dataframe +[13]: https://opensource.com/sites/default/files/uploads/4_edit-basic-operation.png "Basic Operation element set up to use Vim" +[14]: https://opensource.com/sites/default/files/uploads/6_grid2-workflow.png "Technical analysis workflow in Grid 2" +[15]: https://opensource.com/sites/default/files/uploads/7_technical-analysis-config.png "Configuration of the technical analysis element" +[16]: https://opensource.com/sites/default/files/uploads/8_missing-decimals.png "Missing decimal places in output" +[17]: https://opensource.com/sites/default/files/uploads/9_basic-operation-element.png "Workflow in Grid 2" +[18]: https://opensource.com/sites/default/files/uploads/10_dump-extended-dataframe.png "Dump extended DataFrame to file" +[19]: https://opensource.com/sites/default/files/uploads/11_load-dataframe-decimals.png "Representation with all decimal places" +[20]: https://pandas.pydata.org/pandas-docs/stable/reference/api/pandas.DataFrame.iloc.html +[21]: https://opensource.com/sites/default/files/uploads/12_trade-factor-decision.png "Buy/sell decision" +[22]: https://opensource.com/sites/default/files/uploads/13_validation-function.png "Validation function" +[23]: https://opensource.com/sites/default/files/uploads/14_brute-force-tf.png "Nested for loops for determining the buy and sell factor" +[24]: https://opensource.com/sites/default/files/uploads/15_system-utilization.png "System utilization while brute forcing" +[25]: https://opensource.com/sites/default/files/uploads/16_sort-profit.png "Sort profit with related trading factors in descending order" +[26]: https://opensource.com/sites/default/files/uploads/17_sorted-trading-factors.png "Sorted list of trading factors and profit" +[27]: https://opensource.com/sites/default/files/uploads/18_implemented-evaluation-logic.png "Implemented evaluation logic" +[28]: https://opensource.com/sites/default/files/uploads/19_output.png "Branch element: Grid 3 Position 2A" +[29]: https://opensource.com/sites/default/files/uploads/20_editbranch.png "Branch element: Grid 3 Position 3B" +[30]: https://opensource.com/sites/default/files/uploads/21_grid3-workflow.png "Workflow on Grid 3" +[31]: https://opensource.com/sites/default/files/uploads/22_pass-false-to-stack.png "Forward a False-variable to the subsequent Stack element" +[32]: https://opensource.com/sites/default/files/uploads/23_stack-config.png "Configuration of the Stack element" +[33]: https://opensource.com/sites/default/files/uploads/24_evaluate-stack-value.png "Evaluate the variable from the stack" +[34]: https://opensource.com/sites/default/files/uploads/25_grid3-workflow.png "Workflow on Grid 3" +[35]: https://opensource.com/sites/default/files/uploads/26_binance-order.png "Configuration of the Binance Order element" +[36]: https://opensource.com/sites/default/files/uploads/27_api-key-binance.png "Creating an API key in Binance" +[37]: https://opensource.com/sites/default/files/uploads/28_sell-order.png "Output of a successfully placed sell order" +[38]: https://opensource.com/sites/default/files/uploads/29_binance-order-output.png "Logging output of Binance Order element" +[39]: https://opensource.com/sites/default/files/uploads/30_binance-scheduler.png "Binance Scheduler at Grid 1, Position 1A" +[40]: https://opensource.com/sites/default/files/uploads/31_split-execution-path.png "Grid 1: Split execution path" +[41]: https://opensource.com/sites/default/files/uploads/32_pythonic-daemon.png "PythonicDaemon console interface" +[42]: https://opensource.com/sites/default/files/uploads/33_crontab.png "Crontab on Ubuntu Server" diff --git a/published/202103/20200702 6 best practices for managing Git repos.md b/published/202103/20200702 6 best practices for managing Git repos.md new file mode 100644 index 0000000000..81fb81347e --- /dev/null +++ b/published/202103/20200702 6 best practices for managing Git repos.md @@ -0,0 +1,136 @@ +[#]: collector: (lujun9972) +[#]: translator: (stevenzdg988) +[#]: reviewer: (wxy) +[#]: publisher: (wxy) +[#]: url: (https://linux.cn/article-13200-1.html) +[#]: subject: (6 best practices for managing Git repos) +[#]: via: (https://opensource.com/article/20/7/git-repos-best-practices) +[#]: author: (Seth Kenlon https://opensource.com/users/seth) + +6 个最佳的 Git 仓库管理实践 +====== + +> 抵制在 Git 中添加一些会增加管理难度的东西的冲动;这里有替代方法。 + +![](https://img.linux.net.cn/data/attachment/album/202103/13/225927c3mvm5x275vano5m.jpg) + +有权访问源代码使对安全性的分析以及应用程序的安全成为可能。但是,如果没有人真正看过代码,问题就不会被发现,即使人们主动地看代码,通常也要看很多东西。幸运的是,GitHub 拥有一个活跃的安全团队,最近,他们 [发现了已提交到多个 Git 仓库中的特洛伊木马病毒][2],甚至仓库的所有者也偷偷溜走了。尽管我们无法控制其他人如何管理自己的仓库,但我们可以从他们的错误中吸取教训。为此,本文回顾了将文件添加到自己的仓库中的一些最佳实践。 + +### 了解你的仓库 + +![Git 仓库终端][3] + +这对于安全的 Git 仓库来可以说是头号规则。作为项目维护者,无论是你自己创建的还是采用别人的,你的工作是了解自己仓库中的内容。你可能无法记住代码库中每一个文件,但是你需要了解你所管理的内容的基本组成部分。如果在几十个合并后出现一个游离的文件,你会很容易地发现它,因为你不知道它的用途,你需要检查它来刷新你的记忆。发生这种情况时,请查看该文件,并确保准确了解为什么它是必要的。 + +### 禁止二进制大文件 + +![终端中 Git 的二进制检查命令][4] + +Git 是为文本而生的,无论是用纯文本编写的 C 或 Python 还是 Java 文本,亦或是 JSON、YAML、XML、Markdown、HTML 或类似的文本。Git 对于二进制文件不是很理想。 + +两者之间的区别是: + +``` +$ cat hello.txt +This is plain text. +It's readable by humans and machines alike. +Git knows how to version this. + +$ git diff hello.txt +diff --git a/hello.txt b/hello.txt +index f227cc3..0d85b44 100644 +--- a/hello.txt ++++ b/hello.txt +@@ -1,2 +1,3 @@ + This is plain text. ++It's readable by humans and machines alike. + Git knows how to version this. +``` + +和 + +``` +$ git diff pixel.png +diff --git a/pixel.png b/pixel.png +index 563235a..7aab7bc 100644 +Binary files a/pixel.png and b/pixel.png differ + +$ cat pixel.png +�PNG +▒ +IHDR7n�$gAMA�� + �abKGD݊�tIME� + + -2R�� +IDA�c`�!�3%tEXtdate:create2020-06-11T11:45:04+12:00��r.%tEXtdate:modify2020-06-11T11:45:04+12:00��ʒIEND�B`� +``` + +二进制文件中的数据不能像纯文本一样被解析,因此,如果二进制文件发生任何更改,则必须重写整个内容。一个版本与另一个版本之间唯一的区别就是全部不同,这会快速增加仓库大小。 + +更糟糕的是,Git 仓库维护者无法合理地审计二进制数据。这违反了头号规则:应该对仓库的内容了如指掌。 + +除了常用的 [POSIX][5] 工具之外,你还可以使用 `git diff` 检测二进制文件。当你尝试使用 `--numstat` 选项来比较二进制文件时,Git 返回空结果: + +``` +$ git diff --numstat /dev/null pixel.png | tee +- - /dev/null => pixel.png +$ git diff --numstat /dev/null file.txt | tee +5788 0 /dev/null => list.txt +``` + +如果你正在考虑将二进制大文件(BLOB)提交到仓库,请停下来先思考一下。如果它是二进制文件,那它是由什么生成的。是否有充分的理由不在构建时生成它们,而是将它们提交到仓库?如果你认为提交二进制数据是有意义的,请确保在 `README` 文件或类似文件中指明二进制文件的位置、为什么是二进制文件的原因以及更新它们的协议是什么。必须谨慎对其更新,因为你每提交一个二进制大文件的变化,它的存储空间实际上都会加倍。 + +### 让第三方库留在第三方 + +第三方库也不例外。尽管它是开源的众多优点之一,你可以不受限制地重用和重新分发不是你编写的代码,但是有很多充分的理由不把第三方库存储在你自己的仓库中。首先,除非你自己检查了所有代码(以及将来的合并),否则你不能为第三方完全担保。其次,当你将第三方库复制到你的 Git 仓库中时,会将焦点从真正的上游源代码中分离出来。从技术上讲,对库有信心的人只对该库的主副本有把握,而不是对随机仓库的副本有把握。如果你需要锁定特定版本的库,请给开发者提供一个合理的项目所需的发布 URL,或者使用 [Git 子模块][6]。 + +### 抵制盲目的 git add + +![Git 手动添加命令终端中][7] + +如果你的项目已编译,请抵制住使用 `git add .` 的冲动(其中 `.` 是当前目录或特定文件夹的路径),因为这是一种添加任何新东西的简单方法。如果你不是手动编译项目,而是使用 IDE 为你管理项目,这一点尤其重要。用 IDE 管理项目时,跟踪添加到仓库中的内容会非常困难,因此仅添加你实际编写的内容非常重要,而不是添加项目文件夹中出现的任何新对象。 + +如果你使用了 `git add .`,请在推送之前检查暂存区里的内容。如果在运行 `make clean` 或等效命令后,执行 `git status` 时在项目文件夹中看到一个陌生的对象,请找出它的来源,以及为什么仍然在项目的目录中。这是一种罕见的构建工件,不会在编译期间重新生成,因此在提交前请三思。 + +### 使用 Git ignore + +![终端中的 `Git ignore` 命令][8] + +许多为程序员打造的便利也非常杂乱。任何项目的典型项目目录,无论是编程的,还是艺术的或其他的,到处都是隐藏的文件、元数据和遗留的工件。你可以尝试忽略这些对象,但是 `git status` 中的提示越多,你错过某件事的可能性就越大。 + +你可以通过维护一个良好的 `gitignore` 文件来为你过滤掉这种噪音。因为这是使用 Git 的用户的共同要求,所以有一些入门级的 `gitignore` 文件。[Github.com/github/gitignore][9] 提供了几个专门创建的 `gitignore` 文件,你可以下载这些文件并将其放置到自己的项目中,[Gitlab.com][10] 在几年前就将`gitignore` 模板集成到了仓库创建工作流程中。使用这些模板来帮助你为项目创建适合的 `gitignore` 策略并遵守它。 + +### 查看合并请求 + +![Git 合并请求][11] + +当你通过电子邮件收到一个合并/拉取请求或补丁文件时,不要只是为了确保它能正常工作而进行测试。你的工作是阅读进入代码库的新代码,并了解其是如何产生结果的。如果你不同意这个实现,或者更糟的是,你不理解这个实现,请向提交该实现的人发送消息,并要求其进行说明。质疑那些希望成为版本库永久成员的代码并不是一种社交失误,但如果你不知道你把什么合并到用户使用的代码中,那就是违反了你和用户之间的社交契约。 + +### Git 责任 + +社区致力于开源软件良好的安全性。不要鼓励你的仓库中不良的 Git 实践,也不要忽视你克隆的仓库中的安全威胁。Git 功能强大,但它仍然只是一个计算机程序,因此要以人为本,确保每个人的安全。 + +-------------------------------------------------------------------------------- + +via: https://opensource.com/article/20/7/git-repos-best-practices + +作者:[Seth Kenlon][a] +选题:[lujun9972][b] +译者:[stevenzdg988](https://github.com/stevenzdg988) +校对:[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/wfh_work_home_laptop_work.png?itok=VFwToeMy (Working from home at a laptop) +[2]: https://securitylab.github.com/research/octopus-scanner-malware-open-source-supply-chain/ +[3]: https://opensource.com/sites/default/files/uploads/git_repo.png (Git repository ) +[4]: https://opensource.com/sites/default/files/uploads/git-binary-check.jpg (Git binary check) +[5]: https://opensource.com/article/19/7/what-posix-richard-stallman-explains +[6]: https://git-scm.com/book/en/v2/Git-Tools-Submodules +[7]: https://opensource.com/sites/default/files/uploads/git-cola-manual-add.jpg (Git manual add) +[8]: https://opensource.com/sites/default/files/uploads/git-ignore.jpg (Git ignore) +[9]: https://github.com/github/gitignore +[10]: https://about.gitlab.com/releases/2016/05/22/gitlab-8-8-released +[11]: https://opensource.com/sites/default/files/uploads/git_merge_request.png (Git merge request) diff --git a/published/202103/20200915 Improve your time management with Jupyter.md b/published/202103/20200915 Improve your time management with Jupyter.md new file mode 100644 index 0000000000..3a1cd3d81d --- /dev/null +++ b/published/202103/20200915 Improve your time management with Jupyter.md @@ -0,0 +1,315 @@ +[#]: collector: (lujun9972) +[#]: translator: (stevenzdg988) +[#]: reviewer: (wxy) +[#]: publisher: (wxy) +[#]: url: (https://linux.cn/article-13212-1.html) +[#]: subject: (Improve your time management with Jupyter) +[#]: via: (https://opensource.com/article/20/9/calendar-jupyter) +[#]: author: (Moshe Zadka https://opensource.com/users/moshez) + +使用 Jupyter 改善你的时间管理 +====== + +> 在 Jupyter 里使用 Python 来分析日历,以了解你是如何使用时间的。 + +![](https://img.linux.net.cn/data/attachment/album/202103/18/095530cxx6663ptypyzvmx.jpg) + +[Python][2] 在探索数据方面具有令人难以置信的可扩展性。利用 [Pandas][3] 或 [Dask][4],你可以将 [Jupyter][5] 扩展到大数据领域。但是小数据、个人资料、私人数据呢? + +JupyterLab 和 Jupyter Notebook 为我提供了一个绝佳的环境,可以让我审视我的笔记本电脑生活。 + +我的探索是基于以下事实:我使用的几乎每个服务都有一个 Web API。我使用了诸多此类服务:待办事项列表、时间跟踪器、习惯跟踪器等。还有一个几乎每个人都会使用到:_日历_。相同的思路也可以应用于其他服务,但是日历具有一个很酷的功能:几乎所有 Web 日历都支持的开放标准 —— CalDAV。 + +### 在 Jupyter 中使用 Python 解析日历 + +大多数日历提供了导出为 CalDAV 格式的方法。你可能需要某种身份验证才能访问这些私有数据。按照你的服务说明进行操作即可。如何获得凭据取决于你的服务,但是最终,你应该能够将这些凭据存储在文件中。我将我的凭据存储在根目录下的一个名为 `.caldav` 的文件中: + +``` +import os +with open(os.path.expanduser("~/.caldav")) as fpin: +    username, password = fpin.read().split() +``` + +切勿将用户名和密码直接放在 Jupyter Notebook 的笔记本中!它们可能会很容易因 `git push` 的错误而导致泄漏。 + +下一步是使用方便的 PyPI [caldav][6] 库。我找到了我的电子邮件服务的 CalDAV 服务器(你可能有所不同): + +``` +import caldav +client = caldav.DAVClient(url="https://caldav.fastmail.com/dav/", username=username, password=password) +``` + +CalDAV 有一个称为 `principal`(主键)的概念。它是什么并不重要,只要知道它是你用来访问日历的东西就行了: + +``` +principal = client.principal() +calendars = principal.calendars() +``` + +从字面上讲,日历就是关于时间的。访问事件之前,你需要确定一个时间范围。默认一星期就好: + +``` +from dateutil import tz +import datetime +now = datetime.datetime.now(tz.tzutc()) +since = now - datetime.timedelta(days=7) +``` + +大多数人使用的日历不止一个,并且希望所有事件都在一起出现。`itertools.chain.from_iterable` 方法使这一过程变得简单: + +``` +import itertools + +raw_events = list( +    itertools.chain.from_iterable( +        calendar.date_search(start=since, end=now, expand=True) +        for calendar in calendars +    ) +) +``` + +将所有事件读入内存很重要,以 API 原始的本地格式进行操作是重要的实践。这意味着在调整解析、分析和显示代码时,无需返回到 API 服务刷新数据。 + +但 “原始” 真的是原始,事件是以特定格式的字符串出现的: + +``` +print(raw_events[12].data) +``` + +``` +    BEGIN:VCALENDAR +    VERSION:2.0 +    PRODID:-//CyrusIMAP.org/Cyrus +     3.3.0-232-g4bdb081-fm-20200825.002-g4bdb081a//EN +    BEGIN:VEVENT +    DTEND:20200825T230000Z +    DTSTAMP:20200825T181915Z +    DTSTART:20200825T220000Z +    SUMMARY:Busy +    UID: +     1302728i-040000008200E00074C5B7101A82E00800000000D939773EA578D601000000000 +     000000010000000CD71CC3393651B419E9458134FE840F5 +    END:VEVENT +    END:VCALENDAR +``` + +幸运的是,PyPI 可以再次使用另一个辅助库 [vobject][7] 解围: + +``` +import io +import vobject + +def parse_event(raw_event): + data = raw_event.data + parsed = vobject.readOne(io.StringIO(data)) + contents = parsed.vevent.contents + return contents +``` + +``` +parse_event(raw_events[12]) +``` + +``` + {'dtend': [], + 'dtstamp': [], + 'dtstart': [], + 'summary': [], + 'uid': []} +``` + +好吧,至少好一点了。 + +仍有一些工作要做,将其转换为合理的 Python 对象。第一步是 _拥有_ 一个合理的 Python 对象。[attrs][8] 库提供了一个不错的开始: + +``` +import attr +from __future__ import annotations +@attr.s(auto_attribs=True, frozen=True) +class Event: +    start: datetime.datetime +    end: datetime.datetime +    timezone: Any +    summary: str +``` + +是时候编写转换代码了! + +第一个抽象从解析后的字典中获取值,不需要所有的装饰: + +``` +def get_piece(contents, name): + return contents[name][0].value +get_piece(_, "dtstart") + datetime.datetime(2020, 8, 25, 22, 0, tzinfo=tzutc()) +``` + +日历事件总有一个“开始”、有一个“结束”、有一个 “持续时间”。一些谨慎的解析逻辑可以将两者协调为同一个 Python 对象: + +``` +def from_calendar_event_and_timezone(event, timezone): +    contents = parse_event(event) +    start = get_piece(contents, "dtstart") +    summary = get_piece(contents, "summary") +    try: +        end = get_piece(contents, "dtend") +    except KeyError: +        end = start + get_piece(contents, "duration") +    return Event(start=start, end=end, summary=summary, timezone=timezone) +``` + +将事件放在 _本地_ 时区而不是 UTC 中很有用,因此使用本地时区: + +``` +my_timezone = tz.gettz() +from_calendar_event_and_timezone(raw_events[12], my_timezone) + Event(start=datetime.datetime(2020, 8, 25, 22, 0, tzinfo=tzutc()), end=datetime.datetime(2020, 8, 25, 23, 0, tzinfo=tzutc()), timezone=tzfile('/etc/localtime'), summary='Busy') +``` + +既然事件是真实的 Python 对象,那么它们实际上应该具有附加信息。幸运的是,可以将方法添加到类中。 + +但是要弄清楚哪个事件发生在哪一天不是很直接。你需要在 _本地_ 时区中选择一天: + +``` +def day(self): + offset = self.timezone.utcoffset(self.start) + fixed = self.start + offset + return fixed.date() +Event.day = property(day) +``` + +``` +print(_.day) + 2020-08-25 +``` + +事件在内部始终是以“开始”/“结束”的方式表示的,但是持续时间是有用的属性。持续时间也可以添加到现有类中: + +``` +def duration(self): + return self.end - self.start +Event.duration = property(duration) +``` + +``` +print(_.duration) + 1:00:00 +``` + +现在到了将所有事件转换为有用的 Python 对象了: + +``` +all_events = [from_calendar_event_and_timezone(raw_event, my_timezone) +              for raw_event in raw_events] +``` + +全天事件是一种特例,可能对分析生活没有多大用处。现在,你可以忽略它们: + +``` +# ignore all-day events +all_events = [event for event in all_events if not type(event.start) == datetime.date] +``` + +事件具有自然顺序 —— 知道哪个事件最先发生可能有助于分析: + +``` +all_events.sort(key=lambda ev: ev.start) +``` + +现在,事件已排序,可以将它们加载到每天: + +``` +import collections +events_by_day = collections.defaultdict(list) +for event in all_events: +    events_by_day[event.day].append(event) +``` + +有了这些,你就有了作为 Python 对象的带有日期、持续时间和序列的日历事件。 + +### 用 Python 报到你的生活 + +现在是时候编写报告代码了!带有适当的标题、列表、重要内容以粗体显示等等,有醒目的格式是很意义。 + +这就是一些 HTML 和 HTML 模板。我喜欢使用 [Chameleon][9]: + +``` +template_content = """ + +

+

Day

+
    +
  • Thing
  • +
+
+""" +``` + +Chameleon 的一个很酷的功能是使用它的 `html` 方法渲染对象。我将以两种方式使用它: + + * 摘要将以粗体显示 + * 对于大多数活动,我都会删除摘要(因为这是我的个人信息) + +``` +def __html__(self): + offset = my_timezone.utcoffset(self.start) + fixed = self.start + offset + start_str = str(fixed).split("+")[0] + summary = self.summary + if summary != "Busy": + summary = "<REDACTED>" + return f"{summary[:30]} -- {start_str} ({self.duration})" +Event.__html__ = __html__ +``` + +为了简洁起见,将该报告切成每天的: + +``` +import chameleon +from IPython.display import HTML +template = chameleon.PageTemplate(template_content) +html = template(items=itertools.islice(events_by_day.items(), 3, 4)) +HTML(html) +``` + +渲染后,它将看起来像这样: + +**2020-08-25** + +- **\** -- 2020-08-25 08:30:00 (0:45:00) +- **\** -- 2020-08-25 10:00:00 (1:00:00) +- **\** -- 2020-08-25 11:30:00 (0:30:00) +- **\** -- 2020-08-25 13:00:00 (0:25:00) +- Busy -- 2020-08-25 15:00:00 (1:00:00) +- **\** -- 2020-08-25 15:00:00 (1:00:00) +- **\** -- 2020-08-25 19:00:00 (1:00:00) +- **\** -- 2020-08-25 19:00:12 (1:00:00) + +### Python 和 Jupyter 的无穷选择 + +通过解析、分析和报告各种 Web 服务所拥有的数据,这只是你可以做的事情的表面。 + +为什么不对你最喜欢的服务试试呢? + +-------------------------------------------------------------------------------- + +via: https://opensource.com/article/20/9/calendar-jupyter + +作者:[Moshe Zadka][a] +选题:[lujun9972][b] +译者:[stevenzdg988](https://github.com/stevenzdg988) +校对:[wxy](https://github.com/wxy) + +本文由 [LCTT](https://github.com/LCTT/TranslateProject) 原创编译,[Linux中国](https://linux.cn/) 荣誉推出 + +[a]: https://opensource.com/users/moshez +[b]: https://github.com/lujun9972 +[1]: https://opensource.com/sites/default/files/styles/image-full-size/public/lead-images/calendar.jpg?itok=jEKbhvDT (Calendar close up snapshot) +[2]: https://opensource.com/resources/python +[3]: https://pandas.pydata.org/ +[4]: https://dask.org/ +[5]: https://jupyter.org/ +[6]: https://pypi.org/project/caldav/ +[7]: https://pypi.org/project/vobject/ +[8]: https://opensource.com/article/19/5/python-attrs +[9]: https://chameleon.readthedocs.io/en/latest/ diff --git a/published/202103/20201014 Teach a virtual class with Moodle on Linux.md b/published/202103/20201014 Teach a virtual class with Moodle on Linux.md new file mode 100644 index 0000000000..b41b64f498 --- /dev/null +++ b/published/202103/20201014 Teach a virtual class with Moodle on Linux.md @@ -0,0 +1,181 @@ +[#]: collector: (lujun9972) +[#]: translator: (stevenzdg988) +[#]: reviewer: (wxy) +[#]: publisher: (wxy) +[#]: url: (https://linux.cn/article-13190-1.htmlhttps://linux.cn/article-13190-1.html) +[#]: subject: (Teach a virtual class with Moodle on Linux) +[#]: via: (https://opensource.com/article/20/10/moodle) +[#]: author: (Don Watkins https://opensource.com/users/don-watkins) + +基于 Linux 的 Moodle 虚拟课堂教学 +====== + +> 基于 Linux 的 Moodle 学习管理系统进行远程教学。 + +![](https://img.linux.net.cn/data/attachment/album/202103/10/094113q0ggsbz0a0wb9eg4.jpg) + +这次大流行对远程教育的需求比以往任何时候都更大。使得像 [Moodle][2] 这样的学习管理系统learning management system(LMS)比以往任何时候都重要,因为越来越多的学校教育是借助虚拟现实技术的提供。 + +Moodle 是用 PHP 编写的免费 LMS,并以开源 [GNU 公共许可证][3](GPL)分发。它是由 [Martin Dougiamas][4] 开发的,自 2002 年发布以来一直在不断发展。Moodle 可用于混合学习、远程学习、翻转课堂flipped classroom和其他形式的在线学习。目前,全球有超过 [1.9 亿用户][5] 和 145,000 个注册的 Moodle 网站。 + +我曾作为 Moodle 管理员、教师和学生等角色使用过 Moodle,在本文中,我将向你展示如何设置并开始使用它。 + +### 在 Linux 系统上安装 Moodle + +Moodle 对 [系统要求][6] 适中,并且有大量文档可为你提供帮助。我最喜欢的安装方法是从 [Turnkey Linux][7] 下载并制作 ISO,然后在 VirtualBox 中安装 Moodle 网站。 + +首先,下载 [Moodle ISO][8] 保存到电脑中。 + +下一步,安装 VirtualBox 的 Linux 命令行如下: + +``` +$ sudo apt install virtualbox +``` + +或, + +``` +$ sudo dnf install virtualbox +``` + +当下载完成后,启动 VirtualBox 并在控制台中选择“新建New”按钮。 + +![创建一个新的 VirtualBox 虚拟机][9] + +选择使用的虚拟机的名称、操作系统(Linux)和 Linux 类型(例如 Debian 64 位)。 + +![命名 VirtualBox 虚拟机][11] + +下一步,配置虚拟机内存大小,使用默认值 1024 MB。接下来选择 “动态分配dynamically allocated”虚拟磁盘并在虚拟机中添加 `Moodle.iso` 镜像。 + +![添加 Moodle.iso 到虚拟机][12] + +将你的网络设置从 NAT 更改为 “桥接模式Bridged adapter”。然后启动虚拟机并安装 ISO 以创建 Moodle 虚拟机。在安装过程中,系统将提示为 root 帐户、MySQL 和Moodle 创建密码。Moodle 密码必须至少包含八个字符,至少一个大写字母和至少一个特殊字符。 + +重启虚拟机。安装完成后,请确保将 Moodle 应用配置内容记录在安全的地方。(安装后,可以根据需要删除 ISO 文件。) + +![Moodle 应用配置][13] + +重要提示,在互联网上的任何人还看不到你的 Moodle 实例。它仅存在于你的本地网络中:现在只有建筑物中与你连接到相同的路由器或 wifi 接入点的人可以访问你的站点。全世界的互联网无法连接到它,因为你位于防火墙(可能嵌入在路由器中,还可能嵌入在计算机中)的后面。有关网络配置的更多信息,请阅读 Seth Kenlon 关于 [打开端口和通过防火墙进行流量路由][14] 的文章。 + +### 开始使用 Moodle + +现在你可以登录到 Moodle 机器并熟悉该软件了。使用默认的用户名 `admin` 和创建 Moodle VM 时设置的密码登录 Moodle。 + +![Moodle 登录界面][15] + +首次登录后,你将看到初始的 Moodle 网站的主仪表盘。 + +![Moodle 管理员仪表盘][16] + +默认的应用名称是 “Turnkey Moodle”,但是可以很容易地对其进行更改以适合你的学校、课堂或其他需要和选择。要使你的 Moodle 网站个性化,请在用户界面左侧的菜单中,选择“站点首页Site home”。然后,点击屏幕右侧的 “设置Settings” 图标,然后选择 “编辑设置Edit settings”。 + +![Moodle 设置][17] + +你可以根据需要更改站点名称,并添加简短名称和站点描述。 + +![Moodle 网站名][18] + +确保滚动到底部并保存更改。现在,你的网站已定制好。 + +![Moodle 保存更改][19] + +默认类别为其他,这不会帮助人们识别你网站的目的。要添加类别,请返回主仪表盘,然后从左侧菜单中选择 “站点管理Site administration”。 在 “课程Courses”下,选择 “添加类别Add a category”并输入有关你的网站的详细信息。 + +![在 Moodle 中添加类别选项][20] + +要添加课程,请返回 “站点管理Site administration”,然后单击 “添加新课程Add a new course”。你将看到一系列选项,例如为课程命名、提供简短名称、设定类别以及设置课程的开始和结束日期。你还可以为课程形式设置选项,例如社交、每周式课程、主题,以及其外观、文件上传大小、完成情况跟踪等等。 + +![在 Moodle 中添加课程选项][21] + +### 添加和管理用户 + +现在,你已经设置了课程,你可以添加用户。有多种方法可以做到这一点。如果你是家庭教师,则手动输入是一个不错的开始。Moodle 支持基于电子邮件的注册、[LDAP][22]、[Shibboleth(口令或暗语)][23] 和许多其他方式等。校区和其他较大的机构可以用逗号分隔的文件上传用户。也可以批量添加密码,并在首次登录时强制更改密码。有关更多信息,一定要查阅 Moodle [文档][24]。 + +Moodle 是一个非常细化的、面向许可的环境。使用 Moodle 的菜单将策略和角色分配给用户并执行这些分配很容易。 + +Moodle 中有许多角色,每个角色都有特定的特权和许可。默认角色有管理员、课程创建者、教师、非编辑教师、学生、来宾和经过身份验证的用户,但你可以添加其他角色。 + +### 为课程添加内容 + +一旦搭建了 Moodle 网站并设置了课程,就可以向课程中添加内容。Moodle 拥有创建出色内容所需要的所有工具,并且它建立在强调 [社会建构主义][25] 观点的坚实教学法之上。 + +我创建了一个名为 “Code with [Mu][26]” 的示例课程。它在 “编程Programming” 类别和 “Python” 子类别中。 + +![Moodle 课程列表][27] + +我为课程选择了每周式课程,默认为四个星期。使用编辑工具,我隐藏了除课程第一周以外的所有内容。这样可以确保我的学生始终专注于材料。 + +作为教师或 Moodle 管理员,我可以通过单击 “添加活动或资源Add an activity or resource” 来将活动添加到每周的教学中。 + +![在 Moodle 中添加活动][28] + +我会看到一个弹出窗口,其中包含可以分配给我的学生的各种活动。 + +![Moodle 活动菜单][29] + +Moodle 的工具和活动使我可以轻松地创建学习材料,并以一个简短的测验来结束一周的学习。 + +![Moodle 活动清单][30] + +你可以使用 1600 多个插件来扩展 Moodle,包括新的活动、问题类型,与其他系统的集成等等。例如,[BigBlueButton][31] 插件支持幻灯片共享、白板、音频和视频聊天以及分组讨论。其他值得考虑的包括用于视频会议的 [Jitsi][32] 插件、[抄袭检查器][33] 和用于颁发徽章的 [开放徽章工厂][34]。 + +### 继续探索 Moodle + +Moodle 是一个功能强大的 LMS,我希望此介绍能引起你的兴趣,以了解更多信息。有很多出色的 [指南][35] 可以帮助你提高技能,如果想要查看 Moodle 的内容,可以在其 [演示站点][36] 上查看运行中的 Moodle;如果你想了解 Moodle 的底层结构或为开发做出 [贡献][38],也可以访问 [Moodle 的源代码][37]。如果你喜欢在旅途中工作,Moodle 也有一款出色的 [移动应用][39],适用于 iOS 和 Android。在 [Twitter][40]、[Facebook][41] 和 [LinkedIn][42] 上关注 Moodle,以了解最新消息。 + +-------------------------------------------------------------------------------- + +via: https://opensource.com/article/20/10/moodle + +作者:[Don Watkins][a] +选题:[lujun9972][b] +译者:[stevenzdg988](https://github.com/stevenzdg988) +校对:[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/computer_desk_home_laptop_browser.png?itok=Y3UVpY0l (Digital images of a computer desktop) +[2]: https://moodle.org/ +[3]: https://docs.moodle.org/19/en/GNU_General_Public_License +[4]: https://dougiamas.com/about/ +[5]: https://docs.moodle.org/39/en/History +[6]: https://docs.moodle.org/39/en/Installation_quick_guide#Basic_Requirements +[7]: https://www.turnkeylinux.org/ +[8]: https://www.turnkeylinux.org/download?file=turnkey-moodle-16.0-buster-amd64.iso +[9]: https://opensource.com/sites/default/files/uploads/virtualbox_new.png (Create a new VirtualBox) +[10]: https://creativecommons.org/licenses/by-sa/4.0/ +[11]: https://opensource.com/sites/default/files/uploads/virtualbox_namevm.png (Naming the VirtualBox VM) +[12]: https://opensource.com/sites/default/files/uploads/virtualbox_attach-iso.png (Attaching Moodle.iso to VM) +[13]: https://opensource.com/sites/default/files/uploads/moodle_appliance.png (Moodle appliance settings) +[14]: https://opensource.com/article/20/9/firewall +[15]: https://opensource.com/sites/default/files/uploads/moodle_login.png (Moodle login screen) +[16]: https://opensource.com/sites/default/files/uploads/moodle_dashboard.png (Moodle admin dashboard) +[17]: https://opensource.com/sites/default/files/uploads/moodle_settings.png (Moodle settings) +[18]: https://opensource.com/sites/default/files/uploads/moodle_name-site.png (Name Moodle site) +[19]: https://opensource.com/sites/default/files/uploads/moodle_saved.png (Moodle changes saved) +[20]: https://opensource.com/sites/default/files/uploads/moodle_addcategory.png (Add category option in Moodle) +[21]: https://opensource.com/sites/default/files/uploads/moodle_addcourse.png (Add course option in Moodle) +[22]: https://en.wikipedia.org/wiki/Lightweight_Directory_Access_Protocol +[23]: https://www.shibboleth.net/ +[24]: https://docs.moodle.org/39/en/Main_page +[25]: https://docs.moodle.org/39/en/Pedagogy#How_Moodle_tries_to_support_a_Social_Constructionist_view +[26]: https://opensource.com/article/20/9/teach-python-mu +[27]: https://opensource.com/sites/default/files/uploads/moodle_choosecourse.png (Moodle course list) +[28]: https://opensource.com/sites/default/files/uploads/moodle_addactivity_0.png (Add activity in Moodle) +[29]: https://opensource.com/sites/default/files/uploads/moodle_activitiesmenu.png (Moodle activities menu) +[30]: https://opensource.com/sites/default/files/uploads/moodle_activitieschecklist.png (Moodle activities checklist) +[31]: https://moodle.org/plugins/mod_bigbluebuttonbn +[32]: https://moodle.org/plugins/mod_jitsi +[33]: https://moodle.org/plugins/plagiarism_unicheck +[34]: https://moodle.org/plugins/local_obf +[35]: https://learn.moodle.org/ +[36]: https://school.moodledemo.net/ +[37]: https://git.in.moodle.com/moodle/moodle +[38]: https://git.in.moodle.com/moodle/moodle/-/blob/master/CONTRIBUTING.txt +[39]: https://download.moodle.org/mobile/ +[40]: https://twitter.com/moodle +[41]: https://www.facebook.com/moodle +[42]: https://www.linkedin.com/company/moodle/ diff --git a/published/202103/20201215 6 container concepts you need to understand.md b/published/202103/20201215 6 container concepts you need to understand.md new file mode 100644 index 0000000000..30d8ba7631 --- /dev/null +++ b/published/202103/20201215 6 container concepts you need to understand.md @@ -0,0 +1,104 @@ +[#]: collector: (lujun9972) +[#]: translator: (AmorSu) +[#]: reviewer: (wxy) +[#]: publisher: (wxy) +[#]: url: (https://linux.cn/article-13170-1.html) +[#]: subject: (6 container concepts you need to understand) +[#]: via: (https://opensource.com/article/20/12/containers-101) +[#]: author: (Mike Calizo https://opensource.com/users/mcalizo) + +6 个必知必会的关于容器的概念 +====== + +> 容器现在是无所不在,它们已经快速的改变了 IT 格局。关于容器你需要知道一些什么呢? + +![](https://img.linux.net.cn/data/attachment/album/202103/02/204713fgp7fasvm4ii2ire.jpg) + +因为容器给企业所带来的巨大的价值和大量的好处,它快速的改变了 IT 格局。几乎所有最新的业务创新,都有容器化贡献的一部分因素,甚至是主要因素。 + +在现代化应用架构中,能够快速的把变更交付到生产环境的能力,让你比你的竞争对手更胜一筹。容器通过使用微服务架构,帮助开发团队开发功能、更小的失败、更快的恢复,从而加快交付速度。容器化还让应用软件能够快速启动、按需自动扩展云资源。还有,[DevOps][2] 通过灵活性、移动性、和有效性让产品可以尽快进入市场,从而将容器化的所能带来的好处最大化。 + +在 DevOps 中,虽然速度、敏捷、灵活是容器化的主要保障,但安全则是一个重要的因素。这就导致了 DevSecOps 的出现。它从一开始,到贯穿容器化应用的整个生命周期,都始终将安全融合到应用的开发中。默认情况下,容器化大大地增强了安全性,因为它将应用和宿主机以及其他的容器化应用相互隔离开来。 + +### 什么是容器? + +容器是单体式应用程序所遗留的问题的解决方案。虽然单体式有它的优点,但是它阻碍了组织以敏捷的方式快速前进。而容器则让你能够将单体式分解成 [微服务][3]。 + +本质上来说,容器只是一些轻量化组件的应用集,比如软件依赖、库、配置文件等等,然后运行在一个隔离的环境之中,这个隔离的环境又是运行在传统操作系统之上的,或者为了可移植性和灵活性而运行在虚拟化环境之上。 + +![容器的架构][4] + +总而言之,容器通过利用像 cgroup、 [内核命名空间][6] 和 [SELinux][7] 这样的内核技术来实现隔离。容器跟宿主机共用一个内核,因此比虚拟机占用更少的资源。 + +### 容器的优势 + +这种架构所带来的敏捷性是虚拟机所不可能做到的。此外,在计算和内存资源方面,容器支持一种更灵活的模型,而且它支持突发资源模式,因此应用程序可以在需要的时候,在限定的范围内,使用更多的资源。用另一句话来说,容器提供的扩展性和灵活性,是你在虚拟机上运行的应用程序中所无法实现的。 + +容器让在公有云或者私有云上部署和分享应用变得非常容易。更重要的是,它所提供的连贯性,帮助运维和开发团队降低了在跨平台部署的过程中的复杂度。 + +容器还可以实现一套通用的构建组件,可以在开发的任何阶段拿来复用,从而可以重建出一样的环境供开发、测试、预备、生产使用,将“一次编写、到处执行”的概念加以扩展。 + +和虚拟化相比,容器使实现灵活性、连贯性和快速部署应用的能力变得更加简单 —— 这是 DevOps 的主要原则。 + +### Docker 因素 + +[Docker][8] 已经变成了容器的代名词。Docker 让容器技术发生彻底变革并得以推广普及,虽然早在 Docker 之前容器技术就已经存在。这些容器技术包括 AIX 工作负载分区、 Solaris 容器、以及 Linux 容器([LXC][9]),后者被用来 [在一台 Linux 宿主机上运行多个 Linux 环境][10]。 + +### Kubernetes 效应 + +Kubernetes 如今已被广泛认为是 [编排引擎][11] 中的领导者。在过去的几年里,[Kubernetes 的普及][12] 加上容器技术的应用日趋成熟,为运维、开发、以及安全团队可以拥抱日益变革的行业,创造了一个理想的环境。 + +Kubernetes 为容器的管理提供了完整全面的解决方案。它可以在一个集群中运行容器,从而实现类似自动扩展云资源这样的功能,这些云资源包括:自动的、分布式的事件驱动的应用需求。这就保证了“免费的”高可用性。(比如,开发和运维都不需要花太大的劲就可以实现) + +此外,在 OpenShift 和 类似 Kubernetes 这样的企业的帮助下,容器的应用变得更加的容易。 + +![Kubernetes 集群][13] + +### 容器会替代虚拟机吗? + +[KubeVirt][14] 和类似的 [开源][15] 项目很大程度上表明,容器将会取代虚拟机。KubeVirt 通过将虚拟机转化成容器,把虚拟机带入到容器化的工作流中,因此它们就可以利用容器化应用的优势。 + +现在,容器和虚拟机更多的是互补的关系,而不是相互竞争的。容器在虚拟机上面运行,因此增加可用性,特别是对于那些要求有持久性的应用。同时容器可以利用虚拟化技术的优势,让硬件的基础设施(如:内存和网络)的管理更加便捷。 + +### 那么 Windows 容器呢? + +微软和开源社区方面都对 Windows 容器的成功实现做了大量的推动。Kubernetes 操作器Operator 加速了 Windows 容器的应用进程。还有像 OpenShift 这样的产品现在可以启用 [Windows 工作节点][16] 来运行 Windows 容器。 + +Windows 的容器化创造出巨大的诱人的可能性。特别是对于使用混合环境的企业。在 Kubernetes 集群上运行你最关键的应用程序,是你成功实现混合云/多种云环境的目标迈出的一大步。 + +### 容器的未来 + +容器在 IT 行业日新月异的变革中扮演着重要的角色,因为企业在向着快速、敏捷的交付软件及解决方案的方向前进,以此来 [超越竞争对手][17]。 + +容器会继续存在下去。在不久的将来,其他的使用场景,比如边缘计算中的无服务器,将会浮现出来,并且更深地影响我们对从数字设备来回传输数据的速度的认知。唯一在这种变化中存活下来的方式,就是去应用它们。 + +-------------------------------------------------------------------------------- + +via: https://opensource.com/article/20/12/containers-101 + +作者:[Mike Calizo][a] +选题:[lujun9972][b] +译者:[AmorSu](https://github.com/amorsu) +校对:[wxy](https://github.com/wxy) + +本文由 [LCTT](https://github.com/LCTT/TranslateProject) 原创编译,[Linux中国](https://linux.cn/) 荣誉推出 + +[a]: https://opensource.com/users/mcalizo +[b]: https://github.com/lujun9972 +[1]: https://opensource.com/sites/default/files/styles/image-full-size/public/lead-images/kubernetes_containers_ship_lead.png?itok=9EUnSwci (Ships at sea on the web) +[2]: https://opensource.com/resources/devops +[3]: https://opensource.com/resources/what-are-microservices +[4]: https://opensource.com/sites/default/files/uploads/container_architecture.png (Container architecture) +[5]: https://creativecommons.org/licenses/by-sa/4.0/ +[6]: https://opensource.com/article/19/10/namespaces-and-containers-linux +[7]: https://opensource.com/article/20/11/selinux-containers +[8]: https://opensource.com/resources/what-docker +[9]: https://linuxcontainers.org/ +[10]: https://opensource.com/article/18/11/behind-scenes-linux-containers +[11]: https://opensource.com/article/20/11/orchestration-vs-automation +[12]: https://enterprisersproject.com/article/2020/6/kubernetes-statistics-2020 +[13]: https://opensource.com/sites/default/files/uploads/kubernetes_cluster.png (Kubernetes cluster) +[14]: https://kubevirt.io/ +[15]: https://opensource.com/resources/what-open-source +[16]: https://www.openshift.com/blog/announcing-the-community-windows-machine-config-operator-on-openshift-4.6 +[17]: https://www.imd.org/research-knowledge/articles/the-battle-for-digital-disruption-startups-vs-incumbents/ diff --git a/published/202103/20210113 Turn your Raspberry Pi into a HiFi music system.md b/published/202103/20210113 Turn your Raspberry Pi into a HiFi music system.md new file mode 100644 index 0000000000..4f25621cf2 --- /dev/null +++ b/published/202103/20210113 Turn your Raspberry Pi into a HiFi music system.md @@ -0,0 +1,83 @@ +[#]: collector: (lujun9972) +[#]: translator: (wxy) +[#]: reviewer: (wxy) +[#]: publisher: (wxy) +[#]: url: (https://linux.cn/article-13209-1.html) +[#]: subject: (Turn your Raspberry Pi into a HiFi music system) +[#]: via: (https://opensource.com/article/21/1/raspberry-pi-hifi) +[#]: author: (Peter Czanik https://opensource.com/users/czanik) + +把你的树莓派变成一个 HiFi 音乐系统 +====== + +> 为你的朋友、家人、同事或其他任何拥有廉价发烧设备的人播放音乐。 + +![](https://img.linux.net.cn/data/attachment/album/202103/17/094819ad5vzy0kqwvlxeee.jpg) + +在过去的 10 年里,我大部分时间都是远程工作,但当我走进办公室时,我坐在一个充满内向的同伴的房间里,他们很容易被环境噪音和谈话所干扰。我们发现,听音乐可以抑制办公室的噪音,让声音不那么扰人,用愉快的音乐提供一个愉快的工作环境。 + +起初,我们的一位同事带来了一些老式的有源电脑音箱,把它们连接到他的桌面电脑上,然后问我们想听什么。它可以工作,但音质不是很好,而且只有当他在办公室的时候才可以使用。接下来,我们又买了一对 Altec Lansing 音箱。音质有所改善,但没有什么灵活性。 + +不久之后,我们得到了一台通用 ARM 单板计算机(SBC),这意味着任何人都可以通过 Web 界面控制播放列表和音箱。但一块普通的 ARM 开发板意味着我们不能使用流行的音乐设备软件。由于非标准的内核,更新操作系统是一件很痛苦的事情,而且 Web 界面也经常出现故障。 + +当团队壮大并搬进更大的房间后,我们开始梦想着有更好音箱和更容易处理软件和硬件组合的方法。 + +为了用一种相对便宜、灵活、音质好的方式解决我们的问题,我们用树莓派、音箱和开源软件开发了一个办公室 HiFi。 + +### HiFi 硬件 + +用一个专门的 PC 来播放背景音乐就有点过分了。它昂贵、嘈杂(除非是静音的,但那就更贵了),而且不环保。即使是最便宜的 ARM 板也能胜任这个工作,但从软件的角度来看,它们往往存在问题。树莓派还是比较便宜的,虽然不是标准的计算机,但在硬件和软件方面都有很好的支持。 + +接下来的问题是:用什么音箱。质量好的、有源的音箱很贵。无源音箱的成本较低,但需要一个功放,这需要为这套设备增加另一个盒子。它们还必须使用树莓派的音频输出;虽然可以工作,但并不是最好的,特别是当你已经在高质量的音箱和功放上投入资金的时候。 + +幸运的是,在数以千计的树莓派硬件扩展中,有内置数字模拟转换器(DAC)的功放。我们选择了 [HiFiBerry 的 Amp][2]。它在我们买来后不久就停产了(被采样率更好的 Amp+ 型号取代),但对于我们的目的来说,它已经足够好了。在开着空调的情况下,我想无论如何你也听不出 48kHz 或 192kHz 的 DAC 有什么不同。 + +音箱方面,我们选择了 [Audioengine P4][3],是在某店家清仓大甩卖的时候买的,价格超低。它很容易让我们的办公室房间充满了声音而不失真(并且还能传到我们的房间之外,有一些失真,隔壁的工程师往往不喜欢)。 + +### HiFi 软件 + +在我们旧的通用 ARM SBC 上我们需要维护一个 Ubuntu,使用一个固定的、古老的、在软件包仓库外的系统内核,这是有问题的。树莓派操作系统包括一个维护良好的内核包,使其成为一个稳定且易于更新的基础系统,但它仍然需要我们定期更新 Python 脚本来访问 Spotify 和 YouTube。对于我们的目的来说,这有点过于高维护。 + +幸运的是,使用树莓派作为基础意味着有许多现成的软件设备可用。 + +我们选择了 [Volumio][4],这是一个将树莓派变成音乐播放设备的开源项目。安装是一个简单的*一步步完成*的过程。安装和升级是完全无痛的,而不用辛辛苦苦地安装和维护一个操作系统,并定期调试破损的 Python 代码。配置 HiFiBerry 功放不需要编辑任何配置文件,你只需要从列表中选择即可。当然,习惯新的用户界面需要一定的时间,但稳定性和维护的便捷性让这个改变是值得的。 + +![Volumio interface][5] + +### 播放音乐并体验 + +虽然大流行期间我们都在家里办公,不过我把办公室的 HiFi 安装在我的家庭办公室里,这意味着我可以自由支配它的运行。一个不断变化的用户界面对于一个团队来说会很痛苦,但对于一个有研发背景的人来说,自己玩一个设备,变化是很有趣的。 + +我不是一个程序员,但我有很强的 Linux 和 Unix 系统管理背景。这意味着,虽然我觉得修复坏掉的 Python 代码很烦人,但 Volumio 对我来说却足够完美,足够无聊(这是一个很好的“问题”)。幸运的是,在树莓派上播放音乐还有很多其他的可能性。 + +作为一个终端狂人(我甚至从终端窗口启动 LibreOffice),我主要使用 Music on Console([MOC][6])来播放我的网络存储(NAS)中的音乐。我有几百张 CD,都转换成了 [FLAC][7] 文件。而且我还从 [BandCamp][8] 或 [Society of Sound][9] 等渠道购买了许多数字专辑。 + +另一个选择是 [音乐播放器守护进程(MPD)][10]。把它运行在树莓派上,我可以通过网络使用 Linux 和 Android 的众多客户端之一与我的音乐进行远程交互。 + +### 音乐不停歇 + +正如你所看到的,创建一个廉价的 HiFi 系统在软件和硬件方面几乎是无限可能的。我们的解决方案只是众多解决方案中的一个,我希望它能启发你建立适合你环境的东西。 + +-------------------------------------------------------------------------------- + +via: https://opensource.com/article/21/1/raspberry-pi-hifi + +作者:[Peter Czanik][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/czanik +[b]: https://github.com/lujun9972 +[1]: https://opensource.com/sites/default/files/styles/image-full-size/public/lead-images/hi-fi-stereo-vintage.png?itok=KYY3YQwE (HiFi vintage stereo) +[2]: https://www.hifiberry.com/products/amp/ +[3]: https://audioengineusa.com/shop/passivespeakers/p4-passive-speakers/ +[4]: https://volumio.org/ +[5]: https://opensource.com/sites/default/files/uploads/volumeio.png (Volumio interface) +[6]: https://en.wikipedia.org/wiki/Music_on_Console +[7]: https://xiph.org/flac/ +[8]: https://bandcamp.com/ +[9]: https://realworldrecords.com/news/society-of-sound-statement/ +[10]: https://www.musicpd.org/ diff --git a/published/202103/20210118 KDE Customization Guide- Here are 11 Ways You Can Change the Look and Feel of Your KDE-Powered Linux Desktop.md b/published/202103/20210118 KDE Customization Guide- Here are 11 Ways You Can Change the Look and Feel of Your KDE-Powered Linux Desktop.md new file mode 100644 index 0000000000..5f5ced02d5 --- /dev/null +++ b/published/202103/20210118 KDE Customization Guide- Here are 11 Ways You Can Change the Look and Feel of Your KDE-Powered Linux Desktop.md @@ -0,0 +1,171 @@ +[#]: collector: (lujun9972) +[#]: translator: (wxy) +[#]: reviewer: (wxy) +[#]: publisher: (wxy) +[#]: url: (https://linux.cn/article-13172-1.html) +[#]: subject: (KDE Customization Guide: Here are 11 Ways You Can Change the Look and Feel of Your KDE-Powered Linux Desktop) +[#]: via: (https://itsfoss.com/kde-customization/) +[#]: author: (Dimitrios Savvopoulos https://itsfoss.com/author/dimitrios/) + +KDE 桌面环境定制指南 +====== + +![](https://img.linux.net.cn/data/attachment/album/202103/03/234801udzaled8erltd78u.jpg) + +[KDE Plasma 桌面][1] 无疑是定制化的巅峰,因为你几乎可以改变任何你想要的东西。你甚至可以让它充当 [平铺窗口管理器][2]。 + +KDE Plasma 提供的定制化程度会让初学者感到困惑。用户会迷失在层层深入的选项之中。 + +为了解决这个问题,我将向你展示你应该注意的 KDE Plasma 定制的关键点。这里有 11 种方法可以改变你的 KDE 桌面的外观和感觉。 + +![][3] + +### 定制 KDE Plasma + +我在本教程中使用了 [KDE Neon][4],但你可以在任何使用 KDE Plasma 桌面的发行版中遵循这些方法。 + +#### 1、Plasma 桌面小工具 + +桌面小工具可以增加用户体验的便利性,因为你可以立即访问桌面上的重要项目。 + +现在学生和专业人士使用电脑的时候越来越多,其中一个有用的小部件是便签。 + +右键点击桌面,选择“添加小工具Add Widgets”。 + +![][5] + +选择你喜欢的小部件,然后简单地将其拖放到桌面上。 + +![][6] + +#### 2、桌面壁纸 + +不用说,更换壁纸可以改变桌面的外观。 + +![][7] + +在“壁纸Wallpaper”选项卡中,你可以改变的不仅仅是壁纸。从“布局Layout”下拉菜单中,你还可以选择桌面是否放置图标。 + +“文件夹视图Folder View”布局的命名来自于主目录中的传统桌面文件夹,你可以在那里访问你的桌面文件。因此,“文件夹视图Folder View”选项将保留桌面上的图标。 + +如果你选择“桌面Desktop”布局,它会使你的桌面图标保持自由而普通。当然,你仍然可以访问主目录下的桌面文件夹。 + +![][8] + +在“壁纸类型Wallpaper Type”中,你可以选择是否要壁纸,是静止的还是变化的,最后在“位置Positioning”中,选择它在屏幕上的样子。 + +#### 3、鼠标动作 + +每一个鼠标按键都可以配置为以下动作之一: + + * 切换窗口Switch Window + * 切换桌面Switch Desktop + * 粘贴Paste + * 标准菜单Standard Menu + * 应用程序启动器Application Launcher + * 切换活动区Switch Activity + +右键默认设置为标准菜单Standard Menu,也就是在桌面上点击右键时的菜单。点击旁边的设置图标可以更改动作。 + +![][9] + +#### 4、桌面内容的位置 + +只有在壁纸选项卡中选择“文件夹视图”时,该选项才可用。默认情况下,桌面上显示的内容是你在主目录下的“桌面Desktop”文件夹中的内容。这个位置选项卡让你可以选择不同的文件夹来改变桌面上的内容。 + +![][10] + +#### 5、桌面图标 + +在这里,你可以选择图标的排列方式(水平或垂直)、左右对齐、排序标准及其大小。如果这些还不够,你还可以探索其他的美学功能。 + +![][11] + +#### 6、桌面过滤器 + +让我们坦然面对自己吧! 相信每个用户最后都会在某些时候出现桌面凌乱的情况。如果你的桌面变得乱七八糟,找不到文件,你可以按名称或类型应用过滤器,找到你需要的文件。虽然,最好是养成一个良好的文件管理习惯! + +![][12] + +#### 7、应用仪表盘 + +如果你喜欢 GNOME 3 的应用程序启动器,那么你可以试试 KDE 应用程序仪表板。你所要做的就是右击菜单图标 > “显示替代品Show Alternatives”。 + +![][13] + +点击“应用仪表盘Application Dashboard”。 + +![][14] + +#### 8、窗口管理器主题 + +就像你在 [Xfce 自定义教程][15] 中看到的那样,你也可以在 KDE 中独立改变窗口管理器的主题。这样你就可以为面板选择一种主题,为窗口管理器选择另外一种主题。如果预装的主题不够用,你可以下载更多的主题。 + +不过受 [MX Linux][16] Xfce 版的启发,我还是忍不住选择了我最喜欢的 “Arc Dark”。 + +导航到“设置Settings” > “应用风格Application Style” > “窗口装饰Window decorations” > “主题Theme”。 + +![][17] + +#### 9、全局主题 + +如上所述,KDE Plasma 面板的外观和感觉可以从“设置Settings” > “全局主题Global theme”选项卡中进行配置。预装的主题数量并不多,但你可以下载一个适合自己口味的主题。不过默认的 “Breeze Dark” 是一款养眼的主题。 + +![][18] + +#### 10、系统图标 + +系统图标样式对桌面的外观有很大的影响。无论你选择哪一种,如果你的全局主题是深色的,你应该选择深色图标版本。唯一的区别在于图标文字对比度上,图标文字对比度应该与面板颜色反色,使其具有可读性。你可以在系统设置中轻松访问“图标Icons”标签。 + +![][19] + +#### 11、系统字体 + +系统字体并不是定制的重点,但如果你每天有一半的时间都在屏幕前,它可能是眼睛疲劳的因素之一。有阅读障碍的用户会喜欢 [OpenDyslexic][20] 字体。我个人选择的是 Ubuntu 字体,不仅我觉得美观,而且是在屏幕前度过一天的好字体。 + +当然,你也可以通过下载外部资源来 [在 Linux 系统上安装更多的字体][21]。 + +![][22] + +### 总结 + +KDE Plasma 是 Linux 社区最灵活和可定制的桌面之一。无论你是否是一个修理工,KDE Plasma 都是一个不断发展的桌面环境,具有惊人的现代功能。更好的是,它也可以在性能中等的系统配置上进行管理。 + +现在,我试图让本指南对初学者友好。当然,可以有更多的高级定制,比如那个 [窗口切换动画][23]。如果你知道一些别的技巧,为什么不在评论区与我们分享呢? + +-------------------------------------------------------------------------------- + +via: https://itsfoss.com/kde-customization/ + +作者:[Dimitrios Savvopoulos][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://itsfoss.com/author/dimitrios/ +[b]: https://github.com/lujun9972 +[1]: https://kde.org/plasma-desktop/ +[2]: https://github.com/kwin-scripts/kwin-tiling +[3]: https://i0.wp.com/itsfoss.com/wp-content/uploads/2021/01/kde-neon-neofetch.png?resize=800%2C600&ssl=1 +[4]: https://itsfoss.com/kde-neon-review/ +[5]: https://i2.wp.com/itsfoss.com/wp-content/uploads/2021/01/16-kde-neon-add-widgets.png?resize=800%2C500&ssl=1 +[6]: https://i1.wp.com/itsfoss.com/wp-content/uploads/2021/01/17-kde-neon-widgets.png?resize=800%2C768&ssl=1 +[7]: https://i0.wp.com/itsfoss.com/wp-content/uploads/2021/01/1-kde-neon-configure-desktop.png?resize=800%2C500&ssl=1 +[8]: https://i2.wp.com/itsfoss.com/wp-content/uploads/2021/01/2-kde-neon-wallpaper.png?resize=800%2C600&ssl=1 +[9]: https://i0.wp.com/itsfoss.com/wp-content/uploads/2021/01/3-kde-neon-mouse-actions.png?resize=800%2C600&ssl=1 +[10]: https://i2.wp.com/itsfoss.com/wp-content/uploads/2021/01/10-kde-neon-location.png?resize=800%2C650&ssl=1 +[11]: https://i0.wp.com/itsfoss.com/wp-content/uploads/2021/01/4-kde-neon-desktop-icons.png?resize=798%2C635&ssl=1 +[12]: https://i1.wp.com/itsfoss.com/wp-content/uploads/2021/01/11-kde-neon-desktop-icons-filter.png?resize=800%2C650&ssl=1 +[13]: https://i0.wp.com/itsfoss.com/wp-content/uploads/2021/01/5-kde-neon-show-alternatives.png?resize=800%2C500&ssl=1 +[14]: https://i0.wp.com/itsfoss.com/wp-content/uploads/2021/01/6-kde-neon-application-dashboard.png?resize=800%2C450&ssl=1 +[15]: https://itsfoss.com/customize-xfce/ +[16]: https://itsfoss.com/mx-linux-kde-edition/ +[17]: https://i1.wp.com/itsfoss.com/wp-content/uploads/2021/01/12-kde-neon-window-manager.png?resize=800%2C512&ssl=1 +[18]: https://i1.wp.com/itsfoss.com/wp-content/uploads/2021/01/15-kde-neon-global-theme.png?resize=800%2C524&ssl=1 +[19]: https://i0.wp.com/itsfoss.com/wp-content/uploads/2021/01/13-kde-neon-system-icons.png?resize=800%2C524&ssl=1 +[20]: https://www.opendyslexic.org/about +[21]: https://itsfoss.com/install-fonts-ubuntu/ +[22]: https://i1.wp.com/itsfoss.com/wp-content/uploads/2021/01/14-kde-neon-fonts.png?resize=800%2C524&ssl=1 +[23]: https://itsfoss.com/customize-task-switcher-kde/ diff --git a/published/202103/20210121 Convert your Windows install into a VM on Linux.md b/published/202103/20210121 Convert your Windows install into a VM on Linux.md new file mode 100644 index 0000000000..5262d6d8b6 --- /dev/null +++ b/published/202103/20210121 Convert your Windows install into a VM on Linux.md @@ -0,0 +1,244 @@ +[#]: collector: (lujun9972) +[#]: translator: (wxy) +[#]: reviewer: (wxy) +[#]: publisher: (wxy) +[#]: url: (https://linux.cn/article-13240-1.html) +[#]: subject: (Convert your Windows install into a VM on Linux) +[#]: via: (https://opensource.com/article/21/1/virtualbox-windows-linux) +[#]: author: (David Both https://opensource.com/users/dboth) + +在 Linux 上将你的 Windows 系统转换为虚拟机 +====== + +> 下面是我如何配置 VirtualBox 虚拟机以在我的 Linux 工作站上使用物理的 Windows 操作系统。 + +![](https://img.linux.net.cn/data/attachment/album/202103/27/105053kyd66r1cpr1s2vz2.jpg) + +我经常使用 VirtualBox 来创建虚拟机来测试新版本的 Fedora、新的应用程序和很多管理工具,比如 Ansible。我甚至使用 VirtualBox 来测试创建一个 Windows 访客主机。 + +我从来没有在我的任何一台个人电脑上使用 Windows 作为我的主要操作系统,甚至也没在虚拟机中执行过一些用 Linux 无法完成的冷门任务。不过,我确实为一个需要使用 Windows 下的财务程序的组织做志愿者。这个程序运行在办公室经理的电脑上,使用的是预装的 Windows 10 Pro。 + +这个财务应用程序并不特别,[一个更好的 Linux 程序][2] 可以很容易地取代它,但我发现许多会计和财务主管极不愿意做出改变,所以我还没能说服我们组织中的人迁移。 + +这一系列的情况,加上最近的安全恐慌,使得我非常希望将运行 Windows 的主机转换为 Fedora,并在该主机上的虚拟机中运行 Windows 和会计程序。 + +重要的是要明白,我出于多种原因极度不喜欢 Windows。主要原因是,我不愿意为了在新的虚拟机上安装它而再花钱购买一个 Windows 许可证(Windows 10 Pro 大约需要 200 美元)。此外,Windows 10 在新系统上设置时或安装后需要足够的信息,如果微软的数据库被攻破,破解者就可以窃取一个人的身份。任何人都不应该为了注册软件而需要提供自己的姓名、电话号码和出生日期。 + +### 开始 + +这台实体电脑已经在主板上唯一可用的 m.2 插槽中安装了一个 240GB 的 NVMe m.2 的 SSD 存储设备。我决定在主机上安装一个新的 SATA SSD,并将现有的带有 Windows 的 SSD 作为 Windows 虚拟机的存储设备。金士顿在其网站上对各种 SSD 设备、外形尺寸和接口做了很好的概述。 + +这种方法意味着我不需要重新安装 Windows 或任何现有的应用软件。这也意味着,在这台电脑上工作的办公室经理将使用 Linux 进行所有正常的活动,如电子邮件、访问 Web、使用 LibreOffice 创建文档和电子表格。这种方法增加了主机的安全性。唯一会使用 Windows 虚拟机的时间是运行会计程序。 + +### 先备份 + +在做其他事情之前,我创建了整个 NVMe 存储设备的备份 ISO 镜像。我在 500GB 外置 USB 存储盘上创建了一个分区,在其上创建了一个 ext4 文件系统,然后将该分区挂载到 `/mnt`。我使用 `dd` 命令来创建镜像。 + +我在主机中安装了新的 500GB SATA SSD,并从临场live USB 上安装了 Fedora 32 Xfce 偏好版spin。在安装后的初次重启时,在 GRUB2 引导菜单上,Linux 和 Windows 操作系统都是可用的。此时,主机可以在 Linux 和 Windows 之间进行双启动。 + +### 在网上寻找帮助 + +现在我需要一些关于创建一个使用物理硬盘或 SSD 作为其存储设备的虚拟机的信息。我很快就在 VirtualBox 文档和互联网上发现了很多关于如何做到这一点的信息。虽然 VirtualBox 文档初步帮助了我,但它并不完整,遗漏了一些关键信息。我在互联网上找到的大多数其他信息也很不完整。 + +在我们的记者 Joshua Holm 的帮助下,我得以突破这些残缺的信息,并以一个可重复的流程来完成这项工作。 + +### 让它发挥作用 + +这个过程其实相当简单,虽然需要一个玄妙的技巧才能实现。当我准备好这一步的时候,Windows 和 Linux 操作系统已经到位了。 + +首先,我在 Linux 主机上安装了最新版本的 VirtualBox。VirtualBox 可以从许多发行版的软件仓库中安装,也可以直接从 Oracle VirtualBox 仓库中安装,或者从 VirtualBox 网站上下载所需的包文件并在本地安装。我选择下载 AMD64 版本,它实际上是一个安装程序而不是一个软件包。我使用这个版本来规避一个与这个特定项目无关的问题。 + +安装过程总是在 `/etc/group` 中创建一个 `vboxusers` 组。我把打算运行这个虚拟机的用户添加到 `/etc/group` 中的 `vboxusers` 和 `disk` 组。将相同的用户添加到 `disk` 组是很重要的,因为 VirtualBox 是以启动它的用户身份运行的,而且还需要直接访问 `/dev/sdx` 特殊设备文件才能在这种情况下工作。将用户添加到 `disk` 组可以提供这种级别的访问权限,否则他们就不会有这种权限。 + +然后,我创建了一个目录来存储虚拟机,并赋予它 `root.vboxusers` 的所有权和 `775` 的权限。我使用 `/vms` 用作该目录,但可以是任何你想要的目录。默认情况下,VirtualBox 会在创建虚拟机的用户的子目录中创建新的虚拟机。这将使多个用户之间无法共享对虚拟机的访问,从而不会产生巨大的安全漏洞。将虚拟机目录放置在一个可访问的位置,可以共享虚拟机。 + +我以非 root 用户的身份启动 VirtualBox 管理器。然后,我使用 VirtualBox 的“偏好Preferences => 一般General”菜单将“默认机器文件夹Default Machine Folder”设置为 `/vms` 目录。 + +我创建的虚拟机没有虚拟磁盘。“类型Type” 应该是 `Windows`,“版本Version”应该设置为 `Windows 10 64-bit`。为虚拟机设置一个合理的内存量,但只要虚拟机处于关闭状态,以后可以更改。在安装的“硬盘Hard disk”页面,我选择了 “不要添加虚拟硬盘Do not add a virtual hard disk”,点击“创建Create”。新的虚拟机出现在VirtualBox 管理器窗口中。这个过程也创建了 `/vms/Test1` 目录。 + +我使用“高级Advanced”菜单在一个页面上设置了所有的配置,如图 1 所示。“向导模式Guided Mode”可以获得相同的信息,但需要更多的点击,以通过一个窗口来进行每个配置项目。它确实提供了更多的帮助内容,但我并不需要。 + +![VirtualBox 对话框:创建新的虚拟机,但不添加硬盘][3] + +*图 1:创建一个新的虚拟机,但不要添加硬盘。* + +然后,我需要知道 Linux 给原始 Windows 硬盘分配了哪个设备。在终端会话中以 root 身份使用 `lshw` 命令来发现 Windows 磁盘的设备分配情况。在本例中,代表整个存储设备的设备是 `/dev/sdb`。 + +``` +# lshw -short -class disk,volume +H/W path           Device      Class          Description +========================================================= +/0/100/17/0        /dev/sda    disk           500GB CT500MX500SSD1 +/0/100/17/0/1                  volume         2047MiB Windows FAT volume +/0/100/17/0/2      /dev/sda2   volume         4GiB EXT4 volume +/0/100/17/0/3      /dev/sda3   volume         459GiB LVM Physical Volume +/0/100/17/1        /dev/cdrom  disk           DVD+-RW DU-8A5LH +/0/100/17/0.0.0    /dev/sdb    disk           256GB TOSHIBA KSG60ZMV +/0/100/17/0.0.0/1  /dev/sdb1   volume         649MiB Windows FAT volume +/0/100/17/0.0.0/2  /dev/sdb2   volume         127MiB reserved partition +/0/100/17/0.0.0/3  /dev/sdb3   volume         236GiB Windows NTFS volume +/0/100/17/0.0.0/4  /dev/sdb4   volume         989MiB Windows NTFS volume +[root@office1 etc]# +``` + +VirtualBox 不需要把虚拟存储设备放在 `/vms/Test1` 目录中,而是需要有一种方法来识别要从其启动的物理硬盘。这种识别是通过创建一个 `*.vmdk` 文件来实现的,该文件指向将作为虚拟机存储设备的原始物理磁盘。作为非 root 用户,我创建了一个 vmdk 文件,指向整个 Windows 设备 `/dev/sdb`。 + +``` +$ VBoxManage internalcommands createrawvmdk -filename /vms/Test1/Test1.vmdk -rawdisk /dev/sdb +RAW host disk access VMDK file /vms/Test1/Test1.vmdk created successfully. +``` + +然后,我使用 VirtualBox 管理器 “文件File => 虚拟介质管理器Virtual Media Manager” 对话框将 vmdk 磁盘添加到可用硬盘中。我点击了“添加Add”,文件管理对话框中显示了默认的 `/vms` 位置。我选择了 `Test1` 目录,然后选择了 `Test1.vmdk` 文件。然后我点击“打开Open”,`Test1.vmdk` 文件就显示在可用硬盘列表中。我选择了它,然后点击“关闭Close”。 + +下一步就是将这个 vmdk 磁盘添加到我们的虚拟机的存储设备中。在 “Test1 VM” 的设置菜单中,我选择了 “存储Storage”,并点击了添加硬盘的图标。这时打开了一个对话框,在一个名为“未连接Not attached”的列表中显示了 `Test1vmdk` 虚拟磁盘文件。我选择了这个文件,并点击了“选择Choose”按钮。这个设备现在显示在连接到 “Test1 VM” 的存储设备列表中。这个虚拟机上唯一的其他存储设备是一个空的 CD/DVD-ROM 驱动器。 + +我点击了“确定OK”,完成了将此设备添加到虚拟机中。 + +在新的虚拟机工作之前,还有一个项目需要配置。使用 VirtualBox 管理器设置对话框中的 “Test1 VM”,我导航到 “系统System => 主板Motherboard”页面,并在 “启用 EFIEnable EFI”的方框中打上勾。如果你不这样做,当你试图启动这个虚拟机时,VirtualBox 会产生一个错误,说明它无法找到一个可启动的介质。 + +现在,虚拟机从原始的 Windows 10 硬盘驱动器启动。然而,我无法登录,因为我在这个系统上没有一个常规账户,而且我也无法获得 Windows 管理员账户的密码。 + +### 解锁驱动器 + +不,本节并不是要破解硬盘的加密,而是要绕过众多 Windows 管理员账户之一的密码,而这些账户是不属于组织中某个人的。 + +尽管我可以启动 Windows 虚拟机,但我无法登录,因为我在该主机上没有账户,而向人们索要密码是一种可怕的安全漏洞。尽管如此,我还是需要登录这个虚拟机来安装 “VirtualBox Guest Additions”,它可以提供鼠标指针的无缝捕捉和释放,允许我将虚拟机调整到大于 1024x768 的大小,并在未来进行正常的维护。 + +这是一个完美的用例,Linux 的功能就是更改用户密码。尽管我是访问之前的管理员的账户来启动,但在这种情况下,他不再支持这个系统,我也无法辨别他的密码或他用来生成密码的模式。我就直接清除了上一个系统管理员的密码。 + +有一个非常不错的开源软件工具,专门用于这个任务。在 Linux 主机上,我安装了 `chntpw`,它的意思大概是:“更改 NT 的密码”。 + +``` +# dnf -y install chntpw +``` + +我关闭了虚拟机的电源,然后将 `/dev/sdb3` 分区挂载到 `/mnt` 上。我确定 `/dev/sdb3` 是正确的分区,因为它是我在之前执行 `lshw` 命令的输出中看到的第一个大的 NTFS 分区。一定不要在虚拟机运行时挂载该分区,那样会导致虚拟机存储设备上的数据严重损坏。请注意,在其他主机上分区可能有所不同。 + +导航到 `/mnt/Windows/System32/config` 目录。如果当前工作目录(PWD)不在这里,`chntpw` 实用程序就无法工作。请启动该程序。 + +``` +# chntpw -i SAM +chntpw version 1.00 140201, (c) Petter N Hagen +Hive name (from header): <\SystemRoot\System32\Config\SAM> +ROOT KEY at offset: 0x001020 * Subkey indexing type is: 686c +File size 131072 [20000] bytes, containing 11 pages (+ 1 headerpage) +Used for data: 367/44720 blocks/bytes, unused: 14/24560 blocks/bytes. + +<>========<> chntpw Main Interactive Menu <>========<> + +Loaded hives: + + 1 - Edit user data and passwords + 2 - List groups + - - - + 9 - Registry editor, now with full write support! + q - Quit (you will be asked if there is something to save) + + +What to do? [1] -> +``` + +`chntpw` 命令使用 TUI(文本用户界面),它提供了一套菜单选项。当选择其中一个主要菜单项时,通常会显示一个次要菜单。按照明确的菜单名称,我首先选择了菜单项 `1`。 + +``` +What to do? [1] -> 1 + +===== chntpw Edit User Info & Passwords ==== + +| RID -|---------- Username ------------| Admin? |- Lock? --| +| 01f4 | Administrator | ADMIN | dis/lock | +| 03eb | john | ADMIN | dis/lock | +| 01f7 | DefaultAccount | | dis/lock | +| 01f5 | Guest | | dis/lock | +| 01f8 | WDAGUtilityAccount | | dis/lock | + +Please enter user number (RID) or 0 to exit: [3e9] +``` + +接下来,我选择了我们的管理账户 `john`,在提示下输入 RID。这将显示用户的信息,并提供额外的菜单项来管理账户。 + +``` +Please enter user number (RID) or 0 to exit: [3e9] 03eb +================= USER EDIT ==================== + +RID : 1003 [03eb] +Username: john +fullname: +comment : +homedir : + +00000221 = Users (which has 4 members) +00000220 = Administrators (which has 5 members) + +Account bits: 0x0214 = +[ ] Disabled | [ ] Homedir req. | [ ] Passwd not req. | +[ ] Temp. duplicate | [X] Normal account | [ ] NMS account | +[ ] Domain trust ac | [ ] Wks trust act. | [ ] Srv trust act | +[X] Pwd don't expir | [ ] Auto lockout | [ ] (unknown 0x08) | +[ ] (unknown 0x10) | [ ] (unknown 0x20) | [ ] (unknown 0x40) | + +Failed login count: 0, while max tries is: 0 +Total login count: 47 + +- - - - User Edit Menu: + 1 - Clear (blank) user password + 2 - Unlock and enable user account [probably locked now] + 3 - Promote user (make user an administrator) + 4 - Add user to a group + 5 - Remove user from a group + q - Quit editing user, back to user select +Select: [q] > 2 +``` + +这时,我选择了菜单项 `2`,“解锁并启用用户账户Unlock and enable user account”,这样就可以删除密码,使我可以不用密码登录。顺便说一下 —— 这就是自动登录。然后我退出了该程序。在继续之前,一定要先卸载 `/mnt`。 + +我知道,我知道,但为什么不呢! 我已经绕过了这个硬盘和主机的安全问题,所以一点也不重要。这时,我确实登录了旧的管理账户,并为自己创建了一个新的账户,并设置了安全密码。然后,我以自己的身份登录,并删除了旧的管理账户,这样别人就无法使用了。 + +网上也有 Windows Administrator 账号的使用说明(上面列表中的 `01f4`)。如果它不是作为组织管理账户,我可以删除或更改该账户的密码。还要注意的是,这个过程也可以从目标主机上运行临场 USB 来执行。 + +### 重新激活 Windows + +因此,我现在让 Windows SSD 作为虚拟机在我的 Fedora 主机上运行了。然而,令人沮丧的是,在运行了几个小时后,Windows 显示了一条警告信息,表明我需要“激活 Windows”。 + +在看了许许多多的死胡同网页之后,我终于放弃了使用现有激活码重新激活的尝试,因为它似乎已经以某种方式被破坏了。最后,当我试图进入其中一个在线虚拟支持聊天会话时,虚拟的“获取帮助”应用程序显示我的 Windows 10 Pro 实例已经被激活。这怎么可能呢?它一直希望我激活它,然而当我尝试时,它说它已经被激活了。 + +### 或者不 + +当我在三天内花了好几个小时做研究和实验时,我决定回到原来的 SSD 启动到 Windows 中,以后再来处理这个问题。但后来 Windows —— 即使从原存储设备启动,也要求重新激活。 + +在微软支持网站上搜索也无济于事。在不得不与之前一样的自动支持大费周章之后,我拨打了提供的电话号码,却被自动响应系统告知,所有对 Windows 10 Pro 的支持都只能通过互联网提供。到现在,我已经晚了将近一天才让电脑运行起来并安装回办公室。 + +### 回到未来 + +我终于吸了一口气,购买了一份 Windows 10 Home,大约 120 美元,并创建了一个带有虚拟存储设备的虚拟机,将其安装在上面。 + +我将大量的文档和电子表格文件复制到办公室经理的主目录中。我重新安装了一个我们需要的 Windows 程序,并与办公室经理验证了它可以工作,数据都在那里。 + +### 总结 + +因此,我的目标达到了,实际上晚了一天,花了 120 美元,但使用了一种更标准的方法。我仍在对权限进行一些调整,并恢复 Thunderbird 通讯录;我有一些 CSV 备份,但 `*.mab` 文件在 Windows 驱动器上包含的信息很少。我甚至用 Linux 的 `find` 命令来定位原始存储设备上的所有。 + +我走了很多弯路,每次都要自己重新开始。我遇到了一些与这个项目没有直接关系的问题,但却影响了我的工作。这些问题包括一些有趣的事情,比如把 Windows 分区挂载到我的 Linux 机器的 `/mnt` 上,得到的信息是该分区已经被 Windows 不正确地关闭(是的,在我的 Linux 主机上),并且它已经修复了不一致的地方。即使是 Windows 通过其所谓的“恢复”模式多次重启后也做不到这一点。 + +也许你从 `chntpw` 工具的输出数据中发现了一些线索。出于安全考虑,我删掉了主机上显示的其他一些用户账号,但我从这些信息中看到,所有的用户都是管理员。不用说,我也改了。我仍然对我遇到的糟糕的管理方式感到惊讶,但我想我不应该这样。 + +最后,我被迫购买了一个许可证,但这个许可证至少比原来的要便宜一些。我知道的一点是,一旦我找到了所有必要的信息,Linux 这一块就能完美地工作。问题是处理 Windows 激活的问题。你们中的一些人可能已经成功地让 Windows 重新激活了。如果是这样,我还是想知道你们是怎么做到的,所以请把你们的经验添加到评论中。 + +这是我不喜欢 Windows,只在自己的系统上使用 Linux 的又一个原因。这也是我将组织中所有的计算机都转换为 Linux 的原因之一。只是需要时间和说服力。我们只剩下这一个会计程序了,我需要和财务主管一起找到一个适合她的程序。我明白这一点 —— 我喜欢自己的工具,我需要它们以一种最适合我的方式工作。 + +-------------------------------------------------------------------------------- + +via: https://opensource.com/article/21/1/virtualbox-windows-linux + +作者:[David Both][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/dboth +[b]: https://github.com/lujun9972 +[1]: https://opensource.com/sites/default/files/styles/image-full-size/public/lead-images/puzzle_computer_solve_fix_tool.png?itok=U0pH1uwj (Puzzle pieces coming together to form a computer screen) +[2]: https://opensource.com/article/20/7/godbledger +[3]: https://opensource.com/sites/default/files/virtualbox.png diff --git a/published/202103/20210204 5 Tweaks to Customize the Look of Your Linux Terminal.md b/published/202103/20210204 5 Tweaks to Customize the Look of Your Linux Terminal.md new file mode 100644 index 0000000000..6170252cc3 --- /dev/null +++ b/published/202103/20210204 5 Tweaks to Customize the Look of Your Linux Terminal.md @@ -0,0 +1,243 @@ +[#]: collector: (lujun9972) +[#]: translator: (wxy) +[#]: reviewer: (wxy) +[#]: publisher: (wxy) +[#]: url: (https://linux.cn/article-13181-1.html) +[#]: subject: (5 Tweaks to Customize the Look of Your Linux Terminal) +[#]: via: (https://itsfoss.com/customize-linux-terminal/) +[#]: author: (Ankush Das https://itsfoss.com/author/ankush/) + +定制你的 Linux 终端外观的 5 项调整 +====== + +![](https://img.linux.net.cn/data/attachment/album/202103/06/232911eg4g65gp4g2ww24u.jpg) + +终端仿真器(或简称终端)是任何 Linux 发行版中不可或缺的一部分。 + +当你改变发行版的主题时,往往终端也会自动得到改造。但这并不意味着你不能进一步定制终端。 + +事实上,很多读者都问过我们,为什么我们截图或视频中的终端看起来那么酷,我们用的是什么字体等等。 + +为了回答这个经常被问到的问题,我将向你展示一些简单或复杂的调整来改变终端的外观。你可以在下图中对比一下视觉上的差异: + +![][1] + +### 自定义 Linux 终端 + +本教程利用 Pop!_OS 上的 GNOME 终端来定制和调整终端的外观。但是,大多数建议也应该适用于其他终端。 + +对于大多数元素,如颜色、透明度和字体,你可以利用 GUI 来调整它,而不需要输入任何特殊的命令。 + +打开你的终端。在右上角寻找汉堡菜单。在这里,点击 “偏好设置”,如下图所示: + +![][2] + +在这里你可以找到改变终端外观的所有设置。 + +#### 技巧 0:使用独立的终端配置文件进行定制 + +我建议你建立一个新的配置文件用于你的定制。为什么要这样做?因为这样一来,你的改变就不会影响到终端的主配置文件。假设你做了一些奇怪的改变,却想不起默认值?配置文件有助于分离你的定制。 + +如你所见,我有个单独的配置文件,用于截图和制作视频。 + +![终端配置文件][3] + +你可以轻松地更改终端配置文件,并使用新的配置文件打开一个新的终端窗口。 + +![更改终端配置文件][4] + +这就是我想首先提出的建议。现在,让我们看看这些调整。 + +#### 技巧 1:使用深色/浅色终端主题 + +你可以改变系统主题,终端主题也会随之改变。除此之外,如果你不想改变系统主题。你也可以切换终端的深色主题或浅色主题, + +一旦你进入“偏好设置”,你会注意到在“常规”选项中可以改变主题和其他设置。 + +![][5] + +#### 技巧 2:改变字体和大小 + +选择你要自定义的配置文件。现在你可以选择自定义文本外观、字体大小、字体样式、间距、光标形状,还可以切换终端铃声。 + +对于字体,你只能改成你系统上可用的字体。如果你想要不同的字体,请先在你的 Linux 系统上下载并安装字体。 + +还有一点! 要使用等宽字体,否则字体可能会重叠,文字可能无法清晰阅读。如果你想要一些建议,可以选择 [Share Tech Mono][6](开源)或 [Larabiefont][7](不开源)。 + +在“文本”选项卡下,选择“自定义字体”,然后更改字体及其大小(如果需要)。 + +![][8] + +#### 技巧 3:改变调色板和透明度 + +除了文字和间距,你还可以进入“颜色”选项,改变终端的文字和背景的颜色。你还可以调整透明度,让它看起来更酷。 + +正如你所注意到的那样,你可以从一组预先配置的选项中选择调色板,也可以自己调整。 + +![][9] + +如果你想和我一样启用透明,点击“使用透明背景”选项。 + +如果你想要和你的系统主题类似的颜色设置,你也可以选择使用系统主题的颜色。 + +![][10] + +#### 技巧 4:调整 bash 提示符变量 + +通常当你启动终端时,无需任何修改你就会看到你的用户名和主机名(你的发行版名称)作为 bash 提示符。 + +例如,在我的例子中,它会是 “ankushdas@pop-os:~$”。然而,我把 [主机名永久地改成了][11] “itsfoss”,所以现在看起来像这样: + +![][12] + +要改变主机名,你可以键入: + +``` +hostname 定制名称 +``` + +然而,这只适用于当前会话。因此,当你重新启动时,它将恢复到默认值。要永久地更改主机名,你需要输入: + +``` +sudo hostnamectl set-hostname 定制名称 +``` + +同样,你也可以改变你的用户名,但它需要一些额外的配置,包括杀死所有与活动用户名相关联的当前进程,所以我们会跳过用它来改变终端的外观/感觉。 + +#### 技巧 5:不推荐:改变 bash 提示符的字体和颜色(面向高级用户) + +然而,你可以使用命令调整 bash 提示符的字体和颜色。 + +你需要利用 `PS1` 环境变量来控制提示符的显示内容。你可以在 [手册页][14] 中了解更多关于它的信息。 + +例如,当你键入: + +``` +echo $PS1 +``` + +在我这里输出: + +``` +\[\e]0;\u@\h: \w\a\]${debian_chroot:+($debian_chroot)}\[\033[01;32m\]\u@\h\[\033[00m\]:\[\033[01;34m\]\w\[\033[00m\]\$ +``` + +我们需要关注的是该输出的第一部分: + +``` +\[\e]0;\u@\h: \w\a\]$ +``` + +在这里,你需要知道以下几点: + + * `\e` 是一个特殊的字符,表示一个颜色序列的开始。 + * `\u` 表示用户名,后面可以跟着 `@` 符号。 + * `\h` 表示系统的主机名。 + * `\w` 表示基本目录。 + * `\a` 表示活动目录。 + * `$` 表示非 root 用户。 + +在你的情况下输出可能不一样,但变量是一样的,所以你需要根据你的输出来试验下面提到的命令。 + +在你这样做之前,请记住这些: + + * 文本格式代码:`0` 代表正常文本,`1` 代表粗体,`3` 代表斜体,`4` 代表下划线文本。 + * 背景色的颜色范围:`40` - `47`。 + * 文本颜色的颜色范围:`30` - `37`。 + +你只需要键入以下内容来改变颜色和字体: + +``` +PS1="\e[41;3;32m[\u@\h:\w\a\$]" +``` + +这是输入该命令后 bash 提示符的样子: + +![][15] + +如果你注意到这个命令,就像上面提到的,`\e` 可以帮助我们分配一个颜色序列。 + +在上面的命令中,我先分配了一个**背景色**,然后是**文字样式**,接着是**字体颜色**,然后是 `m`。这里,`m` 表示颜色序列的结束。 + +所以,你要做的就是,调整这部分: + +``` +41;3;32 +``` + +命令其余部分应该是不变的,你只需要分配不同的数字来改变背景色、文字样式和文字颜色。 + +要注意的是,这并没有特定的顺序,你可以先指定文字样式,再指定背景色,最后指定文字颜色,如 `3;41;32`,这里的命令就变成了: + +``` +PS1="\e[3;41;32m[\u@\h:\w\a\$]" +``` + +![][16] + +正如你所注意到的,无论顺序如何,颜色的定制都是一样的。所以,只要记住自定义的代码,并在你确定你想把它作为一个永久的变化之前,试试它。 + +上面我提到的命令会临时定制当前会话的 bash 提示符。如果你关闭了会话,你将失去这个自定义设置。 + +所以,要想把它变成一个永久的改变,你需要把它添加到 `.bashrc` 文件中(这是一个配置文件,每次加载会话时都会加载)。 + +![][17] + +简单键入如下命令来访问该文件: + +``` +nano ~/.bashrc +``` + +除非你明确知道你在做什么,否则不要改变任何东西。而且,为了可以恢复设置,你应该把 `PS1` 环境变量的备份(默认情况下复制粘贴其中的内容)保存到一个文本文件中。 + +所以,即使你需要默认的字体和颜色,你也可以再次编辑 `.bashrc` 文件并粘贴 `PS1` 环境变量。 + +#### 附赠技巧:根据你的墙纸改变终端的调色板 + +如果你想改变终端的背景和文字颜色,但又不知道该选哪种颜色,你可以使用一个基于 Python 的工具 Pywal,它可以 [根据你的壁纸][18] 或你提供的图片自动改变终端的颜色。 + +![][19] + +如果你有兴趣使用这个工具,我之前已经详细[介绍][18]过了。 + +### 总结 + +当然,使用 GUI 定制很容易,同时也可以更好地控制你可以改变的东西。但是,需要知道命令也是必要的,万一你开始 [使用 WSL][21] 或者使用 SSH 访问远程服务器,无论如何都可以定制你的体验。 + +你是如何定制 Linux 终端的?在评论中与我们分享你的秘方。 + +-------------------------------------------------------------------------------- + +via: https://itsfoss.com/customize-linux-terminal/ + +作者:[Ankush Das][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://itsfoss.com/author/ankush/ +[b]: https://github.com/lujun9972 +[1]: https://i1.wp.com/itsfoss.com/wp-content/uploads/2021/02/default-terminal.jpg?resize=773%2C493&ssl=1 +[2]: https://i2.wp.com/itsfoss.com/wp-content/uploads/2021/01/linux-terminal-preferences.jpg?resize=800%2C350&ssl=1 +[3]: https://i0.wp.com/itsfoss.com/wp-content/uploads/2021/02/terminal-profiles.jpg?resize=800%2C619&ssl=1 +[4]: https://i2.wp.com/itsfoss.com/wp-content/uploads/2021/02/change-terminal-profile.jpg?resize=796%2C347&ssl=1 +[5]: https://i2.wp.com/itsfoss.com/wp-content/uploads/2021/01/terminal-theme.jpg?resize=800%2C363&ssl=1 +[6]: https://fonts.google.com/specimen/Share+Tech+Mono +[7]: https://www.dafont.com/larabie-font.font +[8]: https://i1.wp.com/itsfoss.com/wp-content/uploads/2021/01/terminal-customization-1.jpg?resize=800%2C500&ssl=1 +[9]: https://i2.wp.com/itsfoss.com/wp-content/uploads/2021/01/terminal-color-customization.jpg?resize=759%2C607&ssl=1 +[10]: https://i2.wp.com/itsfoss.com/wp-content/uploads/2021/01/linux-terminal.jpg?resize=800%2C571&ssl=1 +[11]: https://itsfoss.com/change-hostname-ubuntu/ +[12]: https://i2.wp.com/itsfoss.com/wp-content/uploads/2021/01/itsfoss-hostname.jpg?resize=800%2C188&ssl=1 +[13]: https://itsfoss.com/cdn-cgi/l/email-protection +[14]: https://linux.die.net/man/1/bash +[15]: https://i0.wp.com/itsfoss.com/wp-content/uploads/2021/01/terminal-bash-prompt-customization.jpg?resize=800%2C190&ssl=1 +[16]: https://i0.wp.com/itsfoss.com/wp-content/uploads/2021/01/linux-terminal-customization-1s.jpg?resize=800%2C158&ssl=1 +[17]: https://i1.wp.com/itsfoss.com/wp-content/uploads/2021/01/bashrch-customization-terminal.png?resize=800%2C615&ssl=1 +[18]: https://itsfoss.com/pywal/ +[19]: https://i2.wp.com/itsfoss.com/wp-content/uploads/2020/08/wallpy-2.jpg?resize=800%2C442&ssl=1 +[20]: https://i0.wp.com/itsfoss.com/wp-content/uploads/2020/08/pywal-linux.jpg?fit=800%2C450&ssl=1 +[21]: https://itsfoss.com/install-bash-on-windows/ diff --git a/published/202103/20210204 Get started with distributed tracing using Grafana Tempo.md b/published/202103/20210204 Get started with distributed tracing using Grafana Tempo.md new file mode 100644 index 0000000000..5326ff3421 --- /dev/null +++ b/published/202103/20210204 Get started with distributed tracing using Grafana Tempo.md @@ -0,0 +1,103 @@ +[#]: collector: (lujun9972) +[#]: translator: (ShuyRoy) +[#]: reviewer: (wxy) +[#]: publisher: (wxy) +[#]: url: (https://linux.cn/article-13229-1.html) +[#]: subject: (Get started with distributed tracing using Grafana Tempo) +[#]: via: (https://opensource.com/article/21/2/tempo-distributed-tracing) +[#]: author: (Annanay Agarwal https://opensource.com/users/annanayagarwal) + +使用 Grafana Tempo 进行分布式跟踪 +====== + +> Grafana Tempo 是一个新的开源、大容量分布式跟踪后端。 + +![](https://img.linux.net.cn/data/attachment/album/202103/23/221354lc1eiill7lln4lli.jpg) + +Grafana 的 [Tempo][2] 是出自 Grafana 实验室的一个简单易用、大规模的、分布式的跟踪后端。Tempo 集成了 [Grafana][3]、[Prometheus][4] 以及 [Loki][5],并且它只需要对象存储进行操作,因此成本低廉,操作简单。 + +我从一开始就参与了这个开源项目,所以我将介绍一些关于 Tempo 的基础知识,并说明为什么云原生社区会注意到它。 + +### 分布式跟踪 + +想要收集对应用程序请求的遥测数据是很常见的。但是在现在的服务器中,单个应用通常被分割为多个微服务,可能运行在几个不同的节点上。 + +分布式跟踪是一种获得关于应用的性能细粒度信息的方式,该应用程序可能由离散的服务组成。当请求到达一个应用时,它提供了该请求的生命周期的统一视图。Tempo 的分布式跟踪可以用于单体应用或微服务应用,它提供 [请求范围的信息][6],使其成为可观察性的第三个支柱(另外两个是度量和日志)。 + +接下来是一个分布式跟踪系统生成应用程序甘特图的示例。它使用 Jaeger [HotROD][7] 的演示应用生成跟踪,并把它们存到 Grafana 云托管的 Tempo 上。这个图展示了按照服务和功能划分的请求处理时间。 + +![Gantt chart from Grafana Tempo][8] + +### 减少索引的大小 + +在丰富且定义良好的数据模型中,跟踪包含大量信息。通常,跟踪后端有两种交互:使用元数据选择器(如服务名或者持续时间)筛选跟踪,以及筛选后的可视化跟踪。 + +为了加强搜索,大多数的开源分布式跟踪框架会对跟踪中的许多字段进行索引,包括服务名称、操作名称、标记和持续时间。这会导致索引很大,并迫使你使用 Elasticsearch 或者 [Cassandra][10] 这样的数据库。但是,这些很难管理,而且大规模运营成本很高,所以我在 Grafana 实验室的团队开始提出一个更好的解决方案。 + +在 Grafana 中,我们的待命调试工作流从使用指标报表开始(我们使用 [Cortex][11] 来存储我们应用中的指标,它是一个云原生基金会孵化的项目,用于扩展 Prometheus),深入研究这个问题,筛选有问题服务的日志(我们将日志存储在 Loki 中,它就像 Prometheus 一样,只不过 Loki 是存日志的),然后查看跟踪给定的请求。我们意识到,我们过滤时所需的所有索引信息都可以在 Cortex 和 Loki 中找到。但是,我们需要一个强大的集成,以通过这些工具实现跟踪的可发现性,并需要一个很赞的存储,以根据跟踪 ID 进行键值查找。 + +这就是 [Grafana Tempo][12] 项目的开始。通过专注于给定检索跟踪 ID 的跟踪,我们将 Tempo 设计为最小依赖性、大容量、低成本的分布式跟踪后端。 + +### 操作简单,性价比高 + +Tempo 使用对象存储后端,这是它唯一的依赖。它既可以被用于单一的二进制下,也可以用于微服务模式(请参考仓库中的 [例子][13],了解如何轻松上手)。使用对象存储还意味着你可以存储大量的应用程序的痕迹,而无需任何采样。这可以确保你永远不会丢弃那百万分之一的出错或具有较高延迟的请求的跟踪。 + +### 与开源工具的强大集成 + +[Grafana 7.3 包括了 Tempo 数据源][14],这意味着你可以在 Grafana UI 中可视化来自Tempo 的跟踪。而且,[Loki 2.0 的新查询特性][15] 使得 Tempo 中的跟踪更简单。为了与 Prometheus 集成,该团队正在添加对范例exemplar的支持,范例是可以添加到时间序列数据中的高基数元数据信息。度量存储后端不会对它们建立索引,但是你可以在 Grafana UI 中检索和显示度量值。尽管范例可以存储各种元数据,但是在这个用例中,存储跟踪 ID 是为了与 Tempo 紧密集成。 + +这个例子展示了使用带有请求延迟直方图的范例,其中每个范例数据点都链接到 Tempo 中的一个跟踪。 + +![Using exemplars in Tempo][16] + +### 元数据一致性 + +作为容器化应用程序运行的应用发出的遥测数据通常具有一些相关的元数据。这可以包括集群 ID、命名空间、吊舱 IP 等。这对于提供基于需求的信息是好的,但如果你能将元数据中包含的信息用于生产性的东西,那就更好了。 +  +例如,你可以使用 [Grafana 云代理将跟踪信息导入 Tempo 中][17],代理利用 Prometheus 服务发现机制轮询 Kubernetes API 以获取元数据信息,并且将这些标记添加到应用程序发出的跨域数据中。由于这些元数据也在 Loki 中也建立了索引,所以通过元数据转换为 Loki 标签选择器,可以很容易地从跟踪跳转到查看给定服务的日志。 + +下面是一个一致元数据的示例,它可用于Tempo跟踪中查看给定范围的日志。 + +![][18] + +### 云原生 + +Grafana Tempo 可以作为容器化应用,你可以在如 Kubernetes、Mesos 等编排引擎上运行它。根据获取/查询路径上的工作负载,各种服务可以水平伸缩。你还可以使用云原生的对象存储,如谷歌云存储、Amazon S3 或者 Tempo Azure 博客存储。更多的信息,请阅读 Tempo 文档中的 [架构部分][19]。 + +### 试一试 Tempo + +如果这对你和我们一样有用,可以 [克隆 Tempo 仓库][20]试一试。 + +-------------------------------------------------------------------------------- + +via: https://opensource.com/article/21/2/tempo-distributed-tracing + +作者:[Annanay Agarwal][a] +选题:[lujun9972][b] +译者:[RiaXu](https://github.com/ShuyRoy) +校对:[wxy](https://github.com/wxy) + +本文由 [LCTT](https://github.com/LCTT/TranslateProject) 原创编译,[Linux中国](https://linux.cn/) 荣誉推出 + +[a]: https://opensource.com/users/annanayagarwal +[b]: https://github.com/lujun9972 +[1]: https://opensource.com/sites/default/files/styles/image-full-size/public/lead-images/computer_space_graphic_cosmic.png?itok=wu493YbB (Computer laptop in space) +[2]: https://grafana.com/oss/tempo/ +[3]: http://grafana.com/oss/grafana +[4]: https://prometheus.io/ +[5]: https://grafana.com/oss/loki/ +[6]: https://peter.bourgon.org/blog/2017/02/21/metrics-tracing-and-logging.html +[7]: https://github.com/jaegertracing/jaeger/tree/master/examples/hotrod +[8]: https://opensource.com/sites/default/files/uploads/tempo_gantt.png (Gantt chart from Grafana Tempo) +[9]: https://creativecommons.org/licenses/by-sa/4.0/ +[10]: https://opensource.com/article/19/8/how-set-apache-cassandra-cluster +[11]: https://cortexmetrics.io/ +[12]: http://github.com/grafana/tempo +[13]: https://grafana.com/docs/tempo/latest/getting-started/example-demo-app/ +[14]: https://grafana.com/blog/2020/10/29/grafana-7.3-released-support-for-the-grafana-tempo-tracing-system-new-color-palettes-live-updates-for-dashboard-viewers-and-more/ +[15]: https://grafana.com/blog/2020/11/09/trace-discovery-in-grafana-tempo-using-prometheus-exemplars-loki-2.0-queries-and-more/ +[16]: https://opensource.com/sites/default/files/uploads/tempo_exemplar.png (Using exemplars in Tempo) +[17]: https://grafana.com/blog/2020/11/17/tracing-with-the-grafana-cloud-agent-and-grafana-tempo/ +[18]: https://lh5.googleusercontent.com/vNqk-ygBOLjKJnCbTbf2P5iyU5Wjv2joR7W-oD7myaP73Mx0KArBI2CTrEDVi04GQHXAXecTUXdkMqKRq8icnXFJ7yWUEpaswB1AOU4wfUuADpRV8pttVtXvTpVVv8_OfnDINgfN +[19]: https://grafana.com/docs/tempo/latest/architecture/architecture/ +[20]: https://github.com/grafana/tempo diff --git a/published/202103/20210216 How to install Linux in 3 steps.md b/published/202103/20210216 How to install Linux in 3 steps.md new file mode 100644 index 0000000000..15f9d474fc --- /dev/null +++ b/published/202103/20210216 How to install Linux in 3 steps.md @@ -0,0 +1,144 @@ +[#]: collector: (lujun9972) +[#]: translator: (wxy) +[#]: reviewer: (wxy) +[#]: publisher: (wxy) +[#]: url: (https://linux.cn/article-13164-1.html) +[#]: subject: (How to install Linux in 3 steps) +[#]: via: (https://opensource.com/article/21/2/linux-installation) +[#]: author: (Seth Kenlon https://opensource.com/users/seth) + +安装 Linux,只需三步 +====== + +> 操作系统的安装看似神秘,但其实很简单。以下是成功安装 Linux 的步骤。 + +![](https://img.linux.net.cn/data/attachment/album/202103/01/084538it1188e8zeepgzyb.jpg) + +在 2021 年,有更多让人们喜欢 Linux 的理由。在这个系列中,我将分享 21 种使用 Linux 的不同理由。下面是如何安装 Linux。  + +安装一个操作系统(OS)总是令人生畏。对大多数人来说,这是一个难题。安装操作系统不能从操作系统内部进行,因为它要么没有被安装,要么即将被另一个操作系统取代,那么它是如何发生的呢?更糟糕的是,它通常会涉及到硬盘格式、安装位置、时区、用户名、密码等一系列你通常不会想到的混乱问题。Linux 发行版知道这一点,所以它们多年来一直在努力将你在操作系统安装程序中花费的时间减少到最低限度。 + +### 安装时发生了什么 + +无论你安装的是一个应用程序还是整个操作系统,*安装*的过程只是将文件从一种媒介复制到另一种媒介的一种花哨方式。不管是什么用户界面,还是用动画将安装过程伪装成多么高度专业化的东西,最终都是一回事:曾经存储在光盘或驱动器上的文件被复制到硬盘上的特定位置。 + +当安装的是一个应用程序时,放置这些文件的有效位置被高度限制在你的*文件系统*或你的操作系统知道它可以使用的硬盘驱动器的部分。这一点很重要,因为它可以将硬盘分割成不同的空间(苹果公司在本世纪初的 Bootcamp 中使用了这一技巧,允许用户将 macOS 和 Windows 安装到一个硬盘上,但作为单独的实体)。当你安装一个操作系统时,一些特殊的文件会被安装到硬盘上通常是禁区的地方。更重要的是,至少在默认情况下,你的硬盘上的所有现有数据都会被擦除,以便为新系统腾出空间,所以创建一个备份是*必要的*。 + +### 安装程序 + +从技术上讲,你实际上不需要用安装程序来安装应用程序甚至操作系统。不管你信不信,有些人通过挂载一块空白硬盘、编译代码并复制文件来手动安装 Linux。这是在一个名为 [Linux From Scratch(LFS)][2] 的项目的帮助下完成的。这个项目旨在帮助爱好者、学生和未来的操作系统设计者更多地了解计算机的工作原理以及每个组件执行的功能。这并不是安装 Linux 的推荐方法,但你会发现,在开源中,通常是这样的:*如果*有些事情可以做,那么就有人在做。而这也是一件好事,因为这些小众的兴趣往往会带来令人惊讶的有用的创新。 + +假设你不是想对 Linux 进行逆向工程,那么正常的安装方式是使用安装光盘或镜像。 + +### 3 个简单的步骤来安装 Linux + +当你从一个 Linux 安装 DVD 或 U 盘启动时,你会置身于一个最小化的操作环境中,这个环境是为了运行一个或多个有用的应用程序。安装程序是最主要的应用程序,但由于 Linux 是一个如此灵活的系统,你通常也可以运行标准的桌面应用程序,以在你决定安装它之前感受一下这个操作系统是什么样子的。 + +不同的 Linux 发行版有不同的安装程序界面。下面是两个例子。 + +Fedora Linux 有一个灵活的安装程序(称为 Anaconda),能够进行复杂的系统配置: + +![Fedora 上的 Anaconda 安装界面][3] + +*Fedora 上的 Anaconda 安装程序* + +Elementary OS 有一个简单的安装程序,主要是为了在个人电脑上安装而设计的: + +![Elementary OS 安装程序][4] + +*Elementary OS 安装程序* + +#### 1、获取安装程序 + +安装 Linux 的第一步是下载一个安装程序。你可以从你选择尝试的发行版中获得一个 Linux 安装镜像。 + + * [Fedora][5] 以率先更新软件而闻名。 + * [Linux Mint][6] 提供了安装缺失驱动程序的简易选项。 + * [Elementary][7] 提供了一个美丽的桌面体验和几个特殊的、定制的应用程序。 + +Linux 安装程序是 `.iso` 文件,是 DVD 介质的“蓝图”。如果你还在使用光学介质,你可以把 `.iso` 文件刻录到 DVD-R 上,或者你可以把它烧录到 U 盘上(确保它是一个空的 U 盘,因为当镜像被烧录到它上时,它的所有内容都会被删除)。要将镜像烧录到 U 盘上,你可以 [使用开源的 Etcher 应用程序][8]。 + +![Etcher 用于烧录 U 盘][9] + +*Etcher 应用程序可以烧录 U 盘。* + +现在你可以安装 Linux 了。 + +#### 2、引导顺序 + +要在电脑上安装操作系统,你必须引导到操作系统安装程序。这对于一台电脑来说并不是常见的行为,因为很少有人这样做。理论上,你只需要安装一次操作系统,然后你就会不断更新它。当你选择在电脑上安装不同的操作系统时,你就中断了这个正常的生命周期。这不是一件坏事。这是你的电脑,所以你有权力对它进行重新规划。然而,这与电脑的默认行为不同,它的默认行为是开机后立即启动到硬盘上找到的任何操作系统。 + +在安装 Linux 之前,你必须备份你在目标计算机上的任何数据,因为这些数据在安装时都会被清除。 + +假设你已经将数据保存到了一个外部硬盘上,然后你将它秘密地存放在安全的地方(而不是连接到你的电脑上),那么你就可以继续了。 + +首先,将装有 Linux 安装程序的 U 盘连接到电脑上。打开电脑电源,观察屏幕上是否有一些如何中断其默认启动序列的指示。这通常是像 `F2`、`F8`、`Esc` 甚至 `Del` 这样的键,但根据你的主板制造商不同而不同。如果你错过了这个时间窗口,只需等待默认操作系统加载,然后重新启动并再次尝试。 + +当你中断启动序列时,电脑会提示你引导指令。具体来说,嵌入主板的固件需要知道该到哪个驱动器寻找可以加载的操作系统。在这种情况下,你希望计算机从包含 Linux 镜像的 U 盘启动。如何提示你这些信息取决于主板制造商。有时,它会直接问你,并配有一个菜单: + +![引导设备菜单][10] + +*启动设备选择菜单* + +其他时候,你会被带入一个简陋的界面,你可以用来设置启动顺序。计算机通常默认设置为先查看内部硬盘。如果引导失败,它就会移动到 U 盘、网络驱动器或光驱。你需要告诉你的计算机先寻找一个 U 盘,这样它就会绕过自己的内部硬盘驱动器,而引导 U 盘上的 Linux 镜像。 + +![BIOS 选择屏幕][11] + +*BIOS 选择屏幕* + +起初,这可能会让人望而生畏,但一旦你熟悉了界面,这就是一个快速而简单的任务。一旦安装了Linux,你就不必这样做了,因为,在这之后,你会希望你的电脑再次从内部硬盘启动。这是一个很好的技巧,因为在 U 盘上使用 Linux 的关键原因,是在安装前测试计算机的 Linux 兼容性,以及无论涉及什么操作系统的一般性故障排除。 + +一旦你选择了你的 U 盘作为引导设备,保存你的设置,让电脑复位,然后启动到 Linux 镜像。 + +#### 3、安装 Linux + +一旦你启动进入 Linux 安装程序,就只需通过提示进行操作。 + +Fedora 安装程序 Anaconda 为你提供了一个“菜单”,上面有你在安装前可以自定义的所有事项。大多数设置为合理的默认值,可能不需要你的互动,但有些则用警示符号标记,表示不能安全地猜测出你的配置,因此需要设置。这些配置包括你想安装操作系统的硬盘位置,以及你想为账户使用的用户名。在你解决这些问题之前,你不能继续进行安装。 + +对于硬盘的位置,你必须知道你要擦除哪个硬盘,然后用你选择的 Linux 发行版重新写入。对于只有一个硬盘的笔记本来说,这可能是一个显而易见的选择。 + +![选择安装驱动器的屏幕][12] + +*选择要安装操作系统的硬盘(本例中只有一个硬盘)。* + +如果你的电脑里有不止一个硬盘,而你只想在其中一个硬盘上安装 Linux,或者你想把两个硬盘当作一个硬盘,那么你必须帮助安装程序了解你的目标。最简单的方法是只给 Linux 分配一个硬盘,让安装程序执行自动分区和格式化,但对于高级用户来说,还有很多其他的选择。 + +你的电脑必须至少有一个用户,所以要为自己创建一个用户账户。完成后,你可以最后点击 **Done** 按钮,安装 Linux。 + +![Anaconda 选项完成并准备安装][13] + +*Anaconda 选项已经完成,可以安装了* + +其他的安装程序可能会更简单,所以你看到的可能与本文中的图片不同。无论怎样,除了预装的操作系统之外,这个安装过程都是最简单的操作系统安装过程之一,所以不要让安装操作系统的想法吓到你。这是你的电脑。你可以、也应该安装一个你拥有所有权的操作系统。 + +### 拥有你的电脑 + +最终,Linux 成为了你的操作系统。它是一个由来自世界各地的人们开发的操作系统,其核心是一个:创造一种参与、共同拥有、合作管理的计算文化。如果你有兴趣更好地了解开源,那么就请你迈出一步,了解它的一个光辉典范 Linux,并安装它。 + +-------------------------------------------------------------------------------- + +via: https://opensource.com/article/21/2/linux-installation + +作者:[Seth Kenlon][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/seth +[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]: http://www.linuxfromscratch.org +[3]: https://opensource.com/sites/default/files/anaconda-installer.png +[4]: https://opensource.com/sites/default/files/elementary-installer.png +[5]: http://getfedora.org +[6]: http://linuxmint.com +[7]: http://elementary.io +[8]: https://opensource.com/article/18/7/getting-started-etcherio +[9]: https://opensource.com/sites/default/files/etcher_0.png +[10]: https://opensource.com/sites/default/files/boot-menu.jpg +[11]: https://opensource.com/sites/default/files/bios_1.jpg +[12]: https://opensource.com/sites/default/files/install-harddrive-chooser.png +[13]: https://opensource.com/sites/default/files/anaconda-done.png diff --git a/published/202103/20210216 What does being -technical- mean.md b/published/202103/20210216 What does being -technical- mean.md new file mode 100644 index 0000000000..896988d23d --- /dev/null +++ b/published/202103/20210216 What does being -technical- mean.md @@ -0,0 +1,166 @@ +[#]: collector: (lujun9972) +[#]: translator: (Chao-zhi) +[#]: reviewer: (wxy) +[#]: publisher: (wxy) +[#]: url: (https://linux.cn/article-13168-1.html) +[#]: subject: (What does being 'technical' mean?) +[#]: via: (https://opensource.com/article/21/2/what-technical) +[#]: author: (Dawn Parzych https://opensource.com/users/dawnparzych) + +“技术”是什么意思? +====== + +> 用“技术”和“非技术”的标签对人们进行分类,会伤害个人和组织。本文作为本系列的第 1 篇,将阐述这个问题。 + +![](https://img.linux.net.cn/data/attachment/album/202103/02/003141oz1l1765c598t6u7.jpg) + +“技术technical”一词描述了许多项目和学科:**技术**淘汰赛、**技术性**犯规、攀岩比赛的**技术**课程和花样滑冰运动的**技术**得分。广受欢迎的烹饪节目 “_The Great British Bake-Off_” 包括一个“烘焙**技术**挑战”。任何参加过剧院演出的人都可能熟悉**技术**周,即戏剧或音乐剧首演前的一周。 + +如你所见,**技术**一词并不严格适用于软件工程和软件操作,所以当我们称一个人或一个角色为“技术”时,我们的意思是什么,为什么使用这个术语? + +在我 20 年的技术生涯中,这些问题引起了我的兴趣,所以我决定通过一系列的采访来探讨这个问题。我不是工程师,也不写代码,但这并不意味着我是**非技术型**的。但我经常被贴上这样的标签。我认为自己是**技术型**的,通过这个系列,我希望你会明白为什么。 + +我知道我不是孤独一个人。群众讨论是很重要的,因为如何定义和看待一个人或一个角色会影响他们做好工作的信心和能力。如果他们感到被压垮或不受尊重,就会降低他们的工作质量,挤压创新和新思想。你看,这一切都是循序渐进的,那么我们怎样才能改善这种状况呢? + +我首先采访了 7 个不同角色的人。 + +在本系列中,我将探讨“技术”一词背后的含义、技术的连续性、将人分类为技术型或非技术型的意外副作用,以及通常被认为是非技术性的技术角色。 + +### 定义技术和非技术 + +首先,我们需要做个名词解释。根据字典网,“技术/技术性的”是一个具有多重含义的形容词,包括: + + * 属于或与艺术、科学等学科有关的 + * 精通或熟悉某一特定的艺术或行业的实际操作 + * 技术要求高或困难(通常用于体育或艺术) + +而“非技术性”一词在科技公司中经常被用来描述非工程人员。但是“非技术性”的定义是“不涉及、不具有某个特定活动领域及其术语的特点,或不熟练”。 + +作为一个写作和谈论技术的人,我认为自己是技术型的。如果你不熟悉这个领域和术语,就不可能书写或谈论一个技术主题。有了这种理解,每个从事技术工作的人都是技术人员。 + +### 为什么要分配标签? + +那么,为什么划分技术与非技术?这在技术领域有什么意义呢?我们试图通过分配这些标签来实现什么?有没有一个好的理由?而我们有没有重新评估这些理由?让我们讨论一下。 + +当我听到人们谈论技术人员和非技术人员时,我不禁想起 Seuss 教授写的童话故事 《[The Sneetches][2]》。Sneetches 有没有星星被演化为一种渴望。Sneetches 们进入了一个无限循环,试图达到正确的状态。 + +标签可以起到一定的作用,但当它们迫使一个群体的等级被视为比另一个更好时,它们就会变得危险。想想你的组织或部门:销售、资源、营销、质控、工程等,哪一组的在重要性上高于或低于另一组? + +即使它不是直接说的或写在什么地方,也可能是被人们默认的。这些等级划分通常也存在于规章制度中。技术内容经理 Liz Harris 表示,“在技术写作界存在着一个技术含量的评级,你越是偏技术的文章,你得到的报酬就越高,而且往往在技术写作社区里你得到的关注就越多。” + +术语“技术”通常用于指一个人在某一主题上的深度或专业知识水平。销售人员也有可能会要求需要懂技术以更好的帮助客户。从事技术工作的人,他们是技术型的,但是也许更专业的技术人员才能胜任这个项目。因此,请求技术支援可能是含糊不清的表述。你需要一个对产品有深入了解的人吗?你需要一位了解基础设施堆栈的人员吗?还是需要一个能写下如何配置 API 的步骤的人? + +我们应该要把技术能力看作是一个连续体,而不是把人简单的看作技术型的或非技术型的。这是什么意思?开发人员关系主管 Mary thengwall 描述了她如何对特定角色所需的不同深度的技术知识进行分类。例如,项目可能需要一个开发人员、一个具有开发人员背景的人员,或一个精通技术的人员。就是那些被归类为精通技术的人也经常被贴上非技术的标签。 + +根据 Mary 的说法,如果“你能解释(一个技术性的)话题,你知道你的产品工作方式,你知道该说什么和不该说什么的基本知识,那么你就是技术高手。你不必有技术背景,但你需要知道高层次的技术信息,然后还要知道向谁提供更多信息。” + +### 标签带来的问题 + +当我们使用标签来具体说明我们需要完成一项工作时,它们可能会很有帮助,比如“开发人员”、“有开发人员背景”和“技术达人”。但是当我们使用标签的范围太广时,将人们分为两组中的一组可能会产生“弱于”和“优于”的感觉 + +当一个标签成为现实时,无论是有意还是无意,我们都必须审视自己,重新评估自己的措辞、标签和意图。 + +高级产品经理 Leon Stigter 提出了他的观点:“作为一个集体行业,我们正在构建更多的技术,让每个人都更容易参与。如果我们对每个人说:‘你不是技术型的’,或者说:‘你是技术型的’,然后把他们分成几个小组,那些被贴上非技术型标签的人可能永远不会去想:‘其实我自己就能完成这个项目’,实际上,我们需要所有这些人真正思考我们行业和社区的发展方向,我认为每一个人都应该有这个主观能动性。” + +#### 身份 + +如果我们把我们的身份贴在一个标签上,当我们认为这个标签不再适用时会发生什么?当 Adam Gordon Bell 从一个开发人员转变为一个管理人员时,他很纠结,因为他总是认为自己是技术人员,而作为一个管理人员,这些技术技能没有被使用。他觉得自己不再有价值了。编写代码并不能提供比帮助团队成员发展事业或确保项目按时交付更大的价值。所有角色都有价值,因为它们都是确保商品和服务的创建、执行和交付所必需的。 + +“我想我成为一名经理的原因是,我们有一支非常聪明的团队和很多非常有技能的人,但是我们并不总是能完成最出色的工作。所以技术不是限制因素,对吧?”Adam 说:“我想通常不是技术限制了团队的发挥”。 + +Leon Stigter 说,让人们一起合作并完成令人惊叹的工作的能力是一项很有价值的技能,不应低于技术角色的价值。 + +#### 自信 + +[冒充者综合症][3]Impostor syndrome 是指无法认识到自己的能力和知识,从而导致信心下降,以及完成工作和做好工作的能力下降。当你申请在会议上发言,向科技刊物提交文章,或申请工作时,冒充者综合症就会发作。冒充者综合症是一种微小的声音,它说: + + * “我技术不够胜任这个角色。” + * “我认识更多的技术人员,他们在演讲中会做得更好。” + * “我在市场部工作,所以我无法为这样的技术网站写文章。” + +当你把某人或你自己贴上非技术型标签的时候,这些声音就会变得更响亮。这很容易导致在会议上听不到新的声音或失去团队中的人才。 + +#### 刻板印象 + +当你认为某人是技术人员时,你会看到什么样的印象?他们穿什么?他们还有什么特点?他们是外向健谈,还是害羞安静? + +Shailvi Wakhlu 是一位高级数据总监,她的职业生涯始于软件工程师,并过渡到数据和分析领域。“当我是一名软件工程师的时候,很多人都认为我不太懂技术,因为我很健谈,很明显这就意味着你不懂技术。他们认为你不孤独的待在角落就是不懂技术。”她说。 + +我们对谁是技术型与非技术型的刻板印象会影响招聘决策或我们的社区是否具有包容性。你也可能冒犯别人,甚至是能够帮助你的人。几年前,我在某个展台工作,问别人我能不能帮他们。“我要找最专业的人帮忙”他回答说。然后他就出发去寻找他的问题的答案。几分钟后,摊位上的销售代表和那位先生走到我跟前说:“Dawn,你是回答这个人问题的最佳人选。” + +#### 污名化 + +随着时间的推移,我们夸大了“技术”技能的重要性,这导致了“非技术”的标签被贬义地使用。随着技术的蓬勃发展,编程人员的价值也随之增加,因为这种技能为市场带来了新产品和新的商业方式,并直接帮助了盈利。然而,现在我们看到人们故意将技术角色凌驾于非技术角色之上,阻碍了公司的发展和成功。 + +人际交往技能通常被称为非技术技能。然而,它们有着高度的技术性,比如提供如何完成一项任务的分步指导,或者确定最合适的词语来传达信息或观点。这些技能往往也是决定你能否在工作中取得成功的更重要因素。 + +通读“城市词典Urban Dictionary”上的文章和定义,难怪人们会觉得自己的标签有道理,而其他人会患上冒充者综合症,或者觉得自己失去了身份。在线搜索时,“城市词典”定义通常出现在搜索结果的顶部。这个网站大约 20 年前开始是一个定义俚语、文化表达和其他术语的众包词典,现在变成了一个充满敌意和负面定义的网站。 + +这里有几个例子:“城市词典”将非技术经理定义为“不知道他们管理的人应该做什么的人” + +提供如何与“非技术”人员交谈技巧的文章包括以下短语: + + * “如果我抗争,非技术人员究竟是如何应对的?” + * “在当今的职业专业人士中,开发人员和工程师拥有一些最令人印象深刻的技能,这些技能是由多年的技术培训和实际经验磨练而成的。” + +这些句子意味着非工程师是低人一等的,他们多年的训练和现实世界的经验在某种程度上没有那么令人印象深刻。对于这样的说辞,我可以举一个反例:Therese Eberhard,她的工作被许多人认为是非技术性的。她是个风景画家。她为电影和戏剧画道具和风景。她的工作是确保像甘道夫的手杖这样的道具看起来栩栩如生,而不是像塑料玩具。要想在这个角色上取得成功,需要有很多解决问题和实验化学反应的方法。Therese 在多年的实战经验中磨练了这些技能,对我来说,这相当令人印象深刻。 + +#### 守门人行为 + +使用标签会设置障碍,并导致守门人行为,这决定谁可以进入我们的组织,我们的团队,我们的社区。 + +据一位开源开发者 Eddie Jaoude 所说,“`技术’、`开发人员‘或`测试人员’的头衔在不应该出现的地方制造了障碍或权威。我们应该将重点放在谁能为团队或项目增加价值,而头衔是无关紧要的。” + +如果我们把每个人看作一个团队成员,他们应该以这样或那样的方式贡献价值,而不是看他们是否编写文档、测试用例或代码,那么我们将根据真正重要的东西来重视他们,并创建一个能完成惊人工作的团队。如果测试工程师想学习编写代码,或者程序员想学习如何在活动中与人交谈,为什么要设置障碍来阻止这种成长呢?拥抱团队成员学习、改变和向任何方向发展的渴望,为团队和公司的使命服务。 + +如果有人在某个角色上失败了,与其把他们说成“技术不够”,不如去看看问题到底是什么。你是否需要一个精通 JavaScript 的人,而这个人又是另一种编程语言的专家?并不是说他们不专业,是技能和知识不匹配。你需要合适的人来扮演合适的角色。如果你强迫一个精通业务分析和编写验收标准的人去编写自动化测试用例,他们就会失败。 + +### 如何取消标签 + +如果你已经准备好改变你对技术性和非技术性标签的看法,这里有帮助你改变的提示。 + +#### 寻找替代词 + +我问我采访过的每个人,我们可以用什么词来代替技术和非技术。没有人能回答!我认为这里的挑战是我们不能把它归结为一个词。要替换术语,你需要使用更多的词。正如我之前写的,我们需要做的是变得更加具体。 + +你说过或听到过多少次这样的话: + + * “我正在为这个项目寻找技术资源。” + * “那个候选人技术不够。” + * “我们的软件是为非技术用户设计的。” + +技术和非技术词语的这些用法是模糊的,不能表达它们的全部含义。更真实、更详细地了解你的需求那么你应该说: + + * “我想找一个对如何配置 Kubernetes 有深入了解的人。” + * “那个候选人对 Go 的了解不够深入。” + * “我们的软件是为销售和营销团队设计的。” + +#### 拥抱成长心态 + +知识和技能不是天生的。它们是经过数小时或数年的实践和经验形成的。认为“我只是技术不够”或“我不能学习如何做营销”反映了一种固定的心态。你可以向任何你想发展的方向学习技能。列一张清单,列出你认为哪些是技术技能,或非技术技能,但要具体(如上面的清单)。 + +#### 认可每个人的贡献 + +如果你在科技行业工作,你就是技术人员。在一个项目或公司的成功中,每个人都有自己的作用。与所有做出贡献的人分享荣誉,而不仅仅是少数人。认可提出新功能的产品经理,而不仅仅是开发新功能的工程师。认可一个作家,他的文章在你的公司迅速传播并产生了新的线索。认可在数据中发现新模式的数据分析师。 + +### 下一步 + +在本系列的下一篇文章中,我将探讨技术中经常被标记为“非技术”的非工程角色。 + +-------------------------------------------------------------------------------- + +via: https://opensource.com/article/21/2/what-technical + +作者:[Dawn Parzych][a] +选题:[lujun9972][b] +译者:[Chao-zhi](https://github.com/Chao-zhi) +校对:[wxy](https://github.com/wxy) + +本文由 [LCTT](https://github.com/LCTT/TranslateProject) 原创编译,[Linux中国](https://linux.cn/) 荣誉推出 + +[a]: https://opensource.com/users/dawnparzych +[b]: https://github.com/lujun9972 +[1]: https://opensource.com/sites/default/files/styles/image-full-size/public/lead-images/question-mark_chalkboard.jpg?itok=DaG4tje9 (question mark in chalk) +[2]: https://en.wikipedia.org/wiki/The_Sneetches_and_Other_Stories +[3]: https://opensource.com/business/15/9/tips-avoiding-impostor-syndrome +[4]: https://enterprisersproject.com/article/2019/8/why-soft-skills-core-to-IT diff --git a/published/202103/20210217 4 tech jobs for people who don-t code.md b/published/202103/20210217 4 tech jobs for people who don-t code.md new file mode 100644 index 0000000000..4252efa8a5 --- /dev/null +++ b/published/202103/20210217 4 tech jobs for people who don-t code.md @@ -0,0 +1,127 @@ +[#]: collector: (lujun9972) +[#]: translator: (Chao-zhi) +[#]: reviewer: (wxy) +[#]: publisher: (wxy) +[#]: url: (https://linux.cn/article-13178-1.html) +[#]: subject: (4 tech jobs for people who don't code) +[#]: via: (https://opensource.com/article/21/2/non-engineering-jobs-tech) +[#]: author: (Dawn Parzych https://opensource.com/users/dawnparzych) + +不懂代码的人也可以干的 4 种技术工作 +====== + +> 对于不是工程师的人来说也有很多技术工作可以做。本文作为本系列的第二篇,就具体阐述这些工作。 + +![](https://img.linux.net.cn/data/attachment/album/202103/06/094041jnrriww0g6ggjn0p.jpg) + +在 [本系列的第一篇文章][2] 中,我解释了技术行业如何将人员和角色划分为“技术”或“非技术”类别,以及与此相关的问题。科技行业使得那些对科技感兴趣但不懂编程的人很难找到适合自己的角色。 + +如果你对技术或开源感兴趣,但对编程不感兴趣,这也有一些工作适合你。科技公司的任何一个职位都可能需要一个精通科技但不一定会写代码的人。但是,你确实需要了解术语并理解产品。 + +我最近注意到,在诸如技术客户经理、技术产品经理、技术社区经理等职位头衔上增加了“技术”一词。这反映了几年前的趋势,即在头衔上加上“工程师”一词,以表示该职位的技术需要。过了一段时间,每个人的头衔中都有“工程师”这个词,这样的分类就失去了一些吸引力。 + +当我坐下来写这些文章时,Tim Banks 的这条推特出现在我的通知栏上: + +> 已经将职业生涯规划为技术行业的非开发人员(除了信息安全、数据科学/分析师、基础设施工程师等以外的人员)的女性,你希望知道的事情有哪些,有价值的资源有哪些,或者对希望做出类似改变的人有哪些建议? +> +> —— Tim Banks is a buttery biscuit (@elchefe) [December 15,2020][3] + +这遵循了我第一篇文章中的建议:Tim 并不是简单地询问“非技术角色”;他提供了更重要的详细描述。在 Twitter 这样的媒体上,每一个字符都很重要,这些额外的字符会产生不同的效果。这些是技术角色。如果为了节约笔墨,而简单的称呼他们为“非技术人员”,会改变你的原意,产生不好的影响。 + +以下是需要技术知识的非工程类角色的示例。 + +### 技术作者 + +[技术作者的工作][4] 是在两方或多方之间传递事实信息。传统上,技术作者提供有关如何使用技术产品的说明或文档。最近,我看到术语“技术作者”指的是写其他形式内容的人。科技公司希望一个人为他们的开发者读者写博客文章,而这种技巧不同于文案或内容营销。 + +**需要的技术技能:** + + * 写作 + * 特定技术或产品的用户知识或经验 + * 快速跟上新产品或新特性的速度的能力 + * 在各种环境中创作的技能 + +**适合人群:** + + * 可以清楚地提供分步说明 + * 享受合作 + * 对活跃的声音和音乐有热情 + * 喜欢描述事物和解释原理 + +### 产品经理 + +[产品经理][5] 负责领导产品战略。职责可能包括收集客户需求并确定其优先级,撰写业务案例,以及培训销售人员。产品经理跨职能工作,利用创造性和技术技能的结合,成功地推出产品。产品经理需要深厚的产品专业知识。 + +**所需技术技能:** + + * 掌握产品知识,并且会配置或运行演示模型 + * 与产品相关的技术生态系统知识 + * 分析和研究技能 + +**适合以下人群:** + + * 享受制定战略和规划下一步的工作 + * 在不同的人的需求中可以看到一条共同的线索 + * 能够清楚地表达业务需求和要求 + * 喜欢描述原因 + +### 数据分析师 + +数据分析师负责收集和解释数据,以帮助推动业务决策,如是否进入新市场、瞄准哪些客户或在何处投资。这个角色需要知道如何使用所有可用的潜在数据来做出决策。我们常常希望把事情简单化,而数据分析往往过于简单化。获取正确的信息并不像编写查询 `select all limit 10` 来获取前 10 行那么简单。你需要知道要加入哪些表。你需要知道如何分类。你需要知道是否需要在运行查询之前或之后以某种方式清理数据。 + +**所需技术技能:** + + * 了解 SQL、Python 和 R + * 能够看到和提取数据中的样本 + * 了解事物如何端到端运行 + * 批判性思维 + * 机器学习 + +**适合以下人群:** + + * 享受解决问题的乐趣 + * 渴望学习和提出问题 + +### 开发者关系 + +[开发者关系][6] 是一门相对较新的技术学科。它包括 [开发者代言人][7] developer advocate开发者传道者developer evangelist开发者营销developer marketing等角色。这些角色要求你与开发人员沟通,与他们建立关系,并帮助他们提高工作效率。你向公司倡导开发者的需求,并向开发者代表公司。开发者关系可以包括撰写文章、创建教程、录制播客、在会议上发言以及创建集成和演示。有人说你需要做过开发才能进入开发者关系。我没有走那条路,我知道很多人没有。 + +**所需技术技能:** + +这些将高度依赖于公司和具体角色。你需要部分技能(不是全部)取决于你自己。 + + * 了解与产品相关的技术概念 + * 写作 + * 教程和播客的视频和音频编辑 + * 说话 + +**适合以下人群:** + + * 有同情心,想要教导和授权他人 + * 可以为他人辩护 + * 你很有创意 + +### 无限的可能性 + +这并不是一个完整的清单,并没有列出技术领域中所有的非工程类角色,而是一些不喜欢每天编写代码的人可以尝试的工作。如果你对科技职业感兴趣,看看你的技能和什么角色最适合。可能性是无穷的。为了帮助你完成旅程,在本系列的最后一篇文章中,我将与这些角色的人分享一些建议。 + +-------------------------------------------------------------------------------- + +via: https://opensource.com/article/21/2/non-engineering-jobs-tech + +作者:[Dawn Parzych][a] +选题:[lujun9972][b] +译者:[Chao-zhi](https://github.com/Chao-zhi) +校对:[wxy](https://github.com/wxy) + +本文由 [LCTT](https://github.com/LCTT/TranslateProject) 原创编译,[Linux中国](https://linux.cn/) 荣誉推出 + +[a]: https://opensource.com/users/dawnparzych +[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://linux.cn/article-13168-1.html +[3]: https://twitter.com/elchefe/status/1338933320147750915?ref_src=twsrc%5Etfw +[4]: https://opensource.com/article/17/5/technical-writing-job-interview-tips +[5]: https://opensource.com/article/20/2/product-management-open-source-company +[6]: https://www.marythengvall.com/blog/2019/5/22/what-is-developer-relations-and-why-should-you-care +[7]: https://opensource.com/article/20/10/open-source-developer-advocates diff --git a/published/202103/20210220 Run your favorite Windows applications on Linux.md b/published/202103/20210220 Run your favorite Windows applications on Linux.md new file mode 100644 index 0000000000..4ecc4a59e2 --- /dev/null +++ b/published/202103/20210220 Run your favorite Windows applications on Linux.md @@ -0,0 +1,98 @@ +[#]: collector: (lujun9972) +[#]: translator: (robsean) +[#]: reviewer: (wxy) +[#]: publisher: (wxy) +[#]: url: (https://linux.cn/article-13184-1.html) +[#]: subject: (Run your favorite Windows applications on Linux) +[#]: via: (https://opensource.com/article/21/2/linux-wine) +[#]: author: (Seth Kenlon https://opensource.com/users/seth) + +在 Linux 上运行你最喜欢的 Windows 应用程序 +====== + +> WINE 是一个开源项目,它可以协助很多 Windows 应用程序在 Linux 上运行,就好像它们是原生程序一样。 + +![](https://img.linux.net.cn/data/attachment/album/202103/07/231159kwsn2snlilwbs9ns.jpg) + +在 2021 年,有很多比以往更喜欢 Linux 的原因。在这系列中,我将分享使用 Linux 的 21 种原因。这里是如何使用 WINE 来实现从 Windows 到 Linux 的无缝切换。 + +你有只能在 Windows 上运行的应用程序吗?那一个应用程序阻碍你切换到 Linux 的唯一因素吗?如果是这样的话,你将会很高兴知道 WINE,这是一个开源项目,它几乎重新发明了关键的 Windows 库,使为 Windows 编译的应用程序可以在 Linux 上运行。 + +WINE 代表着“Wine Is Not an Emulator” ,它指的是驱动这项技术的代码。开源开发者从 1993 年就开始致力将应用程序的任何传入 Windows API 调用翻译为 [POSIX][2] 调用。 + +这是一个令人十分惊讶的编程壮举,尤其是考虑到这个项目是独立运行的,没有来自微软的帮助(至少可以这样说),但是也有局限性。一个应用程序偏离 Windows API 的 “内核” 越远,WINE 就越不能预期应用程序的请求。有一些供应商可以弥补这一点,尤其是 [Codeweavers][3] 和 [Valve Software][4]。在需要翻译应用程序的制作者和翻译的人们及公司之间没有协调配合,因此,比如说一个更新的软件作品和从 [WINE 总部][5] 获得完美适配状态之间可能会有一些时间上的滞后。 + +然而,如果你想在 Linux 上运行一个著名的 Windows 应用程序,WINE 可能已经为它准备好了可能性。 + +### 安装 WINE + +你可以从你的 Linux 发行版的软件包存储库中安装 WINE 。在 Fedora、CentOS Stream 或 RHEL 系统上: + +``` +$ sudo dnf install wine +``` + +在 Debian、Linux Mint、Elementary 及相似的系统上: + +``` +$ sudo apt install wine +``` + +WINE 不是一个你自己启动的应用程序。当启动一个 Windows 应用程序时,它是一个被调用的后端。你与 WINE 的第一次交互很可能就发生在你启动一个 Windows 应用程序的安装程序时。 + +### 安装一个应用程序 + +[TinyCAD][6] 是一个极好的用于设计电路的开源应用程序,但是它仅在 Windows 上可用。虽然它是一个小型的应用程序,但是它确实包含一些 .NET 组件,因此应该能对 WINE 进行一些压力测试。 + +首先,下载 TinyCAD 的安装程序。Windows 安装程序通常都是这样,它是一个 `.exe` 文件。在下载后,双击文件来启动它。 + +![WINE TinyCAD 安装向导][7] + +*TinyCAD 的 WINE 安装向导* + +像你在 Windows 上一样逐步完成安装程序。通常最好接受默认选项,尤其是与 WINE 有关的地方。WINE 环境基本上是独立的,隐藏在你的硬盘驱动器上的一个 `drive_c` 目录中,作为 Windows 应用程序使用的一个文件系统的仿真根目录。 + +![WINE TinyCAD 安装和目标驱动器][8] + +*WINE TinyCAD 目标驱动器* + +安装完成后,应用程序通常会为你提供启动机会。如果你正准备测试一下它的话,启动应用程序。 + +### 启动 Windows 应用程序 + +除了在安装后的第一次启动外,在正常情况下,你启动一个 WINE 应用程序的方式与你启动一个本地 Linux 应用程序相同。不管你使用应用程序菜单、活动屏幕或者只是在运行器中输入应用程序的名称,在 WINE 中运行的桌面 Windows 应用程序都会被视为在 Linux 上的本地应用程序。 + +![TinyCAD 使用 WINE 运行][9] + +*通过 WINE 的支持来运行 TinyCAD* + +### 当 WINE 失败时 + +我在 WINE 中的大多数应用程序,包括 TinyCAD ,都能如期运行。不过,也会有例外。在这些情况下,你可以等几个月来查看 WINE 开发者 (或者,如果是一款游戏,就等候 Valve Software)是否进行追加修补,或者你可以联系一个像 Codeweavers 这样的供应商来查看他们是否出售对你所需要的应用程序的服务支持。 + +### WINE 是种欺骗,但它用于正道 + +一些 Linux 用户觉得:如果你使用 WINE 的话,你就是在“欺骗” Linux。它可能会让人有这种感觉,但是 WINE 是一个开源项目,它使用户能够切换到 Linux ,并且仍然能够运行工作或爱好所需的应用程序。如果 WINE 解决了你的问题,让你使用 Linux,那就使用它,并拥抱 Linux 的灵活性。 + +-------------------------------------------------------------------------------- + +via: https://opensource.com/article/21/2/linux-wine + +作者:[Seth Kenlon][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://opensource.com/users/seth +[b]: https://github.com/lujun9972 +[1]: https://opensource.com/sites/default/files/styles/image-full-size/public/lead-images/browser_screen_windows_files.png?itok=kLTeQUbY (Computer screen with files or windows open) +[2]: https://opensource.com/article/19/7/what-posix-richard-stallman-explains +[3]: https://www.codeweavers.com/crossover +[4]: https://github.com/ValveSoftware/Proton +[5]: http://winehq.org +[6]: https://sourceforge.net/projects/tinycad/ +[7]: https://opensource.com/sites/default/files/wine-tinycad-install.jpg +[8]: https://opensource.com/sites/default/files/wine-tinycad-drive_0.jpg +[9]: https://opensource.com/sites/default/files/wine-tinycad-running.jpg diff --git a/published/202103/20210223 A guide to Python virtual environments with virtualenvwrapper.md b/published/202103/20210223 A guide to Python virtual environments with virtualenvwrapper.md new file mode 100644 index 0000000000..35b591cf1b --- /dev/null +++ b/published/202103/20210223 A guide to Python virtual environments with virtualenvwrapper.md @@ -0,0 +1,126 @@ +[#]: collector: (lujun9972) +[#]: translator: (geekpi) +[#]: reviewer: (wxy) +[#]: publisher: (wxy) +[#]: url: (https://linux.cn/article-13174-1.html) +[#]: subject: (A guide to Python virtual environments with virtualenvwrapper) +[#]: via: (https://opensource.com/article/21/2/python-virtualenvwrapper) +[#]: author: (Ben Nuttall https://opensource.com/users/bennuttall) + +使用 virtualenvwrapper 构建 Python 虚拟环境 +====== + +> 虚拟环境是安全地使用不同版本的 Python 和软件包组合的关键。 + +![](https://img.linux.net.cn/data/attachment/album/202103/04/072251y8wkis7c40i8crkw.jpg) + +Python 对管理虚拟环境的支持,已经提供了一段时间了。Python 3.3 甚至增加了内置的 `venv` 模块,用于创建没有第三方库的环境。Python 程序员可以使用几种不同的工具来管理他们的环境,我使用的工具叫做 [virtualenvwrapper][2]。 + +虚拟环境是将你的 Python 项目及其依赖关系与你的系统安装的 Python 分离的一种方式。如果你使用的是基于 macOS 或 Linux 的操作系统,它很可能在安装中附带了一个 Python 版本,事实上,它很可能依赖于那个特定版本的 Python 才能正常运行。但这是你的计算机,你可能想用它来达到自己的目的。你可能需要安装另一个版本的 Python,而不是操作系统提供的版本。你可能还需要安装一些额外的库。尽管你可以升级你的系统 Python,但不推荐这样做。你也可以安装其他库,但你必须注意不要干扰系统所依赖的任何东西。 + +虚拟环境是创建隔离的关键,你需要安全地修改不同版本的 Python 和不同组合的包。它们还允许你为不同的项目安装同一库的不同版本,这解决了在相同环境满足所有项目需求这个不可能的问题。 + +为什么选择 `virtualenvwrapper` 而不是其他工具?简而言之: + + * 与 `venv` 需要在项目目录内或旁边有一个 `venv` 目录不同,`virtualenvwrapper` 将所有环境保存在一个地方:默认在 `~/.virtualenvs` 中。 + * 它提供了用于创建和激活环境的命令,而且激活环境不依赖于找到正确的 `activate` 脚本。它只需要(从任何地方)`workon projectname`而不需要 `source ~/Projects/flashylights-env/bin/activate`。  + +### 开始使用 + +首先,花点时间了解一下你的系统 Python 是如何配置的,以及 `pip` 工具是如何工作的。 + +以树莓派系统为例,该系统同时安装了 Python 2.7 和 3.7。它还提供了单独的 `pip` 实例,每个版本一个: + + * 命令 `python` 运行 Python 2.7,位于 `/usr/bin/python`。 + * 命令 `python3` 运行 Python 3.7,位于 `/usr/bin/python3`。 + * 命令 `pip` 安装 Python 2.7 的软件包,位于 `/usr/bin/pip`。 + * 命令 `pip3` 安装 Python 3.7 的包,位于 `/usr/bin/pip3`。 + +![Python commands on Raspberry Pi][3] + +在开始使用虚拟环境之前,验证一下使用 `python` 和 `pip` 命令的状态是很有用的。关于你的 `pip` 实例的更多信息可以通过运行 `pip debug` 或 `pip3 debug` 命令找到。 + +在我运行 Ubuntu Linux 的电脑上几乎是相同的信息(除了它是 Python 3.8)。在我的 Macbook 上也很相似,除了唯一的系统 Python 是 2.6,而我用 `brew` 安装 Python 3.8,所以它位于 `/usr/local/bin/python3`(和 `pip3` 一起)。 + +### 安装 virtualenvwrapper + +你需要使用系统 Python 3 的 `pip` 安装 `virtualenvwrapper`: + + +``` +sudo pip3 install virtualenvwrapper +``` + +下一步是配置你的 shell 来加载 `virtualenvwrapper` 命令。你可以通过编辑 shell 的 RC 文件(例如 `.bashrc`、`.bash_profile` 或 `.zshrc`)并添加以下几行: + +``` +export VIRTUALENVWRAPPER_PYTHON=/usr/bin/python3 +export VIRTUALENVWRAPPER_VIRTUALENV=/usr/local/bin/virtualenv +source /usr/local/bin/virtualenvwrapper.sh +``` + +![bashrc][5] + +如果你的 Python 3 位于其他地方,请根据你的设置修改第一行。 + +关闭你的终端,然后重新打开它,这样才能生效。第一次打开终端时,你应该看到 `virtualenvwrapper` 的一些输出。这只会发生一次,因为一些目录是作为设置的一部分被创建的。 + +现在你应该可以输入 `mkvirtualenv --version` 命令来验证 `virtualenvwrapper` 是否已经安装。 + +### 创建一个新的虚拟环境 + +假设你正在进行一个名为 `flashylights` 的项目。要用这个名字创建一个虚拟环境,请运行该命令: + +``` +mkvirtualenv flashylights +``` + +环境已经创建并激活,所以你会看到 `(flashlylights)` 出现在你的提示前: + +![Flashylights prompt][6] + +现在环境被激活了,事情发生了变化。`python` 现在指向一个与你之前在系统中识别的 Python 实例完全不同的 Python 实例。它为你的环境创建了一个目录,并在其中放置了 Python 3 二进制文件、pip 命令等的副本。输入 `which python` 和 `which pip` 来查看它们的位置。 + +![Flashylights command][7] + +如果你现在运行一个 Python 程序,你可以用 `python` 代替 `python3` 来运行,你可以用 `pip` 代替 `pip3`。你使用 `pip`安装的任何包都将只安装在这个环境中,它们不会干扰你的其他项目、其他环境或系统安装。 + +要停用这个环境,运行 `deactivate` 命令。要重新启用它,运行 `workon flashylights`。 + +你可以用 `workon` 或使用 `lsvirtualenv` 列出所有可用的环境。你可以用 `rmvirtualenv flashylights` 删除一个环境。 + +在你的开发流程中添加虚拟环境是一件明智的事情。根据我的经验,它可以防止我在系统范围内安装我正在试验的库,这可能会导致问题。我发现 `virtualenvwrapper` 是最简单的可以让我进入流程的方法,并无忧无虑地管理我的项目环境,而不需要考虑太多,也不需要记住太多命令。 + +### 高级特性 + + * 你可以在你的系统上安装多个 Python 版本(例如,在 Ubuntu 上使用 [deadsnakes PPA][8]),并使用该版本创建一个虚拟环境,例如,`mkvirtualenv -p /usr/bin/python3.9 myproject`。 + * 可以在进入和离开目录时自动激活、停用。 + * 你可以使用 `postmkvirtualenv` 钩子在每次创建新环境时安装常用工具。 + +更多提示请参见[文档][9]。 + +_本文基于 Ben Nuttall 在 [Tooling Tuesday 上关于 virtualenvwrapper 的帖子][10],经许可后重用。_ + +-------------------------------------------------------------------------------- + +via: https://opensource.com/article/21/2/python-virtualenvwrapper + +作者:[Ben Nuttall][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/bennuttall +[b]: https://github.com/lujun9972 +[1]: https://opensource.com/sites/default/files/styles/image-full-size/public/lead-images/coffee_python.jpg?itok=G04cSvp_ (Python in a coffee cup.) +[2]: https://virtualenvwrapper.readthedocs.io/en/latest/index.html +[3]: https://opensource.com/sites/default/files/uploads/pi-python-cmds.png (Python commands on Raspberry Pi) +[4]: https://creativecommons.org/licenses/by-sa/4.0/ +[5]: https://opensource.com/sites/default/files/uploads/bashrc.png (bashrc) +[6]: https://opensource.com/sites/default/files/uploads/flashylights-activated-prompt.png (Flashylights prompt) +[7]: https://opensource.com/sites/default/files/uploads/flashylights-activated-cmds.png (Flashylights command) +[8]: https://tooling.bennuttall.com/deadsnakes/ +[9]: https://virtualenvwrapper.readthedocs.io/en/latest/tips.html +[10]: https://tooling.bennuttall.com/virtualenvwrapper/ diff --git a/published/202103/20210224 Check Your Disk Usage Using ‘duf- Terminal Tool -Friendly Alternative to du and df commands.md b/published/202103/20210224 Check Your Disk Usage Using ‘duf- Terminal Tool -Friendly Alternative to du and df commands.md new file mode 100644 index 0000000000..4a72a2ac46 --- /dev/null +++ b/published/202103/20210224 Check Your Disk Usage Using ‘duf- Terminal Tool -Friendly Alternative to du and df commands.md @@ -0,0 +1,117 @@ +[#]: collector: (lujun9972) +[#]: translator: (geekpi) +[#]: reviewer: (wxy) +[#]: publisher: (wxy) +[#]: url: (https://linux.cn/article-13165-1.html) +[#]: subject: (Check Your Disk Usage Using ‘duf’ Terminal Tool [Friendly Alternative to du and df commands]) +[#]: via: (https://itsfoss.com/duf-disk-usage/) +[#]: author: (Ankush Das https://itsfoss.com/author/ankush/) + +使用 duf 终端工具检查你的磁盘使用情况 +====== + +![](https://img.linux.net.cn/data/attachment/album/202103/01/091533qkx95xomkzfmsdxo.jpg) + +> `duf` 是一个终端工具,旨在增强传统的 Linux 命令 `df` 和 `du`。它可以让你轻松地检查可用磁盘空间,对输出进行分类,并以用户友好的方式呈现。 + +### duf:一个用 Golang 编写的跨平台磁盘使用情况工具 + +![][1] + +在我知道这个工具之前,我更喜欢使用像 [Stacer][2] 这样的 GUI 程序或者预装的 GNOME 磁盘使用情况程序来 [检查可用的磁盘空间][3] 和系统的磁盘使用量。 + +不过,[duf][4] 似乎是一个有用的终端工具,可以检查磁盘使用情况和可用空间,它是用 [Golang][5] 编写的。Abhishek 建议我试一试它,但我对它很感兴趣,尤其是考虑到我目前正在学习 Golang,真是太巧了! + +无论你是终端大师还是只是一个对终端不适应的初学者,它都相当容易使用。当然,它比 [检查磁盘空间利用率命令 df][6] 更容易理解。 + +在你把它安装到你的系统上之前,让我重点介绍一下它的一些主要功能和用法。 + +### duf 的特点 + +![][7] + + * 提供所有挂载设备的概览且易于理解。 + * 能够指定目录/文件名并检查该挂载点的可用空间。 + * 更改/删除输出中的列。 + * 列出 [inode][8] 信息。 + * 输出排序。 + * 支持 JSON 输出。 + * 如果不能自动检测终端的主题,可以指定主题。 + +### 在 Linux 上安装和使用 duf + +你可以在 [AUR][9] 中找到一个 Arch Linux 的软件包。如果你使用的是 [Nix 包管理器][10],也可以找到一个包。 + +对于基于 Debian 的发行版和 RPM 包,你可以去它的 [GitHub 发布区][11] 中获取适合你系统的包。 + +它也适用于 Windows、Android、macOS 和 FreeBSD。 + +在我这里,我需要 [安装 DEB 包][12],然后就可以使用了。安装好后,使用起来很简单,你只要输入: + +``` +duf +``` + +这应该会给你提供所有本地设备、已挂载的任何云存储设备以及任何其他特殊设备(包括临时存储位置等)的详细信息。 + +如果你想一目了然地查看所有 `duf` 的可用命令,你可以输入: + +``` +duf --help +``` + +![][13] + +例如,如果你只想查看本地连接设备的详细信息,而不是其他的,你只需要输入: + +``` +duf --only local +``` + +另一个例子是根据大小按特定顺序对输出进行排序,下面是你需要输入的内容: + +``` +duf --sort size +``` + +输出应该是像这样的: + +![][14] + +你可以探索它的 [GitHub 页面][4],以获得更多关于额外命令和安装说明的信息。 + +- [下载 duf][4] + +### 结束语 + +我发现终端工具 `duf` 相当方便,可以在不需要使用 GUI 程序的情况下,随时查看可用磁盘空间或使用情况。 + +你知道有什么类似的工具吗?欢迎在下面的评论中告诉我你的想法。 + +-------------------------------------------------------------------------------- + +via: https://itsfoss.com/duf-disk-usage/ + +作者:[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/2021/02/duf-screenshot.jpg?resize=800%2C481&ssl=1 +[2]: https://itsfoss.com/optimize-ubuntu-stacer/ +[3]: https://itsfoss.com/check-free-disk-space-linux/ +[4]: https://github.com/muesli/duf +[5]: https://golang.org/ +[6]: https://linuxhandbook.com/df-command/ +[7]: https://i2.wp.com/itsfoss.com/wp-content/uploads/2021/02/duf-local.jpg?resize=800%2C195&ssl=1 +[8]: https://linuxhandbook.com/inode-linux/ +[9]: https://itsfoss.com/aur-arch-linux/ +[10]: https://github.com/NixOS/nixpkgs +[11]: https://github.com/muesli/duf/releases +[12]: https://itsfoss.com/install-deb-files-ubuntu/ +[13]: https://i1.wp.com/itsfoss.com/wp-content/uploads/2021/02/duf-commands.jpg?resize=800%2C443&ssl=1 +[14]: https://i0.wp.com/itsfoss.com/wp-content/uploads/2021/02/duf-sort-example.jpg?resize=800%2C365&ssl=1 diff --git a/published/202103/20210224 Set your path in FreeDOS.md b/published/202103/20210224 Set your path in FreeDOS.md new file mode 100644 index 0000000000..00ab8c9daf --- /dev/null +++ b/published/202103/20210224 Set your path in FreeDOS.md @@ -0,0 +1,161 @@ +[#]: subject: (Set your path in FreeDOS) +[#]: via: (https://opensource.com/article/21/2/path-freedos) +[#]: author: (Kevin O'Brien https://opensource.com/users/ahuka) +[#]: collector: (lujun9972) +[#]: translator: (robsean) +[#]: reviewer: (wxy) +[#]: publisher: (wxy) +[#]: url: (https://linux.cn/article-13218-1.html) + +在 FreeDOS 中设置你的路径 +====== + +> 学习 FreeDOS 路径的知识,如何设置它,并且如何使用它。 + +![查看职业生涯地图][1] + +你在开源 [FreeDOS][2] 操作系统中所做的一切工作都是通过命令行完成的。命令行以一个 _提示符_ 开始,这是计算机说法的方式,“我准备好了。请给我一些事情来做。”你可以配置你的提示符的外观,但是默认情况下,它是: + +``` +C:\> +``` + +从命令行中,你可以做两件事:运行一个内部命令或运行一个程序。外部命令是在你的 `FDOS` 目录中可找到的以单独文件形式存在的程序,以便运行程序包括运行外部命令。它也意味着你可以使用你的计算机运行应用程序软件来做一些东西。你也可以运行一个批处理文件,但是在这种情况下,你所做的全部工作就变成了运行批处理文件中所列出的一系列命令或程序。 + +### 可执行应用程序文件 + +FreeDOS 可以运行三种类型的应用程序文件: + + 1. **COM** 是一个用机器语言写的,且小于 64 KB 的文件。 + 2. **EXE** 也是一个用机器语言写的文件,但是它可以大于 64 KB 。此外,在 EXE 文件的开头部分有信息,用于告诉 DOS 系统该文件是什么类型的以及如何加载和运行。 + 3. **BAT** 是一个使用文本编辑器以 ASCII 文本格式编写的 _批处理文件_ ,其中包含以批处理模式执行的 FreeDOS 命令。这意味着每个命令都会按顺序执行到文件的结尾。 + +如果你所输入的一个文件名称不能被 FreeDOS 识别为一个内部命令或一个程序,你将收到一个错误消息 “Bad command or filename” 。如果你看到这个错误,它意味着会是下面三种情况中的其中一种: + + 1. 由于某些原因,你所给予的名称是错误的。你可能拼错了文件名称,或者你可能正在使用错误的命令名称。检查名称和拼写,并再次尝试。 + 2. 可能你正在尝试运行的程序并没有安装在计算机上。请确认它已经安装了。 + 3. 文件确实存在,但是 FreeDOS 不知道在哪里可以找到它。 + +在清单上的最后一项就是这篇文章的主题,它被称为路径。如果你已经习惯于使用 Linux 或 Unix ,你可能已经理解 [PATH 变量][3] 的概念。如果你是命令行的新手,那么路径是一个非常重要的足以让你舒适的东西。 + +### 路径 + +当你输入一个可执行应用程序文件的名称时,FreeDOS 必须能找到它。FreeDOS 会在一个具体指定的位置层次结构中查找文件: + + 1. 首先,它查找当前驱动器的活动目录(称为 _工作目录_)。如果你正在目录 `C:\FDOS` 中,接着,你输入名称 `FOOBAR.EXE`,FreeDOS 将在 `C:\FDOS` 中查找带有这个名称的文件。你甚至不需要输入完整的名称。如果你输入 `FOOBAR` ,FreeDOS 将查找任何带有这个名称的可执行文件,不管它是 `FOOBAR.EXE`,`FOOBAR.COM`,或 `FOOBAR.BAT`。只要 FreeDOS 能找到一个匹配该名称的文件,它就会运行该可执行文件。 + 2. 如果 FreeDOS 不能找到你所输入名称的文件,它将查询被称为 `PATH` 的一些东西。每当 DOS 不能在当前活动命令中找到文件时,会指示 DOS 检查这个列表中目录。 + +你可以随时使用 `path` 命令来查看你的计算机的路径。只需要在 FreeDOS 提示符中输入 `path` ,FreeDOS 就会返回你的路径设置: + +``` +C:\>path +PATH=C:\FDOS\BIN +``` + +第一行是提示符和命令,第二行是计算机返回的东西。你可以看到 DOS 第一个查看的位置就是位于 `C` 驱动器上的 `FDOS\BIN`。如果你想更改你的路径,你可以输入一个 `path` 命令以及你想使用的新路径: + +``` +C:\>path=C:\HOME\BIN;C:\FDOS\BIN +``` + +在这个示例中,我设置我的路径到我个人的 `BIN` 文件夹,我把它放在一个叫 `HOME` 的自定义目录中,然后再设置为 `FDOS/BIN`。现在,当你检查你的路径时: + +``` +C:\>path +PATH=C:\HOME\BIN;C:\FDOS\BIN +``` + +路径设置是按所列目录的顺序处理的。 + +你可能会注意到有一些字符是小写的,有一些字符是大写的。你使用哪一种都真的不重要。FreeDOS 是不区分大小写的,并且把所有的东西都作为大写字母对待。在内部,FreeDOS 使用的全是大写字母,这就是为什么你看到来自你命令的输出都是大写字母的原因。如果你以小写字母的形式输入命令和文件名称,在一个转换器将自动转换它们为大写字母后,它们将被执行。 + +输入一个新的路径来替换先前设置的路径。 + +### autoexec.bat 文件 + +你可能遇到的下一个问题的是 FreeDOS 默认使用的第一个路径来自何处。这与其它一些重要的设置一起定义在你的 `C` 驱动器的根目录下的 `AUTOEXEC.BAT` 文件中。这是一个批处理文件,它在你启动 FreeDOS 时会自动执行(由此得名)。你可以使用 FreeDOS 程序 `EDIT` 来编辑这个文件。为查看或编辑这个文件的内容,输入下面的命令: + +``` +C:\>edit autoexec.bat +``` + +这一行出现在顶部附近: + +``` +SET PATH=%dosdir%\BIN +``` + +这一行定义默认路径的值。 + +在你查看 `AUTOEXEC.BAT` 后,你可以通过依次按下面的按键来退出 EDIT 应用程序: + + 1. `Alt` + 2. `f` + 3. `x` + +你也可以使用键盘快捷键 `Alt+X`。 + +### 使用完整的路径 + +如果你在你的路径中忘记包含 `C:\FDOS\BIN` ,那么你将不能快速访问存储在这里的任何应用程序,因为 FreeDOS 不知道从哪里找到它们。例如,假设我设置我的路径到我个人应用程序集合: + +``` +C:\>path=C:\HOME\BIN +``` + +内置在命令行中应用程序仍然能正常工作: + +``` +C:\cd HOME +C:\HOME>dir +ARTICLES +BIN +CHEATSHEETS +GAMES +DND +``` + +不过,外部的命令将不能运行: + +``` +C:HOME\ARTICLES>BZIP2 -c example.txt +Bad command or filename - "BZIP2" +``` + +通过提供命令的一个 _完整路径_ ,你可以总是执行一个在你的系统上且不在你的路径中的命令: + +``` +C:HOME\ARTICLES>C:\FDOS\BIN\BZIP2 -c example.txt +C:HOME\ARTICLES>DIR +example.txb +``` + +你可以使用同样的方法从外部介质或其它目录执行应用程序。 + +### FreeDOS 路径 + +通常情况下,你很可能希望在路径中保留 `C:\PDOS\BIN` ,因为它包含所有使用 FreeDOS 分发的默认应用程序。 + +除非你更改 `AUTOEXEC.BAT` 中的路径,否则将在重新启动后恢复默认路径。 + +现在,你知道如何在 FreeDOS 中管理你的路径,你能够以最适合你的方式了执行命令和维护你的工作环境。 + +_致谢 [DOS 课程 5: 路径][4] (在 CC BY-SA 4.0 协议下发布) 为本文提供的一些信息。_ + +-------------------------------------------------------------------------------- + +via: https://opensource.com/article/21/2/path-freedos + +作者:[Kevin O'Brien][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://opensource.com/users/ahuka +[b]: https://github.com/lujun9972 +[1]: https://opensource.com/sites/default/files/styles/image-full-size/public/lead-images/career_journey_road_gps_path_map_520.png?itok=PpL6jJgY (Looking at a map for career journey) +[2]: https://www.freedos.org/ +[3]: https://opensource.com/article/17/6/set-path-linux +[4]: https://www.ahuka.com/dos-lessons-for-self-study-purposes/dos-lesson-5-the-path/ diff --git a/published/202103/20210225 4 new open source licenses.md b/published/202103/20210225 4 new open source licenses.md new file mode 100644 index 0000000000..56cdc56402 --- /dev/null +++ b/published/202103/20210225 4 new open source licenses.md @@ -0,0 +1,59 @@ +[#]: subject: (4 new open source licenses) +[#]: via: (https://opensource.com/article/21/2/osi-licenses-cal-cern-ohl) +[#]: author: (Pam Chestek https://opensource.com/users/pchestek) +[#]: collector: (lujun9972) +[#]: translator: (wyxplus) +[#]: reviewer: (wxy) +[#]: publisher: (wxy) +[#]: url: (https://linux.cn/article-13224-1.html) + +四个新式开源许可证 +====== + +> 让我们来看看 OSI 最新批准的加密自治许可证和 CERN 开源硬件许可协议。 + +![](https://img.linux.net.cn/data/attachment/album/202103/21/221014mw8lhxox0kkjk04z.jpg) + +作为 [开源定义][2]Open Source Defintion(OSD)的管理者,[开源促进会][3]Open Source Initiative(OSI)20 年来一直在批准“开源”许可证。这些许可证是开源软件生态系统的基础,可确保每个人都可以使用、改进和共享软件。当一个许可证获批为“开源”时,是因为 OSI 认为该许可证可以促进相互的协作和共享,从而使得每个参与开源生态的人获益。 + +在过去的 20 年里,世界发生了翻天覆地的变化。现如今,软件以新的甚至是无法想象的方式在被使用。OSI 已经预料到,曾经被人们所熟知的开源许可证现已无法满足如今的要求。因此,许可证管理者已经加强了工作,为更广泛的用途提交了几个新的许可证。OSI 所面临的挑战是在评估这些新的许可证概念是否会继续推动共享和合作,是否被值得称为“开源”许可证,最终 OSI 批准了一些用于特殊领域的新式许可证。 + +### 四个新式许可证 + +第一个是 [加密自治许可证][4]Cryptographic Autonomy License(CAL)。该许可证是为分布式密码应用程序而设计的。此许可证所解决的问题是,现有的开源许可证无法保证开放性,因为如果没有义务也与其他对等体共享数据,那么一个对等体就有可能损害网络的运行。因此,除了是一个强有力的版权保护许可外,CAL 还包括向第三方提供独立使用和修改软件所需的权限和资料的义务,而不会让第三方有数据或功能的损失。 + +随着越来越多的人使用加密结构进行点对点共享,那么更多的开发人员发现自己需要诸如 CAL 之类的法律工具也就不足为奇了。 OSI 的两个邮件列表 License-Discuss 和 License-Review 上的社区,讨论了拟议的新开源许可证,并询问了有关此许可证的诸多问题。我们希望由此产生的许可证清晰易懂,并希望对其他开源从业者有所裨益。 + +接下来是,欧洲核研究组织(CERN)提交的 CERN 开放硬件许可证Open Hardware Licence(OHL)系列许可证以供审议。它包括三个许可证,其主要用于开放硬件,这是一个与开源软件相似的开源访问领域,但有其自身的挑战和细微差别。硬件和软件之间的界线现已变得相当模糊,因此应用单独的硬件和软件许可证变得越来越困难。欧洲核子研究组织(CERN)制定了一个可以确保硬件和软件自由的许可证。 + +OSI 可能在开始时就没考虑将开源硬件许可证添加到其开源许可证列表中,但是世界早已发生变革。因此,尽管 CERN 许可证中的措词涵盖了硬件术语,但它也符合 OSI 认可的所有开源软件许可证的条件。 + +CERN 开源硬件许可证包括一个 [宽松许可证][5]、一个 [弱互惠许可证][6] 和一个 [强互惠许可证][7]。最近,该许可证已被一个国际研究项目采用,该项目正在制造可用于 COVID-19 患者的简单、易于生产的呼吸机。 + +### 了解更多 + +CAL 和 CERN OHL 许可证是针对特殊用途的,并且 OSI 不建议把它们用于其它领域。但是 OSI 想知道这些许可证是否会按预期发展,从而有助于在较新的计算机领域中培育出健壮的开源生态。 + +可以从 OSI 获得关于 [许可证批准过程][8] 的更多信息。 + +-------------------------------------------------------------------------------- + +via: https://opensource.com/article/21/2/osi-licenses-cal-cern-ohl + +作者:[Pam Chestek][a] +选题:[lujun9972][b] +译者:[wyxplus](https://github.com/wyxplus) +校对:[wxy](https://github.com/wxy) + +本文由 [LCTT](https://github.com/LCTT/TranslateProject) 原创编译,[Linux中国](https://linux.cn/) 荣誉推出 + +[a]: https://opensource.com/users/pchestek +[b]: https://github.com/lujun9972 +[1]: https://opensource.com/sites/default/files/styles/image-full-size/public/lead-images/LAW_lawdotgov3.png?itok=e4eFKe0l "Law books in a library" +[2]: https://opensource.org/osd +[3]: https://opensource.org/ +[4]: https://opensource.org/licenses/CAL-1.0 +[5]: https://opensource.org/CERN-OHL-P +[6]: https://opensource.org/CERN-OHL-W +[7]: https://opensource.org/CERN-OHL-S +[8]: https://opensource.org/approval diff --git a/published/202103/20210226 3 Linux terminals you need to try.md b/published/202103/20210226 3 Linux terminals you need to try.md new file mode 100644 index 0000000000..8a70f27572 --- /dev/null +++ b/published/202103/20210226 3 Linux terminals you need to try.md @@ -0,0 +1,81 @@ +[#]: subject: (3 Linux terminals you need to try) +[#]: via: (https://opensource.com/article/21/2/linux-terminals) +[#]: author: (Seth Kenlon https://opensource.com/users/seth) +[#]: collector: (lujun9972) +[#]: translator: (geekpi) +[#]: reviewer: (wxy) +[#]: publisher: (wxy) +[#]: url: (https://linux.cn/article-13186-1.html) + +值得尝试的 3 个 Linux 终端 +====== + +> Linux 让你能够选择你喜欢的终端界面,而不是它强加的界面。 + +![](https://img.linux.net.cn/data/attachment/album/202103/09/054053zum6n77cpnnug0x1.jpg) + +在 2021 年,人们喜欢 Linux 的理由比以往任何时候都多。在这个系列中,我将分享 21 个使用 Linux 的不同理由。能够选择自己的终端是使用 Linux 的一个重要原因。 + +很多人认为一旦你用过一个终端界面,你就已经用过所有的终端了。但喜欢终端的用户都知道,它们之间有一些细微但重要的区别。本文将介绍我最喜欢的三种。 + +不过在深入研究它们之前,先要了解 shell 和终端terminal之间的区别。终端(技术上说是终端模拟器terminal emulator,因为终端曾经是物理硬件设备)是一个在桌面上的窗口中运行的应用。shell 是在终端窗口中对你可见的引擎。流行的 shell 有 [Bash][2]、[tcsh][3] 和 [zsh][4],它们都在终端中运行。 + +在现代 Linux 上几乎不用说,至少本文中所有的终端都有标签界面。 + +### Xfce 终端 + +![Xfce ][5] + +[轻量级 Xfce 桌面][7] 提供了一个轻量级的终端,很好地平衡了功能和简单性。它提供了对 shell 的访问(如预期的那样),并且它可以轻松访问几个重要的配置选项。你可以设置当你双击文本时哪些字符会断字、选择你的默认字符编码,并禁用终端窗口的 Alt 快捷方式,这样你最喜欢的 Bash 快捷方式就会传递到 shell。你还可以设置字体和新的颜色主题,或者从常用预设列表中加载颜色主题。它甚至在顶部有一个可选的工具栏,方便你访问你最喜欢的功能。 + +对我来说,Xfce 的亮点功能是可以非常容易地为你打开的每一个标签页改变背景颜色。当在服务器上运行远程 shell 时,这是非常有价值的。它让我知道自己在哪个标签页中,从而避免了我犯愚蠢的错误。 + +### rxvt-unicode + +![rxvt][8] + +[rxvt 终端][9] 是我最喜欢的轻量级控制台。它有许多老式 [xterm][10] 终端仿真器的功能,但它的扩展性更强。它的配置是在 `~/.Xdefaults` 中定义的,所以没有偏好面板或设置菜单,但这使得它很容易管理和备份你的设置。通过使用一些 Perl 库,rxvt 可以有标签,并且通过 xrdb,它可以访问字体和任何你能想到的颜色主题。你可以设置像 `URxvt.urlLancher: firefox` 这样的属性来设置当你打开 URL 时启动的网页浏览器,改变滚动条的外观,修改键盘快捷键等等。 + +最初的 rxvt 不支持 Unicode(因为当时 Unicode 还不存在),但 `rxvt-unicode`(有时也叫 `urxvt`)包提供了一个完全支持 Unicode 的补丁版本。 + +我在每台电脑上都有 rxvt,因为对我来说它是最好的通用终端。它不一定是所有用户的最佳终端(例如,它没有拖放界面)。不过,对于寻找快速和灵活终端的中高级用户来说,rxvt 是一个简单的选择。 + +### Konsole + +![Konsole][11] + +Konsole 是 KDE Plasma 桌面的终端,是我转到 Linux 后使用的第一个终端,所以它是我对所有其他终端的标准。它确实设定了一个很高的标准。Konsole 有所有通常的不错的功能(还有些其他的),比如简单的颜色主题加上配置文件支持、字体选择、编码、可分离标签、可重命名标签等等。但这在现代桌面上是可以预期的(至少,如果你的桌面运行的是 Plasma 的话)。 + +Konsole 比其他终端领先许多年(或者几个月)。它可以垂直或水平地分割窗口。你可以把输入复制到所有的标签页上(就像 [tmux][12] 一样)。你可以将其设置为监视自身是否静音或活动并配置通知。如果你在 Android 手机上使用 KDE Connect,这意味着当一个任务完成时,你可以在手机上收到通知。你可以将 Konsole 的输出保存到文本或 HTML 文件中,为打开的标签页添加书签,克隆标签页,调整搜索设置等等。 + +Konsole 是一个真正的高级用户终端,但它也非常适合新用户。你可以将文件拖放到 Konsole 中,将目录改为硬盘上的特定位置,也可以将路径粘贴进去,甚至可以将文件复制到 Konsole 的当前工作目录中。这让使用终端变得很简单,这也是所有用户都能理解的。 + +### 尝试一个终端 + +你的审美观念是黑暗的办公室和黑色背景下绿色文字的温暖光芒吗?还是喜欢阳光明媚的休息室和屏幕上舒缓的墨黑色字体?无论你对完美电脑设置的愿景是什么,如果你喜欢通过输入命令高效地与操作系统交流,那么 Linux 已经为你提供了一个接口。 + +-------------------------------------------------------------------------------- + +via: https://opensource.com/article/21/2/linux-terminals + +作者:[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/freedos.png?itok=aOBLy7Ky (4 different color terminal windows with code) +[2]: https://opensource.com/resources/what-bash +[3]: https://opensource.com/article/20/8/tcsh +[4]: https://opensource.com/article/19/9/getting-started-zsh +[5]: https://opensource.com/sites/default/files/uploads/terminal-xfce.jpg (Xfce ) +[6]: https://creativecommons.org/licenses/by-sa/4.0/ +[7]: https://opensource.com/article/19/12/xfce-linux-desktop +[8]: https://opensource.com/sites/default/files/uploads/terminal-rxvt.jpg (rxvt) +[9]: https://opensource.com/article/19/10/why-use-rxvt-terminal +[10]: https://opensource.com/article/20/7/xterm +[11]: https://opensource.com/sites/default/files/uploads/terminal-konsole.jpg (Konsole) +[12]: https://opensource.com/article/20/1/tmux-console diff --git a/published/202103/20210228 How to Install the Latest Erlang on Ubuntu Linux.md b/published/202103/20210228 How to Install the Latest Erlang on Ubuntu Linux.md new file mode 100644 index 0000000000..57d06c19bb --- /dev/null +++ b/published/202103/20210228 How to Install the Latest Erlang on Ubuntu Linux.md @@ -0,0 +1,120 @@ +[#]: subject: (How to Install the Latest Erlang on Ubuntu Linux) +[#]: via: (https://itsfoss.com/install-erlang-ubuntu/) +[#]: author: (Abhishek Prakash https://itsfoss.com/author/abhishek/) +[#]: collector: (lujun9972) +[#]: translator: (geekpi) +[#]: reviewer: (wxy) +[#]: publisher: (wxy) +[#]: url: (https://linux.cn/article-13182-1.html) + +如何在 Ubuntu Linux 上安装最新的 Erlang +====== + +![](https://img.linux.net.cn/data/attachment/album/202103/07/001753blfwcg2gc2c2lcgl.jpg) + +[Erlang][1] 是一种用于构建大规模可扩展实时系统的函数式编程语言。Erlang 最初是由 [爱立信][2] 创建的专有软件,后来被开源。 + +Erlang 在 [Ubuntu 的 Universe 仓库][3] 中可用。启用该仓库后,你可以使用下面的命令轻松安装它: + +``` +sudo apt install erlang +``` + +![][4] + +但是,*Ubuntu 仓库提供的 Erlang 版本可能不是最新的*。 + +如果你想要 Ubuntu 上最新的 Erlang 版本,你可以添加 [Erlang Solutions 提供的][5]仓库。它们为各种 Linux 发行版、Windows 和 macOS 提供了预编译的二进制文件。 + +如果你之前安装了一个名为 `erlang` 的包,那么它将会被升级到由添加的仓库提供的较新版本。 + +### 在 Ubuntu 上安装最新版本的 Erlang + +你需要[在 Linux 终端下载密钥文件][6]。你可以使用 `wget` 工具,所以请确保你已经安装了它: + +``` +sudo apt install wget +``` + +接下来,使用 `wget` 下载 Erlang Solution 仓库的 GPG 密钥,并将其添加到你的 apt 打包系统中。添加了密钥后,你的系统就会信任来自该仓库的包。 + +``` +wget -O- https://packages.erlang-solutions.com/ubuntu/erlang_solutions.asc | sudo apt-key add - +``` + +现在,你应该在你的 APT `sources.list.d` 目录下为 Erlang 添加一个文件,这个文件将包含有关仓库的信息,APT 包管理器将使用它来获取包和未来的更新。 + +对于 Ubuntu 20.04(和 Ubuntu 20.10),使用以下命令: + +``` +echo "deb https://packages.erlang-solutions.com/ubuntu focal contrib" | sudo tee /etc/apt/sources.list.d/erlang-solution.list +``` + +我知道上面的命令提到了 Ubuntu 20.04 focal,但它也适用于 Ubuntu 20.10 groovy。 + +对于 **Ubuntu 18.04**,使用以下命令: + +``` +echo "deb https://packages.erlang-solutions.com/ubuntu bionic contrib" | sudo tee /etc/apt/sources.list.d/erlang-solution.list +``` + +你必须更新本地的包缓存,以通知它关于新添加的仓库的包。 + +``` +sudo apt update +``` + +你会注意到,它建议你进行一些升级。如果你列出了可用的升级,你会在那里找到 erlang 包。要更新现有的 erlang 版本或重新安装,使用这个命令: + +``` +sudo apt install erlang +``` + +安装好后,你可以测试一下。 + +![][7] + +要退出 Erlang shell,使用 `Ctrl+g`,然后输入 `q`,由于我从来没有用过 Erlang,所以我只好尝试了一些按键,然后发现了操作方法。 + +#### 删除 erlang + +要删除该程序,请使用以下命令: + +``` +sudo apt remove erlang +``` + +还会有一些依赖关系。你可以用下面的命令删除它们: + +``` +sudo apt autoremove +``` + +如果你愿意,你也可以删除添加的仓库文件。 + +``` +sudo rm /etc/apt/sources.list.d/erlang-solution.list +``` + +就是这样。享受在 Ubuntu Linux 上使用 Erlang 学习和编码的乐趣。 + +-------------------------------------------------------------------------------- + +via: https://itsfoss.com/install-erlang-ubuntu/ + +作者:[Abhishek Prakash][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/abhishek/ +[b]: https://github.com/lujun9972 +[1]: https://www.erlang.org/ +[2]: https://www.ericsson.com/en +[3]: https://itsfoss.com/ubuntu-repositories/ +[4]: https://i1.wp.com/itsfoss.com/wp-content/uploads/2021/02/install-erlang-ubuntu.png?resize=800%2C445&ssl=1 +[5]: https://www.erlang-solutions.com/downloads/ +[6]: https://itsfoss.com/download-files-from-linux-terminal/ +[7]: https://i0.wp.com/itsfoss.com/wp-content/uploads/2021/02/erlang-shell.png?resize=800%2C274&ssl=1 diff --git a/published/202103/20210301 4 open source tools for running a Linux server.md b/published/202103/20210301 4 open source tools for running a Linux server.md new file mode 100644 index 0000000000..9e19ca6352 --- /dev/null +++ b/published/202103/20210301 4 open source tools for running a Linux server.md @@ -0,0 +1,95 @@ +[#]: subject: (4 open source tools for running a Linux server) +[#]: via: (https://opensource.com/article/21/3/linux-server) +[#]: author: (Seth Kenlon https://opensource.com/users/seth) +[#]: collector: (lujun9972) +[#]: translator: (geekpi) +[#]: reviewer: (wxy) +[#]: publisher: (wxy) +[#]: url: (https://linux.cn/article-13192-1.html) + +4 个打造多媒体和共享服务器的开源工具 +====== + +> 通过 Linux,你可以将任何设备变成服务器,以共享数据、媒体文件,以及其他资源。 + +![](https://img.linux.net.cn/data/attachment/album/202103/10/200529sqfnhnh553xfixuw.jpg) + +在 2021 年,人们喜欢 Linux 的理由比以往任何时候都多。在这个系列中,我将分享 21 个使用 Linux 的不同理由。这里有四个开源工具,可以将任何设备变成 Linux 服务器。  + +有时,我会发现有关服务器概念的某种神秘色彩。许多人,如果他们在脑海中有一个形象的话,他们认为服务器一定是又大又重的机架式机器,由一个谨慎的系统管理员和一群神奇的修理工精心维护。另一些人则把服务器设想成虚无缥缈的云朵,以某种方式为互联网提供动力。 + +虽然这种敬畏对 IT 工作的安全性是有好处的,但事实上,在开源计算中,没有人认为服务器是或应该是专家的专属领域。文件和资源共享是开源不可或缺的,而开源让它变得比以往任何时候都更容易,正如这四个开源服务器项目所展示的那样。 + +### Samba + +[Samba 项目][2] 是 Linux 和 Unix 的 Windows 互操作程序套件。尽管它是大多数用户从未与之交互的底层代码,但它的重要性却不容小觑。从历史上看,早在微软争相消灭 Linux 和开源的时候,它就是最大最重要的目标。时代变了,微软已经与 Samba 团队会面以提供支持(至少目前是这样),在这一切中,该项目继续确保 Linux 和 Windows 计算机可以轻松地在同一网络上共存。换句话说,无论你使用什么平台,Samba 都可以让你可以轻松地在本地网络上共享文件。 + +在 [KDE Plasma][3] 桌面上,你可以右键点击自己的任何目录,选择**属性**。在**属性**对话框中,点击**共享**选项卡,并启用**与 Samba 共享(Microsoft Windows)**。 + +![Samba][4] + +就这样,你已经为本地网络上的用户打开了一个只读访问的目录。也就是说,当你在家的时候,你家同一个 WiFi 网络上的任何人都可以访问该文件夹,如果你在工作,工作场所网络上的任何人都可以访问该文件夹。当然,要访问它,其他用户需要知道在哪里可以找到它。通往计算机的路径可以用 [IP 地址][6] 表示,也可以根据你的网络配置,用主机名表示。 + +### Snapdrop + +如果通过 IP 地址和主机名来打开网络是令人困惑的,或者如果你不喜欢打开一个文件夹进行共享而忘记它是开放的,那么你可能更喜欢 [Snapdrop][7]。这是一个开源项目,你可以自己运行,也可以使用互联网上的演示实例通过 WebRTC 连接计算机。WebRTC 可以通过 Web 浏览器实现点对点的连接,也就是说同一网络上的两个用户可以通过 Snapdrop 找到对方,然后直接进行通信,而不需要通过外部服务器。 + +![Snapdrop][8] + +一旦两个或更多的客户端连接了同一个 Snapdrop 服务,用户就可以通过本地网络来回交换文件和聊天信息。传输的速度很快,而且你的数据也保持在本地。 + +### VLC + +流媒体服务比以往任何时候都更常见,但我在音乐和电影方面有非常规的口味,所以典型的服务似乎很少有我想要的东西。幸运的是,通过连接到媒体驱动器,我可以很容易地将自己的内容从我的电脑上传送到我的房子各个角落。例如,当我想在电脑显示器以外的屏幕上观看一部电影时,我可以在我的网络上串流电影文件,并通过任何可以接收 HTTP 的应用来播放它,无论该应用是在我的电视、游戏机还是手机上。 + +[VLC][9] 可以轻松设置流媒体。事实上,它是**媒体**菜单中的一个选项,或者你可以按下键盘 `Ctrl+S`。将一个文件或一组文件添加到你的流媒体队列中,然后点击 **Stream** 按钮。 + +![VLC][10] + +VLC 通过配置向导来帮助你决定流媒体数据时使用什么协议。我倾向于使用 HTTP,因为它通常在任何设备上可用。当 VLC 开始播放文件时,请进入播放文件计算机的 IP 或主机名以及给它分配的端口 (当使用 HTTP 时,默认是 8080), 然后坐下来享受。 + +### PulseAudio + +我最喜欢的现代 Linux 功能之一是 [PulseAudio][11]。Pulse 为 Linux 上的音频实现了惊人的灵活性,包括可自动发现的本地网络流媒体。这个功能对我来说的好处是,我可以在办公室的工作站上播放播客和技术会议视频,并通过手机串流音频。无论我走进厨房、休息室还是后院最远的地方,我都能获得完美的音频。此功能在 PulseAudio 之前很久就存在,但是 Pulse 使它像单击按钮一样容易。 + +需要进行一些设置。首先,你必须确保安装 PulseAudio 设置包(**paprefs**),以便在 PulseAudio 配置中启用网络音频。 + +![PulseAudio][12] + +在 **paprefs** 中,启用网络访问你的本地声音设备,可能不需要认证(假设你信任本地网络上的其他人),并启用你的计算机作为 **Multicast/RTP 发送者**。我通常只选择串流通过我的扬声器播放的任何音频,但你可以在 Pulse 输出选项卡中创建一个单独的音频设备,这样你就可以准确地选择串流的内容。你在这里有三个选项: + + * 串流任何在扬声器上播放的音频 + * 串流所有输出的声音 + * 只将音频直接串流到多播设备(按需)。 + +一旦启用,你的声音就会串流到网络中,并可被其他本地 Linux 设备接收。这是简单和动态的音频共享。 + +### 分享的不仅仅是代码 + +Linux 是共享的。它在服务器领域很有名,因为它很擅长*服务*。无论是提供音频流、视频流、文件,还是出色的用户体验,每一台 Linux 电脑都是一台出色的 Linux 服务器。 + +-------------------------------------------------------------------------------- + +via: https://opensource.com/article/21/3/linux-server + +作者:[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/rack_server_sysadmin_cloud_520.png?itok=fGmwhf8I (A rack of servers, blue background) +[2]: http://samba.org +[3]: https://opensource.com/article/19/12/linux-kde-plasma +[4]: https://opensource.com/sites/default/files/uploads/samba_0.jpg (Samba) +[5]: https://creativecommons.org/licenses/by-sa/4.0/ +[6]: https://opensource.com/article/18/5/how-find-ip-address-linux +[7]: https://github.com/RobinLinus/snapdrop +[8]: https://opensource.com/sites/default/files/uploads/snapdrop.jpg (Snapdrop) +[9]: https://www.videolan.org/index.html +[10]: https://opensource.com/sites/default/files/uploads/vlc-stream.jpg (VLC) +[11]: https://www.freedesktop.org/wiki/Software/PulseAudio/ +[12]: https://opensource.com/sites/default/files/uploads/pulse.jpg (PulseAudio) diff --git a/published/202103/20210302 Meet SysMonTask- A Windows Task Manager Lookalike for Linux.md b/published/202103/20210302 Meet SysMonTask- A Windows Task Manager Lookalike for Linux.md new file mode 100644 index 0000000000..f26fb208ae --- /dev/null +++ b/published/202103/20210302 Meet SysMonTask- A Windows Task Manager Lookalike for Linux.md @@ -0,0 +1,130 @@ +[#]: subject: (Meet SysMonTask: A Windows Task Manager Lookalike for Linux) +[#]: via: (https://itsfoss.com/sysmontask/) +[#]: author: (Abhishek Prakash https://itsfoss.com/author/abhishek/) +[#]: collector: (lujun9972) +[#]: translator: (wxy) +[#]: reviewer: (wxy) +[#]: publisher: (wxy) +[#]: url: (https://linux.cn/article-13189-1.html) + +SysMonTask:一个类似于 Windows 任务管理器的 Linux 系统监控器 +====== + +![](https://img.linux.net.cn/data/attachment/album/202103/09/232304ljsr5jfgluffn4a4.jpg) + +得益于桌面环境,几乎所有的 [Linux 发行版都带有任务管理器应用程序][1]。除此之外,还有 [一些其他的 Linux 的系统监控应用程序][2],它们具有更多的功能。 + +但最近我遇到了一个为 Linux 创建的任务管理器,它看起来像……嗯……Windows 的任务管理器。 + +你自己看看就知道了。 + +![][3] + +就我个人而言,我不确定用户界面的相似性是否有意义,但开发者和其他一些 Linux 用户可能不同意我的观点。 + +### SysMonTask: 一个具有 Windows 任务管理器外观的系统监控器 + +![][4] + +开源软件 [SysMonTask][5] 将自己描述为“具有 Windows 任务管理器的紧凑性和实用性的 Linux 系统监控器,以实现更高的控制和监控”。 + +SysMonTask 以 Python 编写,拥有以下功能: + + * 系统监控图。 + * 显示 CPU、内存、磁盘、网络适配器、单个 Nvidia GPU 的统计数据。 + * 在最近的版本中增加了对挂载磁盘列表的支持。 + * 用户进程选项卡可以进行进程过滤,显示递归-CPU、递归-内存和列头的汇总值。 + * 当然,你可以在进程选项卡中杀死一个进程。 + * 还支持系统主题(深色和浅色)。 + +### 体验 SysMonTask + +SysMonTask 需要提升权限。当你启动它时,你会被要求提供你的管理员密码。我不喜欢一个任务管理器一直用 `sudo` 运行,但这只是我的喜好。 + +我玩了一下,探索它的功能。磁盘的使用量基本稳定不变,所以我把一个 10GB 的文件从外部 SSD 复制到笔记本的磁盘上几次。你可以看到文件传输时对应的峰值。 + +![][6] + +进程标签也很方便。它在列的顶部显示了累积的资源利用率。 + +杀死按钮被添加在底部,所以你要做的就是选择一个进程,然后点击“Killer” 按钮。它在 [杀死进程][7] 之前会询问你的确认。 + +![][8] + +### 在 Linux 发行版上安装 SysMonTask + +对于一个简单的应用程序,它需要下载 50 MB 的存档文件,并占用了大约 200 MB 的磁盘。我想这是因为 Python 的依赖性。 + +还有就是它读取的是 env。 + +在写这篇文章的时候,SysMonTask 可以通过 [PPA][9] 在基于 Ubuntu 的发行版上使用。 + +在基于 Ubuntu 的发行版上,打开一个终端,使用以下命令添加 PPA 仓库: + +``` +sudo add-apt-repository ppa:camel-neeraj/sysmontask +``` + +当然,你会被要求输入密码。在新版本中,仓库列表会自动更新。所以,你可以直接安装应用程序: + +``` +sudo apt install sysmontask +``` + +基于 Debian 的发行版也可以尝试从 deb 文件中安装它。它可以在发布页面找到。 + +对于其他发行版,没有现成的软件包。令我惊讶的是,它基本上是一个 Python 应用程序,所以可以为其他发行版添加一个 PIP 安装程序。也许开发者会在未来的版本中添加它。 + +由于它是开源软件,你可以随时得到源代码。 + +- [SysMonTask Deb 文件和源代码][10] + +安装完毕后,在菜单中寻找 SysMonTask,并从那里启动它。 + +#### 删除 SysMonTask + +如果你想删除它,使用以下命令: + +``` +sudo apt remove sysmontask +``` + +最好也 [删除 PPA][11]: + +``` +sudo add-apt-repository -r ppa:camel-neeraj/sysmontask +``` + +你也可以在这里 [使用 PPA 清除][12] 工具,这是一个处理 PPA 应用程序删除的方便工具。 + +### 你会尝试吗? + +对我来说,功能比外观更重要。SysMonTask 确实有额外的功能,监测磁盘性能和检查 GPU 统计数据,这是其他系统监视器通常不包括的东西。 + +如果你尝试并喜欢它,也许你会喜欢添加 `Ctrl+Alt+Del` 快捷键来启动 SysMonTask,以获得完整的感觉 :) + +-------------------------------------------------------------------------------- + +via: https://itsfoss.com/sysmontask/ + +作者:[Abhishek Prakash][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://itsfoss.com/author/abhishek/ +[b]: https://github.com/lujun9972 +[1]: https://itsfoss.com/task-manager-linux/ +[2]: https://itsfoss.com/linux-system-monitoring-tools/ +[3]: https://i0.wp.com/itsfoss.com/wp-content/uploads/2021/02/sysmontask-1.png?resize=800%2C559&ssl=1 +[4]: https://i1.wp.com/itsfoss.com/wp-content/uploads/2021/02/SysMonTask-CPU.png?resize=800%2C537&ssl=1 +[5]: https://github.com/KrispyCamel4u/SysMonTask +[6]: https://i2.wp.com/itsfoss.com/wp-content/uploads/2021/02/sysmontask-disk-usage.png?resize=800%2C498&ssl=1 +[7]: https://itsfoss.com/how-to-find-the-process-id-of-a-program-and-kill-it-quick-tip/ +[8]: https://i0.wp.com/itsfoss.com/wp-content/uploads/2021/02/kill-process-sysmontask.png?resize=800%2C500&ssl=1 +[9]: https://itsfoss.com/ppa-guide/ +[10]: https://github.com/KrispyCamel4u/SysMonTask/releases +[11]: https://itsfoss.com/how-to-remove-or-delete-ppas-quick-tip/ +[12]: https://itsfoss.com/ppa-purge/ diff --git a/published/202103/20210303 Guake Terminal- A Customizable Linux Terminal for Power Users -Inspired by an FPS Game.md b/published/202103/20210303 Guake Terminal- A Customizable Linux Terminal for Power Users -Inspired by an FPS Game.md new file mode 100644 index 0000000000..14688c7cde --- /dev/null +++ b/published/202103/20210303 Guake Terminal- A Customizable Linux Terminal for Power Users -Inspired by an FPS Game.md @@ -0,0 +1,102 @@ +[#]: subject: (Guake Terminal: A Customizable Linux Terminal for Power Users [Inspired by an FPS Game]) +[#]: via: (https://itsfoss.com/guake-terminal/) +[#]: author: (Ankush Das https://itsfoss.com/author/ankush/) +[#]: collector: (lujun9972) +[#]: translator: (geekpi) +[#]: reviewer: (wxy) +[#]: publisher: (wxy) +[#]: url: (https://linux.cn/article-13187-1.html) + +Guake 终端:一个灵感来自于 FPS 游戏的 Linux 终端 +====== + +> 使用 Guake 终端这个可自定义且强大的适合各种用户的工具快速访问你的终端。 + +### Guake 终端:GNOME 桌面中自上而下终端 + +![](https://img.linux.net.cn/data/attachment/album/202103/09/062119ba36tottztz4torn.jpg) + +[Guake][2] 是一款为 GNOME 桌面量身定做的终端模拟器,采用下拉式设计。 + +它最初的灵感来自于一款 FPS 游戏([Quake][3])中的终端。尽管它最初是作为一个快速和易于使用的终端而设计的,但它的功能远不止于此。 + +Guake 终端提供了大量的功能,以及可定制的选项。在这里,我将重点介绍终端的主要功能,以及如何将它安装到你的任何 Linux 发行版上。 + +### Guake 终端的特点 + +![][4] + + * 按下键盘快捷键(`F12`)以覆盖方式在任何地方启动终端 + * Guake 终端在后台运行,以便持久访问 + * 能够横向和纵向分割标签页 + * 从可用的 shell 中(如果有的话)更改默认的 shell + * 重新对齐 + * 从多种调色板中选择改变终端的外观 + * 能够使用 GUI 方式将终端内容保存到文件中 + * 需要时切换全屏 + * 你可以轻松地保存标签,或在需要时打开新的标签 + * 恢复标签的能力 + * 可选择配置和学习新的键盘快捷键,以快速访问终端和执行任务 + * 改变特定选项卡的颜色 + * 轻松重命名标签,快速访问你需要的内容 + * 快速打开功能,只需点击一下,就可直接在终端中用你最喜欢的编辑器打开文件 + * 能够在启动或显示 Guake 终端时添加自己的命令或脚本。 + * 支持多显示器 + +![][5] + +只是出于乐趣,你可以做很多事情。但是,我也相信,高级用户可以利用这些功能使他们的终端体验更轻松,更高效。 + +就我用它来测试一些东西和写这篇文章的时候,说实话,我觉得我是在召唤终端。所以,我绝对觉得它很酷! + +### 在 Linux 上安装 Guake + +![][6] + +在 Ubuntu、Fedora 和 Arch 的默认仓库中都有 Guake 终端。 + +你可以按照它的官方说明来了解你可以使用的命令,如果你使用的是基于 Ubuntu 的发行版,只需输入: + +``` +sudo apt install guake +``` + +请注意,使用这种方法可能无法获得最新版本。所以,如果你想获得最新的版本,你可以选择使用 [Linux Uprising][7] 的 PPA 来获得最新版本: + +``` +sudo add-apt-repository ppa:linuxuprising/guake +sudo apt update +sudo apt install guake +``` + +无论是哪种情况,你也可以使用 [Pypi][8] 或者参考[官方文档][9]或从 [GitHub 页面][10]获取源码。 + +- [Guake Terminal][10] + +你觉得 Guake 终端怎么样?你认为它是一个有用的终端仿真器吗?你知道有什么类似的软件吗? + +欢迎在下面的评论中告诉我你的想法。 + +-------------------------------------------------------------------------------- + +via: https://itsfoss.com/guake-terminal/ + +作者:[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/2021/02/guake-terminal-1.png?resize=800%2C363&ssl=1 +[2]: http://guake-project.org/ +[3]: https://quake.bethesda.net/en +[4]: https://i0.wp.com/itsfoss.com/wp-content/uploads/2021/02/guake-terminal.jpg?resize=800%2C245&ssl=1 +[5]: https://i0.wp.com/itsfoss.com/wp-content/uploads/2021/02/guake-preferences.jpg?resize=800%2C559&ssl=1 +[6]: https://i1.wp.com/itsfoss.com/wp-content/uploads/2021/02/guake-terminal-2.png?resize=800%2C432&ssl=1 +[7]: https://www.linuxuprising.com/ +[8]: https://pypi.org/ +[9]: https://guake.readthedocs.io/en/latest/user/installing.html +[10]: https://github.com/Guake/guake diff --git a/published/202103/20210304 An Introduction to WebAssembly.md b/published/202103/20210304 An Introduction to WebAssembly.md new file mode 100644 index 0000000000..a949407612 --- /dev/null +++ b/published/202103/20210304 An Introduction to WebAssembly.md @@ -0,0 +1,84 @@ +[#]: subject: (An Introduction to WebAssembly) +[#]: via: (https://www.linux.com/news/an-introduction-to-webassembly/) +[#]: author: (Marco Fioretti https://training.linuxfoundation.org/announcements/an-introduction-to-webassembly/) +[#]: collector: (lujun9972) +[#]: translator: (geekpi) +[#]: reviewer: (wxy) +[#]: publisher: (wxy) +[#]: url: (https://linux.cn/article-13197-1.html) + +WebAssembly 介绍 +====== + +![](https://img.linux.net.cn/data/attachment/album/202103/12/222938jww882da88oqzays.jpg) + +### 到底什么是 WebAssembly? + +[WebAssembly][1],也叫 Wasm,是一种为 Web 优化的代码格式和 API(应用编程接口),它可以大大提高网站的性能和能力。WebAssembly 的 1.0 版本于 2017 年发布,并于 2019 年成为 W3C 官方标准。 + +该标准得到了所有主流浏览器供应商的积极支持,原因显而易见:官方列出的 [“浏览器内部”用例][2] 中提到了,其中包括视频编辑、3D 游戏、虚拟和增强现实、p2p 服务和科学模拟。除了让浏览器的功能比JavaScript 强大得多,该标准甚至可以延长网站的寿命:例如,正是 WebAssembly 为 [互联网档案馆的 Flash 动画和游戏][3] 提供了持续的支持。 + +不过,WebAssembly 并不只用于浏览器,目前它还被用于移动和基于边缘环境的 Cloudflare Workers 等产品中。 + +### WebAssembly 如何工作? + +.wasm 格式的文件包含低级二进制指令(字节码),可由使用通用栈的虚拟机以“接近 CPU 原生速度”执行。这些代码被打包成模块(可以被浏览器直接执行的对象),每个模块可以被一个网页多次实例化。模块内部定义的函数被列在一个专用数组中,或称为Table,相应的数据被包含在另一个结构中,称为 缓存数组arraybuffer。开发者可以通过 Javascript `WebAssembly.memory()` 的调用,为 .wasm 代码显式分配内存。 + +.wasm 格式也有纯文本版本,它可以大大简化学习和调试。然而,WebAssembly 并不是真的要供人直接使用。从技术上讲,.wasm 只是一个与浏览器兼容的**编译目标**:一种用高级编程语言编写的软件编译器可以自动翻译的代码格式。 + +这种选择正是使开发人员能够使用数十亿人熟悉的语言(C/C++、Python、Go、Rust 等)直接为用户界面进行编程的方式,但以前浏览器无法对其进行有效利用。更妙的是,至少在理论上程序员可以利用它们,无需直接查看 WebAssembly 代码,也无需担心物理 CPU 实际运行他们的代码(因为目标是一个**虚拟**机)。 + +### 但是我们已经有了 JavaScript,我们真的需要 WebAssembly 吗? + +是的,有几个原因。首先,作为二进制指令,.wasm 文件比同等功能的 JavaScript 文件小得多,下载速度也快得多。最重要的是,Javascript 文件必须在浏览器将其转换为其内部虚拟机可用的字节码之前进行完全解析和验证。 + +而 .wasm 文件则可以一次性验证和编译,从而使“流式编译”成为可能:浏览器在开始**下载它们**的那一刻就可以开始编译和执行它们,就像串流电影一样。 + +这就是说,并不是所有可以想到的 WebAssembly 应用都肯定会比由专业程序员手动优化的等效 JavaScript 应用更快或更小。例如,如果一些 .wasm 需要包含 JavaScript 不需要的库,这种情况可能会发生。 + +### WebAssembly 是否会让 JavaScript 过时? + +一句话:不会。暂时不会,至少在浏览器内不会。WebAssembly 模块仍然需要 JavaScript,因为在设计上它们不能访问文档对象模型 (DOM)—— [主要用于修改网页的 API][4]。此外,.wasm 代码不能进行系统调用或读取浏览器的内存。WebAssembly 只能在沙箱中运行,一般来说,它能与外界的交互甚至比 JavaScript 更少,而且只能通过 JavaScript 接口进行。 + +因此,至少在不久的将来 .wasm 模块将只是通过 JavaScript 提供那些如果用 JavaScript 语言编写会消耗更多带宽、内存或 CPU 时间的部分。 + +### Web 浏览器如何运行 WebAssembly? + +一般来说,浏览器至少需要两块来处理动态应用:运行应用代码的虚拟机(VM),以及可以同时修改浏览器行为和网页显示的 API。 + +现代浏览器内部的虚拟机通过以下方式同时支持 JavaScript 和 WebAssembly: + + 1. 浏览器下载一个用 HTML 标记语言编写的网页,然后进行渲染 + 2. 如果该 HTML 调用 JavaScript 代码,浏览器的虚拟机就会执行该代码。但是... + 3. 如果 JavaScript 代码中包含了 WebAssembly 模块的实例,那么就按照上面的描述获取该实例,然后根据需要通过 JavaScript 的 WebAssembly API 来使用该实例 + 4. 当 WebAssembly 代码产生的东西将修改 DOM(即“宿主”网页)的结构,JavaScript 代码就会接收到,并继续进行实际的修改。 + +### 我如何才能创建可用的 WebAssembly 代码? + +越来越多的编程语言社区支持直接编译到 Wasm,我们建议从 webassembly.org 的 [入门指南][5] 开始,这取决于你使用什么语言。请注意,并不是所有的编程语言都有相同水平的 Wasm 支持,因此你的工作量可能会有所不同。  + +我们计划在未来几个月内发布一系列文章,提供更多关于 WebAssembly 的信息。要自己开始使用它,你可以报名参加 Linux 基金会的免费 [WebAssembly 介绍][6]在线培训课程。 + +这篇[WebAssembly 介绍][7]首次发布在 [Linux Foundation – Training][8]。 + +-------------------------------------------------------------------------------- + +via: https://www.linux.com/news/an-introduction-to-webassembly/ + +作者:[Dan Brown][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://training.linuxfoundation.org/announcements/an-introduction-to-webassembly/ +[b]: https://github.com/lujun9972 +[1]: https://webassembly.org/ +[2]: https://webassembly.org/docs/use-cases/ +[3]: https://blog.archive.org/2020/11/19/flash-animations-live-forever-at-the-internet-archive/ +[4]: https://developer.mozilla.org/en-US/docs/Web/API/Document_Object_Model/Introduction +[5]: https://webassembly.org/getting-started/developers-guide/ +[6]: https://training.linuxfoundation.org/training/introduction-to-webassembly-lfd133/ +[7]: https://training.linuxfoundation.org/announcements/an-introduction-to-webassembly/ +[8]: https://training.linuxfoundation.org/ diff --git a/published/202103/20210304 Learn to debug code with the GNU Debugger.md b/published/202103/20210304 Learn to debug code with the GNU Debugger.md new file mode 100644 index 0000000000..0aa5d13cda --- /dev/null +++ b/published/202103/20210304 Learn to debug code with the GNU Debugger.md @@ -0,0 +1,301 @@ +[#]: subject: (Learn to debug code with the GNU Debugger) +[#]: via: (https://opensource.com/article/21/3/debug-code-gdb) +[#]: author: (Seth Kenlon https://opensource.com/users/seth) +[#]: collector: (lujun9972) +[#]: translator: (wxy) +[#]: reviewer: (wxy) +[#]: publisher: (wxy) +[#]: url: (https://linux.cn/article-13203-1.html) + +学习使用 GDB 调试代码 +====== + +> 使用 GNU 调试器来解决你的代码问题。 + +![](https://img.linux.net.cn/data/attachment/album/202103/14/210547k3q5lek8j9qspkks.jpg) + +GNU 调试器常以它的命令 `gdb` 称呼它,它是一个交互式的控制台,可以帮助你浏览源代码、分析执行的内容,其本质上是对错误的应用程序中出现的问题进行逆向工程。 + +故障排除的麻烦在于它很复杂。[GNU 调试器][2] 并不是一个特别复杂的应用程序,但如果你不知道从哪里开始,甚至不知道何时和为何你可能需要求助于 GDB 来进行故障排除,那么它可能会让人不知所措。如果你一直使用 `print`、`echo` 或 [printf 语句][3]来调试你的代码,当你开始思考是不是还有更强大的东西时,那么本教程就是为你准备的。 + +### 有错误的代码 + +要开始使用 GDB,你需要一些代码。这里有一个用 C++ 写的示例应用程序(如果你一般不使用 C++ 编写程序也没关系,在所有语言中原理都是一样的),其来源于 [猜谜游戏系列][4] 中的一个例子。 + +``` +#include +#include //srand +#include //printf + +using namespace std; + +int main () { + +srand (time(NULL)); +int alpha = rand() % 8; +cout << "Hello world." << endl; +int beta = 2; + +printf("alpha is set to is %s\n", alpha); +printf("kiwi is set to is %s\n", beta); + + return 0; +} // main +``` + +这个代码示例中有一个 bug,但它确实可以编译(至少在 GCC 5 的时候)。如果你熟悉 C++,你可能已经看到了,但这是一个简单的问题,可以帮助新的 GDB 用户了解调试过程。编译并运行它就可以看到错误: + +``` +$ g++ -o buggy example.cpp +$ ./buggy +Hello world. +Segmentation fault +``` + +### 排除段故障 + +从这个输出中,你可以推测变量 `alpha` 的设置是正确的,因为否则的话,你就不会看到它*后面*的那行代码执行。当然,这并不总是正确的,但这是一个很好的工作理论,如果你使用 `printf` 作为日志和调试器,基本上也会得出同样的结论。从这里,你可以假设 bug 在于成功打印的那一行之后的*某行*。然而,不清楚错误是在下一行还是在几行之后。 + +GNU 调试器是一个交互式的故障排除工具,所以你可以使用 `gdb` 命令来运行错误的代码。为了得到更好的结果,你应该从包含有*调试符号*的源代码中重新编译你的错误应用程序。首先,看看 GDB 在不重新编译的情况下能提供哪些信息: + +``` +$ gdb ./buggy +Reading symbols from ./buggy...done. +(gdb) start +Temporary breakpoint 1 at 0x400a44 +Starting program: /home/seth/demo/buggy + +Temporary breakpoint 1, 0x0000000000400a44 in main () +(gdb) +``` + +当你以一个二进制可执行文件作为参数启动 GDB 时,GDB 会加载该应用程序,然后等待你的指令。因为这是你第一次在这个可执行文件上运行 GDB,所以尝试重复这个错误是有意义的,希望 GDB 能够提供进一步的见解。很直观,GDB 用来启动它所加载的应用程序的命令就是 `start`。默认情况下,GDB 内置了一个*断点*,所以当它遇到你的应用程序的 `main` 函数时,它会暂停执行。要让 GDB 继续执行,使用命令 `continue`: + +``` +(gdb) continue +Continuing. +Hello world. + +Program received signal SIGSEGV, Segmentation fault. +0x00007ffff71c0c0b in vfprintf () from /lib64/libc.so.6 +(gdb) +``` + +毫不意外:应用程序在打印 “Hello world” 后不久就崩溃了,但 GDB 可以提供崩溃发生时正在发生的函数调用。这有可能就足够你找到导致崩溃的 bug,但为了更好地了解 GDB 的功能和一般的调试过程,想象一下,如果问题还没有变得清晰,你想更深入地挖掘这段代码发生了什么。 + +### 用调试符号编译代码 + +要充分利用 GDB,你需要将调试符号编译到你的可执行文件中。你可以用 GCC 中的 `-g` 选项来生成这个符号: + +``` +$ g++ -g -o debuggy example.cpp +$ ./debuggy +Hello world. +Segmentation fault +``` + +将调试符号编译到可执行文件中的结果是得到一个大得多的文件,所以通常不会分发它们,以增加便利性。然而,如果你正在调试开源代码,那么用调试符号重新编译测试是有意义的: + +``` +$ ls -l *buggy* *cpp +-rw-r--r--    310 Feb 19 08:30 debug.cpp +-rwxr-xr-x  11624 Feb 19 10:27 buggy* +-rwxr-xr-x  22952 Feb 19 10:53 debuggy* +``` + +### 用 GDB 调试 + +加载新的可执行文件(本例中为 `debuggy`)以启动 GDB: + +``` +$ gdb ./debuggy +Reading symbols from ./debuggy...done. +(gdb) start +Temporary breakpoint 1 at 0x400a44 +Starting program: /home/seth/demo/debuggy + +Temporary breakpoint 1, 0x0000000000400a44 in main () +(gdb) +``` + +如前所述,使用 `start` 命令进行: + +``` +(gdb) start +Temporary breakpoint 1 at 0x400a48: file debug.cpp, line 9. +Starting program: /home/sek/demo/debuggy + +Temporary breakpoint 1, main () at debug.cpp:9 +9       srand (time(NULL)); +(gdb) +``` + +这一次,自动的 `main` 断点可以指明 GDB 暂停的行号和该行包含的代码。你可以用 `continue` 恢复正常操作,但你已经知道应用程序在完成之前就会崩溃,因此,你可以使用 `next` 关键字逐行步进检查你的代码: + +``` +(gdb) next +10 int alpha = rand() % 8; +(gdb) next +11 cout << "Hello world." << endl; +(gdb) next +Hello world. +12 int beta = 2; +(gdb) next +14 printf("alpha is set to is %s\n", alpha); +(gdb) next + +Program received signal SIGSEGV, Segmentation fault. +0x00007ffff71c0c0b in vfprintf () from /lib64/libc.so.6 +(gdb) +``` + +从这个过程可以确认,崩溃不是发生在设置 `beta` 变量的时候,而是执行 `printf` 行的时候。这个 bug 在本文中已经暴露了好几次(破坏者:向 `printf` 提供了错误的数据类型),但暂时假设解决方案仍然不明确,需要进一步调查。 + +### 设置断点 + +一旦你的代码被加载到 GDB 中,你就可以向 GDB 询问到目前为止代码所产生的数据。要尝试数据自省,通过再次发出 `start` 命令来重新启动你的应用程序,然后进行到第 11 行。一个快速到达 11 行的简单方法是设置一个寻找特定行号的断点: + +``` +(gdb) start +The program being debugged has been started already. +Start it from the beginning? (y or n) y +Temporary breakpoint 2 at 0x400a48: file debug.cpp, line 9. +Starting program: /home/sek/demo/debuggy + +Temporary breakpoint 2, main () at debug.cpp:9 +9       srand (time(NULL)); +(gdb) break 11 +Breakpoint 3 at 0x400a74: file debug.cpp, line 11. +``` + +建立断点后,用 `continue` 继续执行: + +``` +(gdb) continue +Continuing. + +Breakpoint 3, main () at debug.cpp:11 +11 cout << "Hello world." << endl; +(gdb) +``` + +现在暂停在第 11 行,就在 `alpha` 变量被设置之后,以及 `beta` 被设置之前。 + +### 用 GDB 进行变量自省 + +要查看一个变量的值,使用 `print` 命令。在这个示例代码中,`alpha` 的值是随机的,所以你的实际结果可能与我的不同: + +``` +(gdb) print alpha +$1 = 3 +(gdb) +``` + +当然,你无法看到一个尚未建立的变量的值: + +``` +(gdb) print beta +$2 = 0 +``` + + +### 使用流程控制 + +要继续进行,你可以步进代码行来到达将 `beta` 设置为一个值的位置: + +``` +(gdb) next +Hello world. +12  int beta = 2; +(gdb) next +14  printf("alpha is set to is %s\n", alpha); +(gdb) print beta +$3 = 2 +``` + +另外,你也可以设置一个观察点,它就像断点一样,是一种控制 GDB 执行代码流程的方法。在这种情况下,你知道 `beta` 变量应该设置为 `2`,所以你可以设置一个观察点,当 `beta` 的值发生变化时提醒你: + +``` +(gdb) watch beta > 0 +Hardware watchpoint 5: beta > 0 +(gdb) continue +Continuing. + +Breakpoint 3, main () at debug.cpp:11 +11 cout << "Hello world." << endl; +(gdb) continue +Continuing. +Hello world. + +Hardware watchpoint 5: beta > 0 + +Old value = false +New value = true +main () at debug.cpp:14 +14 printf("alpha is set to is %s\n", alpha); +(gdb) +``` + +你可以用 `next` 手动步进完成代码的执行,或者你可以用断点、观察点和捕捉点来控制代码的执行。 + +### 用 GDB 分析数据 + +你可以以不同格式查看数据。例如,以八进制值查看 `beta` 的值: + +``` +(gdb) print /o beta +$4 = 02 +``` + +要查看其在内存中的地址: + +``` +(gdb) print /o &beta +$5 = 0x2 +``` + +你也可以看到一个变量的数据类型: + +``` +(gdb) whatis beta +type = int +``` + +### 用 GDB 解决错误 + +这种自省不仅能让你更好地了解什么代码正在执行,还能让你了解它是如何执行的。在这个例子中,对变量运行的 `whatis` 命令给了你一个线索,即你的 `alpha` 和 `beta` 变量是整数,这可能会唤起你对 `printf` 语法的记忆,使你意识到在你的 `printf` 语句中,你必须使用 `%d` 来代替 `%s`。做了这个改变,就可以让应用程序按预期运行,没有更明显的错误存在。 + +当代码编译后发现有 bug 存在时,特别令人沮丧,但最棘手的 bug 就是这样,如果它们很容易被发现,那它们就不是 bug 了。使用 GDB 是猎取并消除它们的一种方法。 + +### 下载我们的速查表 + +生活的真相就是这样,即使是最基本的编程,代码也会有 bug。并不是所有的错误都会导致应用程序无法运行(甚至无法编译),也不是所有的错误都是由错误的代码引起的。有时,bug 是基于一个特别有创意的用户所做的意外的选择组合而间歇性发生的。有时,程序员从他们自己的代码中使用的库中继承了 bug。无论原因是什么,bug 基本上无处不在,程序员的工作就是发现并消除它们。 + +GNU 调试器是一个寻找 bug 的有用工具。你可以用它做的事情比我在本文中演示的要多得多。你可以通过 GNU Info 阅读器来了解它的许多功能: + +``` +$ info gdb +``` + +无论你是刚开始学习 GDB 还是专业人员的,提醒一下你有哪些命令是可用的,以及这些命令的语法是什么,都是很有帮助的。 + +- [下载 GDB 速查表][5] + +-------------------------------------------------------------------------------- + +via: https://opensource.com/article/21/3/debug-code-gdb + +作者:[Seth Kenlon][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/seth +[b]: https://github.com/lujun9972 +[1]: https://opensource.com/sites/default/files/styles/image-full-size/public/lead-images/mistake_bug_fix_find_error.png?itok=PZaz3dga (magnifying glass on computer screen, finding a bug in the code) +[2]: https://www.gnu.org/software/gdb/ +[3]: https://opensource.com/article/20/8/printf +[4]: https://linux.cn/article-12985-1.html +[5]: https://opensource.com/downloads/gnu-debugger-cheat-sheet diff --git a/published/202103/20210304 You Can Now Install Official Evernote Client on Ubuntu and Debian-based Linux Distributions.md b/published/202103/20210304 You Can Now Install Official Evernote Client on Ubuntu and Debian-based Linux Distributions.md new file mode 100644 index 0000000000..c6eb182519 --- /dev/null +++ b/published/202103/20210304 You Can Now Install Official Evernote Client on Ubuntu and Debian-based Linux Distributions.md @@ -0,0 +1,104 @@ +[#]: subject: (You Can Now Install Official Evernote Client on Ubuntu and Debian-based Linux Distributions) +[#]: via: (https://itsfoss.com/install-evernote-ubuntu/) +[#]: author: (Abhishek Prakash https://itsfoss.com/author/abhishek/) +[#]: collector: (lujun9972) +[#]: translator: (geekpi) +[#]: reviewer: (wxy) +[#]: publisher: (wxy) +[#]: url: (https://linux.cn/article-13195-1.html) + +在 Linux 上安装官方 Evernote 客户端 +====== + +![](https://img.linux.net.cn/data/attachment/album/202103/12/064741kvenjiev6qvia4ia.jpg) + +[Evernote][1] 是一款流行的笔记应用。它在推出时是一个革命性的产品。从那时起,已经有好几个这样的应用,可以将网络剪报、笔记等保存为笔记本格式。 + +多年来,Evernote 一直没有在 Linux 上使用的桌面客户端。前段时间 Evernote 承诺推出 Linux 应用,其测试版终于可以在基于 Ubuntu 的发行版上使用了。 + +> 非 FOSS 警报! +> +> Evernote Linux 客户端不是开源的。之所以在这里介绍它,是因为该应用是在 Linux 上提供的,我们也会不定期地介绍 Linux 用户常用的非 FOSS 应用。这对普通桌面 Linux 用户有帮助。 + +### 在 Ubuntu 和基于 Debian 的 Linux 发行版上安装 Evernote + +进入这个 Evernote 的[网站页面][2]。 + +向下滚动一点,接受“早期测试计划”的条款和条件。你会看到一个“立即安装”的按钮出现在屏幕上。点击它来下载 DEB 文件。 + +![][3] + +要 [从 DEB 文件安装应用][4],请双击它。它应该会打开软件中心,并给你选择安装它。 + +![][5] + +安装完成后,在系统菜单中搜索 Evernote 并启动它。 + +![][6] + +当你第一次启动应用时,你需要登录到你的 Evernote 账户。 + +![][7] + +第一次运行会带你进入“主页面”,在这里你可以整理你的笔记本,以便更快速地访问。 + +![][8] + +你现在可以享受在 Linux 上使用 Evernote 了。 + +### 体验 Evernote 的 Linux 测试版客户端 + +由于软件处于测试版,因此这里或那里会有些问题。 + +如上图所示,Evernote Linux 客户端检测到 [Ubuntu 中的深色模式][9] 并自动切换到深色主题。然而,当我把系统主题改为浅色或标准主题时,它并没有立即改变应用主题。这些变化是在我重启 Evernote 应用后才生效的。 + +另一个问题是关于关闭应用。如果你点击 “X” 按钮关闭 Evernote,程序会进入后台而不是退出。 + +有一个似乎可以启动最小化的 Evernote 的应用指示器,就像 [Linux 上的 Skype][10]。不幸的是,事实并非如此。它打开了便笺,让你快速输入笔记。 + +这为你提供了另一个 [Linux 上的笔记应用][11],但它也带来了一个问题。这里没有退出 Evernote 的选项。它只用于打开快速记事应用。 + +![][12] + +那么,如何退出 Evernote 应用呢?为此,再次打开 Evernote 应用。如果它在后台运行,在菜单中搜索它,并启动它,就像你重新打开它一样。 + +当 Evernote 应用在前台运行时,点击 “文件->退出” 来退出 Evernote。 + +![][13] + +这一点开发者应该在未来的版本中寻求改进。 + +我也不能说测试版的程序将来会如何更新。它没有添加任何仓库。我只是希望程序本身能够通知用户有新的版本,这样用户就可以下载新的 DEB 文件。 + +我并没有订阅 Evernote Premium,但我仍然可以在没有网络连接的情况下访问保存的网络文章和笔记。很奇怪,对吧? + +总的来说,我很高兴看到 Evernote 终于努力把这个应用带到了 Linux 上。现在,你不必再尝试第三方应用来在 Linux 上使用 Evernote 了,至少在 Ubuntu 和基于 Debian 的发行版上是这样。当然,你可以使用 [Evernote 替代品][14],比如 [Joplin][15],它们都是开源的。 + +-------------------------------------------------------------------------------- + +via: https://itsfoss.com/install-evernote-ubuntu/ + +作者:[Abhishek Prakash][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/abhishek/ +[b]: https://github.com/lujun9972 +[1]: https://evernote.com/ +[2]: https://evernote.com/intl/en/b1433t1422 +[3]: https://i0.wp.com/itsfoss.com/wp-content/uploads/2021/03/evernote-early-access-linux.png?resize=799%2C495&ssl=1 +[4]: https://itsfoss.com/install-deb-files-ubuntu/ +[5]: https://i2.wp.com/itsfoss.com/wp-content/uploads/2021/03/install-evernote-linux.png?resize=800%2C539&ssl=1 +[6]: https://i2.wp.com/itsfoss.com/wp-content/uploads/2021/03/evernote-ubuntu.jpg?resize=800%2C230&ssl=1 +[7]: https://i0.wp.com/itsfoss.com/wp-content/uploads/2021/03/evernote-running-ubuntu.png?resize=800%2C505&ssl=1 +[8]: https://i0.wp.com/itsfoss.com/wp-content/uploads/2021/03/evernote-on-ubuntu.png?resize=800%2C537&ssl=1 +[9]: https://itsfoss.com/dark-mode-ubuntu/ +[10]: https://itsfoss.com/install-skype-ubuntu-1404/ +[11]: https://itsfoss.com/note-taking-apps-linux/ +[12]: https://i2.wp.com/itsfoss.com/wp-content/uploads/2021/03/evernote-app-indicator.png?resize=800%2C480&ssl=1 +[13]: https://i2.wp.com/itsfoss.com/wp-content/uploads/2021/03/quit-evernote-linux.png?resize=799%2C448&ssl=1 +[14]: https://itsfoss.com/5-evernote-alternatives-linux/ +[15]: https://itsfoss.com/joplin/ diff --git a/published/202103/20210305 5 surprising things you can do with LibreOffice from the command line.md b/published/202103/20210305 5 surprising things you can do with LibreOffice from the command line.md new file mode 100644 index 0000000000..35a3f2fc9f --- /dev/null +++ b/published/202103/20210305 5 surprising things you can do with LibreOffice from the command line.md @@ -0,0 +1,171 @@ +[#]: subject: (5 surprising things you can do with LibreOffice from the command line) +[#]: via: (https://opensource.com/article/21/3/libreoffice-command-line) +[#]: author: (Don Watkins https://opensource.com/users/don-watkins) +[#]: collector: (lujun9972) +[#]: translator: (geekpi) +[#]: reviewer: (wxy) +[#]: publisher: (wxy) +[#]: url: (https://linux.cn/article-13219-1.html) + +5 个用命令行操作 LibreOffice 的技巧 +====== + +> 直接在命令行中对文件进行转换、打印、保护等操作。 + +![](https://img.linux.net.cn/data/attachment/album/202103/20/110200xjkkijnjixbyi4ui.jpg) + +LibreOffice 拥有所有你想要的办公软件套件的生产力功能,使其成为微软 Office 或谷歌套件的流行的开源替代品。LibreOffice 的能力之一是可以从命令行操作。例如,Seth Kenlon 最近解释了如何使用 LibreOffice 用全局 [命令行选项将多个文件][2] 从 DOCX 转换为 EPUB。他的文章启发我分享一些其他 LibreOffice 命令行技巧和窍门。 + +在查看 LibreOffice 命令的一些隐藏功能之前,你需要了解如何使用应用选项。并不是所有的应用都接受选项(除了像 `--help` 选项这样的基本选项,它在大多数 Linux 应用中都可以使用)。 + +``` +$ libreoffice --help +``` + +这将返回 LibreOffice 接受的其他选项的描述。有些应用没有太多选项,但 LibreOffice 好几页有用的选项,所以有很多东西可以玩。 + +就是说,你可以在终端上使用 LibreOffice 进行以下五项有用的操作,来让使软件更加有用。 + +### 1、自定义你的启动选项 + +你可以修改你启动 LibreOffice 的方式。例如,如果你想只打开 LibreOffice 的文字处理器组件: + +``` +$ libreoffice --writer  # 启动文字处理器 +``` + +你可以类似地打开它的其他组件: + + +``` +$ libreoffice --calc  # 启动一个空的电子表格 +$ libreoffice --draw  # 启动一个空的绘图文档 +$ libreoffice --web   # 启动一个空的 HTML 文档 +``` + +你也可以从命令行访问特定的帮助文件: + +``` +$ libreoffice --helpwriter +``` + +![LibreOffice Writer help][3] + +或者如果你需要电子表格应用方面的帮助: + +``` +$ libreoffice --helpcalc +``` + +你可以在不显示启动屏幕的情况下启动 LibreOffice: + +``` +$ libreoffice --writer --nologo +``` + +你甚至可以在你完成当前窗口的工作时,让它在后台最小化启动: + +``` +$ libreoffice --writer --minimized +``` + +### 2、以只读模式打开一个文件 + +你可以使用 `--view` 以只读模式打开文件,以防止意外地对重要文件进行修改和保存: + +``` +$ libreoffice --view example.odt +``` + +### 3、打开一个模板文档 + +你是否曾经创建过用作信头或发票表格的文档?LibreOffice 具有丰富的内置模板系统,但是你可以使用 `-n` 选项将任何文档作为模板: + +``` +$ libreoffice --writer -n example.odt +``` + +你的文档将在 LibreOffice 中打开,你可以对其进行修改,但保存时不会覆盖原始文件。 + +### 4、转换文档 + +当你需要做一个小任务,比如将一个文件转换为新的格式时,应用启动的时间可能与完成任务的时间一样长。解决办法是 `--headless` 选项,它可以在不启动图形用户界面的情况下执行 LibreOffice 进程。 + +例如,在 LibreOffic 中,将一个文档转换为 EPUB 是一个非常简单的任务,但使用 `libreoffice` 命令就更容易: + +``` +$ libreoffice --headless --convert-to epub example.odt +``` + +使用通配符意味着你可以一次转换几十个文档: + +``` +$ libreoffice --headless --convert-to epub *.odt +``` + +你可以将文件转换为多种格式,包括 PDF、HTML、DOC、DOCX、EPUB、纯文本等。 + +### 5、从终端打印 + +你可以从命令行打印 LibreOffice 文档,而无需打开应用: + +``` +$ libreoffice --headless -p example.odt +``` + +这个选项不需要打开 LibreOffice 就可以使用默认打印机打印,它只是将文档发送到你的打印机。 + +要打印一个目录中的所有文件: + +``` +$ libreoffice -p *.odt +``` + +(我不止一次执行了这个命令,然后用完了纸,所以在你开始之前,确保你的打印机里有足够的纸张。) + +你也可以把文件输出成 PDF。通常这和使用 `--convert-to-pdf` 选项没有什么区别,但是很容易记住: + + +``` +$ libreoffice --print-to-file example.odt --headless +``` + +### 额外技巧:Flatpak 和命令选项 + +如果你是使用 [Flatpak][5] 安装的 LibreOffice,所有这些命令选项都可以使用,但你必须通过 Flatpak 传递。下面是一个例子: + +``` +$ flatpak run org.libreoffice.LibreOffice --writer +``` + +它比本地安装要麻烦得多,所以你可能会受到启发 [写一个 Bash 别名][6] 来使它更容易直接与 LibreOffice 交互。 + +### 令人惊讶的终端选项 + +通过查阅手册页面,了解如何从命令行扩展 LibreOffice 的功能: + +``` +$ man libreoffice +``` + +你是否知道 LibreOffice 具有如此丰富的命令行选项? 你是否发现了其他人似乎都不了解的其他选项? 请在评论中分享它们! + +-------------------------------------------------------------------------------- + +via: https://opensource.com/article/21/3/libreoffice-command-line + +作者:[Don Watkins][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/don-watkins +[b]: https://github.com/lujun9972 +[1]: https://opensource.com/sites/default/files/styles/image-full-size/public/lead-images/shortcut_command_function_editing_key.png?itok=a0sEc5vo (hot keys for shortcuts or features on computer keyboard) +[2]: https://opensource.com/article/21/2/linux-workday +[3]: https://opensource.com/sites/default/files/uploads/libreoffice-help.png (LibreOffice Writer help) +[4]: https://creativecommons.org/licenses/by-sa/4.0/ +[5]: https://www.libreoffice.org/download/flatpak/ +[6]: https://opensource.com/article/19/7/bash-aliases diff --git a/published/202103/20210307 Track your family calendar with a Raspberry Pi and a low-power display.md b/published/202103/20210307 Track your family calendar with a Raspberry Pi and a low-power display.md new file mode 100644 index 0000000000..165ca68e13 --- /dev/null +++ b/published/202103/20210307 Track your family calendar with a Raspberry Pi and a low-power display.md @@ -0,0 +1,81 @@ +[#]: subject: (Track your family calendar with a Raspberry Pi and a low-power display) +[#]: via: (https://opensource.com/article/21/3/family-calendar-raspberry-pi) +[#]: author: (Javier Pena https://opensource.com/users/jpena) +[#]: collector: (lujun9972) +[#]: translator: (wyxplus) +[#]: reviewer: (wxy) +[#]: publisher: (wxy) +[#]: url: (https://linux.cn/article-13222-1.html) + +利用树莓派和低功耗显示器来跟踪你的家庭日程表 +====== + +> 通过利用开源工具和电子墨水屏,让每个人都清楚家庭的日程安排。 + +![](https://img.linux.net.cn/data/attachment/album/202103/21/091512dkbgb3vzgjrz2935.jpg) + +有些家庭的日程安排很复杂:孩子们有上学活动和放学后的活动,你想要记住的重要事情,每个人都有多个约会等等。虽然你可以使用手机和应用程序来关注所有事情,但在家中放置一个大型低功耗显示器以显示家人的日程不是更好吗?电子墨水日程表刚好满足! + +![E Ink calendar][2] + +### 硬件 + +这个项目是作为假日项目开始,因此我试着尽可能多的旧物利用。其中包括一台已经闲置了太长时间树莓派 2。由于我没有电子墨水屏,因此我需要购买一个。幸运的是,我找到了一家供应商,该供应商为支持树莓派的屏幕提供了 [开源驱动程序和示例][4],该屏幕使用 [GPIO][5] 端口连接。 + +我的家人还想在不同的日程表之间切换,因此需要某种形式的输入。我没有添加 USB 键盘,而是选择了一种更简单的解决方案,并购买了一个类似于在 [这篇文章][6] 中所描述 1x4 大小的键盘。这使我可以将键盘连接到树莓派中的某些 GPIO 端口。 + +最后,我需要一个相框来容纳整个设置。虽然背面看起来有些凌乱,但它能完成工作。 + +![Calendar internals][7] + +### 软件 + +我从 [一个类似的项目][8] 中获得了灵感,并开始为我的项目编写 Python 代码。我需要从两个地方获取数据: + + * 天气信息:从 [OpenWeather API][9] 获取 + * 时间信息:我打算使用 [CalDav 标准][10] 连接到一个在我家服务器上运行的日程表 + +由于必须等待一些零件的送达,因此我使用了模块化的方法来进行输入和显示,这样我可以在没有硬件的情况下调试大多数代码。日程表应用程序需要驱动程序,于是我编写了一个 [Pygame][11] 驱动程序以便能在台式机上运行它。 + +编写代码最好的部分是能够重用现有的开源项目,所以访问不同的 API 很容易。我可以专注于设计用户界面,其中包括每个人的周历和每个人的日历,以及允许使用小键盘来选择日程。并且我花时间又添加了一些额外的功能,例如特殊日子的自定义屏幕保护程序。 + +![E Ink calendar screensaver][12] + +最后的集成步骤将确保我的日程表应用程序将在启动时运行,并且能够容错。我使用了一个基本的 [树莓派系统][13] 镜像,并将该应用程序配置到 systemd 服务,以便它可以在出现故障和系统重新启动依旧运行。 + +做完所有工作,我把代码上传到了 [GitHub][14]。因此,如果你要创建类似的日历,可以随时查看并重构它! + +### 结论 + +日程表已成为我们厨房中的日常工具。它可以帮助我们记住我们的日常活动,甚至我们的孩子在上学前,都可以使用它来查看日程的安排。 + +对我而言,这个项目让我感受到开源的力量。如果没有开源的驱动程序、库以及开放 API,我们依旧还在用纸和笔来安排日程。很疯狂,不是吗? + +需要确保你的日程不冲突吗?学习如何使用这些免费的开源项目来做到这点。 + +------ +via: https://opensource.com/article/21/3/family-calendar-raspberry-pi + +作者:[Javier Pena][a] +选题:[lujun9972][b] +译者:[wyxplus](https://github.com/wyxplus) +校对:[wxy](https://github.com/wxy) + +本文由 [LCTT](https://github.com/LCTT/TranslateProject) 原创编译,[Linux中国](https://linux.cn/) 荣誉推出 + +[a]: https://opensource.com/users/jpena +[b]: https://github.com/lujun9972 +[1]: https://opensource.com/sites/default/files/styles/image-full-size/public/lead-images/calendar-coffee.jpg?itok=9idm1917 "Calendar with coffee and breakfast" +[2]: https://opensource.com/sites/default/files/uploads/calendar.jpg "E Ink calendar" +[3]: https://creativecommons.org/licenses/by-sa/4.0/ +[4]: https://github.com/waveshare/e-Paper +[5]: https://opensource.com/article/19/3/gpio-pins-raspberry-pi +[6]: https://www.instructables.com/1x4-Membrane-Keypad-w-Arduino/ +[7]: https://opensource.com/sites/default/files/uploads/calendar_internals.jpg "Calendar internals" +[8]: https://github.com/zli117/EInk-Calendar +[9]: https://openweathermap.org +[10]: https://en.wikipedia.org/wiki/CalDAV +[11]: https://github.com/pygame/pygame +[12]: https://opensource.com/sites/default/files/uploads/calendar_screensaver.jpg "E Ink calendar screensaver" +[13]: https://www.raspberrypi.org/software/ +[14]: https://github.com/javierpena/eink-calendar diff --git a/published/202103/20210308 How to use Poetry to manage your Python projects on Fedora.md b/published/202103/20210308 How to use Poetry to manage your Python projects on Fedora.md new file mode 100644 index 0000000000..6692e699d1 --- /dev/null +++ b/published/202103/20210308 How to use Poetry to manage your Python projects on Fedora.md @@ -0,0 +1,200 @@ +[#]: subject: (How to use Poetry to manage your Python projects on Fedora) +[#]: via: (https://fedoramagazine.org/how-to-use-poetry-to-manage-your-python-projects-on-fedora/) +[#]: author: (Kader Miyanyedi https://fedoramagazine.org/author/moonkat/) +[#]: collector: (lujun9972) +[#]: translator: (geekpi) +[#]: reviewer: (wxy) +[#]: publisher: (wxy) +[#]: url: (https://linux.cn/article-13202-1.html) + +如何在 Fedora 上使用 Poetry 来管理你的 Python 项目? +====== + +![Python & Poetry on Fedora][1] + +Python 开发人员经常创建一个新的虚拟环境来分离项目依赖,然后用 `pip`、`pipenv` 等工具来管理它们。Poetry 是一个简化 Python 中依赖管理和打包的工具。这篇文章将向你展示如何在 Fedora 上使用 Poetry 来管理你的 Python 项目。 + +与其他工具不同,Poetry 只使用一个配置文件来进行依赖管理、打包和发布。这消除了对不同文件的需求,如 `Pipfile`、`MANIFEST.in`、`setup.py` 等。这也比使用多个工具更快。 + +下面详细介绍一下开始使用 Poetry 时使用的命令。 + +### 在 Fedora 上安装 Poetry + +如果你已经使用 Fedora 32 或以上版本,你可以使用这个命令直接从命令行安装 Poetry: + +``` +$ sudo dnf install poetry +``` + +编者注:在 Fedora Silverblue 或 CoreOs上,Python 3.9.2 是核心提交的一部分,你可以用下面的命令安装 Poetry: + +``` +rpm-ostree install poetry +``` + +### 初始化一个项目 + +使用 `new` 命令创建一个新项目: + +``` +$ poetry new poetry-project +``` + +用 Poetry 创建的项目结构是这样的: + +``` +├── poetry_project +│ └── init.py +├── pyproject.toml +├── README.rst +└── tests + ├── init.py + └── test_poetry_project.py +``` + +Poetry 使用 `pyproject.toml` 来管理项目的依赖。最初,这个文件看起来类似于这样: + +``` +[tool.poetry] +name = "poetry-project" +version = "0.1.0" +description = "" +authors = ["Kadermiyanyedi "] + +[tool.poetry.dependencies] +python = "^3.9" + +[tool.poetry.dev-dependencies] +pytest = "^5.2" + +[build-system] +requires = ["poetry>=0.12"] +build-backend = "poetry.masonry.api" +``` + +这个文件包含 4 个部分: + + * 第一部分包含描述项目的信息,如项目名称、项目版本等。 + * 第二部分包含项目的依赖。这些依赖是构建项目所必需的。 + * 第三部分包含开发依赖。 + * 第四部分描述的是符合 [PEP 517][2] 的构建系统。 + +如果你已经有一个项目,或者创建了自己的项目文件夹,并且你想使用 Poetry,请在你的项目中运行 `init` 命令。 + +``` +$ poetry init +``` + +在这个命令之后,你会看到一个交互式的 shell 来配置你的项目。 + +### 创建一个虚拟环境 + +如果你想创建一个虚拟环境或激活一个现有的虚拟环境,请使用以下命令: + +``` +$ poetry shell +``` + +Poetry 默认在 `/home/username/.cache/pypoetry` 项目中创建虚拟环境。你可以通过编辑 Poetry 配置来更改默认路径。使用下面的命令查看配置列表: + +``` +$ poetry config --list + +cache-dir = "/home/username/.cache/pypoetry" +virtualenvs.create = true +virtualenvs.in-project = true +virtualenvs.path = "{cache-dir}/virtualenvs" +``` + +修改 `virtualenvs.in-project` 配置变量,在项目目录下创建一个虚拟环境。Poetry 命令是: + +``` +$ poetry config virtualenv.in-project true +``` + +### 添加依赖 + +使用 `poetry add` 命令为项目安装一个依赖: + +``` +$ poetry add django +``` + +你可以使用带有 `--dev` 选项的 `add` 命令来识别任何只用于开发环境的依赖: + +``` +$ poetry add black --dev +``` + +`add` 命令会创建一个 `poetry.lock` 文件,用来跟踪软件包的版本。如果 `poetry.lock` 文件不存在,那么会安装 `pyproject.toml` 中所有依赖项的最新版本。如果 `poetry.lock` 存在,Poetry 会使用文件中列出的确切版本,以确保每个使用这个项目的人的软件包版本是一致的。 + +使用 `poetry install` 命令来安装当前项目中的所有依赖: + +``` +$ poetry install +``` + +通过使用 `--no-dev` 选项防止安装开发依赖: + +``` +$ poetry install --no-dev +``` + +### 列出软件包 + +`show` 命令会列出所有可用的软件包。`--tree` 选项将以树状列出软件包: + +``` +$ poetry show --tree + +django 3.1.7 A high-level Python Web framework that encourages rapid development and clean, pragmatic design. +├── asgiref >=3.2.10,<4 +├── pytz * +└── sqlparse >=0.2.2 +``` + +包含软件包名称,以列出特定软件包的详细信息: + +``` +$ poetry show requests + +name : requests +version : 2.25.1 +description : Python HTTP for Humans. + +dependencies + - certifi >=2017.4.17 + - chardet >=3.0.2,<5 + - idna >=2.5,<3 + - urllib3 >=1.21.1,<1.27 +``` + +最后,如果你想知道软件包的最新版本,你可以通过 `--latest` 选项: + +``` +$ poetry show --latest + +idna 2.10 3.1 Internationalized Domain Names in Applications +asgiref 3.3.1 3.3.1 ASGI specs, helper code, and adapters +``` + +### 更多信息 + +Poetry 的更多详情可在[文档][3]中获取。 + +-------------------------------------------------------------------------------- + +via: https://fedoramagazine.org/how-to-use-poetry-to-manage-your-python-projects-on-fedora/ + +作者:[Kader Miyanyedi][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/moonkat/ +[b]: https://github.com/lujun9972 +[1]: https://fedoramagazine.org/wp-content/uploads/2021/03/Poetry_Python-816x345.jpg +[2]: https://www.python.org/dev/peps/pep-0517/ +[3]: https://python-poetry.org/docs/ diff --git a/published/202103/20210309 Learn Python dictionary values with Jupyter.md b/published/202103/20210309 Learn Python dictionary values with Jupyter.md new file mode 100644 index 0000000000..2087eb3da6 --- /dev/null +++ b/published/202103/20210309 Learn Python dictionary values with Jupyter.md @@ -0,0 +1,150 @@ +[#]: subject: (Learn Python dictionary values with Jupyter) +[#]: via: (https://opensource.com/article/21/3/dictionary-values-python) +[#]: author: (Lauren Maffeo https://opensource.com/users/lmaffeo) +[#]: collector: (lujun9972) +[#]: translator: (DCOLIVERSUN) +[#]: reviewer: (wxy) +[#]: publisher: (wxy) +[#]: url: (https://linux.cn/article-13236-1.html) + +用 Jupyter 学习 Python 字典 +====== + +> 字典数据结构可以帮助你快速访问信息。 + +![](https://img.linux.net.cn/data/attachment/album/202103/26/094720i58u5qxx3l4qsssx.jpg) + +字典是 Python 编程语言使用的数据结构。一个 Python 字典由多个键值对组成;每个键值对将键映射到其关联的值上。 + +例如你是一名老师,想把学生姓名与成绩对应起来。你可以使用 Python 字典,将学生姓名映射到他们关联的成绩上。此时,键值对中键是姓名,值是对应的成绩。 + +如果你想知道某个学生的考试成绩,你可以从字典中访问。这种快捷查询方式可以为你节省解析整个列表找到学生成绩的时间。 + +本文介绍了如何通过键访问对应的字典值。学习前,请确保你已经安装了 [Anaconda 包管理器][2]和 [Jupyter 笔记本][3]。 + +### 1、在 Jupyter 中打开一个新的笔记本 + +首先在 Web 浏览器中打开并运行 Jupyter。然后, + + 1. 转到左上角的 “File”。 + 2. 选择 “New Notebook”,点击 “Python 3”。 + +![新建 Jupyter 笔记本][4] + +开始时,新建的笔记本是无标题的,你可以将其重命名为任何名称。我为我的笔记本取名为 “OpenSource.com Data Dictionary Tutorial”。 + +笔记本中标有行号的位置就是你写代码的区域,也是你输入的位置。 + +在 macOS 上,可以同时按 `Shift + Return` 键得到输出。在创建新的代码区域前,请确保完成上述动作;否则,你写的任何附加代码可能无法运行。 + +### 2、新建一个键值对 + +在字典中输入你希望访问的键与值。输入前,你需要在字典上下文中定义它们的含义: + +``` +empty_dictionary = {} +grades = { +    "Kelsey": 87, +    "Finley": 92 +} + +one_line = {a: 1, b: 2} +``` + +![定义字典键值对的代码][6] + +这段代码让字典将特定键与其各自的值关联起来。字典按名称存储数据,从而可以更快地查询。 + +### 3、通过键访问字典值 + +现在你想查询指定的字典值;在上述例子中,字典值指特定学生的成绩。首先,点击 “Insert” 后选择 “Insert Cell Below”。 + +![在 Jupyter 插入新建单元格][7] + +在新单元格中,定义字典中的键与值。 + +然后,告诉字典打印该值的键,找到需要的值。例如,查询名为 Kelsey 的学生的成绩: + +``` +# 访问字典中的数据 +grades = { +    "Kelsey": 87, +    "Finley": 92 +} + +print(grades["Kelsey"]) +87 +``` + +![查询特定值的代码][8] + +当你查询 Kelsey 的成绩(也就是你想要查询的值)时,如果你用的是 macOS,只需要同时按 `Shift+Return` 键。 + +你会在单元格下方看到 Kelsey 的成绩。 + +### 4、更新已有的键 + +当把一位学生的错误成绩添加到字典时,你会怎么办?可以通过更新字典、存储新值来修正这类错误。 + +首先,选择你想更新的那个键。在上述例子中,假设你错误地输入了 Finley 的成绩,那么 Finley 就是你需要更新的键。 + +为了更新 Finley 的成绩,你需要在下方插入新的单元格,然后创建一个新的键值对。同时按 `Shift+Return` 键打印字典全部信息: + +``` +grades["Finley"] = 90 +print(grades) + +{'Kelsey': 87; "Finley": 90} +``` + +![更新键的代码][9] + +单元格下方输出带有 Finley 更新成绩的字典。 + +### 5、添加新键 + +假设你得到一位新学生的考试成绩。你可以用新键值对将那名学生的姓名与成绩补充到字典中。 + +插入新的单元格,以键值对形式添加新学生的姓名与成绩。当你完成这些后,同时按 `Shift+Return` 键打印字典全部信息: + +``` +grades["Alex"] = 88 +print(grades) + +{'Kelsey': 87, 'Finley': 90, 'Alex': 88} +``` + +![添加新键][10] + +所有的键值对输出在单元格下方。 + +### 使用字典 + +请记住,键与值可以是任意数据类型,但它们很少是[扩展数据类型][11]non-primitive types。此外,字典不能以指定的顺序存储、组织里面的数据。如果你想要数据有序,最好使用 Python 列表,而非字典。 + +如果你考虑使用字典,首先要确认你的数据结构是否是合适的,例如像电话簿的结构。如果不是,列表、元组、树或者其他数据结构可能是更好的选择。 + +-------------------------------------------------------------------------------- + +via: https://opensource.com/article/21/3/dictionary-values-python + +作者:[Lauren Maffeo][a] +选题:[lujun9972][b] +译者:[DCOLIVERSUN](https://github.com/DCOLIVERSUN) +校对:[wxy](https://github.com/wxy) + +本文由 [LCTT](https://github.com/LCTT/TranslateProject) 原创编译,[Linux中国](https://linux.cn/) 荣誉推出 + +[a]: https://opensource.com/users/lmaffeo +[b]: https://github.com/lujun9972 +[1]: https://opensource.com/sites/default/files/styles/image-full-size/public/lead-images/python-programming-code-keyboard.png?itok=fxiSpmnd (Hands on a keyboard with a Python book ) +[2]: https://docs.anaconda.com/anaconda/ +[3]: https://opensource.com/article/18/3/getting-started-jupyter-notebooks +[4]: https://opensource.com/sites/default/files/uploads/new-jupyter-notebook.png (Create Jupyter notebook) +[5]: https://creativecommons.org/licenses/by-sa/4.0/ +[6]: https://opensource.com/sites/default/files/uploads/define-keys-values.png (Code for defining key-value pairs in the dictionary) +[7]: https://opensource.com/sites/default/files/uploads/jupyter_insertcell.png (Inserting a new cell in Jupyter) +[8]: https://opensource.com/sites/default/files/uploads/lookforvalue.png (Code to look for a specific value) +[9]: https://opensource.com/sites/default/files/uploads/jupyter_updatekey.png (Code for updating a key) +[10]: https://opensource.com/sites/default/files/uploads/jupyter_addnewkey.png (Add a new key) +[11]: https://www.datacamp.com/community/tutorials/data-structures-python diff --git a/published/202103/20210309 Use gImageReader to Extract Text From Images and PDFs on Linux.md b/published/202103/20210309 Use gImageReader to Extract Text From Images and PDFs on Linux.md new file mode 100644 index 0000000000..af9f99d71a --- /dev/null +++ b/published/202103/20210309 Use gImageReader to Extract Text From Images and PDFs on Linux.md @@ -0,0 +1,101 @@ +[#]: subject: (Use gImageReader to Extract Text From Images and PDFs on Linux) +[#]: via: (https://itsfoss.com/gimagereader-ocr/) +[#]: author: (Ankush Das https://itsfoss.com/author/ankush/) +[#]: collector: (lujun9972) +[#]: translator: (geekpi) +[#]: reviewer: (wxy) +[#]: publisher: (wxy) +[#]: url: (https://linux.cn/article-13205-1.html) + +在 Linux 上使用 gImageReader 从图像和 PDF 中提取文本 +====== + +> gImageReader 是一个 GUI 工具,用于在 Linux 中利用 Tesseract OCR 引擎从图像和 PDF 文件中提取文本。 + +[gImageReader][1] 是 [Tesseract 开源 OCR 引擎][2]的一个前端。Tesseract 最初是由 HP 公司开发的,然后在 2006 年开源。 + +基本上,OCR(光学字符识别)引擎可以让你从图片或文件(PDF)中扫描文本。默认情况下,它可以检测几种语言,还支持通过 Unicode 字符扫描。 + +然而,Tesseract 本身是一个没有任何 GUI 的命令行工具。因此,gImageReader 就来解决这点,它可以让任何用户使用它从图像和文件中提取文本。 + +让我重点介绍一些有关它的内容,同时说下我在测试期间的使用经验。 + +### gImageReader:一个跨平台的 Tesseract OCR 前端 + +![][3] + +为了简化事情,gImageReader 在从 PDF 文件或包含任何类型文本的图像中提取文本时非常方便。 + +无论你是需要它来进行拼写检查还是翻译,它都应该对特定的用户群体有用。 + +以列表总结下功能,这里是你可以用它做的事情: + + * 从磁盘、扫描设备、剪贴板和截图中添加 PDF 文档和图像 + * 能够旋转图像 + * 常用的图像控制,用于调整亮度、对比度和分辨率。 + * 直接通过应用扫描图像 + * 能够一次性处理多个图像或文件 + * 手动或自动识别区域定义 + * 识别纯文本或 [hOCR][4] 文档 + * 编辑器显示识别的文本 + * 可对对提取的文本进行拼写检查 + * 从 hOCR 文件转换/导出为 PDF 文件 + * 将提取的文本导出为 .txt 文件 + * 跨平台(Windows) + +### 在 Linux 上安装 gImageReader + +**注意**:你需要安装 Tesseract 语言包,才能从软件管理器中的图像/文件中进行检测。 + +![][5] + +你可以在一些 Linux 发行版如 Fedora 和 Debian 的默认仓库中找到 gImageReader。 + +对于 Ubuntu,你需要添加一个 PPA,然后安装它。要做到这点,下面是你需要在终端中输入的内容: + +``` +sudo add-apt-repository ppa:sandromani/gimagereader +sudo apt update +sudo apt install gimagereader +``` + +你也可以从 openSUSE 的构建服务中找到它,Arch Linux 用户可在 [AUR][6] 中找到。 + +所有的仓库和包的链接都可以在他们的 [GitHub 页面][1]中找到。 + +### gImageReader 使用经验 + +当你需要从图像中提取文本时,gImageReader 是一个相当有用的工具。当你尝试从 PDF 文件中提取文本时,它的效果非常好。 + +对于从智能手机拍摄的图片中提取,检测很接近,但有点不准确。也许当你进行扫描时,从文件中识别字符可能会更好。 + +所以,你需要亲自尝试一下,看看它是否对你而言工作良好。我在 Linux Mint 20.1(基于 Ubuntu 20.04)上试过。 + +我只遇到了一个从设置中管理语言的问题,我没有得到一个快速的解决方案。如果你遇到此问题,那么可能需要对其进行故障排除,并进一步了解如何解决该问题。 + +![][7] + +除此之外,它工作良好。 + +试试吧,让我知道它是如何为你服务的!如果你知道类似的东西(和更好的),请在下面的评论中告诉我。 + +-------------------------------------------------------------------------------- + +via: https://itsfoss.com/gimagereader-ocr/ + +作者:[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://github.com/manisandro/gImageReader +[2]: https://tesseract-ocr.github.io/ +[3]: https://i0.wp.com/itsfoss.com/wp-content/uploads/2021/03/gImageReader.png?resize=800%2C456&ssl=1 +[4]: https://en.wikipedia.org/wiki/HOCR +[5]: https://i0.wp.com/itsfoss.com/wp-content/uploads/2021/03/tesseract-language-pack.jpg?resize=800%2C620&ssl=1 +[6]: https://itsfoss.com/aur-arch-linux/ +[7]: https://i0.wp.com/itsfoss.com/wp-content/uploads/2021/03/gImageReader-1.jpg?resize=800%2C460&ssl=1 diff --git a/published/202103/20210310 How to Update openSUSE Linux System.md b/published/202103/20210310 How to Update openSUSE Linux System.md new file mode 100644 index 0000000000..9ff041647e --- /dev/null +++ b/published/202103/20210310 How to Update openSUSE Linux System.md @@ -0,0 +1,107 @@ +[#]: subject: (How to Update openSUSE Linux System) +[#]: via: (https://itsfoss.com/update-opensuse/) +[#]: author: (Abhishek Prakash https://itsfoss.com/author/abhishek/) +[#]: collector: (lujun9972) +[#]: translator: (geekpi) +[#]: reviewer: (wxy) +[#]: publisher: (wxy) +[#]: url: (https://linux.cn/article-13199-1.html) + +如何更新 openSUSE Linux 系统 +====== + +![](https://img.linux.net.cn/data/attachment/album/202103/13/110932nsq33tjit9933h2k.jpg) + +就我记忆所及,我一直是 Ubuntu 的用户。我曾经转向过其他发行版,但最终还是一次次回到 Ubuntu。但最近,我开始使用 openSUSE 来尝试一些非 Debian 的东西。 + +随着我对 [openSUSE][1] 的不断探索,我不断发现 SUSE 中略有不同的东西,并打算在教程中介绍它们。 + +第一篇我写的是更新 openSUSE 系统。有两种方法可以做到: + + * 使用终端(适用于 openSUSE 桌面和服务器) + * 使用图形工具(适用于 openSUSE 桌面) + +### 通过命令行更新 openSUSE + +更新 openSUSE 的最简单方法是使用 `zypper` 命令。它提供了补丁和更新管理的全部功能。它可以解决文件冲突和依赖性问题。更新也包括 Linux 内核。 + +如果你正在使用 openSUSE Leap,请使用这个命令: + +``` +sudo zypper update +``` + +你也可以用 `up` 代替 `update`,但我觉得 `update` 更容易记住。 + +如果你正在使用 openSUSE Tumbleweed,请使用 `dist-upgrade` 或者 `dup`(简称)。Tumbleweed 是[滚动发行版][2],因此建议使用 `dist-upgrade` 选项。 + +``` +sudo zypper dist-upgrade +``` + +它将显示要升级、删除或安装的软件包列表。 + +![][3] + +如果你的系统需要重启,你会得到通知。 + +如果你只是想刷新仓库(像 `sudo apt update` 一样),你可以使用这个命令: + +``` +sudo zypper refresh +``` + +如果你想列出可用的更新,也可以这样做: + +``` +sudo zypper list-updates +``` + +### 以图形方式更新 openSUSE + +如果你使用 openSUSE 作为桌面,你可以选择使用 GUI 工具来安装更新。这个工具可能会根据 [你使用的桌面环境][4] 而改变。 + +例如,KDE 有自己的软件中心,叫做 “Discover”。你可以用它来搜索和安装新的应用。你也可以用它来安装系统更新。 + +![][5] + +事实上,KDE 会在通知区通知你可用的系统更新。你必须打开 Discover,因为点击通知不会自动进入 Discover。 + +![][6] + +如果你觉得这很烦人,你可以使用这些命令禁用它: + +``` +sudo zypper remove plasma5-pk-updates +sudo zypper addlock plasma5-pk-updates +``` + +不过我不推荐。最好是获取可用的更新通知。 + +还有一个 YAST 软件管理 [GUI 工具][7],你可以用它来对软件包管理进行更精细的控制。 + +![][8] + +就是这些了。这是一篇简短的文章。在下一篇 SUSE 教程中,我将通过实例向大家展示一些常用的 `zypper` 命令。敬请期待。 + +-------------------------------------------------------------------------------- + +via: https://itsfoss.com/update-opensuse/ + +作者:[Abhishek Prakash][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/abhishek/ +[b]: https://github.com/lujun9972 +[1]: https://www.opensuse.org/ +[2]: https://itsfoss.com/rolling-release/ +[3]: https://i0.wp.com/itsfoss.com/wp-content/uploads/2021/03/update-opensuse-with-zypper.png?resize=800%2C406&ssl=1 +[4]: https://itsfoss.com/find-desktop-environment/ +[5]: https://i0.wp.com/itsfoss.com/wp-content/uploads/2021/03/opensuse-update-gui.png?resize=800%2C500&ssl=1 +[6]: https://i1.wp.com/itsfoss.com/wp-content/uploads/2021/03/update-notification-opensuse.png?resize=800%2C259&ssl=1 +[7]: https://itsfoss.com/gui-cli-tui/ +[8]: https://i1.wp.com/itsfoss.com/wp-content/uploads/2021/03/yast-software-management-suse.png?resize=800%2C448&ssl=1 diff --git a/published/202103/20210310 Understanding file names and directories in FreeDOS.md b/published/202103/20210310 Understanding file names and directories in FreeDOS.md new file mode 100644 index 0000000000..41fa649a93 --- /dev/null +++ b/published/202103/20210310 Understanding file names and directories in FreeDOS.md @@ -0,0 +1,110 @@ +[#]: subject: (Understanding file names and directories in FreeDOS) +[#]: via: (https://opensource.com/article/21/3/files-freedos) +[#]: author: (Kevin O'Brien https://opensource.com/users/ahuka) +[#]: collector: (lujun9972) +[#]: translator: (geekpi) +[#]: reviewer: (wxy) +[#]: publisher: (wxy) +[#]: url: (https://linux.cn/article-13208-1.html) + +了解 FreeDOS 中的文件名和目录 +====== + +> 了解如何在 FreeDOS 中创建,编辑和命名文件。 + +![](https://img.linux.net.cn/data/attachment/album/202103/16/094544qanrpbnlmltilump.jpg) + +开源操作系统 [FreeDOS][2] 是一个久经考验的项目,可帮助用户玩复古游戏、更新固件、运行过时但受欢迎的应用以及研究操作系统设计。FreeDOS 提供了有关个人计算历史的见解(因为它实现了 80 年代初的事实上的操作系统),但是它是在现代环境中进行的。在本文中,我将使用 FreeDOS 来解释文件名和扩展名是如何发展的。 + +### 了解文件名和 ASCII 文本 + +FreeDOS 文件名遵循所谓的 *8.3 惯例*。这意味着所有的 FreeDOS 文件名都有两个部分,分别包含最多八个和三个字符。第一部分通常被称为*文件名*(这可能会让人有点困惑,因为文件名和文件扩展名的组合也被称为文件名)。这一部分可以有一个到八个字符。之后是*扩展名*,可以有零到三个字符。这两部分之间用一个点隔开。 + +文件名可以使用任何字母或数字。键盘上的许多其他字符也是允许的,但不是所有的字符。这是因为许多其他字符在 FreeDOS 中被指定了特殊用途。一些可以出现在 FreeDOS 文件名中的字符有: + + +``` +~ ! @ # $ % ^ & ( ) _ - { } ` +``` + +扩展 [ASCII][3] 字符集中也有一些字符可以使用,例如 `�`。 + +在 FreeDOS 中具有特殊意义的字符,因此不能用于文件名中,包括: + +``` +* / + | \ = ? [ ] ; : " . < > , +``` + +另外,你不能在 FreeDOS 文件名中使用空格。FreeDOS 控制台[使用空格将命令的与选项和参数分隔][4]。 + +FreeDOS 是*不区分大小写*的,所以不管你是使用大写字母还是小写字母都无所谓。所有的字母都会被转换为大写字母,所以无论你做什么,你的文件最终都会在名称中使用大写字母。 + +#### 文件扩展名 + +FreeDOS 中的文件不需要有扩展名,但文件扩展名确实有一些用途。某些文件扩展名在 FreeDOS 中有内置的含义,例如: + + * **EXE**:可执行文件 + * **COM**:命令文件 + * **SYS**:系统文件 + * **BAT**:批处理文件 + +特定的软件程序使用其他扩展名,或者你可以在创建文件时使用它们。这些扩展名没有绝对的文件关联,因此如果你使用 FreeDOS 的文字处理器,你的文件使用什么扩展名并不重要。如果你愿意,你可以发挥创意,将扩展名作为你的文件系统的一部分。例如,你可以用 `*.JAN`、`*.FEB`、`*.MAR`、`*.APR` 等等来命名你的备忘录。 + +### 编辑文件 + +FreeDOS 自带的 Edit 应用可以快速方便地进行文本编辑。它是一个简单的编辑器,沿屏幕顶部有一个菜单栏,可以方便地访问所有常用的功能(如复制、粘贴、保存等)。 + +![Editing in FreeDOS][5] + +正如你所期望的那样,还有很多其他的文本编辑器可以使用,包括小巧但用途广泛的 [e3 编辑器][7]。你可以在 GitLab 上找到各种各样的 [FreeDOS 应用][8] 。 + +### 创建文件 + +你可以在 FreeDOS 中使用 `touch` 命令创建空文件。这个简单的工具可以更新文件的修改时间或创建一个新文件。 + +``` +C:\>touch foo.txt +C:\>dir +FOO TXT 0 01-12-2021 10:00a +``` + +你也可以直接从 FreeDOS 控制台创建文件,而不需要使用 Edit 文本编辑器。首先,使用 `copy` 命令将控制台中的输入(简称 `con`)复制到一个新的文件对象中。用 `Ctrl+Z` 终止输入,然后按**回车**键: + +``` +C:\>copy con test.txt +con => test.txt +This is a test file. +^Z +``` + +`Ctrl+Z` 字符在控制台中显示为 `^Z`。它并没有被复制到文件中,而是作为文件结束(EOF)的分隔符。换句话说,它告诉 FreeDOS 何时停止复制。这是一个很好的技巧,可以用来做快速的笔记或开始一个简单的文档,以便以后工作。 + +### 文件和 FreeDOS + +FreeDOS 是开源的、免费的且 [易于安装][9]。探究 FreeDOS 如何处理文件,可以帮助你了解多年来计算的发展,不管你平时使用的是什么操作系统。启动 FreeDOS,开始探索现代复古计算吧! + +_本文中的部分信息曾发表在 [DOS 课程 7:DOS 文件名;ASCII][10] 中(CC BY-SA 4.0)。_ + +-------------------------------------------------------------------------------- + +via: https://opensource.com/article/21/3/files-freedos + +作者:[Kevin O'Brien][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/ahuka +[b]: https://github.com/lujun9972 +[1]: https://opensource.com/sites/default/files/styles/image-full-size/public/lead-images/files_documents_paper_folder.png?itok=eIJWac15 (Files in a folder) +[2]: https://www.freedos.org/ +[3]: tmp.2sISc4Tp3G#ASCII +[4]: https://opensource.com/article/21/2/set-your-path-freedos +[5]: https://opensource.com/sites/default/files/uploads/freedos_2_files-edit.jpg (Editing in FreeDOS) +[6]: https://creativecommons.org/licenses/by-sa/4.0/ +[7]: https://opensource.com/article/20/12/e3-linux +[8]: https://gitlab.com/FDOS/ +[9]: https://opensource.com/article/18/4/gentle-introduction-freedos +[10]: https://www.ahuka.com/dos-lessons-for-self-study-purposes/dos-lesson-7-dos-filenames-ascii/ diff --git a/published/202103/20210311 Linux Mint Cinnamon vs MATE vs Xfce- Which One Should You Use.md b/published/202103/20210311 Linux Mint Cinnamon vs MATE vs Xfce- Which One Should You Use.md new file mode 100644 index 0000000000..001e18125d --- /dev/null +++ b/published/202103/20210311 Linux Mint Cinnamon vs MATE vs Xfce- Which One Should You Use.md @@ -0,0 +1,175 @@ +[#]: subject: (Linux Mint Cinnamon vs MATE vs Xfce: Which One Should You Use?) +[#]: via: (https://itsfoss.com/linux-mint-cinnamon-mate-xfce/) +[#]: author: (Dimitrios https://itsfoss.com/author/dimitrios/) +[#]: collector: (lujun9972) +[#]: translator: (wxy) +[#]: reviewer: (wxy) +[#]: publisher: (wxy) +[#]: url: (https://linux.cn/article-13213-1.html) + +Cinnamon vs MATE vs Xfce:你应该选择那一个 Linux Mint 口味? +====== + +![](https://img.linux.net.cn/data/attachment/album/202103/18/111916ljidnfwwsxec1fqf.jpg) + +Linux Mint 无疑是 [最适合初学者的 Linux 发行版之一][1]。尤其是对于刚刚迈向 Linux 世界的 Windows 用户来说,更是如此。 + +2006 年以来(也就是 Linux Mint 首次发布的那一年),他们开发了一系列的提高用户的体验的 [工具][2]。此外,Linux Mint 是基于 Ubuntu 的,所以你有一个可以寻求帮助的庞大的用户社区。 + +我不打算讨论 Linux Mint 有多好。如果你已经下定决心 [安装Linux Mint][3],你可能会对它网站上的 [下载部分][4] 感到有些困惑。 + +它给了你三个选择:Cinnamon、MATE 和 Xfce。不知道该如何选择吗?我将在本文中帮你解决这个问题。 + +![][5] + +如果你是个 Linux 的绝对新手,对上面的东西一无所知,我建议你了解一下 [什么是 Linux 桌面环境][6]。如果你能再多花点时间,请阅读这篇关于 [什么是 Linux,以及为什么有这么多看起来相似的 Linux 操作系统][7] 的优秀解释。 + +有了这些信息,你就可以了解各种 Linux Mint 版本之间的区别了。如果你不知道该选择哪一个,通过这篇文章,我将帮助你做出一个有意识的选择。 + +### 你应该选择哪个 Linux Mint 版本? + +![][8] + +简单来说,可供选择的有以下几种: + + * **Cinnamon 桌面**:具有现代感的传统桌面。 + * **MATE 桌面**:类似 GNOME 2 时代的传统外观桌面。 + * **Xfce 桌面**:一个流行的轻量级桌面环境。 + +我们来逐一看看 Mint 的各个变种。 + +#### Linux Mint Cinnamon 版 + +Cinnamon 桌面是由 Linux Mint 团队开发的,显然它是 Linux Mint 的主力版本。 + +早在近十年前,当 GNOME 桌面选择了非常规的 GNOME 3 用户界面时,人们就开始了 Cinnamon 的开发,通过复刻 GNOME 2 的一些组件来保持桌面的传统外观。 + +很多 Linux 用户喜欢 Cinnamon,就是因为它有像 Windows 7 一样的界面。 + +![Linux Mint Cinnamon desktop][9] + +##### 性能和相应能力 + +Cinnamon 桌面的性能比过去的版本有所提高,但如果没有固态硬盘,你会觉得有点迟钝。上一次我使用 Cinnamon 桌面是在 4.4.8 版,开机后的内存消耗在 750MB 左右。现在的 4.8.6 版有了很大的改进,开机后减少了 100MB 内存消耗。 + +为了获得最佳的用户体验,应该考虑双核 CPU,最低 4GB 内存。 + +![Linux Mint 20 Cinnamon idle system stats][10] + +##### 优势 + + * 从 Windows 无缝切换 + * 赏心悦目 + * 高度 [可定制][11] + +##### 劣势 + + * 如果你的系统只有 2GB 内存,可能还是不够理想 + +**附加建议**:如果你喜欢 Debian 而不是 Ubuntu,你可以选择 [Linux Mint Debian 版][12](LMDE)。LMDE 和带有 Cinnamon 桌面的 Debian 主要区别在于 LMDE 向其仓库提供最新的桌面环境。 + +#### Linux Mint Mate 版 + +[MATE 桌面环境][13] 也有类似的故事,它的目的是维护和支持 GNOME 2 的代码库和应用程序。它的外观和感觉与 GNOME 2 非常相似。 + +在我看来,到目前为止,MATE 桌面的最佳实现是 [Ubuntu MATE][14]。在 Linux Mint 中,你会得到一个定制版的 MATE 桌面,它符合 Cinnamon 美学,而不是传统的 GNOME 2 设定。 + +![Screenshot of Linux Mint MATE desktop][15] + +##### 性能和响应能力 + +MATE 桌面以轻薄著称,这一点毋庸置疑。与 Cinnamon 桌面相比,其 CPU 的使用率始终保持在较低的水平,换言之,在笔记本电脑上会有更好的电池续航时间。 + +虽然感觉没有 Xfce 那么敏捷(在我看来),但不至于影响用户体验。内存消耗在 500MB 以下起步,这对于功能丰富的桌面环境来说是令人印象深刻的。 + +![Linux Mint 20 MATE idle system stats][16] + +##### 优势 + + * 不影响 [功能][17] 的轻量级桌面 + * 足够的 [定制化][18] 可能性 + +##### 劣势 + + * 传统的外观可能会给你一种过时的感觉 + +#### Linux Mint Xfce 版 + +Xfce 项目始于 1996 年,受到了 UNIX 的 [通用桌面环境(CDE)][19] 的启发。Xfce 是 “[XForms][20] Common Environment” 的缩写,但由于它不再使用 XForms 工具箱,所以名字拼写为 “Xfce”。 + +它的目标是快速、轻量级和易于使用。Xfce 是许多流行的 Linux 发行版的主要桌面,如 [Manjaro][21] 和 [MX Linux][22]。 + +Linux Mint 提供了一个精致的 Xfce 桌面,但即使是黑暗主题也无法与 Cinnamon 桌面的美感相比。 + +![Linux Mint 20 Xfce desktop][23] + +##### 性能和响应能力 + +Xfce 是 Linux Mint 提供的最精简的桌面环境。通过点击开始菜单、设置控制面板或探索底部面板,你会发现这是一个简单而又灵活的桌面环境。 + +尽管我觉得极简主义是一个积极的属性,但 Xfce 并不是一个养眼的产品,反而留下的是比较传统的味道。但对于一些用户来说,经典的桌面环境才是他们的首选。 + +在第一次开机时,内存的使用情况与 MATE 桌面类似,但并不尽如人意。如果你的电脑没有配备 SSD,Xfce 桌面环境可以让你的系统复活。 + +![Linux Mint 20 Xfce idle system stats][24] + +##### 优势 + + * 使用简单 + * 非常轻巧,适合老式硬件 + * 坚如磐石的稳定 + +##### 劣势 + + * 过时的外观 + * 与 Cinnamon 相比,可能没有那么多的定制化服务 + +### 总结 + +由于这三款桌面环境都是基于 GTK 工具包的,所以选择哪个纯属个人喜好。它们都很节约系统资源,对于 4GB 内存的适度系统来说,表现良好。Xfce 和 MATE 可以更低一些,支持低至 2GB 内存的系统。 + +Linux Mint 并不是唯一提供多种选择的发行版。Manjaro、Fedora和 [Ubuntu 等发行版也有各种口味][25] 可供选择。 + +如果你还是无法下定决心,我建议先选择默认的 Cinnamon 版,并尝试 [在虚拟机中使用 Linux Mint][26]。看看你是否喜欢这个外观和感觉。如果不喜欢,你可以用同样的方式测试其他变体。如果你决定了这个版本,你可以继续 [在你的主系统上安装它][3]。 + +希望我的这篇文章能够帮助到你。如果你对这个话题还有疑问或建议,请在下方留言。 + +-------------------------------------------------------------------------------- + +via: https://itsfoss.com/linux-mint-cinnamon-mate-xfce/ + +作者:[Dimitrios][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://itsfoss.com/author/dimitrios/ +[b]: https://github.com/lujun9972 +[1]: https://itsfoss.com/best-linux-beginners/ +[2]: https://linuxmint-developer-guide.readthedocs.io/en/latest/mint-tools.html# +[3]: https://itsfoss.com/install-linux-mint/ +[4]: https://linuxmint.com/download.php +[5]: https://i1.wp.com/itsfoss.com/wp-content/uploads/2021/03/linux-mint-version-options.png?resize=789%2C277&ssl=1 +[6]: https://itsfoss.com/what-is-desktop-environment/ +[7]: https://itsfoss.com/what-is-linux/ +[8]: https://i0.wp.com/itsfoss.com/wp-content/uploads/2021/03/Linux-Mint-variants.jpg?resize=800%2C450&ssl=1 +[9]: https://i0.wp.com/itsfoss.com/wp-content/uploads/2021/03/linux-mint-20.1-cinnamon.jpg?resize=800%2C500&ssl=1 +[10]: https://i0.wp.com/itsfoss.com/wp-content/uploads/2021/03/Linux-Mint-20-Cinnamon-ram-usage.png?resize=800%2C600&ssl=1 +[11]: https://itsfoss.com/customize-cinnamon-desktop/ +[12]: https://itsfoss.com/lmde-4-release/ +[13]: https://mate-desktop.org/ +[14]: https://itsfoss.com/ubuntu-mate-20-04-review/ +[15]: https://i0.wp.com/itsfoss.com/wp-content/uploads/2020/07/linux-mint-mate.jpg?resize=800%2C500&ssl=1 +[16]: https://i2.wp.com/itsfoss.com/wp-content/uploads/2021/03/Linux-Mint-20-MATE-ram-usage.png?resize=800%2C600&ssl=1 +[17]: https://mate-desktop.org/blog/2020-02-10-mate-1-24-released/ +[18]: https://itsfoss.com/ubuntu-mate-customization/ +[19]: https://en.wikipedia.org/wiki/Common_Desktop_Environment +[20]: https://en.wikipedia.org/wiki/XForms_(toolkit) +[21]: https://itsfoss.com/manjaro-linux-review/ +[22]: https://itsfoss.com/mx-linux-19/ +[23]: https://i1.wp.com/itsfoss.com/wp-content/uploads/2020/07/linux-mint-xfce.jpg?resize=800%2C500&ssl=1 +[24]: https://i1.wp.com/itsfoss.com/wp-content/uploads/2021/03/Linux-Mint-20-Xfce-ram-usage.png?resize=800%2C600&ssl=1 +[25]: https://itsfoss.com/which-ubuntu-install/ +[26]: https://itsfoss.com/install-linux-mint-in-virtualbox/ diff --git a/published/202103/20210311 Set up network parental controls on a Raspberry Pi.md b/published/202103/20210311 Set up network parental controls on a Raspberry Pi.md new file mode 100644 index 0000000000..79b2b0aa0a --- /dev/null +++ b/published/202103/20210311 Set up network parental controls on a Raspberry Pi.md @@ -0,0 +1,84 @@ +[#]: subject: (Set up network parental controls on a Raspberry Pi) +[#]: via: (https://opensource.com/article/21/3/raspberry-pi-parental-control) +[#]: author: (Daniel Oh https://opensource.com/users/daniel-oh) +[#]: collector: (lujun9972) +[#]: translator: (geekpi) +[#]: reviewer: (wxy) +[#]: publisher: (wxy) +[#]: url: (https://linux.cn/article-13216-1.html) + +在树莓派上设置家庭网络的家长控制 +====== + +> 用最少的时间和金钱投入,就能保证孩子上网安全。 + +![Family learning and reading together at night in a room][1] + +家长们一直在寻找保护孩子们上网的方法,从防止恶意软件、横幅广告、弹出窗口、活动跟踪脚本和其他问题,到防止他们在应该做功课的时候玩游戏和看 YouTube。许多企业使用工具来规范员工的网络安全和活动,但问题是如何在家里实现这一点? + +简短的答案是一台小巧、廉价的树莓派电脑,它可以让你为孩子和你在家的工作设置家长控制parental controls。本文将引导你了解使用树莓派构建自己的启用了家长控制功能的家庭网络有多么容易。 + +### 安装硬件和软件 + +对于这个项目,你需要一个树莓派和一个家庭网络路由器。如果你在线购物网站花上 5 分钟浏览,就可以发现很多选择。[树莓派 4][2] 和 [TP-Link 路由器][3] 是初学者的好选择。 + +有了网络设备和树莓派后,你需要在 Linux 容器或者受支持的操作系统中安装 [Pi-hole][4]。有几种 [安装方法][5],但一个简单的方法是在你的树莓派上执行以下命令: + +``` +curl -sSL https://install.pi-hole.net | bash +``` + +### 配置 Pi-hole 作为你的 DNS 服务器 + +接下来,你需要在路由器和 Pi-hole 中配置 DHCP 设置: + + 1. 禁用路由器中的 DHCP 服务器设置 + 2. 在 Pi-hole 中启用 DHCP 服务器 + +每台设备都不一样,所以我没有办法告诉你具体需要点击什么来调整设置。一般来说,你可以通过浏览器访问你家的路由器。你的路由器的地址有时会印在路由器的底部,它以 192.168 或 10 开头。 + +在浏览器中,打开你的路由器的地址,并用你的凭证登录。它通常是简单的 `admin` 和一个数字密码(有时这个密码也打印在路由器上)。如果你不知道登录名,请打电话给你的供应商并询问详情。 + +在图形界面中,寻找你的局域网内关于 DHCP 的部分,并停用 DHCP 服务器。 你的路由器界面几乎肯定会与我的不同,但这是一个我设置的例子。取消勾选 **DHCP 服务器**: + +![Disable DHCP][6] + +接下来,你必须在 Pi-hole 上激活 DHCP 服务器。如果你不这样做,除非你手动分配 IP 地址,否则你的设备将无法上网! + +### 让你的网络适合家庭 + +设置完成了。现在,你的网络设备(如手机、平板电脑、笔记本电脑等)将自动找到树莓派上的 DHCP 服务器。然后,每个设备将被分配一个动态 IP 地址来访问互联网。 + +注意:如果你的路由器设备支持设置 DNS 服务器,你也可以在路由器中配置 DNS 客户端。客户端将把 Pi-hole 作为你的 DNS 服务器。 + +要设置你的孩子可以访问哪些网站和活动的规则,打开浏览器进入 Pi-hole 管理页面,`http://pi.hole/admin/`。在仪表板上,点击“Whitelist”来添加你的孩子可以访问的网页。你也可以将不允许孩子访问的网站(如游戏、成人、广告、购物等)添加到“Blocklist”。 + +![Pi-hole admin dashboard][8] + +### 接下来是什么? + +现在,你已经在树莓派上设置了家长控制,你可以让你的孩子更安全地上网,同时让他们访问经批准的娱乐选项。这也可以通过减少你的家庭串流来降低你的家庭网络使用量。更多高级使用方法,请访问 Pi-hole 的[文档][9]和[博客][10]。 + +-------------------------------------------------------------------------------- + +via: https://opensource.com/article/21/3/raspberry-pi-parental-control + +作者:[Daniel Oh][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/daniel-oh +[b]: https://github.com/lujun9972 +[1]: https://opensource.com/sites/default/files/styles/image-full-size/public/lead-images/family_learning_kids_night_reading.png?itok=6K7sJVb1 (Family learning and reading together at night in a room) +[2]: https://www.raspberrypi.org/products/ +[3]: https://www.amazon.com/s?k=tp-link+router&crid=3QRLN3XRWHFTC&sprefix=TP-Link%2Caps%2C186&ref=nb_sb_ss_ts-doa-p_3_7 +[4]: https://pi-hole.net/ +[5]: https://github.com/pi-hole/pi-hole/#one-step-automated-install +[6]: https://opensource.com/sites/default/files/uploads/disabledhcp.jpg (Disable DHCP) +[7]: https://creativecommons.org/licenses/by-sa/4.0/ +[8]: https://opensource.com/sites/default/files/uploads/blocklist.png (Pi-hole admin dashboard) +[9]: https://docs.pi-hole.net/ +[10]: https://pi-hole.net/blog/#page-content diff --git a/published/202103/20210312 Visualize multi-threaded Python programs with an open source tool.md b/published/202103/20210312 Visualize multi-threaded Python programs with an open source tool.md new file mode 100644 index 0000000000..2a389f5245 --- /dev/null +++ b/published/202103/20210312 Visualize multi-threaded Python programs with an open source tool.md @@ -0,0 +1,256 @@ +[#]: subject: (Visualize multi-threaded Python programs with an open source tool) +[#]: via: (https://opensource.com/article/21/3/python-viztracer) +[#]: author: (Tian Gao https://opensource.com/users/gaogaotiantian) +[#]: collector: (lujun9972) +[#]: translator: (wxy) +[#]: reviewer: (wxy) +[#]: publisher: (wxy) +[#]: url: (https://linux.cn/article-13253-1.html) + +用一个开源工具实现多线程 Python 程序的可视化 +====== + +> VizTracer 可以跟踪并发的 Python 程序,以帮助记录、调试和剖析。 + +![](https://img.linux.net.cn/data/attachment/album/202103/30/230404xi9pox38ookk8xe2.jpg) + +并发是现代编程中必不可少的一部分,因为我们有多个核心,有许多需要协作的任务。然而,当并发程序不按顺序运行时,就很难理解它们。对于工程师来说,在这些程序中发现 bug 和性能问题不像在单线程、单任务程序中那么容易。 + +在 Python 中,你有多种并发的选择。最常见的可能是用 `threading` 模块的多线程,用`subprocess` 和 `multiprocessing` 模块的多进程,以及最近用 `asyncio` 模块提供的 `async` 语法。在 [VizTracer][2] 之前,缺乏分析使用了这些技术程序的工具。 + +VizTracer 是一个追踪和可视化 Python 程序的工具,对日志、调试和剖析很有帮助。尽管它对单线程、单任务程序很好用,但它在并发程序中的实用性是它的独特之处。 + +### 尝试一个简单的任务 + +从一个简单的练习任务开始:计算出一个数组中的整数是否是质数并返回一个布尔数组。下面是一个简单的解决方案: + +``` +def is_prime(n): + for i in range(2, n): + if n % i == 0: + return False + return True + +def get_prime_arr(arr): + return [is_prime(elem) for elem in arr] +``` + +试着用 VizTracer 以单线程方式正常运行它: + +``` +if __name__ == "__main__": + num_arr = [random.randint(100, 10000) for _ in range(6000)] + get_prime_arr(num_arr) +``` + +``` +viztracer my_program.py +``` + +![Running code in a single thread][3] + +调用堆栈报告显示,耗时约 140ms,大部分时间花在 `get_prime_arr` 上。 + +![call-stack report][5] + +这只是在数组中的元素上一遍又一遍地执行 `is_prime` 函数。 + +这是你所期望的,而且它并不有趣(如果你了解 VizTracer 的话)。 + +### 试试多线程程序 + +试着用多线程程序来做: + +``` +if __name__ == "__main__": +    num_arr = [random.randint(100, 10000) for i in range(2000)] +    thread1 = Thread(target=get_prime_arr, args=(num_arr,)) +    thread2 = Thread(target=get_prime_arr, args=(num_arr,)) +    thread3 = Thread(target=get_prime_arr, args=(num_arr,)) + +    thread1.start() +    thread2.start() +    thread3.start() + +    thread1.join() +    thread2.join() +    thread3.join() +``` + +为了配合单线程程序的工作负载,这就为三个线程使用了一个 2000 元素的数组,模拟了三个线程共享任务的情况。 + +![Multi-thread program][6] + +如果你熟悉 Python 的全局解释器锁(GIL),就会想到,它不会再快了。由于开销太大,花了 140ms 多一点的时间。不过,你可以观察到多线程的并发性: + +![Concurrency of multiple threads][7] + +当一个线程在工作(执行多个 `is_prime` 函数)时,另一个线程被冻结了(一个 `is_prime` 函数);后来,它们进行了切换。这是由于 GIL 的原因,这也是 Python 没有真正的多线程的原因。它可以实现并发,但不能实现并行。 + +### 用多进程试试 + +要想实现并行,办法就是 `multiprocessing` 库。下面是另一个使用 `multiprocessing` 的版本: + +``` +if __name__ == "__main__": +    num_arr = [random.randint(100, 10000) for _ in range(2000)] +    +    p1 = Process(target=get_prime_arr, args=(num_arr,)) +    p2 = Process(target=get_prime_arr, args=(num_arr,)) +    p3 = Process(target=get_prime_arr, args=(num_arr,)) + +    p1.start() +    p2.start() +    p3.start() + +    p1.join() +    p2.join() +    p3.join() +``` + +要使用 VizTracer 运行它,你需要一个额外的参数: + +``` +viztracer --log_multiprocess my_program.py +``` + +![Running with extra argument][8] + +整个程序在 50ms 多一点的时间内完成,实际任务在 50ms 之前完成。程序的速度大概提高了三倍。 + +为了和多线程版本进行比较,这里是多进程版本: + +![Multi-process version][9] + +在没有 GIL 的情况下,多个进程可以实现并行,也就是多个 `is_prime` 函数可以并行执行。 + +不过,Python 的多线程也不是一无是处。例如,对于计算密集型和 I/O 密集型程序,你可以用睡眠来伪造一个 I/O 绑定的任务: + +``` +def io_task(): +    time.sleep(0.01) +``` + +在单线程、单任务程序中试试: + +``` +if __name__ == "__main__": +    for _ in range(3): +        io_task() +``` + +![I/O-bound single-thread, single-task program][10] + +整个程序用了 30ms 左右,没什么特别的。 + +现在使用多线程: + +``` +if __name__ == "__main__": +    thread1 = Thread(target=io_task) +    thread2 = Thread(target=io_task) +    thread3 = Thread(target=io_task) + +    thread1.start() +    thread2.start() +    thread3.start() + +    thread1.join() +    thread2.join() +    thread3.join() +``` + +![I/O-bound multi-thread program][11] + +程序耗时 10ms,很明显三个线程是并发工作的,这提高了整体性能。 + +### 用 asyncio 试试 + +Python 正在尝试引入另一个有趣的功能,叫做异步编程。你可以制作一个异步版的任务: + +``` +import asyncio + +async def io_task(): +    await asyncio.sleep(0.01) + +async def main(): +    t1 = asyncio.create_task(io_task()) +    t2 = asyncio.create_task(io_task()) +    t3 = asyncio.create_task(io_task()) + +    await t1 +    await t2 +    await t3 + +if __name__ == "__main__": +    asyncio.run(main()) +``` + +由于 `asyncio` 从字面上看是一个带有任务的单线程调度器,你可以直接在它上使用 VizTracer: + +![VizTracer with asyncio][12] + +依然花了 10ms,但显示的大部分函数都是底层结构,这可能不是用户感兴趣的。为了解决这个问题,可以使用 `--log_async` 来分离真正的任务: + +``` +viztracer --log_async my_program.py +``` + +![Using --log_async to separate tasks][13] + +现在,用户任务更加清晰了。在大部分时间里,没有任务在运行(因为它唯一做的事情就是睡觉)。有趣的部分是这里: + +![Graph of task creation and execution][14] + +这显示了任务的创建和执行时间。Task-1 是 `main()` 协程,创建了其他任务。Task-2、Task-3、Task-4 执行 `io_task` 和 `sleep` 然后等待唤醒。如图所示,因为是单线程程序,所以任务之间没有重叠,VizTracer 这样可视化是为了让它更容易理解。 + +为了让它更有趣,可以在任务中添加一个 `time.sleep` 的调用来阻止异步循环: + +``` +async def io_task(): +    time.sleep(0.01) +    await asyncio.sleep(0.01) +``` + +![time.sleep call][15] + +程序耗时更长(40ms),任务填补了异步调度器中的空白。 + +这个功能对于诊断异步程序的行为和性能问题非常有帮助。 + +### 看看 VizTracer 发生了什么? + +通过 VizTracer,你可以在时间轴上查看程序的进展情况,而不是从复杂的日志中想象。这有助于你更好地理解你的并发程序。 + +VizTracer 是开源的,在 Apache 2.0 许可证下发布,支持所有常见的操作系统(Linux、macOS 和 Windows)。你可以在 [VizTracer 的 GitHub 仓库][16]中了解更多关于它的功能和访问它的源代码。 + +-------------------------------------------------------------------------------- + +via: https://opensource.com/article/21/3/python-viztracer + +作者:[Tian Gao][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/gaogaotiantian +[b]: https://github.com/lujun9972 +[1]: https://opensource.com/sites/default/files/styles/image-full-size/public/lead-images/colorful_sound_wave.png?itok=jlUJG0bM (Colorful sound wave graph) +[2]: https://readthedocs.org/projects/viztracer/ +[3]: https://opensource.com/sites/default/files/uploads/viztracer_singlethreadtask.png (Running code in a single thread) +[4]: https://creativecommons.org/licenses/by-sa/4.0/ +[5]: https://opensource.com/sites/default/files/uploads/viztracer_callstackreport.png (call-stack report) +[6]: https://opensource.com/sites/default/files/uploads/viztracer_multithread.png (Multi-thread program) +[7]: https://opensource.com/sites/default/files/uploads/viztracer_concurrency.png (Concurrency of multiple threads) +[8]: https://opensource.com/sites/default/files/uploads/viztracer_multithreadrun.png (Running with extra argument) +[9]: https://opensource.com/sites/default/files/uploads/viztracer_comparewithmultiprocess.png (Multi-process version) +[10]: https://opensource.com/sites/default/files/uploads/io-bound_singlethread.png (I/O-bound single-thread, single-task program) +[11]: https://opensource.com/sites/default/files/uploads/io-bound_multithread.png (I/O-bound multi-thread program) +[12]: https://opensource.com/sites/default/files/uploads/viztracer_asyncio.png (VizTracer with asyncio) +[13]: https://opensource.com/sites/default/files/uploads/log_async.png (Using --log_async to separate tasks) +[14]: https://opensource.com/sites/default/files/uploads/taskcreation.png (Graph of task creation and execution) +[15]: https://opensource.com/sites/default/files/uploads/time.sleep_call.png (time.sleep call) +[16]: https://github.com/gaogaotiantian/viztracer diff --git a/published/202103/20210315 6 things to know about using WebAssembly on Firefox.md b/published/202103/20210315 6 things to know about using WebAssembly on Firefox.md new file mode 100644 index 0000000000..86b133d783 --- /dev/null +++ b/published/202103/20210315 6 things to know about using WebAssembly on Firefox.md @@ -0,0 +1,94 @@ +[#]: subject: (6 things to know about using WebAssembly on Firefox) +[#]: via: (https://opensource.com/article/21/3/webassembly-firefox) +[#]: author: (Stephan Avenwedde https://opensource.com/users/hansic99) +[#]: collector: (lujun9972) +[#]: translator: (geekpi) +[#]: reviewer: (wxy) +[#]: publisher: (wxy) +[#]: url: (https://linux.cn/article-13230-1.html) + +在 Firefox 上使用 WebAssembly 要了解的 6 件事 +====== + +> 了解在 Firefox 上运行 WebAssembly 的机会和局限性。 + +![](https://img.linux.net.cn/data/attachment/album/202103/23/223901pi6tcg7ybsyxos7x.jpg) + +WebAssembly 是一种可移植的执行格式,由于它能够以近乎原生的速度在浏览器中执行应用而引起了人们的极大兴趣。WebAssembly 本质上有一些特殊的属性和局限性。但是,通过将其与其他技术结合,将出现全新的可能性,尤其是与浏览器中的游戏有关的可能性。 + +本文介绍了在 Firefox 上运行 WebAssembly 的概念、可能性和局限性。 + +### 沙盒 + +WebAssembly 有 [严格的安全策略][2]。 WebAssembly 中的程序或功能单元称为*模块*。每个模块实例都运行在自己的隔离内存空间中。因此,即使同一个网页加载了多个模块,它们也无法访问另一个模块的虚拟地址空间。设计上,WebAssembly 还考虑了内存安全性和控制流完整性,这使得(几乎)确定性的执行成为可能。 + +### Web API + +通过 JavaScript [Web API][3] 可以访问多种输入和输出设备。根据这个 [提案][4],将来可以不用绕道到 JavaScript 来访问 Web API。C++ 程序员可以在 [Emscripten.org][5] 上找到有关访问 Web API 的信息。Rust 程序员可以使用 [rustwasm.github.io][7] 中写的 [wasm-bindgen][6] 库。 + +### 文件输入/输出 + +因为 WebAssembly 是在沙盒环境中执行的,所以当它在浏览器中执行时,它无法访问主机的文件系统。但是,Emscripten 提供了虚拟文件系统形式的解决方案。 + +Emscripten 使在编译时将文件预加载到内存文件系统成为可能。然后可以像在普通文件系统上一样从 WebAssembly 应用中读取这些文件。这个 [教程][8] 提供了更多信息。 + +### 持久化数据 + +如果你需要在客户端存储持久化数据,那么必须通过 JavaScript Web API 来完成。请参考 Mozilla 开发者网络(MDN)关于 [浏览器存储限制和过期标准][9] 的文档,了解不同方法的详细信息。 + +### 内存管理 + +WebAssembly 模块作为 [堆栈机][10] 在线性内存上运行。这意味着堆内存分配等概念是没有的。然而,如果你在 C++ 中使用 `new` 或者在 Rust 中使用 `Box::new`,你会期望它会进行堆内存分配。将堆内存分配请求转换成 WebAssembly 的方式在很大程度上依赖于工具链。你可以在 Frank Rehberger 关于 [WebAssembly 和动态内存][11] 的文章中找到关于不同工具链如何处理堆内存分配的详细分析。 + +### 游戏! + +与 [WebGL][12] 结合使用时,WebAssembly 的执行速度很高,因此可以在浏览器中运行原生游戏。大型专有游戏引擎 [Unity][13] 和[虚幻 4][14] 展示了 WebGL 可以实现的功能。也有使用 WebAssembly 和 WebGL 接口的开源游戏引擎。这里有些例子: + + * 自 2011 年 11 月起,[id Tech 4][15] 引擎(更常称之为 Doom 3 引擎)可在 [GitHub][16] 上以 GPL 许可的形式获得。此外,还有一个 [Doom 3 的 WebAssembly 移植版][17]。 + * Urho3D 引擎提供了一些 [令人印象深刻的例子][18],它们可以在浏览器中运行。 + * 如果你喜欢复古游戏,可以试试这个 [Game Boy 模拟器][19]。 + * [Godot 引擎也能生成 WebAssembly][20]。我找不到演示,但 [Godot 编辑器][21] 已经被移植到 WebAssembly 上。 + +### 有关 WebAssembly 的更多信息 + +WebAssembly 是一项很有前途的技术,我相信我们将来会越来越多地看到它。除了在浏览器中执行之外,WebAssembly 还可以用作可移植的执行格式。[Wasmer][22] 容器主机使你可以在各种平台上执行 WebAssembly 代码。 + +如果你需要更多的演示、示例和教程,请看一下这个 [WebAssembly 主题集合][23]。Mozilla 的 [游戏和示例合集][24] 并非全是 WebAssembly,但仍然值得一看。 + +-------------------------------------------------------------------------------- + +via: https://opensource.com/article/21/3/webassembly-firefox + +作者:[Stephan Avenwedde][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/hansic99 +[b]: https://github.com/lujun9972 +[1]: https://opensource.com/sites/default/files/styles/image-full-size/public/lead-images/lenovo-thinkpad-laptop-concentration-focus-windows-office.png?itok=-8E2ihcF (Woman using laptop concentrating) +[2]: https://webassembly.org/docs/security/ +[3]: https://developer.mozilla.org/en-US/docs/Web/API +[4]: https://github.com/WebAssembly/gc/blob/master/README.md +[5]: https://emscripten.org/docs/porting/connecting_cpp_and_javascript/Interacting-with-code.html +[6]: https://github.com/rustwasm/wasm-bindgen +[7]: https://rustwasm.github.io/wasm-bindgen/ +[8]: https://emscripten.org/docs/api_reference/Filesystem-API.html +[9]: https://developer.mozilla.org/en-US/docs/Web/API/IndexedDB_API/Browser_storage_limits_and_eviction_criteria +[10]: https://en.wikipedia.org/wiki/Stack_machine +[11]: https://frehberg.wordpress.com/webassembly-and-dynamic-memory/ +[12]: https://en.wikipedia.org/wiki/WebGL +[13]: https://beta.unity3d.com/jonas/AngryBots/ +[14]: https://www.youtube.com/watch?v=TwuIRcpeUWE +[15]: https://en.wikipedia.org/wiki/Id_Tech_4 +[16]: https://github.com/id-Software/DOOM-3 +[17]: https://wasm.continuation-labs.com/d3demo/ +[18]: https://urho3d.github.io/samples/ +[19]: https://vaporboy.net/ +[20]: https://docs.godotengine.org/en/stable/development/compiling/compiling_for_web.html +[21]: https://godotengine.org/editor/latest/godot.tools.html +[22]: https://github.com/wasmerio/wasmer +[23]: https://github.com/mbasso/awesome-wasm +[24]: https://developer.mozilla.org/en-US/docs/Games/Examples diff --git a/published/202103/20210315 Learn how file input and output works in C.md b/published/202103/20210315 Learn how file input and output works in C.md new file mode 100644 index 0000000000..39915a214f --- /dev/null +++ b/published/202103/20210315 Learn how file input and output works in C.md @@ -0,0 +1,274 @@ +[#]: subject: (Learn how file input and output works in C) +[#]: via: (https://opensource.com/article/21/3/file-io-c) +[#]: author: (Jim Hall https://opensource.com/users/jim-hall) +[#]: collector: (lujun9972) +[#]: translator: (wyxplus) +[#]: reviewer: (wxy) +[#]: publisher: (wxy) +[#]: url: (https://linux.cn/article-13252-1.html) + +学习如何用 C 语言来进行文件输入输出操作 +====== + +> 理解 I/O 有助于提升你的效率。 + +![](https://img.linux.net.cn/data/attachment/album/202103/30/222717gyuegz88ryu8ry7i.jpg) + +如果你打算学习 C 语言的输入、输出,可以从 `stdio.h` 包含文件开始。正如你从其名字中猜到的,该文件定义了所有的标准(“std”)的输入和输出(“io”)函数。 + +大多数人学习的第一个 `stdio.h` 的函数是打印格式化输出的 `printf` 函数。或者是用来打印一个字符串的 `puts` 函数。这些函数非常有用,可以将信息打印给用户,但是如果你想做更多的事情,则需要了解其他函数。 + +你可以通过编写一个常见 Linux 命令的副本来了解其中一些功能和方法。`cp` 命令主要用于复制文件。如果你查看 `cp` 的帮助手册,可以看到 `cp` 命令支持非常多的参数和选项。但最简单的功能,就是复制文件: + +``` +cp infile outfile +``` + +你只需使用一些读写文件的基本函数,就可以用 C 语言来自己实现 `cp` 命令。 + +### 一次读写一个字符 + +你可以使用 `fgetc` 和 `fputc` 函数轻松地进行输入输出。这些函数一次只读写一个字符。该用法被定义在 `stdio.h`,并且这也很浅显易懂:`fgetc` 是从文件中读取一个字符,`fputc` 是将一个字符保存到文件中。 + +``` +int fgetc(FILE *stream); +int fputc(int c, FILE *stream); +``` + +编写 `cp` 命令需要访问文件。在 C 语言中,你使用 `fopen` 函数打开一个文件,该函数需要两个参数:文件名和打开文件的模式。模式通常是从文件读取(`r`)或向文件写入(`w`)。打开文件的方式也有其他选项,但是对于本教程而言,仅关注于读写操作。 + +因此,将一个文件复制到另一个文件就变成了打开源文件和目标文件,接着,不断从第一个文件读取字符,然后将该字符写入第二个文件。`fgetc` 函数返回从输入文件中读取的单个字符,或者当文件完成后返回文件结束标记(`EOF`)。一旦读取到 `EOF`,你就完成了复制操作,就可以关闭两个文件。该代码如下所示: + +``` + do { + ch = fgetc(infile); + if (ch != EOF) { + fputc(ch, outfile); + } + } while (ch != EOF); +``` + +你可以使用此循环编写自己的 `cp` 程序,以使用 `fgetc` 和 `fputc` 函数一次读写一个字符。`cp.c` 源代码如下所示: + +``` +#include + +int +main(int argc, char **argv) +{ + FILE *infile; + FILE *outfile; + int ch; + + /* parse the command line */ + + /* usage: cp infile outfile */ + + if (argc != 3) { + fprintf(stderr, "Incorrect usage\n"); + fprintf(stderr, "Usage: cp infile outfile\n"); + return 1; + } + + /* open the input file */ + + infile = fopen(argv[1], "r"); + if (infile == NULL) { + fprintf(stderr, "Cannot open file for reading: %s\n", argv[1]); + return 2; + } + + /* open the output file */ + + outfile = fopen(argv[2], "w"); + if (outfile == NULL) { + fprintf(stderr, "Cannot open file for writing: %s\n", argv[2]); + fclose(infile); + return 3; + } + + /* copy one file to the other */ + + /* use fgetc and fputc */ + + do { + ch = fgetc(infile); + if (ch != EOF) { + fputc(ch, outfile); + } + } while (ch != EOF); + + /* done */ + + fclose(infile); + fclose(outfile); + + return 0; +} +``` + +你可以使用 `gcc` 来将 `cp.c` 文件编译成一个可执行文件: + +``` +$ gcc -Wall -o cp cp.c +``` + +`-o cp` 选项告诉编译器将编译后的程序保存到 `cp` 文件中。`-Wall` 选项告诉编译器提示所有可能的警告,如果你没有看到任何警告,则表示一切正常。 + +### 读写数据块 + +通过每次读写一个字符来实现自己的 `cp` 命令可以完成这项工作,但这并不是很快。在复制“日常”文件(例如文档和文本文件)时,你可能不会注意到,但是在复制大型文件或通过网络复制文件时,你才会注意到差异。每次处理一个字符需要大量的开销。 + +实现此 `cp` 命令的一种更好的方法是,读取一块的输入数据到内存中(称为缓存),然后将该数据集合写入到第二个文件。这样做的速度要快得多,因为程序可以一次读取更多的数据,这就就减少了从文件中“读取”的次数。 + +你可以使用 `fread` 函数将文件读入一个变量中。这个函数有几个参数:将数据读入的数组或内存缓冲区的指针(`ptr`),要读取的最小对象的大小(`size`),要读取对象的个数(`nmemb`),以及要读取的文件(`stream`): + +``` +size_t fread(void *ptr, size_t size, size_t nmemb, FILE *stream); +``` + +不同的选项为更高级的文件输入和输出(例如,读取和写入具有特定数据结构的文件)提供了很大的灵活性。但是,在从一个文件读取数据并将数据写入另一个文件的简单情况下,可以使用一个由字符数组组成的缓冲区。 + +你可以使用 `fwrite` 函数将缓冲区中的数据写入到另一个文件。这使用了与 `fread` 函数有相似的一组选项:要从中读取数据的数组或内存缓冲区的指针,要读取的最小对象的大小,要读取对象的个数以及要写入的文件。 + +``` +size_t fwrite(const void *ptr, size_t size, size_t nmemb, FILE *stream); +``` + +如果程序将文件读入缓冲区,然后将该缓冲区写入另一个文件,则数组(`ptr`)可以是固定大小的数组。例如,你可以使用长度为 200 个字符的字符数组作为缓冲区。 + +在该假设下,你需要更改 `cp` 程序中的循环,以将数据从文件读取到缓冲区中,然后将该缓冲区写入另一个文件中: + +``` + while (!feof(infile)) { + buffer_length = fread(buffer, sizeof(char), 200, infile); + fwrite(buffer, sizeof(char), buffer_length, outfile); + } +``` + +这是更新后的 `cp` 程序的完整源代码,该程序现在使用缓冲区读取和写入数据: + +``` +#include + +int +main(int argc, char **argv) +{ + FILE *infile; + FILE *outfile; + char buffer[200]; + size_t buffer_length; + + /* parse the command line */ + + /* usage: cp infile outfile */ + + if (argc != 3) { + fprintf(stderr, "Incorrect usage\n"); + fprintf(stderr, "Usage: cp infile outfile\n"); + return 1; + } + + /* open the input file */ + + infile = fopen(argv[1], "r"); + if (infile == NULL) { + fprintf(stderr, "Cannot open file for reading: %s\n", argv[1]); + return 2; + } + + /* open the output file */ + + outfile = fopen(argv[2], "w"); + if (outfile == NULL) { + fprintf(stderr, "Cannot open file for writing: %s\n", argv[2]); + fclose(infile); + return 3; + } + + /* copy one file to the other */ + + /* use fread and fwrite */ + + while (!feof(infile)) { + buffer_length = fread(buffer, sizeof(char), 200, infile); + fwrite(buffer, sizeof(char), buffer_length, outfile); + } + + /* done */ + + fclose(infile); + fclose(outfile); + + return 0; +} +``` + +由于你想将此程序与其他程序进行比较,因此请将此源代码另存为 `cp2.c`。你可以使用 `gcc` 编译程序: + +``` +$ gcc -Wall -o cp2 cp2.c +``` + +和之前一样,`-o cp2` 选项告诉编译器将编译后的程序保存到 `cp2` 程序文件中。`-Wall` 选项告诉编译器打开所有警告。如果你没有看到任何警告,则表示一切正常。 + +### 是的,这真的更快了 + +使用缓冲区读取和写入数据是实现此版本 `cp` 程序更好的方法。由于它可以一次将文件的多个数据读取到内存中,因此该程序不需要频繁读取数据。在小文件中,你可能没有注意到使用这两种方案的区别,但是如果你需要复制大文件,或者在较慢的介质(例如通过网络连接)上复制数据时,会发现明显的差距。 + +我使用 Linux `time` 命令进行了比较。此命令可以运行另一个程序,然后告诉你该程序花费了多长时间。对于我的测试,我希望了解所花费时间的差距,因此我复制了系统上的 628 MB CD-ROM 镜像文件。 + +我首先使用标准的 Linux 的 `cp` 命令复制了映像文件,以查看所需多长时间。一开始通过运行 Linux 的 `cp` 命令,同时我还避免使用 Linux 内置的文件缓存系统,使其不会给程序带来误导性能提升的可能性。使用 Linux `cp` 进行的测试,总计花费不到一秒钟的时间: + +``` +$ time cp FD13LIVE.iso tmpfile + +real 0m0.040s +user 0m0.001s +sys 0m0.003s +``` + +运行我自己实现的 `cp` 命令版本,复制同一文件要花费更长的时间。每次读写一个字符则花了将近五秒钟来复制文件: + +``` +$ time ./cp FD13LIVE.iso tmpfile + +real 0m4.823s +user 0m4.100s +sys 0m0.571s +``` + +从输入读取数据到缓冲区,然后将该缓冲区写入输出文件则要快得多。使用此方法复制文件花不到一秒钟: + +``` +$ time ./cp2 FD13LIVE.iso tmpfile + +real 0m0.944s +user 0m0.224s +sys 0m0.608s +``` + +我演示的 `cp` 程序使用了 200 个字符大小的缓冲区。我确信如果一次将更多文件数据读入内存,该程序将运行得更快。但是,通过这种比较,即使只有 200 个字符的缓冲区,你也已经看到了性能上的巨大差异。 + +-------------------------------------------------------------------------------- + +via: https://opensource.com/article/21/3/file-io-c + +作者:[Jim Hall][a] +选题:[lujun9972][b] +译者:[wyxplus](https://github.com/wyxplus) +校对:[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/file_system.jpg?itok=pzCrX1Kc "4 manilla folders, yellow, green, purple, blue" +[2]: http://www.opengroup.org/onlinepubs/009695399/functions/fgetc.html +[3]: http://www.opengroup.org/onlinepubs/009695399/functions/fputc.html +[4]: http://www.opengroup.org/onlinepubs/009695399/functions/fprintf.html +[5]: http://www.opengroup.org/onlinepubs/009695399/functions/fopen.html +[6]: http://www.opengroup.org/onlinepubs/009695399/functions/fclose.html +[7]: http://www.opengroup.org/onlinepubs/009695399/functions/feof.html +[8]: http://www.opengroup.org/onlinepubs/009695399/functions/fread.html +[9]: http://www.opengroup.org/onlinepubs/009695399/functions/fwrite.html diff --git a/published/202103/20210316 How to write -Hello World- in WebAssembly.md b/published/202103/20210316 How to write -Hello World- in WebAssembly.md new file mode 100644 index 0000000000..b2e423aeb9 --- /dev/null +++ b/published/202103/20210316 How to write -Hello World- in WebAssembly.md @@ -0,0 +1,155 @@ +[#]: subject: (How to write 'Hello World' in WebAssembly) +[#]: via: (https://opensource.com/article/21/3/hello-world-webassembly) +[#]: author: (Stephan Avenwedde https://opensource.com/users/hansic99) +[#]: collector: (lujun9972) +[#]: translator: (geekpi) +[#]: reviewer: (wxy) +[#]: publisher: (wxy) +[#]: url: (https://linux.cn/article-13250-1.html) + +如何在 WebAssembly 中写 “Hello World”? +====== +> 通过这个分步教程,开始用人类可读的文本编写 WebAssembly。 + +![](https://img.linux.net.cn/data/attachment/album/202103/30/095907r6ecev48dw0l9w44.jpg) + +WebAssembly 是一种字节码格式,[几乎所有的浏览器][2] 都可以将它编译成其宿主操作系统的机器代码。除了 JavaScript 和 WebGL 之外,WebAssembly 还满足了将应用移植到浏览器中以实现平台独立的需求。作为 C++ 和 Rust 的编译目标,WebAssembly 使 Web 浏览器能够以接近原生的速度执行代码。 + +当谈论 WebAssembly 应用时,你必须区分三种状态: + + 1. **源码(如 C++ 或 Rust):** 你有一个用兼容语言编写的应用,你想把它在浏览器中执行。 + 2. **WebAssembly 字节码:** 你选择 WebAssembly 字节码作为编译目标。最后,你得到一个 `.wasm` 文件。 + 3. **机器码(opcode):** 浏览器加载 `.wasm` 文件,并将其编译成主机系统的相应机器码。 + +WebAssembly 还有一种文本格式,用人类可读的文本表示二进制格式。为了简单起见,我将其称为 **WASM-text**。WASM-text 可以比作高级汇编语言。当然,你不会基于 WASM-text 来编写一个完整的应用,但了解它的底层工作原理是很好的(特别是对于调试和性能优化)。 + +本文将指导你在 WASM-text 中创建经典的 “Hello World” 程序。 + +### 创建 .wat 文件 + +WASM-text 文件通常以 `.wat` 结尾。第一步创建一个名为 `helloworld.wat` 的空文本文件,用你最喜欢的文本编辑器打开它,然后粘贴进去: + +``` +(module +    ;; 从 JavaScript 命名空间导入 +    (import  "console"  "log" (func  $log (param  i32  i32))) ;; 导入 log 函数 +    (import  "js"  "mem" (memory  1)) ;; 导入 1 页 内存(64kb) +    +    ;; 我们的模块的数据段 +    (data (i32.const 0) "Hello World from WebAssembly!") +    +    ;; 函数声明:导出 helloWorld(),无参数 +    (func (export  "helloWorld") +        i32.const 0  ;; 传递偏移 0 到 log +        i32.const 29  ;; 传递长度 29 到 log(示例文本的字符串长度) +        call  $log +        ) +) +``` + +WASM-text 格式是基于 S 表达式的。为了实现交互,JavaScript 函数用 `import` 语句导入,WebAssembly 函数用 `export` 语句导出。在这个例子中,从 `console` 模块中导入 `log` 函数,它需要两个类型为 `i32` 的参数作为输入,以及一页内存(64KB)来存储字符串。 + +字符串将被写入偏移量 为 `0` 的数据段。数据段是你的内存的叠加投影overlay,内存是在 JavaScript 部分分配的。 + +函数用关键字 `func` 标记。当进入函数时,栈是空的。在调用另一个函数之前,函数参数会被压入栈中(这里是偏移量和长度)(见 `call $log`)。当一个函数返回一个 `f32` 类型时(例如),当离开函数时,一个 `f32` 变量必须保留在栈中(但在本例中不是这样)。 + +### 创建 .wasm 文件 + +WASM-text 和 WebAssembly 字节码是 1:1 对应的,这意味着你可以将 WASM-text 转换成字节码(反之亦然)。你已经有了 WASM-text,现在将创建字节码。 + +转换可以通过 [WebAssembly Binary Toolkit][3](WABT)来完成。从该链接克隆仓库,并按照安装说明进行安装。 + +建立工具链后,打开控制台并输入以下内容,将 WASM-text 转换为字节码: + +``` +wat2wasm helloworld.wat -o helloworld.wasm +``` + +你也可以用以下方法将字节码转换为 WASM-text: + +``` +wasm2wat helloworld.wasm -o helloworld_reverse.wat +``` + +一个从 `.wasm` 文件创建的 `.wat` 文件不包括任何函数或参数名称。默认情况下,WebAssembly 用它们的索引来识别函数和参数。 + +### 编译 .wasm 文件 + +目前,WebAssembly 只与 JavaScript 共存,所以你必须编写一个简短的脚本来加载和编译 `.wasm` 文件并进行函数调用。你还需要在 WebAssembly 模块中定义你要导入的函数。 + +创建一个空的文本文件,并将其命名为 `helloworld.html`,然后打开你喜欢的文本编辑器并粘贴进去: + +``` + + + + + Simple template + + + + + +``` + +`WebAssembly.Memory(...)` 方法返回一个大小为 64KB 的内存页。函数 `consoleLogString` 根据长度和偏移量从该内存页读取一个字符串。这两个对象作为 `importObject` 的一部分传递给你的 WebAssembly 模块。 + +在你运行这个例子之前,你可能必须允许 Firefox 从这个目录中访问文件,在地址栏输入 `about:config`,并将 `privacy.file_unique_origin` 设置为 `true`: + +![Firefox setting][4] + +> **注意:** 这样做会使你容易受到 [CVE-2019-11730][6] 安全问题的影响。 + +现在,在 Firefox 中打开 `helloworld.html`,按下 `Ctrl+K` 打开开发者控制台。 + +![Debugger output][7] + +### 了解更多 + +这个 Hello World 的例子只是 MDN 的 [了解 WebAssembly 文本格式][8] 文档中的教程之一。如果你想了解更多关于 WebAssembly 的知识以及它的工作原理,可以看看这些文档。 + +-------------------------------------------------------------------------------- + +via: https://opensource.com/article/21/3/hello-world-webassembly + +作者:[Stephan Avenwedde][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/hansic99 +[b]: https://github.com/lujun9972 +[1]: https://opensource.com/sites/default/files/styles/image-full-size/public/lead-images/helloworld_bread_lead.jpeg?itok=1r8Uu7gk (Hello World inked on bread) +[2]: https://developer.mozilla.org/en-US/docs/WebAssembly#browser_compatibility +[3]: https://github.com/webassembly/wabt +[4]: https://opensource.com/sites/default/files/uploads/firefox_setting.png (Firefox setting) +[5]: https://creativecommons.org/licenses/by-sa/4.0/ +[6]: https://www.mozilla.org/en-US/security/advisories/mfsa2019-21/#CVE-2019-11730 +[7]: https://opensource.com/sites/default/files/uploads/debugger_output.png (Debugger output) +[8]: https://developer.mozilla.org/en-US/docs/WebAssembly/Understanding_the_text_format diff --git a/published/202103/20210316 Kooha is a Nascent Screen Recorder for GNOME With Wayland Support.md b/published/202103/20210316 Kooha is a Nascent Screen Recorder for GNOME With Wayland Support.md new file mode 100644 index 0000000000..20cd761dd8 --- /dev/null +++ b/published/202103/20210316 Kooha is a Nascent Screen Recorder for GNOME With Wayland Support.md @@ -0,0 +1,106 @@ +[#]: subject: (Kooha is a Nascent Screen Recorder for GNOME With Wayland Support) +[#]: via: (https://itsfoss.com/kooha-screen-recorder/) +[#]: author: (Abhishek Prakash https://itsfoss.com/author/abhishek/) +[#]: collector: (lujun9972) +[#]: translator: (geekpi) +[#]: reviewer: (wxy) +[#]: publisher: (wxy) +[#]: url: (https://linux.cn/article-13227-1.html) + +Kooha:一款支持 Wayland 的新生 GNOME 屏幕录像机 +====== + +Linux 中没有一个 [像样的支持 Wayland 显示服务器的屏幕录制软件][1]。 + +如果你使用 Wayland 的话,[GNOME 内置的屏幕录像机][1] 可能是少有的(也是唯一的)支持的软件。但是那个屏幕录像机没有可视界面和你所期望的标准屏幕录像软件的功能。 + +值得庆幸的是,有一个新的应用正在开发中,它提供了比 GNOME 屏幕录像机更多一点的功能,并且在 Wayland 上也能正常工作。 + +### 遇见 Kooha:一个新的 GNOME 桌面屏幕录像机 + +![][2] + +[Kooha][3] 是一个处于开发初期阶段的应用,它可以在 GNOME 中使用,是用 GTK 和 PyGObject 构建的。事实上,它利用了与 GNOME 内置屏幕录像机相同的后端。 + +以下是 Kooha 的功能: + + * 录制整个屏幕或选定区域 + * 在 Wayland 和 Xorg 显示服务器上均可使用 + * 在视频里用麦克风记录音频 + * 包含或忽略鼠标指针的选项 + * 可以在开始录制前增加 5 秒或 10 秒的延迟 + * 支持 WebM 和 MKV 格式的录制 + * 允许更改默认保存位置 + * 支持一些键盘快捷键 + +### 我的 Kooha 体验 + +![][4] + +它的开发者 Dave Patrick 联系了我,由于我急需一款好用的屏幕录像机,所以我马上就去试用了。 + +目前,[Kooha 只能通过 Flatpak 安装][5]。我安装了 Flatpak,当我试着使用时,它什么都没有记录。我和 Dave 进行了快速的邮件讨论,他告诉我这是由于 [Ubuntu 20.10 中 GNOME 屏幕录像机的 bug][6]。 + +你可以想象我对支持 Wayland 的屏幕录像机的绝望,我 [将我的 Ubuntu 升级到 21.04 测试版][7]。 + +在 21.04 中,可以屏幕录像,但仍然无法录制麦克风的音频。 + +我注意到了另外几件无法按照我的喜好顺利进行的事情。 + +例如,在录制时,计时器在屏幕上仍然可见,并且包含在录像中。我不会希望在视频教程中出现这种情况。我想你也不会喜欢看到这些吧。 + +![][8] + +另外就是关于多显示器的支持。没有专门选择某一个屏幕的选项。我连接了两个外部显示器,默认情况下,它录制所有三个显示器。可以使用设置捕捉区域,但精确拖动屏幕区域是一项耗时的任务。 + +它也没有 [Kazam][9] 或其他传统屏幕录像机中有的设置帧率或者编码的选项。 + +### 在 Linux 上安装 Kooha(如果你使用 GNOME) + +请确保在你的 Linux 发行版上启用 Flatpak 支持。目前它只适用于 GNOME,所以请检查你使用的桌面环境。 + +使用此命令将 Flathub 添加到你的 Flatpak 仓库列表中: + +``` +flatpak remote-add --if-not-exists flathub https://flathub.org/repo/flathub.flatpakrepo +``` + +然后用这个命令来安装: + +``` +flatpak install flathub io.github.seadve.Kooha +``` + +你可以通过菜单或使用这个命令来运行它: + +``` +flatpak run io.github.seadve.Kooha +``` + +### 总结 + +Kooha 并不完美,但考虑到 Wayland 领域的巨大空白,我希望开发者努力修复这些问题并增加更多的功能。考虑到 [Ubuntu 21.04 将默认切换到 Wayland][10],以及其他一些流行的发行版如 Fedora 和 openSUSE 已经默认使用 Wayland,这一点很重要。 + +-------------------------------------------------------------------------------- + +via: https://itsfoss.com/kooha-screen-recorder/ + +作者:[Abhishek Prakash][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/abhishek/ +[b]: https://github.com/lujun9972 +[1]: https://itsfoss.com/gnome-screen-recorder/ +[2]: https://i1.wp.com/itsfoss.com/wp-content/uploads/2021/03/kooha-screen-recorder.png?resize=800%2C450&ssl=1 +[3]: https://github.com/SeaDve/Kooha +[4]: https://i2.wp.com/itsfoss.com/wp-content/uploads/2021/03/kooha.png?resize=797%2C364&ssl=1 +[5]: https://flathub.org/apps/details/io.github.seadve.Kooha +[6]: https://bugs.launchpad.net/ubuntu/+source/gnome-shell/+bug/1901391 +[7]: https://itsfoss.com/upgrade-ubuntu-beta/ +[8]: https://i0.wp.com/itsfoss.com/wp-content/uploads/2021/03/kooha-recording.jpg?resize=800%2C636&ssl=1 +[9]: https://itsfoss.com/kazam-screen-recorder/ +[10]: https://news.itsfoss.com/ubuntu-21-04-wayland/ diff --git a/published/202103/20210317 Use gdu for a Faster Disk Usage Checking in Linux Terminal.md b/published/202103/20210317 Use gdu for a Faster Disk Usage Checking in Linux Terminal.md new file mode 100644 index 0000000000..81b216a7ab --- /dev/null +++ b/published/202103/20210317 Use gdu for a Faster Disk Usage Checking in Linux Terminal.md @@ -0,0 +1,105 @@ +[#]: subject: (Use gdu for a Faster Disk Usage Checking in Linux Terminal) +[#]: via: (https://itsfoss.com/gdu/) +[#]: author: (Abhishek Prakash https://itsfoss.com/author/abhishek/) +[#]: collector: (lujun9972) +[#]: translator: (geekpi) +[#]: reviewer: (wxy) +[#]: publisher: (wxy) +[#]: url: (https://linux.cn/article-13234-1.html) + +使用 gdu 进行更快的磁盘使用情况检查 +====== + +![](https://img.linux.net.cn/data/attachment/album/202103/24/233818dkfvi4fviiysn8o9.jpg) + +在 Linux 终端中有两种常用的 [检查磁盘使用情况的方法][1]:`du` 命令和 `df` 命令。[du 命令更多的是用来检查目录的使用空间][2],`df` 命令则是提供文件系统级别的磁盘使用情况。 + +还有更友好的 [用 GNOME “磁盘” 等图形工具在 Linux 中查看磁盘使用情况的方法][3]。如果局限于终端,你可以使用像 [ncdu][5] 这样的 [TUI][4] 工具,以一种图形化的方式获取磁盘使用信息。 + +### gdu: 在 Linux 终端中检查磁盘使用情况 + +[gdu][6] 就是这样一个用 Go 编写的工具(因此是 gdu 中的 “g”)。gdu 开发者的 [基准测试][7] 表明,它的磁盘使用情况检查速度相当快,特别是在 SSD 上。事实上,gdu 主要是针对 SSD 的,尽管它也可以在 HDD 上工作。 + +如果你在使用 `gdu` 命令时没有使用任何选项,它就会显示你当前所在目录的磁盘使用情况。 + +![][8] + +由于它具有文本用户界面(TUI),你可以使用箭头浏览目录和磁盘。你也可以按文件名或大小对结果进行排序。 + +你可以用它做到: + + * 向上箭头或 `k` 键将光标向上移动 + * 向下箭头或 `j` 键将光标向下移动 + * 回车选择目录/设备 + * 左箭头或 `h` 键转到上级目录 + * 使用 `d` 键删除所选文件或目录 + * 使用 `n` 键按名称排序 + * 使用 `s` 键按大小排序 + * 使用 `c` 键按项目排序 + +你会注意到一些条目前的一些符号。这些符号有特定的意义。 + +![][9] + + * `!` 表示读取目录时发生错误。 + * `.` 表示在读取子目录时发生错误,大小可能不正确。 + * `@` 表示文件是一个符号链接或套接字。 + * `H` 表示文件已经被计数(硬链接)。 + * `e` 表示目录为空。 + +要查看所有挂载磁盘的磁盘利用率和可用空间,使用选项 `d`: + +``` +gdu -d +``` + +它在一屏中显示所有的细节: + +![][10] + +看起来是个方便的工具,对吧?让我们看看如何在你的 Linux 系统上安装它。 + +### 在 Linux 上安装 gdu + +gdu 是通过 [AUR][11] 提供给 Arch 和 Manjaro 用户的。我想,作为一个 Arch 用户,你应该知道如何使用 AUR。 + +它包含在即将到来的 Ubuntu 21.04 的 universe 仓库中,但有可能你现在还没有使用它。这种情况下,你可以使用 Snap 安装它,这可能看起来有很多条 `snap` 命令: + +``` +snap install gdu-disk-usage-analyzer +snap connect gdu-disk-usage-analyzer:mount-observe :mount-observe +snap connect gdu-disk-usage-analyzer:system-backup :system-backup +snap alias gdu-disk-usage-analyzer.gdu gdu +``` + +你也可以在其发布页面找到源代码: + +- [下载 gdu 的源代码][12] + +我更习惯于使用 `du` 和 `df` 命令,但我觉得一些 Linux 用户可能会喜欢 gdu。你是其中之一吗? + +-------------------------------------------------------------------------------- + +via: https://itsfoss.com/gdu/ + +作者:[Abhishek Prakash][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/abhishek/ +[b]: https://github.com/lujun9972 +[1]: https://linuxhandbook.com/df-command/ +[2]: https://linuxhandbook.com/find-directory-size-du-command/ +[3]: https://itsfoss.com/check-free-disk-space-linux/ +[4]: https://itsfoss.com/gui-cli-tui/ +[5]: https://dev.yorhel.nl/ncdu +[6]: https://github.com/dundee/gdu +[7]: https://github.com/dundee/gdu#benchmarks +[8]: https://i0.wp.com/itsfoss.com/wp-content/uploads/2021/03/gdu-disk-utilization.png?resize=800%2C471&ssl=1 +[9]: https://i2.wp.com/itsfoss.com/wp-content/uploads/2021/03/gdu-entry-symbols.png?resize=800%2C302&ssl=1 +[10]: https://i1.wp.com/itsfoss.com/wp-content/uploads/2021/03/gdu-disk-utilization-for-all-drives.png?resize=800%2C471&ssl=1 +[11]: https://itsfoss.com/aur-arch-linux/ +[12]: https://github.com/dundee/gdu/releases diff --git a/published/202103/20210318 Practice using the Linux grep command.md b/published/202103/20210318 Practice using the Linux grep command.md new file mode 100644 index 0000000000..5fc2936d2e --- /dev/null +++ b/published/202103/20210318 Practice using the Linux grep command.md @@ -0,0 +1,193 @@ +[#]: subject: "Practice using the Linux grep command" +[#]: via: "https://opensource.com/article/21/3/grep-cheat-sheet" +[#]: author: "Seth Kenlon https://opensource.com/users/seth" +[#]: collector: "lujun9972" +[#]: translator: "lxbwolf" +[#]: reviewer: "wxy" +[#]: publisher: "wxy" +[#]: url: "https://linux.cn/article-13247-1.html" + +练习使用 Linux 的 grep 命令 +====== + +> 来学习下搜索文件中内容的基本操作,然后下载我们的备忘录作为 grep 和正则表达式的快速参考指南。 + +![](https://img.linux.net.cn/data/attachment/album/202103/29/093323yn6ilqvg6z6iizcf.jpg) + +`grep`(全局正则表达式打印Global Regular Expression Print)是由 Ken Thompson 早在 1974 年开发的基本 Unix 命令之一。在计算领域,它无处不在,通常被用作为动词(“搜索一个文件中的内容”)。如果你的谈话对象有极客精神,那么它也能在真实生活场景中使用。(例如,“我会 `grep` 我的内存条来回想起那些信息。”)简而言之,`grep` 是一种用特定的字符模式来搜索文件中内容的方式。如果你感觉这听起来像是文字处理器或文本编辑器的现代 Find 功能,那么你就已经在计算行业感受到了 `grep` 的影响。 + +`grep` 绝不是被现代技术抛弃的远古命令,它的强大体现在两个方面: + + * `grep` 可以在终端操作数据流,因此你可以把它嵌入到复杂的处理中。你不仅可以在一个文本文件中*查找*文字,还可以提取文字后把它发给另一个命令。 + * `grep` 使用正则表达式来提供灵活的搜索能力。 + +虽然需要一些练习,但学习 `grep` 命令还是很容易的。本文会介绍一些我认为 `grep` 最有用的功能。 + +- 下载我们免费的 [grep 备忘录][2] + +### 安装 grep + +Linux 默认安装了 `grep`。 + +MacOS 默认安装了 BSD 版的 `grep`。BSD 版的 `grep` 跟 GNU 版有一点不一样,因此如果你想完全参照本文,那么请使用 [Homebrew][3] 或 [MacPorts][4] 安装 GNU 版的 `grep`。 + +### 基础的 grep + +所有版本的 `grep` 基础语法都一样。入参是匹配模式和你需要搜索的文件。它会把匹配到的每一行输出到你的终端。 + +``` +$ grep gnu gpl-3.0.txt + along with this program. If not, see . +. +. +``` + +`grep` 命令默认大小写敏感,因此 “gnu”、“GNU”、“Gnu” 是三个不同的值。你可以使用 `--ignore-case` 选项来忽略大小写。 + +``` +$ grep --ignore-case gnu gpl-3.0.txt + GNU GENERAL PUBLIC LICENSE + The GNU General Public License is a free, copyleft license for +the GNU General Public License is intended to guarantee your freedom to +GNU General Public License for most of our software; it applies also to +[...16 more results...] +. +. +``` + +你也可以通过 `--invert-match` 选项来输出所有没有匹配到的行: + +``` +$ grep --invert-match \ +--ignore-case gnu gpl-3.0.txt + Version 3, 29 June 2007 + + Copyright (C) 2007 Free Software Foundation, Inc. +[...648 lines...] +Public License instead of this License. But first, please read +``` + +### 管道 + +能搜索文件中的文本内容是很有用的,但是 [POSIX][8] 的真正强大之处是可以通过“管道”来连接多条命令。我发现我使用 `grep` 最好的方式是把它与其他工具如 `cut`、`tr` 或 [curl][9] 联合使用。 + +假如现在有一个文件,文件中每一行是我想要下载的技术论文。我可以打开文件手动点击每一个链接,然后点击火狐浏览器的选项把每一个文件保存到我的硬盘,但是需要点击多次且耗费很长时间。而我还可以搜索文件中的链接,用 `--only-matching` 选项*只*打印出匹配到的字符串。 + +``` +$ grep --only-matching http\:\/\/.*pdf example.html +http://example.com/linux_whitepaper.pdf +http://example.com/bsd_whitepaper.pdf +http://example.com/important_security_topic.pdf +``` + +输出是一系列的 URL,每行一个。而这与 Bash 处理数据的方式完美契合,因此我不再把 URL 打印到终端,而是把它们通过管道传给 `curl`: + +``` +$ grep --only-matching http\:\/\/.*pdf \ +example.html | curl --remote-name +``` + +这条命令可以下载每一个文件,然后以各自的远程文件名命名保存在我的硬盘上。 + +这个例子中我的搜索模式可能很晦涩。那是因为它用的是正则表达式,一种在大量文本中进行模糊搜索时非常有用的”通配符“语言。 + +### 正则表达式 + +没有人会觉得正则表达式regular expression(简称 “regex”)很简单。然而,我发现它的名声往往比它应得的要差。诚然,很多人在使用正则表达式时“过于炫耀聪明”,直到它变得难以阅读,大而全,以至于复杂得换行才好理解,但是你不必过度使用正则。这里简单介绍一下我使用正则表达式的方式。 + +首先,创建一个名为 `example.txt` 的文件,输入以下内容: + +``` +Albania +Algeria +Canada +0 +1 +3 +11 +``` + +最基础的元素是不起眼的 `.` 字符。它表示一个字符。 + +``` +$ grep Can.da example.txt +Canada +``` + +模式 `Can.da` 能成功匹配到 `Canada` 是因为 `.` 字符表示任意*一个*字符。 + +可以使用下面这些符号来使 `.` 通配符表示多个字符: + + * `?` 匹配前面的模式零次或一次 + * `*` 匹配前面的模式零次或多次 + * `+` 匹配前面的模式一次或多次 + * `{4}` 匹配前面的模式 4 次(或是你在括号中写的其他次数) + +了解了这些知识后,你可以用你认为有意思的所有模式来在 `example.txt` 中做练习。可能有些会成功,有些不会成功。重要的是你要去分析结果,这样你才会知道原因。 + +例如,下面的命令匹配不到任何国家: + +``` +$ grep A.a example.txt +``` + +因为 `.` 字符只能匹配一个字符,除非你增加匹配次数。使用 `*` 字符,告诉 `grep` 匹配一个字符零次或者必要的任意多次直到单词末尾。因为你知道你要处理的内容,因此在本例中*零次*是没有必要的。在这个列表中一定没有单个字母的国家。因此,你可以用 `+` 来匹配一个字符至少一次且任意多次直到单词末尾: + +``` +$ grep A.+a example.txt +Albania +Algeria +``` + +你可以使用方括号来提供一系列的字母: + +``` +$ grep [A,C].+a example.txt +Albania +Algeria +Canada +``` + +也可以用来匹配数字。结果可能会震惊你: + +``` +$ grep [1-9] example.txt +1 +3 +11 +``` + +看到 11 出现在搜索数字 1 到 9 的结果中,你惊讶吗? + +如果把 13 加到搜索列表中,会出现什么结果呢? + +这些数字之所以会被匹配到,是因为它们包含 1,而 1 在要匹配的数字中。 + +你可以发现,正则表达式有时会令人费解,但是通过体验和练习,你可以熟练掌握它,用它来提高你搜索数据的能力。 + +### 下载备忘录 + +`grep` 命令还有很多文章中没有列出的选项。有用来更好地展示匹配结果、列出文件、列出匹配到的行号、通过打印匹配到的行周围的内容来显示上下文的选项,等等。如果你在学习 `grep`,或者你经常使用它并且通过查阅它的`帮助`页面来查看选项,那么你可以下载我们的备忘录。这个备忘录使用短选项(例如,使用 `-v`,而不是 `--invert-matching`)来帮助你更好地熟悉 `grep`。它还有一部分正则表达式可以帮你记住用途最广的正则表达式代码。 [现在就下载 grep 备忘录!][2] + +-------------------------------------------------------------------------------- + +via: https://opensource.com/article/21/3/grep-cheat-sheet + +作者:[Seth Kenlon][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/seth +[b]: https://github.com/lujun9972 +[1]: https://opensource.com/sites/default/files/styles/image-full-size/public/lead-images/yearbook-haff-rx-linux-file-lead_0.png?itok=-i0NNfDC "Hand putting a Linux file folder into a drawer" +[2]: https://opensource.com/downloads/grep-cheat-sheet +[3]: https://opensource.com/article/20/6/homebrew-mac +[4]: https://opensource.com/article/20/11/macports +[5]: http://www.gnu.org/licenses/\> +[6]: http://www.gnu.org/philosophy/why-not-lgpl.html\> +[7]: http://fsf.org/\> +[8]: https://opensource.com/article/19/7/what-posix-richard-stallman-explains +[9]: https://opensource.com/downloads/curl-command-cheat-sheet diff --git a/published/202103/20210319 4 cool new projects to try in Copr for March 2021.md b/published/202103/20210319 4 cool new projects to try in Copr for March 2021.md new file mode 100644 index 0000000000..90754cca83 --- /dev/null +++ b/published/202103/20210319 4 cool new projects to try in Copr for March 2021.md @@ -0,0 +1,143 @@ +[#]: subject: (4 cool new projects to try in Copr for March 2021) +[#]: via: (https://fedoramagazine.org/4-cool-new-projects-to-try-in-copr-for-march-2021/) +[#]: author: (Jakub Kadlčík https://fedoramagazine.org/author/frostyx/) +[#]: collector: (lujun9972) +[#]: translator: (geekpi) +[#]: reviewer: (wxy) +[#]: publisher: (wxy) +[#]: url: (https://linux.cn/article-13243-1.html) + +COPR 仓库中 4 个很酷的新项目(2021.03) +====== + +![][1] + +> COPR 是个人软件仓库 [集合][2],它不在 Fedora 中。这是因为某些软件不符合轻松打包的标准;或者它可能不符合其他 Fedora 标准,尽管它是自由而开源的。COPR 可以在 Fedora 套件之外提供这些项目。COPR 中的软件不受 Fedora 基础设施的支持,或者是由项目自己背书的。但是,这是一种尝试新的或实验性的软件的一种巧妙的方式。 + +本文介绍了 COPR 中一些有趣的新项目。如果你第一次使用 COPR,请参阅 [COPR 用户文档][3]。 + +### Ytfzf + +[Ytfzf][5] 是一个简单的命令行工具,用于搜索和观看 YouTube 视频。它提供了围绕模糊查找程序 [fzf][6] 构建的快速直观的界面。它使用 [youtube-dl][7] 来下载选定的视频,并打开外部视频播放器来观看。由于这种方式,`ytfzf` 比使用浏览器观看 YouTube 资源占用要少得多。它支持缩略图(通过 [ueberzug][8])、历史记录保存、多个视频排队或下载它们以供以后使用、频道订阅以及其他方便的功能。多亏了像 [dmenu][9] 或 [rofi][10] 这样的工具,它甚至可以在终端之外使用。 + +![][11] + +#### 安装说明 + +目前[仓库][13]为 Fedora 33 和 34 提供 Ytfzf。要安装它,请使用以下命令: + +``` +sudo dnf copr enable bhoman/ytfzf +sudo dnf install ytfzf +``` + +### Gemini 客户端 + +你有没有想过,如果万维网走的是一条完全不同的路线,不采用 CSS 和客户端脚本,你的互联网浏览体验会如何?[Gemini][15] 是 HTTPS 协议的现代替代品,尽管它并不打算取代 HTTPS 协议。[stenstorp/gemini][16] COPR 项目提供了各种客户端来浏览 Gemini _网站_,有 [Castor][17]、[Dragonstone][18]、[Kristall][19] 和 [Lagrange][20]。 + +[Gemini][21] 站点提供了一些使用该协议的主机列表。以下显示了使用 Castor 访问这个站点的情况: + +![][22] + +#### 安装说明 + +该 [仓库][16] 目前为 Fedora 32、33、34 和 Fedora Rawhide 提供 Gemini 客户端。EPEL 7 和 8,以及 CentOS Stream 也可使用。要安装浏览器,请从这里显示的安装命令中选择: + +``` +sudo dnf copr enable stenstorp/gemini + +sudo dnf install castor +sudo dnf install dragonstone +sudo dnf install kristall +sudo dnf install lagrange +``` + +### Ly + +[Ly][25] 是一个 Linux 和 BSD 的轻量级登录管理器。它有一个类似于 ncurses 的基于文本的用户界面。理论上,它应该支持所有的 X 桌面环境和窗口管理器(其中很多都 [经过测试][26])。Ly 还提供了基本的 Wayland 支持(Sway 也工作良好)。在配置的某个地方,有一个复活节彩蛋选项,可以在背景中启用著名的 [PSX DOOM fire][27] 动画,就其本身而言,值得一试。 + +![][28] + +#### 安装说明 + +该 [仓库][30] 目前为 Fedora 32、33 和 Fedora Rawhide 提供 Ly。要安装它,请使用以下命令: + +``` +sudo dnf copr enable dhalucario/ly +sudo dnf install ly +``` + +在将 Ly 设置为系统登录界面之前,请在终端中运行 `ly` 命令以确保其正常工作。然后关闭当前的登录管理器,启用 Ly。 + +``` +sudo systemctl disable gdm +sudo systemctl enable ly +``` + +最后,重启计算机,使其更改生效。 + +### AWS CLI v2 + +[AWS CLI v2][32] 带来基于社区反馈进行的稳健而有条理的演变,而不是对原有客户端的大规模重新设计。它引入了配置凭证的新机制,现在允许用户从 AWS 控制台中生成的 `.csv` 文件导入凭证。它还提供了对 AWS SSO 的支持。其他主要改进是服务端自动补全,以及交互式参数生成。一个新功能是交互式向导,它提供了更高层次的抽象,并结合多个 AWS API 调用来创建、更新或删除 AWS 资源。 + +![][33] + +#### 安装说明 + +该 [仓库][35] 目前为 Fedora Linux 32、33、34 和 Fedora Rawhide 提供 AWS CLI v2。要安装它,请使用以下命令: + +``` +sudo dnf copr enable spot/aws-cli-2 +sudo dnf install aws-cli-2 +``` + +自然地,访问 AWS 账户凭证是必要的。 + +-------------------------------------------------------------------------------- + +via: https://fedoramagazine.org/4-cool-new-projects-to-try-in-copr-for-march-2021/ + +作者:[Jakub Kadlčík][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/frostyx/ +[b]: https://github.com/lujun9972 +[1]: https://fedoramagazine.org/wp-content/uploads/2020/10/4-copr-945x400-1-816x345.jpg +[2]: https://copr.fedorainfracloud.org/ +[3]: https://docs.pagure.org/copr.copr/user_documentation.html +[4]: https://github.com/FrostyX/fedora-magazine/blob/main/2021-march.md#droidcam +[5]: https://github.com/pystardust/ytfzf +[6]: https://github.com/junegunn/fzf +[7]: http://ytdl-org.github.io/youtube-dl/ +[8]: https://github.com/seebye/ueberzug +[9]: https://tools.suckless.org/dmenu/ +[10]: https://github.com/davatorium/rofi +[11]: https://fedoramagazine.org/wp-content/uploads/2021/03/ytfzf.png +[12]: https://github.com/FrostyX/fedora-magazine/blob/main/2021-march.md#installation-instructions +[13]: https://copr.fedorainfracloud.org/coprs/bhoman/ytfzf/ +[14]: https://github.com/FrostyX/fedora-magazine/blob/main/2021-march.md#gemini-clients +[15]: https://gemini.circumlunar.space/ +[16]: https://copr.fedorainfracloud.org/coprs/stenstorp/gemini/ +[17]: https://git.sr.ht/~julienxx/castor +[18]: https://gitlab.com/baschdel/dragonstone +[19]: https://kristall.random-projects.net/ +[20]: https://github.com/skyjake/lagrange +[21]: https://gemini.circumlunar.space/servers/ +[22]: https://fedoramagazine.org/wp-content/uploads/2021/03/gemini.png +[23]: https://github.com/FrostyX/fedora-magazine/blob/main/2021-march.md#installation-instructions-1 +[24]: https://github.com/FrostyX/fedora-magazine/blob/main/2021-march.md#ly +[25]: https://github.com/nullgemm/ly +[26]: https://github.com/nullgemm/ly#support +[27]: https://fabiensanglard.net/doom_fire_psx/index.html +[28]: https://fedoramagazine.org/wp-content/uploads/2021/03/ly.png +[29]: https://github.com/FrostyX/fedora-magazine/blob/main/2021-march.md#installation-instructions-2 +[30]: https://copr.fedorainfracloud.org/coprs/dhalucario/ly/ +[31]: https://github.com/FrostyX/fedora-magazine/blob/main/2021-march.md#aws-cli-v2 +[32]: https://aws.amazon.com/blogs/developer/aws-cli-v2-is-now-generally-available/ +[33]: https://fedoramagazine.org/wp-content/uploads/2021/03/aws-cli-2.png +[34]: https://github.com/FrostyX/fedora-magazine/blob/main/2021-march.md#installation-instructions-3 +[35]: https://copr.fedorainfracloud.org/coprs/spot/aws-cli-2/ diff --git a/published/202103/20210319 Top 10 Terminal Emulators for Linux (With Extra Features or Amazing Looks).md b/published/202103/20210319 Top 10 Terminal Emulators for Linux (With Extra Features or Amazing Looks).md new file mode 100644 index 0000000000..eaeeccfab7 --- /dev/null +++ b/published/202103/20210319 Top 10 Terminal Emulators for Linux (With Extra Features or Amazing Looks).md @@ -0,0 +1,308 @@ +[#]: subject: (Top 10 Terminal Emulators for Linux \(With Extra Features or Amazing Looks\)) +[#]: via: (https://itsfoss.com/linux-terminal-emulators/) +[#]: author: (Ankush Das https://itsfoss.com/author/ankush/) +[#]: collector: (lujun9972) +[#]: translator: (wxy) +[#]: reviewer: (wxy) +[#]: publisher: (wxy) +[#]: url: (https://linux.cn/article-13221-1.html) + +10 个常见的 Linux 终端仿真器 +====== + +![](https://img.linux.net.cn/data/attachment/album/202103/21/073043q4j4o6hr33b595j4.jpg) + +默认情况下,所有的 Linux 发行版都已经预装了“终端terminal”应用程序或“终端仿真器terminal emulator”(这才是正确的技术术语)。当然,根据桌面环境的不同,它的外观和感觉会有所不同。 + +Linux 的特点是,你可以不用局限于你的发行版所提供的东西,你可以用你所选择的替代应用程序。终端也不例外。有几个提供了独特功能的终端仿真器令人印象深刻,可以获得更好的用户体验或更好的外观。 + +在这里,我将整理一个有趣的终端应用程序的列表,你可以在你的 Linux 发行版上尝试它们。 + +### 值得赞叹的 Linux 终端仿真器 + +此列表没有特别的排名顺序,我会先列出一些有趣的,然后是一些最流行的终端仿真器。此外,我还强调了每个提到的终端仿真器的主要功能,你可以选择你喜欢的终端仿真器。 + +#### 1、Terminator + +![][1] + +主要亮点: + +* 可以在一个窗口中使用多个 GNOME 终端 + +[Terminator][2] 是一款非常流行的终端仿真器,目前仍在维护中(从 Launchpad 移到了 GitHub)。 + +它基本上是在一个窗口中为你提供了多个 GNOME 终端。在它的帮助下,你可以轻松地对终端窗口进行分组和重组。你可能会觉得这像是在使用平铺窗口管理器,不过有一些限制。 + +##### 如何安装 Terminator? + +对于基于 Ubuntu 的发行版,你只需在终端输入以下命令: + +``` +sudo apt install terminator +``` + +你应该可以在大多数 Linux 发行版的默认仓库中找到它。但是,如果你需要安装帮助,请访问它的 [GitHub 页面][3]。 + +#### 2、Guake 终端 + +![][4] + +主要亮点: + + * 专为在 GNOME 上快速访问终端而设计 + * 工作速度快,不需要大量的系统资源 + * 访问的快捷键 + +[Guake][6] 终端最初的灵感来自于一款 FPS 游戏 Quake。与其他一些终端仿真器不同的是,它的工作方式是覆盖在其他的活动窗口上。 + +你所要做的就是使用快捷键(`F12`)召唤该仿真器,它就会从顶部出现。你可以自定义该仿真器的宽度或位置,但大多数用户使用默认设置就可以了。 + +它不仅仅是一个方便的终端仿真器,还提供了大量的功能,比如能够恢复标签、拥有多个标签、对每个标签进行颜色编码等等。你可以查看我关于 [Guake 的单独文章][5] 来了解更多。 + +##### 如何安装 Guake 终端? + +Guake 在大多数 Linux 发行版的默认仓库中都可以找到,你可以参考它的 [官方安装说明][7]。 + +如果你使用的是基于 Debian 的发行版,只需输入以下命令: + +``` +sudo apt install guake +``` + +#### 3、Tilix 终端 + +![][8] + +主要亮点: + + * 平铺功能 + * 支持拖放 + * 下拉式 Quake 模式 + +[Tilix][10] 终端提供了与 Guake 类似的下拉式体验 —— 但它允许你在平铺模式下拥有多个终端窗口。 + +如果你的 Linux 发行版中默认没有平铺窗口,而且你有一个大屏幕,那么这个功能就特别有用,你可以在多个终端窗口上工作,而不需要在不同的工作空间之间切换。 + +如果你想了解更多关于它的信息,我们之前已经 [单独介绍][9] 过了。 + +##### 如何安装 Tilix? + +Tilix 在大多数发行版的默认仓库中都有。如果你使用的是基于 Ubuntu 的发行版,只需输入: + +``` +sudo apt install tilix +``` + +#### 4、Hyper + +![][13] + +主要亮点: + + * 基于 HTML/CSS/JS 的终端 + * 基于 Electron + * 跨平台 + * 丰富的配置选项 + +[Hyper][15] 是另一个有趣的终端仿真器,它建立在 Web 技术之上。它并没有提供独特的用户体验,但看起来很不一样,并提供了大量的自定义选项。 + +它还支持安装主题和插件来轻松定制终端的外观。你可以在他们的 [GitHub 页面][14] 中探索更多关于它的内容。 + +##### 如何安装 Hyper? + +Hyper 在默认的资源库中是不可用的。然而,你可以通过他们的 [官方网站][16] 找到 .deb 和 .rpm 包来安装。 + +如果你是新手,请阅读文章以获得 [使用 deb 文件][17] 和 [使用 rpm 文件][18] 的帮助。 + +#### 5、Tilda + +![][19] + +主要亮点: + + * 下拉式终端 + * 搜索栏整合 + +[Tilda][20] 是另一款基于 GTK 的下拉式终端仿真器。与其他一些不同的是,它提供了一个你可以切换的集成搜索栏,还可以让你自定义很多东西。 + +你还可以设置热键来快速访问或执行某个动作。从功能上来说,它是相当令人印象深刻的。然而,在视觉上,我不喜欢覆盖的行为,而且它也不支持拖放。不过你可以试一试。 + +##### 如何安装 Tilda? + +对于基于 Ubuntu 的发行版,你可以简单地键入: + +``` +sudo apt install tilda +``` + +你可以参考它的 [GitHub 页面][20],以了解其他发行版的安装说明。 + +#### 6、eDEX-UI + +![][21] + +主要亮点: + + * 科幻感的外观 + * 跨平台 + * 自定义主题选项 + * 支持多个终端标签 + +如果你不是特别想找一款可以帮助你更快的完成工作的终端仿真器,那么 [eDEX-UI][23] 绝对是你应该尝试的。 + +对于科幻迷和只想让自己的终端看起来独特的用户来说,这绝对是一款漂亮的终端仿真器。如果你不知道,它的灵感很大程度上来自于电影《创:战纪》。 + +不仅仅是设计或界面,总的来说,它为你提供了独特的用户体验,你会喜欢的。它还可以让你 [自定义终端][12]。如果你打算尝试的话,它确实需要大量的系统资源。 + +你不妨看看我们 [专门介绍 eDEX-UI][22] 的文章,了解更多关于它的信息和安装步骤。 + +##### 如何安装 eDEX-UI? + +你可以在一些包含 [AUR][24] 的仓库中找到它。无论是哪种情况,你都可以从它的 [GitHub 发布部分][25] 中抓取一个适用于你的 Linux 发行版的软件包(或 AppImage 文件)。 + +#### 7、Cool Retro Terminal + +![][26] + +主要亮点: + + * 复古主题 + * 动画/效果调整 + +[Cool Retro Terminal][27] 是一款独特的终端仿真器,它为你提供了一个复古的阴极射线管显示器的外观。 + +如果你正在寻找一些额外功能的终端仿真器,这可能会让你失望。然而,令人印象深刻的是,它在资源上相当轻盈,并允许你自定义颜色、效果和字体。 + +##### 如何安装 Cool Retro Terminal? + +你可以在其 [GitHub 页面][27] 中找到所有主流 Linux 发行版的安装说明。对于基于 Ubuntu 的发行版,你可以在终端中输入以下内容: + +``` +sudo apt install cool-retro-term +``` + +#### 8、Alacritty + +![][28] + +主要亮点: + + * 跨平台 + * 选项丰富,重点是整合。 + +[Alacritty][29] 是一款有趣的开源跨平台终端仿真器。尽管它被认为是处于“测试”阶段的东西,但它仍然可以工作。 + +它的目标是为你提供广泛的配置选项,同时考虑到性能。例如,使用键盘点击 URL、将文本复制到剪贴板、使用 “Vi” 模式进行搜索等功能可能会吸引你去尝试。 + +你可以探索它的 [GitHub 页面][29] 了解更多信息。 + +##### 如何安装 Alacritty? + +官方 GitHub 页面上说可以使用包管理器安装 Alacritty,但我在 Linux Mint 20.1 的默认仓库或 [synaptic 包管理器][30] 中找不到它。 + +如果你想尝试的话,可以按照 [安装说明][31] 来手动设置。 + +#### 9、Konsole + +![][32] + +主要亮点: + + * KDE 的终端 + * 轻巧且可定制 + +如果你不是新手,这个可能不用介绍了。[Konsole][33] 是 KDE 桌面环境的默认终端仿真器。 + +不仅如此,它还集成了很多 KDE 应用。即使你使用的是其他的桌面环境,你也可以试试 Konsole。它是一个轻量级的终端仿真器,拥有众多的功能。 + +你可以拥有多个标签和多个分组窗口。以及改变终端仿真器的外观和感觉的大量的自定义选项。 + +##### 如何安装 Konsole? + +对于基于 Ubuntu 的发行版和大多数其他发行版,你可以使用默认的版本库来安装它。对于基于 Debian 的发行版,你只需要在终端中输入以下内容: + +``` +sudo apt install konsole +``` + +#### 10、GNOME 终端 + +![][34] + +主要亮点: + + * GNOME 的终端 + * 简单但可定制 + +如果你使用的是任何基于 Ubuntu 的 GNOME 发行版,它已经是天生的了,它可能不像 Konsole 那样可以自定义,但它可以让你轻松地配置终端的大部分重要方面。它可能不像 Konsole 那样可以自定义(取决于你在做什么),但它可以让你轻松配置终端的大部分重要方面。 + +总的来说,它提供了良好的用户体验和易于使用的界面,并提供了必要的功能。 + +如果你好奇的话,我还有一篇 [自定义你的 GNOME 终端][12] 的教程。 + +##### 如何安装 GNOME 终端? + +如果你没有使用 GNOME 桌面,但又想尝试一下,你可以通过默认的软件仓库轻松安装它。 + +对于基于 Debian 的发行版,以下是你需要在终端中输入的内容: + +``` +sudo apt install gnome-terminal +``` + +### 总结 + +有好几个终端仿真器。如果你正在寻找不同的用户体验,你可以尝试任何你喜欢的东西。然而,如果你的目标是一个稳定的和富有成效的体验,你需要测试一下,然后才能依靠它们。 + +对于大多数用户来说,默认的终端仿真器应该足够好用了。但是,如果你正在寻找快速访问(Quake 模式)、平铺功能或在一个终端中的多个窗口,请试试上述选择。 + +你最喜欢的 Linux 终端仿真器是什么?我有没有错过列出你最喜欢的?欢迎在下面的评论中告诉我你的想法。 + +-------------------------------------------------------------------------------- + +via: https://itsfoss.com/linux-terminal-emulators/ + +作者:[Ankush Das][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://itsfoss.com/author/ankush/ +[b]: https://github.com/lujun9972 +[1]: https://i1.wp.com/itsfoss.com/wp-content/uploads/2021/03/terminator-terminal.jpg?resize=800%2C436&ssl=1 +[2]: https://gnome-terminator.org +[3]: https://github.com/gnome-terminator/terminator +[4]: https://i1.wp.com/itsfoss.com/wp-content/uploads/2021/02/guake-terminal-2.png?resize=800%2C432&ssl=1 +[5]: https://itsfoss.com/guake-terminal/ +[6]: https://github.com/Guake/guake +[7]: https://guake.readthedocs.io/en/latest/user/installing.html#system-wide-installation +[8]: https://i1.wp.com/itsfoss.com/wp-content/uploads/2021/03/tilix-screenshot.png?resize=800%2C460&ssl=1 +[9]: https://itsfoss.com/tilix-terminal-emulator/ +[10]: https://gnunn1.github.io/tilix-web/ +[11]: https://i0.wp.com/itsfoss.com/wp-content/uploads/2021/02/linux-terminal-customization.jpg?fit=800%2C450&ssl=1 +[12]: https://itsfoss.com/customize-linux-terminal/ +[13]: https://i1.wp.com/itsfoss.com/wp-content/uploads/2021/03/hyper-screenshot.png?resize=800%2C527&ssl=1 +[14]: https://github.com/vercel/hyper +[15]: https://hyper.is/ +[16]: https://hyper.is/#installation +[17]: https://itsfoss.com/install-deb-files-ubuntu/ +[18]: https://itsfoss.com/install-rpm-files-fedora/ +[19]: https://i2.wp.com/itsfoss.com/wp-content/uploads/2021/03/tilda-terminal.jpg?resize=800%2C427&ssl=1 +[20]: https://github.com/lanoxx/tilda +[21]: https://i2.wp.com/itsfoss.com/wp-content/uploads/2020/09/edex-ui-screenshot.png?resize=800%2C450&ssl=1 +[22]: https://itsfoss.com/edex-ui-sci-fi-terminal/ +[23]: https://github.com/GitSquared/edex-ui +[24]: https://itsfoss.com/aur-arch-linux/ +[25]: https://github.com/GitSquared/edex-ui/releases +[26]: https://i1.wp.com/itsfoss.com/wp-content/uploads/2015/10/cool-retro-term-1.jpg?resize=799%2C450&ssl=1 +[27]: https://github.com/Swordfish90/cool-retro-term +[28]: https://i1.wp.com/itsfoss.com/wp-content/uploads/2021/03/alacritty-screenshot.png?resize=800%2C496&ssl=1 +[29]: https://github.com/alacritty/alacritty +[30]: https://itsfoss.com/synaptic-package-manager/ +[31]: https://github.com/alacritty/alacritty/blob/master/INSTALL.md#debianubuntu +[32]: https://i0.wp.com/itsfoss.com/wp-content/uploads/2021/03/konsole-screenshot.png?resize=800%2C512&ssl=1 +[33]: https://konsole.kde.org/ +[34]: https://i1.wp.com/itsfoss.com/wp-content/uploads/2021/02/default-terminal.jpg?resize=773%2C493&ssl=1 diff --git a/published/202103/20210322 5 everyday sysadmin tasks to automate with Ansible.md b/published/202103/20210322 5 everyday sysadmin tasks to automate with Ansible.md new file mode 100644 index 0000000000..6f12202b57 --- /dev/null +++ b/published/202103/20210322 5 everyday sysadmin tasks to automate with Ansible.md @@ -0,0 +1,300 @@ +[#]: subject: (5 everyday sysadmin tasks to automate with Ansible) +[#]: via: (https://opensource.com/article/21/3/ansible-sysadmin) +[#]: author: (Mike Calizo https://opensource.com/users/mcalizo) +[#]: collector: (lujun9972) +[#]: translator: (wxy) +[#]: reviewer: (wxy) +[#]: publisher: (wxy) +[#]: url: (https://linux.cn/article-13256-1.html) + +用 Ansible 自动化系统管理员的 5 个日常任务 +====== + +> 通过使用 Ansible 自动执行可重复的日常任务,提高工作效率并避免错误。 + +![](https://img.linux.net.cn/data/attachment/album/202103/31/233904oo7q68eo2njfmf8o.jpg) + +如果你讨厌执行重复性的任务,那么我有一个提议给你,去学习 [Ansible][2]! + +Ansible 是一个工具,它可以帮助你更轻松、更快速地完成日常任务,这样你就可以更有效地利用时间,比如学习重要的新技术。对于系统管理员来说,它是一个很好的工具,因为它可以帮助你实现标准化,并在日常活动中进行协作,包括: + + 1. 安装、配置和调配服务器和应用程序; + 2. 定期更新和升级系统; + 3. 监测、减轻和排除问题。 + +通常,许多这些基本的日常任务都需要手动步骤,而根据个人的技能的不同,可能会造成不一致并导致配置发生漂移。这在小规模的实施中可能是可以接受的,因为你管理一台服务器,并且知道自己在做什么。但当你管理数百或数千台服务器时会发生什么? + +如果不小心,这些手动的、可重复的任务可能会因为人为的错误而造成延误和问题,而这些错误可能会影响你及你的组织的声誉。 + +这就是自动化的价值所在。而 [Ansible][3] 是自动化这些可重复的日常任务的完美工具。 + +自动化的一些原因是: + + 1. 你想要一个一致和稳定的环境。 + 2. 你想要促进标准化。 + 3. 你希望减少停机时间,减少严重事故案例,以便可以享受生活。 + 4. 你想喝杯啤酒,而不是排除故障问题! + +本文提供了一些系统管理员可以使用 Ansible 自动化的日常任务的例子。我把本文中的剧本和角色放到了 GitHub 上的 [系统管理员任务仓库][4] 中,以方便你使用它们。 + +这些剧本的结构是这样的(我的注释前面有 `==>`)。 + +``` +[root@homebase 6_sysadmin_tasks]# tree -L 2 +. +├── ansible.cfg ==> 负责控制 Ansible 行为的配置文件 +├── ansible.log +├── inventory +│ ├── group_vars +│ ├── hosts ==> 包含我的目标服务器列表的清单文件 +│ └── host_vars +├── LICENSE +├── playbooks ==> 包含我们将在本文中使用的剧本的目录 +│ ├── c_logs.yml +│ ├── c_stats.yml +│ ├── c_uptime.yml +│ ├── inventory +│ ├── r_cron.yml +│ ├── r_install.yml +│ └── r_script.yml +├── README.md +├── roles ==> 包含我们将在本文中使用的角色的目录 +│ ├── check_logs +│ ├── check_stats +│ ├── check_uptime +│ ├── install_cron +│ ├── install_tool +│ └── run_scr +└── templates ==> 包含 jinja 模板的目录 + ├── cron_output.txt.j2 + ├── sar.txt.j2 + └── scr_output.txt.j2 +``` + +清单类似这样的: + +``` +[root@homebase 6_sysadmin_tasks]# cat inventory/hosts +[rhel8] +master ansible_ssh_host=192.168.1.12 +workernode1 ansible_ssh_host=192.168.1.15 + +[rhel8:vars] +ansible_user=ansible ==> 请用你的 ansible 用户名更新它 +``` + +这里有五个你可以用 Ansible 自动完成的日常系统管理任务。 + +### 1、检查服务器的正常运行时间 + +你需要确保你的服务器一直处于正常运行状态。机构会拥有企业监控工具来监控服务器和应用程序的正常运行时间,但自动监控工具时常会出现故障,你需要登录进去验证一台服务器的状态。手动验证每台服务器的正常运行时间需要花费大量的时间。你的服务器越多,你需要花费的时间就越长。但如果有了自动化,这种验证可以在几分钟内完成。 + +使用 [check_uptime][5] 角色和 `c_uptime.yml` 剧本: + +``` +[root@homebase 6_sysadmin_tasks]# ansible-playbook -i inventory/hosts playbooks/c_uptime.yml -k +SSH password: +PLAY [Check Uptime for Servers] **************************************************************************************************************************************** +TASK [check_uptime : Capture timestamp] ************************************************************************************************* +. +截断... +. +PLAY RECAP ************************************************************************************************************************************************************* +master : ok=6 changed=4 unreachable=0 failed=0 skipped=0 rescued=0 ignored=0 +workernode1 : ok=6 changed=4 unreachable=0 failed=0 skipped=0 rescued=0 ignored=0 +[root@homebase 6_sysadmin_tasks]# +``` + +剧本的输出是这样的: + +``` +[root@homebase 6_sysadmin_tasks]# cat /var/tmp/uptime-master-20210221004417.txt +----------------------------------------------------- + Uptime for master +----------------------------------------------------- + 00:44:17 up 44 min, 2 users, load average: 0.01, 0.09, 0.09 +----------------------------------------------------- +[root@homebase 6_sysadmin_tasks]# cat /var/tmp/uptime-workernode1-20210221184525.txt +----------------------------------------------------- + Uptime for workernode1 +----------------------------------------------------- + 18:45:26 up 44 min, 2 users, load average: 0.01, 0.01, 0.00 +----------------------------------------------------- +``` + +使用 Ansible,你可以用较少的努力以人类可读的格式获得多个服务器的状态,[Jinja 模板][6] 允许你根据自己的需要调整输出。通过更多的自动化,你可以按计划运行,并通过电子邮件发送输出,以达到报告的目的。 + +### 2、配置额外的 cron 作业 + +你需要根据基础设施和应用需求定期更新服务器的计划作业。这似乎是一项微不足道的工作,但必须正确且持续地完成。想象一下,如果你对数百台生产服务器进行手动操作,这需要花费多少时间。如果做错了,就会影响生产应用程序,如果计划的作业重叠,就会导致应用程序停机或影响服务器性能。 + +使用 [install_cron][7] 角色和 `r_cron.yml` 剧本: + +``` +[root@homebase 6_sysadmin_tasks]# ansible-playbook -i inventory/hosts playbooks/r_cron.yml -k +SSH password: +PLAY [Install additional cron jobs for root] *************************************************************************************************************************** +. +截断... +. +PLAY RECAP ************************************************************************************************************************************************************* +master : ok=10 changed=7 unreachable=0 failed=0 skipped=0 rescued=0 ignored=0 +workernode1 : ok=10 changed=7 unreachable=0 failed=0 skipped=0 rescued=0 ignored=0 +``` + +验证剧本的结果: + +``` +[root@homebase 6_sysadmin_tasks]# ansible -i inventory/hosts all -m shell -a "crontab -l" -k +SSH password: +master | CHANGED | rc=0 >> +1 2 3 4 5 /usr/bin/ls /tmp +#Ansible: Iotop Monitoring +0 5,2 * * * /usr/sbin/iotop -b -n 1 >> /var/tmp/iotop.log 2>> /var/tmp/iotop.err +workernode1 | CHANGED | rc=0 >> +1 2 3 4 5 /usr/bin/ls /tmp +#Ansible: Iotop Monitoring +0 5,2 * * * /usr/sbin/iotop -b -n 1 >> /var/tmp/iotop.log 2>> /var/tmp/iotop.err +``` + +使用 Ansible,你可以以快速和一致的方式更新所有服务器上的 crontab 条目。你还可以使用一个简单的点对点 Ansible 命令来报告更新后的 crontab 的状态,以验证最近应用的变化。 + +### 3、收集服务器统计和 sars + +在常规的故障排除过程中,为了诊断服务器性能或应用程序问题,你需要收集系统活动报告system activity reports(sars)和服务器统计。在大多数情况下,服务器日志包含非常重要的信息,开发人员或运维团队需要这些信息来帮助解决影响整个环境的具体问题。 + +安全团队在进行调查时非常特别,大多数时候,他们希望查看多个服务器的日志。你需要找到一种简单的方法来收集这些文档。如果你能把收集任务委托给他们就更好了。 + +通过 [check_stats][8] 角色和 `c_stats.yml` 剧本来完成这个任务: + +``` +$ ansible-playbook -i inventory/hosts playbooks/c_stats.yml + +PLAY [Check Stats/sar for Servers] *********************************************************************************************************************************** + +TASK [check_stats : Get current date time] *************************************************************************************************************************** +changed: [master] +changed: [workernode1] +. +截断... +. +PLAY RECAP *********************************************************************************************************************************************************** +master : ok=5 changed=4 unreachable=0 failed=0 skipped=0 rescued=0 ignored=0 +workernode1 : ok=5 changed=4 unreachable=0 failed=0 skipped=0 rescued=0 ignored=0 +``` + +输出看起来像这样: + +``` +$ cat /tmp/sar-workernode1-20210221214056.txt +----------------------------------------------------- + sar output for workernode1 +----------------------------------------------------- +Linux 4.18.0-193.el8.x86_64 (node1) 21/02/21 _x86_64_ (2 CPU) +21:39:30 LINUX RESTART (2 CPU) +----------------------------------------------------- +``` + +### 4、收集服务器日志 + +除了收集服务器统计和 sars 信息,你还需要不时地收集日志,尤其是当你需要帮助调查问题时。 + +通过 [check_logs][9] 角色和 `r_cron.yml` 剧本来实现: + +``` +$ ansible-playbook -i inventory/hosts playbooks/c_logs.yml -k +SSH password: + +PLAY [Check Logs for Servers] **************************************************************************************************************************************** +. +截断... +. +TASK [check_logs : Capture Timestamp] ******************************************************************************************************************************** +changed: [master] +changed: [workernode1] +PLAY RECAP *********************************************************************************************************************************************************** +master : ok=6 changed=4 unreachable=0 failed=0 skipped=0 rescued=0 ignored=0 +workernode1 : ok=6 changed=4 unreachable=0 failed=0 skipped=0 rescued=0 ignored=0 +``` + +为了确认输出,打开转储位置生成的文件。日志应该是这样的: + +``` +$ cat /tmp/logs-workernode1-20210221214758.txt | more +----------------------------------------------------- + Logs gathered: /var/log/messages for workernode1 +----------------------------------------------------- + +Feb 21 18:00:27 node1 kernel: Command line: BOOT_IMAGE=(hd0,gpt2)/vmlinuz-4.18.0-193.el8.x86_64 root=/dev/mapper/rhel-root ro crashkernel=auto resume=/dev/mapper/rhel +-swap rd.lvm.lv=rhel/root rd.lvm.lv=rhel/swap rhgb quiet +Feb 21 18:00:27 node1 kernel: Disabled fast string operations +Feb 21 18:00:27 node1 kernel: x86/fpu: Supporting XSAVE feature 0x001: 'x87 floating point registers' +Feb 21 18:00:27 node1 kernel: x86/fpu: Supporting XSAVE feature 0x002: 'SSE registers' +Feb 21 18:00:27 node1 kernel: x86/fpu: Supporting XSAVE feature 0x004: 'AVX registers' +Feb 21 18:00:27 node1 kernel: x86/fpu: xstate_offset[2]: 576, xstate_sizes[2]: 256 +Feb 21 18:00:27 node1 kernel: x86/fpu: Enabled xstate features 0x7, context size is 832 bytes, using 'compacted' format. +``` + +### 5、安装或删除软件包和软件 + +你需要能够持续快速地在系统上安装和更新软件和软件包。缩短安装或更新软件包和软件所需的时间,可以避免服务器和应用程序不必要的停机时间。 + +通过 [install_tool][10] 角色和 `r_install.yml` 剧本来实现这一点: + +``` +$ ansible-playbook -i inventory/hosts playbooks/r_install.yml -k +SSH password: +PLAY [Install additional tools/packages] *********************************************************************************** + +TASK [install_tool : Install specified tools in the role vars] ************************************************************* +ok: [master] => (item=iotop) +ok: [workernode1] => (item=iotop) +ok: [workernode1] => (item=traceroute) +ok: [master] => (item=traceroute) + +PLAY RECAP ***************************************************************************************************************** +master : ok=1 changed=0 unreachable=0 failed=0 skipped=0 rescued=0 ignored=0 +workernode1 : ok=1 changed=0 unreachable=0 failed=0 skipped=0 rescued=0 ignored=0 +``` + +这个例子安装了在 vars 文件中定义的两个特定包和版本。使用 Ansible 自动化,你可以比手动安装更快地安装多个软件包或软件。你也可以使用 vars 文件来定义你要安装的软件包的版本。 + +``` +$ cat roles/install_tool/vars/main.yml +--- +# vars file for install_tool +ins_action: absent +package_list: +  - iotop-0.6-16.el8.noarch +  - traceroute +``` + +### 拥抱自动化 + +要成为一名有效率的系统管理员,你需要接受自动化来鼓励团队内部的标准化和协作。Ansible 使你能够在更少的时间内做更多的事情,这样你就可以将时间花在更令人兴奋的项目上,而不是做重复的任务,如管理你的事件和问题管理流程。 + +有了更多的空闲时间,你可以学习更多的知识,让自己可以迎接下一个职业机会的到来。 + +-------------------------------------------------------------------------------- + +via: https://opensource.com/article/21/3/ansible-sysadmin + +作者:[Mike Calizo][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/mcalizo +[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://www.ansible.com/ +[3]: https://opensource.com/tags/ansible +[4]: https://github.com/mikecali/6_sysadmin_tasks +[5]: https://github.com/mikecali/6_sysadmin_tasks/tree/main/roles/check_uptime +[6]: https://docs.ansible.com/ansible/latest/user_guide/playbooks_templating.html +[7]: https://github.com/mikecali/6_sysadmin_tasks/tree/main/roles/install_cron +[8]: https://github.com/mikecali/6_sysadmin_tasks/tree/main/roles/check_stats +[9]: https://github.com/mikecali/6_sysadmin_tasks/tree/main/roles/check_logs +[10]: https://github.com/mikecali/6_sysadmin_tasks/tree/main/roles/install_tool diff --git a/published/202103/20210322 Why I use exa instead of ls on Linux.md b/published/202103/20210322 Why I use exa instead of ls on Linux.md new file mode 100644 index 0000000000..1015284fcc --- /dev/null +++ b/published/202103/20210322 Why I use exa instead of ls on Linux.md @@ -0,0 +1,100 @@ +[#]: subject: (Why I use exa instead of ls on Linux) +[#]: via: (https://opensource.com/article/21/3/replace-ls-exa) +[#]: author: (Sudeshna Sur https://opensource.com/users/sudeshna-sur) +[#]: collector: (lujun9972) +[#]: translator: (geekpi) +[#]: reviewer: (wxy) +[#]: publisher: (wxy) +[#]: url: (https://linux.cn/article-13237-1.html) + +为什么我在 Linux 上使用 exa 而不是 ls? +====== + +> exa 是一个 Linux ls 命令的现代替代品。 + +![](https://img.linux.net.cn/data/attachment/album/202103/26/101726h008fn6tttn4g6gt.jpg) + +我们生活在一个繁忙的世界里,当我们需要查找文件和数据时,使用 `ls` 命令可以节省时间和精力。但如果不经过大量调整,默认的 `ls` 输出并不十分舒心。当有一个 exa 替代方案时,为什么要花时间眯着眼睛看黑白文字呢? + +[exa][2] 是一个常规 `ls` 命令的现代替代品,它让生活变得更轻松。这个工具是用 [Rust][3] 编写的,该语言以并行性和安全性而闻名。 + +### 安装 exa + +要安装 `exa`,请运行: + +``` +$ dnf install exa +``` + +### 探索 exa 的功能 + +`exa` 改进了 `ls` 文件列表,它提供了更多的功能和更好的默认值。它使用颜色来区分文件类型和元数据。它能识别符号链接、扩展属性和 Git。而且它体积小、速度快,只有一个二进制文件。 + +#### 跟踪文件 + +你可以使用 `exa` 来跟踪某个 Git 仓库中新增的文件。 + +![Tracking Git files with exa][4] + +#### 树形结构 + +这是 `exa` 的基本树形结构。`--level` 的值决定了列表的深度,这里设置为 2。如果你想列出更多的子目录和文件,请增加 `--level` 的值。 + +![exa's default tree structure][6] + +这个树包含了每个文件的很多元数据。 + +![Metadata in exa's tree structure][7] + +#### 配色方案 + +默认情况下,`exa` 根据 [内置的配色方案][8] 来标识不同的文件类型。它不仅对文件和目录进行颜色编码,还对 `Cargo.toml`、`CMakeLists.txt`、`Gruntfile.coffee`、`Gruntfile.js`、`Makefile` 等多种文件类型进行颜色编码。 + +#### 扩展文件属性 + +当你使用 `exa` 探索 xattrs(扩展的文件属性)时,`--extended` 会显示所有的 xattrs。 + +![xattrs in exa][9] + +#### 符号链接 + +`exa` 能识别符号链接,也能指出实际的文件。 + +![symlinks in exa][10] + +#### 递归 + +当你想递归当前目录下所有目录的列表时,`exa` 能进行递归。 + +![recurse in exa][11] + +### 总结 + +我相信 `exa 是最简单、最容易适应的工具之一。它帮助我跟踪了很多 Git 和 Maven 文件。它的颜色编码让我更容易在多个子目录中进行搜索,它还能帮助我了解当前的 xattrs。 + +你是否已经用 `exa` 替换了 `ls`?请在评论中分享你的反馈。 + +-------------------------------------------------------------------------------- + +via: https://opensource.com/article/21/3/replace-ls-exa + +作者:[Sudeshna Sur][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/sudeshna-sur +[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://the.exa.website/docs +[3]: https://opensource.com/tags/rust +[4]: https://opensource.com/sites/default/files/uploads/exa_trackingfiles.png (Tracking Git files with exa) +[5]: https://creativecommons.org/licenses/by-sa/4.0/ +[6]: https://opensource.com/sites/default/files/uploads/exa_treestructure.png (exa's default tree structure) +[7]: https://opensource.com/sites/default/files/uploads/exa_metadata.png (Metadata in exa's tree structure) +[8]: https://the.exa.website/features/colours +[9]: https://opensource.com/sites/default/files/uploads/exa_xattrs.png (xattrs in exa) +[10]: https://opensource.com/sites/default/files/uploads/exa_symlinks.png (symlinks in exa) +[11]: https://opensource.com/sites/default/files/uploads/exa_recurse.png (recurse in exa) diff --git a/published/202103/20210323 3 new Java tools to try in 2021.md b/published/202103/20210323 3 new Java tools to try in 2021.md new file mode 100644 index 0000000000..9dc03f05b4 --- /dev/null +++ b/published/202103/20210323 3 new Java tools to try in 2021.md @@ -0,0 +1,75 @@ +[#]: subject: (3 new Java tools to try in 2021) +[#]: via: (https://opensource.com/article/21/3/enterprise-java-tools) +[#]: author: (Daniel Oh https://opensource.com/users/daniel-oh) +[#]: collector: (lujun9972) +[#]: translator: (geekpi) +[#]: reviewer: (wxy) +[#]: publisher: (wxy) +[#]: url: (https://linux.cn/article-13249-1.html) + +2021 年要尝试的 3 个新的 Java 工具 +====== + +> 通过这三个工具和框架,为你的企业级 Java 应用和你的职业生涯提供助力。 + +![](https://img.linux.net.cn/data/attachment/album/202103/29/212649w9j5e05b0ppi9bew.jpg) + +尽管在 Kubernetes 上广泛使用 [Python][2]、[Go][3] 和 [Node.js][4] 实现 [人工智能][5] 和机器学习应用以及 [无服务函数][6],但 Java 技术仍然在开发企业应用中发挥着关键作用。根据 [开发者经济学][7] 的数据,在 2020 年第三季度,全球有 800 万名企业 Java 开发者。 + +虽然这门语言已经存在了超过 25 年,但 Java 世界中总是有新的趋势、工具和框架,可以为你的应用和你的职业生涯赋能。 + +绝大多数 Java 框架都是为具有动态行为的长时间运行的进程而设计的,这些动态行为用于运行可变的应用服务器,例如物理服务器和虚拟机。自从 Kubernetes 容器在 2014 年发布以来,情况已经发生了变化。在 Kubernetes 上使用 Java 应用的最大问题是通过减少内存占用、加快启动和响应时间以及减少文件大小来优化应用性能。 + +### 3 个值得考虑的新 Java 框架和工具 + +Java 开发人员也一直在寻找更简便的方法,将闪亮的新开源工具和项目集成到他们的 Java 应用和日常工作中。这极大地提高了开发效率,并激励更多的企业和个人开发者继续使用 Java 栈。 + +当试图满足上述企业 Java 生态系统的期望时,这三个新的 Java 框架和工具值得你关注。 + +#### 1、Quarkus + +[Quarkus][8] 旨在以惊人的快速启动时间、超低的常驻内存集(RSS)和高密度内存利用率,在 Kubernetes 等容器编排平台中开发云原生的微服务和无服务。根据 JRebel 的 [第九届全球 Java 开发者生产力年度报告][9],Java 开发者对 Quarkus 的使用率从不到 1% 上升到 6%,[Micronaut][10] 和 [Vert.x][11] 均从去年的 1% 左右分别增长到 4% 和 2%。 + +#### 2、Eclipse JKube + +[Eclipse JKube][12] 使 Java 开发者能够使用 [Docker][13]、[Jib][14] 或 [Source-To-Image][15] 构建策略,基于云原生 Java 应用构建容器镜像。它还能在编译时生成 Kubernetes 和 OpenShift 清单,并改善开发人员对调试、观察和日志工具的体验。 + +#### 3、MicroProfile + +[MicroProfile][16] 解决了与优化企业 Java 的微服务架构有关的最大问题,而无需采用新的框架或重构整个应用。此外,MicroProfile [规范][17](即 Health、Open Tracing、Open API、Fault Tolerance、Metrics、Config)继续与 [Jakarta EE][18] 的实现保持一致。 + +### 总结 + +很难说哪个 Java 框架或工具是企业 Java 开发人员实现的最佳选择。只要 Java 栈还有改进的空间,并能加速企业业务的发展,我们就可以期待新的框架、工具和平台的出现,比如上面的三个。花点时间看看它们是否能在 2021 年改善你的企业 Java 应用。 + +-------------------------------------------------------------------------------- + +via: https://opensource.com/article/21/3/enterprise-java-tools + +作者:[Daniel Oh][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/daniel-oh +[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/python +[3]: https://opensource.com/article/18/11/learning-golang +[4]: https://opensource.com/article/18/7/node-js-interactive-cli +[5]: https://opensource.com/article/18/12/how-get-started-ai +[6]: https://opensource.com/article/19/4/enabling-serverless-kubernetes +[7]: https://developereconomics.com/ +[8]: https://quarkus.io/ +[9]: https://www.jrebel.com/resources/java-developer-productivity-report-2021 +[10]: https://micronaut.io/ +[11]: https://vertx.io/ +[12]: https://www.eclipse.org/jkube/ +[13]: https://opensource.com/resources/what-docker +[14]: https://github.com/GoogleContainerTools/jib +[15]: https://www.openshift.com/blog/create-s2i-builder-image +[16]: https://opensource.com/article/18/1/eclipse-microprofile +[17]: https://microprofile.io/ +[18]: https://opensource.com/article/18/5/jakarta-ee diff --git a/published/202103/20210323 Affordable high-temperature 3D printers at home.md b/published/202103/20210323 Affordable high-temperature 3D printers at home.md new file mode 100644 index 0000000000..fa2b49ee63 --- /dev/null +++ b/published/202103/20210323 Affordable high-temperature 3D printers at home.md @@ -0,0 +1,73 @@ +[#]: subject: (Affordable high-temperature 3D printers at home) +[#]: via: (https://opensource.com/article/21/3/desktop-3d-printer) +[#]: author: (Joshua Pearce https://opensource.com/users/jmpearce) +[#]: collector: (lujun9972) +[#]: translator: (geekpi) +[#]: reviewer: (wxy) +[#]: publisher: (wxy) +[#]: url: (https://linux.cn/article-13255-1.html) + +在家就能用得起的高温 3D 打印机 +====== + +> 有多实惠?低于 1000 美元。 + +![High-temperature 3D-printed mask][1] + +3D 打印机从 20 世纪 80 年代就已经出现了,但是由于 [RepRap][2] 项目的出现,它们直到获得开源才受到人们的关注。RepRap 意即自我复制快速原型机self-replicating rapid prototyper,它是一种基本上可以自己打印的 3D 打印机。它的开源计划[2004 年][3] 发布之后,导致 3D 打印机的成本从几十万美金降到了几百美金。 + +这些开源的桌面工具一直局限于 ABS 等低性能、低温热塑性塑料(如乐高积木)。市场上有几款高温打印机,但其高昂的成本(几万到几十万美元)使大多数人无法获得。直到最近,它们才参与了很多竞争,因为它们被一项专利 (US6722872B1) 锁定,该专利于 2021 年 2 月 27 日[到期][4]。 + +随着这个路障的消除,我们即将看到高温、低成本、熔融纤维 3D 打印机的爆发。 + +价格低到什么程度?低于 1000 美元如何。 + +在疫情最严重的时候,我的团队赶紧发布了一个 [开源高温 3D 打印机][5] 的设计,用于制造可高温消毒的个人防护装备(PPE)。该项目的想法是让人们能够 [用高温材料打印 PPE][6](如口罩),并将它放入家用烤箱进行消毒。我们称我们的设备为 Cerberus,它具有以下特点: + + 1. 可达到 200℃ 的加热床 + 2. 可达到 500℃ 的热源 + 3. 带有 1kW 加热器核心的隔离式加热室。 + 4. 主电源(交流电源)电压室和床身加热,以便快速启动。 + +你可以用现成的零件来构建这个项目,其中一些零件你可以打印,价格不到 1000 美元。它可以成功打印聚醚酮酮 (PEKK) 和聚醚酰亚胺(PEI,以商品名 Ultem 出售)。这两种材料都比现在低成本打印机能打印的任何材料强得多。 + +![PPE printer][7] + +这款高温 3D 打印机的设计是有三个头,但我们发布的时候只有一个头。Cerberus 是以希腊神话中的三头冥界看门狗命名的。通常情况下,我们不会发布只有一个头的打印机,但疫情改变了我们的优先级。[开源社区团结起来][9],帮助解决早期的供应不足,许多桌面 3D 打印机都在产出有用的产品,以帮助保护人们免受 COVID 的侵害。 + +那另外两个头呢? + +其他两个头是为了高温熔融颗粒制造(例如,这个开源的 [3D打印机][10] 的高温版本)并铺设金属线(像在 [这个设计][11] 中),以建立一个开源的热交换器。Cerberus 打印机的其他功能可能是一个自动喷嘴清洁器和在高温下打印连续纤维的方法。另外,你还可以在转台上安装任何你喜欢的东西来制造高端产品。 + +把一个盒子放在 3D 打印机周围,而把电子元件留在外面的 [专利][12] 到期,为高温家用 3D 打印机铺平了道路,这将使这些设备以合理的成本从单纯的玩具变为工业工具。 + +已经有公司在 RepRap 传统的基础上,将这些低成本系统推向市场(例如,1250 美元的 [Creality3D CR-5 Pro][13] 3D 打印机可以达到 300℃)。Creality 销售最受欢迎的桌面 3D 打印机,并开源了部分设计。 + +然而,要打印超高端工程聚合物,这些打印机需要达到 350℃ 以上。开源计划已经可以帮助桌面 3D 打印机制造商开始与垄断公司竞争,这些公司由于躲在专利背后,已经阻碍了 3D 打印 20 年。期待低成本、高温桌面 3D 打印机的竞争将真正升温! + +-------------------------------------------------------------------------------- + +via: https://opensource.com/article/21/3/desktop-3d-printer + +作者:[Joshua Pearce][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/jmpearce +[b]: https://github.com/lujun9972 +[1]: https://opensource.com/sites/default/files/styles/image-full-size/public/lead-images/3d_printer_mask.jpg?itok=5ePZghTW (High-temperature 3D-printed mask) +[2]: https://reprap.org/wiki/RepRap +[3]: https://reprap.org/wiki/Wealth_Without_Money +[4]: https://3dprintingindustry.com/news/stratasys-heated-build-chamber-for-3d-printer-patent-us6722872b1-set-to-expire-this-week-185012/ +[5]: https://doi.org/10.1016/j.ohx.2020.e00130 +[6]: https://www.appropedia.org/Open_Source_High-Temperature_Reprap_for_3-D_Printing_Heat-Sterilizable_PPE_and_Other_Applications +[7]: https://opensource.com/sites/default/files/uploads/ppe-hight3dp.png (PPE printer) +[8]: https://www.gnu.org/licenses/fdl-1.3.html +[9]: https://opensource.com/article/20/3/volunteer-covid19 +[10]: https://www.liebertpub.com/doi/10.1089/3dp.2019.0195 +[11]: https://www.appropedia.org/Open_Source_Multi-Head_3D_Printer_for_Polymer-Metal_Composite_Component_Manufacturing +[12]: https://www.academia.edu/17609790/A_Novel_Approach_to_Obviousness_An_Algorithm_for_Identifying_Prior_Art_Concerning_3-D_Printing_Materials +[13]: https://creality3d.shop/collections/cr-series/products/cr-5-pro-h-3d-printer diff --git a/published/20210305 Build a printer UI for Raspberry Pi with XML and Java.md b/published/20210305 Build a printer UI for Raspberry Pi with XML and Java.md new file mode 100644 index 0000000000..6d7c365d54 --- /dev/null +++ b/published/20210305 Build a printer UI for Raspberry Pi with XML and Java.md @@ -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 的开发优势,因为它使用自己的字节码和虚拟机(TC 字节码TC bytecode 和 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 对象的示例: + +``` + +``` + +#### 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 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` 的引用: + +``` + +``` + +#### 6、构建应用程序 + +是时候构建应用程序了。你可以在 `pom.xml` 中查看和更改目标系统target systems。 请确保 `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 diff --git a/published/20210310 Troubleshoot WiFi problems with Go and a Raspberry Pi.md b/published/20210310 Troubleshoot WiFi problems with Go and a Raspberry Pi.md new file mode 100644 index 0000000000..6a46d97f7f --- /dev/null +++ b/published/20210310 Troubleshoot WiFi problems with Go and a Raspberry Pi.md @@ -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`(基站)类型表示“该接口是具有控制接入点controlling access point的客户端设备管理的基本服务集basic service set(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(分贝-毫瓦decibel-milliwatts)为单位来报告的。 + +#### 简短科普:如何读懂 WiFi dBm + +根据 [MetaGeek][6] 的说法: + +* -30 最佳,但它既不现实也没有必要 +* -67 非常好,它适用于需要可靠数据包传输的应用,例如流媒体 +* -70 还不错,它是实现可靠数据包传输的底线,适用于电子邮件和网页浏览 +* -80 很差,只是基本连接,数据包传输不可靠 +* -90 不可用,接近“背景噪声noise floor” + +*注意: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 +``` + +哇哦,感觉不妙。 + +### 绘制公寓信号分布图 + +不管怎么说,知道这些信息总比不知道要好。让树莓派连接上显示器或者电子墨水屏,并接上电源,我就可以让它在公寓里移动,并绘制出信号死角的位置。 + +剧透一下:由于房东的接入点在隔壁的公寓里,对我来说最大的死角是以公寓厨房的冰箱为顶点的一个圆锥体形状区域......这个冰箱与房东的公寓靠着一堵墙! + +我想如果用《龙与地下城》里的黑话来说,它就是一个“沉默之锥Cone of Silence”。或者至少是一个“糟糕的网络连接之锥Cone of Poor Internet”。 + +总之,这段代码可以直接在树莓派上运行 `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 diff --git a/published/20210323 WebAssembly Security, Now and in the Future.md b/published/20210323 WebAssembly Security, Now and in the Future.md new file mode 100644 index 0000000000..5957391c6f --- /dev/null +++ b/published/20210323 WebAssembly Security, Now and in the Future.md @@ -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 代码的同一 虚拟机VM 管理。因此,WebAssembly 和 JavaScript 一样,造成的危害也是相同的,只是效率更高,更不易被察觉。由于 JavaScript 是纯文本,运行前需要浏览器编译,而 WebAssembly 是一种可立即运行的二进制格式,运行速度更快,也更难被扫描出(即使使用杀毒软件)其中的恶意指令。 + +WebAssembly 的这种 “代码混淆” 效果已经被用来弹出不请自来的广告,或打开假的 “技术支持” 窗口,要求提供敏感数据。另一个把戏则是自动将浏览器重定向到包含真正危险的恶意软件的 “落地” 页。 + +最后,就像 JavaScript 一样,WebAssembly 可能被用来 “窃取” 处理能力而不是数据。2019 年,[对 150 个不同的 WASM 模块的分析][2] 发现,其中约 _32%_ 被用于加密货币挖掘。 + +### WebAssembly 沙盒和接口 + +WebAssembly 代码在一个由虚拟机(而不是操作系统)管理的 [沙盒][3] 中封闭运行。这使它无法看到主机,也无法直接与主机交互。对系统资源(文件、硬件或互联网连接)的访问只能通过该虚拟机提供的 WebAssembly 系统接口WebAssembly System Interface(WASI) 进行。 + +WASI 不同于大多数其他应用程序编程接口(API),它具有独特的安全特性,真正推动了 WASM 在传统服务器和边缘Edge计算场景中的采用,这将是下一篇文章的主题。在这里,可以说,当从 Web 迁移到其他环境时,它的安全影响会有很大的不同。现代 Web 浏览器是极其复杂的软件,但它是建立在数十年的经验和数十亿人的日常测试之上的。与浏览器相比,服务器或物联网(IoT)设备几乎是未知领域。这些平台的虚拟机将需要扩展 WASI,因此,肯定会带来新的安全挑战。 + +### WebAssembly 中的内存和代码管理 + +与普通的编译程序相比,WebAssembly 应用程序对内存的访问非常受限,对它们自己也是如此。WebAssembly 代码不能直接访问尚未调用的函数或变量,不能跳转到任意地址,也不能将内存中的数据作为字节码指令执行。 + +在浏览器内部,WASM 模块只能获得一个连续字节的全局数组(线性内存linear memory)进行操作。WebAssembly 可以直接读写该区域中的任意位置,或者请求增加其大小,但仅此而已。这个线性内存linear memory也与包含其实际代码、执行堆栈、当然还有运行 WebAssembly 的虚拟机的区域分离。对于浏览器来说,所有这些数据结构都是普通的 JavaScript 对象,使用标准过程与所有其他对象隔离。 + +### 结果还好,但不完美 + +所有这些限制使得 WebAssembly 模块很难做出不当行为,但也并非不可能。 + +沙盒化的内存使 WebAssembly 几乎不可能接触到 __外部__ 的东西,也使操作系统更难防止 __内部__ 发生不好的事情。传统的内存监测机制,比如 [堆栈金丝雀][4]Stack Canaries 能注意到是否有代码试图扰乱它不应该接触的对象,[但在这里没用][5]。 + +事实上,WebAssembly 只能访问自己的线性内存linear memory,但可以直接访问,这也可能为攻击者的行为 _提供便利_。有了这些约束和对模块源代码的访问,就更容易猜测覆盖哪些内存位置可能造成最大的破坏。破坏局部变量似乎也是 [可能的][6],因为它们停留在线性内存linear memory中的无监督堆栈中。 + +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/ diff --git a/published/202104/20190319 How to set up a homelab from hardware to firewall.md b/published/202104/20190319 How to set up a homelab from hardware to firewall.md new file mode 100644 index 0000000000..54c24e7a14 --- /dev/null +++ b/published/202104/20190319 How to set up a homelab from hardware to firewall.md @@ -0,0 +1,107 @@ +[#]: collector: (lujun9972) +[#]: translator: (wyxplus) +[#]: reviewer: (wxy) +[#]: publisher: (wxy) +[#]: url: (https://linux.cn/article-13262-1.html) +[#]: subject: (How to set up a homelab from hardware to firewall) +[#]: via: (https://opensource.com/article/19/3/home-lab) +[#]: author: (Michael Zamot https://opensource.com/users/mzamot) + +如何从硬件到防火墙建立一个家庭实验室 +====== + +> 了解一下用于构建自己的家庭实验室的硬件和软件方案。 + +![](https://img.linux.net.cn/data/attachment/album/202104/02/215222t2fiqpt17gfpkkii.jpg) + +你有想过创建一个家庭实验室吗?或许你想尝试不同的技术,构建开发环境、亦或是建立自己的私有云。拥有一个家庭实验室的理由很多,本教程旨在使入门变得更容易。 + +规划家庭实验室时,需要考虑三方面:硬件、软件和维护。我们将在这里查看前两方面,并在以后的文章中讲述如何节省维护计算机实验室的时间。 + +### 硬件 + +在考虑硬件需求时,首先要考虑如何使用实验室以及你的预算、噪声、空间和电力使用情况。 + +如果购买新硬件过于昂贵,请搜索当地的大学、广告以及诸如 eBay 或 Craigslist 之类的网站,能获取二手服务器的地方。它们通常很便宜,并且服务器级的硬件可以使用很多年。你将需要三类硬件:虚拟化服务器、存储设备和路由器/防火墙。 + +#### 虚拟化服务器 + +一个虚拟化服务器允许你去运行多个共享物理机资源的虚拟机,同时最大化利用和隔离资源。如果你弄坏了一台虚拟机,无需重建整个服务器,只需虚拟一个好了。如果你想进行测试或尝试某些操作而不损坏整个系统,仅需要新建一个虚拟机来运行即可。 + +在虚拟服务器中,需考虑两个最重要的因素是 CPU 的核心数及其运行速度以及内存容量。如果没有足够的资源够全部虚拟机共享,那么它们将被过度分配并试着获取其他虚拟机的 CPU 的周期和内存。 + +因此,考虑一个多核 CPU 的平台。你要确保 CPU 支持虚拟化指令(因特尔的 VT-x 指令集和 AMD 的 AMD-V 指令集)。能够处理虚拟化的优质的消费级处理器有因特尔的 i5 或 i7 和 AMD 的 Ryzen 处理器。如果你考虑服务器级的硬件,那么因特尔的志强系列和 AMD 的 EPYC 都是不错的选择。内存可能很昂贵,尤其是最近的 DDR4 内存。当我们估计所需多少内存时,请为主机操作系统的内存至少分配 2 GB 的空间。 + +如果你担心电费或噪声,则诸如因特尔 NUC 设备之类的解决方案虽然外形小巧、功耗低、噪音低,但是却以牺牲可扩展性为代价。 + +#### NAS + +如果希望装有硬盘驱动器的计算机存储你的所有个人数据,电影,图片等,并为虚拟化服务器提供存储,则需要网络附加存储Network-attached storage(NAS)。 + +在大多数情况下,你不太可能需要一颗强力的 CPU。实际上,许多商业 NAS 的解决方案使用低功耗的 ARM CPU。支持多个 SATA 硬盘的主板是必须的。如果你的主板没有足够的端口,请使用主机总线适配器host bus adapter(HBA)SAS 控制器添加额外的端口。 + +网络性能对于 NAS 来说是至关重要的,因此最好选择千兆gigabit网络(或更快网络)。 + +内存需求根据你的文件系统而有所不同。ZFS 是 NAS 上最受欢迎的文件系统之一,你需要更多内存才能使用诸如缓存或重复数据删除之类的功能。纠错码Error-correcting code(ECC)的内存是防止数据损坏的最佳选择(但在购买前请确保你的主板支持)。最后但同样重要的,不要忘记使用不间断电源uninterruptible power supply(UPS),因为断电可能会使得数据出错。 + +#### 防火墙和路由器 + +你是否曾意识到,廉价的路由器/防火墙通常是保护你的家庭网络不受外部环境影响的主要部分?这些路由器很少及时收到安全更新(如果有的话)。现在害怕了吗?好吧,[确实][2]! + +通常,你不需要一颗强大的 CPU 或是大量内存来构建你自己的路由器/防火墙,除非你需要高吞吐率或是执行 CPU 密集型任务,像是虚拟私有网络服务器或是流量过滤。在这种情况下,你将需要一个支持 AES-NI 的多核 CPU。 + +你可能想要至少 2 个千兆或更快的以太网卡Ethernet network interface cards(NIC),这不是必需的,但我推荐使用一个管理型交换机来连接你自己的装配的路由器,以创建 VLAN 来进一步隔离和保护你的网络。 + +![Home computer lab PfSense][4] + +### 软件 + +在选择完你的虚拟化服务器、NAS 和防火墙/路由器后,下一步是探索不同的操作系统和软件,以最大程度地发挥其作用。尽管你可以使用 CentOS、Debian或 Ubuntu 之类的常规 Linux 发行版,但是与以下软件相比,它们通常花费更多的时间进行配置和管理。 + +#### 虚拟化软件 + +[KVM][5](基于内核的虚拟机Kernel-based Virtual Machine)使你可以将 Linux 变成虚拟机监控程序,以便可以在同一台机器中运行多个虚拟机。最好的是,KVM 作为 Linux 的一部分,它是许多企业和家庭用户的首选。如果你愿意,可以安装 [libvirt][6] 和 [virt-manager][7] 来管理你的虚拟化平台。 + +[Proxmox VE][8] 是一个强大的企业级解决方案,并且是一个完全开源的虚拟化和容器平台。它基于 Debian,使用 KVM 作为其虚拟机管理程序,并使用 LXC 作为容器。Proxmox 提供了强大的网页界面、API,并且可以扩展到许多群集节点,这很有用,因为你永远不知道何时实验室容量不足。 + +[oVirt][9](RHV)是另一种使用 KVM 作为虚拟机管理程序的企业级解决方案。不要因为它是企业级的,就意味着你不能在家中使用它。oVirt 提供了强大的网页界面和 API,并且可以处理数百个节点(如果你运行那么多服务器,我可不想成为你的邻居!)。oVirt 用于家庭实验室的潜在问题是它需要一套最低限度的节点:你将需要一个外部存储(例如 NAS)和至少两个其他虚拟化节点(你可以只在一个节点上运行,但你会遇到环境维护方面的问题)。 + +#### 网络附加存储软件 + +[FreeNAS][10] 是最受欢迎的开源 NAS 发行版,它基于稳定的 FreeBSD 操作系统。它最强大的功能之一是支持 ZFS 文件系统,该文件系统提供了数据完整性检查、快照、复制和多个级别的冗余(镜像、条带化镜像和条带化)。最重要的是,所有功能都通过功能强大且易于使用的网页界面进行管理。在安装 FreeNAS 之前,请检查硬件是否支持,因为它不如基于 Linux 的发行版那么广泛。 + +另一个流行的替代方法是基于 Linux 的 [OpenMediaVault][11]。它的主要功能之一是模块化,带有可扩展和添加特性的插件。它包括的功能包括基于网页管理界面,CIFS、SFTP、NFS、iSCSI 等协议,以及卷管理,包括软件 RAID、资源配额,访问控制列表access control lists(ACL)和共享管理。由于它是基于 Linux 的,因此其具有广泛的硬件支持。 + +#### 防火墙/路由器软件 + +[pfSense][12] 是基于 FreeBSD 的开源企业级路由器和防火墙发行版。它可以直接安装在服务器上,甚至可以安装在虚拟机中(以管理虚拟或物理网络并节省空间)。它有许多功能,可以使用软件包进行扩展。尽管它也有命令行访问权限,但也可以完全使用网页界面对其进行管理。它具有你所希望路由器和防火墙提供的所有功能,例如 DHCP 和 DNS,以及更高级的功能,例如入侵检测(IDS)和入侵防御(IPS)系统。你可以侦听多个不同接口或使用 VLAN 的网络,并且只需鼠标点击几下即可创建安全的 VPN 服务器。pfSense 使用 pf,这是一种有状态的数据包筛选器,它是为 OpenBSD 操作系统开发的,使用类似 IPFilter 的语法。许多公司和组织都有使用 pfSense。 + +* * * + +考虑到所有的信息,是时候动手开始建立你的实验室了。在之后的文章中,我将介绍运行家庭实验室的第三方面:自动化进行部署和维护。 + +-------------------------------------------------------------------------------- + +via: https://opensource.com/article/19/3/home-lab + +作者:[Michael Zamot (Red Hat)][a] +选题:[lujun9972][b] +译者:[wyxplus](https://github.com/wyxplus) +校对:[wxy](https://github.com/wxy) + +本文由 [LCTT](https://github.com/LCTT/TranslateProject) 原创编译,[Linux中国](https://linux.cn/) 荣誉推出 + +[a]: https://opensource.com/users/mzamot +[b]: https://github.com/lujun9972 +[1]: https://opensource.com/sites/default/files/styles/image-full-size/public/lead-images/computer_keyboard_laptop_development_code_woman.png?itok=vbYz6jjb +[2]: https://opensource.com/article/18/5/how-insecure-your-router +[3]: /file/427426 +[4]: https://opensource.com/sites/default/files/uploads/pfsense2.png (Home computer lab PfSense) +[5]: https://www.linux-kvm.org/page/Main_Page +[6]: https://libvirt.org/ +[7]: https://virt-manager.org/ +[8]: https://www.proxmox.com/en/proxmox-ve +[9]: https://ovirt.org/ +[10]: https://freenas.org/ +[11]: https://www.openmediavault.org/ +[12]: https://www.pfsense.org/ diff --git a/published/202104/20200106 Open Source Supply Chain- A Matter of Trust.md b/published/202104/20200106 Open Source Supply Chain- A Matter of Trust.md new file mode 100644 index 0000000000..60aa20fb4c --- /dev/null +++ b/published/202104/20200106 Open Source Supply Chain- A Matter of Trust.md @@ -0,0 +1,69 @@ +[#]: collector: (lujun9972) +[#]: translator: (Kevin3599) +[#]: reviewer: (wxy) +[#]: publisher: (wxy) +[#]: url: (https://linux.cn/article-13321-1.html) +[#]: subject: (Open Source Supply Chain: A Matter of Trust) +[#]: via: (https://www.linux.com/articles/open-source-supply-chain-a-matter-of-trust/) +[#]: author: (Swapnil Bhartiya https://www.linux.com/author/swapnil/) + +开源供应链:一个有关信任的问题 +====== + +[![][1]][2] + +共同作者:Curtis Franklin, Jr + +开源软件通常被认为比专有软件更安全、更有保障,因为如果用户愿意,他们可以从源代码编译软件。他们知道在他们环境中运行的代码的来源。在他们的环境中运行的代码每个部分都可以被审查,也可以追溯每段代码的开发者。 + +然而,用户和提供者们正在逐渐远离完全控制软件所带来的复杂性,而在转而追求软件的便捷和易用。 + +VMware 副总裁兼首席开源官 Dirk Hohndel 说:“当我看到在一个有关网络安全和隐私的讲座中,演讲者运行 `docker run` 命令来安装和运行一些从互联网上下载的随机二进制文件时,我经常会大吃一惊。这两件事似乎有点相左。” + +软件供应链,即将应用程序从编码、打包、分发到最终用户的过程是相当复杂的。如果其中有一环出现错误,可能会导致软件存在潜在的风险,特别是对于开源软件。一个恶意行为者可以访问后端,并在用户不知情或不受控的情况下向其插入任何可能的恶意代码。 + +这样的问题不单单存在于云原生领域,在现代应用开发中很常见,这包括 JavaScript、NPM、PyPI、RubyGems 等等。甚至连 Mac 上的 Homebrew 过去也是通过源代码提供,由用户自己编译。 + +“如今,你只需要下载二进制文件并安装它,并期望其源代码并没有被恶意修改过。”Hohndel 说,“作为一个行业,我们需要更加关注我们的开源代码供应。这对我来说是非常重要的事,我正努力让更多的人意识到其重要性。” + +然而,这不仅仅是一个二进制与源代码的关系。只运行一个二进制文件,而不必从源代码构建所有东西有着巨大的优势。当软件开发需求发生转变时候,这种运行方式允许开发人员在过程中更加灵活和响应更快。通过重用一些二进制文件,他们可以在新的开发和部署中快速地循环。 + +Hohndel 说:“如果有办法向这些软件添加签名,并建立一个‘即时’验证机制,让用户知道他们可以信任此软件,那就更好了。” + +Linux 发行版解决了这个问题,因为发行版充当了看门人的角色,负责检查进入受支持的软件存储库的软件包的完整性。 + +“像通过 Debian 等发行版提供的软件包都使用了密钥签名。要确保它确实是发行版中应包含的软件,需要进行大量工作。开发者们通过这种方式解决了开源供应链问题。”Hohndel 说。 + +但是,即使在 Linux 发行版上,人们也希望简化事情,并以正确性和安全性换取速度。现在,诸如 AppImage、Snap 和 Flatpack 之类的项目已经采用了二进制方式,从而将开源供应链信任问题带入了 Linux 发行版。这和 Docker 容器的问题如出一辙。 + +“理想的解决方案是为开源社区找到一种设计信任系统的方法,该系统可以确保如果二进制文件是用受信任网络中的密钥签名的,那么它就可以被信任,并允许我们可靠地返回源头并进行审核,” Hohndel 建议。 + +但是,所有这些额外的步骤都会产生成本,大多数项目开发者要么不愿意,或无力承担。一些项目正在尝试寻找解决该问题的方法。例如,NPM 已开始鼓励提交软件包的用户正确认证和保护其账户安全,以提高平台的可信度。 + +### 开源社区善于解决问题 + +Hohndel 致力于解决开源供应链问题,并正试图让更多开发者意识到其重要性。去年,VMware 收购了 Bitnami,这为管理由 VMware 所签名的开源软件提供了一个良机。 + +“我们正在与各种上游开源社区进行交流,以提高对此的认识。我们还在讨论技术解决方案,这些方案将使这些社区更容易解决潜在的开源供应链问题。” Hohndel 说。 + +开源社区历来致力于确保软件质量,这其中也包括安全性和隐私性。不过,Hohndel 说:“我最担心的是,在对下一个新事物感到兴奋时,我们经常忽略了需要的基础工程原则。” + +最终,Hohndel 认为答案将来自开源社区本身。 “开源是一种工程方法论,是一种社会实验。开源就是人们之间相互信任、相互合作、跨国界和公司之间以及竞争对手之间的合作,以我们以前从未有过的方式。”他解释说。 + +-------------------------------------------------------------------------------- + +via: https://www.linux.com/articles/open-source-supply-chain-a-matter-of-trust/ + +作者:[Swapnil Bhartiya][a] +选题:[lujun9972][b] +译者:[Kevin3599](https://github.com/kevin3599) +校对:[wxy](https://github.com/wxy) + +本文由 [LCTT](https://github.com/LCTT/TranslateProject) 原创编译,[Linux中国](https://linux.cn/) 荣誉推出 + +[a]: https://www.linux.com/author/swapnil/ +[b]: https://github.com/lujun9972 +[1]: https://www.linux.com/wp-content/uploads/2020/01/hand-1137978_1920-1068x801.jpg (hand-1137978_1920) +[2]: https://www.linux.com/wp-content/uploads/2020/01/hand-1137978_1920.jpg +[3]: https://www.swapnilbhartiya.com/open-source-leaders-dirk-hohndel-brings-open-source-to-vmware/ +[4]: https://techcrunch.com/2019/05/15/vmware-acquires-bitnami-to-deliver-packaged-applications-anywhere/ diff --git a/published/202104/20200423 4 open source chat applications you should use right now.md b/published/202104/20200423 4 open source chat applications you should use right now.md new file mode 100644 index 0000000000..5c445b9586 --- /dev/null +++ b/published/202104/20200423 4 open source chat applications you should use right now.md @@ -0,0 +1,138 @@ +[#]: collector: (lujun9972) +[#]: translator: (wyxplus) +[#]: reviewer: (wxy) +[#]: publisher: (wxy) +[#]: url: (https://linux.cn/article-13271-1.html) +[#]: subject: (4 open source chat applications you should use right now) +[#]: via: (https://opensource.com/article/20/4/open-source-chat) +[#]: author: (Sudeshna Sur https://opensource.com/users/sudeshna-sur) + +值得现在就去尝试的四款开源聊天应用软件 +====== + +> 现在,远程协作已作为一项必不可少的能力,让开源实时聊天成为你工具箱中必不可少的一部分吧。 + +![](https://img.linux.net.cn/data/attachment/album/202104/06/103454xundd858446u08r0.jpg) + +清晨起床后,我们通常要做的第一件事是检查手机,看看是否有同事和朋友发来的重要信息。无论这是否是一个好习惯,但这种行为早已成为我们日常生活的一部分。 + +> 人是理性动物。他可以为任何他想相信的事情想出一个理由。 +> – 阿纳托尔·法朗士 + +无论理由是否合理,我们每天都在使用的一系列的通讯工具,例如电子邮件、电话、网络会议工具或社交网络。甚至在 COVID-19 之前,居家办公就已经使这些通信工具成为我们生活中的重要部分。随着疫情出现,居家办公成为新常态,我们交流方式的方方面面正面临着前所未有的改变,这让这些工具变得不可或缺。 + +### 为什么需要聊天? + +作为全球团队的一部分进行远程工作时,我们必须要有一个相互协作的环境。聊天应用软件在帮助我们保持相互联系中起着至关重要的作用。与电子邮件相比,聊天应用软件可提供与全球各地的同事快速、实时的通信。 + +选择一款聊天应用软件需要考虑很多因素。为了帮助你选择最适合你的应用软件,在本文中,我将探讨四款开源聊天应用软件,和一个当你需要与同事“面对面”时的开源视频通信工具,然后概述在高效的通讯应用软件中,你应当考虑的一些功能。 + +### 四款开源聊天软件 + +#### Rocket.Chat + +![Rocket.Chat][2] + +[Rocket.Chat][3] 是一个综合性的通讯平台,其将频道分为公开房间(任何人都可以加入)和私有房间(仅受邀请)。你还可以直接将消息发送给已登录的人员。其能共享文档、链接、照片、视频和动态图GIF,以及进行视频通话,并可以在平台中发送语音信息。 + +Rocket.Chat 是自由开源软件,但是其独特之处在于其可自托管的聊天系统。你可以将其下载到你的服务器上,无论它是本地服务器或是在公有云上的虚拟专用服务器。 + +Rocket.Chat 是完全免费,其 [源码][4] 可在 Github 获得。许多开源项目都使用 Rocket.Chat 作为他们官方交流平台。该软件在持续不断的发展且不断更新和改进新功能。 + +我最喜欢 Rocket.Chat 的地方是其能够根据用户需求来进行自定义操作,并且它使用机器学习在用户通讯间进行自动的、实时消息翻译。你也可以下载适用于你移动设备的 Rocket.Chat,以便能随时随地使用。 + +#### IRC + +![IRC on WeeChat 0.3.5][5] + +IRC([互联网中继聊天][6]Internet Relay Chat)是一款实时、基于文本格式的通信软件。尽管其是最古老的电子通讯形式之一,但在许多知名的软件项目中仍受欢迎。 + +IRC 频道是单独的聊天室。它可以让你在一个开放的频道中与多人进行聊天或与某人私下一对一聊天。如果频道名称以 `#` 开头,则可以假定它是官方的聊天室,而以 `##` 开头的聊天室通常是非官方的聊天室。 + +[上手 IRC][7] 很容易。你的 IRC 昵称可以让人们找到你,因此它必须是唯一的。但是,你可以完全自主地选择 IRC 客户端。如果你需要比标准 IRC 客户端更多功能的应用程序,则可以使用 [Riot.im][8] 连接到 IRC。 + +考虑到它悠久的历史,你为什么还要继续使用 IRC?出于一个原因是,其仍是我们所依赖的许多自由及开源项目的家园。如果你想参于开源软件开发和社区,可以选择用 IRC。 + +#### Zulip + +![Zulip][9] + +[Zulip][10] 是十分流行的群聊应用程序,它遵循基于话题线索的模式。在 Zulip 中,你可以订阅stream,就像在 IRC 频道或 Rocket.Chat 中一样。但是,每个 Zulip 流都会拥有一个唯一的话题topic,该话题可帮助你以后查找对话,因此其更有条理。 + +与其他平台一样,它支持表情符号、内嵌图片、视频和推特预览。它还支持 LaTeX 来分享数学公式或方程式、支持 Markdown 和语法高亮来分享代码。 + +Zulip 是跨平台的,并提供 API 用于编写你自己的程序。我特别喜欢 Zulip 的一点是它与 GitHub 的集成整合功能:如果我正在处理某个议题issue,则可以使用 Zulip 的标记回链某个拉取请求pull request ID。 + +Zulip 是开源的(你可以在 GitHub 上访问其 [源码][11])并且免费使用,但它有提供预置支持、[LDAP][12] 集成和更多存储类型的付费产品。 + +#### Let's Chat + +![Let's Chat][13] + +[Let's Chat][14] 是一个面向小型团队的自托管的聊天解决方案。它使用 Node.js 和 MongoDB 编写运行,只需鼠标点击几下即可将其部署到本地服务器或云服务器。它是自由开源软件,可以在 GitHub 上查看其 [源码][15]。 + +Let's Chat 与其他开源聊天工具的不同之处在于其企业功能:它支持 LDAP 和 [Kerberos][16] 身份验证。它还具有新用户想要的所有功能:你可以在历史记录中搜索过往消息,并使用 @username 之类的标签来标记人员。 + +我喜欢 Let's Chat 的地方是它拥有私人的受密码保护的聊天室、发送图片、支持 GIPHY 和代码粘贴。它不断更新,不断增加新功能。 + +### 附加:开源视频聊天软件 Jitsi + +![Jitsi][17] + +有时,文字聊天还不够,你还可能需要与某人面谈。在这种情况下,如果不能选择面对面开会交流,那么视频聊天是最好的选择。[Jitsi][18] 是一个完全开源的、支持多平台且兼容 WebRTC 的视频会议工具。 + +Jitsi 从 Jitsi Desktop 开始,已经发展成为许多 [项目][19],包括 Jitsi Meet、Jitsi Videobridge、jibri 和 libjitsi,并且每个项目都在 GitHub 上开放了 [源码][20]。 + +Jitsi 是安全且可扩展的,并支持诸如联播simulcast带宽预估bandwidth estimation之类的高级视频路由的概念,还包括音频、录制、屏幕共享和拨入功能等经典功能。你可以来为你的视频聊天室设置密码以保护其不受干扰,并且它还支持通过 YouTube 进行直播。你还可以搭建自己的 Jitsi 服务器,并将其托管在本地或虚拟专用服务器virtual private server(例如 Digital Ocean Droplet)上。 + +我最喜欢 Jitsi 的是它是免费且低门槛的。任何人都可以通过访问 [meet.jit.si][21] 来立即召开会议,并且用户无需注册或安装即可轻松参加会议。(但是,注册的话能拥有日程安排功能。)这种入门级低门槛的视频会议服务让 Jitsi 迅速普及。 + +### 选择一个聊天应用软件的建议 + +各种各样的开源聊天应用软件可能让你很难抉择。以下是一些选择一款聊天应用软件的一般准则。 + + * 最好具有交互式的界面和简单的导航工具。 + * 最好寻找一种功能强大且能让人们以各种方式使用它的工具。 + * 如果与你所使用的工具有进行集成整合的话,可以重点考虑。一些工具与 GitHub 或 GitLab 以及某些应用程序具有良好的无缝衔接,这将是一个非常有用的功能。 + * 有能托管到云主机的工具将十分方便。 + * 应考虑到聊天服务的安全性。在私人服务器上托管服务的能力对许多组织和个人来说是必要的。 + * 最好选择那些具有丰富的隐私设置,并拥有私人聊天室和公共聊天室的通讯工具。 + +由于人们比以往任何时候都更加依赖在线服务,因此拥有备用的通讯平台是明智之举。例如,如果一个项目正在使用 Rocket.Chat,则必要之时,它还应具有跳转到 IRC 的能力。由于这些软件在不断更新,你可能会发现自己已经连接到多个渠道,因此集成整合其他应用将变得非常有价值。 + +在各种可用的开源聊天服务中,你喜欢和使用哪些?这些工具又是如何帮助你进行远程办公?请在评论中分享你的想法。 + +-------------------------------------------------------------------------------- + +via: https://opensource.com/article/20/4/open-source-chat + +作者:[Sudeshna Sur][a] +选题:[lujun9972][b] +译者:[wyxplus](https://github.com/wyxplus) +校对:[wxy](https://github.com/wxy) + +本文由 [LCTT](https://github.com/LCTT/TranslateProject) 原创编译,[Linux中国](https://linux.cn/) 荣誉推出 + +[a]: https://opensource.com/users/sudeshna-sur +[b]: https://github.com/lujun9972 +[1]: https://opensource.com/sites/default/files/styles/image-full-size/public/lead-images/talk_chat_communication_team.png?itok=CYfZ_gE7 (Chat bubbles) +[2]: https://opensource.com/sites/default/files/uploads/rocketchat.png (Rocket.Chat) +[3]: https://rocket.chat/ +[4]: https://github.com/RocketChat/Rocket.Chat +[5]: https://opensource.com/sites/default/files/uploads/irc.png (IRC on WeeChat 0.3.5) +[6]: https://en.wikipedia.org/wiki/Internet_Relay_Chat +[7]: https://opensource.com/article/16/6/getting-started-irc +[8]: https://opensource.com/article/17/5/introducing-riot-IRC +[9]: https://opensource.com/sites/default/files/uploads/zulip.png (Zulip) +[10]: https://zulipchat.com/ +[11]: https://github.com/zulip/zulip +[12]: https://en.wikipedia.org/wiki/Lightweight_Directory_Access_Protocol +[13]: https://opensource.com/sites/default/files/uploads/lets-chat.png (Let's Chat) +[14]: https://sdelements.github.io/lets-chat/ +[15]: https://github.com/sdelements/lets-chat +[16]: https://en.wikipedia.org/wiki/Kerberos_(protocol) +[17]: https://opensource.com/sites/default/files/uploads/jitsi_0_0.jpg (Jitsi) +[18]: https://jitsi.org/ +[19]: https://jitsi.org/projects/ +[20]: https://github.com/jitsi +[21]: http://meet.jit.si diff --git a/published/202104/20200617 How to handle dynamic and static libraries in Linux.md b/published/202104/20200617 How to handle dynamic and static libraries in Linux.md new file mode 100644 index 0000000000..d74b9a4b50 --- /dev/null +++ b/published/202104/20200617 How to handle dynamic and static libraries in Linux.md @@ -0,0 +1,271 @@ +[#]: collector: (lujun9972) +[#]: translator: (tt67wq) +[#]: reviewer: (wxy) +[#]: publisher: (wxy) +[#]: url: (https://linux.cn/article-13318-1.html) +[#]: subject: (How to handle dynamic and static libraries in Linux) +[#]: via: (https://opensource.com/article/20/6/linux-libraries) +[#]: author: (Stephan Avenwedde https://opensource.com/users/hansic99) + +怎样在 Linux 中使用动态和静态库 +====== + +> 了解 Linux 如何使用库,包括静态库和动态库的差别,有助于你解决依赖问题。 + +![](https://img.linux.net.cn/data/attachment/album/202104/21/184822euzoqsiwxxpiqqrr.jpg) + +Linux 从某种意义上来说就是一堆相互依赖的静态和动态库。对于 Linux 系统新手来说,库的整个处理过程简直是个迷。但对有经验的人来说,被构建进操作系统的大量共享代码对于编写新应用来说却是个优点。 + +为了让你熟悉这个话题,我准备了一个小巧的 [应用例子][2] 来展示在普通的 Linux 发行版(在其他操作系统上未验证)上是经常是如何处理库的。为了用这个例子来跟上这个需要动手的教程,请打开命令行输入: + +``` +$ git clone https://github.com/hANSIc99/library_sample +$ cd library_sample/ +$ make +cc -c main.c -Wall -Werror +cc -c libmy_static_a.c -o libmy_static_a.o -Wall -Werror +cc -c libmy_static_b.c -o libmy_static_b.o -Wall -Werror +ar -rsv libmy_static.a libmy_static_a.o libmy_static_b.o +ar: creating libmy_static.a +a - libmy_static_a.o +a - libmy_static_b.o +cc -c -fPIC libmy_shared.c -o libmy_shared.o +cc -shared -o libmy_shared.so libmy_shared.o +$ make clean +rm *.o +``` + +当执行完这些命令,这些文件应当被添加进目录下(执行 `ls` 来查看): + +``` +my_app +libmy_static.a +libmy_shared.so +``` + +### 关于静态链接 + +当你的应用链接了一个静态库,这个库的代码就变成了可执行文件的一部分。这个动作只在链接过程中执行一次,这些静态库通常以 `.a` 扩展符结尾。 + +静态库是多个目标object文件的归档archive([ar][3])。这些目标文件通常是 ELF 格式的。ELF 是 [可执行可链接格式][4]Executable and Linkable Format 的简写,它与多个操作系统兼容。 + +`file` 命令的输出可以告诉你静态库 `libmy_static.a` 是 `ar` 格式的归档文件类型。 + +``` +$ file libmy_static.a +libmy_static.a: current ar archive +``` + +使用 `ar -t`,你可以看到归档文件的内部。它展示了两个目标文件: + +``` +$ ar -t libmy_static.a +libmy_static_a.o +libmy_static_b.o +``` + +你可以用 `ax -x ` 命令来提取归档文件的文件。被提出的都是 ELF 格式的目标文件: + +``` +$ ar -x libmy_static.a +$ file libmy_static_a.o +libmy_static_a.o: ELF 64-bit LSB relocatable, x86-64, version 1 (SYSV), not stripped +``` + +### 关于动态链接 + +动态链接指的是使用共享库。共享库通常以 `.so` 的扩展名结尾(“共享对象shared object” 的简写)。 + +共享库是 Linux 系统中依赖管理的最常用方法。这些共享库在应用启动前被载入内存,当多个应用都需要同一个库时,这个库在系统中只会被加载一次。这个特性减少了应用的内存占用。 + +另外一个值得注意的地方是,当一个共享库的 bug 被修复后,所有引用了这个库的应用都会受益。但这也意味着,如果一个 bug 还没被发现,那所有相关的应用都会遭受这个 bug 影响(如果这个应用使用了受影响的部分)。 + +当一个应用需要某个特定版本的库,但是链接器linker只知道某个不兼容版本的位置,对于初学者来说这个问题非常棘手。在这个场景下,你必须帮助链接器找到正确版本的路径。 + +尽管这不是一个每天都会遇到的问题,但是理解动态链接的原理总是有助于你修复类似的问题。 + +幸运的是,动态链接的机制其实非常简洁明了。 + +为了检查一个应用在启动时需要哪些库,你可以使用 `ldd` 命令,它会打印出给定文件所需的动态库: + +``` +$ ldd my_app +        linux-vdso.so.1 (0x00007ffd1299c000) +        libmy_shared.so => not found +        libc.so.6 => /lib64/libc.so.6 (0x00007f56b869b000) +        /lib64/ld-linux-x86-64.so.2 (0x00007f56b8881000) +``` + +可以注意到 `libmy_shared.so` 库是代码仓库的一部分,但是没有被找到。这是因为负责在应用启动之前将所有依赖加载进内存的动态链接器没有在它搜索的标准路径下找到这个库。 + +对新手来说,与常用库(例如 `bizp2`)版本不兼容相关的问题往往十分令人困惑。一种方法是把该仓库的路径加入到环境变量 `LD_LIBRARY_PATH` 中来告诉链接器去哪里找到正确的版本。在本例中,正确的版本就在这个目录下,所以你可以导出它至环境变量: + +``` +$ LD_LIBRARY_PATH=$(pwd):$LD_LIBRARY_PATH +$ export LD_LIBRARY_PATH +``` + +现在动态链接器知道去哪找库了,应用也可以执行了。你可以再次执行 `ldd` 去调用动态链接器,它会检查应用的依赖然后加载进内存。内存地址会在对象路径后展示: + +``` +$ ldd my_app +        linux-vdso.so.1 (0x00007ffd385f7000) +        libmy_shared.so => /home/stephan/library_sample/libmy_shared.so (0x00007f3fad401000) +        libc.so.6 => /lib64/libc.so.6 (0x00007f3fad21d000) +        /lib64/ld-linux-x86-64.so.2 (0x00007f3fad408000) +``` + +想知道哪个链接器被调用了,你可以用 `file` 命令: + +``` +$ file my_app +my_app: ELF 64-bit LSB executable, x86-64, version 1 (SYSV), dynamically linked, interpreter /lib64/ld-linux-x86-64.so.2, BuildID[sha1]=26c677b771122b4c99f0fd9ee001e6c743550fa6, for GNU/Linux 3.2.0, not stripped +``` + +链接器 `/lib64/ld-linux-x86–64.so.2` 是一个指向 `ld-2.30.so` 的软链接,它也是我的 Linux 发行版的默认链接器: + +``` +$ file /lib64/ld-linux-x86-64.so.2 +/lib64/ld-linux-x86-64.so.2: symbolic link to ld-2.31.so +``` + +回头看看 `ldd` 命令的输出,你还可以看到(在 `libmy_shared.so` 边上)每个依赖都以一个数字结尾(例如 `/lib64/libc.so.6`)。共享对象的常见命名格式为: + +``` +libXYZ.so.. +``` + +在我的系统中,`libc.so.6` 也是指向同一目录下的共享对象 `libc-2.31.so` 的软链接。 + +``` +$ file /lib64/libc.so.6 +/lib64/libc.so.6: symbolic link to libc-2.31.so +``` + +如果你正在面对一个应用因为加载库的版本不对导致无法启动的问题,有很大可能你可以通过检查整理这些软链接或者确定正确的搜索路径(查看下方“动态加载器:ld.so”一节)来解决这个问题。 + +更为详细的信息请查看 [ldd 手册页][5]。 + +#### 动态加载 + +动态加载的意思是一个库(例如一个 `.so` 文件)在程序的运行时被加载。这是使用某种特定的编程方法实现的。 + +当一个应用使用可以在运行时改变的插件时,就会使用动态加载。 + +查看 [dlopen 手册页][6] 获取更多信息。 + +#### 动态加载器:ld.so + +在 Linux 系统中,你几乎总是正在跟共享库打交道,所以必须有个机制来检测一个应用的依赖并将其加载进内存中。 + +`ld.so` 按以下顺序在这些地方寻找共享对象: + + 1. 应用的绝对路径或相对路径下(用 GCC 编译器的 `-rpath` 选项硬编码的) + 2. 环境变量 `LD_LIBRARY_PATH` + 3. `/etc/ld.so.cache` 文件 + +需要记住的是,将一个库加到系统库归档 `/usr/lib64` 中需要管理员权限。你可以手动拷贝 `libmy_shared.so` 至库归档中来让应用可以运行,而避免设置 `LD_LIBRARY_PATH`。 + +``` +unset LD_LIBRARY_PATH +sudo cp libmy_shared.so /usr/lib64/ +``` + +当你运行 `ldd` 时,你现在可以看到归档库的路径被展示出来: + +``` +$ ldd my_app +        linux-vdso.so.1 (0x00007ffe82fab000) +        libmy_shared.so => /lib64/libmy_shared.so (0x00007f0a963e0000) +        libc.so.6 => /lib64/libc.so.6 (0x00007f0a96216000) +        /lib64/ld-linux-x86-64.so.2 (0x00007f0a96401000) +``` + +### 在编译时定制共享库 + +如果你想你的应用使用你的共享库,你可以在编译时指定一个绝对或相对路径。 + +编辑 `makefile`(第 10 行)然后通过 `make -B` 来重新编译程序。然后 `ldd` 输出显示 `libmy_shared.so` 和它的绝对路径一起被列出来了。 + +把这个: + +``` +CFLAGS =-Wall -Werror -Wl,-rpath,$(shell pwd) +``` + +改成这个(记得修改用户名): + +``` +CFLAGS =/home/stephan/library_sample/libmy_shared.so +``` + +然后重新编译: + +``` +$ make +``` + +确认下它正在使用你设定的绝对路径,你可以在输出的第二行看到: + +``` +$ ldd my_app +    linux-vdso.so.1 (0x00007ffe143ed000) +        libmy_shared.so => /lib64/libmy_shared.so (0x00007fe50926d000) +        /home/stephan/library_sample/libmy_shared.so (0x00007fe509268000) +        libc.so.6 => /lib64/libc.so.6 (0x00007fe50909e000) +        /lib64/ld-linux-x86-64.so.2 (0x00007fe50928e000) +``` + +这是个不错的例子,但是如果你在编写给其他人用的库,它是怎样工作的呢?新库的路径可以通过写入 `/etc/ld.so.conf` 或是在 `/etc/ld.so.conf.d/` 目录下创建一个包含路径的 `.conf` 文件来注册至系统。之后,你必须执行 `ldconfig` 命令来覆写 `ld.so.cache` 文件。这一步有时候在你装了携带特殊的共享库的程序来说是不可省略的。 + +查看 [ld.so 的手册页][7] 获取更多详细信息。 + +### 怎样处理多种架构 + +通常来说,32 位和 64 位版本的应用有不同的库。下面列表展示了不同 Linux 发行版库的标准路径: + +**红帽家族** + + * 32 位:`/usr/lib` + * 64 位:`/usr/lib64` + +**Debian 家族** + + * 32 位:`/usr/lib/i386-linux-gnu` + * 64 位:`/usr/lib/x86_64-linux-gnu` + +**Arch Linux 家族** + + * 32 位:`/usr/lib32` + * 64 位:`/usr/lib64` + +[FreeBSD][8](技术上来说不算 Linux 发行版) + + * 32 位:`/usr/lib32` + * 64 位:`/usr/lib` + +知道去哪找这些关键库可以让库链接失效的问题成为历史。 + +虽然刚开始会有点困惑,但是理解 Linux 库的依赖管理是一种对操作系统掌控感的表现。在其他应用程序中运行这些步骤,以熟悉常见的库,然后继续学习怎样解决任何你可能遇到的库的挑战。 + +-------------------------------------------------------------------------------- + +via: https://opensource.com/article/20/6/linux-libraries + +作者:[Stephan Avenwedde][a] +选题:[lujun9972][b] +译者:[tt67wq](https://github.com/tt67wq) +校对:[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/yearbook-haff-rx-linux-file-lead_0.png?itok=-i0NNfDC (Hand putting a Linux file folder into a drawer) +[2]: https://github.com/hANSIc99/library_sample +[3]: https://en.wikipedia.org/wiki/Ar_%28Unix%29 +[4]: https://linuxhint.com/understanding_elf_file_format/ +[5]: https://www.man7.org/linux/man-pages/man1/ldd.1.html +[6]: https://www.man7.org/linux/man-pages/man3/dlopen.3.html +[7]: https://www.man7.org/linux/man-pages/man8/ld.so.8.html +[8]: https://opensource.com/article/20/5/furybsd-linux diff --git a/published/202104/20200707 Use systemd timers instead of cronjobs.md b/published/202104/20200707 Use systemd timers instead of cronjobs.md new file mode 100644 index 0000000000..81e4553369 --- /dev/null +++ b/published/202104/20200707 Use systemd timers instead of cronjobs.md @@ -0,0 +1,529 @@ +[#]: collector: (lujun9972) +[#]: translator: (tt67wq) +[#]: reviewer: (wxy) +[#]: publisher: (wxy) +[#]: url: (https://linux.cn/article-13307-1.html) +[#]: subject: (Use systemd timers instead of cronjobs) +[#]: via: (https://opensource.com/article/20/7/systemd-timers) +[#]: author: (David Both https://opensource.com/users/dboth) + +使用 systemd 定时器代替 cron 作业 +====== + +> 定时器提供了比 cron 作业更为细粒度的事件控制。 + +![](https://img.linux.net.cn/data/attachment/album/202104/18/104406dgszkj3eeibkea55.jpg) + +我正在致力于将我的 [cron][2] 作业迁移到 systemd 定时器上。我已经使用定时器多年了,但通常来说,我的学识只足以支撑我当前的工作。但在我研究 [systemd 系列][3] 的过程中,我发现 systemd 定时器有一些非常有意思的能力。 + +与 cron 作业类似,systemd 定时器可以在特定的时间间隔触发事件(shell 脚本和程序),例如每天一次或在一个月中的特定某一天(或许只有在周一生效),或在从上午 8 点到下午 6 点的工作时间内每隔 15 分钟一次。定时器也可以做到 cron 作业无法做到的一些事情。举个例子,定时器可以在特定事件发生后的一段时间后触发一段脚本或者程序去执行,例如开机、启动、上个任务完成,甚至于定时器调用的上个服务单元的完成的时刻。 + +### 操作系统维护的计时器 + +当在一个新系统上安装 Fedora 或者是任意一个基于 systemd 的发行版时,作为系统维护过程的一部分,它会在 Linux 宿主机的后台中创建多个定时器。这些定时器会触发事件来执行必要的日常维护任务,比如更新系统数据库、清理临时目录、轮换日志文件,以及更多其他事件。 + +作为示例,我会查看一些我的主要工作站上的定时器,通过执行 `systemctl status *timer` 命令来展示主机上的所有定时器。星号的作用与文件通配相同,所以这个命令会列出所有的 systemd 定时器单元。 + +``` +[root@testvm1 ~]# systemctl status *timer +● mlocate-updatedb.timer - Updates mlocate database every day + Loaded: loaded (/usr/lib/systemd/system/mlocate-updatedb.timer; enabled; vendor preset: enabled) + Active: active (waiting) since Tue 2020-06-02 08:02:33 EDT; 2 days ago + Trigger: Fri 2020-06-05 00:00:00 EDT; 15h left + Triggers: ● mlocate-updatedb.service + +Jun 02 08:02:33 testvm1.both.org systemd[1]: Started Updates mlocate database every day. + +● logrotate.timer - Daily rotation of log files + Loaded: loaded (/usr/lib/systemd/system/logrotate.timer; enabled; vendor preset: enabled) + Active: active (waiting) since Tue 2020-06-02 08:02:33 EDT; 2 days ago + Trigger: Fri 2020-06-05 00:00:00 EDT; 15h left + Triggers: ● logrotate.service + Docs: man:logrotate(8) + man:logrotate.conf(5) + +Jun 02 08:02:33 testvm1.both.org systemd[1]: Started Daily rotation of log files. + +● sysstat-summary.timer - Generate summary of yesterday's process accounting + Loaded: loaded (/usr/lib/systemd/system/sysstat-summary.timer; enabled; vendor preset: enabled) + Active: active (waiting) since Tue 2020-06-02 08:02:33 EDT; 2 days ago + Trigger: Fri 2020-06-05 00:07:00 EDT; 15h left + Triggers: ● sysstat-summary.service + +Jun 02 08:02:33 testvm1.both.org systemd[1]: Started Generate summary of yesterday's process accounting. + +● fstrim.timer - Discard unused blocks once a week + Loaded: loaded (/usr/lib/systemd/system/fstrim.timer; enabled; vendor preset: enabled) + Active: active (waiting) since Tue 2020-06-02 08:02:33 EDT; 2 days ago + Trigger: Mon 2020-06-08 00:00:00 EDT; 3 days left + Triggers: ● fstrim.service + Docs: man:fstrim + +Jun 02 08:02:33 testvm1.both.org systemd[1]: Started Discard unused blocks once a week. + +● sysstat-collect.timer - Run system activity accounting tool every 10 minutes + Loaded: loaded (/usr/lib/systemd/system/sysstat-collect.timer; enabled; vendor preset: enabled) + Active: active (waiting) since Tue 2020-06-02 08:02:33 EDT; 2 days ago + Trigger: Thu 2020-06-04 08:50:00 EDT; 41s left + Triggers: ● sysstat-collect.service + +Jun 02 08:02:33 testvm1.both.org systemd[1]: Started Run system activity accounting tool every 10 minutes. + +● dnf-makecache.timer - dnf makecache --timer + Loaded: loaded (/usr/lib/systemd/system/dnf-makecache.timer; enabled; vendor preset: enabled) + Active: active (waiting) since Tue 2020-06-02 08:02:33 EDT; 2 days ago + Trigger: Thu 2020-06-04 08:51:00 EDT; 1min 41s left + Triggers: ● dnf-makecache.service + +Jun 02 08:02:33 testvm1.both.org systemd[1]: Started dnf makecache –timer. + +● systemd-tmpfiles-clean.timer - Daily Cleanup of Temporary Directories + Loaded: loaded (/usr/lib/systemd/system/systemd-tmpfiles-clean.timer; static; vendor preset: disabled) + Active: active (waiting) since Tue 2020-06-02 08:02:33 EDT; 2 days ago + Trigger: Fri 2020-06-05 08:19:00 EDT; 23h left + Triggers: ● systemd-tmpfiles-clean.service + Docs: man:tmpfiles.d(5) + man:systemd-tmpfiles(8) + +Jun 02 08:02:33 testvm1.both.org systemd[1]: Started Daily Cleanup of Temporary Directories. +``` + +每个定时器至少有六行相关信息: + + * 定时器的第一行有定时器名字和定时器目的的简短介绍 + * 第二行展示了定时器的状态,是否已加载,定时器单元文件的完整路径以及预设信息。 + * 第三行指明了其活动状态,包括该定时器激活的日期和时间。 + * 第四行包括了该定时器下次被触发的日期和时间和距离触发的大概时间。 + * 第五行展示了被定时器触发的事件或服务名称。 + * 部分(不是全部)systemd 单元文件有相关文档的指引。我虚拟机上输出中有三个定时器有文档指引。这是一个很好(但非必要)的信息。 + * 最后一行是计时器最近触发的服务实例的日志条目。 + +你也许有一些不一样的定时器,取决于你的主机。 + +### 创建一个定时器 + +尽管我们可以解构一个或多个现有的计时器来了解其工作原理,但让我们创建我们自己的 [服务单元][4] 和一个定时器去触发它。为了保持简单,我们将使用一个相当简单的例子。当我们完成这个实验之后,就能更容易理解其他定时器的工作原理以及发现它们正在做什么。 + +首先,创建一个运行基础东西的简单的服务,例如 `free` 命令。举个例子,你可能想定时监控空余内存。在 `/etc/systemd/system` 目录下创建如下的 `myMonitor.server` 单元文件。它不需要是可执行文件: + +``` +# This service unit is for testing timer units +# By David Both +# Licensed under GPL V2 +# + +[Unit] +Description=Logs system statistics to the systemd journal +Wants=myMonitor.timer + +[Service] +Type=oneshot +ExecStart=/usr/bin/free + +[Install] +WantedBy=multi-user.target +``` + +这大概是你能创建的最简单的服务单元了。现在我们查看一下服务状态同时测试一下服务单元确保它和我们预期一样可用。 + + +``` +[root@testvm1 system]# systemctl status myMonitor.service +● myMonitor.service - Logs system statistics to the systemd journal + Loaded: loaded (/etc/systemd/system/myMonitor.service; disabled; vendor preset: disabled) + Active: inactive (dead) +[root@testvm1 system]# systemctl start myMonitor.service +[root@testvm1 system]# +``` + +输出在哪里呢?默认情况下,systemd 服务单元执行程序的标准输出(`STDOUT`)会被发送到系统日志中,它保留了记录供现在或者之后(直到某个时间点)查看。(在本系列的后续文章中,我将介绍系统日志的记录和保留策略)。专门查看你的服务单元的日志,而且只针对今天。`-S` 选项,即 `--since` 的缩写,允许你指定 `journalctl` 工具搜索条目的时间段。这并不代表你不关心过往结果 —— 在这个案例中,不会有过往记录 —— 如果你的机器以及运行了很长时间且堆积了大量的日志,它可以缩短搜索时间。 + +``` +[root@testvm1 system]# journalctl -S today -u myMonitor.service +-- Logs begin at Mon 2020-06-08 07:47:20 EDT, end at Thu 2020-06-11 09:40:47 EDT. -- +Jun 11 09:12:09 testvm1.both.org systemd[1]: Starting Logs system statistics to the systemd journal... +Jun 11 09:12:09 testvm1.both.org free[377966]: total used free shared buff/cache available +Jun 11 09:12:09 testvm1.both.org free[377966]: Mem: 12635740 522868 11032860 8016 1080012 11821508 +Jun 11 09:12:09 testvm1.both.org free[377966]: Swap: 8388604 0 8388604 +Jun 11 09:12:09 testvm1.both.org systemd[1]: myMonitor.service: Succeeded. +[root@testvm1 system]# +``` + +由服务触发的任务可以是单个程序、一组程序或者是一个脚本语言写的脚本。通过在 `myMonitor.service` 单元文件里的 `[Service]` 块末尾中添加如下行可以为服务添加另一个任务: + +``` +ExecStart=/usr/bin/lsblk +``` + +再次启动服务,查看日志检查结果,结果应该看上去像这样。你应该在日志中看到两条命令的结果输出: + +``` +Jun 11 15:42:18 testvm1.both.org systemd[1]: Starting Logs system statistics to the systemd journal... +Jun 11 15:42:18 testvm1.both.org free[379961]: total used free shared buff/cache available +Jun 11 15:42:18 testvm1.both.org free[379961]: Mem: 12635740 531788 11019540 8024 1084412 11812272 +Jun 11 15:42:18 testvm1.both.org free[379961]: Swap: 8388604 0 8388604 +Jun 11 15:42:18 testvm1.both.org lsblk[379962]: NAME MAJ:MIN RM SIZE RO TYPE MOUNTPOINT +Jun 11 15:42:18 testvm1.both.org lsblk[379962]: sda 8:0 0 120G 0 disk +Jun 11 15:42:18 testvm1.both.org lsblk[379962]: ├─sda1 8:1 0 4G 0 part /boot +Jun 11 15:42:18 testvm1.both.org lsblk[379962]: └─sda2 8:2 0 116G 0 part +Jun 11 15:42:18 testvm1.both.org lsblk[379962]: ├─VG01-root 253:0 0 5G 0 lvm / +Jun 11 15:42:18 testvm1.both.org lsblk[379962]: ├─VG01-swap 253:1 0 8G 0 lvm [SWAP] +Jun 11 15:42:18 testvm1.both.org lsblk[379962]: ├─VG01-usr 253:2 0 30G 0 lvm /usr +Jun 11 15:42:18 testvm1.both.org lsblk[379962]: ├─VG01-tmp 253:3 0 10G 0 lvm /tmp +Jun 11 15:42:18 testvm1.both.org lsblk[379962]: ├─VG01-var 253:4 0 20G 0 lvm /var +Jun 11 15:42:18 testvm1.both.org lsblk[379962]: └─VG01-home 253:5 0 10G 0 lvm /home +Jun 11 15:42:18 testvm1.both.org lsblk[379962]: sr0 11:0 1 1024M 0 rom +Jun 11 15:42:18 testvm1.both.org systemd[1]: myMonitor.service: Succeeded. +Jun 11 15:42:18 testvm1.both.org systemd[1]: Finished Logs system statistics to the systemd journal. +``` + +现在你知道了你的服务可以按预期工作了,在 `/etc/systemd/system` 目录下创建 `myMonitor.timer` 定时器单元文件,添加如下代码: + +``` +# This timer unit is for testing +# By David Both +# Licensed under GPL V2 +# + +[Unit] +Description=Logs some system statistics to the systemd journal +Requires=myMonitor.service + +[Timer] +Unit=myMonitor.service +OnCalendar=*-*-* *:*:00 + +[Install] +WantedBy=timers.target +``` + +在 `myMonitor.timer` 文件中的 `OnCalendar` 时间格式,`*-*-* *:*:00`,应该会每分钟触发一次定时器去执行 `myMonitor.service` 单元。我会在文章的后面进一步探索 `OnCalendar` 设置。 + +到目前为止,在服务被计时器触发运行时观察与之有关的日志记录。你也可以跟踪计时器,跟踪服务可以让你接近实时的看到结果。执行 `journalctl` 时带上 `-f` 选项: + +``` +[root@testvm1 system]# journalctl -S today -f -u myMonitor.service +-- Logs begin at Mon 2020-06-08 07:47:20 EDT. -- +``` + +执行但是不启用该定时器,看看它运行一段时间后发生了什么: + +``` +[root@testvm1 ~]# systemctl start myMonitor.service +[root@testvm1 ~]# +``` + +一条结果立即就显示出来了,下一条大概在一分钟后出来。观察几分钟日志,看看你有没有跟我发现同样的事情: + +``` +[root@testvm1 system]# journalctl -S today -f -u myMonitor.service +-- Logs begin at Mon 2020-06-08 07:47:20 EDT. -- +Jun 13 08:39:18 testvm1.both.org systemd[1]: Starting Logs system statistics to the systemd journal... +Jun 13 08:39:18 testvm1.both.org systemd[1]: myMonitor.service: Succeeded. +Jun 13 08:39:19 testvm1.both.org free[630566]: total used free shared buff/cache available +Jun 13 08:39:19 testvm1.both.org free[630566]: Mem: 12635740 556604 10965516 8036 1113620 11785628 +Jun 13 08:39:19 testvm1.both.org free[630566]: Swap: 8388604 0 8388604 +Jun 13 08:39:18 testvm1.both.org systemd[1]: Finished Logs system statistics to the systemd journal. +Jun 13 08:39:19 testvm1.both.org lsblk[630567]: NAME MAJ:MIN RM SIZE RO TYPE MOUNTPOINT +Jun 13 08:39:19 testvm1.both.org lsblk[630567]: sda 8:0 0 120G 0 disk +Jun 13 08:39:19 testvm1.both.org lsblk[630567]: ├─sda1 8:1 0 4G 0 part /boot +Jun 13 08:39:19 testvm1.both.org lsblk[630567]: └─sda2 8:2 0 116G 0 part +Jun 13 08:39:19 testvm1.both.org lsblk[630567]: ├─VG01-root 253:0 0 5G 0 lvm / +Jun 13 08:39:19 testvm1.both.org lsblk[630567]: ├─VG01-swap 253:1 0 8G 0 lvm [SWAP] +Jun 13 08:39:19 testvm1.both.org lsblk[630567]: ├─VG01-usr 253:2 0 30G 0 lvm /usr +Jun 13 08:39:19 testvm1.both.org lsblk[630567]: ├─VG01-tmp 253:3 0 10G 0 lvm /tmp +Jun 13 08:39:19 testvm1.both.org lsblk[630567]: ├─VG01-var 253:4 0 20G 0 lvm /var +Jun 13 08:39:19 testvm1.both.org lsblk[630567]: └─VG01-home 253:5 0 10G 0 lvm /home +Jun 13 08:39:19 testvm1.both.org lsblk[630567]: sr0 11:0 1 1024M 0 rom +Jun 13 08:40:46 testvm1.both.org systemd[1]: Starting Logs system statistics to the systemd journal... +Jun 13 08:40:46 testvm1.both.org free[630572]: total used free shared buff/cache available +Jun 13 08:40:46 testvm1.both.org free[630572]: Mem: 12635740 555228 10966836 8036 1113676 11786996 +Jun 13 08:40:46 testvm1.both.org free[630572]: Swap: 8388604 0 8388604 +Jun 13 08:40:46 testvm1.both.org lsblk[630574]: NAME MAJ:MIN RM SIZE RO TYPE MOUNTPOINT +Jun 13 08:40:46 testvm1.both.org lsblk[630574]: sda 8:0 0 120G 0 disk +Jun 13 08:40:46 testvm1.both.org lsblk[630574]: ├─sda1 8:1 0 4G 0 part /boot +Jun 13 08:40:46 testvm1.both.org lsblk[630574]: └─sda2 8:2 0 116G 0 part +Jun 13 08:40:46 testvm1.both.org lsblk[630574]: ├─VG01-root 253:0 0 5G 0 lvm / +Jun 13 08:40:46 testvm1.both.org lsblk[630574]: ├─VG01-swap 253:1 0 8G 0 lvm [SWAP] +Jun 13 08:40:46 testvm1.both.org lsblk[630574]: ├─VG01-usr 253:2 0 30G 0 lvm /usr +Jun 13 08:40:46 testvm1.both.org lsblk[630574]: ├─VG01-tmp 253:3 0 10G 0 lvm /tmp +Jun 13 08:40:46 testvm1.both.org lsblk[630574]: ├─VG01-var 253:4 0 20G 0 lvm /var +Jun 13 08:40:46 testvm1.both.org lsblk[630574]: └─VG01-home 253:5 0 10G 0 lvm /home +Jun 13 08:40:46 testvm1.both.org lsblk[630574]: sr0 11:0 1 1024M 0 rom +Jun 13 08:40:46 testvm1.both.org systemd[1]: myMonitor.service: Succeeded. +Jun 13 08:40:46 testvm1.both.org systemd[1]: Finished Logs system statistics to the systemd journal. +Jun 13 08:41:46 testvm1.both.org systemd[1]: Starting Logs system statistics to the systemd journal... +Jun 13 08:41:46 testvm1.both.org free[630580]: total used free shared buff/cache available +Jun 13 08:41:46 testvm1.both.org free[630580]: Mem: 12635740 553488 10968564 8036 1113688 11788744 +Jun 13 08:41:46 testvm1.both.org free[630580]: Swap: 8388604 0 8388604 +Jun 13 08:41:47 testvm1.both.org lsblk[630581]: NAME MAJ:MIN RM SIZE RO TYPE MOUNTPOINT +Jun 13 08:41:47 testvm1.both.org lsblk[630581]: sda 8:0 0 120G 0 disk +Jun 13 08:41:47 testvm1.both.org lsblk[630581]: ├─sda1 8:1 0 4G 0 part /boot +Jun 13 08:41:47 testvm1.both.org lsblk[630581]: └─sda2 8:2 0 116G 0 part +Jun 13 08:41:47 testvm1.both.org lsblk[630581]: ├─VG01-root 253:0 0 5G 0 lvm / +Jun 13 08:41:47 testvm1.both.org lsblk[630581]: ├─VG01-swap 253:1 0 8G 0 lvm [SWAP] +Jun 13 08:41:47 testvm1.both.org lsblk[630581]: ├─VG01-usr 253:2 0 30G 0 lvm /usr +Jun 13 08:41:47 testvm1.both.org lsblk[630581]: ├─VG01-tmp 253:3 0 10G 0 lvm /tmp +Jun 13 08:41:47 testvm1.both.org lsblk[630581]: ├─VG01-var 253:4 0 20G 0 lvm /var +Jun 13 08:41:47 testvm1.both.org lsblk[630581]: └─VG01-home 253:5 0 10G 0 lvm /home +Jun 13 08:41:47 testvm1.both.org lsblk[630581]: sr0 11:0 1 1024M 0 rom +Jun 13 08:41:47 testvm1.both.org systemd[1]: myMonitor.service: Succeeded. +Jun 13 08:41:47 testvm1.both.org systemd[1]: Finished Logs system statistics to the systemd journal. +``` + +别忘了检查下计时器和服务的状态。 + +你在日志里大概至少注意到两件事。第一,你不需要特地做什么来让 `myMonitor.service` 单元中 `ExecStart` 触发器产生的 `STDOUT` 存储到日志里。这都是用 systemd 来运行服务的一部分功能。然而,它确实意味着你需要小心对待服务单元里面执行的脚本和它们能产生多少 `STDOUT`。 + +第二,定时器并不是精确在每分钟的 :00 秒执行的,甚至每次执行的时间间隔都不是刚好一分钟。这是特意的设计,但是有必要的话可以改变这种行为(如果只是它挑战了你的系统管理员的敏感神经)。 + +这样设计的初衷是为了防止多个服务在完全相同的时刻被触发。举个例子,你可以用例如 Weekly,Daily 等时间格式。这些快捷写法都被定义为在某一天的 00:00:00 执行。当多个定时器都这样定义的话,有很大可能它们会同时执行。 + +systemd 定时器被故意设计成在规定时间附近随机波动的时间点触发,以避免同一时间触发。它们在一个时间窗口内半随机触发,时间窗口开始于预设的触发时间,结束于预设时间后一分钟。根据 `systemd.timer` 的手册页,这个触发时间相对于其他已经定义的定时器单元保持在稳定的位置。你可以在日志条目中看到,定时器在启动后立即触发,然后在每分钟后的 46 或 47 秒触发。 + +大部分情况下,这种概率抖动的定时器是没事的。当调度类似执行备份的任务,只需要它们在下班时间运行,这样是没问题的。系统管理员可以选择确定的开始时间来确保不和其他任务冲突,例如 01:05:00 这样典型的 cron 作业时间,但是有很大范围的时间值可以满足这一点。在开始时间上的一个分钟级别的随机往往是无关紧要的。 + +然而,对某些任务来说,精确的触发时间是个硬性要求。对于这类任务,你可以向单元文件的 `Timer` 块中添加如下声明来指定更高的触发时间跨度精确度(精确到微秒以内): + +``` +AccuracySec=1us +``` + +时间跨度可用于指定所需的精度,以及定义重复事件或一次性事件的时间跨度。它能识别以下单位: + + * `usec`、`us`、`µs` + * `msec`、`ms` + * `seconds`、`second`、`sec`、`s` + * `minutes`、`minute`、`min`、`m` + * `hours`、`hour`、`hr`、`h` + * `days`、`day`、`d` + * `weeks`、`week`、`w` + * `months`、`month`、`M`(定义为 30.44 天) + * `years`、`year`、`y`(定义为 365.25 天) + +所有 `/usr/lib/systemd/system` 中的定时器都指定了一个更宽松的时间精度,因为精准时间没那么重要。看看这些系统创建的定时器的时间格式: + +``` +[root@testvm1 system]# grep Accur /usr/lib/systemd/system/*timer +/usr/lib/systemd/system/fstrim.timer:AccuracySec=1h +/usr/lib/systemd/system/logrotate.timer:AccuracySec=1h +/usr/lib/systemd/system/logwatch.timer:AccuracySec=12h +/usr/lib/systemd/system/mlocate-updatedb.timer:AccuracySec=24h +/usr/lib/systemd/system/raid-check.timer:AccuracySec=24h +/usr/lib/systemd/system/unbound-anchor.timer:AccuracySec=24h +[root@testvm1 system]# +``` + +看下 `/usr/lib/systemd/system` 目录下部分定时器单元文件的完整内容,看看它们是如何构建的。 + +在本实验中不必让这个定时器在启动时激活,但下面这个命令可以设置开机自启: + +``` +[root@testvm1 system]# systemctl enable myMonitor.timer +``` + +你创建的单元文件不需要是可执行的。你同样不需要启用服务,因为它是被定时器触发的。如果你需要的话,你仍然可以在命令行里手动触发该服务单元。尝试一下,然后观察日志。 + +关于定时器精度、事件时间规格和触发事件的详细信息,请参见 systemd.timer 和 systemd.time 的手册页。 + +### 定时器类型 + +systemd 定时器还有一些在 cron 中找不到的功能,cron 只在确定的、重复的、具体的日期和时间触发。systemd 定时器可以被配置成根据其他 systemd 单元状态发生改变时触发。举个例子,定时器可以配置成在系统开机、启动后,或是某个确定的服务单元激活之后的一段时间被触发。这些被称为单调计时器。“单调”指的是一个持续增长的计数器或序列。这些定时器不是持久的,因为它们在每次启动后都会重置。 + +表格 1 列出了一些单调定时器以及每个定时器的简短定义,同时有 `OnCalendar` 定时器,这些不是单调的,它们被用于指定未来有可能重复的某个确定时间。这个信息来自于 `systemd.timer` 的手册页,有一些不重要的修改。 + +定时器 | 单调性 | 定义 +---|---|--- +`OnActiveSec=` | X | 定义了一个与定时器被激活的那一刻相关的定时器。 +`OnBootSec=` | X | 定义了一个与机器启动时间相关的计时器。 +`OnStartupSec=` | X | 定义了一个与服务管理器首次启动相关的计时器。对于系统定时器来说,这个定时器与 `OnBootSec=` 类似,因为系统服务管理器在机器启动后很短的时间后就会启动。当以在每个用户服务管理器中运行的单元进行配置时,它尤其有用,因为用户的服务管理器通常在首次登录后启动,而不是机器启动后。 +`OnUnitActiveSec=` | X | 定义了一个与将要激活的定时器上次激活时间相关的定时器。 +`OnUnitInactiveSec=` | X | 定义了一个与将要激活的定时器上次停用时间相关的定时器。 +`OnCalendar=` | | 定义了一个有日期事件表达式语法的实时(即时钟)定时器。查看 `systemd.time(7)` 的手册页获取更多与日历事件表达式相关的语法信息。除此以外,它的语义和 `OnActiveSec=` 类似。 + +_Table 1: systemd 定时器定义_ + +单调计时器可使用同样的简写名作为它们的时间跨度,即我们之前提到的 `AccuracySec` 表达式,但是 systemd 将这些名字统一转换成了秒。举个例子,比如你想规定某个定时器在系统启动后五天触发一次事件;它可能看起来像 `OnBootSec=5d`。如果机器启动于 `2020-06-15 09:45:27`,这个定时器会在 `2020-06-20 09:45:27` 或在这之后的一分钟内触发。 + +### 日历事件格式 + +日历事件格式是定时器在所需的重复时间触发的关键。我们开始看下一些 `OnCalendar` 设置一起使用的格式。 + +与 crontab 中的格式相比,systemd 及其计时器使用的时间和日历格式风格不同。它比 crontab 更为灵活,而且可以使用类似 `at` 命令的方式允许模糊的日期和时间。它还应该足够熟悉使其易于理解。 + +systemd 定时器使用 `OnCalendar=` 的基础格式是 `DOW YYYY-MM-DD HH:MM:SS`。DOW(星期几)是选填的,其他字段可以用一个星号(`*`)来匹配此位置的任意值。所有的日历时间格式会被转换成标准格式。如果时间没有指定,它会被设置为 `00:00:00`。如果日期没有指定但是时间指定了,那么下次匹配的时间可能是今天或者明天,取决于当前的时间。月份和星期可以使用名称或数字。每个单元都可以使用逗号分隔的列表。单元范围可以在开始值和结束值之间用 `..` 指定。 + +指定日期有一些有趣的选项,波浪号(`~`)可以指定月份的最后一天或者最后一天之前的某几天。`/` 可以用来指定星期几作为修饰符。 + +这里有几个在 `OnCalendar` 表达式中使用的典型时间格式例子。 + +日期事件格式 | 描述 +---|--- +`DOW YYYY-MM-DD HH:MM:SS` | +`*-*-* 00:15:30` | 每年每月每天的 0 点 15 分 30 秒 +`Weekly` | 每个周一的 00:00:00 +`Mon *-*-* 00:00:00` | 同上 +`Mon` | 同上 +`Wed 2020-*-*` | 2020 年每个周三的 00:00:00 +`Mon..Fri 2021-*-*` | 2021 年的每个工作日(周一到周五)的 00:00:00 +`2022-6,7,8-1,15 01:15:00` | 2022 年 6、7、8 月的 1 到 15 号的 01:15:00 +`Mon *-05~03` | 每年五月份的下个周一同时也是月末的倒数第三天 +`Mon..Fri *-08~04` | 任何年份 8 月末的倒数第四天,同时也须是工作日 +`*-05~03/2` | 五月末的倒数第三天,然后 2 天后再来一次。每年重复一次。注意这个表达式使用了波浪号(`~`)。 +`*-05-03/2` | 五月的第三天,然后每两天重复一次直到 5 月底。注意这个表达式使用了破折号(`-`)。 + +_Table 2: `OnCalendar` 事件时间格式例子_ + + +### 测试日历格式 + +systemd 提供了一个绝佳的工具用于检测和测试定时器中日历时间事件的格式。`systemd-analyze calendar` 工具解析一个时间事件格式,提供标准格式和其他有趣的信息,例如下次“经过”(即匹配)的日期和时间,以及距离下次触发之前大概时间。 + +首先,看看未来没有时间的日(注意 `Next elapse` 和 `UTC` 的时间会根据你当地时区改变): + +``` +[student@studentvm1 ~]$ systemd-analyze calendar 2030-06-17 +  Original form: 2030-06-17                 +Normalized form: 2030-06-17 00:00:00         +    Next elapse: Mon 2030-06-17 00:00:00 EDT +       (in UTC): Mon 2030-06-17 04:00:00 UTC +       From now: 10 years 0 months left     +[root@testvm1 system]# +``` + +现在添加一个时间,在这个例子中,日期和时间是当作无关的部分分开解析的: + +``` +[root@testvm1 system]# systemd-analyze calendar 2030-06-17 15:21:16 +  Original form: 2030-06-17                 +Normalized form: 2030-06-17 00:00:00         +    Next elapse: Mon 2030-06-17 00:00:00 EDT +       (in UTC): Mon 2030-06-17 04:00:00 UTC +       From now: 10 years 0 months left     + +  Original form: 15:21:16                   +Normalized form: *-*-* 15:21:16             +    Next elapse: Mon 2020-06-15 15:21:16 EDT +       (in UTC): Mon 2020-06-15 19:21:16 UTC +       From now: 3h 55min left               +[root@testvm1 system]# +``` + +为了把日期和时间当作一个单元来分析,可以把它们包在引号里。你在定时器单元里 `OnCalendar=` 时间格式中使用的时候记得把引号去掉,否则会报错: + +``` +[root@testvm1 system]# systemd-analyze calendar "2030-06-17 15:21:16" +Normalized form: 2030-06-17 15:21:16         +    Next elapse: Mon 2030-06-17 15:21:16 EDT +       (in UTC): Mon 2030-06-17 19:21:16 UTC +       From now: 10 years 0 months left     +[root@testvm1 system]# +``` + +现在我们测试下 Table2 里的例子。我尤其喜欢最后一个: + +``` +[root@testvm1 system]# systemd-analyze calendar "2022-6,7,8-1,15 01:15:00" +  Original form: 2022-6,7,8-1,15 01:15:00 +Normalized form: 2022-06,07,08-01,15 01:15:00 +    Next elapse: Wed 2022-06-01 01:15:00 EDT +       (in UTC): Wed 2022-06-01 05:15:00 UTC +       From now: 1 years 11 months left +[root@testvm1 system]# +``` + +让我们看一个例子,这个例子里我们列出了时间表达式的五个经过时间。 + +``` +[root@testvm1 ~]# systemd-analyze calendar --iterations=5 "Mon *-05~3" +  Original form: Mon *-05~3                 +Normalized form: Mon *-05~03 00:00:00       +    Next elapse: Mon 2023-05-29 00:00:00 EDT +       (in UTC): Mon 2023-05-29 04:00:00 UTC +       From now: 2 years 11 months left     +       Iter. #2: Mon 2028-05-29 00:00:00 EDT +       (in UTC): Mon 2028-05-29 04:00:00 UTC +       From now: 7 years 11 months left     +       Iter. #3: Mon 2034-05-29 00:00:00 EDT +       (in UTC): Mon 2034-05-29 04:00:00 UTC +       From now: 13 years 11 months left     +       Iter. #4: Mon 2045-05-29 00:00:00 EDT +       (in UTC): Mon 2045-05-29 04:00:00 UTC +       From now: 24 years 11 months left     +       Iter. #5: Mon 2051-05-29 00:00:00 EDT +       (in UTC): Mon 2051-05-29 04:00:00 UTC +       From now: 30 years 11 months left     +[root@testvm1 ~]# +``` + +这些应该为你提供了足够的信息去开始测试你的 `OnCalendar` 时间格式。`systemd-analyze` 工具可用于其他有趣的分析,我会在这个系列的下一篇文章来探索这些。 + +### 总结 + +systemd 定时器可以用于执行和 cron 工具相同的任务,但是通过按照日历和单调时间格式去触发事件的方法提供了更多的灵活性。 + +虽然你为此次实验创建的服务单元通常是由定时器调用的,你也可以随时使用 `systemctl start myMonitor.service` 命令去触发它。可以在一个定时器中编写多个维护任务的脚本;它们可以是 Bash 脚本或者其他 Linux 程序。你可以通过触发定时器来运行所有的脚本来运行服务,也可以按照需要执行单独的脚本。 + +我会在下篇文章中更加深入的探索 systemd 时间格式的用处。 + +我还没有看到任何迹象表明 cron 和 at 将被废弃。我希望这种情况不会发生,因为至少 `at` 在执行一次性调度任务的时候要比 systemd 定时器容易的多。 + +### 参考资料 + +网上有大量的关于 systemd 的参考资料,但是大部分都有点简略、晦涩甚至有误导性。除了本文中提到的资料,下列的网页提供了跟多可靠且详细的 systemd 入门信息。 + + * Fedora 项目有一篇切实好用的 [systemd 入门][5],它囊括了几乎所有你需要知道的关于如何使用 systemd 配置、管理和维护 Fedora 计算机的信息。 + * Fedora 项目也有一个不错的 [备忘录][6],交叉引用了过去 SystemV 命令和 systemd 命令做对比。 + * 关于 systemd 的技术细节和创建这个项目的原因,请查看 [Freedesktop.org][7] 上的 [systemd 描述][8]。 + * [Linux.com][9] 的“更多 systemd 的乐趣”栏目提供了更多高级的 systemd [信息和技巧][10]。 + +此外,还有一系列深度的技术文章,是由 systemd 的设计者和主要实现者 Lennart Poettering 为 Linux 系统管理员撰写的。这些文章写于 2010 年 4 月至 2011 年 9 月间,但它们现在和当时一样具有现实意义。关于 systemd 及其生态的许多其他好文章都是基于这些文章: + + * [Rethinking PID 1][11] + * [systemd for Administrators,Part I][12] + * [systemd for Administrators,Part II][13] + * [systemd for Administrators,Part III][14] + * [systemd for Administrators,Part IV][15] + * [systemd for Administrators,Part V][16] + * [systemd for Administrators,Part VI][17] + * [systemd for Administrators,Part VII][18] + * [systemd for Administrators,Part VIII][19] + * [systemd for Administrators,Part IX][20] + * [systemd for Administrators,Part X][21] + * [systemd for Administrators,Part XI][22] + +-------------------------------------------------------------------------------- + +via: https://opensource.com/article/20/7/systemd-timers + +作者:[David Both][a] +选题:[lujun9972][b] +译者:[tt67wq](https://github.com/tt67wq) +校对:[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/checklist_todo_clock_time_team.png?itok=1z528Q0y (Team checklist) +[2]: https://opensource.com/article/17/11/how-use-cron-linux +[3]: https://opensource.com/users/dboth +[4]: https://opensource.com/article/20/5/manage-startup-systemd +[5]: https://docs.fedoraproject.org/en-US/quick-docs/understanding-and-administering-systemd/index.html +[6]: https://fedoraproject.org/wiki/SysVinit_to_Systemd_Cheatsheet +[7]: http://Freedesktop.org +[8]: http://www.freedesktop.org/wiki/Software/systemd +[9]: http://Linux.com +[10]: https://www.linux.com/training-tutorials/more-systemd-fun-blame-game-and-stopping-services-prejudice/ +[11]: http://0pointer.de/blog/projects/systemd.html +[12]: http://0pointer.de/blog/projects/systemd-for-admins-1.html +[13]: http://0pointer.de/blog/projects/systemd-for-admins-2.html +[14]: http://0pointer.de/blog/projects/systemd-for-admins-3.html +[15]: http://0pointer.de/blog/projects/systemd-for-admins-4.html +[16]: http://0pointer.de/blog/projects/three-levels-of-off.html +[17]: http://0pointer.de/blog/projects/changing-roots +[18]: http://0pointer.de/blog/projects/blame-game.html +[19]: http://0pointer.de/blog/projects/the-new-configuration-files.html +[20]: http://0pointer.de/blog/projects/on-etc-sysinit.html +[21]: http://0pointer.de/blog/projects/instances.html +[22]: http://0pointer.de/blog/projects/inetd.html diff --git a/published/202104/20201106 11 Linux Distributions You Can Rely on for Your Ancient 32-bit Computer.md b/published/202104/20201106 11 Linux Distributions You Can Rely on for Your Ancient 32-bit Computer.md new file mode 100644 index 0000000000..6ab0eb1e6f --- /dev/null +++ b/published/202104/20201106 11 Linux Distributions You Can Rely on for Your Ancient 32-bit Computer.md @@ -0,0 +1,317 @@ +[#]: collector: (lujun9972) +[#]: translator: (stevenzdg988) +[#]: reviewer: (wxy) +[#]: publisher: (wxy) +[#]: url: (https://linux.cn/article-13326-1.html) +[#]: subject: (11 Linux Distributions You Can Rely on for Your Ancient 32-bit Computer) +[#]: via: (https://itsfoss.com/32-bit-linux-distributions/) +[#]: author: (Ankush Das https://itsfoss.com/author/ankush/) + +14 种可以在古老的 32 位计算机上使用的 Linux 发行版 +====== + +如果你一直关注最新的 [Linux 发行版][1],那么你一定已经注意到,[大多数流行的 Linux 发行版][2] 已经终止了 32 位支持。Arch Linux、Ubuntu、Fedora,每一个都已经放弃了对这种较旧架构的支持。 + +但是,如果你拥有仍然需要再利用的老式硬件,或者想将其用于某些用途,该怎么办?不用担心,你的 32 位系统还有一些选择。 + +在本文中,我试图汇编一些最好的 Linux 发行版,这些发行版将在未来几年继续支持 32 位平台。 + +### 仍提供 32 位支持的最佳 Linux 发行版 + +![][3] + +此列表与 [我们之前的支持旧笔记本电脑的 Linux 发行版列表][4] 略有不同。即使是 64 位计算机,如果是在 2010 年之前发布的,那么也可以认为它们是旧的。这就是为什么其中列出的一些建议包括现在仅支持 64 位版本的发行版的原因。 + +根据我的知识和认知,此处提供的信息是正确的,但是如果你发现有误,请在评论部分让我知道。 + +在继续之前,我认为你知道 [如何检查你拥有的是否是 32 位或 64 位计算机][5]。 + +#### 1、Debian + +![图片来源: mrneilypops / Deviantart][6] + +对于 32 位系统,[Debian][11] 是一个绝佳的选择,因为他们的最新的稳定版本仍然支持它。在撰写本文时,最新的稳定发行版 **Debian 10 “buster”** 提供了 32 位版本,并一直支持到 2024 年。 + +如果你是 Debian 的新手,值得一提的是,你可以在 [官方 Wiki][7] 上获得有关其所有内容的可靠文档。因此,上手应该不是问题。 + +你可以浏览 [可用的安装程序][8] 进行安装。但是,在开始之前,除了 [安装手册][10] 外,我建议你参考 [安装 Debian 之前要记住的事情][9] 列表。 + +最低系统要求: + +- 512 MB 内存 +- 10 GB 磁盘空间 +- 1 GHz 处理器(奔腾 4 或同等水平) + +#### 2、Slax + +![][12] + +如果你只是想快速启动设备以进行一些临时工作,[Slax][13] 是一个令人印象深刻的选择。 + +它基于 Debian,但它通过 USB 设备或 DVD 运行旨在成为一种便携且快速的选项。你可以从他们的网站免费下载 32 位 ISO 文件,或购买预装有 Slax 的可擦写 DVD 或加密的闪存盘。 + +当然,这并不是要取代传统的桌面操作系统。但是,是的,你确实获得了以 Debian 为基础的 32 位支持。 + +最低系统要求: + +- 内存:128MB(离线使用)/ 512MB(用于网页浏览器使用) +- CPU: i686 或更新版本 + +#### 3、AntiX + +![图片来源: Opensourcefeed][14] + +[AntiX][15] 是另一个令人印象深刻的基于 Debian 的发行版。AntiX 是众所周知的无 systemd 发行版,该发行版侧重于性能,是一个轻量级的系统。 + +它完全适合于所有老式的 32 位系统。它只需要低至 256 MB 内存和 2.7 GB 存储空间。不仅易于安装,而且用户体验也是针对新手和有经验的用户的。 + +你应该可以得到基于 Debian 的最新稳定分支的最新版本。 + +最低系统要求: + +- 内存:256 MB 的内存 +- CPU:奔腾 3 系统 +- 磁盘空间:5GB 的驱动器空间 + +#### 4、openSUSE + +![][16] + +[openSUSE][18] 是一个独立的 Linux 发行版,也支持 32 位系统。实际上最新的常规版本(Leap)不提供 32 位镜像,但滚动发行版本(Tumbleweed)确实提供了 32 位镜像。 + +如果你是新手,那将是完全不同的体验。但是,我建议你仔细阅读 [为什么要使用 openSUSE 的原因][17]。 + +它主要面向开发人员和系统管理员,但也可以将其用作普通桌面用户。值得注意的是,openSUSE 不意味在老式硬件上运行,因此必须确保至少有 2 GB 内存、40+ GB 存储空间和双核处理器。 + +最低系统要求: +- 奔腾 4 1.6 GHz 或更高的处理器 +- 1GB 物理内存 +- 5 GB 硬盘 + +#### 5、Emmabuntüs + +![][19] + +[Emmanbuntus][20] 是一个有趣的发行版,旨在通过 32 位支持来延长硬件的使用寿命,以减少原材料的浪费。作为一个团体,他们还参与向学校提供计算机和数字技术的工作。 + +它提供了两个不同的版本,一个基于 Ubuntu,另一个基于 Debian。如果你需要更长久的 32 位支持,则可能要使用 Debian 版本。它可能不是最好的选择,但是它具有许多预配置的软件来简化 Linux 学习体验,并提供 32 位支持,如果你希望在此过程中支持他们的事业,那么这是一个相当不错的选择。 + +最低系统要求: + +- 512MB 内存 +- 硬盘驱动器:2GB +- 奔腾处理器或同等配置 + +#### 6、NixOS + +![Nixos KDE Edition \(图片来源: Distrowatch\)][21] + +[NixOS][23] 是另一个支持 32 位系统的独立 Linux 发行版。它着重于提供一个可靠的系统,其中程序包彼此隔离。 + +这可能不是直接面向普通用户,但它是一个 KDE 支持的可用发行版,具有独特的软件包管理方式。你可以从其官方网站上了解有关其 [功能][22] 的更多信息。 + +最低系统要求: + +- 内存:768 MB +- 8GB 磁盘空间 +- 奔腾 4 或同等水平 + +#### 7、Gentoo Linux + +![][24] + +如果你是经验丰富的 Linux 用户,并且正在寻找 32 位 Linux 发行版,那么 [Gentoo Linux][26] 应该是一个不错的选择。 + +如果需要,你可以使用 Gentoo Linux 的软件包管理器轻松配置、编译和安装内核。不仅限于众所周知的可配置性,你还可以在较旧的硬件上运行而不会出现任何问题。 + +即使你不是经验丰富的用户,也想尝试一下,只需阅读 [安装说明][25],就可以大胆尝试了。 + +最低系统要求: + +- 256MB 内存 +- 奔腾 4 或 AMD 的同类产品 +- 2.5 GB 磁盘空间 + +#### 8、Devuan + +![][27] + +[Devuan][30] 是另一种无 systemd 的发行版。从技术上讲,它是 Debian 的一个分支,只是没有 systemd ,并鼓励 [初始化系统自由][29]。 + +对于普通用户来说,它可能不是一个非常流行的 Linux 发行版,但是如果你想要一个无 systemd 的发行版和 32 位支持,Devuan 应该是一个不错的选择。 + +最低系统要求: + +- 内存:1GB +- CPU:奔腾 1.0GHz + +#### 9、Void Linux + +![][31] + +[Void Linux][33] 是由志愿者独立开发的有趣发行版。它旨在成为一个通用的操作系统,同时提供稳定的滚动发布周期。它以 runit 作为初始化系统替代 systemd,并为你提供了多个 [桌面环境][32] 选择。 + +它具有非常令人印象深刻的最低需求规格,只需 96 MB 的内存配以奔腾 4 或等同的芯片。试试看吧! + +最低系统要求: + +- 96MB 内存 +- 奔腾 4 或相当的 AMD 处理器 + +#### 10、Q4OS + +![][34] + +[Q4OS][37] 是另一个基于 Debian 的发行版,致力于提供极简和快速的桌面用户体验。它也恰好是我们的 [最佳轻量级 Linux 发行版][4] 列表中的一个。它的 32 位版本具有 [Trinity 桌面][35],你可以在 64 位版本上找到 KDE Plasma 支持。 + +与 Void Linux 类似,Q4OS 可以运行在至低 128 MB 的内存和 300 MHz 的 CPU 上,需要 3 GB 的存储空间。对于任何老式硬件来说,它应该绰绰有余。因此,我想说,你绝对应该尝试一下! + +要了解更多信息,你还可以查看 [我们对 Q4OS 的点评][36]。 + +Q4OS 的最低要求: + +- 内存:128MB(Trinity 桌面)/ 1GB(Plasma 桌面) +- CPU:300 MHz(Trinity 桌面)/ 1 GHz(Plasma 桌面) +- 存储空间:5GB(Trinity 桌面)/3GB(Plasma 桌面) + +#### 11、MX Linux + +![][38] + +如果有一个稍微不错的配置(不完全是老式的,而是旧的),对于 32 位系统,我个人推荐 [MX Linux][39]。它也恰好是适合各种类型用户的 [最佳 Linux 发行版][2] 之一。 + +通常,MX Linux 是基于 Debian 的出色的轻量级和可定制的发行版。你可以选择 KDE、XFce 或 Fluxbox(这是他们自己为旧硬件设计的桌面环境)。你可以在他们的官方网站上找到更多关于它的信息,并尝试一下。 + +最低系统要求: + +- 1GB 内存(建议使用 2GB,以便舒适地使用) +- 15GB 的磁盘空间(建议 20GB) + + +#### 12、Linux Mint Debian Edtion + +![][44] + +[基于 Debian 的 Linux Mint][45]?为什么不可以呢? + +你可以得到同样的 Cinnamon 桌面体验,只是不基于 Ubuntu。它和基于 Ubuntu 的 Linux Mint 一样容易使用,一样可靠。 + +不仅仅是基于 Debian,你还可以得到对 64 位和 32 位系统的支持。如果你不想在 32 位系统上使用一个你从未听说过的 Linux 发行版,这应该是一个不错的选择。 + +最低系统要求: + +- 1GB 内存(建议使用 2GB,以便舒适地使用) +- 15GB 的磁盘空间(建议 20GB) + +#### 13、Sparky Linux + +![][46] + +[Sparky Linux][47] 是 [为初学者定制的最好的轻量级 Linux 发行版][4] 之一。它很容易定制,而且资源占用很少。 + +它可以根据你的要求提供不同的版本,但它确实支持 32 位版本。考虑到你想为你的旧电脑买点东西,我建议你看看它的 MinimalGUI 版本,除非你真的需要像 Xfce 或 LXQt 这样成熟的桌面环境。 + +最低系统要求: + +- 内存:512 MB +- CPU:奔腾 4,或 AMD Athlon +- 磁盘空间:2GB(命令行版),10GB(家庭版),20GB(游戏版) + +#### 14、Mageia + +![][48] + +作为 [Mandriva Linux][49] 的分支,[Mageia Linux][50] 是一个由社区推动的 Linux 发行版,支持 32 位系统。 + +通常情况下,你会注意到每年都有一个重大版本。他们的目的是贡献他们的工作,以提供一个自由的操作系统,这也是潜在的安全。对于 32 位系统来说,它可能不是一个流行的选择,但它支持很多桌面环境(如 KDE Plasma、GNOME),如果你需要,你只需要从它的软件库中安装它。 + +你应该可以从他们的官方网站上得到下载桌面环境特定镜像的选项。 + +最低系统要求: + +- 512MB 内存(推荐 2GB) +- 最小安装需 5GB 存储空间(常规安装 20GB) +- CPU:奔腾4,或 AMD Athlon + +### 荣誉提名:Funtoo & Puppy Linux + +[Funtoo][40] 是基于 Gentoo 的由社区开发的 Linux 发行版。它着重于为你提供 Gentoo Linux 的最佳性能以及一些额外的软件包,以使用户获得完整的体验。有趣的是,该开发实际上是由 Gentoo Linux 的创建者 Daniel Robbins 领导的。 + +[Puppy Linux][51] 是一个很小的 Linux 发行版,除了基本的工具,几乎没有捆绑的软件应用。如果其他选择都不行,而你又想要最轻量级的发行版,Puppy Linux 可能是一个选择。 + +当然,如果你不熟悉 Linux,这两个可能都不能提供最好的体验。但是,它们确实支持 32 位系统,并且可以在许多较旧的 Intel/AMD 芯片组上很好地工作。可以在它们的官方网站上探索更多的信息。 + +### 总结 + +我将列表重点放在基于 Debian 的发行版和一些独立发行版上。但是,如果你不介意长期支持条款,而只想获得一个支持 32 位的镜像,也可以尝试使用任何基于 Ubuntu 18.04 的发行版(或任何官方版本)。 + +在撰写本文时,它们只剩下几个月的软件支持。因此,我避免将其作为主要选项提及。但是,如果你喜欢基于 Ubuntu 18.04 的发行版或其它任何版本,可以选择 [LXLE][41]、[Linux Lite][42]、[Zorin Lite 15][43] 及其他官方版本。 + +即使大多数基于 Ubuntu 的现代桌面操作系统都放弃了对 32 位的支持。你仍然有很多选项可以选择。 + +在 32 位系统中更喜欢哪一个?在下面的评论中让我知道你的想法。 + +-------------------------------------------------------------------------------- + +via: https://itsfoss.com/32-bit-linux-distributions/ + +作者:[Ankush Das][a] +选题:[lujun9972][b] +译者:[stevenzdg988](https://github.com/stevenzdg988) +校对:[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/what-is-linux-distribution/ +[2]: https://itsfoss.com/best-linux-distributions/ +[3]: https://i0.wp.com/itsfoss.com/wp-content/uploads/2020/11/32-bit-linux.png?resize=800%2C450&ssl=1 +[4]: https://itsfoss.com/lightweight-linux-beginners/ +[5]: https://itsfoss.com/32-bit-64-bit-ubuntu/ +[6]: https://i0.wp.com/itsfoss.com/wp-content/uploads/2019/08/debian-screenshot.png?resize=800%2C450&ssl=1 +[7]: https://wiki.debian.org/FrontPage +[8]: https://www.debian.org/releases/buster/debian-installer/ +[9]: https://itsfoss.com/before-installing-debian/ +[10]: https://www.debian.org/releases/buster/installmanual +[11]: https://www.debian.org/ +[12]: https://i2.wp.com/itsfoss.com/wp-content/uploads/2020/04/slax-screenshot.jpg?resize=800%2C600&ssl=1 +[13]: https://www.slax.org +[14]: https://i2.wp.com/itsfoss.com/wp-content/uploads/2020/10/antiX-19-1.jpg?resize=800%2C500&ssl=1 +[15]: https://antixlinux.com +[16]: https://i2.wp.com/itsfoss.com/wp-content/uploads/2020/01/opensuse-15-1.png?resize=800%2C500&ssl=1 +[17]: https://itsfoss.com/why-use-opensuse/ +[18]: https://www.opensuse.org/ +[19]: https://i2.wp.com/itsfoss.com/wp-content/uploads/2020/10/Emmabuntus-xfce.png?resize=800%2C500&ssl=1 +[20]: https://emmabuntus.org/ +[21]: https://i1.wp.com/itsfoss.com/wp-content/uploads/2020/10/nixos-kde.jpg?resize=800%2C500&ssl=1 +[22]: https://nixos.org/features.html +[23]: https://nixos.org/ +[24]: https://i1.wp.com/itsfoss.com/wp-content/uploads/2019/08/gentoo-linux.png?resize=800%2C450&ssl=1 +[25]: https://www.gentoo.org/get-started/ +[26]: https://www.gentoo.org +[27]: https://i1.wp.com/itsfoss.com/wp-content/uploads/2020/06/devuan-beowulf.jpg?resize=800%2C600&ssl=1 +[28]: https://itsfoss.com/devuan-3-release/ +[29]: https://www.devuan.org/os/init-freedom +[30]: https://www.devuan.org +[31]: https://i1.wp.com/itsfoss.com/wp-content/uploads/2020/10/void-linux.jpg?resize=800%2C450&ssl=1 +[32]: https://itsfoss.com/best-linux-desktop-environments/ +[33]: https://voidlinux.org/ +[34]: https://i1.wp.com/itsfoss.com/wp-content/uploads/2019/02/q4os8Debonaire.jpg?resize=800%2C500&ssl=1 +[35]: https://en.wikipedia.org/wiki/Trinity_Desktop_Environment +[36]: https://itsfoss.com/q4os-linux-review/ +[37]: https://q4os.org/index.html +[38]: https://i1.wp.com/itsfoss.com/wp-content/uploads/2020/08/mx-linux-19-2-kde.jpg?resize=800%2C452&ssl=1 +[39]: https://mxlinux.org/ +[40]: https://www.funtoo.org/Welcome +[41]: https://www.lxle.net/ +[42]: https://www.linuxliteos.com +[43]: https://zorinos.com/download/15/lite/32/ +[44]: https://i1.wp.com/itsfoss.com/wp-content/uploads/2020/11/cinnamon-debian-edition.jpg?w=800&ssl=1 +[45]: https://www.linuxmint.com/download_lmde.php +[46]: https://i1.wp.com/itsfoss.com/wp-content/uploads/2019/08/sparky-linux.jpg?w=800&ssl=1 +[47]: https://sparkylinux.org/download/stable/ +[48]: https://i0.wp.com/itsfoss.com/wp-content/uploads/2020/11/mageia.jpg?w=800&ssl=1 +[49]: https://en.wikipedia.org/wiki/Mandriva_Linux +[50]: https://www.mageia.org/en/ +[51]: http://puppylinux.com/ \ No newline at end of file diff --git a/published/202104/20201109 Getting started with Stratis encryption.md b/published/202104/20201109 Getting started with Stratis encryption.md new file mode 100644 index 0000000000..6708bdaea5 --- /dev/null +++ b/published/202104/20201109 Getting started with Stratis encryption.md @@ -0,0 +1,201 @@ +[#]: collector: (lujun9972) +[#]: translator: (wxy) +[#]: reviewer: (wxy) +[#]: publisher: (wxy) +[#]: url: (https://linux.cn/article-13311-1.html) +[#]: subject: (Getting started with Stratis encryption) +[#]: via: (https://fedoramagazine.org/getting-started-with-stratis-encryption/) +[#]: author: (briansmith https://fedoramagazine.org/author/briansmith/) + +Stratis 加密入门 +====== + +![](https://img.linux.net.cn/data/attachment/album/202104/19/094919orzaxwl5axiqqfiu.jpg) + +Stratis 在其 [官方网站][2] 上被描述为“_易于使用的 Linux 本地存储管理_”。请看这个 [短视频][3],快速演示基础知识。该视频是在 Red Hat Enterprise Linux 8 系统上录制的。视频中显示的概念也适用于 Fedora 中的 Stratis。 + +Stratis 2.1 版本引入了对加密的支持。继续阅读以了解如何在 Stratis 中开始加密。 + +### 先决条件 + +加密需要 Stratis 2.1 或更高版本。这篇文章中的例子使用的是 Fedora 33 的预发布版本。Stratis 2.1 将用在 Fedora 33 的最终版本中。 + +你还需要至少一个可用的块设备来创建一个加密池。下面的例子是在 KVM 虚拟机上完成的,虚拟磁盘驱动器为 5GB(`/dev/vdb`)。 + +### 在内核密钥环中创建一个密钥 + +Linux 内核密钥环keyring用于存储加密密钥。关于内核密钥环的更多信息,请参考 `keyrings` 手册页(`man keyrings`)。   + +使用 `stratis key set` 命令在内核钥匙圈中设置密钥。你必须指定从哪里读取密钥。要从标准输入中读取密钥,使用 `-capture-key` 选项。要从文件中读取密钥,使用 `-keyfile-path ` 选项。最后一个参数是一个密钥描述。它将稍后你创建加密的 Stratis 池时使用。 + +例如,要创建一个描述为 `pool1key` 的密钥,并从标准输入中读取密钥,可以输入: + +``` +# stratis key set --capture-key pool1key +Enter desired key data followed by the return key: +``` + +该命令提示我们输入密钥数据/密码,然后密钥就创建在内核密钥环中了。 + +要验证密钥是否已被创建,运行 `stratis key list`: + +``` +# stratis key list +Key Description +pool1key +``` + +这将验证是否创建了 `pool1key`。请注意,这些密钥不是持久的。如果主机重启,在访问加密的 Stratis 池之前,需要再次提供密钥(此过程将在后面介绍)。 + +如果你有多个加密池,它们可以有一个单独的密钥,也可以共享同一个密钥。 + +也可以使用以下 `keyctl` 命令查看密钥: + +``` +# keyctl get_persistent @s +318044983 +# keyctl show +Session Keyring + 701701270 --alswrv 0 0 keyring: _ses + 649111286 --alswrv 0 65534 \_ keyring: _uid.0 + 318044983 ---lswrv 0 65534 \_ keyring: _persistent.0 +1051260141 --alswrv 0 0 \_ user: stratis-1-key-pool1key +``` + +### 创建加密的 Stratis 池 + +现在已经为 Stratis 创建了一个密钥,下一步是创建加密的 Stratis 池。加密池只能在创建池时进行。目前不可能对现有的池进行加密。 + +使用 `stratis pool create` 命令创建一个池。添加 `-key-desc` 和你在上一步提供的密钥描述(`pool1key`)。这将向 Stratis 发出信号,池应该使用提供的密钥进行加密。下面的例子是在 `/dev/vdb` 上创建 Stratis 池,并将其命名为 `pool1`。确保在你的系统中指定一个空的/可用的设备。 + +``` +# stratis pool create --key-desc pool1key pool1 /dev/vdb +``` + +你可以使用 `stratis pool list` 命令验证该池是否已经创建: + +``` +# stratis pool list +Name Total Physical Properties +pool1 4.98 GiB / 37.63 MiB / 4.95 GiB ~Ca, Cr +``` + +在上面显示的示例输出中,`~Ca` 表示禁用了缓存(`~` 否定了该属性)。`Cr` 表示启用了加密。请注意,缓存和加密是相互排斥的。这两个功能不能同时启用。 + +接下来,创建一个文件系统。下面的例子演示了创建一个名为 `filesystem1` 的文件系统,将其挂载在 `/filesystem1` 挂载点上,并在新文件系统中创建一个测试文件: + +``` +# stratis filesystem create pool1 filesystem1 +# mkdir /filesystem1 +# mount /stratis/pool1/filesystem1 /filesystem1 +# cd /filesystem1 +# echo "this is a test file" > testfile +``` + +### 重启后访问加密池 + +当重新启动时,你会发现 Stratis 不再显示你的加密池或它的块设备: + +``` +# stratis pool list +Name Total Physical Properties +``` + +``` +# stratis blockdev list +Pool Name Device Node Physical Size Tier +``` + +要访问加密池,首先要用之前使用的相同的密钥描述和密钥数据/口令重新创建密钥: + +``` +# stratis key set --capture-key pool1key +Enter desired key data followed by the return key: +``` + +接下来,运行 `stratis pool unlock` 命令,并验证现在可以看到池和它的块设备: + +``` +# stratis pool unlock +# stratis pool list +Name Total Physical Properties +pool1 4.98 GiB / 583.65 MiB / 4.41 GiB ~Ca, Cr +# stratis blockdev list +Pool Name Device Node Physical Size Tier +pool1 /dev/dm-2 4.98 GiB Data +``` + +接下来,挂载文件系统并验证是否可以访问之前创建的测试文件: + +``` +# mount /stratis/pool1/filesystem1 /filesystem1/ +# cat /filesystem1/testfile +this is a test file +``` + +### 使用 systemd 单元文件在启动时自动解锁 Stratis 池 + +可以在启动时自动解锁 Stratis 池,无需手动干预。但是,必须有一个包含密钥的文件。在某些环境下,将密钥存储在文件中可能会有安全问题。 + +下图所示的 systemd 单元文件提供了一个简单的方法来在启动时解锁 Stratis 池并挂载文件系统。欢迎提供更好的/替代方法的反馈。你可以在文章末尾的评论区提供建议。 + +首先用下面的命令创建你的密钥文件。确保用之前输入的相同的密钥数据/密码来代替`passphrase`。 + +``` +# echo -n passphrase > /root/pool1key +``` + +确保该文件只能由 root 读取: + +``` +# chmod 400 /root/pool1key +# chown root:root /root/pool1key +``` + +在 `/etc/systemd/system/stratis-filesystem1.service` 创建包含以下内容的 systemd 单元文件: + +``` +[Unit] +Description = stratis mount pool1 filesystem1 file system +After = stratisd.service + +[Service] +ExecStartPre=sleep 2 +ExecStartPre=stratis key set --keyfile-path /root/pool1key pool1key +ExecStartPre=stratis pool unlock +ExecStartPre=sleep 3 +ExecStart=mount /stratis/pool1/filesystem1 /filesystem1 +RemainAfterExit=yes + +[Install] +WantedBy = multi-user.target +``` + +接下来,启用服务,使其在启动时运行: + +``` +# systemctl enable stratis-filesystem1.service +``` + +现在重新启动并验证 Stratis 池是否已自动解锁,其文件系统是否已挂载。 + +### 结语 + +在今天的环境中,加密是很多人和组织的必修课。本篇文章演示了如何在 Stratis 2.1 中启用加密功能。 + +-------------------------------------------------------------------------------- + +via: https://fedoramagazine.org/getting-started-with-stratis-encryption/ + +作者:[briansmith][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://fedoramagazine.org/author/briansmith/ +[b]: https://github.com/lujun9972 +[1]: https://fedoramagazine.org/wp-content/uploads/2020/11/stratis-encryption-2-816x345.jpg +[2]: https://stratis-storage.github.io/ +[3]: https://www.youtube.com/watch?v=CJu3kmY-f5o diff --git a/published/202104/20201204 9 Open Source Forum Software That You Can Deploy on Your Linux Servers.md b/published/202104/20201204 9 Open Source Forum Software That You Can Deploy on Your Linux Servers.md new file mode 100644 index 0000000000..74d7263544 --- /dev/null +++ b/published/202104/20201204 9 Open Source Forum Software That You Can Deploy on Your Linux Servers.md @@ -0,0 +1,213 @@ +[#]: collector: (lujun9972) +[#]: translator: (stevenzdg988) +[#]: reviewer: (wxy) +[#]: publisher: (wxy) +[#]: url: (https://linux.cn/article-13329-1.html) +[#]: subject: (9 Open Source Forum Software That You Can Deploy on Your Linux Servers) +[#]: via: (https://itsfoss.com/open-source-forum-software/) +[#]: author: (Ankush Das https://itsfoss.com/author/ankush/) + +11 个可以部署在 Linux 服务器上的开源论坛软件 +====== + +> 是否想要建立社区论坛或客户支持门户站点?以下是一些可以在服务器上部署的最佳开源论坛软件。 + +就像我们的论坛一样,重要的是建立一个让志趣相投的人可以讨论,互动和寻求支持的平台。 + +论坛为用户(或客户)提供了一个空间,让他们可以接触到在互联网上大多数情况下不容易找到的东西。 + +如果你是一家企业,则可以聘请开发人员团队并按照自己的方式建立自己的论坛,但这会增加大量预算。 + +幸运的是,有几个令人印象深刻的开源论坛软件,你只需要将其部署在你的服务器上就万事大吉了!在此过程中,你将节省很多钱,但仍能获得所需的东西。 + +在这里,我列出了可以在 Linux 服务器上安装的最佳开源论坛软件列表。 + +### 建立社区门户的最佳开源论坛软件 + +![][2] + +如果你尚未建立过网站,则在部署论坛之前,可能需要看一下 [某些开源网站创建工具][3]。 + +**注意:** 此列表没有特定的排名顺序。 + +#### 1、Discourse(现代、流行) + +![][4] + +[Discourse][7] 是人们用来部署配置讨论平台的最流行的现代论坛软件。实际上,[It's FOSS 社区][1] 论坛使用了 Discourse 平台。 + +它提供了我所知道的大多数基本功能,包括电子邮件通知、审核工具、样式自定义选项,Slack/WordPress 等第三方集成等等。 + +它的自托管是完全免费的,你也可以在 [GitHub][5] 上找到该项目。如果你要减少将其部署在自托管服务器上的麻烦,可以选择 [Discourse 提供的托管服务][6](肯定会很昂贵)。 + +#### 2、Talkyard(受 Discourse 和 StackOverflow 启发) + +![][8] + +[Talkyard][10] 是完全免费使用的,是一个开源项目。它看起来很像 Discourse,但是如果你深入了解一下,还是有区别的。 + +你可以在这里获得 StackOverflow 的大多数关键功能,以及在论坛平台上期望得到的所有基本功能。它可能不是一个流行的论坛解决方案,但是如果你想要类似于 Discourse 的功能以及一些有趣的功能,那么值得尝试一下。 + +你可以在他们的 [GitHub 页面][9] 中进一步了解它。 + +#### 3、Forem (一种独特的社区平台,正在测试中) + +![](https://i2.wp.com/itsfoss.com/wp-content/uploads/2020/12/dev-community-forem.png?w=800&ssl=1) + +你可能以前没有听说过 [Forem](https://www.forem.com/),但它支持了 [dev.to](https://dev.to/)(这是一个越来越受欢迎的开发者社区网站)。 + +它仍然处于测试阶段,所以你或许不会选择在生产服务器上实验。但是,你可以通过在他们的官方网站上填写一个表格并与他们取得联系,让他们为你托管。 + +尽管没有官方的功能列表来强调所有的东西,但如果我们以 [dev.to](https://dev.to/) 为例,你会得到许多基本的特性和功能,如社区列表、商店、帖子格式化等。你可以在他们的 [公告帖子](https://dev.to/devteam/for-empowering-community-2k6h) 中阅读更多关于它提供的内容,并在 [GitHub](https://github.com/forem/forem) 上探索该项目。 + +#### 4、NodeBB(现代化、功能齐全) + +![][11] + +[NodeBB][14] 是一个基于 [Node.js][12] 的开源论坛软件。它的目标是简单、优雅和快速。首先,它面向有托管计划的组织和企业。但是,你也可以选择自己托管它。 + +你还可以获得实时本地分析功能,以及聊天和通知支持。它还提供一个 API,可以将其与你的现有产品集成。它还支持审核工具和打击垃圾邮件的工具。 + +你可以获得一些开箱即用的第三方集成支持,例如 WordPress、Mailchimp 等。 + +请在他们的 [GitHub 页面][13] 或官方网站上可以进一步了解它。 + +#### 5、Vanilla 论坛(面向企业) + +![][15] + +[Vanilla 论坛][17] 主要是一款以企业为中心的论坛软件,它的基本功能是为你的平台打造品牌,为客户提供问答,还可以对帖子进行投票。 + +用户体验具有现代的外观,并且已被像 EA、Adobe 和其他一些大公司使用。 + +当然,如果你想尝试基于云的 Vanilla 论坛(由专业团队管理)以及对某些高级功能的访问权,可以随时申请演示。无论哪种情况,你都可以选择社区版,该社区版可以免费使用大多数最新功能,但需要自己托管和管理。 + +你可以在他们的官方网站和 [GitHub 页面][16] 上进一步了解它。 + +#### 6、bbPress (来自 WordPress) + +![][20] + +[bbPress][22] 是一个可靠的论坛软件,由 WordPress 的创建者建立。旨在提供一个简单而迅速的论坛体验。 + +用户界面看起来很老旧,但易于使用,它提供了你通常在论坛软件中需要的基本功能。审核工具很好用,易于设置。你可以使用现有的插件扩展功能,并从几个可用的主题中进行选择以调整论坛的外观。 + +如果你只想要一个没有花哨功能的简单论坛平台,bbPress 应该是完美的。你也可以查看他们的 [GitHub 页面][21] 了解更多信息。 + +#### 7、phpBB(经典论坛软件) + +![][23] + +如果你想要传统的论坛设计,只想要基本功能,则 [phpBB][25] 软件是一个不错的选择。当然,你可能无法获得最佳的用户体验或功能,但是作为按传统设计的论坛平台,它是实用的并且非常有效。 + +尤其是,对于习惯使用传统方式的用户而言,这将是一种简单而有效的解决方案。 + +不仅仅是简单,而且在一般的托管供应商那里,它的设置也是非常容易的。在任何共享主机平台上,你都能获得一键式安装功能,因此也不需要太多的技术知识来进行设置。 + +你可以在他们的官方网站或 [GitHub 页面][24] 上找到更多有关它的信息。 + +#### 8、Simple Machines 论坛(另一个经典) + +![][26] + +与 phpBB 类似,[Simple Machines 论坛][27] 是另一种基本(或简单)的论坛。很大程度上你可能无法自定义外观(至少不容易),但是默认外观是干净整洁的,提供了良好的用户体验。 + +就个人而言,相比 php BB 我更喜欢它,但是你可以前往他们的 [官方网站][27] 进行进一步的探索。同样,你可以使用一键安装方法在任何共享托管服务上轻松安装 Simple Machines 论坛。 + +#### 9、FluxBB(古典) + +![][28] + +[FluxBB][30] 是另一个简单、轻量级的开源论坛。与其他的相比,它可能维护的不是非常积极,但是如果你只想部署一个只有很少几个用户的基本论坛,则可以轻松尝试一下。 + +你可以在他们的官方网站和 [GitHub 页面][29] 上找到更多有关它的信息。 + +#### 10、MyBB(不太流行,但值得看看) + +![][31] + +[MyBB][33] 是一款独特的开源论坛软件,它提供多种样式,并包含你需要的基本功能。 + +从插件支持和审核工具开始,你将获得管理大型社区所需的一切。它还支持类似于 Discourse 和同类论坛软件面向个人用户的私人消息传递。 + +它可能不是一个流行的选项,但是它可以满足大多数用例,并且完全免费。你可以在 [GitHub][32] 上得到支持和探索这个项目。 + +#### 11、Flarum(测试版) + +![][34] + +如果你想要更简单和独特的论坛,请看一下 [Flarum][37]。它是一款轻量级的论坛软件,旨在以移动为先,同时提供快速的体验。 + +它支持某些第三方集成,也可以使用扩展来扩展功能。就我个人而言,它看起来很漂亮。我没有机会尝试它,你可以看一下它的 [文档][35],可以肯定它具有论坛所需的所有必要功能的特征。 + +值得注意的是 Flarum 是相当新的,因此仍处于测试阶段。你可能需要先将其部署在测试服务器上测试后,再应用到生产环境。请查看其 [GitHub 页面][36] 了解更多详细信息。 + +#### 补充:Lemmy(更像是 Reddit 的替代品,但也是一个不错的选择) + +![](https://i2.wp.com/itsfoss.com/wp-content/uploads/2020/12/lemmy-forum.png?w=800&ssl=1) + +一个用 [Rust](https://www.rust-lang.org/) 构建的 Reddit 的联盟式论坛的替代品。它的用户界面很简单,有些人可能觉得它不够直观,无法获得有吸引力的论坛体验。 + +其联盟网络仍在构建中,但如果你想要一个类似 Reddit 的社区平台,你可以很容易地将它部署在你的 Linux 服务器上,并制定好管理规则、版主,然后就可以开始了。它支持跨版发帖(参见 Reddit),以及其他基本功能,如标签、投票、用户头像等。 + +你可以通过其 [官方文档](https://lemmy.ml/docs/about.html) 和 [GitHub 页面](https://github.com/LemmyNet/lemmy) 探索更多信息。 + +### 总结 + +大多数开源论坛软件都为基本用例提供了几乎相同的功能。如果你正在寻找特定的功能,则可能需要浏览其文档。 + +就个人而言,我推荐 Discourse。它很流行,外观现代,拥有大量的用户基础。 + +你认为最好的开源论坛软件是什么?我是否错过了你的偏爱?在下面的评论中让我知道。 + +-------------------------------------------------------------------------------- + +via: https://itsfoss.com/open-source-forum-software/ + +作者:[Ankush Das][a] +选题:[lujun9972][b] +译者:[stevenzdg988](https://github.com/stevenzdg988) +校对:[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.community/ +[2]: https://i2.wp.com/itsfoss.com/wp-content/uploads/2020/12/open-source-forum-software.png?resize=800%2C450&ssl=1 +[3]: https://itsfoss.com/open-source-cms/ +[4]: https://i2.wp.com/itsfoss.com/wp-content/uploads/2020/11/itsfoss-community-discourse.jpg?resize=800%2C561&ssl=1 +[5]: https://github.com/discourse/discourse +[6]: https://discourse.org/buy +[7]: https://www.discourse.org/ +[8]: https://i1.wp.com/itsfoss.com/wp-content/uploads/2020/11/talkyard-forum.jpg?resize=800%2C598&ssl=1 +[9]: https://github.com/debiki/talkyard +[10]: https://www.talkyard.io/ +[11]: https://i0.wp.com/itsfoss.com/wp-content/uploads/2020/11/nodebb.jpg?resize=800%2C369&ssl=1 +[12]: https://nodejs.org/en/ +[13]: https://github.com/NodeBB/NodeBB +[14]: https://nodebb.org/ +[15]: https://i0.wp.com/itsfoss.com/wp-content/uploads/2020/11/vanilla-forums.png?resize=800%2C433&ssl=1 +[16]: https://github.com/Vanilla +[17]: https://vanillaforums.com/en/ +[18]: https://i2.wp.com/itsfoss.com/wp-content/uploads/2020/02/open-source-eCommerce.png?fit=800%2C450&ssl=1 +[19]: https://itsfoss.com/open-source-ecommerce/ +[20]: https://i0.wp.com/itsfoss.com/wp-content/uploads/2020/11/bbpress.jpg?resize=800%2C552&ssl=1 +[21]: https://github.com/bbpress +[22]: https://bbpress.org/ +[23]: https://i2.wp.com/itsfoss.com/wp-content/uploads/2020/11/phpBB.png?resize=798%2C600&ssl=1 +[24]: https://github.com/phpbb/phpbb +[25]: https://www.phpbb.com/ +[26]: https://i1.wp.com/itsfoss.com/wp-content/uploads/2020/11/simplemachines.jpg?resize=800%2C343&ssl=1 +[27]: https://www.simplemachines.org/ +[28]: https://i1.wp.com/itsfoss.com/wp-content/uploads/2020/11/FluxBB.jpg?resize=800%2C542&ssl=1 +[29]: https://github.com/fluxbb/fluxbb/ +[30]: https://fluxbb.org/ +[31]: https://i2.wp.com/itsfoss.com/wp-content/uploads/2020/11/mybb-example.png?resize=800%2C461&ssl=1 +[32]: https://github.com/mybb/mybb +[33]: https://mybb.com/ +[34]: https://i1.wp.com/itsfoss.com/wp-content/uploads/2020/11/flarum-screenshot.png?resize=800%2C503&ssl=1 +[35]: https://docs.flarum.org/ +[36]: https://github.com/flarum +[37]: https://flarum.org/ +[38]: https://highoncloud.com/ diff --git a/published/202104/20201209 Program a simple game with Elixir.md b/published/202104/20201209 Program a simple game with Elixir.md new file mode 100644 index 0000000000..4d7f6e6211 --- /dev/null +++ b/published/202104/20201209 Program a simple game with Elixir.md @@ -0,0 +1,134 @@ +[#]: collector: (lujun9972) +[#]: translator: (tt67wq) +[#]: reviewer: (wxy) +[#]: publisher: (wxy) +[#]: url: (https://linux.cn/article-13292-1.html) +[#]: subject: (Program a simple game with Elixir) +[#]: via: (https://opensource.com/article/20/12/elixir) +[#]: author: (Moshe Zadka https://opensource.com/users/moshez) + +使用 Elixir 语言编写一个小游戏 +====== + +> 通过编写“猜数字”游戏来学习 Elixir 编程语言,并将它与一个你熟知的语言做对比。 + +![](https://img.linux.net.cn/data/attachment/album/202104/12/223351t68886wmza1m9jnt.jpg) + +为了更好的学习一门新的编程语言,最好的方法是去关注主流语言的一些共有特征: + + * 变量 + * 表达式 + * 语句 + +这些概念是大多数编程语言的基础。因为这些相似性,只要你通晓了一门编程语言,你可以通过对比差异来熟知另一门编程语言。 + +另外一个学习新编程语言的好方法是开始编写一个简单标准的程序。它可以让你集中精力在语言上而非程序的逻辑本身。在这个系列的文章中,我们使用“猜数字”程序来实现,在这个程序中,计算机会选择一个介于 1 到 100 之间的数字,并要求你来猜测它。程序会循环执行,直到你正确猜出该数字为止。 + +“猜数字”这个程序使用了编程语言的以下概念: + + * 变量 + * 输入 + * 输出 + * 条件判断 + * 循环 + +这是一个学习新编程语言的绝佳实践。 + +### 猜数字的 Elixir 实现 + +[Elixir][2] 是一门被设计用于构建稳定可维护应用的动态类型的函数式编程语言。它与 [Erlang][3] 运行于同一虚拟机之上,吸纳了 Erlang 的众多长处的同时拥有更加简单的语法。 + +你可以编写一个 Elixir 版本的“猜数字”游戏来体验这门语言。 + +这是我的实现方法: + +``` +defmodule Guess do + def guess() do + random = Enum.random(1..100) + IO.puts "Guess a number between 1 and 100" + Guess.guess_loop(random) + end + def guess_loop(num) do + data = IO.read(:stdio, :line) + {guess, _rest} = Integer.parse(data) + cond do + guess < num -> + IO.puts "Too low!" + guess_loop(num) + guess > num -> + IO.puts "Too high!" + guess_loop(num) + true -> + IO.puts "That's right!" + end + end +end + +Guess.guess() +``` + +Elixir 通过列出变量的名称后面跟一个 `=` 号来为了给变量分配一个值。举个例子,表达式 `random = 0` 给 `random` 变量分配一个数值 0。 + +代码以定义一个模块开始。在 Elixir 语言中,只有模块可以包含命名函数。 + +紧随其后的这行代码定义了入口函数 `guess()`,这个函数: + + * 调用 `Enum.random()` 函数来获取一个随机整数 + * 打印游戏提示 + * 调用循环执行的函数 + +剩余的游戏逻辑实现在 `guess_loop()` 函数中。 + +`guess_loop()` 函数利用 [尾递归][4] 来实现循环。Elixir 中有好几种实现循环的方法,尾递归是比较常用的一种方式。`guess_loop()` 函数做的最后一件事就是调用自身。 + +`guess_loop()` 函数的第一行读取用户输入。下一行调用 `parse()` 函数将输入转换成一个整数。 + +`cond` 表达式是 Elixir 版本的多重分支表达式。与其他语言中的 `if/elif` 或者 `if/elsif` 表达式不同,Elixir 对于的首个分支或者最后一个没有分支并没有区别对待。 + +这个 `cond` 表达式有三路分支:猜测的结果可以比随机数大、小或者相等。前两个选项先输出不等式的方向然后递归调用 `guess_loop()`,循环返回至函数开始。最后一个选项输出 `That's right`,然后这个函数就完成了。 + +### 输出例子 + +现在你已经编写了你的 Elixir 代码,你可以运行它来玩“猜数字”的游戏。每次你执行这个程序,Elixir 会选择一个不同的随机数,你可以一直猜下去直到你找到正确的答案: + +``` +$ elixir guess.exs +Guess a number between 1 and 100 +50 +Too high +30 +Too high +20 +Too high +10 +Too low +15 +Too high +13 +Too low +14 +That's right! +``` + +“猜数字”游戏是一个学习一门新编程语言的绝佳入门程序,因为它用了非常直接的方法实践了常用的几个编程概念。通过用不同语言实现这个简单的小游戏,你可以实践各个语言的核心概念并且比较它们的细节。 + +你是否有你最喜爱的编程语言?你将怎样用它来编写“猜数字”这个游戏?关注这个系列的文章来看看其他你可能感兴趣的语言实现。 + +-------------------------------------------------------------------------------- + +via: https://opensource.com/article/20/12/elixir + +作者:[Moshe Zadka][a] +选题:[lujun9972][b] +译者:[tt67wq](https://github.com/tt67wq) +校对:[wxy](https://github.com/wxy) + +本文由 [LCTT](https://github.com/LCTT/TranslateProject) 原创编译,[Linux中国](https://linux.cn/) 荣誉推出 + +[a]: https://opensource.com/users/moshez +[b]: https://github.com/lujun9972 +[1]: https://opensource.com/sites/default/files/styles/image-full-size/public/lead-images/dice_tabletop_board_gaming_game.jpg?itok=y93eW7HN (A die with rainbow color background) +[2]: https://elixir-lang.org/ +[3]: https://www.erlang.org/ +[4]: https://en.wikipedia.org/wiki/Tail_call diff --git a/published/202104/20210203 Improve your productivity with this Linux automation tool.md b/published/202104/20210203 Improve your productivity with this Linux automation tool.md new file mode 100644 index 0000000000..6ef7efff89 --- /dev/null +++ b/published/202104/20210203 Improve your productivity with this Linux automation tool.md @@ -0,0 +1,177 @@ +[#]: collector: (lujun9972) +[#]: translator: (stevenzdg988) +[#]: reviewer: (wxy) +[#]: publisher: (wxy) +[#]: url: (https://linux.cn/article-13347-1.html) +[#]: subject: (Improve your productivity with this Linux automation tool) +[#]: via: (https://opensource.com/article/21/2/linux-autokey) +[#]: author: (Matt Bargenquast https://opensource.com/users/mbargenquast) + +使用 Linux 自动化工具提高生产率 +====== + +> 用 AutoKey 配置你的键盘,纠正常见的错别字,输入常用的短语等等。 + +![](https://img.linux.net.cn/data/attachment/album/202104/30/111130s7ffji6cmb7rkcfx.jpg) + +[AutoKey][2] 是一个开源的 Linux 桌面自动化工具,一旦它成为你工作流程的一部分,你就会想,如何没有它,那该怎么办。它可以成为一种提高生产率的变革性工具,或者仅仅是减少与打字有关的身体压力的一种方式。 + +本文将研究如何安装和开始使用 AutoKey ,介绍一些可以立即在工作流程中使用的简单方法,并探讨 AutoKey 高级用户可能会感兴趣的一些高级功能。 + +### 安装并设置 AutoKey + +AutoKey 在许多 Linux 发行版中都是现成的软件包。该项目的 [安装指南][3] 包含许多平台的说明,也包括了从源代码进行构建的指导。本文使用 Fedora 作为操作平台。 + +AutoKey 有两个变体:为像 GNOME 等基于 [GTK][4] 环境而设计的 autokey-gtk 和基于 [QT][5] 的 autokey-qt。 + +你可以从命令行安装任一变体: + +``` +sudo dnf install autokey-gtk +``` + +安装完成后,使用 `autokey-gtk`(或 `autokey-qt`)运行它。 + +### 探究界面 + +在将 AutoKey 设置为在后台运行并自动执行操作之前,你首先需要对其进行配置。调出用户界面(UI)配置: + +``` +autokey-gtk -c +``` + +AutoKey 提供了一些预设配置的示例。你可能希望在熟悉 UI 时将他们留作备用,但是可以根据需要删除它们。 + +![AutoKey 用户界面][6] + +左侧窗格包含一个文件夹式的短语和脚本的层次结构。“短语Phrases” 代表要让 AutoKey 输入的文本。“脚本Scripts” 是动态的、程序化的等效项,可以使用 Python 编写,并且获得与键盘击键发送到活动窗口基本相同的结果。 + +右侧窗格构建和配置短语和脚本。 + +对配置满意后,你可能希望在登录时自动运行 AutoKey,这样就不必每次都启动它。你可以通过在 “首选项Preferences”菜单(“编辑 -> 首选项Edit -> Preferences””)中勾选 “登录时自动启动 AutoKeyAutomatically start AutoKey at login”进行配置。 + +![登录时自动启动 AutoKey][8] + +### 使用 AutoKey 纠正常见的打字排版错误 + +修复常见的打字排版错误对于 AutoKey 来说是一个容易解决的问题。例如,我始终键入 “gerp” 来代替 “grep”。这里是如何配置 AutoKey 为你解决这些类型问题。 + +创建一个新的子文件夹,可以在其中将所有“打字排版错误校正”配置分组。在左侧窗格中选择 “My Phrases” ,然后选择 “文件 -> 新建 -> 子文件夹File -> New -> Subfolder”。将子文件夹命名为 “Typos”。 + +在 “文件 -> 新建 -> 短语File -> New -> Phrase” 中创建一个新短语。并将其称为 “grep”。 + +通过高亮选择短语 “grep”,然后在 输入短语内容Enter phrase contents部分(替换默认的 “Enter phrase contents” 文本)中输入 “grep” ,配置 AutoKey 插入正确的关键词。 + +接下来,通过定义缩写来设置 AutoKey 如何触发此短语。点击用户界面底部紧邻 “缩写Abbreviations” 的 “设置Set”按钮。 + +在弹出的对话框中,单击 “添加Add” 按钮,然后将 “gerp” 添加为新的缩写。勾选 “删除键入的缩写Remove typed abbreviation”;此选项让 AutoKey 将任何键入 “gerp” 一词的替换为 “grep”。请不要勾选“在键入单词的一部分时触发Trigger when typed as part of a word”,这样,如果你键入包含 “grep”的单词(例如 “fingerprint”),就不会尝试将其转换为 “fingreprint”。仅当将 “grep” 作为独立的单词键入时,此功能才有效。 + +![在 AutoKey 中设置缩写][9] + +### 限制对特定应用程序的更正 + +你可能希望仅在某些应用程序(例如终端窗口)中打字排版错误时才应用校正。你可以通过设置 窗口过滤器Window Filter进行配置。单击 “设置Set” 按钮来定义。 + +设置窗口过滤器Window Filter的最简单方法是让 AutoKey 为你检测窗口类型: + + 1. 启动一个新的终端窗口。 + 2. 返回 AutoKey,单击 “检测窗口属性Detect Window Properties”按钮。 + 3. 单击终端窗口。 + +这将自动填充窗口过滤器,可能的窗口类值为 `gnome-terminal-server.Gnome-terminal`。这足够了,因此单击 “OK”。 + +![AutoKey 窗口过滤器][10] + +### 保存并测试 + +对新配置满意后,请确保将其保存。 单击 “文件File” ,然后选择 “保存Save” 以使更改生效。 + +现在进行重要的测试!在你的终端窗口中,键入 “gerp” 紧跟一个空格,它将自动更正为 “grep”。要验证窗口过滤器是否正在运行,请尝试在浏览器 URL 栏或其他应用程序中键入单词 “gerp”。它并没有变化。 + +你可能会认为,使用 [shell 别名][11] 可以轻松解决此问题,我完全赞成!与别名不同,只要是面向命令行,无论你使用什么应用程序,AutoKey 都可以按规则纠正错误。 + +例如,我在浏览器,集成开发环境和终端中输入的另一个常见打字错误 “openshfit” 替代为 “openshift”。别名不能完全解决此问题,而 AutoKey 可以在任何情况下纠正它。 + +### 键入常用短语 + +你可以通过许多其他方法来调用 AutoKey 的短语来帮助你。例如,作为从事 OpenShift 的站点可靠性工程师(SRE),我经常在命令行上输入 Kubernetes 命名空间名称: + +``` +oc get pods -n openshift-managed-upgrade-operator +``` + +这些名称空间是静态的,因此它们是键入特定命令时 AutoKey 可以为我插入的理想短语。 + +为此,我创建了一个名为 “Namespaces” 的短语子文件夹,并为我经常键入的每个命名空间添加了一个短语条目。 + +### 分配热键 + +接下来,也是最关键的一点,我为子文件夹分配了一个 “热键hotkey”。每当我按下该热键时,它都会打开一个菜单,我可以在其中选择(要么使用 “方向键”+回车键要么使用数字)要插入的短语。这减少了我仅需几次击键就可以输入这些命令的击键次数。 + +“My Phrases” 文件夹中 AutoKey 的预配置示例使用 `Ctrl+F7` 热键进行配置。如果你将示例保留在 AutoKey 的默认配置中,请尝试一下。你应该在此处看到所有可用短语的菜单。使用数字或箭头键选择所需的项目。 + +### 高级自动键入 + +AutoKey 的 [脚本引擎][12] 允许用户运行可以通过相同的缩写和热键系统调用的 Python 脚本。这些脚本可以通过支持的 API 的函数来完成诸如切换窗口、发送按键或执行鼠标单击之类的操作。 + +AutoKey 用户非常欢迎这项功能,发布了自定义脚本供其他用户采用。例如,[NumpadIME 脚本][13] 将数字键盘转换为旧的手机样式的文本输入方法,[Emojis-AutoKey][14] 可以通过将诸如: `:smile:` 之类的短语转换为它们等价的表情符号来轻松插入。 + +这是我设置的一个小脚本,该脚本进入 Tmux 的复制模式,以将前一行中的第一个单词复制到粘贴缓冲区中: + +``` +from time import sleep + +# 发送 Tmux 命令前缀(b 更改为 s) +keyboard.send_keys("+s") +# Enter copy mode +keyboard.send_key("[") +sleep(0.01) +# Move cursor up one line +keyboard.send_keys("k") +sleep(0.01) +# Move cursor to start of line +keyboard.send_keys("0") +sleep(0.01) +# Start mark +keyboard.send_keys(" ") +sleep(0.01) +# Move cursor to end of word +keyboard.send_keys("e") +sleep(0.01) +# Add to copy buffer +keyboard.send_keys("+m") +``` + +之所以有 `sleep` 函数,是因为 Tmux 有时无法跟上 AutoKey 发送击键的速度,并且它们对整体执行时间的影响可忽略不计。 + +### 使用 AutoKey 自动化 + +我希望你喜欢这篇使用 AutoKey 进行键盘自动化的探索,它为你提供了有关如何改善工作流程的一些好主意。如果你在使用 AutoKey 时有什么有用的或新颖的方法,一定要在下面的评论中分享。 + +-------------------------------------------------------------------------------- + +via: https://opensource.com/article/21/2/linux-autokey + +作者:[Matt Bargenquast][a] +选题:[lujun9972][b] +译者:[stevenzdg988](https://github.com/stevenzdg988) +校对:[wxy](https://github.com/wxy) + +本文由 [LCTT](https://github.com/LCTT/TranslateProject) 原创编译,[Linux中国](https://linux.cn/) 荣誉推出 + +[a]: https://opensource.com/users/mbargenquast +[b]: https://github.com/lujun9972 +[1]: https://opensource.com/sites/default/files/styles/image-full-size/public/lead-images/linux_keyboard_desktop.png?itok=I2nGw78_ (Linux keys on the keyboard for a desktop computer) +[2]: https://github.com/autokey/autokey +[3]: https://github.com/autokey/autokey/wiki/Installing +[4]: https://www.gtk.org/ +[5]: https://www.qt.io/ +[6]: https://opensource.com/sites/default/files/uploads/autokey-defaults.png (AutoKey UI) +[7]: https://creativecommons.org/licenses/by-sa/4.0/ +[8]: https://opensource.com/sites/default/files/uploads/startautokey.png (Automatically start AutoKey at login) +[9]: https://opensource.com/sites/default/files/uploads/autokey-set_abbreviation.png (Set abbreviation in AutoKey) +[10]: https://opensource.com/sites/default/files/uploads/autokey-window_filter.png (AutoKey Window Filter) +[11]: https://opensource.com/article/19/7/bash-aliases +[12]: https://autokey.github.io/index.html +[13]: https://github.com/luziferius/autokey_scripts +[14]: https://github.com/AlienKevin/Emojis-AutoKey diff --git a/published/202104/20210210 How to Add Fingerprint Login in Ubuntu and Other Linux Distributions.md b/published/202104/20210210 How to Add Fingerprint Login in Ubuntu and Other Linux Distributions.md new file mode 100644 index 0000000000..19bf109db5 --- /dev/null +++ b/published/202104/20210210 How to Add Fingerprint Login in Ubuntu and Other Linux Distributions.md @@ -0,0 +1,103 @@ +[#]: collector: (lujun9972) +[#]: translator: (geekpi) +[#]: reviewer: (wxy) +[#]: publisher: (wxy) +[#]: url: (https://linux.cn/article-13337-1.html) +[#]: subject: (How to Add Fingerprint Login in Ubuntu and Other Linux Distributions) +[#]: via: (https://itsfoss.com/fingerprint-login-ubuntu/) +[#]: author: (Abhishek Prakash https://itsfoss.com/author/abhishek/) + +如何在 Ubuntu 中添加指纹登录 +====== + +![](https://img.linux.net.cn/data/attachment/album/202104/26/191530msmenm3ges3kgyet.jpg) + +现在很多高端笔记本都配备了指纹识别器。Windows 和 macOS 支持指纹登录已经有一段时间了。在桌面 Linux 中,对指纹登录的支持更多需要极客的调整,但 [GNOME][1] 和 [KDE][2] 已经开始通过系统设置来支持它。 + +这意味着在新的 Linux 发行版上,你可以轻松使用指纹识别。在这里我将在 Ubuntu 中启用指纹登录,但你也可以在其他运行 GNOME 3.38 的发行版上使用这些步骤。 + +> **前提条件** +> +> 当然,这是显而易见的。你的电脑必须有一个指纹识别器。 +> +> 这个方法适用于任何运行 GNOME 3.38 或更高版本的 Linux 发行版。如果你不确定,你可以[检查你使用的桌面环境版本][3]。 +> +> KDE 5.21 也有一个指纹管理器。当然,截图看起来会有所不同。 + +### 在 Ubuntu 和其他 Linux 发行版中添加指纹登录功能 + +进入 “设置”,然后点击左边栏的 “用户”。你应该可以看到系统中所有的用户账号。你会看到几个选项,包括 “指纹登录”。 + +点击启用这里的指纹登录选项。 + +![Enable fingerprint login in Ubuntu][4] + +它将立即要求你扫描一个新的指纹。当你点击 “+” 号来添加指纹时,它会提供一些预定义的选项,这样你就可以很容易地识别出它是哪根手指或拇指。 + +当然,你可以点击右手食指但扫描左手拇指,不过我看不出你有什么好的理由要这么做。 + +![Adding fingerprint][5] + +在添加指纹时,请按照指示旋转你的手指或拇指。 + +![Rotate your finger][6] + +系统登记了整个手指后,就会给你一个绿色的信号,表示已经添加了指纹。 + +![Fingerprint successfully added][7] + +如果你想马上测试一下,在 Ubuntu 中按 `Super+L` 快捷键锁定屏幕,然后使用指纹进行登录。 + +![Login With Fingerprint in Ubuntu][8] + +#### 在 Ubuntu 上使用指纹登录的经验 + +指纹登录顾名思义就是使用你的指纹来登录系统。就是这样。当要求对需要 `sudo` 访问的程序进行认证时,你不能使用手指。它不能代替你的密码。 + +还有一件事。指纹登录可以让你登录,但当系统要求输入 `sudo` 密码时,你不能用手指。Ubuntu 中的 [钥匙环][9] 也仍然是锁定的。 + +另一件烦人的事情是因为 GNOME 的 GDM 登录界面。当你登录时,你必须先点击你的账户才能进入密码界面。你在这可以使用手指。如果能省去先点击用户帐户 ID 的麻烦就更好了。 + +我还注意到,指纹识别没有 Windows 中那么流畅和快速。不过,它可以使用。 + +如果你对 Linux 上的指纹登录有些失望,你可以禁用它。让我在下一节告诉你步骤。 + +### 禁用指纹登录 + +禁用指纹登录和最初启用指纹登录差不多。 + +进入 “设置→用户”,然后点击指纹登录选项。它会显示一个有添加更多指纹或删除现有指纹的页面。你需要删除现有的指纹。 + +![Disable Fingerprint Login][10] + +指纹登录确实有一些好处,特别是对于我这种懒人来说。我不用每次锁屏时输入密码,我也对这种有限的使用感到满意。 + +用 [PAM][11] 启用指纹解锁 `sudo` 应该不是完全不可能。我记得我 [在 Ubuntu 中设置脸部解锁][12]时,也可以用于 `sudo`。看看以后的版本是否会增加这个功能吧。 + +你有带指纹识别器的笔记本吗?你是否经常使用它,或者它只是你不关心的东西之一? + +-------------------------------------------------------------------------------- + +via: https://itsfoss.com/fingerprint-login-ubuntu/ + +作者:[Abhishek Prakash][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/abhishek/ +[b]: https://github.com/lujun9972 +[1]: https://www.gnome.org/ +[2]: https://kde.org/ +[3]: https://itsfoss.com/find-desktop-environment/ +[4]: https://i0.wp.com/itsfoss.com/wp-content/uploads/2021/02/enable-fingerprint-ubuntu.png?resize=800%2C607&ssl=1 +[5]: https://i1.wp.com/itsfoss.com/wp-content/uploads/2021/02/adding-fingerprint-login-ubuntu.png?resize=800%2C496&ssl=1 +[6]: https://i1.wp.com/itsfoss.com/wp-content/uploads/2021/02/adding-fingerprint-ubuntu-linux.png?resize=800%2C603&ssl=1 +[7]: https://i1.wp.com/itsfoss.com/wp-content/uploads/2021/02/fingerprint-added-ubuntu.png?resize=797%2C510&ssl=1 +[8]: https://i1.wp.com/itsfoss.com/wp-content/uploads/2021/02/login-with-fingerprint-ubuntu.jpg?resize=800%2C320&ssl=1 +[9]: https://itsfoss.com/ubuntu-keyring/ +[10]: https://i0.wp.com/itsfoss.com/wp-content/uploads/2021/02/disable-fingerprint-login.png?resize=798%2C524&ssl=1 +[11]: https://tldp.org/HOWTO/User-Authentication-HOWTO/x115.html +[12]: https://itsfoss.com/face-unlock-ubuntu/ diff --git a/published/202104/20210222 5 benefits of choosing Linux.md b/published/202104/20210222 5 benefits of choosing Linux.md new file mode 100644 index 0000000000..df05f65e43 --- /dev/null +++ b/published/202104/20210222 5 benefits of choosing Linux.md @@ -0,0 +1,68 @@ +[#]: collector: (lujun9972) +[#]: translator: (max27149) +[#]: reviewer: (wxy) +[#]: publisher: (wxy) +[#]: url: (https://linux.cn/article-13284-1.html) +[#]: subject: (5 benefits of choosing Linux) +[#]: via: (https://opensource.com/article/21/2/linux-choice) +[#]: author: (Seth Kenlon https://opensource.com/users/seth) + +选择 Linux 的五大好处 +====== + +> Linux 的一大优点是多样化选择,选择激发了用户之间自由分享想法和解决方案。Linux 将如何激发你为这个社区做出贡献呢? + +![](https://img.linux.net.cn/data/attachment/album/202104/10/131305ei6yyuyujui9fkkr.jpg) + +到了 2021 年,人​​们比以往任何时候都更有理由喜欢 Linux。在本系列中,我将分享 21 个使用 Linux 的理由。本文讨论选择 Linux 带来的好处。 + +_选择_ 是 Linux 中被误解最深的特性之一。这种误解从可被选择的 Linux 发行版数量就开始了。Distrowatch.org 报告了数百种可用的和活跃的 Linux 发行版。当然,在这些发行版当中,许多都是业余爱好项目或者针对某些晦涩需求的特别版。因为是开源的,所以实际上,任何人都可以“重新设计”或“重新混搭”现有的 Linux 发行版,赋予一个新名称,提供一个新的默认墙纸,然后称其为自己的作品。尽管这些修改似乎微不足道,但我认为这显示了 Linux 的一些特别之处。 + +### 灵感 + +Linux 似乎一直在启迪着人们,从了解它的那一刻起,到创造出自己的版本。 + +有数十家公司花费数百万美元来从他们自己的产品中获取灵感。商业技术广告试着强硬地说服你,只要你购买某种产品,你就会与所关心的人建立更多的联系,更具创造力、更加充满活力。这些广告用 4k 视频拍摄,焦点柔和,并在欢快振奋的音乐节奏下播放,试图说服人们不仅购买而且还要支持和宣传该公司的产品。 + +当然,Linux 基本没有营销预算,因为 Linux 是个形形色色的大集合,*没有固定实体*。然而,当人们发现它的存在时候,他们似乎就被启发着去构建属于自己的版本。 + +灵感的数量很难量化,但是它显然很有价值,要不然那些公司不会花钱来尝试创造灵感。 + +### 革新 + +灵感,无论给它标价有多难,它都因它的生产创造而有价值。许多 Linux 用户受启发来为各种奇怪问题定制解决方案。我们解决的大多数问题,对于其他大部分人而言,似乎微不足道:也许你使用 [Seeed 微控制器][2] 来监控番茄植株土壤的水分含量;或者你使用脚本来搜索 Python 软件包的索引,因为你总是会忘记每天导入的库的名称;或者设置了自动清理下载文件夹,因为将文件图标拖进回收站这个活儿干太多了。不管你在使用 Linux 的过程中,为自己解决过什么问题,都是这个平台包含的特性之一,你被这个正在运行中的开放的技术所启发,使其更好地服务于你自己。 + +### 开放策略 + +诚然,不论是灵感,还是创新,都不能算 Linux 独有的属性。其他平台也确实让我们激发灵感,我们也以或大或小的方式进行创新。运算能力已在很大程度上拉平了操作系统的竞争领域,你在一个操作系统上可以完成的任何事,在另一个操作系统上或许都能找到对应的方法来完成。 + +但是,许多用户发现,Linux 操作系统保留了坚定的开放策略,当你尝试可能无人想到过的尝试时,Linux 不会阻挡你。这种情况不会也不可能发生在专有的操作系统上,因为无法进入系统层级的某些区域,因为它们本身就是被设计为不开放源码的。有各种独断的封锁。当你完全按照操作系统的期望进行操作时,你不会碰到那些看不见的墙,但是当你心里想着要做一些只对你有意义的事情的时候,你的系统环境可能变得无从适应。 + +### 小小的选择,大大的意义 + +并非所有创新都是大的或重要的,但总的来说,它们带来的变化并不小。如今,数百万用户的那些疯狂想法在 Linux 的各个部分中愈发显现。它们存在于 KDE 或 GNOME 桌面的工作方式中,存在于 [31 种不同的文本编辑器][3] 中 —— 每一种都有人喜爱,存在于不计其数的浏览器插件和多媒体应用程序中,存在于文件系统和扩展属性中,以及数以百万行计的 Linux 内核代码中。而且,如果上述功能中的哪怕仅其中一项,能让你每天额外节省下一小时时间,陪家人、朋友或用在自己的业余爱好上,那么按照定义,套用一句老话就是,“改变生活”。 + +### 在社区中交流 + +开源的重要组成部分之一是共享工作。共享代码是开源软件中显而易见的、普遍流行的事务,但我认为,分享,可不仅仅是在 Gitlab 做一次提交那么简单。当人们彼此分享着自己的奇思妙想,除了获得有用的代码贡献作为回报外,再无其他动机,我们都认为这是一种馈赠。这与你花钱从某公司购买软件时的感觉非常不同,甚至与得到某公司对外分享他们自己生产的开源代码时的感觉也有很大不同。开源的实质是,由全人类创造,服务于全人类。当知识和灵感可以被自由地分享时,人与人之间就建立了连接,这是市场营销活动无法复制的东西,我认为我们都认同这一点。 + +### 选择 + +Linux 并不是唯一拥有很多选择的平台。无论使用哪种操作系统,你都可以找到针对同一问题的多种解决方案,尤其是在深入研究开源软件的时候。但是,Linux 明显的选择水准指示了推动 Linux 前进的因素:诚邀协作。在 Linux 上,有些创造会很快消失,有些会在你家用电脑中保留数年 —— 即便只是执行一些不起眼的自动化任务,然而有一些则非常成功,以至于被其他系统平台借鉴并变得司空见惯。没关系,无论你在 Linux 上创作出什么,都请毫不犹豫地把它加入千奇百怪的选择之中,你永远都不知道它可能会激发到谁的灵感。 + +--- + +via: https://opensource.com/article/21/2/linux-choice + +作者:[Seth Kenlon][a] +选题:[lujun9972][b] +译者:[max27149](https://github.com/max27149) +校对:[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/yearbook-haff-rx-linux-file-lead_0.png?itok=-i0NNfDC (Hand putting a Linux file folder into a drawer) +[2]: https://opensource.com/article/19/12/seeeduino-nano-review +[3]: https://opensource.com/article/21/1/text-editor-roundup diff --git a/published/202104/20210225 How to use the Linux anacron command.md b/published/202104/20210225 How to use the Linux anacron command.md new file mode 100644 index 0000000000..ea7e31d4fe --- /dev/null +++ b/published/202104/20210225 How to use the Linux anacron command.md @@ -0,0 +1,160 @@ +[#]: subject: (How to use the Linux anacron command) +[#]: via: (https://opensource.com/article/21/2/linux-automation) +[#]: author: (Seth Kenlon https://opensource.com/users/seth) +[#]: collector: (lujun9972) +[#]: translator: (wxy) +[#]: reviewer: (wxy) +[#]: publisher: (wxy) +[#]: url: (https://linux.cn/article-13270-1.html) + +如何使用 Linux anacron 命令 +====== + +> 与其手动执行重复性的任务,不如让 Linux 为你做。 + +![](https://img.linux.net.cn/data/attachment/album/202104/06/084133bphrxxeolhoyqr0o.jpg) + +在 2021 年,人们有更多的理由喜欢 Linux。在这个系列中,我将分享使用 Linux 的 21 个不同理由。自动化是使用 Linux 的最佳理由之一。 + +我最喜欢 Linux 的一个原因是它愿意为我做工作。我不想执行重复性的任务,这些任务会占用我的时间,或者容易出错,或者我可能会忘记,我安排 Linux 为我做这些工作。 + +### 为自动化做准备 + +“自动化”这个词既让人望而生畏,又让人心动。我发现用模块化的方式来处理它是有帮助的。 + +#### 1、你想实现什么? + +首先,要知道你想产生什么结果。你是要给图片加水印吗?从杂乱的目录中删除文件?执行重要数据的备份?为自己明确定义任务,这样你就知道自己的目标是什么。如果有什么任务是你发现自己每天都在做的,甚至一天一次以上,那么它可能是自动化的候选者。 + +#### 2、学习你需要的应用 + +将大的任务分解成小的组件,并学习如何手动但以可重复和可预测的方式产生每个结果。在 Linux 上可以做的很多事情都可以用脚本来完成,但重要的是要认识到你当前的局限性。学习如何自动调整几张图片的大小,以便可以方便地通过电子邮件发送,与使用机器学习为你的每周通讯生成精心制作的艺术品之间有天壤之别。有的事你可以在一个下午学会,而另一件事可能要花上几年时间。然而,我们都必须从某个地方开始,所以只要从小做起,并时刻注意改进的方法。 + +#### 3、自动化 + +在 Linux 上使用一个自动化工具来定期实现它。这就是本文介绍的步骤! + +要想自动化一些东西,你需要一个脚本来自动化一个任务。在测试时,最好保持简单,所以本文自动化的任务是在 `/tmp` 目录下创建一个名为 `hello` 的文件。 + +``` +#!/bin/sh + +touch /tmp/hello +``` + +将这个简单的脚本复制并粘贴到一个文本文件中,并将其命名为 `example`。 + +### Cron + +每个安装好的 Linux 系统都会有的内置自动化解决方案就是 cron 系统。Linux 用户往往把 cron 笼统地称为你用来安排任务的方法(通常称为 “cron 作业”),但有多个应用程序可以提供 cron 的功能。最通用的是 [cronie][2];它的优点是,它不会像历史上为系统管理员设计的 cron 应用程序那样,假设你的计算机总是开着。 + +验证你的 Linux 发行版提供的是哪个 cron 系统。如果不是 cronie,你可以从发行版的软件仓库中安装 cronie。如果你的发行版没有 cronie 的软件包,你可以使用旧的 anacron 软件包来代替。`anacron` 命令是包含在 cronie 中的,所以不管你是如何获得它的,你都要确保在你的系统上有 `anacron` 命令,然后再继续。anacron 可能需要管理员 root 权限,这取决于你的设置。 + +``` +$ which anacron +/usr/sbin/anacron +``` + +anacron 的工作是确保你的自动化作业定期执行。为了做到这一点,anacron 会检查找出最后一次运行作业的时间,然后检查你告诉它运行作业的频率。 + +假设你将 anacron 设置为每五天运行一次脚本。每次你打开电脑或从睡眠中唤醒电脑时,anacron都会扫描其日志以确定是否需要运行作业。如果一个作业在五天或更久之前运行,那么 anacron 就会运行该作业。 + +### Cron 作业 + +许多 Linux 系统都捆绑了一些维护工作,让 cron 来执行。我喜欢把我的工作与系统工作分开,所以我在我的主目录中创建了一个目录。具体来说,有一个叫做 `~/.local` 的隐藏文件夹(“local” 的意思是它是为你的用户账户定制的,而不是为你的“全局”计算机系统定制的),所以我创建了子目录 `etc/cron.daily` 来作为 cron 在我的系统上的家目录。你还必须创建一个 spool 目录来跟踪上次运行作业的时间。 + +``` +$ mkdir -p ~/.local/etc/cron.daily ~/.var/spool/anacron +``` + +你可以把任何你想定期运行的脚本放到 `~/.local/etc/cron.daily` 目录中。现在把 `example` 脚本复制到目录中,然后 [用 chmod 命令使其可执行][3]。 + +``` +$ cp example ~/.local/etc/cron.daily +# chmod +x ~/.local/etc/cron.daily/example +``` + +接下来,设置 anacron 来运行位于 `~/.local/etc/cron.daily` 目录下的任何脚本。 + +### anacron + +默认情况下,cron 系统的大部分内容都被认为是系统管理员的领域,因为它通常用于重要的底层任务,如轮换日志文件和更新证书。本文演示的配置是为普通用户设置个人自动化任务而设计的。 + +要配置 anacron 来运行你的 cron 作业,请在 `/.local/etc/anacrontab` 创建一个配置文件: + +``` +SHELL=/bin/sh +PATH=/sbin:/bin:/usr/sbin:/usr/bin +1  0  cron.mine    run-parts /home/tux/.local/etc/cron.daily/ +``` + +这个文件告诉 anacron 每到新的一天(也就是每日),延迟 0 分钟后,就运行(`run-parts`)所有在 `~/.local/etc/cron.daily` 中找到的可执行脚本。有时,会使用几分钟的延迟,这样你的计算机就不会在你登录后就被所有可能的任务冲击。不过这个设置适合测试。 + +`cron.mine` 值是进程的一个任意名称。我称它为 `cron.mine`,但你也可以称它为 `cron.personal` 或 `penguin` 或任何你想要的名字。 + +验证你的 `anacrontab` 文件的语法: + +``` +$ anacron -T -t ~/.local/etc/anacrontab \ + -S /home/tux/.var/spool/anacron +``` + +沉默意味着成功。 + +### 在 .profile 中添加 anacron + +最后,你必须确保 anacron 以你的本地配置运行。因为你是以普通用户而不是 root 用户的身份运行 anacron,所以你必须将它引导到你的本地配置:告诉 anacron 要做什么的 `anacrontab` 文件,以及帮助 anacron 跟踪每一个作业最后一次执行是多少天的 spool 目录: + +``` +anacron -fn -t /home/tux/.local/etc/anacrontab \ + -S /home/tux/.var/spool/anacron +``` + +`-fn` 选项告诉 anacron *忽略* 时间戳,这意味着你强迫它无论如何都要运行你的 cron 作业。这完全是为了测试的目的。 + +### 测试你的 cron 作业 + +现在一切都设置好了,你可以测试作业了。从技术上讲,你可以在不重启的情况下进行测试,但重启是最有意义的,因为这就是设计用来处理中断和不规则的登录会话的。花点时间重启电脑、登录,然后寻找测试文件: + +``` +$ ls /tmp/hello +/tmp/hello +``` + +假设文件存在,那么你的示例脚本已经成功执行。现在你可以从 `~/.profile` 中删除测试选项,留下这个作为你的最终配置。 + +``` +anacron -t /home/tux/.local/etc/anacrontab \ + -S /home/tux/.var/spool/anacron +``` + +### 使用 anacron + +你已经配置好了你的个人自动化基础设施,所以你可以把任何你想让你的计算机替你管理的脚本放到 `~/.local/etc/cron.daily` 目录下,它就会按计划运行。 + +这取决于你希望作业运行的频率。示例脚本是每天执行一次。很明显,这取决于你的计算机在任何一天是否开机和醒着。如果你在周五使用电脑,但把它设置在周末,脚本就不会在周六和周日运行。然而,在周一,脚本会执行,因为 anacron 会知道至少有一天已经过去了。你可以在 `~/.local/etc` 中添加每周、每两周、甚至每月的目录,以安排各种各样的间隔。 + +要添加一个新的时间间隔: + + 1. 在 `~/.local/etc` 中添加一个目录(例如 `cron.weekly`)。 + 2. 在 `~/.local/etc/anacrontab` 中添加一行,以便在新目录下运行脚本。对于每周一次的间隔,其配置如下。`7 0 cron.mine run-parts /home/tux/.local/etc/cron.weekly/`(`0` 的值可以选择一些分钟数,以适当地延迟脚本的启动)。 + 3. 把你的脚本放在 `cron.weekly` 目录下。 + +欢迎来到自动化的生活方式。它不会让人感觉到,但你将会变得更有效率。 + +-------------------------------------------------------------------------------- + +via: https://opensource.com/article/21/2/linux-automation + +作者:[Seth Kenlon][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/seth +[b]: https://github.com/lujun9972 +[1]: https://opensource.com/sites/default/files/styles/image-full-size/public/lead-images/command_line_prompt.png?itok=wbGiJ_yg (Command line prompt) +[2]: https://github.com/cronie-crond/cronie +[3]: https://opensource.com/article/19/8/linux-chmod-command diff --git a/published/202104/20210303 5 signs you might be a Rust programmer.md b/published/202104/20210303 5 signs you might be a Rust programmer.md new file mode 100644 index 0000000000..a2e2de6079 --- /dev/null +++ b/published/202104/20210303 5 signs you might be a Rust programmer.md @@ -0,0 +1,73 @@ +[#]: subject: (5 signs you might be a Rust programmer) +[#]: via: (https://opensource.com/article/21/3/rust-programmer) +[#]: author: (Mike Bursell https://opensource.com/users/mikecamel) +[#]: collector: (lujun9972) +[#]: translator: (wxy) +[#]: reviewer: (wxy) +[#]: publisher: (wxy) +[#]: url: (https://linux.cn/article-13280-1.html) + +你可能是 Rust 程序员的五个迹象 +====== + +> 在我学习 Rust 的过程中,我注意到了 Rust 一族的一些常见行为。 + +![](https://img.linux.net.cn/data/attachment/album/202104/08/233233asbjasbfuiuosiha.jpg) + +我是最近才 [皈依 Rust][2] 的,我大约在是 2020 年 4 月底开始学习的。但是,像许多皈依者一样,我还是一个热情的布道者。说实话,我也不是一个很好的 Rust 人,因为我的编码风格不是很好,我写的也不是特别符合 Rust 习惯。我猜想这一方面是因为我在写大量代码之前还没有没有真正学完 Rust(其中一些代码又困扰了我),另一方面是因为我并不是那么优秀的程序员。 + +但我喜欢 Rust,你也应该喜欢吧。它很友好,比 C 或 C++ 更友好;它为低级系统任务做好了准备,这比 Python 做的更好;而且结构良好,这要超过 Perl;而且,最重要的是,从设计层面开始,它就是完全开源的,这要比 Java 那些语言好得多。 + +尽管我缺乏专业知识,但我注意到了一些我认为是许多 Rust 爱好者和程序员的共同点。如果你对以下五个迹象点头(其中第一个迹象是由最近的一些令人兴奋的新闻引发的),那么你也可能是一个 Rust 程序员。 + +### 1、“基金会”一词会使你兴奋 + +对于 Rust 程序员来说,“基金会”一词将不再与艾萨克·阿西莫夫Isaac Asimov关联在一起,而是与新成立的 [Rust 基金会][3] 关联。微软、华为、谷歌、AWS 和Mozilla 为该基金会提供了董事(大概也提供了大部分初始资金),该基金会将负责该语言的各个方面,“预示着 Rust 成为企业生产级技术的到来”,[根据临时执行董事][4] Ashley Williams 说。(顺便说一句,很高兴看到一位女士领导这样一项重大的行业计划。) + +该基金会似乎致力于维护 Rust 的理念,并确保每个人都有参与的机会。在许多方面,Rust 都是开源项目的典型示例。并不是说它是完美的(无论是语言还是社区),而是因为似乎有足够的爱好者致力于维护高参与度、低门槛的社区方式,我认为这是许多开源项目的核心。我强烈欢迎此举,我认为这只会帮助促进 Rust 在未来数年和数月内的采用和成熟。 + +### 2、你会因为新闻源中提到 Rust 游戏而感到沮丧 + +还有一款和电脑有关的东西,也叫做“Rust”,它是一款“只限多玩家生存类的电子游戏”。它比 Rust 这个语言更新一些(2013 年宣布,2018 年发布),但我曾经在搜索 Rust 相关的内容时,犯了一个错误,用这个名字搜索了游戏。互联网络就是这样的,这意味着我的新闻源现在被这个另类的 Rust 野兽感染了,我现在会从它的影迷和公关人员那里随机得到一些更新消息。这是个低调的烦恼,但我很确定在 Rust(语言)社区中并不是就我一个人这样。我强烈建议,如果你确实想了解更多关于这个计算世界的后起之秀的信息,你可以使用一个提高隐私(我拒绝说 "保护隐私")的 [开源浏览器][5] 来进行研究。 + +### 3、“不安全”这个词会让你感到恐惧。 + +Rust(语言,再次强调)在帮助你做**正确的事情**™方面做得非常好,当然,在内存安全方面,这是 C 和 C++ 内部的主要关注点(不是因为不可能做到,而是因为真的很难持续正确)。Dave Herman 在 2016 年写了一篇文章《[Safety is Rust's fireflower][6]》,讲述了为什么安全是 Rust 语言的一个积极属性。安全性(内存、类型安全)可能并不赏心悦目,但随着你写的 Rust 越多,你就会习惯并感激它,尤其是当你参与任何系统编程时,这也是 Rust 经常擅长的地方。 + +现在,Rust 并不能阻止你做**错误的事情**™,但它确实通过让你使用 `unsafe` 关键字,让你在希望超出安全边界的时候做出一个明智的决定。这不仅对你有好处,因为它(希望)会让你非常、非常仔细地思考你在任何使用它的代码块中放入了什么;它对任何阅读你的代码的人也有好处,这是一个触发词,它能让任何不太清醒的 Rust 人至少可以稍微打起精神,在椅子上坐直,然后想:“嗯,这里发生了什么?我需要特别注意。”如果幸运的话,读你代码的人也许能想到重写它的方法,使它利用到 Rust 的安全特性,或者至少减少提交和发布的不安全代码的数量。 + +### 4、你想知道为什么没有 `?;`、`{:?}` 、`::<>` 这样的表情符号 + +人们喜欢(或讨厌)涡轮鱼(`::<>`),但在 Rust 代码中你经常还会看到其他的语义结构。特别是 `{:?}` (用于字符串格式化)和 `?;`(`?` 是向调用栈传播错误的一种方式,`;` 则是行/块的结束符,所以你经常会看到它们在一起)。它们在 Rust 代码中很常见,你只需边走边学,边走边解析,而且它们也很有用,我有时会想,为什么它们没有被纳入到正常对话中,至少可以作为表情符号。可能还有其他的。你有什么建议? + +### 5、Clippy 是你的朋友(而不是一个动画回形针) + +微软的动画回形针 Clippy 可能是 Office 用户很快就觉得讨厌的“功能”,并成为许多 [模因][7] 的起点。另一方面,`cargo clippy` 是那些 [很棒的 Cargo 命令][8] 之一,应该成为每个 Rust 程序员工具箱的一部分。Clippy 是一个语言整洁器Linter,它可以帮助改进你的代码,使它更干净、更整洁、更易读、更惯用,让你与同事或其他人分享 Rust 代码时,不会感到尴尬。Cargo 可以说是让 “Clippy” 这个名字恢复了声誉,虽然我不会选择给我的孩子起这个名字,但现在每当我在网络上遇到这个词的时候,我不会再有一种不安的感觉。 + +* * * + +这篇文章最初发表在 [Alice, Eve, and Bob] [9]上,经作者许可转载。 + + +-------------------------------------------------------------------------------- + +via: https://opensource.com/article/21/3/rust-programmer + +作者:[Mike Bursell][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/mikecamel +[b]: https://github.com/lujun9972 +[1]: https://opensource.com/sites/default/files/styles/image-full-size/public/lead-images/EDU_OSDC_IntroOS_520x292_FINAL.png?itok=woiZamgj (name tag that says hello my name is open source) +[2]: https://opensource.com/article/20/6/why-rust +[3]: https://foundation.rust-lang.org/ +[4]: https://foundation.rust-lang.org/posts/2021-02-08-hello-world/ +[5]: https://opensource.com/article/19/7/open-source-browsers +[6]: https://www.thefeedbackloop.xyz/safety-is-rusts-fireflower/ +[7]: https://knowyourmeme.com/memes/clippy +[8]: https://opensource.com/article/20/11/commands-rusts-cargo +[9]: https://aliceevebob.com/2021/02/09/5-signs-that-you-may-be-a-rust-programmer/ diff --git a/published/202104/20210308 Cast your Android device with a Raspberry Pi.md b/published/202104/20210308 Cast your Android device with a Raspberry Pi.md new file mode 100644 index 0000000000..b41dd7f427 --- /dev/null +++ b/published/202104/20210308 Cast your Android device with a Raspberry Pi.md @@ -0,0 +1,141 @@ +[#]: subject: (Cast your Android device with a Raspberry Pi) +[#]: via: (https://opensource.com/article/21/3/android-raspberry-pi) +[#]: author: (Sudeshna Sur https://opensource.com/users/sudeshna-sur) +[#]: collector: (lujun9972) +[#]: translator: (ShuyRoy) +[#]: reviewer: (wxy) +[#]: publisher: (wxy) +[#]: url: (https://linux.cn/article-13314-1.html) + +将你的安卓手机屏幕投射到 Linux +====== + +> 使用 Scrcpy 可以把你的手机屏幕变成一个“应用”,与在树莓派或任何其他基于 Linux 的设备上的应用一起运行。 + +![](https://img.linux.net.cn/data/attachment/album/202104/20/162346alpbh85xz26xcb5h.jpg) + +要远离我们日常使用的电子产品是很难的。在熙熙攘攘的现代生活中,我想确保我不会错过手机屏幕上弹出的来自朋友和家人的重要信息。我也很忙,不希望迷失在令人分心的事情中,但是拿起手机并且回复信息往往会使我分心。 + +更糟糕的是,有很多的设备。幸运地是,大多数的设备(从功能强大的笔记本电脑到甚至不起眼的树莓派)都可以运行 Linux。因为它们运行的是 Linux,所以我为一种设置找到的解决方案几乎都适用于其他设备。 + +### 普遍适用 + +我想要一种无论我使用什么屏幕,都能统一我生活中不同来源的数据的方法。 + +我决定通过把手机屏幕复制到电脑上来解决这个问题。本质上,我把手机变成了一个“应用”,可以和我所有的其他程序运行在一起。这有助于我将注意力集中在桌面上,防止我走神,并使我更容易回复紧急通知。 + +听起来有吸引力吗?你也可以这样做。 + +### 设置 Scrcpy + +[Scrcpy][2] 俗称屏幕复制(Screen Copy),是一个开源的屏幕镜像工具,它可以在 Linux、Windows 或者 macOS 上显示和控制安卓设备。安卓设备和计算机之间的通信主要是通过 USB 连接和安卓调试桥Android Debug Bridge(ADB)。它使用 TCP/IP,且不需要 root 权限访问。 + +Scrcpy 的设置和配置非常简单。如果你正在运行 Fedora,你可以从 COPR 仓库安装它: + +``` +$ sudo dnf copr enable zeno/scrcpy +$ sudo dnf install scrcpy -y +``` + +在 Debian 或者 Ubuntu 上: + +``` +$ sudo apt install scrcpy +``` + +你也可以自己编译 Scrcpy。即使是在树莓派上,按照 [Scrcpy 的 GitHub 主页][3] 上的说明来构建也不需要很长时间。 + +### 设置手机 + +Scrcpy 安装好后,你必须启用 USB 调试并授权每个设备(你的树莓派、笔记本电脑或者工作站)为受信任的控制器。 + +打开安卓上的“设置”应用程序。如果“开发者选项”没有被激活,按照安卓的 [说明来解锁它][4]。 + +接下来,启用“USB 调试”。 + +![Enable USB Debugging option][5] + +然后通过 USB 将手机连接到你的树莓派或者笔记本电脑(或者你正在使用的任何设备),如果可以选择的话,将模式设置为 [PTP][7]。如果你的手机不能使用 PTP,将你的手机设置为用于传输文件的模式(而不是,作为一个叠接tethering或者 MIDI 设备)。 + +你的手机可能会提示你授权你的电脑,这是通过它的 RSA 指纹进行识别的。你只需要在你第一次连接的时候操作即可,在之后你的手机会识别并信任你的计算机。 + +使用 `lsusb` 命令确认设置: + +``` +$ lsusb +Bus 007 Device 001: ID 1d6b:0002 Linux Foundation 2.0 root hub +Bus 011 Device 004: ID 046d:c21d Logitech, Inc. F310 Gamepad +Bus 005 Device 005: ID 0951:1666 Kingston Technology DataTraveler G4 +Bus 005 Device 004: ID 05e3:0608 Genesys Logic, Inc. Hub +Bus 004 Device 001: ID 18d1:4ee6 Google Inc. Nexus/Pixel Device (PTP + debug) +Bus 003 Device 001: ID 1d6b:0002 Linux Foundation 2.0 root hub +Bus 002 Device 001: ID 1d6b:0003 Linux Foundation 3.0 root hub +Bus 001 Device 001: ID 1d6b:0002 Linux Foundation 2.0 root hub +``` + +然后执行 `scrcpy` 以默认设置运行。 + +![Scrcpy running on a Raspberry Pi][8] + +性能和响应能力取决于你使用什么设备来控制你的手机。在树莓派派上,一些动画可能会变慢,甚至有时候会响应滞后。Scrcpy 提供了一个简单的解决办法:降低 Scrcpy 显示图像的位速率和分辨率使得你的计算机能够容易显示动画。使用以下命令来实现: + +``` +$ scrcpy --bit-rate 1M --max-size 800 +``` + +尝试不同的值来找到一个适合你的值。为了使键入更方便,在选定一个命令之后,可以考虑 [创建自己的 Bash 别名][9]。 + +### 剪断连线 + +Scrcpy 开始运行后,你甚至可以通过 WiFi 连接你的手机和计算机。Scrcpy 安装过程也会安装 `adb`,它是一个与安卓设备通信的命令。Scrcpy 也可以使用这个命令与你的设备通信,`adb` 可以通过 TCP/IP 连接。 + +![Scrcpy running on a computer][10] + +要尝试的话,请确保你的手机通过 WiFi 连在与你的计算机所使用的相同的无线网络上。依然不要断开你的手机与 USB 的连接! + +接下来,通过手机中的“设置”,选择“关于手机”来获取你手机的 IP 地址。查看“状态”选项来获得你的地址。它通常是 192.168 或者 10 开头。 + +或者,你也可以使用 `adb` 来获得你手机的IP地址: + +``` +$ adb shell ip route | awk '{print $9}' + +To connect to your device over WiFi, you must enable TCP/IP connections. This, you must do through the adb command: +$ adb tcpip 5555 +Now you can disconnect your mobile from USB. +Whenever you want to connect over WiFi, first connect to the mobile with the command adb connect. For instance, assuming my mobile's IP address is 10.1.1.22, the command is: +$ adb connect 10.1.1.22:5555 +``` + +连接好之后,你就可以像往常一样运行 Scrcpy 了。 + +### 远程控制 + +Scrcpy 很容易使用。你可以在终端或者 [一个图形界面应用][11] 中尝试它。 + +你是否在使用其它的屏幕镜像工具?如果有的话,请在评论中告诉我们吧。 + +-------------------------------------------------------------------------------- + +via: https://opensource.com/article/21/3/android-raspberry-pi + +作者:[Sudeshna Sur][a] +选题:[lujun9972][b] +译者:[ShuyRoy](https://github.com/ShuyRoy) +校对:[wxy](https://github.com/wxy) + +本文由 [LCTT](https://github.com/LCTT/TranslateProject) 原创编译,[Linux中国](https://linux.cn/) 荣誉推出 + +[a]: https://opensource.com/users/sudeshna-sur +[b]: https://github.com/lujun9972 +[1]: https://opensource.com/sites/default/files/styles/image-full-size/public/lead-images/idea_innovation_mobile_phone.png?itok=RqVtvxkd (A person looking at a phone) +[2]: https://github.com/Genymobile/scrcpy +[3]: https://github.com/Genymobile/scrcpy/blob/master/BUILD.md +[4]: https://developer.android.com/studio/debug/dev-options +[5]: https://opensource.com/sites/default/files/uploads/usb-debugging.jpg (Enable USB Debugging option) +[6]: https://creativecommons.org/licenses/by-sa/4.0/ +[7]: https://en.wikipedia.org/wiki/Picture_Transfer_Protocol +[8]: https://opensource.com/sites/default/files/uploads/scrcpy-pi.jpg (Scrcpy running on a Raspberry Pi) +[9]: https://opensource.com/article/19/7/bash-aliases +[10]: https://opensource.com/sites/default/files/uploads/ssur-desktop.png (Scrcpy running on a computer) +[11]: https://opensource.com/article/19/9/mirror-android-screen-guiscrcpy diff --git a/published/202104/20210317 My favorite open source project management tools.md b/published/202104/20210317 My favorite open source project management tools.md new file mode 100644 index 0000000000..e52c2a9a92 --- /dev/null +++ b/published/202104/20210317 My favorite open source project management tools.md @@ -0,0 +1,167 @@ +[#]: subject: (My favorite open source project management tools) +[#]: via: (https://opensource.com/article/21/3/open-source-project-management) +[#]: author: (Frank Bergmann https://opensource.com/users/fraber) +[#]: collector: (lujun9972) +[#]: translator: (stevenzdg988) +[#]: reviewer: (wxy) +[#]: publisher: (wxy) +[#]: url: (https://linux.cn/article-13344-1.html) + +我最喜欢的开源项目管理工具 +====== + +> 如果你要管理大型复杂的项目,请尝试利用开源选择替换 MS-Project。 + +![](https://img.linux.net.cn/data/attachment/album/202104/29/145942py6qcc3lz1dyt1s6.jpg) + +诸如建造卫星、开发机器人或推出新产品之类的项目都是昂贵的,涉及不同的提供商,并且包含必须跟踪的硬依赖性。 + +大型项目领域中的项目管理方法非常简单(至少在理论上如此)。你可以创建项目计划并将其拆分为较小的部分,直到你可以合理地将成本、持续时间、资源和依赖性分配给各种活动。一旦项目计划获得负责人的批准,你就可以使用它来跟踪项目的执行情况。在时间轴上绘制项目的所有活动将产生一个称为[甘特图][2]Gantt chart的条形图。 + +甘特图一直被用于 [瀑布项目方法][3],也可以用于敏捷方法。例如,大型项目可能将甘特图用于 Scrum 冲刺,而忽略其他像用户需求这样的细节,从而嵌入敏捷阶段。其他大型项目可能包括多个产品版本(例如,最低可行产品 [MVP]、第二版本、第三版本等)。在这种情况下,上层结构是一种敏捷方法,而每个阶段都计划为甘特图,以处理预算和复杂的依赖关系。 + +### 项目管理工具 + +不夸张地说,有数百种现成的工具使用甘特图管理大型项目,而 MS-Project 可能是最受欢迎的工具。它是微软办公软件家族的一部分,可支持到成千上万的活动,并且有大量的功能,支持几乎所有可以想象到的管理项目进度的方式。对于 MS-Project,有时候你并不知道什么更昂贵:是软件许可证还是该工具的培训课程。 + +另一个缺点是 MS-Project 是一个独立的桌面应用程序,只有一个人可以更新进度表。如果要多个用户进行协作,则需要购买微软 Project 服务器、Web 版的 Project 或 Planner 的许可证。 + +幸运的是,专有工具还有开源的替代品,包括本文中提及的应用程序。所有这些都是开源的,并且包括基于资源和依赖项的分层活动调度的甘特图。ProjectLibre、GanttProject 和 TaskJuggler 都针对单个项目经理的桌面应用程序。ProjeQtOr 和 Redmine 是用于项目团队的 Web 应用程序,而 ]project-open[ 是用于管理整个组织的 Web 应用程序。 + +我根据一个单用户计划和对一个大型项目的跟踪评估了这些工具。我的评估标准包括甘特图编辑器功能、Windows/Linux/macOS 上的可用性、可扩展性、导入/导出和报告。(背景披露:我是 ]project-open[ 的创始人,我在多个开源社区中活跃了很多年。此列表包括我们的产品,因此我的观点可能有偏见,但我尝试着眼于每个产品的最佳功能。) + +### Redmine 4.1.0 + +![Redmine][4] + +[Redmine][6] 是一个基于 Web 的专注于敏捷方法论的项目管理工具。 + +其标准安装包括一个甘特图时间轴视图,但缺少诸如调度、拖放、缩进(缩排和凸排)以及资源分配之类的基本功能。你必须单独编辑任务属性才能更改任务树的结构。 + +Redmine 具有甘特图编辑器插件,但是它们要么已经过时(例如 [Plus Gantt][7]),要么是专有的(例如 [ANKO 甘特图][8])。如果你知道其他开源的甘特图编辑器插件,请在评论中分享它们。 + +Redmine 用 Ruby on Rails 框架编写,可用于 Windows、Linux 和 macOS。其核心部分采用 GPLv2 许可证。 + + * **适合于:** 使用敏捷方法的 IT 团队。 + * **独特卖点:** 这是 OpenProject 和 EasyRedmine 的原始“上游”父项目。 + +### ]project-open[ 5.1 + +![\]project-open\[][9] + +[\]project-open\[][10] 是一个基于 Web 的项目管理系统,从整个组织的角度看类似于企业资源计划enterprise resource planning(ERP)系统。它还可以管理项目档案、预算、发票、销售、人力资源和其他功能领域。有一些不同的变体,如用于管理项目公司的专业服务自动化professional services automation(PSA)、用于管理企业战略项目的项目管理办公室project management office(PMO)和用于管理部门项目的企业项目管理enterprise project management(EPM)。 + +]project-open[ 甘特图编辑器包括按等级划分的任务、依赖关系和基于计划工作和分配资源的调度。它不支持资源日历和非人力资源。]project-open[ 系统非常复杂,其 GUI 可能需要刷新。 + +]project-open[ 是用 TCL 和 JavaScript 编写的,可用于 Windows 和 Linux。 ]project-open[ 核心采用 GPLv2 许可证,并具有适用于大公司的专有扩展。 + + * **适合于:** 需要大量财务项目报告的大中型项目组织。 + * **独特卖点:** ]project-open[ 是一个综合系统,可以运行整个项目公司或部门。 + +### ProjectLibre 1.9.3 + +![ProjectLibre][11] + +在开源世界中,[ProjectLibre][12] 可能是最接近 MS-Project 的产品。它是一个桌面应用程序,支持所有重要的项目计划功能,包括资源日历、基线和成本管理。它还允许你使用 MS-Project 的文件格式导入和导出计划。 + +ProjectLibre 非常适合计划和执行中小型项目。然而,它缺少 MS-Project 中的一些高级功能,并且它的 GUI 并不是最漂亮的。 + +ProjectLibre 用 Java 编写,可用于 Windows、Linux 和macOS,并在开源的通用公共署名许可证Common Public Attribution License(CPAL)下授权。ProjectLibre 团队目前正在开发一个名为 ProjectLibre Cloud 的 Web 产品,并采用专有许可证。 + + * **适合于:** 负责中小型项目的个人项目管理者,或者作为没有完整的 MS-Project 许可证的项目成员的查看器。 + * **独特卖点:** 这是最接近 MS-Project 的开源软件。 + +### GanttProject 2.8.11 + +![GanttProject][13] + +[GanttProject][14] 与 ProjectLibre 类似,它是一个桌面甘特图编辑器,但功能集更为有限。它不支持基线,也不支持非人力资源,并且报告功能比较有限。 + +GanttProject 是一个用 Java 编写的桌面应用程序,可在 GPLv3 许可下用于 Windows、Linux 和 macOS。 + + * **适合于:** 简单的甘特图或学习基于甘特图的项目管理技术。 + * **独特卖点:** 它支持流程评估和审阅技术program evaluation and review technique([PERT][15])图表,并使用 WebDAV 的协作。 + +### TaskJuggler 3.7.1 + +![TaskJuggler][16] + +[TaskJuggler][17] 用于在大型组织中安排多个并行项目,重点是自动解决资源分配冲突(即资源均衡)。 + +它不是交互式的甘特图编辑器,而是一个命令行工具,其工作方式类似于一个编译器:它从文本文件中读取任务列表,并生成一系列报告,这些报告根据分配的资源、依赖项、优先级和许多其他参数为每个任务提供最佳的开始和结束时间。它支持多个项目、基线、资源日历、班次和时区,并且被设计为可扩展到具有许多项目和资源的企业场景。 + +使用特定语法编写 TaskJuggler 输入文件可能超出了普通项目经理的能力。但是,你可以使用 ]project-open[ 作为 TaskJuggler 的图形前端来生成输入,包括缺勤、任务进度和记录的工作时间。当以这种方式使用时,TaskJuggler 就成为了功能强大的假设情景规划器。 + +TaskJuggler 用 Ruby 编写,并且在 GPLv2 许可证下可用于 Windows、Linux 和 macOS。 + + * **适合于:** 由真正的技术极客管理的中大型部门。 + * **独特卖点:** 它在自动资源均衡方面表现出色。 + +### ProjeQtOr 9.0.4 + +![ProjeQtOr][18] + +[ProjeQtOr][19] 是适用于 IT 项目的、基于 Web 的项目管理应用程序。除了项目、工单和活动外,它还支持风险、预算、可交付成果和财务文件,以将项目管理的许多方面集成到单个系统中。 + +ProjeQtOr 提供了一个甘特图编辑器,与 ProjectLibre 功能类似,包括按等级划分的任务、依赖关系以及基于计划工作和分配资源。但是,它不支持取值的就地编辑(例如,任务名称、估计时间等);用户必须在甘特图视图下方的输入表单中更改取值,然后保存。 + +ProjeQtOr 用 PHP 编写,并且在 Affero GPL3 许可下可用于 Windows、Linux 和 macOS。 + + * **适合于:** 跟踪项目列表的 IT 部门。 + * **独特卖点:** 让你为存储每个项目的大量信息,将所有信息保存在一个地方。 + +### 其他工具 + +对于特定的用例,以下系统可能是有效的选择,但由于各种原因,它们被排除在主列表之外。 + +![LIbrePlan][20] + + * [LibrePlan][21] 是一个基于 Web 的项目管理应用程序,专注于甘特图。由于其功能集,它本来会在上面的列表中会占主导地位,但是没有可用于最新 Linux 版本(CentOS 7 或 8)的安装。作者说,更新的说明将很快推出。 + * [dotProject][22] 是一个用 PHP 编写的基于 Web 的项目管理系统,可在 GPLv2.x 许可证下使用。它包含一个甘特图时间轴报告,但是没有编辑它的选项,并且依赖项还不起作用(它们“仅部分起作用”)。 + * [Leantime][23] 是一个基于 Web 的项目管理系统,具有漂亮的用 PHP 编写的 GUI,并且可以在 GPLv2 许可证下使用。它包括一个里程碑的甘特时间线,但没有依赖性。 + * [Orangescrum][24] 是基于 Web 的项目管理工具。甘特图图可以作为付费附件或付费订阅使用。 + * [Talaia/OpenPPM][25] 是一个基于 Web 的项目组合管理系统。但是,版本 4.6.1 仍显示“即将推出:交互式甘特图”。 + * [Odoo][26] 和 [OpenProject][27] 都将某些重要功能限制在付费企业版中。 + +在这篇评论中,目的是包括所有带有甘特图编辑器和依赖调度的开源项目管理系统。如果我错过了一个项目或误导了什么,请在评论中让我知道。 + +-------------------------------------------------------------------------------- + +via: https://opensource.com/article/21/3/open-source-project-management + +作者:[Frank Bergmann][a] +选题:[lujun9972][b] +译者:[stevenzdg988](https://github.com/stevenzdg988) +校对:[wxy](https://github.com/wxy) + +本文由 [LCTT](https://github.com/LCTT/TranslateProject) 原创编译,[Linux中国](https://linux.cn/) 荣誉推出 + +[a]: https://opensource.com/users/fraber +[b]: https://github.com/lujun9972 +[1]: https://opensource.com/sites/default/files/styles/image-full-size/public/lead-images/kanban_trello_organize_teams_520.png?itok=ObNjCpxt (Kanban-style organization action) +[2]: https://en.wikipedia.org/wiki/Gantt_chart +[3]: https://opensource.com/article/20/3/agiles-vs-waterfall +[4]: https://opensource.com/sites/default/files/uploads/redmine.png (Redmine) +[5]: https://creativecommons.org/licenses/by-sa/4.0/ +[6]: https://www.redmine.org/ +[7]: https://redmine.org/plugins/plus_gantt +[8]: https://www.redmine.org/plugins/anko_gantt_chart +[9]: https://opensource.com/sites/default/files/uploads/project-open.png (]project-open[) +[10]: https://www.project-open.com +[11]: https://opensource.com/sites/default/files/uploads/projectlibre.png (ProjectLibre) +[12]: http://www.projectlibre.org +[13]: https://opensource.com/sites/default/files/uploads/ganttproject.png (GanttProject) +[14]: https://www.ganttproject.biz +[15]: https://en.wikipedia.org/wiki/Program_evaluation_and_review_technique +[16]: https://opensource.com/sites/default/files/uploads/taskjuggler.png (TaskJuggler) +[17]: https://taskjuggler.org/ +[18]: https://opensource.com/sites/default/files/uploads/projeqtor.png (ProjeQtOr) +[19]: https://www.projeqtor.org +[20]: https://opensource.com/sites/default/files/uploads/libreplan.png (LIbrePlan) +[21]: https://www.libreplan.dev/ +[22]: https://dotproject.net/ +[23]: https://leantime.io +[24]: https://orangescrum.org/ +[25]: http://en.talaia-openppm.com/ +[26]: https://odoo.com +[27]: http://openproject.org diff --git a/published/202104/20210318 Reverse Engineering a Docker Image.md b/published/202104/20210318 Reverse Engineering a Docker Image.md new file mode 100644 index 0000000000..0afe15981d --- /dev/null +++ b/published/202104/20210318 Reverse Engineering a Docker Image.md @@ -0,0 +1,287 @@ +[#]: subject: (Reverse Engineering a Docker Image) +[#]: via: (https://theartofmachinery.com/2021/03/18/reverse_engineering_a_docker_image.html) +[#]: author: (Simon Arneaud https://theartofmachinery.com) +[#]: collector: (lujun9972) +[#]: translator: (DCOLIVERSUN) +[#]: reviewer: (wxy) +[#]: publisher: (wxy) +[#]: url: (https://linux.cn/article-13258-1.html) + +一次 Docker 镜像的逆向工程 +====== + +![](https://img.linux.net.cn/data/attachment/album/202104/01/215523oajrgjo77irb7nun.jpg) + +这要从一次咨询的失误说起:政府组织 A 让政府组织 B 开发一个 Web 应用程序。政府机构 B 把部分工作外包给某个人。后来,项目的托管和维护被外包给一家私人公司 C。C 公司发现,之前外包的人(已经离开很久了)构建了一个自定义的 Docker 镜像,并将其成为系统构建的依赖项,但这个人没有提交原始的 Dockerfile。C 公司有合同义务管理这个 Docker 镜像,可是他们他们没有源代码。C 公司偶尔叫我进去做各种工作,所以处理一些关于这个神秘 Docker 镜像的事情就成了我的工作。 + +幸运的是,Docker 镜像的格式比想象的透明多了。虽然还需要做一些侦查工作,但只要解剖一个镜像文件,就能发现很多东西。例如,这里有一个 [Prettier 代码格式化][1] 的镜像可供快速浏览。 + +首先,让 Docker 守护进程daemon拉取镜像,然后将镜像提取到文件中: + +``` +docker pull tmknom/prettier:2.0.5 +docker save tmknom/prettier:2.0.5 > prettier.tar +``` + +是的,该文件只是一个典型 tarball 格式的归档文件: + +``` +$ tar xvf prettier.tar +6c37da2ee7de579a0bf5495df32ba3e7807b0a42e2a02779206d165f55f1ba70/ +6c37da2ee7de579a0bf5495df32ba3e7807b0a42e2a02779206d165f55f1ba70/VERSION +6c37da2ee7de579a0bf5495df32ba3e7807b0a42e2a02779206d165f55f1ba70/json +6c37da2ee7de579a0bf5495df32ba3e7807b0a42e2a02779206d165f55f1ba70/layer.tar +88f38be28f05f38dba94ce0c1328ebe2b963b65848ab96594f8172a9c3b0f25b.json +a9cc4ace48cd792ef888ade20810f82f6c24aaf2436f30337a2a712cd054dc97/ +a9cc4ace48cd792ef888ade20810f82f6c24aaf2436f30337a2a712cd054dc97/VERSION +a9cc4ace48cd792ef888ade20810f82f6c24aaf2436f30337a2a712cd054dc97/json +a9cc4ace48cd792ef888ade20810f82f6c24aaf2436f30337a2a712cd054dc97/layer.tar +d4f612de5397f1fc91272cfbad245b89eac8fa4ad9f0fc10a40ffbb54a356cb4/ +d4f612de5397f1fc91272cfbad245b89eac8fa4ad9f0fc10a40ffbb54a356cb4/VERSION +d4f612de5397f1fc91272cfbad245b89eac8fa4ad9f0fc10a40ffbb54a356cb4/json +d4f612de5397f1fc91272cfbad245b89eac8fa4ad9f0fc10a40ffbb54a356cb4/layer.tar +manifest.json +repositories +``` + +如你所见,Docker 在命名时经常使用哈希hash。我们看看 `manifest.json`。它是以难以阅读的压缩 JSON 写的,不过 [JSON 瑞士军刀 jq][2] 可以很好地打印 JSON: + +``` +$ jq . manifest.json +[ + { + "Config": "88f38be28f05f38dba94ce0c1328ebe2b963b65848ab96594f8172a9c3b0f25b.json", + "RepoTags": [ + "tmknom/prettier:2.0.5" + ], + "Layers": [ + "a9cc4ace48cd792ef888ade20810f82f6c24aaf2436f30337a2a712cd054dc97/layer.tar", + "d4f612de5397f1fc91272cfbad245b89eac8fa4ad9f0fc10a40ffbb54a356cb4/layer.tar", + "6c37da2ee7de579a0bf5495df32ba3e7807b0a42e2a02779206d165f55f1ba70/layer.tar" + ] + } +] +``` + +请注意,这三个Layer对应三个以哈希命名的目录。我们以后再看。现在,让我们看看 `Config` 键指向的 JSON 文件。它有点长,所以我只在这里转储第一部分: + +``` +$ jq . 88f38be28f05f38dba94ce0c1328ebe2b963b65848ab96594f8172a9c3b0f25b.json | head -n 20 +{ + "architecture": "amd64", + "config": { + "Hostname": "", + "Domainname": "", + "User": "", + "AttachStdin": false, + "AttachStdout": false, + "AttachStderr": false, + "Tty": false, + "OpenStdin": false, + "StdinOnce": false, + "Env": [ + "PATH=/usr/local/sbin:/usr/local/bin:/usr/sbin:/usr/bin:/sbin:/bin" + ], + "Cmd": [ + "--help" + ], + "ArgsEscaped": true, + "Image": "sha256:93e72874b338c1e0734025e1d8ebe259d4f16265dc2840f88c4c754e1c01ba0a", +``` + +最重要的是 `history` 列表,它列出了镜像中的每一层。Docker 镜像由这些层堆叠而成。Dockerfile 中几乎每条命令都会变成一个层,描述该命令对镜像所做的更改。如果你执行 `RUN script.sh` 命令创建了 `really_big_file`,然后用 `RUN rm really_big_file` 命令删除文件,Docker 镜像实际生成两层:一个包含 `really_big_file`,一个包含 `.wh.really_big_file` 记录来删除它。整个镜像文件大小不变。这就是为什么你会经常看到像 `RUN script.sh && rm really_big_file` 这样的 Dockerfile 命令链接在一起——它保障所有更改都合并到一层中。 + +以下是该 Docker 镜像中记录的所有层。注意,大多数层不改变文件系统镜像,并且 `empty_layer` 标记为 `true`。以下只有三个层是非空的,与我们之前描述的相符。 + +``` +$ jq .history 88f38be28f05f38dba94ce0c1328ebe2b963b65848ab96594f8172a9c3b0f25b.json +[ + { + "created": "2020-04-24T01:05:03.608058404Z", + "created_by": "/bin/sh -c #(nop) ADD file:b91adb67b670d3a6ff9463e48b7def903ed516be66fc4282d22c53e41512be49 in / " + }, + { + "created": "2020-04-24T01:05:03.92860976Z", + "created_by": "/bin/sh -c #(nop) CMD [\"/bin/sh\"]", + "empty_layer": true + }, + { + "created": "2020-04-29T06:34:06.617130538Z", + "created_by": "/bin/sh -c #(nop) ARG BUILD_DATE", + "empty_layer": true + }, + { + "created": "2020-04-29T06:34:07.020521808Z", + "created_by": "/bin/sh -c #(nop) ARG VCS_REF", + "empty_layer": true + }, + { + "created": "2020-04-29T06:34:07.36915054Z", + "created_by": "/bin/sh -c #(nop) ARG VERSION", + "empty_layer": true + }, + { + "created": "2020-04-29T06:34:07.708820086Z", + "created_by": "/bin/sh -c #(nop) ARG REPO_NAME", + "empty_layer": true + }, + { + "created": "2020-04-29T06:34:08.06429638Z", + "created_by": "/bin/sh -c #(nop) LABEL org.label-schema.vendor=tmknom org.label-schema.name=tmknom/prettier org.label-schema.description=Prettier is an opinionated code formatter. org.label-schema.build-date=2020-04-29T06:34:01Z org +.label-schema.version=2.0.5 org.label-schema.vcs-ref=35d2587 org.label-schema.vcs-url=https://github.com/tmknom/prettier org.label-schema.usage=https://github.com/tmknom/prettier/blob/master/README.md#usage org.label-schema.docker.cmd=do +cker run --rm -v $PWD:/work tmknom/prettier --parser=markdown --write '**/*.md' org.label-schema.schema-version=1.0", + "empty_layer": true + }, + { + "created": "2020-04-29T06:34:08.511269907Z", + "created_by": "/bin/sh -c #(nop) ARG NODEJS_VERSION=12.15.0-r1", + "empty_layer": true + }, + { + "created": "2020-04-29T06:34:08.775876657Z", + "created_by": "/bin/sh -c #(nop) ARG PRETTIER_VERSION", + "empty_layer": true + }, + { + "created": "2020-04-29T06:34:26.399622951Z", + "created_by": "|6 BUILD_DATE=2020-04-29T06:34:01Z NODEJS_VERSION=12.15.0-r1 PRETTIER_VERSION=2.0.5 REPO_NAME=tmknom/prettier VCS_REF=35d2587 VERSION=2.0.5 /bin/sh -c set -x && apk add --no-cache nodejs=${NODEJS_VERSION} nodejs-np +m=${NODEJS_VERSION} && npm install -g prettier@${PRETTIER_VERSION} && npm cache clean --force && apk del nodejs-npm" + }, + { + "created": "2020-04-29T06:34:26.764034848Z", + "created_by": "/bin/sh -c #(nop) WORKDIR /work" + }, + { + "created": "2020-04-29T06:34:27.092671047Z", + "created_by": "/bin/sh -c #(nop) ENTRYPOINT [\"/usr/bin/prettier\"]", + "empty_layer": true + }, + { + "created": "2020-04-29T06:34:27.406606712Z", + "created_by": "/bin/sh -c #(nop) CMD [\"--help\"]", + "empty_layer": true + } +] +``` + +太棒了!所有的命令都在 `created_by` 字段中,我们几乎可以用这些命令重建 Dockerfile。但不是完全可以。最上面的 `ADD` 命令实际上没有给我们需要添加的文件。`COPY` 命令也没有全部信息。我们还失去了 `FROM` 语句,因为它们扩展成了从基础 Docker 镜像继承的所有层。 + +我们可以通过查看时间戳timestamp,按 Dockerfile 对层进行分组。大多数层的时间戳相差不到一分钟,代表每一层构建所需的时间。但是前两层是 `2020-04-24`,其余的是 `2020-04-29`。这是因为前两层来自一个基础 Docker 镜像。理想情况下,我们可以找出一个 `FROM` 命令来获得这个镜像,这样我们就有了一个可维护的 Dockerfile。 + +`manifest.json` 展示第一个非空层是 `a9cc4ace48cd792ef888ade20810f82f6c24aaf2436f30337a2a712cd054dc97/layer.tar`。让我们看看它: + +``` +$ cd a9cc4ace48cd792ef888ade20810f82f6c24aaf2436f30337a2a712cd054dc97/ +$ tar tf layer.tf | head +bin/ +bin/arch +bin/ash +bin/base64 +bin/bbconfig +bin/busybox +bin/cat +bin/chgrp +bin/chmod +bin/chown +``` + +看起来它可能是一个操作系统operating system基础镜像,这也是你期望从典型 Dockerfile 中看到的。Tarball 中有 488 个条目,如果你浏览一下,就会发现一些有趣的条目: + +``` +... +dev/ +etc/ +etc/alpine-release +etc/apk/ +etc/apk/arch +etc/apk/keys/ +etc/apk/keys/alpine-devel@lists.alpinelinux.org-4a6a0840.rsa.pub +etc/apk/keys/alpine-devel@lists.alpinelinux.org-5243ef4b.rsa.pub +etc/apk/keys/alpine-devel@lists.alpinelinux.org-5261cecb.rsa.pub +etc/apk/protected_paths.d/ +etc/apk/repositories +etc/apk/world +etc/conf.d/ +... +``` + +果不其然,这是一个 [Alpine][3] 镜像,如果你注意到其他层使用 `apk` 命令安装软件包,你可能已经猜到了。让我们解压 tarball 看看: + +``` +$ mkdir files +$ cd files +$ tar xf ../layer.tar +$ ls +bin dev etc home lib media mnt opt proc root run sbin srv sys tmp usr var +$ cat etc/alpine-release +3.11.6 +``` + +如果你拉取、解压 `alpine:3.11.6`,你会发现里面有一个非空层,`layer.tar` 与 Prettier 镜像基础层中的 `layer.tar` 是一样的。 + +出于兴趣,另外两个非空层是什么?第二层是包含 Prettier 安装包的主层。它有 528 个条目,包含 Prettier、一堆依赖项和证书更新: + +``` +... +usr/lib/libuv.so.1 +usr/lib/libuv.so.1.0.0 +usr/lib/node_modules/ +usr/lib/node_modules/prettier/ +usr/lib/node_modules/prettier/LICENSE +usr/lib/node_modules/prettier/README.md +usr/lib/node_modules/prettier/bin-prettier.js +usr/lib/node_modules/prettier/doc.js +usr/lib/node_modules/prettier/index.js +usr/lib/node_modules/prettier/package.json +usr/lib/node_modules/prettier/parser-angular.js +usr/lib/node_modules/prettier/parser-babel.js +usr/lib/node_modules/prettier/parser-flow.js +usr/lib/node_modules/prettier/parser-glimmer.js +usr/lib/node_modules/prettier/parser-graphql.js +usr/lib/node_modules/prettier/parser-html.js +usr/lib/node_modules/prettier/parser-markdown.js +usr/lib/node_modules/prettier/parser-postcss.js +usr/lib/node_modules/prettier/parser-typescript.js +usr/lib/node_modules/prettier/parser-yaml.js +usr/lib/node_modules/prettier/standalone.js +usr/lib/node_modules/prettier/third-party.js +usr/local/ +usr/local/share/ +usr/local/share/ca-certificates/ +usr/sbin/ +usr/sbin/update-ca-certificates +usr/share/ +usr/share/ca-certificates/ +usr/share/ca-certificates/mozilla/ +usr/share/ca-certificates/mozilla/ACCVRAIZ1.crt +usr/share/ca-certificates/mozilla/AC_RAIZ_FNMT-RCM.crt +usr/share/ca-certificates/mozilla/Actalis_Authentication_Root_CA.crt +... +``` + +第三层由 `WORKDIR /work` 命令创建,它只包含一个条目: + +``` +$ tar tf 6c37da2ee7de579a0bf5495df32ba3e7807b0a42e2a02779206d165f55f1ba70/layer.tar +work/ +``` + +[原始 Dockerfile 在 Prettier 的 git 仓库中][4]。 + +-------------------------------------------------------------------------------- + +via: https://theartofmachinery.com/2021/03/18/reverse_engineering_a_docker_image.html + +作者:[Simon Arneaud][a] +选题:[lujun9972][b] +译者:[DCOLIVERSUN](https://github.com/DCOLIVERSUN) +校对:[wxy](https://github.com/wxy) + +本文由 [LCTT](https://github.com/LCTT/TranslateProject) 原创编译,[Linux中国](https://linux.cn/) 荣誉推出 + +[a]: https://theartofmachinery.com +[b]: https://github.com/lujun9972 +[1]: https://github.com/tmknom/prettier +[2]: https://stedolan.github.io/jq/ +[3]: https://www.alpinelinux.org/ +[4]: https://github.com/tmknom/prettier/blob/35d2587ec052e880d73f73547f1ffc2b11e29597/Dockerfile diff --git a/published/202104/20210324 Read and write files with Bash.md b/published/202104/20210324 Read and write files with Bash.md new file mode 100644 index 0000000000..d4e0e2b79e --- /dev/null +++ b/published/202104/20210324 Read and write files with Bash.md @@ -0,0 +1,192 @@ +[#]: subject: (Read and write files with Bash) +[#]: via: (https://opensource.com/article/21/3/input-output-bash) +[#]: author: (Seth Kenlon https://opensource.com/users/seth) +[#]: collector: (lujun9972) +[#]: translator: (geekpi) +[#]: reviewer: (wxy) +[#]: publisher: (wxy) +[#]: url: (https://linux.cn/article-13259-1.html) + +用 Bash 读写文件 +====== + +> 学习 Bash 读取和写入数据的不同方式,以及何时使用每种方法。 + +![](https://img.linux.net.cn/data/attachment/album/202104/01/223653bc334ac33e5e4pwe.jpg) + +当你使用 Bash 编写脚本时,有时你需要从一个文件中读取数据或向一个文件写入数据。有时文件可能包含配置选项,而另一些时候这个文件是你的用户用你的应用创建的数据。每种语言处理这个任务的方式都有些不同,本文将演示如何使用 Bash 和其他 [POSIX][2] shell 处理数据文件。 + +### 安装 Bash + +如果你在使用 Linux,你可能已经有了 Bash。如果没有,你可以在你的软件仓库里找到它。 + +在 macOS 上,你可以使用默认终端,Bash 或 [Zsh][3],这取决于你运行的 macOS 版本。 + +在 Windows 上,有几种方法可以体验 Bash,包括微软官方支持的 [Windows Subsystem for Linux][4](WSL)。 + +安装 Bash 后,打开你最喜欢的文本编辑器并准备开始。 + +### 使用 Bash 读取文件 + +除了是 [shell][5] 之外,Bash 还是一种脚本语言。有几种方法可以从 Bash 中读取数据。你可以创建一种数据流并解析输出, 或者你可以将数据加载到内存中。这两种方法都是有效的获取信息的方法,但每种方法都有相当具体的用例。 + +#### 在 Bash 中援引文件 + +当你在 Bash 中 “援引source” 一个文件时,你会让 Bash 读取文件的内容,期望它包含有效的数据,Bash 可以将这些数据放入它建立的数据模型中。你不会想要从旧文件中援引数据,但你可以使用这种方法来读取配置文件和函数。 + +(LCTT 译注:在 Bash 中,可以通过 `source` 或 `.` 命令来将一个文件读入,这个行为称为 “sourcing”,英文原意为“一次性(试)采购”、“寻找供应商”、“获得”等,考虑到 Bash 的语境和发音,我建议可以翻译为“援引”,或有不当,供大家讨论参考 —— wxy) + +例如,创建一个名为 `example.sh` 的文件,并输入以下内容: + +``` +#!/bin/sh + +greet opensource.com + +echo "The meaning of life is $var" +``` + +运行这段代码,看见失败了: + +``` +$ bash ./example.sh +./example.sh: line 3: greet: command not found +The meaning of life is +``` + +Bash 没有一个叫 `greet` 的命令,所以无法执行那一行,也没有一个叫 `var` 的变量记录,所以文件没有意义。为了解决这个问题,建立一个名为 `include.sh` 的文件: + +``` +greet() { +    echo "Hello ${1}" +} + +var=42 +``` + +修改你的 `example.sh` 脚本,加入一个 `source` 命令: + +``` +#!/bin/sh + +source include.sh + +greet opensource.com + +echo "The meaning of life is $var" +``` + +运行脚本,可以看到工作了: + +``` +$ bash ./example.sh +Hello opensource.com +The meaning of life is 42 +``` + +`greet` 命令被带入你的 shell 环境,因为它被定义在 `include.sh` 文件中,它甚至可以识别参数(本例中的 `opensource.com`)。变量 `var` 也被设置和导入。 + +#### 在 Bash 中解析文件 + +另一种让数据“进入” Bash 的方法是将其解析为数据流。有很多方法可以做到这一点. 你可以使用 `grep` 或 `cat` 或任何可以获取数据并管道输出到标准输出的命令。另外,你可以使用 Bash 内置的东西:重定向。重定向本身并不是很有用,所以在这个例子中,我也使用内置的 `echo` 命令来打印重定向的结果: + +``` +#!/bin/sh + +echo $( < include.sh ) +``` + +将其保存为 `stream.sh` 并运行它来查看结果: + +``` +$ bash ./stream.sh +greet() { echo "Hello ${1}" } var=42 +$ +``` + +对于 `include.sh` 文件中的每一行,Bash 都会将该行打印(或 `echo`)到你的终端。先用管道把它传送到一个合适的解析器是用 Bash 读取数据的常用方法。例如, 假设 `include.sh` 是一个配置文件, 它的键和值对用一个等号(`=`)分开. 你可以用 `awk` 甚至 `cut` 来获取值: + +``` +#!/bin/sh + +myVar=`grep var include.sh | cut -d'=' -f2` + +echo $myVar +``` + +试着运行这个脚本: + +``` +$ bash ./stream.sh +42 +``` + +### 用 Bash 将数据写入文件 + +无论你是要存储用户用你的应用创建的数据,还是仅仅是关于用户在应用中做了什么的元数据(例如,游戏保存或最近播放的歌曲),都有很多很好的理由来存储数据供以后使用。在 Bash 中,你可以使用常见的 shell 重定向将数据保存到文件中。 + +例如, 要创建一个包含输出的新文件, 使用一个重定向符号: + +``` +#!/bin/sh + +TZ=UTC +date > date.txt +``` + +运行脚本几次: + +``` +$ bash ./date.sh +$ cat date.txt +Tue Feb 23 22:25:06 UTC 2021 +$ bash ./date.sh +$ cat date.txt +Tue Feb 23 22:25:12 UTC 2021 +``` + +要追加数据,使用两个重定向符号: + +``` +#!/bin/sh + +TZ=UTC +date >> date.txt +``` + +运行脚本几次: + +``` +$ bash ./date.sh +$ bash ./date.sh +$ bash ./date.sh +$ cat date.txt +Tue Feb 23 22:25:12 UTC 2021 +Tue Feb 23 22:25:17 UTC 2021 +Tue Feb 23 22:25:19 UTC 2021 +Tue Feb 23 22:25:22 UTC 2021 +``` + +### Bash 轻松编程 + +Bash 的优势在于简单易学,因为只需要一些基本的概念,你就可以构建复杂的程序。完整的文档请参考 GNU.org 上的 [优秀的 Bash 文档][6]。 + +-------------------------------------------------------------------------------- + +via: https://opensource.com/article/21/3/input-output-bash + +作者:[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/bash_command_line.png?itok=k4z94W2U (bash logo on green background) +[2]: https://opensource.com/article/19/7/what-posix-richard-stallman-explains +[3]: https://opensource.com/article/19/9/getting-started-zsh +[4]: https://opensource.com/article/19/7/ways-get-started-linux#wsl +[5]: https://www.redhat.com/sysadmin/terminals-shells-consoles +[6]: http://gnu.org/software/bash diff --git a/published/202104/20210325 Plausible- Privacy-Focused Google Analytics Alternative.md b/published/202104/20210325 Plausible- Privacy-Focused Google Analytics Alternative.md new file mode 100644 index 0000000000..7b97f5144e --- /dev/null +++ b/published/202104/20210325 Plausible- Privacy-Focused Google Analytics Alternative.md @@ -0,0 +1,94 @@ +[#]: subject: (Plausible: Privacy-Focused Google Analytics Alternative) +[#]: via: (https://itsfoss.com/plausible/) +[#]: author: (Abhishek Prakash https://itsfoss.com/author/abhishek/) +[#]: collector: (lujun9972) +[#]: translator: (geekpi) +[#]: reviewer: (wxy) +[#]: publisher: (wxy) +[#]: url: (https://linux.cn/article-13283-1.html) + +Plausible:注重隐私的 Google Analytics 替代方案 +====== + +![](https://img.linux.net.cn/data/attachment/album/202104/10/110720jc8hckngaqr6wch1.jpg) + +[Plausible][1]是一款简单的、对隐私友好的分析工具。它可以帮助你分析独立访客数量、页面浏览量、跳出率和访问时间。 + +如果你有一个网站,你可能会理解这些术语。作为一个网站所有者,它可以帮助你了解你的网站是否随着时间的推移获得更多的访问者,流量来自哪里,如果你对这些事情有一定的了解,你可以努力改进你的网站,以获得更多的访问量。 + +说到网站分析,统治这个领域的一个服务就是谷歌的免费工具 Google Analytics。就像 Google 是事实上的搜索引擎一样,Google Analytics 是事实上的分析工具。但你不必再忍受它,尤其是当你无法信任大科技公司使用你和你的网站访问者的数据的时候。 + +Plausible 让你摆脱 Google Analytics 的束缚,我将在本文中讨论这个开源项目。 + +请注意,如果你从来没有管理过网站或对分析感兴趣,文章中的一些技术术语可能对你来说是陌生的。 + +### Plausible 是隐私友好的网站分析工具 + +Plausible 使用的分析脚本是非常轻量级的,大小不到 1KB。 + +其重点在于保护隐私,因此你可以在不影响访客隐私的情况下获得有价值且可操作的统计数据。Plausible 是为数不多的不需要 cookie 横幅或 GDP 同意的分析工具之一,因为它在隐私方面已经符合 [GDPR 标准][2]。这是超级酷的。 + +在功能上,它没有 Google Analytics 那样的粒度和细节。Plausible 靠的是简单。它显示的是你过去 30 天的流量统计图。你也可以切换到实时视图。 + +![][3] + +你还可以看到你的流量来自哪里,以及你网站上的哪些页面访问量最大。来源也可以显示 UTM 活动。 + +![][4] + +你还可以选择启用 GeoIP 来了解网站访问者的地理位置。你还可以检查有多少访问者使用桌面或移动设备访问你的网站。还有一个操作系统的选项,正如你所看到的,[Linux Handbook][5] 有 48% 的访问者来自 Windows 设备。很奇怪,对吧? + +![][6] + +显然,提供的数据与 Google Analytics 的数据相差甚远,但这是有意为之。Plausible 意图是为你提供简单的模式。 + +### 使用 Plausible:选择付费托管或在你的服务器上自行托管 + +使用 Plausible 有两种方式:注册他们的官方托管服务。你必须为这项服务付费,这最终会帮助 Plausible 项目的发展。它们有 30 天的试用期,甚至不需要你这边提供任何支付信息。 + +定价从每月 1 万页浏览量 6 美元开始。价格会随着页面浏览量的增加而增加。你可以在 Plausible 网站上计算价格。 + +- [Plausible 价格][7] + +你可以试用 30 天,看看你是否愿意向 Plausible 开发者支付服务费用,并拥有你的数据。 + +如果你觉得定价不合理,你可以利用 Plausible 是开源的优势,自己部署。如果你有兴趣,请阅读我们的 [使用 Docker 自助托管 Plausible 实例的深度指南][8]。 + +我们自行托管 Plausible。我们的 Plausible 实例添加了我们的三个网站。 + +![Plausble dashboard for It’s FOSS websites][9] + +如果你维护一个开源项目的网站,并且想使用 Plausible,你可以通过我们的 [High on Cloud 项目][10] 联系我们。通过 High on Cloud,我们帮助小企业在其服务器上托管和使用开源软件。 + +### 总结 + +如果你不是超级痴迷于数据,只是想快速了解网站的表现,Plausible 是一个不错的选择。我喜欢它,因为它是轻量级的,而且遵守隐私。这也是我在 Linux Handbook,我们 [教授 Linux 服务器相关的门户网站][11] 上使用它的主要原因。 + +总的来说,我对 Plausible 相当满意,并向其他网站所有者推荐它。 + +你也经营或管理一个网站吗?你是用什么工具来做分析,还是根本不关心这个? + +-------------------------------------------------------------------------------- + +via: https://itsfoss.com/plausible/ + +作者:[Abhishek Prakash][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/abhishek/ +[b]: https://github.com/lujun9972 +[1]: https://plausible.io/ +[2]: https://gdpr.eu/compliance/ +[3]: https://i1.wp.com/itsfoss.com/wp-content/uploads/2021/03/plausible-graph-lhb.png?resize=800%2C395&ssl=1 +[4]: https://i1.wp.com/itsfoss.com/wp-content/uploads/2021/03/plausible-stats-lhb-2.png?resize=800%2C333&ssl=1 +[5]: https://linuxhandbook.com/ +[6]: https://i0.wp.com/itsfoss.com/wp-content/uploads/2021/03/plausible-geo-ip-stats.png?resize=800%2C331&ssl=1 +[7]: https://plausible.io/#pricing +[8]: https://linuxhandbook.com/plausible-deployment-guide/ +[9]: https://i0.wp.com/itsfoss.com/wp-content/uploads/2021/03/plausible-analytics-for-itsfoss.png?resize=800%2C231&ssl=1 +[10]: https://highoncloud.com/ +[11]: https://linuxhandbook.com/about/#ethical-web-portal diff --git a/published/202104/20210326 How to read and write files in C.md b/published/202104/20210326 How to read and write files in C.md new file mode 100644 index 0000000000..721eda3db0 --- /dev/null +++ b/published/202104/20210326 How to read and write files in C.md @@ -0,0 +1,140 @@ +[#]: subject: (How to read and write files in C++) +[#]: via: (https://opensource.com/article/21/3/ccc-input-output) +[#]: author: (Stephan Avenwedde https://opensource.com/users/hansic99) +[#]: collector: (lujun9972) +[#]: translator: (wyxplus) +[#]: reviewer: (wxy) +[#]: publisher: (wxy) +[#]: url: (https://linux.cn/article-13263-1.html) + +如何用 C++ 读写文件 +====== + +> 如果你知道如何在 C++ 中使用输入输出(I/O)流,那么(原则上)你便能够处理任何类型的输入输出设备。 + +![](https://img.linux.net.cn/data/attachment/album/202104/02/224507a2fq6ofotf4ff4rf.jpg) + +在 C++ 中,对文件的读写可以通过使用输入输出流与流运算符 `>>` 和 `<<` 来进行。当读写文件的时候,这些运算符被应用于代表硬盘驱动器上文件类的实例上。这种基于流的方法有个巨大的优势:从 C++ 的角度,无论你要读取或写入的内容是文件、数据库、控制台,亦或是你通过网络连接的另外一台电脑,这都无关紧要。因此,知道如何使用流运算符来写入文件能够被转用到其他领域。 + +### 输入输出流类 + +C++ 标准库提供了 [ios_base][2] 类。该类作为所有 I/O 流的基类,例如 [basic_ofstream][3] 和 [basic_ifstream][4]。本例将使用读/写字符的专用类型 `ifstream` 和 `ofstream`。 + +- `ofstream`:输出文件流,并且其能通过插入运算符 `<<` 来实现。 +- `ifstream`:输入文件流,并且其能通过提取运算符 `>>` 来实现。 + +该两种类型都是在头文件 `` 中所定义。 + +从 `ios_base` 继承的类在写入时可被视为数据接收器,在从其读取时可被视为数据源,与数据本身完全分离。这种面向对象的方法使 [关注点分离][5]separation of concerns[依赖注入][6]dependency injection 等概念易于实现。 + +### 一个简单的例子 + +本例程是非常简单:实例化了一个 `ofstream` 来写入,和实例化一个 `ifstream` 来读取。 + +``` +#include // cout, cin, cerr etc... +#include // ifstream, ofstream +#include + + +int main() +{ + std::string sFilename = "MyFile.txt"; + + /****************************************** + * * + * WRITING * + * * + ******************************************/ + + std::ofstream fileSink(sFilename); // Creates an output file stream + + if (!fileSink) { + std::cerr << "Canot open " << sFilename << std::endl; + exit(-1); + } + + /* std::endl will automatically append the correct EOL */ + fileSink << "Hello Open Source World!" << std::endl; + + + /****************************************** + * * + * READING * + * * + ******************************************/ + + std::ifstream fileSource(sFilename); // Creates an input file stream + + if (!fileSource) { + std::cerr << "Canot open " << sFilename << std::endl; + exit(-1); + } + else { + // Intermediate buffer + std::string buffer; + + // By default, the >> operator reads word by workd (till whitespace) + while (fileSource >> buffer) + { + std::cout << buffer << std::endl; + } + } + + exit(0); +} +``` + +该代码可以在 [GitHub][7] 上查看。当你编译并且执行它时,你应该能获得以下输出: + +![Console screenshot][8] + +这是个简化的、适合初学者的例子。如果你想去使用该代码在你自己的应用中,请注意以下几点: + + * 文件流在程序结束的时候自动关闭。如果你想继续执行,那么应该通过调用 `close()` 方法手动关闭。 + * 这些文件流类继承自 [basic_ios][10](在多个层次上),并且重载了 `!` 运算符。这使你可以进行简单的检查是否可以访问该流。在 [cppreference.com][11] 上,你可以找到该检查何时会(或不会)成功的概述,并且可以进一步实现错误处理。 + * 默认情况下,`ifstream` 停在空白处并跳过它。要逐行读取直到到达 [EOF][13] ,请使用 `getline(...)` 方法。 + * 为了读写二进制文件,请将 `std::ios::binary` 标志传递给构造函数:这样可以防止 [EOL][13] 字符附加到每一行。 + +### 从系统角度进行写入 + +写入文件时,数据将写入系统的内存写入缓冲区中。当系统收到系统调用 [sync][14] 时,此缓冲区的内容将被写入硬盘。这也是你在不告知系统的情况下,不要卸下 U 盘的原因。通常,守护进程会定期调用 `sync`。为了安全起见,也可以手动调用 `sync()`: + + +``` +#include // needs to be included + +sync(); +``` + +### 总结 + +在 C++ 中读写文件并不那么复杂。更何况,如果你知道如何处理输入输出流,(原则上)那么你也知道如何处理任何类型的输入输出设备。对于各种输入输出设备的库能让你更容易地使用流运算符。这就是为什么知道输入输出流的流程会对你有所助益的原因。 + +-------------------------------------------------------------------------------- + +via: https://opensource.com/article/21/3/ccc-input-output + +作者:[Stephan Avenwedde][a] +选题:[lujun9972][b] +译者:[wyxplus](https://github.com/wyxplus) +校对:[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/browser_screen_windows_files.png?itok=kLTeQUbY "Computer screen with files or windows open" +[2]: https://en.cppreference.com/w/cpp/io/ios_base +[3]: https://en.cppreference.com/w/cpp/io/basic_ofstream +[4]: https://en.cppreference.com/w/cpp/io/basic_ifstream +[5]: https://en.wikipedia.org/wiki/Separation_of_concerns +[6]: https://en.wikipedia.org/wiki/Dependency_injection +[7]: https://github.com/hANSIc99/cpp_input_output +[8]: https://opensource.com/sites/default/files/uploads/c_console_screenshot.png "Console screenshot" +[9]: https://creativecommons.org/licenses/by-sa/4.0/ +[10]: https://en.cppreference.com/w/cpp/io/basic_ios +[11]: https://en.cppreference.com/w/cpp/io/basic_ios/operator! +[12]: https://en.wikipedia.org/wiki/End-of-file +[13]: https://en.wikipedia.org/wiki/Newline +[14]: https://en.wikipedia.org/wiki/Sync_%28Unix%29 diff --git a/published/202104/20210326 Why you should care about service mesh.md b/published/202104/20210326 Why you should care about service mesh.md new file mode 100644 index 0000000000..9e387a2342 --- /dev/null +++ b/published/202104/20210326 Why you should care about service mesh.md @@ -0,0 +1,67 @@ +[#]: subject: (Why you should care about service mesh) +[#]: via: (https://opensource.com/article/21/3/service-mesh) +[#]: author: (Daniel Oh https://opensource.com/users/daniel-oh) +[#]: collector: (lujun9972) +[#]: translator: (geekpi) +[#]: reviewer: (wxy) +[#]: publisher: (wxy) +[#]: url: (https://linux.cn/article-13261-1.html) + +为什么需要关心服务网格 +====== + +> 在微服务环境中,服务网格为开发和运营提供了好处。 + +![](https://img.linux.net.cn/data/attachment/album/202104/02/201409os5r13omp5p5bssb.jpg) + +很多开发者不知道为什么要关心[服务网格][2]Service Mesh。这是我在开发者见面会、会议和实践研讨会上关于云原生架构的微服务开发的演讲中经常被问到的问题。我的回答总是一样的:“只要你想简化你的微服务架构,它就应该运行在 Kubernetes 上。” + +关于简化,你可能也想知道,为什么分布式微服务必须设计得如此复杂才能在 Kubernetes 集群上运行。正如本文所解释的那样,许多开发人员通过服务网格解决了微服务架构的复杂性,并通过在生产中采用服务网格获得了额外的好处。 + +### 什么是服务网格? + +服务网格是一个专门的基础设施层,用于提供一个透明的、独立于代码的 (polyglot) 方式,以消除应用代码中的非功能性微服务能力。 + +![Before and After Service Mesh][3] + +### 为什么服务网格对开发者很重要 + +当开发人员将微服务部署到云时,无论业务功能如何,他们都必须解决非功能性微服务功能,以避免级联故障。这些功能通常可以体现在服务发现、日志、监控、韧性resiliency、认证、弹性elasticity和跟踪等方面。开发人员必须花费更多的时间将它们添加到每个微服务中,而不是开发实际的业务逻辑,这使得微服务变得沉重而复杂。 + +随着企业加速向云计算转移,服务网格 可以提高开发人员的生产力。Kubernetes 加服务网格平台不需要让服务负责处理这些复杂的问题,也不需要在每个服务中添加更多的代码来处理云原生的问题,而是负责向运行在该平台上的任何应用(现有的或新的,用任何编程语言或框架)提供这些服务。那么微服务就可以轻量级,专注于其业务逻辑,而不是云原生的复杂性。 + +### 为什么服务网格对运维很重要 + +这并没有回答为什么运维团队需要关心在 Kubernetes 上运行云原生微服务的服务网格。因为运维团队必须确保在 Kubernetes 环境上的大型混合云和多云上部署新的云原生应用的强大安全性、合规性和可观察性。 + +服务网格由一个用于管理代理路由流量的控制平面和一个用于注入边车Sidecar的数据平面组成。边车允许运维团队做一些比如添加第三方安全工具和追踪所有服务通信中的流量,以避免安全漏洞或合规问题。服务网格还可以通过在图形面板上可视化地跟踪指标来提高观察能力。 + +### 如何开始使用服务网格 + +对于开发者和运维人员,以及从应用开发到平台运维来说,服务网格可以更有效地管理云原生功能。 + +你可能想知道从哪里开始采用服务网格来配合你的微服务应用和架构。幸运的是,有许多开源的服务网格项目。许多云服务提供商也在他们的 Kubernetes 平台中提供 服务网格。 + +![CNCF Service Mesh Landscape][5] + +你可以在 [CNCF Service Mesh Landscape][6] 页面中找到最受欢迎的服务网格项目和服务的链接。 + +-------------------------------------------------------------------------------- + +via: https://opensource.com/article/21/3/service-mesh + +作者:[Daniel Oh][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/daniel-oh +[b]: https://github.com/lujun9972 +[1]: https://opensource.com/sites/default/files/styles/image-full-size/public/lead-images/data_analytics_cloud.png?itok=eE4uIoaB (Net catching 1s and 0s or data in the clouds) +[2]: https://www.redhat.com/en/topics/microservices/what-is-a-service-mesh +[3]: https://opensource.com/sites/default/files/uploads/vm-vs-service-mesh.png (Before and After Service Mesh) +[4]: https://creativecommons.org/licenses/by-sa/4.0/ +[5]: https://opensource.com/sites/default/files/uploads/service-mesh-providers.png (CNCF Service Mesh Landscape) +[6]: https://landscape.cncf.io/card-mode?category=service-mesh&grouping=category diff --git a/published/202104/20210329 Manipulate data in files with Lua.md b/published/202104/20210329 Manipulate data in files with Lua.md new file mode 100644 index 0000000000..eb0bf8808b --- /dev/null +++ b/published/202104/20210329 Manipulate data in files with Lua.md @@ -0,0 +1,95 @@ +[#]: subject: (Manipulate data in files with Lua) +[#]: via: (https://opensource.com/article/21/3/lua-files) +[#]: author: (Seth Kenlon https://opensource.com/users/seth) +[#]: collector: (lujun9972) +[#]: translator: (geekpi) +[#]: reviewer: (wxy) +[#]: publisher: (wxy) +[#]: url: (https://linux.cn/article-13268-1.html) + +用 Lua 操作文件中的数据 +====== + +> 了解 Lua 如何处理数据的读写。 + +![](https://img.linux.net.cn/data/attachment/album/202104/05/102424yczwucc3xcuyzkgw.jpg) + +有些数据是临时的,存储在 RAM 中,只有在应用运行时才有意义。但有些数据是要持久的,存储在硬盘上供以后使用。当你编程时,无论是简单的脚本还是复杂的工具套件,通常都需要读取和写入文件。有时文件可能包含配置选项,而另一些时候这个文件是你的用户用你的应用创建的数据。每种语言都会以不同的方式处理这项任务,本文将演示如何使用 Lua 处理文件数据。 + +### 安装 Lua + +如果你使用的是 Linux,你可以从你的发行版软件库中安装 Lua。在 macOS 上,你可以从 [MacPorts][2] 或 [Homebrew][3] 安装 Lua。在 Windows 上,你可以从 [Chocolatey][4] 安装 Lua。 + +安装 Lua 后,打开你最喜欢的文本编辑器并准备开始。 + +### 用 Lua 读取文件 + +Lua 使用 `io` 库进行数据输入和输出。下面的例子创建了一个名为 `ingest` 的函数来从文件中读取数据,然后用 `:read` 函数进行解析。在 Lua 中打开一个文件时,有几种模式可以启用。因为我只需要从这个文件中读取数据,所以我使用 `r`(代表“读”)模式: + +``` +function ingest(file) +   local f = io.open(file, "r") +   local lines = f:read("*all") +   f:close() +   return(lines) +end + +myfile=ingest("example.txt") +print(myfile) +``` + +在这段代码中,注意到变量 `myfile` 是为了触发 `ingest` 函数而创建的,因此,它接收该函数返回的任何内容。`ingest` 函数返回文件的行数(从一个称为 `lines` 的变量中0。当最后一步打印 `myfile` 变量的内容时,文件的行数就会出现在终端中。 + +如果文件 `example.txt` 中包含了配置选项,那么我会写一些额外的代码来解析这些数据,可能会使用另一个 Lua 库,这取决于配置是以 INI 文件还是 YAML 文件或其他格式存储。如果数据是 SVG 图形,我会写额外的代码来解析 XML,可能会使用 Lua 的 SVG 库。换句话说,你的代码读取的数据一旦加载到内存中,就可以进行操作,但是它们都需要加载 `io` 库。 + +### 用 Lua 将数据写入文件 + +无论你是要存储用户用你的应用创建的数据,还是仅仅是关于用户在应用中做了什么的元数据(例如,游戏保存或最近播放的歌曲),都有很多很好的理由来存储数据供以后使用。在 Lua 中,这是通过 `io` 库实现的,打开一个文件,将数据写入其中,然后关闭文件: + +``` +function exgest(file) +   local f = io.open(file, "a") +   io.output(f) +   io.write("hello world\n") +   io.close(f) +end + +exgest("example.txt") +``` + +为了从文件中读取数据,我以 `r` 模式打开文件,但这次我使用 `a` (用于”追加“)将数据写到文件的末尾。因为我是将纯文本写入文件,所以我添加了自己的换行符(`/n`)。通常情况下,你并不是将原始文本写入文件,你可能会使用一个额外的库来代替写入一个特定的格式。例如,你可能会使用 INI 或 YAML 库来帮助编写配置文件,使用 XML 库来编写 XML,等等。 + +### 文件模式 + +在 Lua 中打开文件时,有一些保护措施和参数来定义如何处理文件。默认值是 `r`,允许你只读数据: + + * `r` 只读 + * `w` 如果文件不存在,覆盖或创建一个新文件。 + * `r+` 读取和覆盖。 + * `a` 追加数据到文件中,或在文件不存在的情况下创建一个新文件。 + * `a+` 读取数据,将数据追加到文件中,或文件不存在的话,创建一个新文件。 + +还有一些其他的(例如,`b` 代表二进制格式),但这些是最常见的。关于完整的文档,请参考 [Lua.org/manual][5] 上的优秀 Lua 文档。 + +### Lua 和文件 + +和其他编程语言一样,Lua 有大量的库支持来访问文件系统来读写数据。因为 Lua 有一个一致且简单语法,所以很容易对任何格式的文件数据进行复杂的处理。试着在你的下一个软件项目中使用 Lua,或者作为 C 或 C++ 项目的 API。 + +-------------------------------------------------------------------------------- + +via: https://opensource.com/article/21/3/lua-files + +作者:[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/data_metrics_analytics_desktop_laptop.png?itok=9QXd7AUr (Person standing in front of a giant computer screen with numbers, data) +[2]: https://opensource.com/article/20/11/macports +[3]: https://opensource.com/article/20/6/homebrew-mac +[4]: https://opensource.com/article/20/3/chocolatey +[5]: http://lua.org/manual diff --git a/published/202104/20210329 Why I love using the IPython shell and Jupyter notebooks.md b/published/202104/20210329 Why I love using the IPython shell and Jupyter notebooks.md new file mode 100644 index 0000000000..269735322f --- /dev/null +++ b/published/202104/20210329 Why I love using the IPython shell and Jupyter notebooks.md @@ -0,0 +1,157 @@ +[#]: subject: (Why I love using the IPython shell and Jupyter notebooks) +[#]: via: (https://opensource.com/article/21/3/ipython-shell-jupyter-notebooks) +[#]: author: (Ben Nuttall https://opensource.com/users/bennuttall) +[#]: collector: (lujun9972) +[#]: translator: (geekpi) +[#]: reviewer: (wxy) +[#]: publisher: (wxy) +[#]: url: (https://linux.cn/article-13277-1.html) + +为什么我喜欢使用 IPython shell 和 Jupyter 笔记本 +====== + +> Jupyter 笔记本将 IPython shell 提升到一个新的高度。 + +![](https://img.linux.net.cn/data/attachment/album/202104/08/125206uvglkoqzukhfk3uv.jpg) + +Jupyter 项目最初是以 IPython 和 IPython 笔记本的形式出现的。它最初是一个专门针对 Python 的交互式 shell 和笔记本环境,后来扩展为不分语言的环境,支持 Julia、Python 和 R 以及其他任何语言。 + +![Jupyter][2] + +IPython 是一个 Python shell,类似于你在命令行输入 `python` 或者 `python3` 时看到的,但它更聪明、更有用。如果你曾经在 Python shell 中输入过多行命令,并且想重复它,你就会理解每次都要一行一行地滚动浏览历史记录的挫败感。有了 IPython,你可以一次滚动浏览整个块,同时还可以逐行浏览和编辑这些块的部分内容。 + +![iPython][4] + +它具有自动补全,并提供上下文感知的建议: + +![iPython offers suggestions][5] + +它默认会整理输出: + +![iPython pretty prints][6] + +它甚至允许你运行 shell 命令: + +![IPython shell commands][7] + +它还提供了一些有用的功能,比如将 `?` 添加到对象中,作为运行 `help()` 的快捷方式,而不会破坏你的流程: + +![IPython help][8] + +如果你使用的是虚拟环境(参见我关于 [virtualenvwrapper][9] 的帖子),可以在环境中用 `pip` 安装: + +``` +pip install ipython +``` + +要在全系统范围内安装,你可以在 Debian、Ubuntu 或树莓派上使用 `apt`: + +``` +sudo apt install ipython3 +``` + +或使用 `pip`: + +``` +sudo pip3 install ipython +``` + +### Jupyter 笔记本 + +Jupyter 笔记本将 IPython shell 提升到了一个新的高度。首先,它们是基于浏览器的,而不是基于终端的。要开始使用,请安装 `jupyter`。 + +如果你使用的是虚拟环境,请在环境中使用 `pip` 进行安装: + +``` +pip install jupyter +``` + +要在全系统范围内安装,你可以在 Debian、Ubuntu 或树莓派上使用 `apt`: + +``` +sudo apt install jupyter-notebook +``` + +或使用 `pip`: + +``` +sudo pip3 install jupyter +``` + +启动笔记本: + +``` +jupyter notebook +``` + +这将在你的浏览器中打开: + +![Jupyter Notebook][10] + +你可以使用 “New” 下拉菜单创建一个新的 Python 3 笔记本: + +![Python 3 in Jupyter Notebook][11] + +现在你可以在 `In[ ]` 字段中编写和执行命令。使用 `Enter` 在代码块中换行,使用 `Shift+Enter` 来执行: + +![Executing commands in Jupyter][12] + +你可以编辑和重新运行代码块,你可以重新排序、删除,复制/粘贴,等等。你可以以任何顺序运行代码块,但是要注意的是,任何创建的变量的作用域都将根据执行的时间而不是它们在笔记本中出现的顺序。你可以在 “Kernel” 菜单中重启并清除输出或重启并运行所有的代码块。 + +使用 `print` 函数每次都会输出。但是如果你有一条没有分配的语句,或者最后一条语句没有分配,那么它总是会输出: + +![Jupyter output][13] + +你甚至可以把 `In` 和 `Out` 作为可索引对象: + +![Jupyter output][14] + +所有的 IPython 功能都可以使用,而且通常也会表现得更漂亮一些: + +![Jupyter supports IPython features][15] + +你甚至可以使用 [Matplotlib][16] 进行内联绘图: + +![Graphing in Jupyter Notebook][17] + +最后,你可以保存你的笔记本,并将其包含在 Git 仓库中,如果你将其推送到 GitHub,它们将作为已完成的笔记本被渲染:输出、图形和所有一切(如 [本例][18]): + +![Saving Notebook to GitHub][19] + +* * * + +本文原载于 Ben Nuttall 的 [Tooling Tuesday 博客][20],经许可后重用。 + +-------------------------------------------------------------------------------- + +via: https://opensource.com/article/21/3/ipython-shell-jupyter-notebooks + +作者:[Ben Nuttall][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/bennuttall +[b]: https://github.com/lujun9972 +[1]: https://opensource.com/sites/default/files/styles/image-full-size/public/lead-images/computer_space_graphic_cosmic.png?itok=wu493YbB (Computer laptop in space) +[2]: https://opensource.com/sites/default/files/uploads/jupyterpreview.png (Jupyter) +[3]: https://creativecommons.org/licenses/by-sa/4.0/ +[4]: https://opensource.com/sites/default/files/uploads/ipython-loop.png (iPython) +[5]: https://opensource.com/sites/default/files/uploads/ipython-suggest.png (iPython offers suggestions) +[6]: https://opensource.com/sites/default/files/uploads/ipython-pprint.png (iPython pretty prints) +[7]: https://opensource.com/sites/default/files/uploads/ipython-ls.png (IPython shell commands) +[8]: https://opensource.com/sites/default/files/uploads/ipython-help.png (IPython help) +[9]: https://opensource.com/article/21/2/python-virtualenvwrapper +[10]: https://opensource.com/sites/default/files/uploads/jupyter-notebook-1.png (Jupyter Notebook) +[11]: https://opensource.com/sites/default/files/uploads/jupyter-python-notebook.png (Python 3 in Jupyter Notebook) +[12]: https://opensource.com/sites/default/files/uploads/jupyter-loop.png (Executing commands in Jupyter) +[13]: https://opensource.com/sites/default/files/uploads/jupyter-cells.png (Jupyter output) +[14]: https://opensource.com/sites/default/files/uploads/jupyter-cells-2.png (Jupyter output) +[15]: https://opensource.com/sites/default/files/uploads/jupyter-help.png (Jupyter supports IPython features) +[16]: https://matplotlib.org/ +[17]: https://opensource.com/sites/default/files/uploads/jupyter-graph.png (Graphing in Jupyter Notebook) +[18]: https://github.com/piwheels/stats/blob/master/2020.ipynb +[19]: https://opensource.com/sites/default/files/uploads/savenotebooks.png (Saving Notebook to GitHub) +[20]: https://tooling.bennuttall.com/the-ipython-shell-and-jupyter-notebooks/ diff --git a/published/202104/20210330 NewsFlash- A Modern Open-Source Feed Reader With Feedly Support.md b/published/202104/20210330 NewsFlash- A Modern Open-Source Feed Reader With Feedly Support.md new file mode 100644 index 0000000000..11f3c7231c --- /dev/null +++ b/published/202104/20210330 NewsFlash- A Modern Open-Source Feed Reader With Feedly Support.md @@ -0,0 +1,98 @@ +[#]: subject: (NewsFlash: A Modern Open-Source Feed Reader With Feedly Support) +[#]: via: (https://itsfoss.com/newsflash-feedreader/) +[#]: author: (Ankush Das https://itsfoss.com/author/ankush/) +[#]: collector: (lujun9972) +[#]: translator: (DCOLIVERSUN) +[#]: reviewer: (wxy) +[#]: publisher: (wxy) +[#]: url: (https://linux.cn/article-13264-1.html) + +NewsFlash: 一款支持 Feedly 的现代开源 Feed 阅读器 +====== + +![](https://img.linux.net.cn/data/attachment/album/202104/03/001037r2udx6u6xqu5sqzu.jpg) + +有些人可能认为 RSS 阅读器已经不再,但它们仍然坚持在这里,特别是当你不想让大科技算法来决定你应该阅读什么的时候。Feed 阅读器可以帮你自助选择阅读来源。 + +我最近遇到一个很棒的 RSS 阅读器 NewsFlash。它支持通过基于网页的 Feed 阅读器增加 feed,例如 [Feedly][1] 和 NewsBlur。这是一个很大的安慰,因为如果你已经使用这种服务,就不必人工导入 feed,这节省了你的工作。 + +NewsFlash 恰好是 [FeedReadeer][2] 的精神继承者,原来的 FeedReader 开发人员也参与其中。 + +如果你正在找适用的 RSS 阅读器,我们整理了 [Linux Feed 阅读器][3] 列表供您参考。 + +### NewsFlash: 一款补充网页 RSS 阅读器账户的 Feed 阅读器 + +![][4] + +请注意,NewsFlash 并不只是针对基于网页的 RSS feed 账户量身定做的,你也可以选择使用本地 RSS feed,而不必在多设备间同步。 + +不过,如果你在用是任何一款支持的基于网页的 feed 阅读器,那么 NewsFlash 特别有用。 + +这里,我将重点介绍 NewsFlash 提供的一些功能。 + +### NewsFlash 功能 + +![][5] + + * 支持桌面通知 + * 快速搜索、过滤 + * 支持标签 + * 便捷、可重定义的键盘快捷键 + * 本地 feed + * OPML 文件导入/导出 + * 无需注册即可在 Feedly 库中轻松找到不同 RSS Feed + * 支持自定义字体 + * 支持多主题(包括深色主题) + * 启动/禁止缩略图 + * 细粒度调整定期同步间隔时间 + * 支持基于网页的 Feed 账户,例如 Feedly、Fever、NewsBlur、feedbin、Miniflux + +除上述功能外,当你调整窗口大小时,还可以打开阅读器视图,这是一个细腻的补充功能。 + +![newsflash 截图1][6] + +账户重新设置也很容易,这将删除所有本地数据。是的,你可以手动清除缓存并设置到期时间,并为你关注的所有 feed 设置一个用户数据存在本地的到期时间。 + +### 在 Linux 上安装 NewsFlash + +你无法找到适用于各种 Linux 发行版的官方软件包,只有 [Flatpak][8]。 + +对于 Arch 用户,可以从 [AUR][9] 下载。 + +幸运的是,[Flatpak][10] 软件包可以让你轻松在 Linux 发行版上安装 NewsFlash。具体请参阅我们的 [Flatpak 指南][11]。 + +你可以参考 NewsFlash 的 [GitLab 页面][12] 去解决大部分问题。 + +### 结束语 + +我现在用 NewsFlash 作为桌面本地解决方案,不用基于网页的服务。你可以通过直接导出 OPML 文件在移动 feed 应用上得到相同的 feed。这已经被我验证过了。 + +用户界面易于使用,也提供了数一数二的新版 UX。虽然这个 RSS 阅读器看似简单,但提供了你可以找到的所有重要功能。 + +你怎么看 NewsFlash?你喜欢用其他类似产品吗?欢迎在评论区中分享你的想法。 + +-------------------------------------------------------------------------------- + +via: https://itsfoss.com/newsflash-feedreader/ + +作者:[Ankush Das][a] +选题:[lujun9972][b] +译者:[DCOLIVERSUN](https://github.com/DCOLIVERSUN) +校对:[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://feedly.com/ +[2]: https://jangernert.github.io/FeedReader/ +[3]: https://itsfoss.com/feed-reader-apps-linux/ +[4]: https://i2.wp.com/itsfoss.com/wp-content/uploads/2021/03/newsflash.jpg?resize=945%2C648&ssl=1 +[5]: https://i2.wp.com/itsfoss.com/wp-content/uploads/2021/03/newsflash-screenshot.jpg?resize=800%2C533&ssl=1 +[6]: https://i2.wp.com/itsfoss.com/wp-content/uploads/2021/03/newsflash-screenshot-1.jpg?resize=800%2C532&ssl=1 +[7]: https://i0.wp.com/itsfoss.com/wp-content/uploads/2018/04/best-feed-reader-apps-linux.jpg?fit=800%2C450&ssl=1 +[8]: https://flathub.org/apps/details/com.gitlab.newsflash +[9]: https://itsfoss.com/aur-arch-linux/ +[10]: https://itsfoss.com/what-is-flatpak/ +[11]: https://itsfoss.com/flatpak-guide/ +[12]: https://gitlab.com/news-flash/news_flash_gtk diff --git a/published/202104/20210331 3 reasons I use the Git cherry-pick command.md b/published/202104/20210331 3 reasons I use the Git cherry-pick command.md new file mode 100644 index 0000000000..5f87ecc61e --- /dev/null +++ b/published/202104/20210331 3 reasons I use the Git cherry-pick command.md @@ -0,0 +1,181 @@ +[#]: subject: (3 reasons I use the Git cherry-pick command) +[#]: via: (https://opensource.com/article/21/3/git-cherry-pick) +[#]: author: (Manaswini Das https://opensource.com/users/manaswinidas) +[#]: collector: (lujun9972) +[#]: translator: (wxy) +[#]: reviewer: (wxy) +[#]: publisher: (wxy) +[#]: url: (https://linux.cn/article-13305-1.html) + +我使用 Git cherry-pick 命令的 3 个理由 +====== + +> “遴选”可以解决 Git 仓库中的很多问题。以下是用 `git cherry-pick` 修复错误的三种方法。 + +![](https://img.linux.net.cn/data/attachment/album/202104/17/174429qw1im6if6mf6zi9i.jpg) + +在版本控制系统中摸索前进是一件很棘手的事情。对于一个新手来说,这可能是非常难以应付的,但熟悉版本控制系统(如 Git)的术语和基础知识是开始为开源贡献的第一步。 + +熟悉 Git 也能帮助你在开源之路上走出困境。Git 功能强大,让你感觉自己在掌控之中 —— 没有哪一种方法会让你无法恢复到工作版本。 + +这里有一个例子可以帮助你理解“遴选cherry-pick”的重要性。假设你已经在一个分支上做了好几个提交,但你意识到这是个错误的分支!你现在该怎么办?你现在要做什么?要么在正确的分支上重复所有的变更,然后重新提交,要么把这个分支合并到正确的分支上。等一下,前者太过繁琐,而你可能不想做后者。那么,还有没有办法呢?有的,Git 已经为你准备好了。这就是“遴选”的作用。顾名思义,你可以用它从一个分支中手工遴选一个提交,然后转移到另一个分支。 + +使用遴选的原因有很多。以下是其中的三个原因。 + +### 避免重复性工作 + +如果你可以直接将相同的提交复制到另一个分支,就没有必要在不同的分支中重做相同的变更。请注意,遴选出来的提交会在另一个分支中创建带有新哈希的新提交,所以如果你看到不同的提交哈希,请不要感到困惑。 + +如果您想知道什么是提交的哈希,以及它是如何生成的,这里有一个说明可以帮助你。提交哈希是用 [SHA-1][2] 算法生成的字符串。SHA-1 算法接收一个输入,然后输出一个唯一的 40 个字符的哈希值。如果你使用的是 [POSIX][3] 系统,请尝试在您的终端上运行这个命令: + +``` +$ echo -n "commit" | openssl sha1 +``` + +这将输出一个唯一的 40 个字符的哈希值 `4015b57a143aec5156fd1444a017a32137a3fd0f`。这个哈希代表了字符串 `commit`。 + +Git 在提交时生成的 SHA-1 哈希值不仅仅代表一个字符串。它代表的是: + +``` +sha1( +    meta data +        commit message +        committer +        commit date +        author +        authoring date +    Hash of the entire tree object +) +``` + +这就解释了为什么你对代码所做的任何细微改动都会得到一个独特的提交哈希值。哪怕是一个微小的改动都会被发现。这是因为 Git 具有完整性。 + +### 撤销/恢复丢失的更改 + +当你想恢复到工作版本时,遴选就很方便。当多个开发人员在同一个代码库上工作时,很可能会丢失更改,最新的版本会被转移到一个陈旧的或非工作版本上。这时,遴选提交到工作版本就可以成为救星。 + +#### 它是如何工作的? + +假设有两个分支:`feature1` 和 `feature2`,你想把 `feature1` 中的提交应用到 `feature2`。 + +在 `feature1` 分支上,运行 `git log` 命令,复制你想遴选的提交哈希值。你可以看到一系列类似于下面代码示例的提交。`commit` 后面的字母数字代码就是你需要复制的提交哈希。为了方便起见,您可以选择复制前六个字符(本例中为 `966cf3`)。 + +``` +commit 966cf3d08b09a2da3f2f58c0818baa37184c9778 (HEAD -> master) +Author: manaswinidas +Date: Mon Mar 8 09:20:21 2021 +1300 + + add instructions +``` + +然后切换到 `feature2` 分支,在刚刚从日志中得到的哈希值上运行 `git cherry-pick`: + +``` +$ git checkout feature2 +$ git cherry-pick 966cf3. +``` + +如果该分支不存在,使用 `git checkout -b feature2` 来创建它。 + +这里有一个问题。你可能会遇到下面这种情况: + +``` +$ git cherry-pick 966cf3 +On branch feature2 +You are currently cherry-picking commit 966cf3d. + +nothing to commit, working tree clean +The previous cherry-pick is now empty, possibly due to conflict resolution. +If you wish to commit it anyway, use: + +   git commit --allow-empty + +Otherwise, please use 'git reset' +``` + +不要惊慌。只要按照建议运行 `git commit --allow-empty`: + +``` +$ git commit --allow-empty +[feature2 afb6fcb] add instructions +Date: Mon Mar 8 09:20:21 2021 +1300 +``` + +这将打开你的默认编辑器,允许你编辑提交信息。如果你没有什么要补充的,可以保存现有的信息。 + +就这样,你完成了你的第一次遴选。如上所述,如果你在分支 `feature2` 上运行 `git log`,你会看到一个不同的提交哈希。下面是一个例子: + +``` +commit afb6fcb87083c8f41089cad58deb97a5380cb2c2 (HEAD -> feature2) +Author: manaswinidas <[me@example.com][4]> +Date:   Mon Mar 8 09:20:21 2021 +1300 +   add instructions +``` + +不要对不同的提交哈希感到困惑。这只是区分 `feature1` 和 `feature2` 的提交。 + +### 遴选多个提交 + +但如果你想遴选多个提交的内容呢?你可以使用: + +``` +git cherry-pick ... +``` + +请注意,你不必使用整个提交的哈希值,你可以使用前五到六个字符。 + +同样,这也是很繁琐的。如果你想遴选的提交是一系列的连续提交呢?这种方法太费劲了。别担心,有一个更简单的方法。 + +假设你有两个分支: + + * `feature1` 包括你想复制的提交(从更早的 `commitA` 到 `commitB`)。 + * `feature2` 是你想把提交从 `feature1` 转移到的分支。 + +然后: + + 1. 输入 `git checkout `。 + 2. 获取 `commitA` 和 `commitB` 的哈希值。 + 3. 输入 `git checkout `。 + 4. 输入 `git cherry-pick ^..` (请注意,这包括 `commitA` 和 `commitB`)。 + 5. 如果遇到合并冲突,[像往常一样解决][5],然后输入 `git cherry-pick --continue` 恢复遴选过程。 + +### 重要的遴选选项 + +以下是 [Git 文档][6] 中的一些有用的选项,你可以在 `cherry-pick` 命令中使用。 + + * `-e`、`--edit`:用这个选项,`git cherry-pick` 可以让你在提交前编辑提交信息。 + * `-s`、`--signoff`:在提交信息的结尾添加 `Signed-off by` 行。更多信息请参见 `git-commit(1)` 中的 signoff 选项。 + * `-S[]`、`--pgg-sign[=]`:这些是 GPG 签名的提交。`keyid` 参数是可选的,默认为提交者身份;如果指定了,则必须嵌在选项中,不加空格。 + * `--ff`:如果当前 HEAD 与遴选的提交的父级提交相同,则会对该提交进行快进操作。 + +下面是除了 `--continue` 外的一些其他的后继操作子命令: + + * `--quit`:你可以忘记当前正在进行的操作。这可以用来清除遴选或撤销失败后的后继操作状态。 + * `--abort`:取消操作并返回到操作序列前状态。 + +下面是一些关于遴选的例子: + + * `git cherry-pick master`:应用 `master` 分支顶端的提交所引入的变更,并创建一个包含该变更的新提交。 + * `git cherry-pick master~4 master~2':应用 `master` 指向的第五个和第三个最新提交所带来的变化,并根据这些变化创建两个新的提交。 + +感到不知所措?你不需要记住所有的命令。你可以随时在你的终端输入 `git cherry-pick --help` 查看更多选项或帮助。 + +-------------------------------------------------------------------------------- + +via: https://opensource.com/article/21/3/git-cherry-pick + +作者:[Manaswini Das][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/manaswinidas +[b]: https://github.com/lujun9972 +[1]: https://opensource.com/sites/default/files/styles/image-full-size/public/pictures/cherry-picking-recipe-baking-cooking.jpg?itok=XVwse6hw (Measuring and baking a cherry pie recipe) +[2]: https://en.wikipedia.org/wiki/SHA-1 +[3]: https://opensource.com/article/19/7/what-posix-richard-stallman-explains +[4]: mailto:me@example.com +[5]: https://opensource.com/article/20/4/git-merge-conflict +[6]: https://git-scm.com/docs/git-cherry-pick diff --git a/published/202104/20210331 Use this open source tool to monitor variables in Python.md b/published/202104/20210331 Use this open source tool to monitor variables in Python.md new file mode 100644 index 0000000000..6349b1fe3c --- /dev/null +++ b/published/202104/20210331 Use this open source tool to monitor variables in Python.md @@ -0,0 +1,169 @@ +[#]: subject: (Use this open source tool to monitor variables in Python) +[#]: via: (https://opensource.com/article/21/4/monitor-debug-python) +[#]: author: (Tian Gao https://opensource.com/users/gaogaotiantian) +[#]: collector: (lujun9972) +[#]: translator: (geekpi) +[#]: reviewer: (wxy) +[#]: publisher: (wxy) +[#]: url: (https://linux.cn/article-13279-1.html) + +使用这个开源工具来监控 Python 中的变量 +====== + +> Watchpoints 是一个简单但功能强大的工具,可以帮助你在调试 Python 时监控变量。 + +![](https://img.linux.net.cn/data/attachment/album/202104/08/231614imw8zqfncz5qwwow.jpg) + +在调试代码时,你经常面临着要弄清楚一个变量何时发生变化。如果没有任何高级工具,那么可以选择使用打印语句在期望它们更改时输出变量。然而,这是一种非常低效的方法,因为变量可能在很多地方发生变化,并且不断地将其打印到终端上会产生很大的干扰,而将它们打印到日志文件中则变得很麻烦。 + +这是一个常见的问题,但现在有一个简单而强大的工具可以帮助你监控变量:[watchpoints][2]。 + +[“监视点”的概念在 C 和 C++ 调试器中很常见][3],用于监控内存,但在 Python 中缺乏相应的工具。`watchpoints` 填补了这个空白。 + +### 安装 + +要使用它,你必须先用 `pip` 安装它: + +``` +$ python3 -m pip install watchpoints +``` + +### 在Python中使用 watchpoints + +对于任何一个你想监控的变量,使用 `watch` 函数对其进行监控。 + +``` +from watchpoints import watch + +a = 0 +watch(a) +a = 1 +``` + +当变量发生变化时,它的值就会被打印到**标准输出**: + +``` +====== Watchpoints Triggered ====== + +Call Stack (most recent call last): + (my_script.py:5): +> a = 1 +a: +0 +-> +1 +``` + +信息包括: + + * 变量被改变的行。 + * 调用栈。 + * 变量的先前值/当前值。 + +它不仅适用于变量本身,也适用于对象的变化: + +``` +from watchpoints import watch + +a = [] +watch(a) +a = {} # 触发 +a["a"] = 2 # 触发 +``` + +当变量 `a` 被重新分配时,回调会被触发,同时当分配给 `a` 的对象发生变化时也会被触发。 + +更有趣的是,监控不受作用域的限制。你可以在任何地方观察变量/对象,而且无论程序在执行什么函数,回调都会被触发。 + +``` +from watchpoints import watch + +def func(var): +    var["a"] = 1 + +a = {} +watch(a) +func(a) +``` + +例如,这段代码打印出: + +``` +====== Watchpoints Triggered ====== + +Call Stack (most recent call last): + + (my_script.py:8): +> func(a) + func (my_script.py:4): +> var["a"] = 1 +a: +{} +-> +{'a': 1} +``` + +`watch` 函数不仅可以监视一个变量,它也可以监视一个字典或列表的属性和元素。 + +``` +from watchpoints import watch + +class MyObj: +    def __init__(self): +        self.a = 0 + +obj = MyObj() +d = {"a": 0} +watch(obj.a, d["a"]) # 是的,你可以这样做 +obj.a = 1 # 触发 +d["a"] = 1 # 触发 +``` + +这可以帮助你缩小到一些你感兴趣的特定对象。 + +如果你对输出格式不满意,你可以自定义它。只需定义你自己的回调函数: + +``` +watch(a, callback=my_callback) + +# 或者全局设置 + +watch.config(callback=my_callback) +``` + +当触发时,你甚至可以使用 `pdb`: + +``` +watch.config(pdb=True) +``` + +这与 `breakpoint()` 的行为类似,会给你带来类似调试器的体验。 + +如果你不想在每个文件中都导入这个函数,你可以通过 `install` 函数使其成为全局: + +``` +watch.install() # 或 watch.install("func_name") ,然后以 func_name() 方式使用 +``` + +我个人认为,`watchpoints` 最酷的地方就是使用直观。你对一些数据感兴趣吗?只要“观察”它,你就会知道你的变量何时发生变化。 + +### 尝试 watchpoints + +我在 [GitHub][2] 上开发维护了 `watchpoints`,并在 Apache 2.0 许可下发布了它。安装并使用它,当然也欢迎大家做出贡献。 + +-------------------------------------------------------------------------------- + +via: https://opensource.com/article/21/4/monitor-debug-python + +作者:[Tian Gao][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/gaogaotiantian +[b]: https://github.com/lujun9972 +[1]: https://opensource.com/sites/default/files/styles/image-full-size/public/lead-images/look-binoculars-sight-see-review.png?itok=NOw2cm39 (Looking back with binoculars) +[2]: https://github.com/gaogaotiantian/watchpoints +[3]: https://opensource.com/article/21/3/debug-code-gdb diff --git a/published/202104/20210401 Find what changed in a Git commit.md b/published/202104/20210401 Find what changed in a Git commit.md new file mode 100644 index 0000000000..47202013ef --- /dev/null +++ b/published/202104/20210401 Find what changed in a Git commit.md @@ -0,0 +1,134 @@ +[#]: subject: (Find what changed in a Git commit) +[#]: via: (https://opensource.com/article/21/4/git-whatchanged) +[#]: author: (Seth Kenlon https://opensource.com/users/seth) +[#]: collector: (lujun9972) +[#]: translator: (DCOLIVERSUN) +[#]: reviewer: (wxy) +[#]: publisher: (wxy) +[#]: url: (https://linux.cn/article-13286-1.html) + +查看 Git 提交中发生了什么变化 +====== + +> Git 提供了几种方式可以帮你快速查看提交中哪些文件被改变。 + +![](https://img.linux.net.cn/data/attachment/album/202104/11/093421yuololouo66woulu.jpg) + +如果你每天使用 Git,应该会提交不少改动。如果你每天和其他人在一个项目中使用 Git,假设 _每个人_ 每天的提交都是安全的,你会意识到 Git 日志会变得多么混乱,似乎永恒地滚动着变化,却没有任何迹象表明修改了什么。 + +那么,你该怎样查看指定提交中文件发生哪些变化?这比你想的容易。 + +### 查看提交中文件发生的变化 + +要想知道指定提交中哪些文件发生变化,可以使用 `git log --raw` 命令。这是发现一个提交影响了哪些文件的最快速、最方便的方法。`git log` 命令一般都没有被充分利用,主要是因为它有太多的格式化选项,许多用户在面对很多选择以及在一些情况下不明所以的文档时,会望而却步。 + +然而,Git 的日志机制非常灵活,`--raw` 选项提供了当前分支中的提交日志,以及更改的文件列表。 + +以下是标准的 `git log` 输出: + +``` +$ git log +commit fbbbe083aed75b24f2c77b1825ecab10def0953c (HEAD -> dev, origin/dev) +Author: tux +Date: Sun Nov 5 21:40:37 2020 +1300 + + exit immediately from failed download + +commit 094f9948cd995acfc331a6965032ea0d38e01f03 (origin/master, master) +Author: Tux +Date: Fri Aug 5 02:05:19 2020 +1200 + + export makeopts from etc/example.conf + +commit 76b7b46dc53ec13316abb49cc7b37914215acd47 +Author: Tux +Date: Sun Jul 31 21:45:24 2020 +1200 + + fix typo in help message +``` + +即使作者在提交消息中指定了哪些文件发生变化,日志也相当简洁。 + +以下是 `git log --raw` 输出: + +``` +$ git log --raw +commit fbbbe083aed75b24f2c77b1825ecab10def0953c (HEAD -> dev, origin/dev) +Author: tux +Date: Sun Nov 5 21:40:37 2020 +1300 + + exit immediately from failed download + +:100755 100755 cbcf1f3 4cac92f M src/example.lua + +commit 094f9948cd995acfc331a6965032ea0d38e01f03 (origin/master, master) +Author: Tux +Date: Fri Aug 5 02:05:19 2020 +1200 + + export makeopts from etc/example.conf + +:100755 100755 4c815c0 cbcf1f3 M src/example.lua +:100755 100755 71653e1 8f5d5a6 M src/example.spec +:100644 100644 9d21a6f e33caba R100 etc/example.conf etc/example.conf-default + +commit 76b7b46dc53ec13316abb49cc7b37914215acd47 +Author: Tux +Date: Sun Jul 31 21:45:24 2020 +1200 + + fix typo in help message + +:100755 100755 e253aaf 4c815c0 M src/example.lua +``` + +这会准确告诉你哪个文件被添加到提交中,哪些文件发生改变(`A` 是添加,`M` 是修改,`R` 是重命名,`D` 是删除)。 + +### Git whatchanged + +`git whatchanged` 命令是一个遗留命令,它的前身是日志功能。文档说用户不应该用该命令替代 `git log --raw`,并且暗示它实质上已经被废弃了。不过,我还是觉得它是一个很有用的捷径,可以得到同样的输出结果(尽管合并提交的内容不包括在内),如果它被删除的话,我打算为它创建一个别名。如果你只想查看已更改的文件,不想在日志中看到合并提交,可以尝试 `git whatchanged` 作为简单的助记符。 + +### 查看变化 + +你不仅可以看到哪些文件发生更改,还可以使用 `git log` 显示文件中发生了哪些变化。你的 Git 日志可以生成一个内联差异,用 `--patch` 选项可以逐行显示每个文件的所有更改: + +``` +commit 62a2daf8411eccbec0af69e4736a0fcf0a469ab1 (HEAD -> master) +Author: Tux +Date: Wed Mar 10 06:46:58 2021 +1300 + + commit + +diff --git a/hello.txt b/hello.txt +index 65a56c3..36a0a7d 100644 +--- a/hello.txt ++++ b/hello.txt +@@ -1,2 +1,2 @@ + Hello +-world ++opensource.com +``` + +在这个例子中,“world” 这行字从 `hello.txt` 中删掉,“opensource.com” 这行字则添加进去。 + +如果你需要在其他地方手动进行相同的修改,这些补丁patch可以与常见的 Unix 命令一起使用,例如 [diff 与 patch][4]。补丁也是一个好方法,可以总结指定提交中引入新信息的重要部分内容。当你在冲刺阶段引入一个 bug 时,你会发现这里的内容就是非常有价值的概述。为了更快地找到错误的原因,你可以忽略文件中没有更改的部分,只检查新代码。 + +### 用简单命令得到复杂的结果 + +你不必理解引用、分支和提交哈希,就可以查看提交中更改了哪些文件。你的 Git 日志旨在向你报告 Git 的活动,如果你想以特定方式格式化它或者提取特定的信息,通常需要费力地浏览许多文档来组合出正确的命令。幸运的是,关于 Git 历史记录最常用的请求之一只需要一两个选项:`--raw` 与 `--patch`。如果你不记得 `--raw`,就想想“Git,什么改变了?”,然后输入 `git whatchanged`。 + +-------------------------------------------------------------------------------- + +via: https://opensource.com/article/21/4/git-whatchanged + +作者:[Seth Kenlon][a] +选题:[lujun9972][b] +译者:[DCOLIVERSUN](https://github.com/DCOLIVERSUN) +校对:[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/code_computer_development_programming.png?itok=4OM29-82 (Code going into a computer.) +[2]: mailto:tux@example.com +[3]: mailto:Tux@example.com +[4]: https://opensource.com/article/18/8/diffs-patches diff --git a/published/202104/20210401 Wrong Time Displayed in Windows-Linux Dual Boot Setup- Here-s How to Fix it.md b/published/202104/20210401 Wrong Time Displayed in Windows-Linux Dual Boot Setup- Here-s How to Fix it.md new file mode 100644 index 0000000000..625e7d9362 --- /dev/null +++ b/published/202104/20210401 Wrong Time Displayed in Windows-Linux Dual Boot Setup- Here-s How to Fix it.md @@ -0,0 +1,104 @@ +[#]: subject: (Wrong Time Displayed in Windows-Linux Dual Boot Setup? Here’s How to Fix it) +[#]: via: (https://itsfoss.com/wrong-time-dual-boot/) +[#]: author: (Abhishek Prakash https://itsfoss.com/author/abhishek/) +[#]: collector: (lujun9972) +[#]: translator: (geekpi) +[#]: reviewer: (wxy) +[#]: publisher: (wxy) +[#]: url: (https://linux.cn/article-13276-1.html) + +如何解决 Windows-Linux 双启动设置中显示时间错误的问题 +====== + +![](https://img.linux.net.cn/data/attachment/album/202104/08/102102xaup3iofozn2uvbf.jpg) + +如果你 [双启动 Windows 和 Ubuntu][1] 或任何其他 Linux 发行版,你可能会注意到两个操作系统之间的时间差异。 + +当你 [使用 Linux][2] 时,它会显示正确的时间。但当你进入 Windows 时,它显示的时间是错误的。有时,情况正好相反,Linux 显示的是错误的时间,而 Windows 的时间是正确的。 + +特别奇怪的是,因为你已连接到互联网,并且已将日期和时间设置为自动使用。 + +别担心!你并不是唯一一个遇到这种问题的人。你可以在 Linux 终端上使用以下命令来解决这个问题: + +``` +timedatectl set-local-rtc 1 +``` + +同样,不要担心。我会解释为什么你在双启动设置中会遇到时间差。我会向你展示上面的命令是如何修复 Windows 双启动后的时间错误问题的。 + +### 为什么 Windows 和 Linux 在双启动时显示不同的时间? + +一台电脑有两个主要时钟:系统时钟和硬件时钟。 + +硬件时钟也叫 RTC([实时时钟][3])或 CMOS/BIOS 时钟。这个时钟在操作系统之外,在电脑的主板上。即使在你的系统关机后,它也会继续运行。 + +系统时钟是你在操作系统内看到的。 + +当计算机开机时,硬件时钟被读取并用于设置系统时钟。之后,系统时钟被用于跟踪时间。如果你的操作系统对系统时钟做了任何改变,比如改变时区等,它就会尝试将这些信息同步到硬件时钟上。 + +默认情况下,Linux 认为硬件时钟中存储的时间是 UTC,而不是本地时间。另一方面,Windows 认为硬件时钟上存储的时间是本地时间。这就是问题的开始。 + +让我用例子来解释一下。 + +你看我在加尔各答 UTC+5:30 时区。安装后,当我把 [Ubuntu 中的时区][4] 设置为加尔各答时区时,Ubuntu 会把这个时间信息同步到硬件时钟上,但会有 5:30 的偏移,因为对于 Linux 来说它必须是 UTC。 + +假设加尔各答时区的当前时间是 15:00,这意味着 UTC 时间是 09:30。 + +现在当我关闭系统并启动到 Windows 时,硬件时钟有 UTC 时间(本例中为 09:30)。但是 Windows 认为硬件时钟已经存储了本地时间。因此,它改变了系统时钟(应该显示为 15:00),而使用 UTC 时间(09:30)作为本地时间。因此,Windows 显示时间为 09:30,这比实际时间(我们的例子中为 15:00)早了 5:30。 + +![][5] + +同样,如果我在 Windows 中通过自动时区和时间按钮来设置正确的时间,你知道会发生什么吗?现在它将在系统上显示正确的时间(15:00),并将此信息(注意图片中的“同步你的时钟”选项)同步到硬件时钟。 + +如果你启动到 Linux,它会从硬件时钟读取时间,而硬件时钟是当地时间(15:00),但由于 Linux 认为它是 UTC 时间,所以它在系统时钟上增加了 5:30 的偏移。现在 Linux 显示的时间是 20:30,比实际时间超出晚了 5:30。 + +现在你了解了双启动中时差问题的根本原因,是时候看看如何解决这个问题了。 + +### 修复 Windows 在 Linux 双启动设置中显示错误时间的问题 + +有两种方法可以处理这个问题: + + * 让 Windows 将硬件时钟作为 UTC 时间 + * 让 Linux 将硬件时钟作为本地时间 + +在 Linux 中进行修改是比较容易的,因此我推荐使用第二种方法。 + +现在 Ubuntu 和大多数其他 Linux 发行版都使用 systemd,因此你可以使用 `timedatectl` 命令来更改设置。 + +你要做的是告诉你的 Linux 系统将硬件时钟(RTC)作为本地时间。你可以通过 `set-local-rtc` (为 RTC 设置本地时间)选项来实现: + +``` +timedatectl set-local-rtc 1 +``` + +如下图所示,RTC 现在使用本地时间。 + +![][6] + +现在如果你启动 Windows,它把硬件时钟当作本地时间,而这个时间实际上是正确的。当你在 Linux 中启动时,你的 Linux 系统知道硬件时钟使用的是本地时间,而不是 UTC。因此,它不会尝试添加这个时间的偏移。 + +这就解决了 Linux 和 Windows 双启动时的时差问题。 + +你会看到一个关于 RTC 不使用本地时间的警告。对于桌面设置,它不应该引起任何问题。至少,我想不出有什么问题。 + +希望我把事情给你讲清楚了。如果你还有问题,请在下面留言。 + +-------------------------------------------------------------------------------- + +via: https://itsfoss.com/wrong-time-dual-boot/ + +作者:[Abhishek Prakash][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/abhishek/ +[b]: https://github.com/lujun9972 +[1]: https://itsfoss.com/install-ubuntu-1404-dual-boot-mode-windows-8-81-uefi/ +[2]: https://itsfoss.com/why-use-linux/ +[3]: https://www.computerhope.com/jargon/r/rtc.htm +[4]: https://itsfoss.com/change-timezone-ubuntu/ +[5]: https://i2.wp.com/itsfoss.com/wp-content/uploads/2021/03/set-time-windows.jpg?resize=800%2C491&ssl=1 +[6]: https://i0.wp.com/itsfoss.com/wp-content/uploads/2021/03/set-local-time-for-rtc-ubuntu.png?resize=800%2C490&ssl=1 diff --git a/published/202104/20210402 A practical guide to using the git stash command.md b/published/202104/20210402 A practical guide to using the git stash command.md new file mode 100644 index 0000000000..51917981dd --- /dev/null +++ b/published/202104/20210402 A practical guide to using the git stash command.md @@ -0,0 +1,223 @@ +[#]: subject: (A practical guide to using the git stash command) +[#]: via: (https://opensource.com/article/21/4/git-stash) +[#]: author: (Ramakrishna Pattnaik https://opensource.com/users/rkpattnaik780) +[#]: collector: (lujun9972) +[#]: translator: (wxy) +[#]: reviewer: (wxy) +[#]: publisher: (wxy) +[#]: url: (https://linux.cn/article-13293-1.html) + +git stash 命令实用指南 +====== + +> 学习如何使用 `git stash` 命令,以及何时应该使用它。 + +![](https://img.linux.net.cn/data/attachment/album/202104/12/232830chuyr6lkzevrfuzr.jpg) + +版本控制是软件开发人员日常生活中不可分割的一部分。很难想象有哪个团队在开发软件时不使用版本控制工具。同样也很难想象有哪个开发者没有使用过(或没有听说过)Git。在 2018 年 Stackoverflow 开发者调查中,74298 名参与者中有 87.2% 的人 [使用 Git][2] 进行版本控制。 + +Linus Torvalds 在 2005 年创建了 Git 用于开发 Linux 内核。本文将介绍 `git stash` 命令,并探讨一些有用的暂存变更的选项。本文假定你对 [Git 概念][3] 有基本的了解,并对工作树、暂存区和相关命令有良好的理解。 + +### 为什么 git stash 很重要? + +首先要明白为什么在 Git 中暂存变更很重要。假设 Git 没有暂存变更的命令。当你正在一个有两个分支(A 和 B)的仓库上工作时,这两个分支已经分叉了一段时间,并且有不同的头。当你正在处理 A 分支的一些文件时,你的团队要求你修复 B 分支的一个错误。你迅速将你的修改保存到 A 分支(但没有提交),并尝试用 `git checkout B` 来签出 B 分支。Git 会立即中止了这个操作,并抛出错误:“你对以下文件的本地修改会被该签出覆盖……请在切换分支之前提交你的修改或将它们暂存起来。” + +在这种情况下,有几种方法可以启用分支切换: + + * 在分支 A 中创建一个提交,提交并推送你的修改,以修复 B 中的错误,然后再次签出 A,并运行 `git reset HEAD^` 来恢复你的修改。 + * 手动保留不被 Git 跟踪的文件中的改动。 + +第二种方法是个馊主意。第一种方法虽然看起来很传统,但却不太灵活,因为保存未完成工作的修改会被当作一个检查点,而不是一个仍在进行中的补丁。这正是设计 `git stash` 的场景。 + +`git stash` 将未提交的改动保存在本地,让你可以进行修改、切换分支以及其他 Git 操作。然后,当你需要的时候,你可以重新应用这些存储的改动。暂存是本地范围的,不会被 `git push` 推送到远程。 + +### 如何使用 git stash + +下面是使用 `git stash` 时要遵循的顺序: + + 1. 将修改保存到分支 A。 + 2. 运行 `git stash`。 + 3. 签出分支 B。 + 4. 修正 B 分支的错误。 + 5. 提交并(可选)推送到远程。 + 6. 查看分支 A + 7. 运行 `git stash pop` 来取回你的暂存的改动。 + +`git stash` 将你对工作目录的修改存储在本地(在你的项目的 `.git` 目录内,准确的说是 `/.git/refs/stash`),并允许你在需要时检索这些修改。当你需要在不同的上下文之间切换时,它很方便。它允许你保存以后可能需要的更改,是让你的工作目录干净同时保持更改完整的最快方法。 + +### 如何创建一个暂存 + +暂存你的变化的最简单的命令是 `git stash`: + +``` +$ git stash +Saved working directory and index state WIP on master; d7435644 Feat: configure graphql endpoint +``` + +默认情况下,`git stash` 存储(或称之为“暂存”)未提交的更改(已暂存和未暂存的文件),并忽略未跟踪和忽略的文件。通常情况下,你不需要暂存未跟踪和忽略的文件,但有时它们可能会干扰你在代码库中要做的其他事情。 + +你可以使用附加选项让 `git stash` 来处理未跟踪和忽略的文件: + + * `git stash -u` 或 `git stash --includ-untracked` 储存未追踪的文件。 + * `git stash -a` 或 `git stash --all` 储存未跟踪的文件和忽略的文件。 + +要存储特定的文件,你可以使用 `git stash -p` 或 `git stash -patch` 命令: + +``` +$ git stash --patch +diff --git a/.gitignore b/.gitignore +index 32174593..8d81be6e 100644 +--- a/.gitignore ++++ b/.gitignore +@@ -3,6 +3,7 @@ + # dependencies + node_modules/ + /.pnp ++f,fmfm + .pnp.js + + # testing +(1/1) Stash this hunk [y,n,q,a,d,e,?]? +``` + +### 列出你的暂存 + +你可以用 `git stash list` 命令查看你的暂存。暂存是后进先出(LIFO)方式保存的: + +``` +$ git stash list +stash@{0}: WIP on master: d7435644 Feat: configure graphql endpoint +``` + +默认情况下,暂存会显示在你创建它的分支和提交的顶部,被标记为 `WIP`。然而,当你有多个暂存时,这种有限的信息量并没有帮助,因为很难记住或单独检查它们的内容。要为暂存添加描述,可以使用命令 `git stash save `: + +``` +$ git stash save "remove semi-colon from schema" +Saved working directory and index state On master: remove semi-colon from schema + +$ git stash list +stash@{0}: On master: remove semi-colon from schema +stash@{1}: WIP on master: d7435644 Feat: configure graphql endpoint +``` + +### 检索暂存起来的变化 + +你可以用 `git stash apply` 和 `git stash pop` 这两个命令来重新应用暂存的变更。这两个命令都会重新应用最新的暂存(即 `stash@{0}`)中的改动。`apply` 会重新应用变更;而 `pop` 则会将暂存的变更重新应用到工作副本中,并从暂存中删除。如果你不需要再次重新应用被暂存的更改,则首选 `pop`。 + +你可以通过传递标识符作为最后一个参数来选择你想要弹出或应用的储藏: + +``` +$ git stash pop stash@{1} +``` + +或 + +``` +$ git stash apply stash@{1} +``` + +### 清理暂存 + +删除不再需要的暂存是好的习惯。你必须用以下命令手动完成: + + * `git stash clear` 通过删除所有的暂存库来清空该列表。 + * `git stash drop ` 从暂存列表中删除一个特定的暂存。 + +### 检查暂存的差异 + +命令 `git stash show ` 允许你查看一个暂存的差异: + +``` +$ git stash show stash@{1} +console/console-init/ui/.graphqlrc.yml        |   4 +- +console/console-init/ui/generated-frontend.ts | 742 +++++++++--------- +console/console-init/ui/package.json          |   2 +- +``` + +要获得更详细的差异,需要传递 `--patch` 或 `-p` 标志: + +``` +$ git stash show stash@{0} --patch +diff --git a/console/console-init/ui/package.json b/console/console-init/ui/package.json +index 755912b97..5b5af1bd6 100644 +--- a/console/console-init/ui/package.json ++++ b/console/console-init/ui/package.json +@@ -1,5 +1,5 @@ + { +- "name": "my-usepatternfly", ++ "name": "my-usepatternfly-2", +  "version": "0.1.0", +  "private": true, +  "proxy": "http://localhost:4000" +diff --git a/console/console-init/ui/src/AppNavHeader.tsx b/console/console-init/ui/src/AppNavHeader.tsx +index a4764d2f3..da72b7e2b 100644 +--- a/console/console-init/ui/src/AppNavHeader.tsx ++++ b/console/console-init/ui/src/AppNavHeader.tsx +@@ -9,8 +9,8 @@ import { css } from "@patternfly/react-styles"; + +interface IAppNavHeaderProps extends PageHeaderProps { +- toolbar?: React.ReactNode; +- avatar?: React.ReactNode; ++ toolbar?: React.ReactNode; ++ avatar?: React.ReactNode; +} + +export class AppNavHeader extends React.Component<IAppNavHeaderProps>{ +  render() +``` + +### 签出到新的分支 + +你可能会遇到这样的情况:一个分支和你的暂存中的变更有分歧,当你试图重新应用暂存时,会造成冲突。一个简单的解决方法是使用 `git stash branch ` 命令,它将根据创建暂存时的提交创建一个新分支,并将暂存中的修改弹出: + +``` +$ git stash branch test_2 stash@{0} +Switched to a new branch 'test_2' +On branch test_2 +Changes not staged for commit: +(use "git add ..." to update what will be committed) +(use "git restore ..." to discard changes in working directory) +modified: .graphqlrc.yml +modified: generated-frontend.ts +modified: package.json +no changes added to commit (use "git add" and/or "git commit -a") +Dropped stash@{0} (fe4bf8f79175b8fbd3df3c4558249834ecb75cd1) +``` + +### 在不打扰暂存参考日志的情况下进行暂存 + +在极少数情况下,你可能需要创建一个暂存,同时保持暂存参考日志(`reflog`)的完整性。这些情况可能出现在你需要一个脚本作为一个实现细节来暂存的时候。这可以通过 `git stash create` 命令来实现;它创建了一个暂存条目,并返回它的对象名,而不将其推送到暂存参考日志中: + +``` +$ git stash create "sample stash" +63a711cd3c7f8047662007490723e26ae9d4acf9 +``` + +有时,你可能会决定将通过 `git stash create` 创建的暂存条目推送到暂存参考日志: + +``` +$ git stash store -m "sample stash testing.." "63a711cd3c7f8047662007490723e26ae9d4acf9" +$ git stash list +stash @{0}: sample stash testing.. +``` + +### 结论 + +我希望你觉得这篇文章很有用,并学到了新的东西。如果我遗漏了任何有用的使用暂存的选项,请在评论中告诉我。 + +-------------------------------------------------------------------------------- + +via: https://opensource.com/article/21/4/git-stash + +作者:[Ramakrishna Pattnaik][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/rkpattnaik780 +[b]: https://github.com/lujun9972 +[1]: https://opensource.com/sites/default/files/styles/image-full-size/public/lead-images/lenovo-thinkpad-laptop-window-focus.png?itok=g0xPm2kD (young woman working on a laptop) +[2]: https://insights.stackoverflow.com/survey/2018#work-_-version-control +[3]: https://opensource.com/downloads/cheat-sheet-git diff --git a/published/202104/20210403 What problems do people solve with strace.md b/published/202104/20210403 What problems do people solve with strace.md new file mode 100644 index 0000000000..3160de5910 --- /dev/null +++ b/published/202104/20210403 What problems do people solve with strace.md @@ -0,0 +1,136 @@ +[#]: subject: (What problems do people solve with strace?) +[#]: via: (https://jvns.ca/blog/2021/04/03/what-problems-do-people-solve-with-strace/) +[#]: author: (Julia Evans https://jvns.ca/) +[#]: collector: (lujun9972) +[#]: translator: (wxy) +[#]: reviewer: (wxy) +[#]: publisher: (wxy) +[#]: url: (https://linux.cn/article-13267-1.html) + +strace 可以解决什么问题? +====== + +![](https://img.linux.net.cn/data/attachment/album/202104/05/094825y66126r56z361rz1.jpg) + +昨天我 [在 Twitter 上询问大家用 strace 解决了什么问题?][1],和往常一样,大家真的是给出了自己的答案! 我收到了大约 200 个答案,然后花了很多时间手动将它们归为 9 类。 + +这些解决的问题都是关于寻找程序依赖的文件、找出程序卡住或慢的原因、或者找出程序失败的原因。这些总体上与我自己使用 `strace` 的内容相吻合,但也有一些我没有想到的东西! + +我不打算在这篇文章里解释什么是 `strace`,但我有一本 [关于它的免费杂志][2] 和 [一个讲座][3] 以及 [很多博文][4]。 + +### 问题 1:配置文件在哪里? + +最受欢迎的问题是“这个程序有一个配置文件,但我不知道它在哪里”。这可能也是我最常使用 `strace` 解决的问题,因为这是个很简单的问题。 + +这很好,因为一个程序有一百万种方法来记录它的配置文件在哪里(在手册页、网站上、`--help`等),但只有一种方法可以让它真正打开它(用系统调用!)。 + +### 问题 2:这个程序还依赖什么文件? + +你也可以使用 `strace` 来查找程序依赖的其他类型的文件,比如: + + * 动态链接库(“为什么我的程序加载了这个错误版本的 `.so` 文件?"),比如 [我在 2014 年调试的这个 ruby 问题][5] + * 它在哪里寻找它的 Ruby gem(Ruby 出现了几次这种情况!) + * SSL 根证书 + * 游戏的存档文件 + * 一个闭源程序的数据文件 + * [哪些 node_modules 文件没有被使用][6] + +### 问题 3:为什么这个程序会挂掉? + +你有一个程序,它只是坐在那里什么都不做,这是怎么回事?这个问题特别容易回答,因为很多时候你只需要运行 `strace -p PID`,看看当前运行的是什么系统调用。你甚至不需要看几百行的输出。 + +答案通常是“正在等待某种 I/O”。“为什么会卡住”的一些可能的答案(虽然还有很多!): + + * 它一直在轮询 `select()` + * 正在 `wait()` 等待一个子进程完成 + * 它在向某个没有响应的东西发出网络请求 + * 正在进行 `write()`,但由于缓冲区已满而被阻止。 + * 它在 stdin 上做 `read()`,等待输入。 + +有人还举了一个很好的例子,用 `strace` 调试一个卡住的 `df` 命令:“用 `strace df -h` 你可以找到卡住的挂载,然后卸载它”。 + +### 问题 4:这个程序卡住了吗? + +这是上一个问题的变种:有时一个程序运行的时间比你预期的要长,你只是想知道它是否卡住了,或者它是否还在继续进行。 + +只要程序在运行过程中进行系统调用,用 `strace` 就可以超简单地回答这个问题:只需 `strace` 它,看看它是否在进行新的系统调用! + +### 问题 5:为什么这个程序很慢? + +你可以使用 `strace` 作为一种粗略的剖析工具:`strace -t` 会显示每次系统调用的时间戳,这样你就可以寻找大的漏洞,找到罪魁祸首。 + +以下是 Twitter 上 9 个人使用 `strace` 调试“为什么这个程序很慢?”的小故事。 + + * 早在 2000 年,我帮助支持的一个基于 Java 的网站在适度的负载下奄奄一息:页面加载缓慢,甚至完全加载不出来。我们对 J2EE 应用服务器进行了测试,发现它每次只读取一个类文件。开发人员没有使用 BufferedReader,这是典型的 Java 错误。 + * 优化应用程序的启动时间……运行 `strace` 可以让人大开眼界,因为有大量不必要的文件系统交互在进行(例如,在同一个配置文件上反复打开/读取/关闭;在一个缓慢的 NFS 挂载上加载大量的字体文件,等等)。 + * 问自己为什么在 PHP 中从会话文件中读取(通常是小于 100 字节)非常慢。结果发现一些 `flock` 系统调用花了大约 60 秒。 + * 一个程序表现得异常缓慢。使用 `strace` 找出它在每次请求时,通过从 `/dev/random` 读取数据并耗尽熵来重新初始化其内部伪随机数发生器。 + * 我记得最近一件事是连接到一个任务处理程序,看到它有多少网络调用(这是意想不到的)。 + * `strace` 显示它打开/读取同一个配置文件数千次。 + * 服务器随机使用 100% 的 CPU 时间,实际流量很低。原来是碰到打开文件数限制,接受一个套接字时,得到 EMFILE 错误而没有报告,然后一直重试。 + * 一个工作流运行超慢,但是没有日志,结果它做一个 POST 请求花了 30 秒而超时,然后重试了 5 次……结果后台服务不堪重负,但是也没有可视性。 + * 使用 `strace` 注意到 `gethostbyname()` 需要很长时间才能返回(你不能直接看到 `gethostbyname`,但你可以看到 `strace` 中的 DNS 数据包) + +### 问题 6:隐藏的权限错误 + +有时候程序因为一个神秘的原因而失败,但问题只是有一些它没有权限打开的文件。在理想的世界里,程序会报告这些错误(“Error opening file /dev/whatever: permission denied”),当然这个世界并不完美,所以 `strace` 真的可以帮助解决这个问题! + +这其实是我最近使用 `strace` 做的事情。我使用了一台 AxiDraw 绘图仪,当我试图启动它时,它打印出了一个难以理解的错误信息。我 `strace` 它,结果发现我的用户没有权限打开 USB 设备。 + +### 问题 7:正在使用什么命令行参数? + +有时候,一个脚本正在运行另一个程序,你想知道它传递的是什么命令行标志! + +几个来自 Twitter 的例子。 + + * 找出实际上是用来编译代码的编译器标志 + * 由于命令行太长,命令失败了 + +### 问题 8:为什么这个网络连接失败? + +基本上,这里的目标是找到网络连接的域名 / IP 地址。你可以通过 DNS 请求来查找域名,或者通过 `connect` 系统调用来查找 IP。 + +一般来说,当 `tcpdump` 因为某些原因不能使用或者只是因为比较熟悉 `strace` 时,就经常会使用 `strace` 调试网络问题。 + +### 问题 9:为什么这个程序以一种方式运行时成功,以另一种方式运行时失败? + +例如: + + * 同样的二进制程序在一台机器上可以运行,在另一台机器上却失败了 + * 可以运行,但被 systemd 单元文件生成时失败 + * 可以运行,但以 `su - user /some/script` 的方式运行时失败 + * 可以运行,作为 cron 作业运行时失败 + +能够比较两种情况下的 `strace` 输出是非常有用的。虽然我在调试“以我的用户身份工作,而在同一台计算机上以不同方式运行时却失败了”时,第一步是“看看我的环境变量”。 + +### 我在做什么:慢慢地建立一些挑战 + +我之所以会想到这个问题,是因为我一直在慢慢地进行一些挑战,以帮助人们练习使用 `strace` 和其他命令行工具。我的想法是,给你一个问题,一个终端,你可以自由地以任何方式解决它。 + +所以我的目标是用它来建立一些你可以用 `strace` 解决的练习题,这些练习题反映了人们在现实生活中实际使用它解决的问题。 + +### 就是这样! + +可能还有更多的问题可以用 `strace` 解决,我在这里还没有讲到,我很乐意听到我错过了什么! + +我真的很喜欢看到很多相同的用法一次又一次地出现:至少有 20 个不同的人回答说他们使用 `strace` 来查找配置文件。而且和以往一样,我觉得这样一个简单的工具(“跟踪系统调用!”)可以用来解决这么多不同类型的问题,真的很令人高兴。 + +-------------------------------------------------------------------------------- + +via: https://jvns.ca/blog/2021/04/03/what-problems-do-people-solve-with-strace/ + +作者:[Julia Evans][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://jvns.ca/ +[b]: https://github.com/lujun9972 +[1]: https://twitter.com/b0rk/status/1378014888405168132 +[2]: https://wizardzines.com/zines/strace +[3]: https://www.youtube.com/watch?v=4pEHfGKB-OE +[4]: https://jvns.ca/categories/strace +[5]: https://jvns.ca/blog/2014/03/10/debugging-shared-library-problems-with-strace/ +[6]: https://indexandmain.com/post/shrink-node-modules-with-refining diff --git a/published/202104/20210404 Converting Multiple Markdown Files into HTML or Other Formats in Linux.md b/published/202104/20210404 Converting Multiple Markdown Files into HTML or Other Formats in Linux.md new file mode 100644 index 0000000000..fea402d238 --- /dev/null +++ b/published/202104/20210404 Converting Multiple Markdown Files into HTML or Other Formats in Linux.md @@ -0,0 +1,146 @@ +[#]: subject: "Converting Multiple Markdown Files into HTML or Other Formats in Linux" +[#]: via: "https://itsfoss.com/convert-markdown-files/" +[#]: author: "Bill Dyer https://itsfoss.com/author/bill/" +[#]: collector: "lujun9972" +[#]: translator: "lxbwolf" +[#]: reviewer: "wxy" +[#]: publisher: "wxy" +[#]: url: "https://linux.cn/article-13274-1.html" + +在 Linux 中把多个 Markdown 文件转换成 HTML 或其他格式 +====== + +![](https://img.linux.net.cn/data/attachment/album/202104/07/095441bztj6cz68j89568u.jpg) + +很多时候我与 Markdown 打交道的方式是,先写完一个文件,然后把它转换成 HTML 或其他格式。也有些时候,需要创建一些新的文件。当我要写多个 Markdown 文件时,通常要把他们全部写完之后才转换它们。 + +我用 `pandoc` 来转换文件,它可以一次性地转换所有 Markdown 文件。 + +Markdown 格式的文件可以转换成 .html 文件,有时候我需要把它转换成其他格式,如 epub,这个时候 [pandoc][1] 就派上了用场。我更喜欢用命令行,因此本文我会首先介绍它,然而你还可以使用 [VSCodium][2] 在非命令行下完成转换。后面我也会介绍它。 + +### 使用 pandoc 把多个 Markdown 文件转换成其他格式(命令行方式) + +你可以在 Ubuntu 及其他 Debian 系发行版本终端输入下面的命令来快速开始: + +``` +sudo apt-get install pandoc +``` + +本例中,在名为 `md_test` 目录下我有四个 Markdown 文件需要转换。 + +``` +[email protected]:~/Documents/md_test$ ls -l *.md +-rw-r--r-- 1 bdyer bdyer 3374 Apr 7 2020 file01.md +-rw-r--r-- 1 bdyer bdyer 782 Apr 2 05:23 file02.md +-rw-r--r-- 1 bdyer bdyer 9257 Apr 2 05:21 file03.md +-rw-r--r-- 1 bdyer bdyer 9442 Apr 2 05:21 file04.md +[email protected]:~/Documents/md_test$ +``` + +现在还没有 HTML 文件。现在我要对这些文件使用 `pandoc`。我会运行一行命令来实现: + + * 调用 `pandoc` + * 读取 .md 文件并导出为 .html + +下面是我要运行的命令: + +``` +for i in *.md ; do echo "$i" && pandoc -s $i -o $i.html ; done +``` + +如果你不太理解上面的命令中的 `;`,可以参考 [在 Linux 中一次执行多个命令][3]。 + +我执行命令后,运行结果如下: + +``` +[email protected]:~/Documents/md_test$ for i in *.md ; do echo "$i" && pandoc -s $i -o $i.html ; done +file01.md +file02.md +file03.md +file04.md +[email protected]:~/Documents/md_test$ +``` + +让我再使用一次 `ls` 命令来看看是否已经生成了 HTML 文件: + +``` +[email protected]:~/Documents/md_test$ ls -l *.html +-rw-r--r-- 1 bdyer bdyer 4291 Apr 2 06:08 file01.md.html +-rw-r--r-- 1 bdyer bdyer 1781 Apr 2 06:08 file02.md.html +-rw-r--r-- 1 bdyer bdyer 10272 Apr 2 06:08 file03.md.html +-rw-r--r-- 1 bdyer bdyer 10502 Apr 2 06:08 file04.md.html +[email protected]:~/Documents/md_test$ +``` + +转换很成功,现在你已经有了四个 HTML 文件,它们可以用在 Web 服务器上。 + +pandoc 功能相当多,你可以通过指定输出文件的扩展名来把 Markdown 文件转换成其他支持的格式。不难理解它为什么会被认为是[最好的写作开源工具][4]。 + +### 使用 VSCodium 把 Markdown 文件转换成 HTML(GUI 方式) + +就像我们前面说的那样,我通常使用命令行,但是对于批量转换,我不会使用命令行,你也不必。VSCode 或 [VSCodium][7] 可以完成批量操作。你只需要安装一个 Markdown-All-in-One 扩展,就可以在一次运行中转换多个 Markdown 文件。 + +有两种方式安装这个扩展: + + * VSCodium 的终端 + * VSCodium 的插件管理器 + +通过 VSCodium 的终端安装该扩展: + + 1. 点击菜单栏的 `终端`。会打开终端面板 + 2. 输入,或[复制下面的命令并粘贴到终端][8]: + +``` +codium --install-extension yzhang.markdown-all-in-one +``` + +**注意**:如果你使用的 VSCode 而不是 VSCodium,那么请把上面命令中的 `codium` 替换为 `code` + +![][9] + +第二种安装方式是通过 VSCodium 的插件/扩展管理器: + + 1. 点击 VSCodium 窗口左侧的块区域。会出现一个扩展列表,列表最上面有一个搜索框。 + 2. 在搜索框中输入 “Markdown All in One”。在列表最上面会出现该扩展。点击 “安装” 按钮来安装它。如果你已经安装过,在安装按钮的位置会出现一个齿轮图标。 + +![][10] + +安装完成后,你可以打开含有需要转换的 Markdown 文件的文件夹。 + +点击 VSCodium 窗口左侧的纸张图标。你可以选择文件夹。打开文件夹后,你需要打开至少一个文件。你也可以打开多个文件,但是最少打开一个。 + +当打开文件后,按下 `CTRL+SHIFT+P` 唤起命令面板。然后,在出现的搜索框中输入 `Markdown`。当你输入时,会出现一列 Markdown 相关的命令。其中有一个是 `Markdown All in One: Print documents to HTML` 命令。点击它: + +![][11] + +你需要选择一个文件夹来存放这些文件。它会自动创建一个 `out` 目录,转换后的 HTML 文件会存放在 `out` 目录下。从下面的图中可以看到,Markdown 文档被转换成了 HTML 文件。在这里,你可以打开、查看、编辑这些 HTML 文件。 + +![][12] + +在等待转换 Markdown 文件时,你可以更多地集中精力在写作上。当你准备好时,你就可以把它们转换成 HTML —— 你可以通过两种方式转换它们。 + +-------------------------------------------------------------------------------- + +via: https://itsfoss.com/convert-markdown-files/ + +作者:[Bill Dyer][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://itsfoss.com/author/bill/ +[b]: https://github.com/lujun9972 +[1]: https://pandoc.org/ +[2]: https://vscodium.com/ +[3]: https://itsfoss.com/run-multiple-commands-linux/ +[4]: https://itsfoss.com/open-source-tools-writers/ +[5]: https://i1.wp.com/itsfoss.com/wp-content/uploads/2016/10/Best-Markdown-Editors-for-Linux.jpg?fit=800%2C450&ssl=1 +[6]: https://itsfoss.com/best-markdown-editors-linux/ +[7]: https://itsfoss.com/vscodium/ +[8]: https://itsfoss.com/copy-paste-linux-terminal/ +[9]: https://i0.wp.com/itsfoss.com/wp-content/uploads/2021/04/vscodium_terminal.jpg?resize=800%2C564&ssl=1 +[10]: https://i1.wp.com/itsfoss.com/wp-content/uploads/2021/04/vscodium_extension_select.jpg?resize=800%2C564&ssl=1 +[11]: https://i1.wp.com/itsfoss.com/wp-content/uploads/2021/04/vscodium_markdown_function_options.jpg?resize=800%2C564&ssl=1 +[12]: https://i0.wp.com/itsfoss.com/wp-content/uploads/2021/04/vscodium_html_filelist_shown.jpg?resize=800%2C564&ssl=1 diff --git a/published/202104/20210405 7 Git tips for managing your home directory.md b/published/202104/20210405 7 Git tips for managing your home directory.md new file mode 100644 index 0000000000..67d8a3ceea --- /dev/null +++ b/published/202104/20210405 7 Git tips for managing your home directory.md @@ -0,0 +1,135 @@ +[#]: subject: (7 Git tips for managing your home directory) +[#]: via: (https://opensource.com/article/21/4/git-home) +[#]: author: (Seth Kenlon https://opensource.com/users/seth) +[#]: collector: (lujun9972) +[#]: translator: (stevenzdg988) +[#]: reviewer: (wxy) +[#]: publisher: (wxy) +[#]: url: (https://linux.cn/article-13313-1.html) + +7个管理家目录的 Git 技巧 +====== + +> 这是我怎样设置 Git 来管理我的家目录的方法。 + +![](https://img.linux.net.cn/data/attachment/album/202104/20/095224mtq14szo7opfofq7.jpg) + +我有好几台电脑。一台笔记本电脑用于工作,一台工作站放在家里,一台树莓派(或四台),一台 [Pocket CHIP][2],一台 [运行各种不同的 Linux 的 Chromebook][3],等等。我曾经在每台计算机上或多或少地按照相同的步骤设置我的用户环境,也经常告诉自己让每台计算机都略有不同。例如,我在工作中比在家里更经常使用 [Bash 别名][4],并且我在家里使用的辅助脚本可能对工作没有用。 + +这些年来,我对各种设备的期望开始相融,我会忘记我在家用计算机上建立的功能没有移植到我的工作计算机上,诸如此类。我需要一种标准化我的自定义工具包的方法。使我感到意外的答案是 Git。 + +Git 是版本跟踪软件。它以既可以用在非常大的开源项目也可以用在极小的开源项目而闻名,甚至最大的专有软件公司也在用它。但是它是为源代码设计的,而不是用在一个装满音乐和视频文件、游戏、照片等的家目录。我听说过有人使用 Git 管理其家目录,但我认为这是程序员们进行的一项附带实验,而不是像我这样的现实生活中的用户。 + +用 Git 管理我的家目录是一个不断发展的过程。随着时间的推移我一直在学习和适应。如果你决定使用 Git 管理家目录,则可能需要记住以下几点。 + +### 1、文本和二进制位置 + +![家目录][5] + +当由 Git 管理时,除了配置文件之外,你的家目录对于所有内容而言都是“无人之地”。这意味着当你打开主目录时,除了可预见的目录的列表之外,你什么都看不到。不应有任何杂乱无章的照片或 LibreOffice 文档,也不应有 “我就在这里放一分钟” 的临时文件。 + +原因很简单:使用 Git 管理家目录时,家目录中所有 _未_ 提交的内容都会变成噪音。每次执行 `git status` 时,你都必须翻过去之前 Git 未跟踪的任何文件,因此将这些文件保存在子目录(添加到 `.gitignore` 文件中)至关重要。 + +许多 Linux 发行版提供了一组默认目录: + + * `Documents` + * `Downloads` + * `Music` + * `Photos` + * `Templates` + * `Videos` + +如果需要,你可以创建更多。例如,我把创作的音乐(`Music`)和购买来聆听的音乐(`Albums`)区分开来。同样,我的电影(`Cinema`)目录包含了其他人的电影,而视频(`Videos`)目录包含我需要编辑的视频文件。换句话说,我的默认目录结构比大多数 Linux 发行版提供的默认设置更详细,但是我认为这样做有好处。如果没有适合你的目录结构,你更会将其存放在家目录中,因为没有更好的存放位置,因此请提前考虑并规划好适合你的工作目录。你以后总是可以添加更多,但是最好先开始擅长的。 + +### 2、、设置最优的 `.gitignore` + +清理家目录后,你可以像往常一样将其作为 Git 存储库实例化: + +``` +$ cd +$ git init . +``` + +你的 Git 仓库中还没有任何内容,你的家目录中的所有内容均未被跟踪。你的第一项工作是筛选未跟踪文件的列表,并确定要保持未跟踪状态的文件。要查看未跟踪的文件: + +``` +$ git status +  .AndroidStudio3.2/ +  .FBReader/ +  .ICEauthority +  .Xauthority +  .Xdefaults +  .android/ +  .arduino15/ +  .ash_history +[...] +``` + +根据你使用家目录的时间长短,此列表可能很长。简单的是你在上一步中确定的目录。通过将它们添加到名为 `.gitignore` 的隐藏文件中,你告诉 Git 停止将它们列为未跟踪文件,并且永远不对其进行跟踪: + +``` +$ \ls -lg | grep ^d | awk '{print $8}' >> ~/.gitignore +``` + +完成后,浏览 `git status` 所示的其余未跟踪文件,并确定是否有其他文件需要排除。这个过程帮助我发现了几个陈旧的配置文件和目录,这些文件和目录最终被我全部丢弃了,而且还发现了一些特定于一台计算机的文件和目录。我在这里非常严格,因为许多配置文件在自动生成时会表现得更好。例如,我从不提交我的 KDE 配置文件,因为许多文件包含了诸如最新文档之类的信息以及其他机器上不存在的其他元素。 + +我会跟踪我的个性化配置文件、脚本和实用程序、配置文件和 Bash 配置,以及速查表和我经常引用的其他文本片段。如果有软件主要负责维护的文件,则将其忽略。当对一个文件不确定时,我将其忽略。你以后总是可以取消忽略它(通过从 `.gitignore` 文件中删除它)。 + +### 3、了解你的数据 + +我使用的是 KDE,因此我使用开源扫描程序 [Filelight][7] 来了解我的数据概况。Filelight 为你提供了一个图表,可让你查看每个目录的大小。你可以浏览每个目录以查看占用了空间的内容,然后回溯调查其他地方。这是一个令人着迷的系统视图,它使你可以以全新的方式看待你的文件。 + +![Filelight][8] + +使用 Filelight 或类似的实用程序查找不需要提交的意外数据缓存。例如,KDE 文件索引器(Baloo)生成了大量特定于其主机的数据,我绝对不希望将其传输到另一台计算机。 + +### 4、不要忽略你的 `.gitignore` 文件 + +在某些项目中,我告诉 Git 忽略我的 `.gitignore` 文件,因为有时我要忽略的内容特定于我的工作目录,并且我不认为同一项目中的其他开发人员需要我告诉他们 `.gitignore` 文件应该是什么样子。因为我的家目录仅供我使用,所以我 _不_ 会忽略我的家目录的 `.gitignore` 文件。我将其与其他重要文件一起提交,因此它已在我的所有系统中被继承。当然,从家目录的角度来看,我所有的系统都是相同的:它们具有一组相同的默认文件夹和许多相同的隐藏配置文件。 + +### 5、不要担心二进制文件 + +我对我的系统进行了数周的严格测试,确信将二进制文件提交到 Git 绝对不是明智之举。我试过 GPG 加密的密码文件、试过 LibreOffice 文档、JPEG、PNG 等等。我甚至有一个脚本,可以在将 LibreOffice 文件添加到 Git 之前先解压缩,提取其中的 XML,以便仅提交 XML,然后重新构建 LibreOffice 文件,以便可以在 LibreOffice 中继续工作。我的理论是,提交 XML 会比使用 ZIP 文件(LibreOffice 文档实际上就是一个 ZIP 文件)会让 Git 存储库更小一些。 + +令我惊讶的是,我发现偶尔提交一些二进制文件并没有大幅增加我的 Git 存储库的大小。我使用 Git 已经很长时间了,我知道如果我要提交几千兆的二进制数据,我的存储库将会受到影响,但是偶尔提交几个二进制文件也不是不惜一切代价要避免的紧急情况。 + +有了这种信心,我将字体 OTF 和 TTF 文件添加到我的标准主存储库,以及 GDM 的 `.face` 文件以及其他偶尔小型二进制 Blob 文件。不要想太多,不要浪费时间去避免它。只需提交即可。 + +### 6、使用私有存储库 + +即使托管方提供了私人帐户,也不要将你的主目录提交到公共 Git 存储库。如果你像我一样,拥有 SSH 密钥、GPG 密钥链和 GPG 加密的文件,这些文件不应该出现在任何人的服务器上,而应该出现在我自己的服务器上。 + +我在树莓派上 [运行本地 Git 服务器][9](这比你想象的要容易),因此我可以在家里时随时更新任何一台计算机。我是一名远程工作者,所以通常情况下就足够了,但是我也可以在旅行时通过 [虚拟私人网络][10] 访问我的计算机。 + +### 7、要记得推送 + +Git 的特点是,只有当你告诉它要推送改动时,它才会把改动推送到你的服务器上。如果你是 Git 的老用户,则此过程可能对你很自然。对于可能习惯于 Nextcloud 或 Syncthing 自动同步的新用户,这可能需要一些时间来适应。 + +### Git 家目录 + +使用 Git 管理我的常用文件,不仅使我在不同设备上的生活更加便利。我知道我拥有所有配置和实用程序脚本的完整历史记录,这会鼓励我尝试新的想法,因为如果结果变得 _很糟糕_,则很容易回滚我的更改。Git 曾将我从在 `.bashrc` 文件中一个欠考虑的 `umask` 设置中解救出来、从深夜对包管理脚本的拙劣添加中解救出来、从当时看似很酷的 [rxvt][11] 配色方案的修改中解救出来,也许还有其他一些错误。在家目录中尝试 Git 吧,因为这些提交会让家目录融合在一起。 + +-------------------------------------------------------------------------------- + +via: https://opensource.com/article/21/4/git-home + +作者:[Seth Kenlon][a] +选题:[lujun9972][b] +译者:[stevenzdg988](https://github.com/stevenzdg988) +校对:[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/house_home_colors_live_building.jpg?itok=HLpsIfIL (Houses in a row) +[2]: https://opensource.com/article/17/2/pocketchip-or-pi +[3]: https://opensource.com/article/21/2/chromebook-linux +[4]: https://opensource.com/article/17/5/introduction-alias-command-line-tool +[5]: https://opensource.com/sites/default/files/uploads/home-git.jpg (home directory) +[6]: https://creativecommons.org/licenses/by-sa/4.0/ +[7]: https://utils.kde.org/projects/filelight +[8]: https://opensource.com/sites/default/files/uploads/filelight.jpg (Filelight) +[9]: https://opensource.com/life/16/8/how-construct-your-own-git-server-part-6 +[10]: https://www.redhat.com/sysadmin/run-your-own-vpn-libreswan +[11]: https://opensource.com/article/19/10/why-use-rxvt-terminal diff --git a/published/202104/20210406 Experiment on your code freely with Git worktree.md b/published/202104/20210406 Experiment on your code freely with Git worktree.md new file mode 100644 index 0000000000..b684e0e46f --- /dev/null +++ b/published/202104/20210406 Experiment on your code freely with Git worktree.md @@ -0,0 +1,135 @@ +[#]: subject: (Experiment on your code freely with Git worktree) +[#]: via: (https://opensource.com/article/21/4/git-worktree) +[#]: author: (Seth Kenlon https://opensource.com/users/seth) +[#]: collector: (lujun9972) +[#]: translator: (wxy) +[#]: reviewer: (wxy) +[#]: publisher: (wxy) +[#]: url: (https://linux.cn/article-13301-1.html) + +使用 Git 工作树对你的代码进行自由实验 +====== + +> 获得自由尝试的权利,同时在你的实验出错时可以安全地拥有一个新的、链接的克隆存储库。 + +![](https://img.linux.net.cn/data/attachment/album/202104/16/085512x3auafu5uaymk52u.jpg) + +Git 的设计部分是为了进行实验。如果你知道你的工作会被安全地跟踪,并且在出现严重错误时有安全状态存在,你就不会害怕尝试新的想法。不过,创新的部分代价是,你很可能会在这个过程中弄得一团糟。文件会被重新命名、移动、删除、更改、切割成碎片;新的文件被引入;你不打算跟踪的临时文件会在你的工作目录中占据一席之地等等。 + +简而言之,你的工作空间变成了纸牌屋,在“快好了!”和“哦,不,我做了什么?”之间岌岌可危地平衡着。那么,当你需要把仓库恢复到下午的一个已知状态,以便完成一些真正的工作时,该怎么办?我立刻想到了 `git branch` 和 [git stash][2] 这两个经典命令,但这两个命令都不是用来处理未被跟踪的文件的,而且文件路径的改变和其他重大的转变也会让人困惑,它们只能把工作暂存(`stash`)起来以备后用。解决这个需求的答案是 Git 工作树。 + +### 什么是 Git 工作树 + +Git 工作树worktree是 Git 仓库的一个链接副本,允许你同时签出多个分支。工作树与主工作副本的路径是分开的,它可以处于不同的状态和不同的分支上。在 Git 中新建工作树的好处是,你可以在不干扰当前工作环境的情况下,做出与当前任务无关的修改、提交修改,然后在以后合并。 + +直接从 `git-worktree` 手册中找到了一个典型的例子:当你正在为一个项目做一个令人兴奋的新功能时,你的项目经理告诉你有一个紧急的修复工作。问题是你的工作仓库(你的“工作树”)处于混乱状态,因为你正在开发一个重要的新功能。你不想在当前的冲刺中“偷偷地”进行修复,而且你也不愿意把变更暂存起来,为修复创建一个新的分支。相反,你决定创建一个新的工作树,这样你就可以在那里进行修复: + +``` +$ git branch | tee +* dev +trunk +$ git worktree add -b hotfix ~/code/hotfix trunk +Preparing ../hotfix (identifier hotfix) +HEAD is now at 62a2daf commit +``` + +在你的 `code` 目录中,你现在有一个新的目录叫做 `hotfix`,它是一个与你的主项目仓库相连的 Git 工作树,它的 `HEAD` 停在叫做 `trunk` 的分支上。现在你可以把这个工作树当作你的主工作区来对待。你可以把目录切换到它里面,进行紧急修复、提交、并最终删除这个工作树: + +``` +$ cd ~/code/hotfix +$ sed -i 's/teh/the/' hello.txt +$ git commit --all --message 'urgent hot fix' +``` + +一旦你完成了你的紧急工作,你就可以回到你之前的任务。你可以控制你的热修复何时被集成到主项目中。例如,你可以直接将变更从其工作树推送到项目的远程存储库中: + +``` +$ git push origin HEAD +$ cd ~/code/myproject +``` + +或者你可以将工作树存档为 TAR 或 ZIP 文件: + +``` +$ cd ~/code/myproject +$ git archive --format tar --output hotfix.tar master +``` + +或者你可以从单独的工作树中获取本地的变化: + +``` +$ git worktree list +/home/seth/code/myproject  15fca84 [dev] +/home/seth/code/hotfix     09e585d [master] +``` + +从那里,你可以使用任何最适合你和你的团队的策略合并你的变化。 + +### 列出活动工作树 + +你可以使用 `git worktree list` 命令获得工作树的列表,并查看每个工作树签出的分支: + +``` +$ git worktree list +/home/seth/code/myproject  15fca84 [dev] +/home/seth/code/hotfix     09e585d [master] +``` + +你可以在任何一个工作树中使用这个功能。工作树始终是连接的(除非你手动移动它们,破坏 Git 定位工作树的能力,从而切断连接)。 + +### 移动工作树 + +Git 会跟踪项目 `.git` 目录下工作树的位置和状态: + +``` +$ cat ~/code/myproject/.git/worktrees/hotfix/gitdir +/home/seth/code/hotfix/.git +``` + +如果你需要重定位一个工作树,必须使用 `git worktree move`;否则,当 Git 试图更新工作树的状态时,就会失败: + +``` +$ mkdir ~/Temp +$ git worktree move hotfix ~/Temp +$ git worktree list +/home/seth/code/myproject  15fca84 [dev] +/home/seth/Temp/hotfix     09e585d [master] +``` + +### 移除工作树 + +当你完成你的工作时,你可以用 `remove` 子命令删除它: + +``` +$ git worktree remove hotfix +$ git worktree list +/home/seth/code/myproject  15fca84 [dev] +``` + +为了确保你的 `.git` 目录是干净的,在删除工作树后使用 `prune` 子命令: + +``` +$ git worktree remove prune +``` + +### 何时使用工作树 + +与许多选项一样,无论是标签还是书签还是自动备份,都要靠你来跟踪你产生的数据,否则可能会变得不堪重负。不要经常使用工作树,要不你最终会有 20 份存储库的副本,每份副本的状态都略有不同。我发现最好是创建一个工作树,做需要它的任务,提交工作,然后删除树。保持简单和专注。 + +重要的是,工作树为你管理 Git 存储库的方式提供了更好的灵活性。在需要的时候使用它们,再也不用为了检查另一个分支上的内容而争先恐后地保存工作状态了。 + +-------------------------------------------------------------------------------- + +via: https://opensource.com/article/21/4/git-worktree + +作者:[Seth Kenlon][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/seth +[b]: https://github.com/lujun9972 +[1]: https://opensource.com/sites/default/files/styles/image-full-size/public/lead-images/science_experiment_beaker_lab.png?itok=plKWRhlU (Science lab with beakers) +[2]: https://linux.cn/article-13293-1.html diff --git a/published/202104/20210406 Teach anyone how to code with Hedy.md b/published/202104/20210406 Teach anyone how to code with Hedy.md new file mode 100644 index 0000000000..68b0c45815 --- /dev/null +++ b/published/202104/20210406 Teach anyone how to code with Hedy.md @@ -0,0 +1,80 @@ +[#]: subject: (Teach anyone how to code with Hedy) +[#]: via: (https://opensource.com/article/21/4/hedy-teach-code) +[#]: author: (Joshua Allen Holm https://opensource.com/users/holmja) +[#]: collector: (lujun9972) +[#]: translator: (wxy) +[#]: reviewer: (wxy) +[#]: publisher: (wxy) +[#]: url: (https://linux.cn/article-13290-1.html) + +用 Hedy 教人编程 +====== + +> Hedy 是一种专门为教人编程而设计的新型编程语言。 + +![](https://img.linux.net.cn/data/attachment/album/202104/12/111814w62da2sannsd2q76.jpg) + +学习编程既要学习编程逻辑,又要学习特定编程语言的语法。我在大学上第一堂编程课的时候,教的语言是 C++。第一个代码例子是基本的 “Hello World” 程序,就像下面的例子。 + +``` +#include + +int main() { + std::cout << "Hello World!"; + return 0; +} +``` + +老师直到几节课后才会解释大部分的代码。我们的期望是,我们只需输入代码,并最终了解为什么需要这些东西以及它们如何工作。 + +C++(以及其他类似的语言)的复杂语法是为什么 Python 经常被建议作为一种更容易的编程教学语言。下面是 Python 中的同一个例子: + +``` +print("Hello World!") +``` + +虽然 Python 中的 “Hello World” 基础例子要简单得多,但它仍然有复杂而精确的语法规则。`print` 函数需要在字符串周围加括号和引号。这对于没有编程经验的人来说,还是会感到困惑。Python 比 C++ 少了 “我以后再解释” 的语法问题,但还是有一些。 + +[Hedy][2] 是一种专门为编码教学而设计的新语言,它通过在语言中将复杂性分成多个关卡来解决语法复杂性的问题。Hedy 没有马上提供语言的全部功能,而是采取循序渐进的方式,随着学生在 Hedy 的学习的通关,慢慢变得更加复杂。随着关卡的进展,该语言获得了新的功能,最终变得更像 Python。目前有七个关卡,但更多的关卡正在计划中。 + +在第 1 关,Hedy 程序除了打印(`print`)一条语句(不需要引号或括号),提出(`ask`)一个问题,并回传(`echo`)一个答案外,不能做任何事情。第 1 关没有变量,没有循环,结构极精简。回传的工作原理几乎和变量一样,但只针对用户的最后一个输入。这可以让学生对基本概念感到舒适,而不必一下子学习所有的东西。 + +这是一个第 1 关的 Hedy “Hello World” 程序: + +``` +print Hello World +``` + +第 2 关引入了变量,但由于 `print` 函数没有使用引号,可能会出现一些有趣的结果。如果用来存储一个人的名字的变量是 `name`,那么就不可能打印输出 `Your name is [name]`,因为 `name` 的第一次使用(本意是字符串)和第二次使用(是变量)都被解释为变量。如果将 `name` 设置为(`is`) `John Doe`,那么 `print Your name is name.` 的输出就会是 `Your John Doe is John Doe`。虽然这听起来很奇怪,但这是一个引入变量概念的好方法,这恰好是第 3 关中增加的一个功能。 + +第 3 关要求在字符串周围加引号,这使得变量的功能就像在 Python 中一样。现在可以输出与变量相结合的字符串,做出复杂的语句,而不用担心变量名和字符串中的单词之间的冲突。这个级别取消了 “回传”(`echo`)函数,这看起来确实是一个可能会让一些学习者感到沮丧的东西。他们应该使用变量,这是更好的代码,但如果一个 `ask`/`echo` 代码块变成无效语法,可能会让人感到困惑。 + +第 4 关增加了基本的 `if`/`else` 功能。学生可以从简单的问/答代码转向复杂的交互。例如,一个问“你最喜欢的颜色是什么?”的提示可以根据用户输入的内容接受不同的回复。如果他们输入绿色,回答可以是“绿色!这也是我最喜欢的颜色。”如果他们输入其他的东西,回复可以是不同的。`if`/`else` 块是一个基本的编程概念,Hedy 引入了这个概念,而不必担心复杂的语法或过于精确的格式。 + +第 5 关有一个 `repeat` 函数,在现有的功能上增加了一个基本的循环。这个循环只能多次重复同一个命令,所以它没有 Python 中的循环那么强大,但它让学生习惯了重复命令的一般概念。这是多介绍了一个编程概念,而不会用无谓的复杂来拖累。学生们可以先掌握概念的基础知识,然后再继续学习同一事物的更强大、更复杂的版本。 + +在第 6 关,Hedy 现在可以进行基本的数学计算。加法、减法、乘法和除法都支持,但更高级的数学功能不支持。不能使用指数、模数或其他任何 Python 和其他语言能处理的东西。目前,Hedy 还没有更高关卡的产品增加更复杂的数学功能。 + +第 7 关引入了 Python 风格的缩进,这意味着 `repeat` 可以处理多行代码。学生在这之前都是逐行处理代码,但现在他们可以处理代码块。这个 Hedy 关卡与非教学型编程语言能做的事情相比还是有很大的差距,但它可以教会学生很多东西。 + +开始学习 Hedy 最简单的方法是访问 Hedy 网站上的 [课程][3],目前有荷兰语、英语、法语、德语、葡萄牙语和西班牙语。这样一来,任何有网页浏览器的人都可以进入学习过程。也可以从 [GitHub][4] 下载 Hedy,并从命令行运行解释器,或者运行 Hedy 网站的本地副本及其交互式课程。基于网页的版本更容易使用,但网页版本和命令行版本都支持运行针对不同复杂程度的 Hedy 程序。 + +Hedy 永远不会与 Python、C++ 或其他语言竞争,成为现实世界项目编码的首选语言,但它是编码教学的绝佳方式。作为学习过程的一部分,学生编写的程序是真实的,甚至可能是复杂的。Hedy 可以促进学生的学习和创造力,而不会让学生在学习过程中过早地被过多的信息所迷惑。就像数学课一样,在进入微积分之前很久要从学习计数、相加等开始(这个过程需要数年时间),编程也不必一开始就对编程语言的语法问题“我稍后再解释”、精确地遵循这些语法问题,才能产生哪怕是最基本的语言程序。 + +-------------------------------------------------------------------------------- + +via: https://opensource.com/article/21/4/hedy-teach-code + +作者:[Joshua Allen Holm][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/holmja +[b]: https://github.com/lujun9972 +[1]: https://opensource.com/sites/default/files/styles/image-full-size/public/lead-images/5538035618_4e19c9787c_o.png?itok=naiD1z1S (Teacher or learner?) +[2]: https://www.hedycode.com/ +[3]: https://www.hedycode.com/hedy?lang=en +[4]: https://github.com/felienne/hedy diff --git a/published/202104/20210407 Show CPU Details Beautifully in Linux Terminal With CPUFetch.md b/published/202104/20210407 Show CPU Details Beautifully in Linux Terminal With CPUFetch.md new file mode 100644 index 0000000000..e366481a6f --- /dev/null +++ b/published/202104/20210407 Show CPU Details Beautifully in Linux Terminal With CPUFetch.md @@ -0,0 +1,107 @@ +[#]: subject: (Show CPU Details Beautifully in Linux Terminal With CPUFetch) +[#]: via: (https://itsfoss.com/cpufetch/) +[#]: author: (Abhishek Prakash https://itsfoss.com/author/abhishek/) +[#]: collector: (lujun9972) +[#]: translator: (geekpi) +[#]: reviewer: (wxy) +[#]: publisher: (wxy) +[#]: url: (https://linux.cn/article-13289-1.html) + +使用 CPUFetch 在 Linux 终端中漂亮地显示 CPU 细节 +====== + +![](https://img.linux.net.cn/data/attachment/album/202104/12/093818iie270mi8am6ttk7.jpg) + +Linux 上有 [检查 CPU 信息的方法][1]。最常见的可能是 `lscpu` 命令,它可以提供大量的系统上所有 CPU 核心的信息。 + +![lscpu command output][2] + +你可以在那里找到 CPU 信息,而无需安装任何额外的包。当然这是可行的。然而,我最近偶然发现了一个新的工具,它以一种漂亮的方式显示 Linux 中的 CPU 细节。 + +处理器制造商的 ASCII 艺术使它看起来很酷。 + +![][3] + +这看起来很美,不是吗?这类似于 [Neoftech 或者 Screenfetch,在 Linux 中用漂亮的 ASCII 艺术来展示系统信息][4]。与这些工具类似,如果你要展示你的桌面截图,可以使用 CPUFetch。 + +该工具可以输出处理器制造商的 ASCII 艺术,它的名称、微架构、频率、核心、线程、峰值性能、缓存大小、[高级向量扩展][5] 等等。 + +除了它提供的一些主题外,你还可以使用自定义颜色。当你在整理桌面,并希望对 Linux 环境中的所有元素进行颜色匹配时,这给了你更多的自由度。 + +### 在 Linux 上安装 CPUFetch + +不幸的是,CPUFetch 是一个相当新的软件,而且它并不包含在你的发行版的软件库中,甚至没有提供现成的 DEB/RPM 二进制文件、PPA、Snap 或 Flatpak 包。 + +Arch Linux 用户可以在 [AUR][7] 中 [找到][6] 它,但对于其他人来说,唯一的出路是 [从源代码构建][8]。 + +不要担心。安装以及删除并不是那么复杂。让我来告诉你步骤。 + +我使用的是 Ubuntu,你会 [需要先在 Ubuntu 上安装 Git][9]。一些发行版会预装 Git,如果没有,请使用你的发行版的包管理器来安装。 + +现在,把 Git 仓库克隆到你想要的地方。家目录也可以。 + +``` +git clone https://github.com/Dr-Noob/cpufetch +``` + +切换到你刚才克隆的目录: + +``` +cd cpufetch +``` + +你会在这里看到一个 Makefile 文件。用它来编译代码。 + +``` +make +``` + +![CPUFetch Installation][10] + +现在你会看到一个新的可执行文件,名为 `cpufetch`。你运行这个可执行文件来显示终端的 CPU 信息。 + +``` +./cpufetch +``` + +这是我系统的显示。AMD 的徽标用 ASCII 码看起来更酷,你不觉得吗? + +![][11] + +如何删除 CPUFetch?这很简单。当你编译代码时,它只产生了一个文件,而且也和其他代码在同一个目录下。 + +所以,要想从系统中删除 CPUFetch,只需删除它的整个文件夹即可。你知道 [在 Linux 终端中删除一个目录][12] 的方法吧?从 `cpufetch` 目录中出来,然后使用 `rm` 命令。 + +``` +rm -rf cpufetch +``` + +这很简单,值得庆幸的是,因为从源代码中删除安装的软件有时真的很棘手。 + +说回 CPUFetch。我想这是一个实用工具,适合那些喜欢在各种 Linux 群里炫耀自己桌面截图的人。既然发行版有了 Neofetch,CPU 有了 CPUFetch,不知道能不能也来个 Nvidia ASCII 艺术的 GPUfetch? + +-------------------------------------------------------------------------------- + +via: https://itsfoss.com/cpufetch/ + +作者:[Abhishek Prakash][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/abhishek/ +[b]: https://github.com/lujun9972 +[1]: https://linuxhandbook.com/check-cpu-info-linux/ +[2]: https://i0.wp.com/itsfoss.com/wp-content/uploads/2021/04/lscpu-command-output.png?resize=800%2C415&ssl=1 +[3]: https://i2.wp.com/itsfoss.com/wp-content/uploads/2021/04/cpufetch-1.png?resize=800%2C307&ssl=1 +[4]: https://itsfoss.com/display-linux-logo-in-ascii/ +[5]: https://software.intel.com/content/www/us/en/develop/articles/introduction-to-intel-advanced-vector-extensions.html +[6]: https://aur.archlinux.org/packages/cpufetch-git +[7]: https://itsfoss.com/aur-arch-linux/ +[8]: https://itsfoss.com/install-software-from-source-code/ +[9]: https://itsfoss.com/install-git-ubuntu/ +[10]: https://i2.wp.com/itsfoss.com/wp-content/uploads/2021/04/cpufetch-installation.png?resize=800%2C410&ssl=1 +[11]: https://i2.wp.com/itsfoss.com/wp-content/uploads/2021/04/cpufetch-for-itsfoss.png?resize=800%2C335&ssl=1 +[12]: https://linuxhandbook.com/remove-files-directories/ diff --git a/published/202104/20210407 Using network bound disk encryption with Stratis.md b/published/202104/20210407 Using network bound disk encryption with Stratis.md new file mode 100644 index 0000000000..4c1440fd56 --- /dev/null +++ b/published/202104/20210407 Using network bound disk encryption with Stratis.md @@ -0,0 +1,284 @@ +[#]: subject: (Using network bound disk encryption with Stratis) +[#]: via: (https://fedoramagazine.org/network-bound-disk-encryption-with-stratis/) +[#]: author: (briansmith https://fedoramagazine.org/author/briansmith/) +[#]: collector: (lujun9972) +[#]: translator: (wxy) +[#]: reviewer: (wxy) +[#]: publisher: (wxy) +[#]: url: (https://linux.cn/article-13340-1.html) + +使用 Stratis 的网络绑定磁盘加密 +====== + +![](https://img.linux.net.cn/data/attachment/album/202104/27/221704gyzyvyroyyrybany.jpg) + +在一个有许多加密磁盘的环境中,解锁所有的磁盘是一项困难的任务。网络绑定磁盘加密Network bound disk encryption(NBDE)有助于自动解锁 Stratis 卷的过程。这是在大型环境中的一个关键要求。Stratis 2.1 版本增加了对加密的支持,这在《[Stratis 加密入门][4]》一文中介绍过。Stratis 2.3 版本最近在使用加密的 Stratis 池时引入了对网络绑定磁盘加密(NBDE)的支持,这是本文的主题。 + +[Stratis 网站][5] 将 Stratis 描述为一个“_易于使用的 Linux 本地存储管理_”。短视频《[使用 Stratis 管理存储][6]》对基础知识进行了快速演示。该视频是在 Red Hat Enterprise Linux 8 系统上录制的,然而,视频中显示的概念也适用于 Fedora Linux 中的 Stratis。 + +### 先决条件 + +本文假设你熟悉 Stratis,也熟悉 Stratis 池加密。如果你不熟悉这些主题,请参考这篇 [文章][4] 和前面提到的 [Stratis 概述视频][6]。 + +NBDE 需要 Stratis 2.3 或更高版本。本文中的例子使用的是 Fedora Linux 34 的预发布版本。Fedora Linux 34 的最终版本将包含 Stratis 2.3。 + +### 网络绑定磁盘加密(NBDE)概述 + +加密存储的主要挑战之一是有一个安全的方法在系统重启后再次解锁存储。在大型环境中,手动输入加密口令并不能很好地扩展。NBDE 解决了这一问题,允许以自动方式解锁加密存储。 + +在更高层次上,NBDE 需要环境中的 Tang 服务器。客户端系统(使用 Clevis Pin)只要能与 Tang 服务器建立网络连接,就可以自动解密存储。如果网络没有连接到 Tang 服务器,则必须手动解密存储。 + +这背后的想法是,Tang 服务器只能在内部网络上使用,因此,如果加密设备丢失或被盗,它将不再能够访问内部网络连接到 Tang 服务器,因此不会被自动解密。 + +关于 Tang 和 Clevis 的更多信息,请参见手册页(`man tang`、`man clevis`)、[Tang 的 GitHub 页面][7] 和 [Clevis 的 GitHub 页面][8]。 + +### 设置 Tang 服务器 + +本例使用另一个 Fedora Linux 系统作为 Tang 服务器,主机名为 `tang-server`。首先安装 `tang` 包。 + +``` +dnf install tang +``` + +然后用 `systemctl` 启用并启动 `tangd.socket`。 + +``` +systemctl enable tangd.socket --now +``` + +Tang 使用的是 TCP 80 端口,所以你也需要在防火墙中打开该端口。 + +``` +firewall-cmd --add-port=80/tcp --permanent +firewall-cmd --add-port=80/tcp +``` + +最后,运行 `tang-show-keys` 来显示输出签名密钥指纹。你以后会需要这个。 + +``` +# tang-show-keys +l3fZGUCmnvKQF_OA6VZF9jf8z2s +``` + +### 创建加密的 Stratis 池 + +上一篇关于 Stratis 加密的文章详细介绍了如何设置加密的 Stratis 池,所以本文不会深入介绍。 + +第一步是捕获一个将用于解密 Stratis 池的密钥。即使使用 NBDE,也需要设置这个,因为在 NBDE 服务器无法到达的情况下,可以用它来手动解锁池。使用以下命令捕获 `pool1` 密钥。 + +``` +# stratis key set --capture-key pool1key +Enter key data followed by the return key: +``` + +然后我将使用 `/dev/vdb` 设备创建一个加密的 Stratis 池(使用刚才创建的 `pool1key`),命名为 `pool1`。 + +``` +# stratis pool create --key-desc pool1key pool1 /dev/vdb。 +``` + +接下来,在这个 Stratis 池中创建一个名为 `filesystem1` 的文件系统,创建一个挂载点,挂载文件系统,并在其中创建一个测试文件: + +``` +# stratis filesystem create pool1 filesystem1 +# mkdir /filesystem1 +# mount /dev/stratis/pool1/filesystem1 /filesystem1 +# cd /filesystem1 +# echo "this is a test file" > testfile +``` + +### 将 Stratis 池绑定到 Tang 服务器上 + +此时,我们已经创建了加密的 Stratis 池,并在池中创建了一个文件系统。下一步是将你的 Stratis 池绑定到刚刚设置的 Tang 服务器上。使用 `stratis pool bind nbde` 命令进行。 + +当你进行 Tang 绑定时,需要向该命令传递几个参数: + + * 池名(在本例中,`pool1`) + * 钥匙描述符名称(本例中为 `pool1key`) + * Tang 服务器名称(在本例中,`http://tang-server`) + +记得之前在 Tang 服务器上,运行了 `tang-show-keys`,显示 Tang 输出的签名密钥指纹是 `l3fZGUCmnvKQF_OA6VZF9jf8z2s`。除了前面的参数外,还需要用参数 `-thumbprint l3fZGUCmnvKQF_OA6VZF9jf8z2s` 传递这个指纹,或者用 `-trust-url` 参数跳过对指纹的验证。 + +使用 `-thumbprint` 参数更安全。例如: + +``` +# stratis pool bind nbde pool1 pool1key http://tang-server --thumbprint l3fZGUCmnvKQF_OA6VZF9jf8z2s +``` + +### 用 NBDE 解锁 Stratis 池 + +接下来重启主机,并验证你可以用 NBDE 解锁 Stratis 池,而不需要使用密钥口令。重启主机后,该池不再可用: + +``` +# stratis pool list +Name Total Physical Properties +``` + +要使用 NBDE 解锁池,请运行以下命令: + +``` +# stratis pool unlock clevis +``` + +注意,你不需要使用密钥口令。这个命令可以在系统启动时自动运行。 + +此时,Stratis 池已经可以使用了: + +``` +# stratis pool list +Name Total Physical Properties +pool1 4.98 GiB / 583.65 MiB / 4.41 GiB ~Ca, Cr +``` + +你可以挂载文件系统,访问之前创建的文件: + +``` +# mount /dev/stratis/pool1/filesystem1 /filesystem1/ +# cat /filesystem1/testfile +this is a test file +``` + +### 轮换 Tang 服务器密钥 + +最好定期轮换 Tang 服务器密钥,并更新 Stratis 客户服务器以使用新的 Tang 密钥。 + +要生成新的 Tang 密钥,首先登录到 Tang 服务器,查看 `/var/db/tang` 目录的当前状态。然后,运行 `tang-show-keys` 命令: + +``` +# ls -al /var/db/tang +total 8 +drwx------. 1 tang tang 124 Mar 15 15:51 . +drwxr-xr-x. 1 root root 16 Mar 15 15:48 .. +-rw-r--r--. 1 tang tang 361 Mar 15 15:51 hbjJEDXy8G8wynMPqiq8F47nJwo.jwk +-rw-r--r--. 1 tang tang 367 Mar 15 15:51 l3fZGUCmnvKQF_OA6VZF9jf8z2s.jwk +# tang-show-keys +l3fZGUCmnvKQF_OA6VZF9jf8z2s +``` + +要生成新的密钥,运行 `tangd-keygen` 并将其指向 `/var/db/tang` 目录: + +``` +# /usr/libexec/tangd-keygen /var/db/tang +``` + +如果你再看看 `/var/db/tang` 目录,你会看到两个新文件: + +``` +# ls -al /var/db/tang +total 16 +drwx------. 1 tang tang 248 Mar 22 10:41 . +drwxr-xr-x. 1 root root 16 Mar 15 15:48 .. +-rw-r--r--. 1 tang tang 361 Mar 15 15:51 hbjJEDXy8G8wynMPqiq8F47nJwo.jwk +-rw-r--r--. 1 root root 354 Mar 22 10:41 iyG5HcF01zaPjaGY6L_3WaslJ_E.jwk +-rw-r--r--. 1 root root 349 Mar 22 10:41 jHxerkqARY1Ww_H_8YjQVZ5OHao.jwk +-rw-r--r--. 1 tang tang 367 Mar 15 15:51 l3fZGUCmnvKQF_OA6VZF9jf8z2s.jwk +``` + +如果你运行 `tang-show-keys`,就会显示出 Tang 所公布的密钥: + +``` +# tang-show-keys +l3fZGUCmnvKQF_OA6VZF9jf8z2s +iyG5HcF01zaPjaGY6L_3WaslJ_E +``` + +你可以通过将两个原始文件改名为以句号开头的隐藏文件,来防止旧的密钥(以 `l3fZ` 开头)被公布。通过这种方法,旧的密钥将不再被公布,但是它仍然可以被任何没有更新为使用新密钥的现有客户端使用。一旦所有的客户端都更新使用了新密钥,这些旧密钥文件就可以删除了。 + +``` +# cd /var/db/tang +# mv hbjJEDXy8G8wynMPqiq8F47nJwo.jwk .hbjJEDXy8G8wynMPqiq8F47nJwo.jwk +# mv l3fZGUCmnvKQF_OA6VZF9jf8z2s.jwk .l3fZGUCmnvKQF_OA6VZF9jf8z2s.jwk +``` + +此时,如果再运行 `tang-show-keys`,Tang 只公布新钥匙: + +``` +# tang-show-keys +iyG5HcF01zaPjaGY6L_3WaslJ_E +``` + +下一步,切换到你的 Stratis 系统并更新它以使用新的 Tang 密钥。当文件系统在线时, Stratis 支持这样做。 + +首先,解除对池的绑定: + +``` +# stratis pool unbind pool1 +``` + +接下来,用创建加密池时使用的原始口令设置密钥: + +``` +# stratis key set --capture-key pool1key +Enter key data followed by the return key: +``` + +最后,用更新后的密钥指纹将 Stratis 池绑定到 Tang 服务器上: + +``` +# stratis pool bind nbde pool1 pool1key http://tang-server --thumbprint iyG5HcF01zaPjaGY6L_3WaslJ_E +``` + +Stratis 系统现在配置为使用更新的 Tang 密钥。一旦使用旧的 Tang 密钥的任何其他客户系统被更新,在 Tang 服务器上的 `/var/db/tang` 目录中被重命名为隐藏文件的两个原始密钥文件就可以被备份和删除了。 + +### 如果 Tang 服务器不可用怎么办? + +接下来,关闭 Tang 服务器,模拟它不可用,然后重启 Stratis 系统。 + +重启后,Stratis 池又不可用了: + +``` +# stratis pool list +Name Total Physical Properties +``` + +如果你试图用 NBDE 解锁,会因为 Tang 服务器不可用而失败: + +``` +# stratis pool unlock clevis +Execution failed: +An iterative command generated one or more errors: The operation 'unlock' on a resource of type pool failed. The following errors occurred: +Partial action "unlock" failed for pool with UUID 4d62f840f2bb4ec9ab53a44b49da3f48: Cryptsetup error: Failed with error: Error: Command failed: cmd: "clevis" "luks" "unlock" "-d" "/dev/vdb" "-n" "stratis-1-private-42142fedcb4c47cea2e2b873c08fcf63-crypt", exit reason: 1 stdout: stderr: /dev/vdb could not be opened. +``` + +此时,在 Tang 服务器无法到达的情况下,解锁池的唯一选择就是使用原密钥口令: + +``` +# stratis key set --capture-key pool1key +Enter key data followed by the return key: +``` + +然后你可以使用钥匙解锁池: + +``` +# stratis pool unlock keyring +``` + +接下来,验证池是否成功解锁: + +``` +# stratis pool list +Name Total Physical Properties +pool1 4.98 GiB / 583.65 MiB / 4.41 GiB ~Ca, Cr +``` + +-------------------------------------------------------------------------------- + +via: https://fedoramagazine.org/network-bound-disk-encryption-with-stratis/ + +作者:[briansmith][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://fedoramagazine.org/author/briansmith/ +[b]: https://github.com/lujun9972 +[1]: https://fedoramagazine.org/wp-content/uploads/2021/03/stratis-nbde-816x345.jpg +[2]: https://unsplash.com/@imattsmart?utm_source=unsplash&utm_medium=referral&utm_content=creditCopyText +[3]: https://unsplash.com/s/photos/lock?utm_source=unsplash&utm_medium=referral&utm_content=creditCopyText +[4]: https://linux.cn/article-13311-1.html +[5]: https://stratis-storage.github.io/ +[6]: https://www.youtube.com/watch?v=CJu3kmY-f5o +[7]: https://github.com/latchset/tang +[8]: https://github.com/latchset/clevis diff --git a/published/202104/20210407 What is Git cherry-picking.md b/published/202104/20210407 What is Git cherry-picking.md new file mode 100644 index 0000000000..ba25e9572c --- /dev/null +++ b/published/202104/20210407 What is Git cherry-picking.md @@ -0,0 +1,187 @@ +[#]: subject: (What is Git cherry-picking?) +[#]: via: (https://opensource.com/article/21/4/cherry-picking-git) +[#]: author: (Rajeev Bera https://opensource.com/users/acompiler) +[#]: collector: (lujun9972) +[#]: translator: (geekpi) +[#]: reviewer: (wxy) +[#]: publisher: (wxy) +[#]: url: (https://linux.cn/article-13295-1.html) + +什么是 Git 遴选(cherry-pick)? +====== + +> 了解 `git cherry-pick` 命令是什么,为什么用以及如何使用。 + +![](https://img.linux.net.cn/data/attachment/album/202104/14/131735o63v3ow6y2wc281o.jpg) + +当你和一群程序员一起工作时,无论项目大小,处理多个 Git 分支之间的变更都会变得很困难。有时,你不想将整个 Git 分支合并到另一个分支,而是想选择并移动几个特定的提交。这个过程被称为 “遴选cherry-pick”。 + +本文将介绍“遴选”是什么、为何使用以及如何使用。 + +那么让我们开始吧。 + +### 什么是遴选? + +使用遴选(`cherry-pick`)命令,Git 可以让你将任何分支中的个别提交合并到你当前的 [Git HEAD][2] 分支中。 + +当执行 `git merge` 或者 `git rebase` 时,一个分支的所有提交都会被合并。`cherry-pick` 命令允许你选择单个提交进行整合。 + +### 遴选的好处 + +下面的情况可能会让你更容易理解遴选功能。 + +想象一下,你正在为即将到来的每周冲刺实现新功能。当你的代码准备好了,你会把它推送到远程分支,准备进行测试。 + +然而,客户并不是对所有修改都满意,要求你只呈现某些修改。因为客户还没有批准下次发布的所有修改,所以 `git rebase` 不会有预期的结果。为什么会这样?因为 `git rebase` 或者 `git merge` 会把上一个冲刺的每一个调整都纳入其中。 + +遴选就是答案!因为它只关注在提交中添加的变更,所以遴选只会带入批准的变更,而不添加其他的提交。 + +还有其他几个原因可以使用遴选: + + * 这对于 bug 修复是必不可少的,因为 bug 是出现在开发分支中对应的提交的。 + * 你可以通过使用 `git cherry-pick` 来避免不必要的工作,而不用使用其他选项例如 `git diff` 来应用特定变更。 + * 如果因为不同 Git 分支的版本不兼容而无法将整个分支联合起来,那么它是一个很有用的工具。 + +### 使用 cherry-pick 命令 + +在 `cherry-pick` 命令的最简单形式中,你只需使用 [SHA][3] 标识符来表示你想整合到当前 HEAD 分支的提交。 + +要获得提交的哈希值,可以使用 `git log` 命令: + +``` +$ git log --oneline +``` + +当你知道了提交的哈希值后,你就可以使用 `cherry-pick` 命令。 + +语法是: + +``` +$ git cherry-pick +``` + +例如: + +``` +$ git cherry-pick 65be1e5 +``` + +这将会把指定的修改合并到当前已签出的分支上。 + +如果你想做进一步的修改,也可以让 Git 将提交的变更内容添加到你的工作副本中。 + +语法是: + +``` +$ git cherry-pick --no-commit +``` + +例如: + +``` +$ git cherry-pick 65be1e5 --no-commit +``` + +如果你想同时选择多个提交,请将它们的提交哈希值用空格隔开: + +``` +$ git cherry-pick hash1 hash3 +``` + +当遴选提交时,你不能使用 `git pull` 命令,因为它能获取一个仓库的提交**并**自动合并到另一个仓库。`cherry-pick` 是一个专门不这么做的工具;另一方面,你可以使用 `git fetch`,它可以获取提交,但不应用它们。毫无疑问,`git pull` 很方便,但它不精确。 + +### 自己尝试 + +要尝试这个过程,启动终端并生成一个示例项目: + +``` +$ mkdir fruit.git +$ cd fruit.git +$ git init . +``` + +创建一些数据并提交: + +``` +$ echo "Kiwifruit" > fruit.txt +$ git add fruit.txt +$ git commit -m 'First commit' +``` + +现在,通过创建一个项目的复刻来代表一个远程开发者: + +``` +$ mkdir ~/fruit.fork +$ cd !$ +$ echo "Strawberry" >> fruit.txt +$ git add fruit.txt +$ git commit -m 'Added a fruit" +``` + +这是一个有效的提交。现在,创建一个不好的提交,代表你不想合并到你的项目中的东西: + +``` +$ echo "Rhubarb" >> fruit.txt +$ git add fruit.txt +$ git commit -m 'Added a vegetable that tastes like a fruit" +``` + +返回你的仓库,从你的假想的开发者那里获取提交的内容: + +``` +$ cd ~/fruit.git +$ git remote add dev ~/fruit.fork +$ git fetch dev +remote: Counting objects: 6, done. +remote: Compressing objects: 100% (2/2), done. +remote: Total 6 (delta 0), reused 0 (delta 0) +Unpacking objects: 100% (6/6), done... +``` + +``` +$ git log –oneline dev/master +e858ab2 Added a vegetable that tastes like a fruit +0664292 Added a fruit +b56e0f8 First commit +``` + +你已经从你想象中的开发者那里获取了提交的内容,但你还没有将它们合并到你的版本库中。你想接受第二个提交,但不想接受第三个提交,所以使用 `cherry-pick`。 + +``` +$ git cherry-pick 0664292 +``` + +第二次提交现在在你的仓库里了: + +``` +$ cat fruit.txt +Kiwifruit +Strawberry +``` + +将你的更改推送到远程服务器上,这就完成了! + +### 避免使用遴选的原因 + +在开发者社区中,通常不鼓励所以遴选。主要原因是它会造成重复提交,而你也失去了跟踪你的提交历史的能力。 + +如果你不按顺序地遴选了大量的提交,这些提交会被记录在你的分支中,这可能会在 Git 分支中导致不理想的结果。 + +遴选是一个强大的命令,如果没有正确理解可能发生的情况,它可能会导致问题。不过,当你搞砸了,提交到错误的分支时,它可能会救你一命(至少是你当天的工作)。 + +-------------------------------------------------------------------------------- + +via: https://opensource.com/article/21/4/cherry-picking-git + +作者:[Rajeev Bera][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/acompiler +[b]: https://github.com/lujun9972 +[1]: https://opensource.com/sites/default/files/styles/image-full-size/public/pictures/cherry-picking-recipe-baking-cooking.jpg?itok=XVwse6hw (Measuring and baking a cherry pie recipe) +[2]: https://acompiler.com/git-head/ +[3]: https://en.wikipedia.org/wiki/Secure_Hash_Algorithms diff --git a/published/202104/20210407 Why I love using bspwm for my Linux window manager.md b/published/202104/20210407 Why I love using bspwm for my Linux window manager.md new file mode 100644 index 0000000000..8050039891 --- /dev/null +++ b/published/202104/20210407 Why I love using bspwm for my Linux window manager.md @@ -0,0 +1,107 @@ +[#]: subject: (Why I love using bspwm for my Linux window manager) +[#]: via: (https://opensource.com/article/21/4/bspwm-linux) +[#]: author: (Stephen Adams https://opensource.com/users/stevehnh) +[#]: collector: (lujun9972) +[#]: translator: (geekpi) +[#]: reviewer: (wxy) +[#]: publisher: (wxy) +[#]: url: (https://linux.cn/article-13308-1.html) + +为什么我喜欢用 bspwm 来做我的 Linux 窗口管理器 +====== + +> 在 Fedora Linux 上安装、配置并开始使用 bspwm 窗口管理器。 + +![](https://img.linux.net.cn/data/attachment/album/202104/18/114637hxvqp4hfvbbhihb4.jpg) + +有些人喜欢重新布置家具。还有的人喜欢尝试新鞋或定期重新装修他们的卧室。我呢,则是尝试 Linux 桌面。 + +在对网上看到的一些不可思议的桌面环境流口水之后,我对一个窗口管理器特别好奇:[bspwm][2]。 + +![bspwm desktop][3] + +我喜欢 [i3][5] 窗口管理器已经有一段时间了,我很喜欢它的布局方式和上手的便捷性。但 bspwm 的某些特性吸引了我。有几个原因让我决定尝试一下: + + * 它_只是_一个窗口管理器(WM)。 + * 它由几个易于配置的脚本管理。 + * 它默认支持窗口之间的间隙。 + +可能是最需要指出的第一个原因是它只是一个窗口管理器。和 i3 一样,默认情况下没有任何图形化的那些花哨东西。你当然可以随心所欲地定制它,但_你_需要付出努力来使它看起来像你想要的。这也是它吸引我的部分原因。 + +虽然它可以在许多发行版上使用,但在我这个例子中使用的是 Fedora Linux。 + +### 安装 bspwm + +bspwm 在大多数常见的发行版中都有打包,所以你可以用系统的包管理器安装它。下面这个命令还会安装 [sxkhd][6],这是一个 X 窗口系统的守护程序,它“通过执行命令对输入事件做出反应”;还有 [dmenu][7],这是一个通用的 X 窗口菜单: + +``` +dnf install bspwm sxkhd dmenu +``` + +因为 bspwm 只是一个窗口管理器,所以没有任何内置的快捷键或键盘命令。这也是它与 i3 等软件的不同之处。所以,在你第一次启动窗口管理器之前,请先配置一下 `sxkhd`: + +``` +systemctl start sxkhd +systemctl enable sxkhd +``` + +这样就可以在登录时启用 `sxkhd`,但你还需要一些基本功能的配置: + +``` +curl https://raw.githubusercontent.com/baskerville/bspwm/master/examples/sxhkdrc --output ~/.config/sxkhd/sxkhdrc +``` + +在你深入了解之前,不妨先看看这个文件,因为有些脚本调用的命令可能在你的系统中并不存在。一个很好的例子是调用 `urxvt` 的 `super + Return` 快捷键。把它改成你喜欢的终端,尤其是当你没有安装 `urxvt` 的时候: + +``` +# +# wm independent hotkeys +# +    +# terminal emulator +super + Return +        urxvt +    +# program launcher +super + @space +        dmenu_run +``` + +如果你使用的是 GDM、LightDM 或其他显示管理器(DM),只要在登录前选择 `bspwm` 即可。 + +### 配置 bspwm + +当你登录后,你会看到屏幕上什么都没有。这不是你感觉到的空虚感。而是无限可能性!你现在可以开始摆弄桌面环境的所有部分了。你现在可以开始摆弄这些年你认为理所当然的桌面环境的所有部分了。从头开始构建并不容易,但一旦你掌握了诀窍,就会非常有收获。 + +任何窗口管理器最困难的是掌握快捷键。你开始会很慢,但在很短的时间内,你就可以只使用键盘在系统中到处操作,在你的朋友和家人面前看起来像一个终极黑客。 + +你可以通过编辑 `~/.config/bspwm/bspwmrc`,在启动时添加应用,设置桌面和显示器,并为你的窗口应该如何表现设置规则,随心所欲地定制系统。有一些默认设置的例子可以让你开始使用。键盘快捷键都是由 `sxkhdrc` 文件管理的。 + +还有更多的开源项目可以安装,让你的电脑看起来更漂亮,比如用于桌面背景的 [Feh][8]、状态栏的 [Polybar][9]、应用启动器的 [Rofi][10],还有 [Compton][11] 可以给你提供阴影和透明度,可以让你的电脑看起来焕然一新。 + +玩得愉快! + +-------------------------------------------------------------------------------- + +via: https://opensource.com/article/21/4/bspwm-linux + +作者:[Stephen Adams][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/stevehnh +[b]: https://github.com/lujun9972 +[1]: https://opensource.com/sites/default/files/styles/image-full-size/public/lead-images/windows_building_sky_scale.jpg?itok=mH6CAX29 (Tall building with windows) +[2]: https://github.com/baskerville/bspwm +[3]: https://opensource.com/sites/default/files/uploads/bspwm-desktop.png (bspwm desktop) +[4]: https://creativecommons.org/licenses/by-sa/4.0/ +[5]: https://i3wm.org/ +[6]: https://github.com/baskerville/sxhkd +[7]: https://linux.die.net/man/1/dmenu +[8]: https://github.com/derf/feh +[9]: https://github.com/polybar/polybar +[10]: https://github.com/davatorium/rofi +[11]: https://github.com/chjj/compton diff --git a/published/202104/20210409 4 ways open source gives you a competitive edge.md b/published/202104/20210409 4 ways open source gives you a competitive edge.md new file mode 100644 index 0000000000..4a9603b1ba --- /dev/null +++ b/published/202104/20210409 4 ways open source gives you a competitive edge.md @@ -0,0 +1,84 @@ +[#]: subject: (4 ways open source gives you a competitive edge) +[#]: via: (https://opensource.com/article/21/4/open-source-competitive-advantage) +[#]: author: (Jason Blais https://opensource.com/users/jasonblais) +[#]: collector: (lujun9972) +[#]: translator: (DCOLIVERSUN) +[#]: reviewer: (wxy) +[#]: publisher: (wxy) +[#]: url: (https://linux.cn/article-13299-1.html) + +开源为你带来竞争优势的 4 种方式 +====== + +> 使用开源技术可以帮助组织获得更好的业务结果。 + +![](https://img.linux.net.cn/data/attachment/album/202104/15/085345a2aani3axxj7wcis.jpg) + +构建技术栈是每个组织的主要决策。选择合适的工具将让团队获得成功,选择错误的解决方案或平台会对生产率和利润率产生毁灭性影响。为了在当今快节奏的世界中脱颖而出,组织必须明智地选择数字解决方案,好的数字解决方案可以提升团队行动力与运营敏捷性。 + +这就是为什么越来越多的组织都采用开源解决方案的原因,这些组织来自各行各业,规模有大有小。根据 [麦肯锡][2] 最近的报告,高绩效组织的最大区别是采用不同的开源方案。 + +采用开源技术可以帮助组织提高竞争优势、获得更好业务成果的原因有以下四点。 + +### 1、可拓展性和灵活性 + +可以说,技术世界发展很快。例如,在 2014 年之前,Kubernetes 并不存在,但今天,它却令人印象深刻,无处不在。根据 CNCF [2020 云原生调查][3],91% 的团队正在以某种形式使用 Kubernetes。 + +组织投资开源的一个主要原因是因为开源赋予组织行动敏捷性,组织可以迅速地将新技术集成到技术栈中。这与传统方法不同,在传统方法中,团队需要几个季度甚至几年来审查、实施、采用软件,这导致团队不可能实现火速转变。 + +开源解决方案完整地提供源代码,团队可以轻松将软件与他们每天使用的工具连接起来。 + +简而言之,开源让开发团队能够为手头的东西构建完美的工具,而不是被迫改变工作方式来适应不灵活的专有工具。 + +### 2、安全性和高可信的协作 + +在数据泄露备受瞩目的时代,组织需要高度安全的工具来保护敏感数据的安全。 + +专有解决方案中的漏洞不易被发现,被发现时为时已晚。不幸的是,使用这些平台的团队无法看到源代码,本质上是他们将安全性外包给特定供应商,并希望得到最好的结果。 + +采用开源的另一个主要原因是开源工具使组织能够自己把控安全。例如,开源项目——尤其是拥有大型开源社区的项目——往往会收到更负责任的漏洞披露,因为每个人在使用过程中都可以彻底检查源代码。 + +由于源代码是免费提供的,因此披露通常伴随着修复缺陷的详细建议解决方案。这些方案使得开发团队能够快速解决问题,不断增强软件。 + +在远程办公时代,对于分布式团队来说,在知道敏感数据受到保护的情况下进行协作比以往任何时候都更重要。开源解决方案允许组织审核安全性、完全掌控自己数据,因此开源方案可以促进远程环境下高可信协作方式的成长。 + +### 3、不受供应商限制 + +根据 [最近的一项研究][4],68% 的 CIO 担心受供应商限制。当你受限于一项技术中,你会被迫接受别人的结论,而不是自己做结论。 + +当组织更换供应商时,专有解决方案通常会 [给你带走数据带来挑战][5]。另一方面,开源工具提供了组织需要的自由度和灵活性,以避免受供应商限制,开源工具可以让组织把数据带去任意地方。 + +### 4、顶尖人才和社区 + +随着越来越多的公司 [接受远程办公][6],人才争夺战变得愈发激烈。 + +在软件开发领域,获得顶尖人才始于赋予工程师先进工具,让工程师在工作中充分发挥潜力。开发人员 [越来越喜欢开源解决方案][7] 而不是专有解决方案,组织应该强烈考虑用开源替代商业解决方案,以吸引市场上最好的开发人员。 + +除了雇佣、留住顶尖人才更容易,公司能够通过开源平台利用贡献者社区,得到解决问题的建议,从平台中得到最大收益。此外,社区成员还可以 [直接为开源项目做贡献][8]。 + +### 开源带来自由 + +开源软件在企业团队中越来越受到欢迎——[这是有原因的][8]。它帮助团队灵活地构建完美的工作工具,同时使团队可以维护高度安全的环境。同时,开源允许团队掌控未来方向,而不是局限于供应商的路线图。开源还帮助公司接触才华横溢的工程师和开源社区成员。 + +-------------------------------------------------------------------------------- + +via: https://opensource.com/article/21/4/open-source-competitive-advantage + +作者:[Jason Blais][a] +选题:[lujun9972][b] +译者:[DCOLIVERSUN](https://github.com/DCOLIVERSUN) +校对:[wxy](https://github.com/wxy) + +本文由 [LCTT](https://github.com/LCTT/TranslateProject) 原创编译,[Linux中国](https://linux.cn/) 荣誉推出 + +[a]: https://opensource.com/users/jasonblais +[b]: https://github.com/lujun9972 +[1]: https://opensource.com/sites/default/files/styles/image-full-size/public/lead-images/openwires_fromRHT_520_0612LL.png?itok=PqZi55Ab (Open ethernet cords.) +[2]: https://www.mckinsey.com/industries/technology-media-and-telecommunications/our-insights/developer-velocity-how-software-excellence-fuels-business-performance# +[3]: https://www.cncf.io/blog/2020/11/17/cloud-native-survey-2020-containers-in-production-jump-300-from-our-first-survey/ +[4]: https://solutionsreview.com/cloud-platforms/flexera-68-percent-of-cios-worry-about-vendor-lock-in-with-public-cloud/ +[5]: https://www.computerworld.com/article/3428679/mattermost-makes-case-for-open-source-as-team-messaging-market-booms.html +[6]: https://mattermost.com/blog/tips-for-working-remotely/ +[7]: https://opensource.com/article/20/6/open-source-developers-survey +[8]: https://mattermost.com/blog/100-most-popular-mattermost-features-invented-and-contributed-by-our-amazing-open-source-community/ +[9]: https://mattermost.com/open-source-advantage/ diff --git a/published/202104/20210410 5 signs you-re a groff programmer.md b/published/202104/20210410 5 signs you-re a groff programmer.md new file mode 100644 index 0000000000..53e41c98fd --- /dev/null +++ b/published/202104/20210410 5 signs you-re a groff programmer.md @@ -0,0 +1,80 @@ +[#]: subject: (5 signs you're a groff programmer) +[#]: via: (https://opensource.com/article/21/4/groff-programmer) +[#]: author: (Jim Hall https://opensource.com/users/jim-hall) +[#]: collector: (lujun9972) +[#]: translator: (liweitianux) +[#]: reviewer: (wxy) +[#]: publisher: (wxy) +[#]: url: (https://linux.cn/article-13316-1.html) + +groff 程序员的 5 个标志 +====== + +> 学习一款老派的文本处理软件 groff,就像是学习骑自行车。 + +![](https://img.linux.net.cn/data/attachment/album/202104/20/221218y34lew4gewqw2xg2.jpg) + +我第一次发现 Unix 系统是在 20 世纪 90 年代早期,当时我还在大学读本科。我太喜欢这个系统了,所以我将家里电脑上的 MS-DOS 也换成了 Linux 系统。 + +在 90 年代早期至中期,Linux 所缺失的一个东西是字处理软件word processor。作为其他桌面操作系统的标准办公程序,字处理软件能让你轻松地编辑文本。我经常在 DOS 上使用字处理软件来撰写课程论文。直到 90 年代末,我都没能找到一款 Linux 原生的字处理软件。直到那时,文字处理是我在第一台电脑上保留双启动的少有的原因之一,那样我可以偶尔切换到 DOS 系统写论文。 + +后来,我发现 Linux 提供了一款文字处理软件:GNU troff,它一般称为 [groff][2],是经典的文本处理系统 troff 的一个现代实现。troff 是 “排版工快印typesetter roff” 的简称,是 nroff 系统的改进版本,而 nroff 又是最初的 roff 系统的新实现。roff 表示快速印出run off,比如“快速印出”一份文档。 + +利用文本处理系统,你在纯文本编辑器里编辑内容,通过macro或其他处理命令来添加格式。然后将文件输入文本处理系统,比如 groff,来生成适合打印的格式化输出。另一个知名的文本处理系统是 LaTeX,但是 groff 已经满足我的需求,而且足够简单。 + +经过一点实践,我发现在 Linux 上使用 groff 来撰写课程论文与使用字处理软件一样容易。尽管我现在不再使用 groff 来写文档了,我依然记得它的那些宏和命令。如果你也是这样并且在那么多年之前学会了使用 groff 写作,你可能会认出这 5 个 groff 程序员的标志。 + +### 1、你有一个喜欢的宏集 + +输入由宏点缀的纯文本,你便能在 groff 里对文档进行格式化。groff 里的宏是行首为单个句点(`.`)的短命令。例如:如果你想在输出里插入几行,宏命令 `.sp 2` 会添加两个空行。groff 还具有其他一些基本的宏,支持各种各样的格式化。 + +为了能让作者更容易地格式化文档,groff 还提供了不同的 宏集macro set,即一组能够让你以自己的方式格式化文档的宏的集合。我学会的第一个宏集是 `-me` 宏集。这个宏集的名称其实是 `e`,你在处理文件时使用 `-me` 选项来指定这个 `e` 宏集。 + +groff 还包含其他宏集。例如,`-man` 宏集以前是用于格式化 Unix 系统内置的 手册页manual page 的标准宏集,`-ms` 宏集经常用于格式化其他一些技术文档。如果你学会了使用 groff 写作,你可能有一个喜欢的宏集。 + +### 2、你想专注于内容而非格式 + +使用 groff 写作的一个很好的特点是,你能专注于你的 _内容_,而不用太担心它看起来会怎么样。对于技术作者而言这是一个很实用的特点。对专业作家来说,groff 是一个很好的、“不会分心”的写作环境。至少,使用 groff `-T` 选项所支持的任何格式来交付内容时你不用担心,这包括 PDF、PostScript、HTML、以及纯文本。不过,你无法直接从 groff 生成 LibreOffice ODT 文件或者 Word DOC 文件。 + +一旦你使用 groff 写作变得有信心之后,宏便开始 _消失_。用于格式化的宏变成了背景的一部分,而你纯粹地专注于眼前的文本内容。我已经使用 groff 写了足够多内容,以至于我甚至不再看见那些宏。也许,这就像写代码,而你的大脑随意换档,于是你就像计算机一样思考,看到的代码就是一组指令。对我而言,使用 groff 写作就像那样:我仅仅看到文本,而我的大脑将宏自动地翻译成格式。 + +### 3、你喜欢怀旧复古的感觉 + +当然,使用一个更典型的字处理软件来写你的文档可能更 _简单_,比如 LibreOffice Writer、甚至 Google Docs 或 Microsoft Word。而且对于某些种类的文档,桌面型字处理软件才是正确的选择。但是,如果你想要这种怀旧复古的感觉,使用 groff 写作很难被打败。 + +我承认,我的大部分写作是用 LibreOffice Writer 完成的,它的表现很出色。但是当我渴望以一种怀旧复古的方式去做时,我会打开编辑器用 groff 来写文档。 + +### 4、你希望能到处使用它 + +groff 及其同类软件在几乎所有的 Unix 系统上都是标准软件包。此外,groff 宏不会随系统而变化。比如,`-me` 宏集在不同系统上都应该相同。因此,一旦你在一个系统上学会使用宏,你能在下一个系统上同样地使用它们。 + +另外,因为 groff 文档就是纯文本文档,所以你能使用任何你喜欢的编辑器来编辑文档。我喜欢使用 GNU Emacs 来编辑我的 groff 文档,但是你可能使用 GNOME Gedit、Vim、其他你 [最喜欢的文本编辑器][3]。大部分编辑器会支持这样一种模式,其中 groff 宏会以不同的颜色高亮显示,帮助你在处理文件之前便能发现错误。 + +### 5、你使用 -me 写了这篇文章 + +当我决定要写这篇文章时,我认为最佳的方式便是直接使用 groff。我想要演示 groff 在编写文档方面是多么的灵活。所以,虽然你正在网上读这篇文章,但是它最初是用 groff 写的。 + +我希望这激发了你学习如何使用 groff 撰写文档的兴趣。如果你想学习 `-me` 宏集里更高级的函数,参考 Eric Allman 的《Writing papers with groff using -me》,你应该能在系统的 groff 文档找到这本书,文件名为 `meintro.me`。这是一份很好的参考资料,还解释了使用 `-me` 宏集格式化论文的其他方式。 + +我还提供了这篇文章的原始草稿,其中使用了 `-me` 宏集。下载这个文件并保存为 `five-signs-groff.me`,然后运行 groff 处理来查看它。`-T` 选项设置输出类型,比如 `-Tps` 用于生成 PostScript 输出,`-Thtml` 用于生成 HTML 文件。比如: + +``` +groff -me -Thtml five-signs-groff.me > five-signs-groff.html +``` + +-------------------------------------------------------------------------------- + +via: https://opensource.com/article/21/4/groff-programmer + +作者:[Jim Hall][a] +选题:[lujun9972][b] +译者:[liweitianux](https://github.com/liweitianux) +校对:[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/doc-dish-lead.png?itok=h3fCkVmU (Typewriter in the grass) +[2]: https://en.wikipedia.org/wiki/Groff_(software) +[3]: https://opensource.com/article/21/2/open-source-text-editors diff --git a/published/202104/20210410 How to Install Steam on Fedora -Beginner-s Tip.md b/published/202104/20210410 How to Install Steam on Fedora -Beginner-s Tip.md new file mode 100644 index 0000000000..9aa71925fa --- /dev/null +++ b/published/202104/20210410 How to Install Steam on Fedora -Beginner-s Tip.md @@ -0,0 +1,119 @@ +[#]: subject: (How to Install Steam on Fedora [Beginner’s Tip]) +[#]: via: (https://itsfoss.com/install-steam-fedora/) +[#]: author: (John Paul https://itsfoss.com/author/john/) +[#]: collector: (lujun9972) +[#]: translator: (geekpi) +[#]: reviewer: (wxy) +[#]: publisher: (wxy) +[#]: url: (https://linux.cn/article-13302-1.html) + +如何在 Fedora 上安装 Steam +====== + +![](https://img.linux.net.cn/data/attachment/album/202104/16/090703cg4t5npnseskhxhv.jpg) + +Steam 对 Linux 游戏玩家来说是最好的东西了。由于 Steam,你可以在 Linux 上玩成百上千的游戏。 + +如果你还不知道,Steam 是最流行的 PC 游戏平台。2013 年,它开始可以在 Linux 使用。[Steam 最新的 Proton 项目][1] 允许你在 Linux 上玩为 Windows 平台创建的游戏。这让 Linux 游戏库增强了许多倍。 + +![][2] + +Steam 提供了一个桌面客户端,你可以用它从 Steam 商店下载或购买游戏,然后安装并玩它。 + +过去我们曾讨论过 [在 Ubuntu 上安装 Steam][3]。在这个初学者教程中,我将向你展示在 Fedora Linux 上安装 Steam 的步骤。 + +### 在 Fedora 上安装 Steam + +要在 Fedora 上使用 Steam,你必须使用 RMPFusion 软件库。[RPMFusion][4] 是一套第三方软件库,其中包含了 Fedora 选择不与它们的操作系统一起发布的软件。它们提供自由(开源)和非自由(闭源)的软件库。由于 Steam 在非自由软件库中,你将只安装那一个。 + +我将同时介绍终端和图形安装方法。 + +#### 方法 1:通过终端安装 Steam + +这是最简单的方法,因为它需要的步骤最少。只需输入以下命令即可启用仓库: + +``` +sudo dnf install https://mirrors.rpmfusion.org/nonfree/fedora/rpmfusion-nonfree-release-$(rpm -E %fedora).noarch.rpm +``` + +你会被要求输入密码。然后你会被要求验证是否要安装这些仓库。你同意后,仓库安装就会完成。 + +要安装 Steam,只需输入以下命令: + +``` +sudo dnf install steam +``` + +![Install Steam via command line][5] + +输入密码后按 `Y` 接受。安装完毕后,打开 Steam,玩一些游戏。 + +#### 方法 2:通过 GUI 安装 Steam + +你可以从软件中心 [启用 Fedora 上的第三方仓库][6]。打开软件中心并点击菜单。 + +![][7] + +在 “软件仓库” 窗口中,你会看到顶部有一个 “第三方软件仓库”。点击 “安装” 按钮。当提示你输入密码时,就完成了。 + +![][8] + +安装了 Steam 的 RPM Fusion 仓库后,更新你系统的软件缓存(如果需要),并在软件中心搜索 Steam。 + +![Steam in GNOME Software Center][9] + +安装完成后,打开 GNOME 软件中心,搜索 Steam。找到 Steam 页面后,点击安装。当被问及密码时,输入你的密码就可以了。 + +安装完 Steam 后,启动应用,输入你的 Steam 帐户详情或注册它,然后享受你的游戏。 + +### 将 Steam 作为 Flatpak 使用 + +Steam 也可以作为 Flatpak 使用。Fedora 上默认安装 Flatpak。在使用该方法安装 Steam 之前,我们必须安装 Flathub 仓库。 + +![Install Flathub][10] + +首先,在浏览器中打开 [Flatpak 网站][11]。现在,点击标有 “Flathub repository file” 的蓝色按钮。浏览器会询问你是否要在 GNOME 软件中心打开该文件。点击确定。在 GNOME 软件中心打开后,点击安装按钮。系统会提示你输入密码。 + +如果你在尝试安装 Flathub 仓库时出现错误,请在终端运行以下命令: + +``` +flatpak remote-add --if-not-exists flathub https://flathub.org/repo/flathub.flatpakrepo +``` + +安装好 Flathub 仓库后,你需要做的就是在 GNOME 软件中心搜索 Steam。找到后,安装它,你就可以开始玩了。 + +![Fedora Repo Select][12] + +Flathub 版本的 Steam 也有几个附加组件可以安装。其中包括一个 DOS 兼容工具和几个 [Vulkan][13] 和 Proton 工具。 + +![][14] + +我想这应该可以帮助你在 Fedora 上使用 Steam。享受你的游戏 :) + +-------------------------------------------------------------------------------- + +via: https://itsfoss.com/install-steam-fedora/ + +作者:[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://itsfoss.com/author/john/ +[b]: https://github.com/lujun9972 +[1]: https://itsfoss.com/steam-play-proton/ +[2]: https://i0.wp.com/itsfoss.com/wp-content/uploads/2017/05/Steam-Store.jpg?resize=800%2C382&ssl=1 +[3]: https://itsfoss.com/install-steam-ubuntu-linux/ +[4]: https://rpmfusion.org/ +[5]: https://i0.wp.com/itsfoss.com/wp-content/uploads/2021/03/install-steam-fedora.png?resize=800%2C588&ssl=1 +[6]: https://itsfoss.com/fedora-third-party-repos/ +[7]: https://i1.wp.com/itsfoss.com/wp-content/uploads/2020/11/software-meni.png?resize=800%2C672&ssl=1 +[8]: https://i0.wp.com/itsfoss.com/wp-content/uploads/2020/11/fedora-third-party-repo-gui.png?resize=746%2C800&ssl=1 +[9]: https://i0.wp.com/itsfoss.com/wp-content/uploads/2021/03/gnome-store-steam.jpg?resize=800%2C434&ssl=1 +[10]: https://i2.wp.com/itsfoss.com/wp-content/uploads/2021/03/flatpak-install-button.jpg?resize=800%2C434&ssl=1 +[11]: https://www.flatpak.org/setup/Fedora/ +[12]: https://i0.wp.com/itsfoss.com/wp-content/uploads/2021/03/fedora-repo-select.jpg?resize=800%2C434&ssl=1 +[13]: https://developer.nvidia.com/vulkan +[14]: https://i0.wp.com/itsfoss.com/wp-content/uploads/2021/03/steam-flatpak-addons.jpg?resize=800%2C434&ssl=1 diff --git a/published/202104/20210411 GNOME-s Very Own -GNOME OS- is Not a Linux Distro for Everyone -Review.md b/published/202104/20210411 GNOME-s Very Own -GNOME OS- is Not a Linux Distro for Everyone -Review.md new file mode 100644 index 0000000000..0e251d8829 --- /dev/null +++ b/published/202104/20210411 GNOME-s Very Own -GNOME OS- is Not a Linux Distro for Everyone -Review.md @@ -0,0 +1,135 @@ +[#]: subject: (GNOME’s Very Own “GNOME OS” is Not a Linux Distro for Everyone [Review]) +[#]: via: (https://itsfoss.com/gnome-os/) +[#]: author: (Ankush Das https://itsfoss.com/author/ankush/) +[#]: collector: (lujun9972) +[#]: translator: (wxy) +[#]: reviewer: (wxy) +[#]: publisher: (wxy) +[#]: url: (https://linux.cn/article-13287-1.html) + +GNOME OS:一个并不是适合所有人的 Linux 发行版 +====== + +![](https://img.linux.net.cn/data/attachment/album/202104/11/103205t34lcaa3t0a3xjjw.jpg) + +每当 GNOME 的一个重要版本到来时,总是很想尽快试用它。但是,要想第一时间进行测试,主要还是得依靠 [Fedora Rawhide][1] 开发分支。 + +然而,开发分支并不总是让人放心的,所以,用来尝试最新的 GNOME 并不是最方便的解决方案。这里,我所说的测试,并不仅仅是指用户的测试,同时也能够用于开发者对设计变更进行测试。 + +所以,最近来了个大救星 GNOME OS,让测试的过程变得轻松起来。但是,它到底是什么,怎么安装呢?让我们一起来看看吧。 + +### 什么是 GNOME OS? + +GNOME OS 并不是一个独立完整的 Linux 发行版。事实上,它根本不基于任何东西。它是一个不完整的参考系统,只是为了让 GNOME 桌面工作。它仅仅是一个可启动的虚拟机镜像,在 GNOME 进入任何发行版的仓库之前,为调试和测试功能而量身定做的。 + +在 GNOME 的博客中,有一篇提到了它: + +> GNOME OS 旨在通过提供一个用于开发、设计和用户测试的工作系统,来更好地促进 GNOME 的开发。 + +如果你好奇的话,你可以看看 GNOME 星球上的一篇 [博客文章][2] 来了解关于 GNOME OS 的更多信息。 + +### 如果它不是一个成熟的 Linux 发行版,那么它是用来干什么的? + +![][3] + +值得注意的是,每一次新的提交都可以创建一个新的 GNOME OS 镜像,所以它应该会使测试过程变得高效,并帮助你在开发周期的早期测试并发现问题。 + +不要忘了,设计者不再需要自己构建软件来测试 GNOME Shell 或任何其他核心模块。这为他们节省了时间和整个 GNOME 开发周期。 + +当然,不仅限于开发者和技术测试人员,它还可以让记者们拿到最新的和最棒的东西,来报道 GNOME 下一个版本或它是如何成型的。 + +媒体和 GNOME 团队也得到了一个很好的机会,借助于 GNOME OS,他们可以准备视频、图片两种形式的视觉资料来宣传此次发布。 + +### 如何安装 GNOME OS? + +要轻松安装 GNOME OS,你需要先安装 GNOME Boxes 应用程序。 + +#### 安装 GNOME Boxes + +Boxes 是一款简单的虚拟化软件,它不提供任何高级选项,但可以让你轻松安装操作系统镜像来快速测试。它是专门针对桌面终端用户的,所以使用起来也很方便。 + +要在任何 Linux 发行版上安装它,你可以利用 [Flathub][5] 的 [Flatpak][4] 包。如果你不知道 Flatpak,你可能需要阅读我们的《[在 Linux 中安装和使用 Flatpak][6]》指南。 + +你也可以在任何基于 Ubuntu 的发行版上直接在终端上输入以下内容进行安装: + +``` +sudo apt install gnome-boxes +``` + +一旦你安装了 Boxes,从这里安装 GNOME OS 就相当容易了。 + +#### 安装 GNOME OS + +安装好 Boxes 后,你需要启动程序。接下来,点击窗口左上角的 “+” 标志,然后点击 “操作系统下载”,如下图所示。 + +![][7] + +这个选项可以让你直接下载镜像文件,然后就可以继续安装它。 + +你所需要做的就是搜索 “GNOME”,然后你应该会找到可用的每夜构建版。这可以确保你正在尝试最新和最优秀的 GNOME 开发版本。 + +另外,你也可以前往 [GNOME OS 每夜构建网站][8] 下载系统镜像,然后在 Boxes 应用中选择 “运行系统镜像文件” 选择该 ISO,如上图截图所示,继续安装。 + +![][9] + +考虑到你没有单独下载镜像。当你点击后,应该会开始下载,并且会出现一个进度条。 + +![][10] + +完成后,如果需要,它会要求你自定义配置,让你创建虚拟机,如下图所示。 + +![][11] + +你可以根据你可用的系统资源来定制资源分配,但应该可以使用默认设置。 + +点击 “创建”,就会直接开始 GNOME OS 的安装。 + +![][12] + +选择“使用现有的版本”,然后继续。接下来,你必须选择磁盘(保持原样),然后同意擦除你所有的文件和应用程序(它不会删除本地计算机上的任何东西)。 + +![][13] + +现在,它将简单地重新格式化并安装它。然后就完成了。它会提示你重启,重启后,你会发现 GNOME OS 已经安装好了。 + +它会像其他 Linux 发行版一样简单地启动,并要求你设置一些东西,包括用户名和密码。然后,你就可以开始探索了。 + +如果你想知道它的样子,它基本上就是最新的 GNOME 桌面环境。在 GNOME 40 正式发布之前,我用 GNOME OS 做了一个 GNOME 40 的概述视频。 + +### 结束语 + +GNOME OS 绝对是对开发者、设计师和媒体有用的东西。它可以让你轻松地测试最新的 GNOME 开发版本,而无需投入大量的时间。 + +我可以很快地测试 [GNOME 40][14],就是因为这个。当然,你要记住,这并不是一个可以在物理设备上安装的完整功能的操作系统。他们有计划让它可以在物理机器上运行,但就目前而言,它只是为虚拟机量身定做的,尤其是使用 GNOME Boxes。 + +GNOME Boxes 并没有提供任何高级选项,所以设置和使用它变得相当容易。如果体验太慢的话,你可能要调整一下资源,但在我的情况下,总体来说是一个不错的体验。 + +你试过 GNOME OS 了吗?欢迎在下面的评论中告诉我你的想法。 + +-------------------------------------------------------------------------------- + +via: https://itsfoss.com/gnome-os/ + +作者:[Ankush Das][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://itsfoss.com/author/ankush/ +[b]: https://github.com/lujun9972 +[1]: https://fedoraproject.org/wiki/Releases/Rawhide +[2]: https://blogs.gnome.org/alatiera/2020/10/07/what-is-gnome-os/ +[3]: https://i0.wp.com/itsfoss.com/wp-content/uploads/2021/04/GNOME-OS-distro-review.png?resize=800%2C450&ssl=1 +[4]: https://itsfoss.com/what-is-flatpak/ +[5]: https://flathub.org/apps/details/org.gnome.Boxes +[6]: https://itsfoss.com/flatpak-guide/ +[7]: https://i1.wp.com/itsfoss.com/wp-content/uploads/2021/04/gnome-os-search.jpg?resize=800%2C729&ssl=1 +[8]: https://os.gnome.org/ +[9]: https://i1.wp.com/itsfoss.com/wp-content/uploads/2021/04/gnome-os-boxes.jpg?resize=800%2C694&ssl=1 +[10]: https://i1.wp.com/itsfoss.com/wp-content/uploads/2021/04/gnome-os-download.jpg?resize=798%2C360&ssl=1 +[11]: https://i1.wp.com/itsfoss.com/wp-content/uploads/2021/04/gnome-boxes-vm-setup.png?resize=800%2C301&ssl=1 +[12]: https://i2.wp.com/itsfoss.com/wp-content/uploads/2021/04/gnome-nightly-install.jpg?resize=800%2C636&ssl=1 +[13]: https://i0.wp.com/itsfoss.com/wp-content/uploads/2021/04/gnome-os-installation.jpg?resize=800%2C619&ssl=1 +[14]: https://news.itsfoss.com/gnome-40-release/ diff --git a/published/202104/20210412 6 open source tools and tips to securing a Linux server for beginners.md b/published/202104/20210412 6 open source tools and tips to securing a Linux server for beginners.md new file mode 100644 index 0000000000..ebc367d9ff --- /dev/null +++ b/published/202104/20210412 6 open source tools and tips to securing a Linux server for beginners.md @@ -0,0 +1,191 @@ +[#]: subject: (6 open source tools and tips to securing a Linux server for beginners) +[#]: via: (https://opensource.com/article/21/4/securing-linux-servers) +[#]: author: (Sahana Sreeram https://opensource.com/users/sahanasreeram01gmailcom) +[#]: collector: (lujun9972) +[#]: translator: (wxy) +[#]: reviewer: (wxy) +[#]: publisher: (wxy) +[#]: url: (https://linux.cn/article-13298-1.html) + +6 个提升 Linux 服务器安全的开源工具和技巧 +====== + +> 使用开源工具来保护你的 Linux 环境不被入侵。 + +![](https://img.linux.net.cn/data/attachment/album/202104/15/082334ltqtgg40tu7l80rd.jpg) + +如今我们的许多个人和专业数据都可以在网上获得,因此无论是专业人士还是普通互联网用户,学习安全和隐私的基本知识是非常重要的。作为一名学生,我通过学校的 CyberPatriot 活动获得了这方面的经验,在那里我有机会与行业专家交流,了解网络漏洞和建立系统安全的基本步骤。 + +本文基于我作为初学者迄今所学的知识,详细介绍了六个简单的步骤,以提高个人使用的 Linux 环境的安全性。在我的整个旅程中,我利用开源工具来加速我的学习过程,并熟悉了与提升 Linux 服务器安全有关的更高层次的概念。 + +我使用我最熟悉的 Ubuntu 18.04 版本测试了这些步骤,但这些步骤也适用于其他 Linux 发行版。 + +### 1、运行更新 + +开发者们不断地寻找方法,通过修补已知的漏洞,使服务器更加稳定、快速、安全。定期运行更新是一个好习惯,可以最大限度地提高安全性。运行它们: + +``` +sudo apt-get update && apt-get upgrade +``` + +### 2、启用防火墙保护 + +[启用防火墙][2] 可以更容易地控制服务器上的进站和出站流量。在 Linux 上有许多防火墙应用程序可以使用,包括 [firewall-cmd][3] 和 简单防火墙Uncomplicated Firewall([UFW][4])。我使用 UFW,所以我的例子是专门针对它的,但这些原则适用于你选择的任何防火墙。 + +安装 UFW: + +``` +sudo apt-get install ufw +``` + +如果你想进一步保护你的服务器,你可以拒绝传入和传出的连接。请注意,这将切断你的服务器与世界的联系,所以一旦你封锁了所有的流量,你必须指定哪些出站连接是允许从你的系统中发出的: + +``` +sudo ufw default deny incoming +sudo ufw default allow outgoing +``` + +你也可以编写规则来允许你个人使用所需要的传入连接: + +``` +ufw allow +``` + +例如,允许 SSH 连接: + +``` +ufw allow ssh +``` + +最后,启用你的防火墙: + +``` +sudo ufw enable +``` + +### 3、加强密码保护 + +实施强有力的密码政策是保持服务器安全、防止网络攻击和数据泄露的一个重要方面。密码策略的一些最佳实践包括强制要求最小长度和指定密码年龄。我使用 libpam-cracklib 软件包来完成这些任务。 + +安装 libpam-cracklib 软件包: + +``` +sudo apt-get install libpam-cracklib +``` + +强制要求密码的长度: + + * 打开 `/etc/pam.d/common-password` 文件。 + * 将 `minlen=12` 行改为你需要的任意字符数,从而改变所有密码的最小字符长度要求。 + +为防止密码重复使用: + + * 在同一个文件(`/etc/pam.d/common-password`)中,添加 `remember=x` 行。 + * 例如,如果你想防止用户重复使用他们最后 5 个密码中的一个,使用 `remember=5`。 + +要强制要求密码年龄: + + * 在 `/etc/login.defs` 文件中找到以下几行,并用你喜欢的时间(天数)替换。例如: + +``` +PASS_MIN_AGE: 3 +PASS_MAX_AGE: 90 +PASS_WARN_AGE: 14 +``` + +强制要求字符规格: + + * 在密码中强制要求字符规格的四个参数是 `lcredit`(小写)、`ucredit`(大写)、`dcredit`(数字)和 `ocredit`(其他字符)。 + * 在同一个文件(`/etc/pam.d/common-password`)中,找到包含 `pam_cracklib.so` 的行。 + * 在该行末尾添加以下内容:`lcredit=-a ucredit=-b dcredit=-c ocredit=-d`。 + * 例如,下面这行要求密码必须至少包含一个每种字符。你可以根据你喜欢的密码安全级别来改变数字。`lcredit=-1 ucredit=-1 dcredit=-1 ocredit=-1`。 + +### 4、停用容易被利用的非必要服务。 + +停用不必要的服务是一种最好的做法。这样可以减少开放的端口,以便被利用。 + +安装 systemd 软件包: + +``` +sudo apt-get install systemd +``` + +查看哪些服务正在运行: + +``` +systemctl list-units +``` + +[识别][5] 哪些服务可能会导致你的系统出现潜在的漏洞。对于每个服务可以: + + * 停止当前正在运行的服务:`systemctl stop `。 + * 禁止服务在系统启动时启动:`systemctl disable `。 + * 运行这些命令后,检查服务的状态:`systemctl status `。 + +### 5、检查监听端口 + +开放的端口可能会带来安全风险,所以检查服务器上的监听端口很重要。我使用 [netstat][6] 命令来显示所有的网络连接: + +``` +netstat -tulpn +``` + +查看 “address” 列,确定 [端口号][7]。一旦你找到了开放的端口,检查它们是否都是必要的。如果不是,[调整你正在运行的服务][8],或者调整你的防火墙设置。 + +### 6、扫描恶意软件 + +杀毒扫描软件可以有用的防止病毒进入你的系统。使用它们是一种简单的方法,可以让你的服务器免受恶意软件的侵害。我首选的工具是开源软件 [ClamAV][9]。 + +安装 ClamAV: + +``` +sudo apt-get install clamav +``` + +更新病毒签名: + +``` +sudo freshclam +``` + +扫描所有文件,并打印出被感染的文件,发现一个就会响铃: + +``` +sudo clamscan -r --bell -i / +``` + +你可以而且应该设置为自动扫描,这样你就不必记住或花时间手动进行扫描。对于这样简单的自动化,你可以使用 [systemd 定时器][10] 或者你的 [喜欢的 cron][11] 来做到。 + +### 保证你的服务器安全 + +我们不能把保护服务器安全的责任只交给一个人或一个组织。随着威胁环境的不断迅速扩大,我们每个人都应该意识到服务器安全的重要性,并采用一些简单、有效的安全最佳实践。 + +这些只是你提升 Linux 服务器的安全可以采取的众多步骤中的一部分。当然,预防只是解决方案的一部分。这些策略应该与严格监控拒绝服务攻击、用 [Lynis][12] 做系统分析以及创建频繁的备份相结合。 + +你使用哪些开源工具来保证服务器的安全?在评论中告诉我们它们的情况。 + +-------------------------------------------------------------------------------- + +via: https://opensource.com/article/21/4/securing-linux-servers + +作者:[Sahana Sreeram][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/sahanasreeram01gmailcom +[b]: https://github.com/lujun9972 +[1]: https://opensource.com/sites/default/files/styles/image-full-size/public/lead-images/rh_003499_01_linux11x_cc.png?itok=XMDOouJR (People work on a computer server with devices) +[2]: https://www.redhat.com/sysadmin/secure-linux-network-firewall-cmd +[3]: https://opensource.com/article/20/2/firewall-cheat-sheet +[4]: https://wiki.ubuntu.com/UncomplicatedFirewall +[5]: http://www.yorku.ca/infosec/Administrators/UNIX_disable.html +[6]: https://docs.microsoft.com/en-us/windows-server/administration/windows-commands/netstat +[7]: https://en.wikipedia.org/wiki/List_of_TCP_and_UDP_port_numbers +[8]: https://opensource.com/article/20/5/systemd-units +[9]: https://www.clamav.net/ +[10]: https://opensource.com/article/20/7/systemd-timers +[11]: https://opensource.com/article/21/2/linux-automation +[12]: https://opensource.com/article/20/5/linux-security-lynis diff --git a/published/202104/20210412 Encrypt your files with this open source software.md b/published/202104/20210412 Encrypt your files with this open source software.md new file mode 100644 index 0000000000..bf2e9d9fd2 --- /dev/null +++ b/published/202104/20210412 Encrypt your files with this open source software.md @@ -0,0 +1,87 @@ +[#]: subject: (Encrypt your files with this open source software) +[#]: via: (https://opensource.com/article/21/4/open-source-encryption) +[#]: author: (Seth Kenlon https://opensource.com/users/seth) +[#]: collector: (lujun9972) +[#]: translator: (geekpi) +[#]: reviewer: (wxy) +[#]: publisher: (wxy) +[#]: url: (https://linux.cn/article-13304-1.html) + +用开源的 VeraCrypt 加密你的文件 +====== + +> VeraCrypt 提供跨平台的开源文件加密功能。 + +![](https://img.linux.net.cn/data/attachment/album/202104/17/110244p1g4tbpnw00tqwq3.jpg) + +许多年前,有一个名为 [TrueCrypt][2] 的加密软件。它的源码是可以得到的,尽管没有任何人声称曾对它进行过审计或贡献过。它的作者是(至今仍是)匿名的。不过,它是跨平台的,易于使用,而且真的非常有用。 + +TrueCrypt 允许你创建一个加密的文件“保险库”,在那里你可以存储任何类型的敏感信息(文本、音频、视频、图像、PDF 等)。只要你有正确的口令,TrueCrypt 就可以解密保险库,并在任何运行 TrueCrypt 的电脑上提供读写权限。这是一项有用的技术,它基本上提供了一个虚拟的、可移动的、完全加密的驱动器(除了文件以外),你可以在其中安全地存储你的数据。 + +TrueCrypt 最终关闭了,但一个名为 VeraCrypt 的替代项目迅速兴起,填补了这一空白。[VeraCrypt][3] 基于 TrueCrypt 7.1a,比原来的版本有许多改进(包括标准加密卷和引导卷的算法的重大变化)。在 VeraCrypt 1.12 及以后的版本中,你可以使用自定义迭代来提高加密安全性。更好的是,VeraCrypt 可以加载旧的 TrueCrypt 卷,所以如果你是 TrueCrypt 用户,可以很容易地将它们转移到 VeraCrypt 上。 + +### 安装 VeraCrypt + +你可以从 [VeraCrypt 下载页面][4] 下载相应的安装文件,之后在所有主流平台上安装 VeraCrypt。 + +另外,你也可以自己从源码构建它。在 Linux 上,它需要 wxGTK3、makeself 和通常的开发栈(Binutils、GCC 等)。 + +当你安装后,从你的应用菜单中启动 VeraCrypt。 + +### 创建一个 VeraCrypt 卷 + +如果你刚接触 VeraCrypt,你必须先创建一个 VeraCrypt 加密卷(否则,你没有任何东西可以解密)。在 VeraCrypt 窗口中,点击左侧的 “Create Volume” 按钮。 + +![Creating a volume with VeraCrypt][5] + +在出现的 VeraCrypt 的卷创建向导窗口中,选择要创建一个加密文件容器还是要加密整个驱动器或分区。向导将为你的数据创建一个保险库,所以请按照提示进行操作。 + +在本文中,我创建了一个文件容器。VeraCrypt 容器和其他文件很像:它保存在硬盘、外置硬盘、云存储或其他任何你能想到的存储数据的地方。与其他文件一样,它可以被移动、复制和删除。与大多数其他文件不同的是,它可以_容纳_更多的文件,这就是为什么我认为它是一个“保险库”,而 VeraCrypt 开发者将其称为“容器”。它的开发者将 VeraCrypt 文件称为“容器”,是因为它可以包含其他数据对象;它与 LXC、Kubernetes 和其他现代 IT 机制所流行的容器技术无关。 + +#### 选择一个文件系统 + +在创建卷的过程中,你会被要求选择一个文件系统来决定你放在保险库中的文件的存储方式。微软 FAT 格式是过时的、非日志型,并且限制了卷和文件的大小,但它是所有平台都能读写的一种格式。如果你打算让你的 VeraCrypt 保险库跨平台,FAT 是你最好的选择。 + +除此之外,NTFS 适用于 Windows 和 Linux。开源的 EXT 系列适用于 Linux。 + +### 挂载 VeraCrypt 加密卷 + +当你创建了 VeraCrypt 卷,你就可以在 VeraCrypt 窗口中加载它。要挂载一个加密库,点击右侧的 “Select File” 按钮。选择你的加密文件,选择 VeraCrypt 窗口上半部分的一个编号栏,然后点击位于 VeraCrypt 窗口左下角的 “Mount” 按钮。 + +你挂载的卷在 VeraCrypt 窗口的可用卷列表中,你可以通过文件管理器访问该卷,就像访问一个外部驱动器一样。例如,在 KDE 上,我打开 [Dolphin][7],进入 `/media/veracrypt1`,然后我就可以把文件复制到我的保险库里。 + +只要你的设备上有 VeraCrypt,你就可以随时访问你的保险库。在你手动在 VeraCrypt 中挂载之前,文件都是加密的,在那里,文件会保持解密,直到你再次关闭卷。 + +### 关闭 VeraCrypt 卷 + +为了保证你的数据安全,当你不需要打开 VeraCrypt 卷时,关闭它是很重要的。这样可以保证数据的安全,不被人窥视,且不被人趁机犯罪。 + +![Mounting a VeraCrypt volume][8] + +关闭 VeraCrypt 容器和打开容器一样简单。在 VeraCrypt 窗口中选择列出的卷,然后点击 “Dismount”。你就不能访问保险库中的文件了,其他人也不会再有访问权。 + +### VeraCrypt 轻松实现跨平台加密 + +有很多方法可以保证你的数据安全,VeraCrypt 试图为你提供方便,而无论你需要在什么平台上使用这些数据。如果你想体验简单、开源的文件加密,请尝试 VeraCrypt。 + +-------------------------------------------------------------------------------- + +via: https://opensource.com/article/21/4/open-source-encryption + +作者:[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/security-lock-password.jpg?itok=KJMdkKum (Lock) +[2]: https://en.wikipedia.org/wiki/TrueCrypt +[3]: https://www.veracrypt.fr/en/Home.html +[4]: https://www.veracrypt.fr/en/Downloads.html +[5]: https://opensource.com/sites/default/files/uploads/veracrypt-create.jpg (Creating a volume with VeraCrypt) +[6]: https://creativecommons.org/licenses/by-sa/4.0/ +[7]: https://en.wikipedia.org/wiki/Dolphin_%28file_manager%29 +[8]: https://opensource.com/sites/default/files/uploads/veracrypt-volume.jpg (Mounting a VeraCrypt volume) diff --git a/published/202104/20210413 Create an encrypted file vault on Linux.md b/published/202104/20210413 Create an encrypted file vault on Linux.md new file mode 100644 index 0000000000..94dde76530 --- /dev/null +++ b/published/202104/20210413 Create an encrypted file vault on Linux.md @@ -0,0 +1,113 @@ +[#]: subject: (Create an encrypted file vault on Linux) +[#]: via: (https://opensource.com/article/21/4/linux-encryption) +[#]: author: (Seth Kenlon https://opensource.com/users/seth) +[#]: collector: (lujun9972) +[#]: translator: (wxy) +[#]: reviewer: (wxy) +[#]: publisher: (wxy) +[#]: url: (https://linux.cn/article-13296-1.html) + +在 Linux 上创建一个加密文件保险库 +====== + +> 使用 Linux 统一密钥设置(LUKS)为物理驱动器或云存储上的敏感文件创建一个加密保险库。 + +![](https://img.linux.net.cn/data/attachment/album/202104/14/151220l5zkkxiukgzix54k.jpg) + +最近,我演示了如何在 Linux 上使用统一密钥设置Linux Unified Key Setup([LUKS][3])和 `cryptsetup` 命令 [实现全盘加密][2]。虽然加密整个硬盘在很多情况下是有用的,但也有一些原因让你不想对整个硬盘进行加密。例如,你可能需要让一个硬盘在多个平台上工作,其中一些平台可能没有集成 [LUKS][3]。此外,现在是 21 世纪,由于云的存在,你可能不会使用物理硬盘来处理所有的数据。 + +几年前,有一个名为 [TrueCrypt][4] 的系统,允许用户创建加密的文件保险库,可以通过 TrueCrypt 解密来提供读/写访问。这是一项有用的技术,基本上提供了一个虚拟的便携式、完全加密的驱动器,你可以在那里存储重要数据。TrueCrypt 项目关闭了,但它可以作为一个有趣的模型。 + +幸运的是,LUKS 是一个灵活的系统,你可以使用它和 `cryptsetup` 在一个独立的文件中创建一个加密保险库,你可以将其保存在物理驱动器或云存储中。 + +下面就来介绍一下怎么做。 + +### 1、建立一个空文件 + +首先,你必须创建一个预定大小的空文件。就像是一种保险库或保险箱,你可以在其中存储其他文件。你使用的命令是 `util-linux` 软件包中的 `fallocate`: + +``` +$ fallocate --length 512M vaultfile.img +``` + +这个例子创建了一个 512MB 的文件,但你可以把你的文件做成任何你想要的大小。 + +### 2、创建一个 LUKS 卷 + +接下来,在空文件中创建一个 LUKS 卷: + +``` +$ cryptsetup --verify-passphrase \ + luksFormat vaultfile.img +``` + +### 3、打开 LUKS 卷 + +要想创建一个可以存储文件的文件系统,必须先打开 LUKS 卷,并将其挂载到电脑上: + +``` +$ sudo cryptsetup open \ + --type luks vaultfile.img myvault +$ ls /dev/mapper +myvault +``` + +### 4、建立一个文件系统 + +在你打开的保险库中建立一个文件系统: + +``` +$ sudo mkfs.ext4 -L myvault /dev/mapper/myvault +``` + +如果你现在不需要它做什么,你可以关闭它: + +``` +$ sudo cryptsetup close myvault +``` + +### 5、开始使用你的加密保险库 + +现在一切都设置好了,你可以在任何需要存储或访问私人数据的时候使用你的加密文件库。要访问你的保险库,必须将其挂载为一个可用的文件系统: + +``` +$ sudo cryptsetup open \ + --type luks vaultfile.img myvault +$ ls /dev/mapper +myvault +$ sudo mkdir /myvault +$ sudo mount /dev/mapper/myvault /myvault +``` + +这个例子用 `cryptsetup` 打开保险库,然后把保险库从 `/dev/mapper` 下挂载到一个叫 `/myvault` 的新目录。和 Linux 上的任何卷一样,你可以把 LUKS 卷挂载到任何你想挂载的地方,所以除了 `/myvault`,你可以用 `/mnt` 或 `~/myvault` 或任何你喜欢的位置。 + +当它被挂载后,你的 LUKS 卷就会被解密。你可以像读取和写入文件一样读取和写入它,就像它是一个物理驱动器一样。 + +当使用完你的加密保险库时,请卸载并关闭它: + +``` +$ sudo umount /myvault +$ sudo cryptsetup close myvault +``` + +### 加密的文件保险库 + +你用 LUKS 加密的镜像文件和其他文件一样,都是可移动的,因此你可以将你的保险库存储在硬盘、外置硬盘,甚至是互联网上。只要你可以使用 LUKS,就可以解密、挂载和使用它来保证你的数据安全。轻松加密,提高数据安全性,不妨一试。 + +-------------------------------------------------------------------------------- + +via: https://opensource.com/article/21/4/linux-encryption + +作者:[Seth Kenlon][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/seth +[b]: https://github.com/lujun9972 +[1]: https://opensource.com/sites/default/files/styles/image-full-size/public/lead-images/life_bank_vault_secure_safe.png?itok=YoW93h7C (Secure safe) +[2]: https://opensource.com/article/21/3/encryption-luks +[3]: https://gitlab.com/cryptsetup/cryptsetup/blob/master/README.md +[4]: https://en.wikipedia.org/wiki/TrueCrypt diff --git a/published/202104/20210413 Create and Edit EPUB Files on Linux With Sigil.md b/published/202104/20210413 Create and Edit EPUB Files on Linux With Sigil.md new file mode 100644 index 0000000000..9a1a3e0397 --- /dev/null +++ b/published/202104/20210413 Create and Edit EPUB Files on Linux With Sigil.md @@ -0,0 +1,101 @@ +[#]: subject: (Create and Edit EPUB Files on Linux With Sigil) +[#]: via: (https://itsfoss.com/sigile-epub-editor/) +[#]: author: (Abhishek Prakash https://itsfoss.com/author/abhishek/) +[#]: collector: (lujun9972) +[#]: translator: (geekpi) +[#]: reviewer: (wxy) +[#]: publisher: (wxy) +[#]: url: (https://linux.cn/article-13325-1.html) + +用 Sigil 在 Linux 上创建和编辑 EPUB 文件 +====== + +![](https://img.linux.net.cn/data/attachment/album/202104/23/184455qn6u6oozmf6gmnec.jpg) + +Sigil 是一个开源的 Linux、Windows 和 MacOS 上的 EPUB 编辑器。你可以使用 Sigil 创建一个新的 EPUB 格式的电子书,或编辑现有的 EPUB 电子书(以 `.epub` 扩展结尾的文件)。 + +如果你感到好奇,EPUB 是一个标准的电子书格式,并被几个数字出版集团认可。它被许多设备和电子阅读器支持,除了亚马逊的 Kindle。 + +### Sigil 让你创建或编辑 EPUB 文件 + +[Sigil][1] 是一个允许你编辑 EPUB 文件的开源软件。当然,你可以从头开始创建一个新的 EPUB 文件。 + +![][2] + +很多人在 [创建或编辑电子书时非常相信 Calibre][3]。它确实是一个完整的工具,它有很多的功能,支持的格式不只是 EPUB 格式。然而,Calibre 有时可能需要过多的资源。 + +Sigil 只专注于 EPUB 书籍,它有以下功能: + + * 支持 EPUB 2 和 EPUB 3(有一定的限制) + * 提供代码视图预览 + * 编辑 EPUB 语法 + * 带有多级标题的目录生成器 + * 编辑元数据 + * 拼写检查 + * 支持正则查找和替换 + * 支持导入 EPUB、HTML 文件、图像和样式表 + * 额外插件 + * 多语言支持的接口 + * 支持 Linux、Windows 和 MacOS + +Sigil 不是你可以直接输入新书章节的 [所见即所得][4] 类型的编辑器。由于 EPUB 依赖于 XML,因此它专注于代码。可以将其视为用于 EPUB 文件的 [类似于 VS Code 的代码编辑器][5]。出于这个原因,你应该使用一些其他 [开源写作工具][6],以 epub 格式导出你的文件(如果可能的话),然后在 Sigil 中编辑它。 + +![][7] + +Sigil 有一个 [Wiki][8] 来提供一些安装和使用 Sigil 的文档。 + +### 在 Linux 上安装 Sigil + +Sigil 是一款跨平台应用,支持 Windows 和 macOS 以及 Linux。它是一个流行的软件,有超过十年的历史。这就是为什么你应该会在你的 Linux 发行版仓库中找到它。只要在你的发行版的软件中心应用中寻找它就可以了。 + +![Sigil in Ubuntu Software Center][9] + +你可能需要事先启用 universe 仓库。你也可以在 Ubuntu发行版中使用 `apt` 命令: + +``` +sudo apt install sigil +``` + +Sigil 有很多对 Python 库和模块的依赖,因此它下载和安装了大量的包。 + +![][10] + +我不会列出 Fedora、SUSE、Arch 和其他发行版的命令。你可能已经知道如何使用你的发行版的软件包管理器,对吧? + +你的发行版提供的版本不一定是最新的。如果你想要 Sigil 的最新版本,你可以查看它的 GitHub 仓库。 + +- [Sigil 的 GitHub 仓库][11] + +### 并不适合所有人,当然也不适合用于阅读 ePUB 电子书 + +我不建议使用 Sigil 阅读电子书。Linux 上有 [其他专门的应用来阅读 .epub 文件][12]。 + +如果你是一个必须处理 EPUB 书籍的作家,或者如果你在数字化旧书,并在各种格式间转换,Sigil 可能是值得一试。 + +我还没有大量使用 过 Sigil,所以我不提供对它的评论。我让你去探索它,并在这里与我们分享你的经验。 + +-------------------------------------------------------------------------------- + +via: https://itsfoss.com/sigile-epub-editor/ + +作者:[Abhishek Prakash][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/abhishek/ +[b]: https://github.com/lujun9972 +[1]: https://sigil-ebook.com/ +[2]: https://i2.wp.com/itsfoss.com/wp-content/uploads/2021/04/open-epub-sigil.png?resize=800%2C621&ssl=1 +[3]: https://itsfoss.com/create-ebook-calibre-linux/ +[4]: https://www.computerhope.com/jargon/w/wysiwyg.htm +[5]: https://itsfoss.com/best-modern-open-source-code-editors-for-linux/ +[6]: https://itsfoss.com/open-source-tools-writers/ +[7]: https://i2.wp.com/itsfoss.com/wp-content/uploads/2021/04/sigil-epub-editor-800x621.png?resize=800%2C621&ssl=1 +[8]: https://github.com/Sigil-Ebook/Sigil/wiki +[9]: https://i2.wp.com/itsfoss.com/wp-content/uploads/2021/04/sigil-software-center-ubuntu.png?resize=800%2C424&ssl=1 +[10]: https://i2.wp.com/itsfoss.com/wp-content/uploads/2021/04/installing-sigil-ubuntu.png?resize=800%2C547&ssl=1 +[11]: https://github.com/Sigil-Ebook/Sigil +[12]: https://itsfoss.com/open-epub-books-ubuntu-linux/ diff --git a/published/202104/20210414 Make your data boss-friendly with this open source tool.md b/published/202104/20210414 Make your data boss-friendly with this open source tool.md new file mode 100644 index 0000000000..5104978e55 --- /dev/null +++ b/published/202104/20210414 Make your data boss-friendly with this open source tool.md @@ -0,0 +1,108 @@ +[#]: subject: (Make your data boss-friendly with this open source tool) +[#]: via: (https://opensource.com/article/21/4/visualize-data-eda) +[#]: author: (Juanjo Ortilles https://opensource.com/users/jortilles) +[#]: collector: (lujun9972) +[#]: translator: (geekpi) +[#]: reviewer: (wxy) +[#]: publisher: (wxy) +[#]: url: (https://linux.cn/article-13310-1.html) + +用这个开源工具让你的数据对老板友好起来 +====== + +> 企业数据分析旨在将数据可视化带给日常商务用户。 + +![](https://img.linux.net.cn/data/attachment/album/202104/19/092617elri0ff4r6lr06rr.jpg) + +企业数据分析Enterprise Data Analytics([EDA][2]) 是一个网页应用,它可以通过一个简单、清晰的界面来获取信息。 + +在巴塞罗那开源分析公司 [Jortilles][3] 工作几年后,我们意识到,现代世界强制性地收集数据,但普通人没有简单的方法来查看或解释这些数据。有一些强大的开源工具可用于此目的,但它们非常复杂。我们找不到一个工具设计成能让没有什么技术能力的普通人轻松使用。 + +我们之所以开发 EDA,是因为我们认为获取信息是现代组织的要求和义务,并希望为每个人提供获取信息的机会。 + +![EDA interface][4] + +### 可视化你的数据 + +EDA 使用人们已经理解的商业术语提供了一个数据模型。你可以选择你想要的信息,并可以以你想要的方式查看它。它的目标是对用户友好,同时又功能强大。 + +EDA 通过元数据模型将数据库中的信息可视化和丰富化。它可以从 BigQuery、Postgres、[MariaDB、MySQL][6] 和其他一些数据库中读取数据。这就把技术性的数据库模型转化为熟悉的商业概念。 + +它还设计为加快信息传播的速度,因为它可以利用已经存储在数据库中的数据。EDA 可以发现数据库的拓扑结构,并提出业务模型。如果你设计了一个好的数据库模型,你就有了一个好的业务模型。EDA 还可以连接到生产服务器,提供实时分析。 + +这种数据和数据模型的结合意味着你和你组织中的任何人都可以分析其数据。然而,为了保护数据,你可以定义数据安全,可以精确到行,以授予正当的人访问正当的数据。 + +EDA 的一些功能包括: + + * 自动生成数据模型 + * 一致的数据模型,防止出现不一致的查询 + * 高级用户的 SQL 模式 + * 数据可视化: + * 标准图表(如柱状图、饼状图、线状图、树状图) + * 地图整合(如 geoJSON shapefile、纬度、经度) + * 电子邮件提醒,可通过关键绩效指标 (KPI) 来定义 + * 私人和公共信息控制,以启用私人和公共仪表板,你可以通过链接分享它。 + * 数据缓存和程序刷新。 + +### 如何使用 EDA + +用 EDA 实现数据可视化的第一步是创建数据模型。 + +#### 创建数据模型 + +首先,在左侧菜单中选择 “New Datasource”。 + +接下来,选择你的数据存储的数据库系统(如 Postgres、MariaDB、MySQL、Vertica、SqlServer、Oracle、Big Query),并提供连接参数。 + +EDA 将自动为你生成数据模型。它读取表和列,并为它们定义名称以及表之间的关系。你还可以通过添加虚拟视图或 geoJSON 图来丰富你的数据模型。 + +#### 制作仪表板 + +现在你已经准备好制作第一个仪表板了。在 EDA 界面的主页面上,你应该会看到一个 “New dashboard” 按钮。点击它,命名你的仪表板,并选择你创建的数据模型。新的仪表板将出现一个面板供你配置。 + +要配置面板,请单击右上角的 “Configuration” 按钮,并选择你要做的事情。在 “Edit query” 中,选择你要显示的数据。这将出现一个新的窗口,你的数据模型由实体和实体的属性表示。选择你要查看的实体和你要使用的属性。例如,对于名为 “Customers” 的实体,你可能会显示 “Customer Name”,对于 “Sales” 实体,你可能希望显示 “Total Sales”。 + +接下来,运行一个查询,并选择你想要的可视化。 + +![EDA interface][7] + +你可以添加任意数量的面板、过滤器和文本字段,所有这些都有说明。当你保存仪表板后,你可以查看它,与同事分享,甚至发布到互联网上。 + +### 获取 EDA + +最快的方法是用 [公开演示][8] 来查看 EDA。但如果你想自己试一试,可以用 Docker 获取最新的 EDA 版本: + +``` +$ docker run -p 80:80 jortilles / eda: latest +``` + +我们还有一个 SaaS 选项,适用于任何想要使用 EDA 而无需进行安装、配置和持续更新的用户。你可以在我们的网站上查看 [云选项][9]。 + +如果你想看看它的实际运行情况,你可以在 YouTube 上观看一些 [演示][10]。 + +EDA 正在持续开发中,你可以在 GitHub 上找到它的 [源代码][11]。 + +-------------------------------------------------------------------------------- + +via: https://opensource.com/article/21/4/visualize-data-eda + +作者:[Juanjo Ortilles][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/jortilles +[b]: https://github.com/lujun9972 +[1]: https://opensource.com/sites/default/files/styles/image-full-size/public/lead-images/metrics_data_dashboard_system_computer_analytics.png?itok=oxAeIEI- (metrics and data shown on a computer screen) +[2]: https://eda.jortilles.com/en/jortilles-english/ +[3]: https://www.jortilles.com/ +[4]: https://opensource.com/sites/default/files/uploads/eda-display.jpeg (EDA interface) +[5]: https://creativecommons.org/licenses/by-sa/4.0/ +[6]: https://opensource.com/article/20/10/mariadb-mysql-cheat-sheet +[7]: https://opensource.com/sites/default/files/uploads/eda-chart.jpeg (EDA interface) +[8]: https://demoeda.jortilles.com/ +[9]: https://eda.jortilles.com +[10]: https://youtu.be/cBAAJbohHXQ +[11]: https://github.com/jortilles/EDA diff --git a/published/202104/20210419 4 steps to customizing your Mac terminal theme with open source tools.md b/published/202104/20210419 4 steps to customizing your Mac terminal theme with open source tools.md new file mode 100644 index 0000000000..19237b5d7c --- /dev/null +++ b/published/202104/20210419 4 steps to customizing your Mac terminal theme with open source tools.md @@ -0,0 +1,88 @@ +[#]: subject: (4 steps to customizing your Mac terminal theme with open source tools) +[#]: via: (https://opensource.com/article/21/4/zsh-mac) +[#]: author: (Bryant Son https://opensource.com/users/brson) +[#]: collector: (lujun9972) +[#]: translator: (geekpi) +[#]: reviewer: (wxy) +[#]: publisher: (wxy) +[#]: url: (https://linux.cn/article-13323-1.html) + +用开源工具定制 Mac 终端主题的 4 个步骤 +====== + +> 用开源工具让你的终端窗口在 Mac 上漂亮起来。 + +![](https://img.linux.net.cn/data/attachment/album/202104/22/234534t3t7ntpvdde3v892.jpg) + +你是否曾经厌倦了在你的 macOS 电脑上看到同样老式的终端窗口?如果是这样,使用开源的 Oh My Zsh 框架和 Powerlevel10k 主题为你的视图添加一些点缀。 + +这个基本的逐步教程将让你开始定制你的 macOS 终端。如果你是一个 Linux 用户,请查看 Seth Kenlon 的指南 [为 Zsh 添加主题和插件][2] 以获得深入指导。 + +### 步骤 1:安装 Oh My Zsh + +[Oh My Zsh][3] 是一个开源的、社区驱动的框架,用于管理你的 Z shell (Zsh) 配置。 + +![Oh My Zsh][4] + +Oh My Zsh 是在 MIT 许可下发布的。使用以下命令安装: + +``` +$ sh -c "$(curl -fsSL https://raw.github.com/ohmyzsh/ohmyzsh/master/tools/install.sh)" +``` + +### 步骤 2:安装 Powerlevel10k 字体 + +![Powerlevel10k][6] + +Powerlevel10k 是一个 MIT 许可的 Zsh 主题。在安装 Powerlevel10k 之前,你需要为你的终端安装自定义字体。 + +到 [Powerlevel10 GitHub][7] 页面,在 `README` 中 搜索 “fonts”。安装自定义字体的步骤会根据你的操作系统而有所不同。这只需要简单地点击-下载-安装的系列操作。 + +![Powerlevel10k fonts][8] + +### 步骤 3:安装 Powerlevel10k 主题 + +接下来,运行以下命令安装 Powerlevel10k: + +``` +git clone --depth=1 https://github.com/romkatv/powerlevel10k.git ${ZSH_CUSTOM:-$HOME/.oh-my-zsh/custom}/themes/powerlevel10k +``` + +完成后,用文本编辑器,比如 [Vim][9],打开 `~/.zshrc` 配置文件,设置行 `ZSH_THEME="powerlevel10k/powerlevel10k`,然后保存文件。 + +### 步骤 4:完成 Powerlevel10 的设置 + +打开一个新的终端,你应该看到 Powerlevel10k 配置向导。如果没有,运行 `p10k configure` 来调出配置向导。如果你在步骤 2 中安装了自定义字体,那么图标和符号应该正确显示。将默认字体更改为 `MeslowLG NF`。 + +![Powerlevel10k configuration][10] + +当你完成配置后,你应该会看到一个漂亮的终端。 + +![Oh My Zsh/Powerlevel10k theme][11] + +就是这些了!你应该可以享受你美丽的新终端了。 + +-------------------------------------------------------------------------------- + +via: https://opensource.com/article/21/4/zsh-mac + +作者:[Bryant Son][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/brson +[b]: https://github.com/lujun9972 +[1]: https://opensource.com/sites/default/files/styles/image-full-size/public/lead-images/freedos.png?itok=aOBLy7Ky (4 different color terminal windows with code) +[2]: https://opensource.com/article/19/9/adding-plugins-zsh +[3]: https://ohmyz.sh/ +[4]: https://opensource.com/sites/default/files/uploads/1_ohmyzsh.jpg (Oh My Zsh) +[5]: https://creativecommons.org/licenses/by-sa/4.0/ +[6]: https://opensource.com/sites/default/files/uploads/2_powerlevel10k.jpg (Powerlevel10k) +[7]: https://github.com/romkatv/powerlevel10k +[8]: https://opensource.com/sites/default/files/uploads/3_downloadfonts.jpg (Powerlevel10k fonts) +[9]: https://opensource.com/resources/what-vim +[10]: https://opensource.com/sites/default/files/uploads/4_p10kconfiguration.jpg (Powerlevel10k configuration) +[11]: https://opensource.com/sites/default/files/uploads/5_finalresult.jpg (Oh My Zsh/Powerlevel10k theme) diff --git a/published/202104/20210419 Something bugging you in Fedora Linux- Let-s get it fixed.md b/published/202104/20210419 Something bugging you in Fedora Linux- Let-s get it fixed.md new file mode 100644 index 0000000000..c379370092 --- /dev/null +++ b/published/202104/20210419 Something bugging you in Fedora Linux- Let-s get it fixed.md @@ -0,0 +1,70 @@ +[#]: subject: (Something bugging you in Fedora Linux? Let’s get it fixed!) +[#]: via: (https://fedoramagazine.org/something-bugging-you-in-fedora-linux-lets-get-it-fixed/) +[#]: author: (Matthew Miller https://fedoramagazine.org/author/mattdm/) +[#]: collector: (lujun9972) +[#]: translator: (DCOLIVERSUN) +[#]: reviewer: (wxy) +[#]: publisher: (wxy) +[#]: url: (https://linux.cn/article-13333-1.html) + +Fedora Linux 中有 Bug 吗?一起来修复它! +====== + +![][1] + +软件有 bug。任何复杂系统都无法保证每个部分都能按计划工作。Fedora Linux 是一个 _非常_ 复杂的系统,包含几千个包,这些包由全球无数个独立的上游项目创建。每周还有数百个更新。因此,问题是不可避免的。本文介绍了 bug 修复过程以及如何确定 bug 优先级。 + +### 发布开发过程 + +作为一个 Linux 发行项目,我们希望为用户提供完善的、一切正常的体验。我们的发布起始于 “Rawhide”。我们在 Rawhide 中集成了所有更新的自由及开源软件的新版本。我们一直在不断改进正在进行的测试和持续集成Continuous Integration过程,为了让即使是 Rawhide 也能被冒险者安全使用。可是,从本质来讲,Rawhide 始终有点粗糙。 + +每年两次,我们把这个粗糙的操作系统先后分支到测试版本、最终版本。当我们这么做时,我们齐心协力地寻找问题。我们在测试日Test Days检查特定的区域和功能。制作“候选版本Candidate builds”,并根据我们的 [发布验证测试计划][2] 进行检测。然后我们进入冻结状态freeze state,只有批准的更改可以并入候选版本。这就把候选版本从持续的开发隔离开来,持续的开发不断并入 Rawhide 中。所以,不会引入新的问题。 + +在发布过程中许多 bug 被粉碎去除,这些 bug 有大有小。当一切按计划进行时,我们为所有用户提供了按计划发布的崭新的 Fedora Linux 版本。(在过去几年里,我们已经可靠地重复这一动作——感谢每一个为之努力工作的人!)如果确实有问题,我们可以将其标记为发布阻碍release blocker。这就意味着我们要等到修复后才能发布。发布阻碍通常代表重大问题,该表达一定会引发对 bug 的关注。 + +有时,我们遇到的一些问题是持续存在的。可能一些问题已经持续了一两个版本,或者我们还没有达成共识的解决方案。有些问题确实困扰着许多用户,但个别问题并没有达到阻碍发布的程度。我们可以将这些东西标记为阻碍blocker。但这会像锤子一样砸下来。阻碍可能导致最终粉碎该 bug,但也可能导致破坏了周围。如果进度落后,所有其它的 bug 修复、改进以及人们一直在努力的功能,都不能到达用户手中。 + +### 按优先顺序排列 bug 流程 + +所以,我们有另一种方法来解决烦人的 bug。[按优先顺序排列 bug 流程][3],与其他方式不同,可以标出导致大量用户不满意的问题。这里没有锤子,更像是聚光灯。与发布阻碍不同,按优先顺序排列 bug 流程没有一套严格定义的标准。每个 bug 都是根据影响范围和严重性来评估的。 + +一个由感兴趣的贡献者组成的团队帮助策划一个简短列表,上面罗列着需要注意的问题。然后,我们的工作是将问题匹配到能够解决它们的人。这有助于减轻发布过程中的压力,因为它没有给问题指定任何特定的截止时间。理想情况下,我们能在进入测试阶段之前就发现并解决问题。我们尽量保持列表简短,不会超过几个,这样才会真正有重点。这种做法有助于团队和个人解决问题,因为他们知道我们尊重他们捉襟见肘的时间与精力。 + +通过这个过程,Fedora 解决了几十个严重而恼人的问题,包括从键盘输入故障到 SELinux 错误,再到数千兆字节大小的旧包更新会逐渐填满你的磁盘。但是我们可以做得更多——我们实际上收到的提案没有达到我们的处理能力上限。因此,如果你知道有什么事情导致了长期挫折或影响了很多人,至今没有达成解决方案,请遵循 [按优先顺序排列 bug 流程][3],提交给我们。 + +### 你可以帮助我们 + +邀请所有 Fedora 贡献者参与按优化顺序排列 bug 的流程。评估会议每两周在 IRC 上举办一次。欢迎任何人加入并帮助我们评估提名的 bug。会议时间和地点参见 [日历][4]。Fedora 项目经理在会议开始的前一天将议程发送到 [triage][5] 和 [devel][6] 邮件列表。 + +### 欢迎报告 bug + +当你发现 bug 时,无论大小,我们很感激你能报告 bug。在很多情况下,解决 bug 最好的方式是交给创建该软件的项目。例如,假设渲染数据相机照片的 Darktable 摄影软件出了问题,最好把它带给 Darktable 摄影软件的开发人员。再举个例子,假设 GNOME 或 KDE 桌面环境或组成部分软件出了问题,将这些问题交给这些项目中通常会得到最好的结果。 + +然而, 如果这是一个特定的 Fedora 问题,比如我们的软件构建或配置或者它的集成方式的问题,请毫不犹豫地 [向我们提交 bug][7]。当你知道有一个问题是我们还没有解决的,也要提交给我们。 + +我知道这很复杂……最好有一个一站式的地方来处理所有 bug。但是请记住,Fedora 打包者大部分是志愿者,他们负责获取上游软件并将其配置到我们系统中。他们并不总是对他们正在使用的软件的代码有深入研究的专家。有疑问的时候,你可以随时提交一个 [Fedora bug][7]。Fedora 中负责相应软件包的人可以通过他们与上游软件项目的联系提供帮助。 + +请记住,当你发现一个已通过诊断但尚未得到良好修复的 bug 时,当你看到影响很多人的问题时,或者当有一个长期存在的问题没有得到关注时,请将其提名为高优先级 bug。我们会看以看能做些什么。 + +_附言:标题中的著名图片当然是来自哈佛大学马克 2 号计算机的日志,这里曾是格蕾丝·赫柏少将工作的地方。但是与这个故事的普遍看法相背,这并不是 “bug” 一词第一次用于表示系统问题——它在工程中已经很常见了,这就是为什么发现一个字面上的 “bug” 作为问题的原因是很有趣的。 #nowyouknow #jokeexplainer_ + +-------------------------------------------------------------------------------- + +via: https://fedoramagazine.org/something-bugging-you-in-fedora-linux-lets-get-it-fixed/ + +作者:[Matthew Miller][a] +选题:[lujun9972][b] +译者:[DCOLIVERSUN](https://github.com/DCOLIVERSUN) +校对:[wxy](https://github.com/wxy) + +本文由 [LCTT](https://github.com/LCTT/TranslateProject) 原创编译,[Linux中国](https://linux.cn/) 荣誉推出 + +[a]: https://fedoramagazine.org/author/mattdm/ +[b]: https://github.com/lujun9972 +[1]: https://fedoramagazine.org/wp-content/uploads/2021/04/bugging_you-816x345.jpg +[2]: https://fedoraproject.org/wiki/QA:Release_validation_test_plan +[3]: https://docs.fedoraproject.org/en-US/program_management/prioritized_bugs/ +[4]: https://calendar.fedoraproject.org/base/ +[5]: https://lists.fedoraproject.org/archives/list/triage%40lists.fedoraproject.org/ +[6]: https://lists.fedoraproject.org/archives/list/devel%40lists.fedoraproject.org/ +[7]: https://docs.fedoraproject.org/en-US/quick-docs/howto-file-a-bug/ diff --git a/published/202104/20210420 Blanket- Ambient Noise App With Variety of Sounds to Stay Focused.md b/published/202104/20210420 Blanket- Ambient Noise App With Variety of Sounds to Stay Focused.md new file mode 100644 index 0000000000..5c9c76d025 --- /dev/null +++ b/published/202104/20210420 Blanket- Ambient Noise App With Variety of Sounds to Stay Focused.md @@ -0,0 +1,80 @@ +[#]: subject: (Blanket: Ambient Noise App With Variety of Sounds to Stay Focused) +[#]: via: (https://itsfoss.com/blanket-ambient-noise-app/) +[#]: author: (Ankush Das https://itsfoss.com/author/ankush/) +[#]: collector: (lujun9972) +[#]: translator: (geekpi) +[#]: reviewer: (wxy) +[#]: publisher: (wxy) +[#]: url: (https://linux.cn/article-13343-1.html) + +Blanket:拥有各种环境噪音的应用,帮助保持注意力集中 +====== + +> 一个开源的环境噪音播放器,提供各种声音,帮助你集中注意力或入睡。 + +![](https://img.linux.net.cn/data/attachment/album/202104/29/094813oxcitipetajxjiex.jpg) + +随着你周围活动的增加,要保持冷静和专注往往是很困难的。 + +有时,音乐会有所帮助,但在某些情况下也会分散注意力。但是,环境噪音如何?这总是让人听起来很舒心。谁不想在餐厅里听到鸟叫声、雨滴声和人群的交谈声?好吧,可能不是最后一个,但听自然的声音可以帮助放松和集中注意力。这间接地提高了你的工作效率。 + +最近,我发现了一个专门的播放器,其中包含了不同的声音,可以帮助任何人集中注意力。 + +### 使用 Blanket 播放不同的环境声音 + +Blanket 是一个令人印象深刻的环境噪音播放器,它具有不同的声音,可以帮助你入睡或只是通过帮助你忘记周围的干扰来重获注意力。 + +它包括自然界的声音,像雨声、海浪声、鸟鸣声、风暴声、风声、水流声、夏夜声。 + +![][1] + +此外,如果你是一个通勤者或在轻微繁忙的环境中感到舒适的人,你可以找到火车、船、城市、咖啡馆或壁炉的声音。 + +如果你喜欢白噪声或粉红噪声,它结合了人类能听到的所有声音频率,这里也可以找到。 + +它还可以让你在每次开机时自动启动,如果你喜欢这样的话。 + +![][2] + +### 在 Linux 上安装 Blanket + +安装 Blanket 的最好方法是来自 [Flathub][3]。考虑到你已经启用了 [Flatpak][4],你只需在终端键入以下命令就可以安装它: + +``` +flatpak install flathub com.rafaelmardojai.Blanket +``` + +如果你是 Flatpak 的新手,你可能想通过我们的 [Flatpak 指南][5]了解。 + +如果你不喜欢使用 Flatpak,你可以使用该项目中的贡献者维护的 PPA 来安装它。对于 Arch Linux 用户,你可以在 [AUR][6] 中找到它,以方便安装。 + +此外,你还可以找到 Fedora 和 openSUSE 的软件包。要探索所有现成的软件包,你可以前往其 [GitHub 页面][7]。 + +### 结束语 + +对于一个简单的环境噪音播放器来说,用户体验是相当好的。我有一副 HyperX Alpha S 耳机,我必须要说,声音的质量很好。 + +换句话说,它听起来很舒缓,如果你想体验环境声音来集中注意力,摆脱焦虑或只是睡着,我建议你试试。 + +你试过它了吗?欢迎在下面分享你的想法。 + +-------------------------------------------------------------------------------- + +via: https://itsfoss.com/blanket-ambient-noise-app/ + +作者:[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://i2.wp.com/itsfoss.com/wp-content/uploads/2021/04/blanket-screenshot.png?resize=614%2C726&ssl=1 +[2]: https://i1.wp.com/itsfoss.com/wp-content/uploads/2021/04/blanket-autostart-1.png?resize=514%2C214&ssl=1 +[3]: https://flathub.org/apps/details/com.rafaelmardojai.Blanket +[4]: https://itsfoss.com/what-is-flatpak/ +[5]: https://itsfoss.com/flatpak-guide/ +[6]: https://itsfoss.com/aur-arch-linux/ +[7]: https://github.com/rafaelmardojai/blanket diff --git a/published/202104/20210420 The Guided Installer in Arch is a Step in the Right Direction.md b/published/202104/20210420 The Guided Installer in Arch is a Step in the Right Direction.md new file mode 100644 index 0000000000..3a6cc82345 --- /dev/null +++ b/published/202104/20210420 The Guided Installer in Arch is a Step in the Right Direction.md @@ -0,0 +1,78 @@ +[#]: subject: (The Guided Installer in Arch is a Step in the Right Direction) +[#]: via: (https://news.itsfoss.com/arch-new-guided-installer/) +[#]: author: (Jacob Crume https://news.itsfoss.com/author/jacob/) +[#]: collector: (lujun9972) +[#]: translator: (Kevin3599) +[#]: reviewer: (wxy) +[#]: publisher: (wxy) +[#]: url: (https://linux.cn/article-13328-1.html) + +Arch Linux 中的引导式安装程序是迈向正确的一步 +====== + +> 在 Arch ISO 中加入一个可选的引导式安装程序,对新手和高级用户都有好处。 + +![](https://i0.wp.com/news.itsfoss.com/wp-content/uploads/2021/04/arch-linux-opinion.png?w=1200&ssl=1) + +20 年来,Arch Linux 为用户提供了一个完全定制、独特的系统。这些年来,它以牺牲用户友好性为代价,赢得了在定制方面独有的声誉。 + +作为滚动发行版本,Arch Linux 不提供任何固定发行版本,而是每月更新一次。但是,如果你在最近几周下载了 Arch Linux,那么你很可能已经注意到了一个新的附加功能:archinstall。它使 Arch Linux 更加易于安装。 + +![][3] + +今天,我将探讨 archinstall 的发布对未来的 Arch Linux 项目和发行版意味着什么。 + +### Arch Linux 新的发展方向? + +![][4] + +尽管很多人对此感到惊讶,但默认情况下包含官方安装程序实际上是非常明智的举动。这意味着 Arch Linux 的发展方向发生变化,即在保留使其知名的定制性同时更加侧重用户的易用性。 + +在该安装程序的 GitHub 页面上有这样的描述: + +> “引导性安装程序会给用户提供一个友好的逐步安装方式,但是关键在于这个安装程序是个选项,它是可选的,绝不会强迫用户使用其进行安装。” + +这意味着新的安装程序不会影响高级用户,同时也使得其可以向更广泛的受众开放,在这一改动所带来的许多优点之中,一个显著的优点即是:更广泛的用户。 + +更多的用户意味着对项目的更多支持,不管其是通过网络捐赠或参与 Arch Linux 的开发,随着这些项目贡献的增加,不管是新用户还是有经验的用户的使用体验都会得到提升。 + +### 这必然要发生 + +回顾过去,我们可以看到安装介质增加了许多对新用户有所帮助的功能。这些示例包括 pacstrap(一个安装基本系统的工具)和 reflector(查找最佳 pacman 镜像的工具)。 + +另外,多年来,用户一直在追求使用脚本安装的方法,新安装程序允许了用户使用安装脚本。它能够使用 Python 编写脚本,这使得管理员的部署更加容易,成为一个非常有吸引力的选择。 + +### 更多可定制性(以某种方式?) + +尽管这看上去可能有些反直觉,但是这个安装程序实际上能够增进 Arch Linux 的可定制性。当前,Arch Linux 定制性的最大瓶颈是用户的技术水平,而这一问题能够通过 archinstall 解决。 + +有了新的安装程序,用户不需要掌握创建完美开发环境的技巧,安装程序可以帮助用户完成这些工作,这提供了广泛的自定义选项,是普通用户难以实现的。 + +### 总结 + +有了这一新功能,Arch Linux 似乎正在向着“用户友好”这一软件设计哲学靠近,新安装程序为新手和高级用户提供了广泛的好处。其中包括更广泛的定制性和更大的用户社区。 + +总而言之,这个新变动对整个 Arch Linux 社区都会产生积极的影响。 + +你对这个 Arch Linux 安装程序怎么看?是否已经尝试过它了呢? + +-------------------------------------------------------------------------------- + +via: https://news.itsfoss.com/arch-new-guided-installer/ + +作者:[Jacob Crume][a] +选题:[lujun9972][b] +译者:[Kevin3599](https://github.com/Kevin3599) +校对:[wxy](https://github.com/wxy) + +本文由 [LCTT](https://github.com/LCTT/TranslateProject) 原创编译,[Linux中国](https://linux.cn/) 荣誉推出 + +[a]: https://news.itsfoss.com/author/jacob/ +[b]: https://github.com/lujun9972 +[1]: https://itsfoss.com/rolling-release/ +[2]: https://news.itsfoss.com/arch-linux-easy-install/ +[3]: https://i1.wp.com/news.itsfoss.com/wp-content/uploads/2021/04/arch-install-tool.png?resize=780%2C411&ssl=1 +[4]: https://i0.wp.com/github.com/archlinux/archinstall/raw/master/docs/logo.png?resize=371%2C371&ssl=1 +[5]: https://man.archlinux.org/man/pacstrap.8 +[6]: https://wiki.archlinux.org/index.php/Reflector + diff --git a/published/202104/20210421 How to Delete Partitions in Linux -Beginner-s Guide.md b/published/202104/20210421 How to Delete Partitions in Linux -Beginner-s Guide.md new file mode 100644 index 0000000000..e04bca1d9d --- /dev/null +++ b/published/202104/20210421 How to Delete Partitions in Linux -Beginner-s Guide.md @@ -0,0 +1,131 @@ +[#]: subject: (How to Delete Partitions in Linux [Beginner’s Guide]) +[#]: via: (https://itsfoss.com/delete-partition-linux/) +[#]: author: (Chris Patrick Carias Stas https://itsfoss.com/author/chris/) +[#]: collector: (lujun9972) +[#]: translator: (geekpi) +[#]: reviewer: (wxy) +[#]: publisher: (wxy) +[#]: url: (https://linux.cn/article-13346-1.html) + +如何在 Linux 中删除分区 +====== + +![](https://img.linux.net.cn/data/attachment/album/202104/30/095353uhtbhm2fqx44aqfo.jpg) + +管理分区是一件严肃的事情,尤其是当你不得不删除它们时。我发现自己经常这样做,特别是在使用 U 盘作为实时磁盘和 Linux 安装程序之后,因为它们创建了几个我以后不需要的分区。 + +在本教程中,我将告诉你如何使用命令行和 GUI 工具在 Linux 中删除分区。 + +> 警告! +> +> 删除了分区,就会失去你的数据。无论何时,当你在操作分区时,一定要备份你的数据。一个轻微的打字错误或手滑都可能是昂贵的。不要说我们没有警告你! + +### 使用 GParted 删除磁盘分区 (GUI 方法) + +作为一个桌面 Linux 用户,你可能会对基于 GUI 的工具感到更舒服,也许更安全。 + +有 [几个让你在 Linux 上管理分区的工具][3]。根据你的发行版,你的系统上已经安装了一个甚至多个这样的工具。 + +在本教程中,我将使用 [GParted][4]。它是一个流行的开源工具,使用起来非常简单和直观。 + +第一步是 [安装 GParted][5],如果它还没有在你的系统中。你应该能够在你的发行版的软件中心找到它。 + +![][6] + +或者,你也可以使用你的发行版的软件包管理器来安装它。在基于 Debian 和 Ubuntu 的 Linux 发行版中,你可以 [使用 apt install 命令][7]: + +``` +sudo apt install gparted +``` + +安装完毕后,让我们打开 **GParted**。由于你正在处理磁盘分区,你需要有 root 权限。它将要求进行认证,打开后,你应该看到一个类似这样的窗口: + +![][8] + +在右上角,你可以选择磁盘,在下面选择你想删除的分区。 + +接下来,从分区菜单中选择 “删除” 选项: + +![][9] + +这个过程是没有完整完成的,直到你重写分区表。这是一项安全措施,它让你在确认之前可以选择审查更改。 + +要完成它,只需点击位于工具栏中的 “应用所有操作” 按钮,然后在要求确认时点击 “应用”。 + +![][10] + +点击 “应用” 后,你会看到一个进度条和一个结果消息说所有的操作都成功了。你可以关闭该信息和主窗口,并认为你的分区已从磁盘中完全删除。 + +现在你已经知道了 GUI 的方法,让我们继续使用命令行。 + +### 使用 fdisk 命令删除分区(CLI 方法) + +几乎每个 Linux 发行版都默认带有 [fdisk][11],我们今天就来使用这个工具。你需要知道的第一件事是,你想删除的分区被分配到哪个设备上了。为此,在终端输入以下内容: + +``` +sudo fdisk --list +``` + +这将打印出我们系统中所有的驱动器和分区,以及分配的设备。你 [需要有 root 权限][12],以便让它发挥作用。 + +在本例中,我将使用一个包含两个分区的 USB 驱动器,如下图所示: + +![][13] + +系统中分配的设备是 `/sdb`,它有两个分区:`sdb1` 和 `sdb2`。现在你已经确定了哪个设备包含这些分区,你可以通过使用 `fdisk` 和设备的路径开始操作: + +``` +sudo fdisk /dev/sdb +``` + +这将在命令模式下启动 `fdisk`。你可以随时按 `m` 来查看选项列表。 + +接下来,输入 `p`,然后按回车查看分区信息,并确认你正在使用正确的设备。如果使用了错误的设备,你可以使用 `q` 命令退出 `fdisk` 并重新开始。 + +现在输入 `d` 来删除一个分区,它将立即询问分区编号,这与 “Device” 列中列出的编号相对应,在这个例子中是 1 和 2(在下面的截图中可以看到),但是可以也会根据当前的分区表而有所不同。 + +![][14] + +让我们通过输入 `2` 并按下回车来删除第二个分区。你应该看到一条信息:**“Partition 2 has been deleted”**,但实际上,它还没有被删除。`fdisk` 还需要一个步骤来重写分区表并应用这些变化。你看,这就是完全网。 + +你需要输入 `w`,然后按回车来使这些改变成为永久性的。没有再要求确认。 + +在这之后,你应该看到下面这样的反馈: + +![][15] + +现在,使用 `sudo fdisk --list /dev/sdb` 查看该设备的当前分区表,你可以看到第二个分区已经完全消失。你已经完成了使用终端和 `fdisk` 命令来删除你的分区。成功了! + +#### 总结 + +这样,这个关于如何使用终端和 GUI 工具在 Linux 中删除分区的教程就结束了。记住,要始终保持安全,在操作分区之前备份你的文件,并仔细检查你是否使用了正确的设备。删除一个分区将删除其中的所有内容,而几乎没有 [恢复][16] 的机会。 + +-------------------------------------------------------------------------------- + +via: https://itsfoss.com/delete-partition-linux/ + +作者:[Chris Patrick Carias Stas][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/chris/ +[b]: https://github.com/lujun9972 +[1]: tmp.Q615QYIwTl#gparted +[2]: tmp.Q615QYIwTl#fdisk +[3]: https://itsfoss.com/partition-managers-linux/ +[4]: https://gparted.org/index.php +[5]: https://itsfoss.com/gparted/ +[6]: https://i2.wp.com/itsfoss.com/wp-content/uploads/2021/04/gparted-ubuntu-software-center.png?resize=800%2C348&ssl=1 +[7]: https://itsfoss.com/apt-command-guide/ +[8]: https://i0.wp.com/itsfoss.com/wp-content/uploads/2021/04/removing-partitions-linux-004.png?resize=800%2C542&ssl=1 +[9]: https://i2.wp.com/itsfoss.com/wp-content/uploads/2021/04/removing-partitions-linux-005.png?resize=800%2C540&ssl=1 +[10]: https://i0.wp.com/itsfoss.com/wp-content/uploads/2021/04/removing-partitions-linux-006.png?resize=800%2C543&ssl=1 +[11]: https://man7.org/linux/man-pages/man8/fdisk.8.html +[12]: https://itsfoss.com/root-user-ubuntu/ +[13]: https://i1.wp.com/itsfoss.com/wp-content/uploads/2021/04/removing-partitions-linux-001.png?resize=800%2C255&ssl=1 +[14]: https://i1.wp.com/itsfoss.com/wp-content/uploads/2021/04/removing-partitions-linux-002.png?resize=800%2C362&ssl=1 +[15]: https://i1.wp.com/itsfoss.com/wp-content/uploads/2021/04/removing-partitions-linux-003.png?resize=800%2C153&ssl=1 +[16]: https://itsfoss.com/recover-deleted-files-linux/ diff --git a/published/202104/20210421 Optimize your Python code with C.md b/published/202104/20210421 Optimize your Python code with C.md new file mode 100644 index 0000000000..0384f49be6 --- /dev/null +++ b/published/202104/20210421 Optimize your Python code with C.md @@ -0,0 +1,196 @@ +[#]: subject: (Optimize your Python code with C) +[#]: via: (https://opensource.com/article/21/4/cython) +[#]: author: (Alan Smithee https://opensource.com/users/alansmithee) +[#]: collector: (lujun9972) +[#]: translator: (ShuyRoy) +[#]: reviewer: (wxy) +[#]: publisher: (wxy) +[#]: url: (https://linux.cn/article-13338-1.html) + +使用 C 优化你的 Python 代码 +====== + +> Cython 创建的 C 模块可以加速 Python 代码的执行,这对使用效率不高的解释型语言编写的复杂应用是很重要的。 + +![](https://img.linux.net.cn/data/attachment/album/202104/26/230709qz64z4af3t9b9jab.jpg) + +Cython 是 Python 编程语言的编译器,旨在优化性能并形成一个扩展的 Cython 编程语言。作为 Python 的扩展,[Cython][2] 也是 Python 语言的超集,它支持调用 C 函数和在变量和类属性上声明 C 类型。这使得包装外部 C 库、将 C 嵌入现有应用程序或者为 Python 编写像 Python 一样简单的 C 语言扩展语法变得容易。 + +Cython 一般用于创建 C 模块来加速 Python 代码的执行。这在使用解释型语言编写的效率不高的复杂应用中非常重要。 + +### 安装 Cython + +你可以在 Linux、BSD、Windows 或 macOS 上安装 Cython 来使用 Python: + +``` +$ python -m pip install Cython +``` + +安装好后,就可以使用它了。 + +### 将 Python 转换成 C + +使用 Cython 的一个好的方式是从一个简单的 “hello world” 开始。这虽然不是展示 Cython 优点的最好方式,但是它展示了使用 Cython 时发生的情况。 + +首先,创建一个简单的 Python 脚本,文件命名为 `hello.pyx`(`.pyx` 扩展名并不神奇,从技术上它可以是任何东西,但它是 Cython 的默认扩展名): + +``` +print("hello world") +``` + +接下来,创建一个 Python 设置脚本。一个像 Python 的 makefile 一样的 `setup.py`,Cython 可以使用它来处理你的 Python 代码: + +``` +from setuptools import setup +from Cython.Build import cythonize + +setup( +    ext_modules = cythonize("hello.pyx") +) +``` + +最后,使用 Cython 将你的 Python 脚本转换为 C 代码: + +``` +$ python setup.py build_ext --inplace +``` + +你可以在你的工程目录中看到结果。Cython 的 `cythonize` 模块将 `hello.pyx` 转换成一个 `hello.c` 文件和一个 `.so` 库。这些 C 代码有 2648 行,所以它比一个一行的 `hello.pyx` 源码的文本要多很多。`.so` 库也比它的源码大 2000 倍(即 54000 字节和 20 字节相比)。然后,Python 需要运行单个 Python 脚本,所以有很多代码支持这个只有一行的 `hello.pyx` 文件。 + +要使用 Python 的 “hello world” 脚本的 C 代码版本,请打开一个 Python 提示符并导入你创建的新 `hello` 模块: + + +``` +>>> import hello +hello world +``` + +### 将 C 代码集成到 Python 中 + +测试计算能力的一个很好的通用测试是计算质数。质数是一个比 1 大的正数,且它只有被 1 或它自己除后才会产生正整数。虽然理论很简单,但是随着数的变大,计算需求也会增加。在纯 Python 中,可以用 10 行以内的代码完成质数的计算。 + +``` +import sys + +number = int(sys.argv[1]) +if not number <= 1: + for i in range(2, number): + if (number % i) == 0: + print("Not prime") + break +else: + print("Integer must be greater than 1") +``` + +这个脚本在成功的时候是不会提醒的,如果这个数不是质数,则返回一条信息: + +``` +$ ./prime.py 3 +$ ./prime.py 4 +Not prime. +``` + +将这些转换为 Cython 需要一些工作,一部分是为了使代码适合用作库,另一部分是为了提高性能。 + +#### 脚本和库 + +许多用户将 Python 当作一种脚本语言来学习:你告诉 Python 想让它执行的步骤,然后它来做。随着你对 Python(以及一般的开源编程)的了解越多,你可以了解到许多强大的代码都存在于其他应用程序可以利用的库中。你的代码越 _不具有针对性_,程序员(包括你)就越可能将其重用于其他的应用程序。将计算和工作流解耦可能需要更多的工作,但最终这通常是值得的。 + +在这个简单的质数计算的例子中,将其转换成 Cython,首先是一个设置脚本: + +``` +from setuptools import setup +from Cython.Build import cythonize + +setup( +    ext_modules = cythonize("prime.py") +) +``` + +将你的脚本转换成 C: + +``` +$ python setup.py build_ext --inplace +``` + +到目前为止,一切似乎都工作的很好,但是当你试图导入并使用新模块时,你会看到一个错误: + +``` +>>> import prime +Traceback (most recent call last): + File "", line 1, in + File "prime.py", line 2, in init prime + number = sys.argv[1] +IndexError: list index out of range +``` + +这个问题是 Python 脚本希望从一个终端运行,其中参数(在这个例子中是要测试是否为质数的整数)是一样的。你需要修改你的脚本,使它可以作为一个库来使用。 + +#### 写一个库 + +库不使用系统参数,而是接受其他代码的参数。对于用户输入,与其使用 `sys.argv`,不如将你的代码封装成一个函数来接收一个叫 `number`(或者 `num`,或者任何你喜欢的变量名)的参数: + +``` +def calculate(number): + if not number <= 1: + for i in range(2, number): + if (number % i) == 0: + print("Not prime") + break + else: + print("Integer must be greater than 1") +``` + +这确实使你的脚本有些难以测试,因为当你在 Python 中运行代码时,`calculate` 函数永远不会被执行。但是,Python 编程人员已经为这个问题设计了一个通用、还算直观的解决方案。当 Python 解释器执行一个 Python 脚本时,有一个叫 `__name__` 的特殊变量,这个变量被设置为 `__main__`,但是当它被作为模块导入的时候,`__name__` 被设置为模块的名字。利用这点,你可以写一个既是 Python 模块又是有效 Python 脚本的库: + +``` +import sys + +def calculate(number): + if not number <= 1: + for i in range(2, number): + if (number % i) == 0: + print("Not prime") + break + else: + print("Integer must be greater than 1") + +if __name__ == "__main__": + number = sys.argv[1] + calculate( int(number) ) +``` + +现在你可以用一个命令来运行代码了: + +``` +$ python ./prime.py 4 +Not a prime +``` + +你可以将它转换为 Cython 来用作一个模块: + +``` +>>> import prime +>>> prime.calculate(4) +Not prime +``` + +### C Python + +用 Cython 将纯 Python 的代码转换为 C 代码是有用的。这篇文章描述了如何做,然而,Cython 还有功能可以帮助你在转换之前优化你的代码,分析你的代码来找到 Cython 什么时候与 C 进行交互,以及更多。如果你正在用 Python,但是你希望用 C 代码改进你的代码,或者进一步理解库是如何提供比脚本更好的扩展性的,或者你只是好奇 Python 和 C 是如何协作的,那么就开始使用 Cython 吧。 + +-------------------------------------------------------------------------------- + +via: https://opensource.com/article/21/4/cython + +作者:[Alan Smithee][a] +选题:[lujun9972][b] +译者:[ShuyRoy](https://github.com/ShuyRoy) +校对:[wxy](https://github.com/wxy) + +本文由 [LCTT](https://github.com/LCTT/TranslateProject) 原创编译,[Linux中国](https://linux.cn/) 荣誉推出 + +[a]: https://opensource.com/users/alansmithee +[b]: https://github.com/lujun9972 +[1]: https://opensource.com/sites/default/files/styles/image-full-size/public/lead-images/python-programming-code-keyboard.png?itok=fxiSpmnd (Hands on a keyboard with a Python book ) +[2]: https://cython.org/ diff --git a/published/202104/20210422 Restore an old MacBook with Linux.md b/published/202104/20210422 Restore an old MacBook with Linux.md new file mode 100644 index 0000000000..6e28e972f5 --- /dev/null +++ b/published/202104/20210422 Restore an old MacBook with Linux.md @@ -0,0 +1,94 @@ +[#]: subject: (Restore an old MacBook with Linux) +[#]: via: (https://opensource.com/article/21/4/restore-macbook-linux) +[#]: author: (Don Watkins https://opensource.com/users/don-watkins) +[#]: collector: (lujun9972) +[#]: translator: (geekpi) +[#]: reviewer: (wxy) +[#]: publisher: (wxy) +[#]: url: (https://linux.cn/article-13341-1.html) + +用 Linux 翻新旧的 MacBook +====== + +> 不要把你又旧又慢的 MacBook 扔进垃圾桶。用 Linux Mint 延长它的寿命。 + +![](https://img.linux.net.cn/data/attachment/album/202104/27/225241mdbp59t67699r9de.jpg) + +去年,我写了篇关于如何用 Linux 赋予[旧 MacBook 的新生命][2]的文章,在例子中提到了 Elementary OS。最近,我用回那台 2015 年左右的 MacBook Air,发现遗失了我的登录密码。我下载了最新的 Elementary OS 5.1.7 Hera,但无法让实时启动识别我的 Broadcom 4360 无线芯片组。 + +最近,我一直在使用 [Linux Mint][3] 来翻新旧的笔记本电脑,我想在这台 MacBook Air 上试一下。我下载了 Linux Mint 20.1 ISO,并在我的 Linux 台式电脑上使用 [Popsicle][4] 创建了一个 USB 启动器。 + +![Popsicle ISO burner][5] + +接下来,我将 Thunderbolt 以太网适配器连接到 MacBook,并插入 USB 启动器。我打开系统电源,按下 MacBook 上的 Option 键,指示它从 USB 驱动器启动系统。 + +Linux Mint 在实时启动模式下启动没问题,但操作系统没有识别出无线连接。 + +### 我的无线网络在哪里? + +这是因为为苹果设备制造 WiFi 卡的公司 Broadcom 没有发布开源驱动程序。这与英特尔、Atheros 和许多其他芯片制造商形成鲜明对比,但它是苹果公司使用的芯片组,所以这是 MacBook 上的一个常见问题。 + +我通过我的 Thunderbolt 适配器有线连接到以太网,因此我 _是_ 在线的。通过之前的研究,我知道要让无线适配器在这台 MacBook 上工作,我需要在 Bash 终端执行三条独立的命令。然而,在安装过程中,我了解到 Linux Mint 有一个很好的内置驱动管理器,它提供了一个简单的图形用户界面来协助安装软件。 + +![Linux Mint Driver Manager][7] + +该操作完成后,我重启了安装了 Linux Mint 20.1 的新近翻新的 MacBook Air。Broadcom 无线适配器工作正常,使我能够轻松地连接到我的无线网络。 + +### 手动安装无线 + +你可以从终端完成同样的任务。首先,清除 Broadcom 内核源码的残余。 + +``` +$ sudo apt-get purge bcmwl-kernel-source +``` + +然后添加一个固件安装程序: + +``` +$ sudo apt install firmware-b43-installer +``` + +最后,为系统安装新固件: + +``` +$ sudo apt install linux-firmware +``` + +### 将 Linux 作为你的 Mac 使用 + +我安装了 [Phoronix 测试套件][8] 以获得 MacBook Air 的系统信息。 + +![MacBook Phoronix Test Suite output][9] + +系统工作良好。对内核 5.4.0-64-generic 的最新更新显示,无线连接仍然存在,并且我与家庭网络之间的连接为 866Mbps。Broadcom 的 FaceTime 摄像头不能工作,但其他东西都能正常工作。 + +我非常喜欢这台 MacBook 上的 [Linux Mint Cinnamon 20.1][10] 桌面。 + +![Linux Mint Cinnamon][11] + +如果你有一台因 macOS 更新而变得缓慢且无法使用的旧 MacBook,我建议你试一下 Linux Mint。我对这个发行版印象非常深刻,尤其是它在我的 MacBook Air 上的工作情况。它无疑延长了这个强大的小笔记本电脑的寿命。 + +-------------------------------------------------------------------------------- + +via: https://opensource.com/article/21/4/restore-macbook-linux + +作者:[Don Watkins][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/don-watkins +[b]: https://github.com/lujun9972 +[1]: https://opensource.com/sites/default/files/styles/image-full-size/public/lead-images/write-hand_0.jpg?itok=Uw5RJD03 (Writing Hand) +[2]: https://opensource.com/article/20/2/macbook-linux-elementary +[3]: https://linuxmint.com/ +[4]: https://github.com/pop-os/popsicle +[5]: https://opensource.com/sites/default/files/uploads/popsicle.png (Popsicle ISO burner) +[6]: https://creativecommons.org/licenses/by-sa/4.0/ +[7]: https://opensource.com/sites/default/files/uploads/mint_drivermanager.png (Linux Mint Driver Manager) +[8]: https://www.phoronix-test-suite.com/ +[9]: https://opensource.com/sites/default/files/uploads/macbook_specs.png (MacBook Phoronix Test Suite output) +[10]: https://www.linuxmint.com/edition.php?id=284 +[11]: https://opensource.com/sites/default/files/uploads/mintcinnamon.png (Linux Mint Cinnamon) diff --git a/published/20210428 Share files between Linux and Windows computers.md b/published/20210428 Share files between Linux and Windows computers.md new file mode 100644 index 0000000000..a5820c1b3d --- /dev/null +++ b/published/20210428 Share files between Linux and Windows computers.md @@ -0,0 +1,235 @@ +[#]: subject: (Share files between Linux and Windows computers) +[#]: via: (https://opensource.com/article/21/4/share-files-linux-windows) +[#]: author: (Stephan Avenwedde https://opensource.com/users/hansic99) +[#]: collector: (lujun9972) +[#]: translator: (hanszhao80) +[#]: reviewer: (wxy) +[#]: publisher: (wxy) +[#]: url: (https://linux.cn/article-14537-1.html) + +如何在 Linux 和 Windows 电脑之间共享文件 +====== + +> 使用 Samba 设置跨平台文件共享。 + +![](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 按钮” > “设置Settings” > “网络和 InternetNetwork & Internet” ,或者右键单击任务栏右下角的小监视器图标,打开网络和共享中心Open Network an d Sharing Center: + +![打开网络和共享中心][13] + +在打开的窗口中,找到你要使用的连接并记下其配置文件。我使用了 **以太网 3**,它被标记为 公用网络Public Network。 + +> **注意**:如果你的 PC 经常连接公用网络,请考虑将本地计算机的连接配置文件更改为 **私有**。 + +记住你的网络配置,然后单击 更改高级共享设置Change advanced sharing settings: + +![更改高级共享设置][14] + +选择与你的连接对应的配置文件并打开 网络发现network discovery文件和打印机共享file and printer sharing: + +![网络共享设置][15] + +#### 2、定义一个共享文件夹 + +通过右键单击你要共享的文件夹打开上下文菜单,导航到 授予访问权限Give access to,然后选择 特定用户...Specific people...: + +![授予访问权限][16] + +检查你当前的用户名是否在列表中。点击 共享Share 将此文件夹标记为共享: + +![标记为共享][17] + +你可以通过在文件资源管理器的地址栏中输入 `\\localhost` 来显示所有共享文件夹的列表: + +![共享文件夹][18] + +![共享文件夹][19] + +#### 3、在 Linux 下挂载共享文件夹 + +回到你的 Linux 系统,打开一个命令行,然后创建一个新文件夹,用于挂载 Windows 共享: + +``` +mkdir ~/WindowsShare +``` + +挂载 Windows 共享是使用 `mount.cifs` 完成的,它应该被默认安装。使用如下命令临时挂载你的共享文件夹: + +``` +sudo mount.cifs ///MySharedFolder ~/WindowsShare/ -o user=,uid=$UID +``` + +在这个命令里: + + * `` 是 Windows PC 的地址信息(IP 或主机名) + * `` 是允许访问共享文件夹的用户(见步骤 2) + +系统将提示你输入 Windows 密码。之后,你将能够使用普通 Linux 用户访问 Windows 上的共享文件夹。 + +要卸载共享文件夹: + +``` +sudo umount ~/WindowsShare/ +``` + +你还可以在系统启动时挂载 Windows 共享文件夹。按照 [这些步骤][20] 相应地配置你的系统。 + +### 总结 + +在这里展示了如何建立临时的文件夹共享访问权限,每次重启后都要重新设置,因此修改成永久访问会更便利。我经常在不同的系统之间来回切换,对我而言设置直接文件访问非常实用。 + +-------------------------------------------------------------------------------- + +via: https://opensource.com/article/21/4/share-files-linux-windows + +作者:[Stephan Avenwedde][a] +选题:[lujun9972][b] +译者:[hanszhao80](https://github.com/hanszhao80) +校对:[wxy](https://github.com/wxy) + +本文由 [LCTT](https://github.com/LCTT/TranslateProject) 原创编译,[Linux中国](https://linux.cn/) 荣誉推出 + +[a]: https://opensource.com/users/hansic99 +[b]: https://github.com/lujun9972 +[1]: https://opensource.com/sites/default/files/styles/image-full-size/public/lead-images/rh_003499_01_cloud21x_cc.png?itok=5UwC92dO (Blue folders flying in the clouds above a city skyline) +[2]: https://getfedora.org/en/workstation/download/ +[3]: https://www.samba.org/ +[4]: https://linux.die.net/man/8/mount.cifs +[5]: https://en.wikipedia.org/wiki/Server_Message_Block +[6]: https://www.samba.org/samba/docs/current/man-html/smb.conf.5.html +[7]: https://www.redhat.com/en/topics/linux/what-is-selinux +[8]: https://opensource.com/sites/default/files/uploads/sebool.png (Enabling Samba to enable user directory access) +[9]: https://creativecommons.org/licenses/by-sa/4.0/ +[10]: https://opensource.com/sites/default/files/uploads/firewall_configuration.png (firewall-config tool) +[11]: https://opensource.com/sites/default/files/uploads/windows_access_shared_1.png (Accessing Linux machine from Windows) +[12]: https://opensource.com/sites/default/files/uploads/windows_acess_shared_2.png (Accessing Linux machine from Windows) +[13]: https://opensource.com/sites/default/files/uploads/open_network_and_sharing_center.png (Open network and sharing center) +[14]: https://opensource.com/sites/default/files/uploads/network_and_sharing_center_2.png (Change advanced sharing settings) +[15]: https://opensource.com/sites/default/files/uploads/network_sharing.png (Network sharing settings) +[16]: https://opensource.com/sites/default/files/pictures/give_access_to.png (Give access) +[17]: https://opensource.com/sites/default/files/pictures/tag_as_shared.png (Tag as shared) +[18]: https://opensource.com/sites/default/files/uploads/show_shared_folder_1.png (Shared folders) +[19]: https://opensource.com/sites/default/files/uploads/show_shared_folder_2.png (Shared folders) +[20]: https://timlehr.com/auto-mount-samba-cifs-shares-via-fstab-on-linux/ diff --git a/published/202105/20200316 OpenStreetMap- A Community-Driven Google Maps Alternative.md b/published/202105/20200316 OpenStreetMap- A Community-Driven Google Maps Alternative.md new file mode 100644 index 0000000000..c2f2d0dc45 --- /dev/null +++ b/published/202105/20200316 OpenStreetMap- A Community-Driven Google Maps Alternative.md @@ -0,0 +1,91 @@ +[#]: collector: "lujun9972" +[#]: translator: "rakino" +[#]: reviewer: "wxy" +[#]: publisher: "wxy" +[#]: url: "https://linux.cn/article-13399-1.html" +[#]: subject: "OpenStreetMap: A Community-Driven Google Maps Alternative" +[#]: via: "https://itsfoss.com/openstreetmap/" +[#]: author: "Ankush Das https://itsfoss.com/author/ankush/" + +OpenStreetMap:社区驱动的谷歌地图替代品 +====== + +> 作为谷歌地图的潜在替代品,OpenStreetMap 是一个由社区驱动的地图项目,在本文中我们将了解更多关于这个开源项目的信息。 + +[OpenStreetMap][1](OSM)是一个可自由编辑的世界地图,任何人都可以对 OpenStreetMap 贡献、编辑和修改,以对其进行改进。 + +![][2] + +查看地图并不需要帐号,但如果你想要编辑或增加地图信息,就得先注册一个帐号了。 + +尽管 OpenStreetMap 以 [开放数据库许可证][3] 授权,可以自由使用,但也有所限制 —— 你不能使用地图 API 在 OpenStreetMap 之上建立另一个服务来达到商业目的。 + +因此,你可以下载地图数据来使用,以及在标示版权信息的前提下自己托管这些数据。可以在 OpenStreetMap 的官方网站上了解更多关于其 [API 使用政策][4] 和 [版权][5] 的信息。 + +在这篇文章中,我们将简单看看 OpenStreetMap 是如何工作的,以及什么样的项目使用 OpenStreetMaps 作为其地图数据的来源。 + +### OpenStreetMap:概述 + +![][6] + +OpenStreetMap 是很好的谷歌地图替代品,虽然你无法得到和谷歌地图一样的信息水平,但对于基本的导航和旅行来说,OpenStreetMap 已经足够了。 + +就像其他地图一样,你能够在地图的多个图层间切换,了解自己的位置,并轻松地查找地点。 + +你可能找不到关于附近企业、商店和餐馆的所有最新信息。但对于基本的导航来说,OpenStreetMap 已经足够了。 + +通常可以通过网页浏览器在桌面和手机上访问 [OpenStreetMap 的网站][7] 来使用 OpenStreetMap,它还没有一个官方的安卓/iOS 应用程序。 + +然而,也有各种各样的应用程序在其核心中使用了 OpenStreetMap。因此,如果你想在智能手机上使用 OpenStreetMap,你可以看看一些流行的谷歌地图开源替代: + + * [OsmAnd][8] + * [MAPS.ME][9] + +**MAPS.ME** 和 **OsmAnd** 是两个适用于安卓和 iOS 的开源应用程序,它们利用 OpenStreetMap 的数据提供丰富的用户体验,并在应用中添加了一堆有用的信息和功能。 + +如果你愿意,也可以选择其他专有选项,比如 [Magic Earth][10]。 + +无论是哪种情况,你都可以在 OpenStreetMap 的官方维基页面上看一下适用于 [安卓][11] 和 [iOS][12] 的大量应用程序列表。 + +### 在 Linux 上使用 OpenStreetMap + +![][13] + +在 Linux 上使用 OpenStreetMap 最简单的方法就是在网页浏览器中使用它。如果你使用 GNOME 桌面环境,可以安装 GNOME 地图,它是建立在 OpenStreetMap 之上的。 + +还有几个软件(大多已经过时了)在 Linux 上使用 OpenStreetMap 来达到特定目的,你可以在 OpenStreetMap 的 [官方维基列表][14] 中查看可用软件包的列表。 + +### 总结 + +对于最终用户来说,OpenStreetMap 可能不是最好的导航源,但是它的开源模式允许它被自由使用,这意味着可以用 OpenStreetMap 来构建许多服务。例如,[ÖPNVKarte][15] 使用 OpenStreetMap 在一张统一的地图上显示全世界的公共交通设施,这样你就不必再浏览各个运营商的网站了。 + +你对 OpenStreetMap 有什么看法?你能用它作为谷歌地图的替代品吗?欢迎在下面的评论中分享你的想法。 + +-------------------------------------------------------------------------------- + +via: https://itsfoss.com/openstreetmap/ + +作者:[Ankush Das][a] +选题:[lujun9972][b] +译者:[rakino](https://github.com/rakino) +校对:[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://www.openstreetmap.org/ +[2]: https://i2.wp.com/itsfoss.com/wp-content/uploads/2020/03/openstreetmap.jpg?ssl=1 +[3]: https://opendatacommons.org/licenses/odbl/ +[4]: https://operations.osmfoundation.org/policies/api/ +[5]: https://www.openstreetmap.org/copyright +[6]: https://i2.wp.com/itsfoss.com/wp-content/uploads/2020/03/open-street-map-2.jpg?ssl=1 +[7]: https://www.openstreetmap.org +[8]: https://play.google.com/store/apps/details?id=net.osmand +[9]: https://play.google.com/store/apps/details?id=com.mapswithme.maps.pro +[10]: https://www.magicearth.com/ +[11]: https://wiki.openstreetmap.org/wiki/Android#OpenStreetMap_applications +[12]: https://wiki.openstreetmap.org/wiki/Apple_iOS +[13]: https://i2.wp.com/itsfoss.com/wp-content/uploads/2020/03/open-street-map-1.jpg?ssl=1 +[14]: https://wiki.openstreetmap.org/wiki/Linux +[15]: http://xn--pnvkarte-m4a.de/ \ No newline at end of file diff --git a/published/202105/20200527 Manage startup using systemd.md b/published/202105/20200527 Manage startup using systemd.md new file mode 100644 index 0000000000..e5a5d31013 --- /dev/null +++ b/published/202105/20200527 Manage startup using systemd.md @@ -0,0 +1,545 @@ +[#]: collector: (lujun9972) +[#]: translator: (tt67wq) +[#]: reviewer: (wxy) +[#]: publisher: (wxy) +[#]: url: (https://linux.cn/article-13402-1.html) +[#]: subject: (Manage startup using systemd) +[#]: via: (https://opensource.com/article/20/5/manage-startup-systemd) +[#]: author: (David Both https://opensource.com/users/dboth) + +使用 systemd 来管理启动项 +====== + +> 了解 systemd 是怎样决定服务启动顺序,即使它本质上是个并行系统。 + +![](https://img.linux.net.cn/data/attachment/album/202105/18/105928u3r3593k3z38ly5k.jpg) + +最近在设置 Linux 系统时,我想知道如何确保服务和其他单元的依赖关系在这些依赖于它们的服务和单元启动之前就已经启动并运行了。我需要更多 systemd 如何管理启动程序的相关知识,特别是在本质上是一个并行的系统中如何是决定服务启动顺序的。 + +你可能知道 SystemV(systemd 的前身,我在这个系列的 [第一篇文章][2] 中解释过)通过 Sxx 前缀命名启动脚本来决定启动顺序,xx 是一个 00-99 的数字。然后 SystemV 利用文件名来排序,然后按照所需的运行级别执行队列中每个启动脚本。 + +但是 systemd 使用单元文件来定义子程序,单元文件可由系统管理员创建或编辑,这些文件不仅可以用于初始化时也可以用于常规操作。在这个系列的 [第三篇文章][3] 中,我解释了如何创建一个挂载单元文件。在第五篇文章中,我解释了如何创建一种不同的单元文件 —— 在启动时执行一个程序的服务单元文件。你也可以修改单元文件中某些配置,然后通过 systemd 日志去查看你的修改在启动序列中的位置。 + +### 准备工作 + +先确认你已经在 `/etc/default/grub` 文件中的 `GRUB_CMDLINE_LINUX=` 这行移除了 `rhgb` 和 `quiet`,如同我在这个系列的 [第二篇文章][4] 中展示的那样。这让你能够查看 Linux 启动信息流,你在这篇文章中部分实验中需要用到。 + +### 程序 + +在本教程中,你会创建一个简单的程序让你能够在主控台和后续的 systemd 日志中查看启动时的信息。 + +创建一个 shell 程序 `/usr/local/bin/hello.sh` 然后添加下述内容。你要确保执行结果在启动时是可见的,可以轻松的在 systemd 日志中找到它。你会使用一版携带一些方格的 “Hello world” 程序,这样它会非常显眼。为了确保这个文件是可执行的,且为了安全起见,它需要 root 的用户和组所有权和 [700 权限][5]。 + + +``` +#!/usr/bin/bash +# Simple program to use for testing startup configurations +# with systemd. +# By David Both +# Licensed under GPL V2 +# +echo "###############################" +echo "######### Hello World! ########" +echo "###############################" +``` + +在命令行中执行这个程序来检查它能否正常运行。 + +``` +[root@testvm1 ~]# hello.sh +############################### +######### Hello World! ######## +############################### +[root@testvm1 ~]# +``` + +这个程序可以用任意脚本或编译语言实现。`hello.sh` 程序可以被放在 [Linux 文件系统层级结构][6](FHS)上的任意位置。我把它放在 `/usr/local/bin` 目录下,这样它可以直接在命令行中执行而不必在打命令的时候前面带上路径。我发现我创建的很多 shell 程序需要从命令行和其他工具(如 systemd)运行。 + +### 服务单元文件 + +创建服务单元文件 `/etc/systemd/system/hello.service`,写入下述内容。这个文件不一定是要可执行的,但是为了安全起见,它需要 root 的用户和组所有权和 [644][7] 或 [640][8] 权限。 + +``` +# Simple service unit file to use for testing +# startup configurations with systemd. +# By David Both +# Licensed under GPL V2 +# + +[Unit] +Description=My hello shell script + +[Service] +Type=oneshot +ExecStart=/usr/local/bin/hello.sh + +[Install] +WantedBy=multi-user.target +``` + +通过查看服务状态来确认服务单元文件能如期运行。如有任何语法问题,这里会显示错误。 + +``` +[root@testvm1 ~]# systemctl status hello.service +● hello.service - My hello shell script +     Loaded: loaded (/etc/systemd/system/hello.service; disabled; vendor preset: disabled) +     Active: inactive (dead) +[root@testvm1 ~]# +``` + +你可以运行这类 “oneshot”(单发)类型的服务多次而不会有问题。此类服务适用于服务单元文件启动的程序是主进程,必须在 systemd 启动任何依赖进程之前完成的服务。 + +共有 7 种服务类型,你可以在 [systemd.service(5)][9] 的手册页上找到每一种(以及服务单元文件的其他部分)的详细解释。(你也可以在文章末尾的 [资料][10] 中找到更多信息。) + +出于好奇,我想看看错误是什么样子的。所以我从 `Type=oneshot` 这行删了字母 “o”,现在它看起来是这样 `Type=neshot`,现在再次执行命令: + +``` +[root@testvm1 ~]# systemctl status hello.service +● hello.service - My hello shell script +     Loaded: loaded (/etc/systemd/system/hello.service; disabled; vendor preset: disabled) +     Active: inactive (dead) + +May 06 08:50:09 testvm1.both.org systemd[1]: /etc/systemd/system/hello.service:12: Failed to parse service type, ignoring: neshot +[root@testvm1 ~]# +``` + +执行结果明确地告诉我错误在哪,这样解决错误变得十分容易。 + +需要注意的是即使在你将 `hello.service` 文件保存为它原来的形式之后,错误依然存在。虽然重启机器能消除这个错误,但你不必这么做,所以我去找了一个清理这类持久性错误的方法。我曾遇到有些错误需要 `systemctl daemon-reload` 命令来重置错误状态,但是在这个例子里不起作用。可以用这个命令修复的错误似乎总是有一个这样的声明,所以你知道要运行它。 + +然而,每次修改或新建一个单元文件之后执行 `systemctl daemon-reload` 确实是值得推荐的做法。它提醒 systemd 有修改发生,而且它可以防止某些与管理服务或单元相关的问题。所以继续去执行这条命令吧。 + +在修改完服务单元文件中的拼写错误后,一个简单的 `systemctl restart hello.service` 命令就可以清除错误。实验一下,通过添加一些其他的错误至 `hello.service` 文件来看看会得到怎样的结果。 + +### 启动服务 + +现在你已经准备好启动这个新服务,通过检查状态来查看结果。尽管你可能之前已经重启过,你仍然可以启动或重启这个单发服务任意次,因为它只运行一次就退出了。 + +继续启动这个服务(如下所示),然后检查状态。你的结果可能和我的有区别,取决于你做了多少试错实验。 + +``` +[root@testvm1 ~]# systemctl start hello.service +[root@testvm1 ~]# systemctl status hello.service +● hello.service - My hello shell script +     Loaded: loaded (/etc/systemd/system/hello.service; disabled; vendor preset: disabled) +     Active: inactive (dead) + +May 10 10:37:49 testvm1.both.org hello.sh[842]: ######### Hello World! ######## +May 10 10:37:49 testvm1.both.org hello.sh[842]: ############################### +May 10 10:37:49 testvm1.both.org systemd[1]: hello.service: Succeeded. +May 10 10:37:49 testvm1.both.org systemd[1]: Finished My hello shell script. +May 10 10:54:45 testvm1.both.org systemd[1]: Starting My hello shell script... +May 10 10:54:45 testvm1.both.org hello.sh[1380]: ############################### +May 10 10:54:45 testvm1.both.org hello.sh[1380]: ######### Hello World! ######## +May 10 10:54:45 testvm1.both.org hello.sh[1380]: ############################### +May 10 10:54:45 testvm1.both.org systemd[1]: hello.service: Succeeded. +May 10 10:54:45 testvm1.both.org systemd[1]: Finished My hello shell script. +[root@testvm1 ~]# +``` + +从状态检查命令的输出中我们可以看到,systemd 日志表明 `hello.sh` 启动然后服务结束了。你也可以看到脚本的输出。该输出是根据服务的最近调用的日志记录生成的,试试看多启动几次这个服务,然后再看状态命令的输出就能理解我所说的。 + +你也应该直接查看日志内容,有很多种方法可以实现。一种办法是指定记录类型标识符,在这个例子中就是 shell 脚本的名字。它会展示前几次重启和当前会话的日志记录。如你所见,我已经为这篇文章做了挺长一段时间的研究测试了。 + +``` +[root@testvm1 ~]# journalctl -t hello.sh +<剪去> +-- Reboot -- +May 08 15:55:47 testvm1.both.org hello.sh[840]: ############################### +May 08 15:55:47 testvm1.both.org hello.sh[840]: ######### Hello World! ######## +May 08 15:55:47 testvm1.both.org hello.sh[840]: ############################### +-- Reboot -- +May 08 16:01:51 testvm1.both.org hello.sh[840]: ############################### +May 08 16:01:51 testvm1.both.org hello.sh[840]: ######### Hello World! ######## +May 08 16:01:51 testvm1.both.org hello.sh[840]: ############################### +-- Reboot -- +May 10 10:37:49 testvm1.both.org hello.sh[842]: ############################### +May 10 10:37:49 testvm1.both.org hello.sh[842]: ######### Hello World! ######## +May 10 10:37:49 testvm1.both.org hello.sh[842]: ############################### +May 10 10:54:45 testvm1.both.org hello.sh[1380]: ############################### +May 10 10:54:45 testvm1.both.org hello.sh[1380]: ######### Hello World! ######## +May 10 10:54:45 testvm1.both.org hello.sh[1380]: ############################### +[root@testvm1 ~]# +``` + +为了定位 `hello.service` 单元的 systemd 记录,你可以在 systemd 中搜索。你可以使用 `G+Enter` 来翻页到日志记录 +记录的末尾,然后用回滚来找到你感兴趣的日志。使用 `-b` 选项仅展示最近启动的记录。 + +``` +[root@testvm1 ~]# journalctl -b -t systemd +<剪去> +May 10 10:37:49 testvm1.both.org systemd[1]: Starting SYSV: Late init script for live image.... +May 10 10:37:49 testvm1.both.org systemd[1]: Started SYSV: Late init script for live image.. +May 10 10:37:49 testvm1.both.org systemd[1]: hello.service: Succeeded. +May 10 10:37:49 testvm1.both.org systemd[1]: Finished My hello shell script. +May 10 10:37:50 testvm1.both.org systemd[1]: Starting D-Bus System Message Bus... +May 10 10:37:50 testvm1.both.org systemd[1]: Started D-Bus System Message Bus. +``` + +我拷贝了一些其他的日志记录,让你对你可能找到的东西有所了解。这条命令喷出了所有属于 systemd 的日志内容 —— 当我写这篇时是 109183 行。这是一个需要整理的大量数据。你可以使用页面的搜索功能,通常是 `less` 或者你可以使用内置的 `grep` 特性。`-g`( 或 `--grep=`)选项可以使用兼容 Perl 的正则表达式。 +``` +[root@testvm1 ~]# journalctl -b -t systemd -g "hello" +[root@testvm1 ~]# journalctl -b -t systemd -g "hello" +-- Logs begin at Tue 2020-05-05 18:11:49 EDT, end at Sun 2020-05-10 11:01:01 EDT. -- +May 10 10:37:49 testvm1.both.org systemd[1]: Starting My hello shell script... +May 10 10:37:49 testvm1.both.org systemd[1]: hello.service: Succeeded. +May 10 10:37:49 testvm1.both.org systemd[1]: Finished My hello shell script. +May 10 10:54:45 testvm1.both.org systemd[1]: Starting My hello shell script... +May 10 10:54:45 testvm1.both.org systemd[1]: hello.service: Succeeded. +May 10 10:54:45 testvm1.both.org systemd[1]: Finished My hello shell script. +[root@testvm1 ~]# +``` + +你可以使用标准的 GNU `grep` 命令,但是这不会展示日志首行的元数据。 + +如果你只想看包含你的 `hello` 服务的日志记录,你可以指定时间来缩小范围。举个例子,我将在我的测试虚拟机上以 `10:54:00` 为开始时间,这是上述的日志记录开始的分钟数。注意 `--since=` 的选项必须加引号,这个选项也可以写成 `-S "某个时间"`。 + +日期和时间可能在你的机器上有所不同,所以确保使用能匹配你日志中的时间的时间戳。 + +``` +[root@testvm1 ~]# journalctl --since="2020-05-10 10:54:00" +May 10 10:54:35 testvm1.both.org audit: BPF prog-id=54 op=LOAD +May 10 10:54:35 testvm1.both.org audit: BPF prog-id=55 op=LOAD +May 10 10:54:45 testvm1.both.org systemd[1]: Starting My hello shell script... +May 10 10:54:45 testvm1.both.org hello.sh[1380]: ############################### +May 10 10:54:45 testvm1.both.org hello.sh[1380]: ######### Hello World! ######## +May 10 10:54:45 testvm1.both.org hello.sh[1380]: ############################### +May 10 10:54:45 testvm1.both.org systemd[1]: hello.service: Succeeded. +May 10 10:54:45 testvm1.both.org systemd[1]: Finished My hello shell script. +May 10 10:54:45 testvm1.both.org audit[1]: SERVICE_START pid=1 uid=0 auid=4294967295 ses=4294967295 msg='unit=hello comm="systemd" exe="/usr/lib/systemd"' +May 10 10:54:45 testvm1.both.org audit[1]: SERVICE_STOP pid=1 uid=0 auid=4294967295 ses=4294967295 msg='unit=hello comm="systemd" exe="/usr/lib/systemd/"' +May 10 10:56:00 testvm1.both.org NetworkManager[840]: [1589122560.0633] dhcp4 (enp0s3): error -113 dispatching events +May 10 10:56:00 testvm1.both.org NetworkManager[840]:  [1589122560.0634] dhcp4 (enp0s3): state changed bound -> fail +<剪去> +``` + +`since` 选项跳过了指定时间点的所有记录,但在此时间点之后仍有大量你不需要的记录。你也可以使用 `until` 选项来裁剪掉你感兴趣的时间之后的记录。我想要事件发生时附近的一分钟,其他的都不用: + +``` +[root@testvm1 ~]# journalctl --since="2020-05-10 10:54:35" --until="2020-05-10 10:55:00" +-- Logs begin at Tue 2020-05-05 18:11:49 EDT, end at Sun 2020-05-10 11:04:59 EDT. -- +May 10 10:54:35 testvm1.both.org systemd[1]: Reloading. +May 10 10:54:35 testvm1.both.org audit: BPF prog-id=27 op=UNLOAD +May 10 10:54:35 testvm1.both.org audit: BPF prog-id=26 op=UNLOAD +<剪去> +ay 10 10:54:35 testvm1.both.org audit: BPF prog-id=55 op=LOAD +May 10 10:54:45 testvm1.both.org systemd[1]: Starting My hello shell script... +May 10 10:54:45 testvm1.both.org hello.sh[1380]: ############################### +May 10 10:54:45 testvm1.both.org hello.sh[1380]: ######### Hello World! ######## +May 10 10:54:45 testvm1.both.org hello.sh[1380]: ############################### +May 10 10:54:45 testvm1.both.org systemd[1]: hello.service: Succeeded. +May 10 10:54:45 testvm1.both.org systemd[1]: Finished My hello shell script. +May 10 10:54:45 testvm1.both.org audit[1]: SERVICE_START pid=1 uid=0 auid=4294967295 ses=4294967295 msg='unit=hello comm="systemd" exe="/usr/lib/systemd> +May 10 10:54:45 testvm1.both.org audit[1]: SERVICE_STOP pid=1 uid=0 auid=4294967295 ses=4294967295 msg='unit=hello comm="systemd" exe="/usr/lib/systemd/> +lines 1-46/46 (END) +``` + +如果在这个时间段中仍然有大量的活动的话,你可以使用这些选项组合来进一步缩小结果数据流: + +``` +[root@testvm1 ~]# journalctl --since="2020-05-10 10:54:35" --until="2020-05-10 10:55:00" -t "hello.sh" +-- Logs begin at Tue 2020-05-05 18:11:49 EDT, end at Sun 2020-05-10 11:10:41 EDT. -- +May 10 10:54:45 testvm1.both.org hello.sh[1380]: ############################### +May 10 10:54:45 testvm1.both.org hello.sh[1380]: ######### Hello World! ######## +May 10 10:54:45 testvm1.both.org hello.sh[1380]: ############################### +[root@testvm1 ~]# +``` + +你的结果应该与我的相似。你可以从这一系列的实验中看出,这个服务运行的很正常。 + +### 重启 —— 还是走到这一步 + +到目前为止,你还没有重启过安装了服务的机器。所以现在重启吧,因为毕竟这个教程是关于启动阶段程序运行的情况。首先,你需要在启动序列中启用这个服务。 + +``` +[root@testvm1 ~]# systemctl enable hello.service +Created symlink /etc/systemd/system/multi-user.target.wants/hello.service → /etc/systemd/system/hello.service. +[root@testvm1 ~]# +``` + +注意到这个软链接是被创建在 `/etc/systemd/system/multi-user.target.wants` 目录下的。这是因为服务单元文件指定了服务是被 `multi-user.target` 所“需要”的。 + +重启机器,确保能在启动阶段观察数据流,这样你能看到 “Hello world” 信息。等等……你看见了么?嗯,我看见了。尽管它很快被刷过去了,但是我确实看到 systemd 的信息显示它启动了 `hello.service` 服务。 + +看看上次系统启动后的日志。你可以使用页面搜索工具 `less` 来找到 “Hello” 或 “hello”。我裁剪了很多数据,但是留下了附近的日志记录,这样你就能感受到和你服务有关的日志记录在本地是什么样子的: + +``` +[root@testvm1 ~]# journalctl -b +<剪去> +May 10 10:37:49 testvm1.both.org systemd[1]: Listening on SSSD Kerberos Cache Manager responder socket. +May 10 10:37:49 testvm1.both.org systemd[1]: Reached target Sockets. +May 10 10:37:49 testvm1.both.org systemd[1]: Reached target Basic System. +May 10 10:37:49 testvm1.both.org systemd[1]: Starting Modem Manager... +May 10 10:37:49 testvm1.both.org systemd[1]: Starting Network Manager... +May 10 10:37:49 testvm1.both.org systemd[1]: Starting Avahi mDNS/DNS-SD Stack... +May 10 10:37:49 testvm1.both.org systemd[1]: Condition check resulted in Secure Boot DBX (blacklist) updater being skipped. +May 10 10:37:49 testvm1.both.org systemd[1]: Starting My hello shell script... +May 10 10:37:49 testvm1.both.org systemd[1]: Starting IPv4 firewall with iptables... +May 10 10:37:49 testvm1.both.org systemd[1]: Started irqbalance daemon. +May 10 10:37:49 testvm1.both.org audit[1]: SERVICE_START pid=1 uid=0 auid=4294967295 ses=4294967295 msg='unit=irqbalance comm="systemd" exe="/usr/lib/sy>"' +May 10 10:37:49 testvm1.both.org systemd[1]: Starting LSB: Init script for live image.... +May 10 10:37:49 testvm1.both.org systemd[1]: Starting Hardware Monitoring Sensors... +<剪去> +May 10 10:37:49 testvm1.both.org systemd[1]: Starting NTP client/server... +May 10 10:37:49 testvm1.both.org systemd[1]: Starting SYSV: Late init script for live image.... +May 10 10:37:49 testvm1.both.org systemd[1]: Started SYSV: Late init script for live image.. +May 10 10:37:49 testvm1.both.org audit[1]: SERVICE_START pid=1 uid=0 auid=4294967295 ses=4294967295 msg='unit=livesys-late comm="systemd" exe="/usr/lib/>"' +May 10 10:37:49 testvm1.both.org hello.sh[842]: ############################### +May 10 10:37:49 testvm1.both.org hello.sh[842]: ######### Hello World! ######## +May 10 10:37:49 testvm1.both.org hello.sh[842]: ############################### +May 10 10:37:49 testvm1.both.org systemd[1]: hello.service: Succeeded. +May 10 10:37:49 testvm1.both.org systemd[1]: Finished My hello shell script. +May 10 10:37:49 testvm1.both.org audit[1]: SERVICE_START pid=1 uid=0 auid=4294967295 ses=4294967295 msg='unit=hello comm="systemd" exe="/usr/lib/systemd>"' +May 10 10:37:49 testvm1.both.org audit[1]: SERVICE_STOP pid=1 uid=0 auid=4294967295 ses=4294967295 msg='unit=hello comm="systemd" exe="/usr/lib/systemd/> +May 10 10:37:50 testvm1.both.org audit: BPF prog-id=28 op=LOAD +<剪去> +``` + +你可以看到 systemd 启动了 `hello.service` 单元,它执行了 `hello.sh` 脚本并将输出记录在日志中。如果你能在启动阶段抓到它,你也应该能看见,systemd 信息表明了它正在启动这个脚本,另外一条信息表明了服务成功。通过观察上面数据流中第一条 systemd 消息,你会发现 systemd 在到达基本的系统目标后很快就启动了你的服务。 + +但是我想看见信息在启动阶段也被打印出来。有一种方法可以做到:在 `hello.service` 文件的 `[Service]` 段中加入下述行: + +``` +StandardOutput=journal+console +``` + +现在 `hello.service` 文件看起来像这样: + +``` +# Simple service unit file to use for testing +# startup configurations with systemd. +# By David Both +# Licensed under GPL V2 +# + +[Unit] +Description=My hello shell script + +[Service] +Type=oneshot +ExecStart=/usr/local/bin/hello.sh +StandardOutput=journal+console + +[Install] +WantedBy=multi-user.target +``` + +加上这一行后,重启系统,并在启动过程中观察显示屏上滚动的数据流。你应该在它的小方框中看到信息。在启动序列完成后,你可以查看最近的启动日志,然后定位到你新服务的日志记录。 + +### 修改次序 + +现在你的服务已经可用了,你可以看看它在启动序列中哪个位置启动的,尝试下修改它。需要牢记的是 systemd 倾向于在每个主要目标(`basic.target`、`multi-user.target` 和 `graphical.**target`)中并行启动尽可能多的服务和其他的单元类型。你应该刚刚看过最近一次开机的日志记录,它应该和上面我的日志看上去类似。 + +注意,systemd 在它到达到基本系统目标(`basic.target`)后不久就启动了你的测试服务。这正是你在在服务单元文件的 `WantedBy` 行中指定的,所以它是对的。在你做出修改之前,列出 `/etc/systemd/system/multi-user.target.wants` 目录下的内容,你会看到一个指向服务单元文件的软链接。服务单元文件的 `[Install]` 段指定了哪一个目标会启动这个服务,执行 `systemctl enable hello.service` 命令会在适当的 `targets.wants` 路径下创建软链接。 + +``` +hello.service -> /etc/systemd/system/hello.service +``` + +某些服务需要在 `basic.target` 阶段启动,其他则没这个必要,除非系统正在启动 `graphical.target`。这个实验中的服务不会在 `basic.target` 期间启动 —— 假设你直到 `graphical.target` 阶段才需要它启动。那么修改 `WantedBy` 这一行: + +``` +WantedBy=graphical.target +``` + +一定要先禁用 `hello.service` 再重新启用它,这样可以删除旧链接并且在 `graphical.targets.wants` 目录下创建一个新的链接。我注意到如果我在修改服务需要的目标之前忘记禁用该服务,我可以运行 `systemctl disable` 命令,链接将从两个 `targets.wants` 目录中删除。之后我只需要重新启用这个服务然后重启电脑。 + +启动 `graphical.target` 下的服务有个需要注意的地方,如果电脑启动到 `multi-user.target` 阶段,这个服务不会自动启动。如果这个服务需要 GUI 桌面接口,这或许是你想要的,但是它同样可能不是你想要的。 + +用 `-o short-monotonic` 选项来查看 `graphical.target` 和 `multi-user.target` 的日志,展示内核启动几秒后的日志,精度为微秒级别: + +``` +[root@testvm1 ~]# journalctl -b -o short-monotonic +``` + +`multi-user.target` 的部分日志: + +``` +[   17.264730] testvm1.both.org systemd[1]: Starting My hello shell script... +[   17.265561] testvm1.both.org systemd[1]: Starting IPv4 firewall with iptables... +<剪去> +[   19.478468] testvm1.both.org systemd[1]: Starting LSB: Init script for live image.... +[   19.507359] testvm1.both.org iptables.init[844]: iptables: Applying firewall rules: [  OK  ] +[   19.507835] testvm1.both.org hello.sh[843]: ############################### +[   19.507835] testvm1.both.org hello.sh[843]: ######### Hello World! ######## +[   19.507835] testvm1.both.org hello.sh[843]: ############################### +<剪去> +[   21.482481] testvm1.both.org systemd[1]: hello.service: Succeeded. +[   21.482550] testvm1.both.org smartd[856]: Opened configuration file /etc/smartmontools/smartd.conf +[   21.482605] testvm1.both.org systemd[1]: Finished My hello shell script. +``` + +还有部分 `graphical.target` 的日志: + +``` +[   19.436815] testvm1.both.org systemd[1]: Starting My hello shell script... +[   19.437070] testvm1.both.org systemd[1]: Starting IPv4 firewall with iptables... +<剪去> +[   19.612614] testvm1.both.org hello.sh[841]: ############################### +[   19.612614] testvm1.both.org hello.sh[841]: ######### Hello World! ######## +[   19.612614] testvm1.both.org hello.sh[841]: ############################### +[   19.629455] testvm1.both.org audit[1]: SERVICE_START pid=1 uid=0 auid=4294967295 ses=4294967295 msg='unit=hello comm="systemd" exe="/usr/lib/systemd/systemd" hostname=? addr=? terminal=? res=success' +[   19.629569] testvm1.both.org audit[1]: SERVICE_STOP pid=1 uid=0 auid=4294967295 ses=4294967295 msg='unit=hello comm="systemd" exe="/usr/lib/systemd/systemd" hostname=? addr=? terminal=? res=success' +[   19.629682] testvm1.both.org systemd[1]: hello.service: Succeeded. +[   19.629782] testvm1.both.org systemd[1]: Finished My hello shell script. +``` + +尽管单元文件的 `WantedBy` 部分包含了 `graphical.target`,`hello.service` 单元在启动后大约 19.5 或 19.6 秒后运行。但是 `hello.service` 在 `multi-user.target` 中开始于 17.24 秒,在 `graphical target` 中开始于 19.43 秒。 + +这意味着什么呢?看看 `/etc/systemd/system/default.target` 这个链接。文件内容显示 systemd 先启动了默认目标 `graphical.target`,然后 `graphical.target` 触发了 `multi-user.target`。 + +``` +[root@testvm1 system]# cat default.target +#  SPDX-License-Identifier: LGPL-2.1+ +# +#  This file is part of systemd. +# +#  systemd is free software; you can redistribute it and/or modify it +#  under the terms of the GNU Lesser General Public License as published by +#  the Free Software Foundation; either version 2.1 of the License, or +#  (at your option) any later version. + +[Unit] +Description=Graphical Interface +Documentation=man:systemd.special(7) +Requires=multi-user.target +Wants=display-manager.service +Conflicts=rescue.service rescue.target +After=multi-user.target rescue.service rescue.target display-manager.service +AllowIsolate=yes +[root@testvm1 system]# +``` + +不管是用 `graphical.target` 还是 `multi-user.target` 启动服务,`hello.service` 单元都在启动后的 19.5 或 19.6 秒后启动。基于这个事实和日志结果(特别是使用单调输出的日志),你就知道这些目标是在并行启动。再看看日志中另外一件事: + + +``` +[   28.397330] testvm1.both.org systemd[1]: Reached target Multi-User System. +[   28.397431] testvm1.both.org systemd[1]: Reached target Graphical Interface. +``` + +两个目标几乎是同时完成的。这是和理论一致的,因为 `graphical.target` 触发了 `multi-user.target`,在 `multi-user.target` 到达(即完成)之前它是不会完成的。但是 `hello.service` 比这个完成的早的多。 + +这一切表明,这两个目标几乎是并行启动的。如果你查看日志,你会发现各种目标和来自这类主要目标的服务大多是平行启动的。很明显,`multi-user.target` 没有必要在 `graphical.target` 启动前完成。所以,简单的使用这些主要目标来并不能很好地排序启动序列,尽管它在保证单元只在它们被 `graphical.target` 需要时启动这方面很有用。 + +在继续之前,把 `hello.service` 单元文件回滚至 `WantedBy=multi-user.target`(如果还没做的话)。 + +### 确保一个服务在网络运行后启动 + +一个常见的启动问题是保证一个单元在网络启动运行后再启动。Freedesktop.org 的文章《[在网络启动后运行服务][11]》中提到,目前没有一个真正的关于网络何时算作“启动”的共识。然而,这篇文章提供了三个选项,满足完全可用网络需求的是 `network-online.target`。需要注意的是 `network.target` 是在关机阶段使用的而不是启动阶段,所以它对你做有序启动方面没什么帮助。 + +在做出任何改变之前,一定要检查下日志,确认 `hello.service` 单元在网络可用之前可以正确启动。你可以在日志中查找 `network-online.target` 来确认。 + +你的服务并不真的需要网络服务,但是你可以把它当作是需要网络的。 + +因为设置 `WantedBy=graphical.target` 并不能保证服务会在网络启动可用后启动,所以你需要其他的方法来做到这一点。幸运的是,有个简单的方法可以做到。将下面两行代码加入 `hello.service` 单元文件的 `[Unit]` 段: + +``` +After=network-online.target                                                                             +Wants=network-online.target +``` + +两个字段都需要才能生效。重启机器,在日志中找到服务的记录: + +``` +[   26.083121] testvm1.both.org NetworkManager[842]:  [1589227764.0293] device (enp0s3): Activation: successful, device activated. +[   26.083349] testvm1.both.org NetworkManager[842]:  [1589227764.0301] manager: NetworkManager state is now CONNECTED_GLOBAL +[   26.085818] testvm1.both.org NetworkManager[842]:  [1589227764.0331] manager: startup complete +[   26.089911] testvm1.both.org systemd[1]: Finished Network Manager Wait Online. +[   26.090254] testvm1.both.org systemd[1]: Reached target Network is Online. +[   26.090399] testvm1.both.org audit[1]: SERVICE_START pid=1 uid=0 auid=4294967295 ses=4294967295 msg='unit=NetworkManager-wait-online comm="systemd" exe="/usr/lib/systemd/systemd" hostname=? addr=? termina>"' +[   26.091991] testvm1.both.org systemd[1]: Starting My hello shell script... +[   26.095864] testvm1.both.org sssd[be[implicit_files]][1007]: Starting up +[   26.290539] testvm1.both.org systemd[1]: Condition check resulted in Login and scanning of iSCSI devices being skipped. +[   26.291075] testvm1.both.org systemd[1]: Reached target Remote File Systems (Pre). +[   26.291154] testvm1.both.org systemd[1]: Reached target Remote File Systems. +[   26.292671] testvm1.both.org systemd[1]: Starting Notify NFS peers of a restart... +[   26.294897] testvm1.both.org systemd[1]: iscsi.service: Unit cannot be reloaded because it is inactive. +[   26.304682] testvm1.both.org hello.sh[1010]: ############################### +[   26.304682] testvm1.both.org hello.sh[1010]: ######### Hello World! ######## +[   26.304682] testvm1.both.org hello.sh[1010]: ############################### +[   26.306569] testvm1.both.org audit[1]: SERVICE_START pid=1 uid=0 auid=4294967295 ses=4294967295 msg='unit=hello comm="systemd" exe="/usr/lib/systemd/systemd" hostname=? addr=? terminal=? res=success' +[   26.306669] testvm1.both.org audit[1]: SERVICE_STOP pid=1 uid=0 auid=4294967295 ses=4294967295 msg='unit=hello comm="systemd" exe="/usr/lib/systemd/systemd" hostname=? addr=? terminal=? res=success' +[   26.306772] testvm1.both.org systemd[1]: hello.service: Succeeded. +[   26.306862] testvm1.both.org systemd[1]: Finished My hello shell script. +[   26.584966] testvm1.both.org sm-notify[1011]: Version 2.4.3 starting +``` + +这样证实了 `hello.service` 单元会在 `network-online.target` 之后启动。这正是你想要的。你可能也看见了 “Hello World” 消息在启动阶段出现。还需要注意的是,在启动时记录出现的时间戳比之前要晚了大约 6 秒。 + +### 定义启动序列的最好方法 + +本文章详细地探讨了 Linux 启动时 systemd 和单元文件以及日志的细节,并且发现了当错误被引入单元文件时候会发生什么。作为系统管理员,我发现这类实验有助于我理解程序或者服务出故障时的行为,并且在安全环境中有意破坏是一种学习的好方法。 + +文章中实验结果证明,仅将服务单元添加至 `multi-user.target` 或者 `graphical.target` 并不能确定它在启动序列中的位置。它仅仅决定了一个单元是否作为图形环境一部分启动。事实上,启动目标 `multi-user.target` 和 `graphical.target` 和所有它们的 `Wants` 以及 `Required` 几乎是并行启动的。确保单元在特定位置启动的最好方法是确定它所依赖的单元,并将新单元配置成 `Want` 和 `After` 它的依赖。 + + +### 资源 + +网上有大量的关于 systemd 的参考资料,但是大部分都有点简略、晦涩甚至有误导性。除了本文中提到的资料,下列的网页提供了跟多可靠且详细的 systemd 入门信息。 + +Fedora 项目有一篇切实好用的 systemd 入门,它囊括了几乎所有你需要知道的关于如何使用 systemd 配置、管理和维护 Fedora 计算机的信息。 + +Fedora 项目也有一个不错的 备忘录,交叉引用了过去 SystemV 命令和 systemd 命令做对比。 + +关于 systemd 的技术细节和创建这个项目的原因,请查看 Freedesktop.org 上的 systemd 描述。 + +Linux.com 的“更多 systemd 的乐趣”栏目提供了更多高级的 systemd 信息和技巧。 + +此外,还有一系列深度的技术文章,是由 systemd 的设计者和主要开发者 Lennart Poettering 为 Linux 系统管理员撰写的。这些文章写于 2010 年 4 月至 2011 年 9 月间,但它们现在和当时一样具有现实意义。关于 systemd 及其生态的许多其他好文章都是基于这些文章: + + * [Rethinking PID 1][18] + * [systemd for Administrators,Part I][19] + * [systemd for Administrators,Part II][20] + * [systemd for Administrators,Part III][21] + * [systemd for Administrators,Part IV][22] + * [systemd for Administrators,Part V][23] + * [systemd for Administrators,Part VI][24] + * [systemd for Administrators,Part VII][25] + * [systemd for Administrators,Part VIII][26] + * [systemd for Administrators,Part IX][27] + * [systemd for Administrators,Part X][28] + * [systemd for Administrators,Part XI][29] + +-------------------------------------------------------------------------------- + +via: https://opensource.com/article/20/5/manage-startup-systemd + +作者:[David Both][a] +选题:[lujun9972][b] +译者:[tt67wq](https://github.com/tt67wq) +校对:[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/linux_penguin_green.png?itok=ENdVzW22 (Penguin with green background) +[2]: https://linux.cn/article-12214-1.html +[3]: https://opensource.com/article/20/5/systemd-units +[4]: https://opensource.com/article/20/5/systemd-startup +[5]: https://chmodcommand.com/chmod-700/ +[6]: https://opensource.com/life/16/10/introduction-linux-filesystems +[7]: https://chmodcommand.com/chmod-644/ +[8]: https://chmodcommand.com/chmod-640/ +[9]: http://man7.org/linux/man-pages/man5/systemd.service.5.html +[10]: tmp.bYMHU00BHs#resources +[11]: https://www.freedesktop.org/wiki/Software/systemd/NetworkTarget/ +[12]: https://docs.fedoraproject.org/en-US/quick-docs/understanding-and-administering-systemd/index.html +[13]: https://fedoraproject.org/wiki/SysVinit_to_Systemd_Cheatsheet +[14]: http://Freedesktop.org +[15]: http://www.freedesktop.org/wiki/Software/systemd +[16]: http://Linux.com +[17]: https://www.linux.com/training-tutorials/more-systemd-fun-blame-game-and-stopping-services-prejudice/ +[18]: http://0pointer.de/blog/projects/systemd.html +[19]: http://0pointer.de/blog/projects/systemd-for-admins-1.html +[20]: http://0pointer.de/blog/projects/systemd-for-admins-2.html +[21]: http://0pointer.de/blog/projects/systemd-for-admins-3.html +[22]: http://0pointer.de/blog/projects/systemd-for-admins-4.html +[23]: http://0pointer.de/blog/projects/three-levels-of-off.html +[24]: http://0pointer.de/blog/projects/changing-roots +[25]: http://0pointer.de/blog/projects/blame-game.html +[26]: http://0pointer.de/blog/projects/the-new-configuration-files.html +[27]: http://0pointer.de/blog/projects/on-etc-sysinit.html +[28]: http://0pointer.de/blog/projects/instances.html +[29]: http://0pointer.de/blog/projects/inetd.html diff --git a/published/202105/20201103 Create a list in a Flutter mobile app.md b/published/202105/20201103 Create a list in a Flutter mobile app.md new file mode 100644 index 0000000000..a27893ee35 --- /dev/null +++ b/published/202105/20201103 Create a list in a Flutter mobile app.md @@ -0,0 +1,346 @@ +[#]: collector: (lujun9972) +[#]: translator: (ywxgod) +[#]: reviewer: (wxy) +[#]: publisher: (wxy) +[#]: url: (https://linux.cn/article-13446-1.html) +[#]: subject: (Create a list in a Flutter mobile app) +[#]: via: (https://opensource.com/article/20/11/flutter-lists-mobile-app) +[#]: author: (Vitaly Kuprenko https://opensource.com/users/kooper) + +在 Flutter 移动应用程序中创建一个列表 +====== + +> 了解如何创建 Flutter 应用的界面以及如何在它们之间进行数据传递。 + +![](https://img.linux.net.cn/data/attachment/album/202105/31/201442luk1u6vqz3h3k8jn.jpg) + +Flutter 是一个流行的开源工具包,它可用于构建跨平台的应用。在文章《[用 Flutter 创建移动应用][2]》中,我已经向大家展示了如何在 Linux 中安装 [Flutter][3] 并创建你的第一个应用。而这篇文章,我将向你展示如何在你的应用中添加一个列表,点击每一个列表项可以打开一个新的界面。这是移动应用的一种常见设计方法,你可能以前见过的,下面有一个截图,能帮助你对它有一个更直观的了解: + +![测试 Flutter 应用][4] + +Flutter 使用 [Dart][6] 语言。在下面的一些代码片段中,你会看到以斜杠开头的语句。两个斜杠(`//`)是指代码注释,用于解释某些代码片段。三个斜杠(`///`)则表示的是 Dart 的文档注释,用于解释 Dart 类和类的属性,以及其他的一些有用的信息。 + +### 查看Flutter应用的主要部分 + +Flutter 应用的典型入口点是 `main()` 函数,我们通常可以在文件 `lib/main.dart` 中找到它: + +``` +void main() { + runApp(MyApp()); +} +``` + +应用启动时,`main()` 会被调用,然后执行 `MyApp()`。 `MyApp` 是一个无状态微件(`StatelessWidget`),它包含了`MaterialApp()` 微件中所有必要的应用设置(应用的主题、要打开的初始页面等): + +``` +class MyApp extends StatelessWidget { + @override + Widget build(BuildContext context) { +   return MaterialApp( +     title: 'Flutter Demo', +     theme: ThemeData( +       primarySwatch: Colors.blue, +       visualDensity: VisualDensity.adaptivePlatformDensity, +     ), +     home: MyHomePage(title: 'Flutter Demo Home Page'), +   ); + } +} +``` + +生成的 `MyHomePage()` 是应用的初始页面,是一个有状态的微件,它包含包含可以传递给微件构造函数参数的变量(从上面的代码看,我们传了一个 `title` 变量给初始页面的构造函数): + +``` +class MyHomePage extends StatefulWidget { + MyHomePage({Key key, this.title}) : super(key: key); + + final String title; + + @override + _MyHomePageState createState() => _MyHomePageState(); +} +``` + +有状态微件(`StatefulWidget`)表示这个微件可以拥有自己的状态:`_MyHomePageState`。调用 `_MyHomePageState` 中的 `setState()` 方法,可以重新构建用户界面: + +``` +class _MyHomePageState extends State { + int _counter = 0; // Number of taps on + button. + + void _incrementCounter() { // Increase number of taps and update UI by calling setState(). + setState(() { + _counter++; + }); + } + ... +} +``` + +不管是有状态的,还是无状态的微件,它们都有一个 `build()` 方法,该方法负责微件的 UI 外观。 + +``` +@override +Widget build(BuildContext context) { + return Scaffold( // Page widget. + appBar: AppBar( // Page app bar with title and back button if user can return to previous screen. + title: Text(widget.title), // Text to display page title. + ), + body: Center( // Widget to center child widget. + child: Column( // Display children widgets in column. + mainAxisAlignment: MainAxisAlignment.center, + children: [ + Text( // Static text. + 'You have pushed the button this many times:', + ), + Text( // Text with our taps number. + '$_counter', // $ sign allows us to use variables inside a string. + style: Theme.of(context).textTheme.headline4,// Style of the text, “Theme.of(context)” takes our context and allows us to access our global app theme. + ), + ], + ), + ), + // Floating action button to increment _counter number. + floatingActionButton: FloatingActionButton( + onPressed: _incrementCounter, + tooltip: 'Increment', + child: Icon(Icons.add), + ), + ); +} +``` + +### 修改你的应用 + +一个好的做法是,把 `main()` 方法和其他页面的代码分开放到不同的文件中。要想将它们分开,你需要右击 `lib` 目录,然后选择 “New > Dart File” 来创建一个 .dart 文件: + +![创建一个新的 Dart 文件][10] + +将新建的文件命名为 `items_list_page`。 + +切换回到 `main.dart` 文件,将 `MyHomePage` 和 `_MyHomePageState` 中的代码,剪切并粘贴到我们新建的文件。然后将光标放到 `StatefulWidget` 上(下面红色的下划线处), 按 `Alt+Enter` 后出现下拉列表,然后选择 `package:flutter/material.dart`: + +![导入 Flutter 包][11] + +经过上面的操作我们将 `flutter/material.dart` 包添加到了 `main.dart` 文件中,这样我们就可以使用 Flutter 提供的默认的 material 主题微件。 + +然后, 在类名 `MyHomePage` 右击,“Refactor > Rename...”将其重命名为 `ItemsListPage`: + +![重命名 StatefulWidget 类][12] + +Flutter 识别到你重命名了 `StatefulWidget` 类,它会自动将它的 `State` 类也跟着重命名: + +![State 类被自动重命名][13] + +回到 `main.dart` 文件,将文件名 `MyHomePage` 改为 `ItemsListPage`。 一旦你开始输入, 你的 Flutter 集成开发环境(可能是 IntelliJ IDEA 社区版、Android Studio 和 VS Code 或 [VSCodium][14]),会给出自动代码补完的建议。 + +![IDE 建议自动补完的代码][15] + +按回车键即可完成输入,缺失的导入语句会被自动添加到文件的顶部。 + +![添加缺失的导入语句][16] + +到此,你已经完成了初始设置。现在你需要在 `lib` 目录创建一个新的 .dart 文件,命名为 `item_model`。(注意,类命是大写驼峰命名,一般的文件名是下划线分割的命名。)然后粘贴下面的代码到新的文件中: + +``` +/// Class that stores list item info: +/// [id] - unique identifier, number. +/// [icon] - icon to display in UI. +/// [title] - text title of the item. +/// [description] - text description of the item. +class ItemModel { + // class constructor + ItemModel(this.id, this.icon, this.title, this.description); + + // class fields + final int id; + final IconData icon; + final String title; + final String description; +} +``` + +回到 `items_list_page.dart` 文件,将已有的 `_ItemsListPageState` 代码替换为下面的代码: + +``` +class _ItemsListPageState extends State { + +// Hard-coded list of [ItemModel] to be displayed on our page. + final List _items = [ + ItemModel(0, Icons.account_balance, 'Balance', 'Some info'), + ItemModel(1, Icons.account_balance_wallet, 'Balance wallet', 'Some info'), + ItemModel(2, Icons.alarm, 'Alarm', 'Some info'), + ItemModel(3, Icons.my_location, 'My location', 'Some info'), + ItemModel(4, Icons.laptop, 'Laptop', 'Some info'), + ItemModel(5, Icons.backup, 'Backup', 'Some info'), + ItemModel(6, Icons.settings, 'Settings', 'Some info'), + ItemModel(7, Icons.call, 'Call', 'Some info'), + ItemModel(8, Icons.restore, 'Restore', 'Some info'), + ItemModel(9, Icons.camera_alt, 'Camera', 'Some info'), + ]; + + @override + Widget build(BuildContext context) { + return Scaffold( + appBar: AppBar( + title: Text(widget.title), + ), + body: ListView.builder( // Widget which creates [ItemWidget] in scrollable list. + itemCount: _items.length, // Number of widget to be created. + itemBuilder: (context, itemIndex) => // Builder function for every item with index. + ItemWidget(_items[itemIndex], () { + _onItemTap(context, itemIndex); + }), + )); + } + + // Method which uses BuildContext to push (open) new MaterialPageRoute (representation of the screen in Flutter navigation model) with ItemDetailsPage (StateFullWidget with UI for page) in builder. + _onItemTap(BuildContext context, int itemIndex) { + Navigator.of(context).push(MaterialPageRoute( + builder: (context) => ItemDetailsPage(_items[itemIndex]))); + } +} + + +// StatelessWidget with UI for our ItemModel-s in ListView. +class ItemWidget extends StatelessWidget { + const ItemWidget(this.model, this.onItemTap, {Key key}) : super(key: key); + + final ItemModel model; + final Function onItemTap; + + @override + Widget build(BuildContext context) { + return InkWell( // Enables taps for child and add ripple effect when child widget is long pressed. + onTap: onItemTap, + child: ListTile( // Useful standard widget for displaying something in ListView. + leading: Icon(model.icon), + title: Text(model.title), + ), + ); + } +} +``` + +为了提高代码的可读性,可以考虑将 `ItemWidget` 作为一个单独的文件放到 `lib` 目录中。 + +现在唯一缺少的是 `ItemDetailsPage` 类。在 `lib` 目录中我们创建一个新文件并命名为 `item_details_page`。然后将下面的代码拷贝进去: + +``` +import 'package:flutter/material.dart'; + +import 'item_model.dart'; + +/// Widget for displaying detailed info of [ItemModel] +class ItemDetailsPage extends StatefulWidget { + final ItemModel model; + + const ItemDetailsPage(this.model, {Key key}) : super(key: key); + + @override + _ItemDetailsPageState createState() => _ItemDetailsPageState(); +} + +class _ItemDetailsPageState extends State { + @override + Widget build(BuildContext context) { + return Scaffold( + appBar: AppBar( + title: Text(widget.model.title), + ), + body: Center( + child: Column( + children: [ + const SizedBox(height: 16), + Icon( + widget.model.icon, + size: 100, + ), + const SizedBox(height: 16), + Text( + 'Item description: ${widget.model.description}', + style: TextStyle(fontSize: 18), + ) + ], + ), + ), + ); + } +} +``` + +上面的代码几乎没什么新东西,不过要注意的是 `_ItemDetailsPageState` 里使用了 `widget.item.title` 这样的语句,它让我们可以从有状态类中引用到其对应的微件(`StatefulWidget`)。 + +### 添加一些动画 + +现在让我们来添加一些基础的动画: + + 1. 找到 `ItemWidget` 代码块(或者文件) + 2. 将光标放到 `build()` 方法中的 `Icon()` 微件上 + 3. 按 `Alt+Enter`,然后选择“Wrap with widget...” + +![查看微件选项][18] + +输入 `Hero`,然后从建议的下拉列表中选择 `Hero((Key key, @required this, tag, this.create))`: + +![查找 Hero 微件][19] + +下一步, 给 Hero 微件添加 `tag` 属性 `tag: model.id`: + +![在 Hero 微件上添加 tag 属性为 model.id][20] + +最后我们在 `item_details_page.dart` 文件中做相同的修改: + +![修改item_details_page.dart文件][21] + +前面的步骤,其实我们是用 `Hero()` 微件对 `Icon()` 微件进行了封装。还记得吗?前面我们定义 `ItemModel` 类时,定义了一个 `id field`,但没有在任何地方使用到。因为 Hero 微件会为其每个子微件添加一个唯一的标签。当 Hero 检测到不同页面(`MaterialPageRoute`)中存在相同标签的 Hero 时,它会自动在这些不同的页面中应用过渡动画。 + +可以在安卓模拟器或物理设备上运行我们的应用来测试这个动画。当你打开或者关闭列表项的详情页时,你会看到一个漂亮的图标动画: + +![测试 Flutter 应用][4] + +### 收尾 + +这篇教程,让你学到了: + + * 一些符合标准的,且能用于自动创建应用的组件。 + * 如何添加多个页面以及在页面间传递数据。 + * 如何给多个页面添加简单的动画。 + +如果你想了解更多,查看 Flutter 的 [文档][22](有一些视频和样例项目的链接,还有一些创建 Flutter 应用的“秘方”)与 [源码][23],源码的开源许可证是 BSD 3。 + +-------------------------------------------------------------------------------- + +via: https://opensource.com/article/20/11/flutter-lists-mobile-app + +作者:[Vitaly Kuprenko][a] +选题:[lujun9972][b] +译者:[ywxgod](https://github.com/ywxgod) +校对:[wxy](https://github.com/wxy) + +本文由 [LCTT](https://github.com/LCTT/TranslateProject) 原创编译,[Linux中国](https://linux.cn/) 荣誉推出 + +[a]: https://opensource.com/users/kooper +[b]: https://github.com/lujun9972 +[1]: https://opensource.com/sites/default/files/styles/image-full-size/public/lead-images/team-phone-collaboration-mobile-device.png?itok=v3EjbRK6 (Mobile devices and collaboration leads to staring at our phones) +[2]: https://linux.cn/article-12693-1.html +[3]: https://flutter.dev/ +[4]: https://opensource.com/sites/default/files/uploads/flutter_test.gif (Testing the Flutter app) +[5]: https://creativecommons.org/licenses/by-sa/4.0/ +[6]: https://dart.dev/ +[7]: http://www.google.com/search?hl=en&q=allinurl%3Adocs.oracle.com+javase+docs+api+key +[8]: http://www.google.com/search?hl=en&q=allinurl%3Adocs.oracle.com+javase+docs+api+string +[9]: http://www.google.com/search?hl=en&q=allinurl%3Adocs.oracle.com+javase+docs+api+icon +[10]: https://opensource.com/sites/default/files/uploads/flutter_new-dart-file_0.png (Create a new Dart file) +[11]: https://opensource.com/sites/default/files/uploads/flutter_import-package.png (Importing Flutter package) +[12]: https://opensource.com/sites/default/files/uploads/flutter_rename-class.png (Renaming StatefulWidget class) +[13]: https://opensource.com/sites/default/files/uploads/flutter_stateclassrenamed.png (State class renamed automatically) +[14]: https://opensource.com/article/20/6/open-source-alternatives-vs-code +[15]: https://opensource.com/sites/default/files/uploads/flutter_autocomplete.png (IDE suggests autocompleting code) +[16]: https://opensource.com/sites/default/files/uploads/flutter_import-input.png (Adding missing import ) +[17]: http://www.google.com/search?hl=en&q=allinurl%3Adocs.oracle.com+javase+docs+api+listview +[18]: https://opensource.com/sites/default/files/uploads/flutter_wrapwithwidget.png (Wrap with widget option) +[19]: https://opensource.com/sites/default/files/uploads/flutter_hero.png (Finding the Hero widget) +[20]: https://opensource.com/sites/default/files/uploads/flutter_hero-tag.png (Adding the tag property model.id to the Hero widget) +[21]: https://opensource.com/sites/default/files/uploads/flutter_details-tag.png (Changing item_details_page.dart file) +[22]: https://flutter.dev/docs +[23]: https://github.com/flutter diff --git a/published/202105/20201117 Getting started with btrfs for Linux.md b/published/202105/20201117 Getting started with btrfs for Linux.md new file mode 100644 index 0000000000..a47f573e08 --- /dev/null +++ b/published/202105/20201117 Getting started with btrfs for Linux.md @@ -0,0 +1,232 @@ +[#]: collector: (lujun9972) +[#]: translator: (Chao-zhi) +[#]: reviewer: (wxy) +[#]: publisher: (wxy) +[#]: url: (https://linux.cn/article-13440-1.html) +[#]: subject: (Getting started with btrfs for Linux) +[#]: via: (https://opensource.com/article/20/11/btrfs-linux) +[#]: author: (Alan Formy-Duval https://opensource.com/users/alanfdoss) + +Btrfs 文件系统入门 +====== + +> B-tree 文件系统(Btrfs)融合了文件系统和卷管理器。它为 Linux 操作系统提供了高级文件系统应当拥有的诸多不错的功能特性。 + +![](https://img.linux.net.cn/data/attachment/album/202105/30/070203wkxsufbx1zlccyl9.jpg) + +好几年前 Btrfs 就已经可以在 Linux 中使用了,所以你可能已经熟悉它了。如果没有,你可能对它尚有疑虑,尤其是如果你使用的是 Fedora 工作站 (Btrfs 现在是它的默认文件系统)。本文旨在帮助你熟悉它及其高级功能,例如 [写时复制][2] 和 [校验和][3]。 + +Btrfs 是 “B-Tree Filesystem” 的缩写,实际上是文件系统和卷管理器的结合体。它通常被视为对 ZFS 的回应,ZFS 早在 2005 年就被引入 Sun 微系统的 Solaris 操作系统中,现在基本上被一个名为 OpenZFS 的开源实现所取代。Ubuntu 和 FreeBSD 常常使用 OpenZFS。其他具有类似特性的示例有红帽的 Stratis 和 Linux 逻辑卷管理器Logical Volume Manager(LVM)。 + +### 安装 + +为了尝试 Btrfs,我下载了 Fedora 33 工作站 [ISO 文件][4] 并将其安装到一个新的虚拟机(VM)中。安装过程与以前的版本没有变化。我没有自定义任何设置,包括驱动器分区和格式化,以保持本教程的准确“开箱即用”设置。当虚拟机启动并运行后,我安装并运行了 GNOME 分区编辑器([GParted][5]),以获得一个良好的、工厂级的驱动器布局视图。 + +![GParted's view of Btrfs on Fedora 33 Workstation using GParted][6] + +从安装这一点来说,与你以前所习惯的情况没什么不同;事实上,你可以正常使用该系统,甚至可能没有注意到文件系统是 Btrfs。然而,拥有这个新的默认文件系统使你能够利用几个很酷的特性。 + +### 检查 Btrfs 文件系统 + +我暂时没有找到特定于 Btrfs 的图形工具,尽管它的一些功能已经被合并到现有的磁盘管理工具中。 + +在命令行中,你可以更仔细地查看 Btrfs 格式: + +``` +# btrfs filesystem show +Label: 'fedora_localhost-live'  uuid: f2bb02f9-5c41-4c91-8eae-827a801ee58a +        Total devices 1 FS bytes used 6.36GiB +        devid    1 size 10.41GiB used 8.02GiB path /dev/vda3 +``` + +### 修改 Btrfs 标签 + +我首先注意到的是安装程序设置的文件系统标签:`fedora_localhost-live`。这是不准确的,因为它现在是一个已安装的系统,不再是 [livecd][8]。所以我使用 `btrfs filesystem label` 命令对其进行了更改。 + +修改 Btrfs 标签非常的简单: + +``` +# btrfs filesystem label / +fedora_localhost-live +# btrfs filesystem label / fedora33workstation +# btrfs filesystem label / +fedora33workstation +``` + +### 管理 Btrfs 子卷 + +子卷看起来像是可以由 Btrfs 管理的标准目录。我的新 Fedora 33 工作站上有几个子卷: + +``` +# btrfs subvolume list / +ID 256 gen 2458 top level 5 path home +ID 258 gen 2461 top level 5 path root +ID 265 gen 1593 top level 258 path var/lib/machines +``` + +使用 `btrfs subvolume Create` 命令创建新的子卷,或使用 `btrfs subvolume delete` 删除子卷: + +``` +# btrfs subvolume create /opt/foo +Create subvolume '/opt/foo' +# btrfs subvolume list / +ID 256 gen 2884 top level 5 path home +ID 258 gen 2888 top level 5 path root +ID 265 gen 1593 top level 258 path var/lib/machines +ID 276 gen 2888 top level 258 path opt/foo +# btrfs subvolume delete /opt/foo +Delete subvolume (no-commit): '/opt/foo' +``` + +子卷允许设置配额、拍摄快照以及复制到其他位置和其他主机等操作。那么系统管理员如何利用这些功能?用户主目录又是如何操作的呢? + +#### 添加用户 + +就像从前一样,添加一个新的用户帐户会创建一个主目录供该帐户使用: + +``` +# useradd student1 +# getent passwd student1 +student1:x:1006:1006::/home/student1:/bin/bash +# ls -l /home +drwx------. 1 student1 student1 80 Oct 29 00:21 student1 +``` + +传统上,用户的主目录是 `/home` 的子目录。所有权和操作权是为所有者量身定制的,但是特殊功能来没有管理它们。而企业服务器环境是另外一种情况。通常,目录是为特定的应用程序及其用户保留的。你可以利用 Btrfs 来管理和应用对这些目录的约束。 + +为了将 Btrfs 子卷作为用户主页,在 `useradd` 命令中有一个新选项:`--Btrfs-subvolume-home`。尽管手册页尚未更新(截至本文撰写之时),但你可以通过运行 `useradd --help` 来查看该选项。通过在添加新用户时传递此选项,将创建一个新的 Btrfs 子卷。它的功能与创建常规目录时的 `-d` 选项类似: + +``` +# useradd --btrfs-subvolume-home student2 +Create subvolume '/home/student2' +``` + +使用 `getent passwd student2` 验证用户,它将显示为正常。但是,运行 `btrfs subvolume` 命令列出子卷,你将看到一些有趣的内容:新用户的主目录! + +``` +# btrfs subvolume list / +ID 256 gen 2458 top level 5 path home +ID 258 gen 2461 top level 5 path root +ID 265 gen 1593 top level 258 path var/lib/machines +ID 272 gen 2459 top level 256 path home/student2 +``` + +探索企业服务器环境的第二个场景。假设你需要在 `/opt` 中安装一个 [WildFly][9] 服务器并部署一个 Java web 应用程序。通常,你的第一步是创建一个 `wildfly` 用户。使用新的 `--btrfs-subvolume-home` 选项和 `-b` 选项来指定 `/opt` 作为基本目录: + +``` +# useradd -b /opt --btrfs-subvolume-home wildfly +Create subvolume '/opt/wildfly' +``` + +于是,`wildfly` 用户可以使用了,并且主目录设置在了 `/opt/wildfly`。 + +#### 删除用户 + +删除用户时,有时需要同时删除该用户的文件和主目录。`userdel` 命令有 `-r` 选项,它可以同时删除 Btrfs 子卷: + +``` +# userdel -r student2 +Delete subvolume (commit): '/home/student2' +``` + +#### 设置磁盘使用配额 + +在我的一节计算机科学课上,一个学生运行了一个失控的 C 程序,然后写进了磁盘,将我们院的 Unix 系统上整个 `/home` 目录都填满了!在管理员终止失控进程并清除一些空间之前,服务器将无法使用。上述情况也是如此;那个 Wildfly 企业应用程序将为其用户提供越来越多的日志文件和内容存储。如何防止服务器因磁盘已满而死机?设置磁盘使用限制是个好主意。幸运的是,Btrfs 通过设置配额的方式支持这一点。 + +配置配额需要几个步骤。第一步是在 Btrfs 文件系统上启用配额: + +``` +# btrfs quota enable / +``` + +确保你知道每个子卷的配额组(qgroup)ID 号,该编号由 `btrfs subvolume list` 命令显示。每个子卷都需要基于 ID 号码来关联配额组。这可以通过 `btrfs qgroup create` 单独完成,但是,btrfs 维基提供了以下命令来加快为文件系统上的子卷创建配额组: + +``` +> btrfs subvolume list \ | cut -d' ' -f2 | xargs -I{} -n1 btrfs qgroup destroy 0/{} \ +``` + +在新安装的 Fedora 33 工作站系统中,你在根文件系统路径上操作,`/`。用根路径替换 `\`: + +``` +# btrfs subvolume list / | cut -d' ' -f2 | xargs -I{} -n1 btrfs qgroup create 0/{} / +``` + +然后运行 `btrfs quota rescan`,查看新的配额组: + +``` +# btrfs quota rescan / +quota rescan started +# btrfs qgroup show / +qgroupid         rfer         excl +--------         ----         ---- +0/5          16.00KiB     16.00KiB +0/256       272.04MiB    272.04MiB +0/258         6.08GiB      6.08GiB +0/265        16.00KiB     16.00KiB +0/271        16.00KiB     16.00KiB +0/273        16.00KiB     16.00KiB +``` + +于是现在,你可以将配额分配给其中一个配额组,然后将配额应用于其关联的子卷。因此,如果要将 `student3` 的主目录使用限制为 1 GB,请使用 `btrfs qgroup limit` 命令: + +``` +# btrfs qgroup limit 1G /home/student3 +``` + +查看特定子卷的配额: + +``` +# btrfs qgroup show -reF /home/student3 +qgroupid         rfer         excl     max_rfer     max_excl +--------         ----         ----     --------     -------- +0/271        16.00KiB     16.00KiB      1.00GiB         none +``` + +稍有不同的选项参数将显示所有配额组和设置的所有配额: + +``` +# btrfs qgroup show -re / +qgroupid         rfer         excl     max_rfer     max_excl +--------         ----         ----     --------     -------- +0/5          16.00KiB     16.00KiB         none         none +0/256       272.04MiB    272.04MiB         none         none +0/258         6.08GiB      6.08GiB         none         none +0/265        16.00KiB     16.00KiB         none         none +0/271        16.00KiB     16.00KiB      1.00GiB         none +0/273        16.00KiB     16.00KiB         none         none +``` + +### 其他特性 + +这些例子提供了 Btrfs 特性的一些思考。运行 `btrfs --help` 查看命令的完整列表。还有许多其他值得注意的功能;例如,快照和发送/接收是两个值得学习的功能。 + +### 总结讨论 + +Btrfs 为向 Linux 提供高级文件系统特性集贡献了很多特性。这不是第一次;我知道 ZFS 在大约 15 年前引入了这种类型的文件系统,但是 Btrfs 是完全开源的,不受专利的限制。 + +如果你想探索这个文件系统,我建议从虚拟机或备用系统开始。 + +我想能够出现一些图形化的管理工具,为那些喜欢用图形工具的系统管理员提供便利。幸运的是,Btrfs 具有强大的开发活动,Fedora 33 项目决定将其设置为工作站上的默认值就证明了这一点。 + +-------------------------------------------------------------------------------- + +via: https://opensource.com/article/20/11/btrfs-linux + +作者:[Alan Formy-Duval][a] +选题:[lujun9972][b] +译者:[Chao-zhi](https://github.com/Chao-zhi) +校对:[wxy](https://github.com/wxy) + +本文由 [LCTT](https://github.com/LCTT/TranslateProject) 原创编译,[Linux中国](https://linux.cn/) 荣誉推出 + +[a]: https://opensource.com/users/alanfdoss +[b]: https://github.com/lujun9972 +[1]: https://opensource.com/sites/default/files/styles/image-full-size/public/lead-images/files_documents_organize_letter.png?itok=GTtiiabr (Filing cabinet for organization) +[2]: https://en.wikipedia.org/wiki/Copy-on-write +[3]: https://en.wikipedia.org/wiki/Checksum +[4]: https://getfedora.org/en/workstation/download/ +[5]: https://gparted.org/ +[6]: https://opensource.com/sites/default/files/uploads/gparted_btrfs.png (GParted's view of Btrfs on Fedora 33 Workstation using GParted) +[7]: https://creativecommons.org/licenses/by-sa/4.0/ +[8]: https://en.wikipedia.org/wiki/Live_CD +[9]: https://www.wildfly.org/ diff --git a/published/202105/20201123 6 predictions for JavaScript build tools.md b/published/202105/20201123 6 predictions for JavaScript build tools.md new file mode 100644 index 0000000000..fcb3f0f83e --- /dev/null +++ b/published/202105/20201123 6 predictions for JavaScript build tools.md @@ -0,0 +1,145 @@ +[#]: collector: (lujun9972) +[#]: translator: (ywxgod) +[#]: reviewer: (wxy) +[#]: publisher: (wxy) +[#]: url: (https://linux.cn/article-13423-1.html) +[#]: subject: (6 predictions for JavaScript build tools) +[#]: via: (https://opensource.com/article/20/11/javascript-build-tools) +[#]: author: (Shedrack Akintayo https://opensource.com/users/shedrack-akintayo) + +对 JavaScript 构建工具的 6 个预测 +====== + +> JavaScript 前端工具的生态系统充满着变数和竞争,且只有最好的工具才会存活下来。 + +![](https://img.linux.net.cn/data/attachment/album/202105/25/112116d5z1lrywl6k25mur.jpg) + +生产中使用的代码与开发中的有所不同. 在生产中,我们需要构建一些能运行得够快、能管理各种依赖关系、能自动执行任务、能加载外部模块等功能的包。而那些将开发中的代码转为生产代码的 [JavaScript][2] 工具我们就称之为 _构建工具。_ + +我们可以通过各个构建步骤以及其重要性来解释前端代码需要被“构建”的原因。 + +### 前端代码构建步骤 + +前端代码的构建涉及下面的四个步骤: + +#### 1、转译 + +通过转译Transpiling,开发者可以使用到语言最新、最热门的更新和扩展,并保持浏览器的兼容性等。下面是使用 [Babel][3] 的一个例子: + +``` +// 数组映射中的箭头函数语法 +const double = [1, 2, 3].map((num) => num * 2); +// 转译后 +const double = [1, 2, 3].map(function(num) { + return num * 2; +}); +``` + +#### 2、分包 + +分包Bundling是处理所有 `import` 与`require` 语句的过程;找到相匹配的 JavaScript 代码片段、包和库;将它们添加到适当的域中;然后将它们打包到一个大的 JavaScript 文件中。常用的分包器包括 Browserify、Webpack 与 Parcel。 + +#### 3、压缩 + +压缩Minifing是通过删除空白和代码注释来减少最终的文件大小。在压缩过程中,我们还可以更进一步添加代码混淆步骤,混淆会更改变量名和方法名,使代码变得晦涩难懂,因此一旦代码交付到客户端,它就不是那么容易能让人读懂。下面是一个使用 Grunt 的例子: + +``` +// 压缩前 +const double = [1, 2, 3].map(function(num) { +  return num * 2; +}); +// 压缩后 +const double=[1,2,3].map(function(num){return num*2;}); +``` + +#### 4、打包 + +完成上面的所有步骤之后, 我们需要将这些具有兼容性、且经过分包、压缩/混淆过的文件放置到某个地方。打包Packaging正是这样一个过程,它将上述步骤所产生的结果放置到开发者指定的某个位置上,这通常是通过打包器完成的。 + +### 前端构建工具 + +前端工具及构建工具可以分为以下几类: + + * 包管理: NPM、Yarn + * 转译器: Babel 等 + * 打包器: Webpack、Parcel、Browserify + * 压缩混淆: UglifyJS、Packer、Minify 等 + +JavaScript 生态系统中有各种各样的构建工具可以使用,包括下面的这些: + +#### Grunt 和 Bower + +[Grunt][4] 是作为命令行工具引入的,它仅提供一个脚本来指定和配置相关构建任务。[Bower][5] 作为包管理器,提供了一种客户端包的管理方法而紧追其后。这两者,再加上 NPM,它们经常在一起使用,它们看上去似乎可以满足大多数的自动化需求,但 Grunt 的问题在于它无法提供给开发者配置更复杂任务的自由,而 Bower 使开发者管理的程序包是平常的两倍,因为它将前端包、后台包分开了(例如,Bower 组件与 Node 模块)。 + +**Grunt 与 Bower 的未来:** Grunt 与 Bower 正在退出 JavaScript 工具生态,但是还有一些替代品。 + +#### Gulp 和 Browserify + +[Gulp][6] 是在 Grunt 发布一年半之后才发布的。但 Gulp 却让大家感到很自然、舒服。用 JavaScript 来写构建脚本与用 JSON 来写相比更自由。你可以在 Gulp 的构建脚本中编写函数、即时创建变量、在任何地方使用条件语句 —— 但就这些,并不能说让我们的感觉变得特别自然和舒适,只能说这只是其中的一个可能的原因。[Browserify][7] 和 Gulp 可以配合使用,Browserify 允许 NPM 包(用于后端 Node 服务器)被直接带入到前端,就这一点已经直接让 Bower 废了。而正是这种用一个包管理器来处理前后端包的方式让人感到更自然和更好。 + +**Gulp 的未来:** Gulp 可能会被改进,以便匹配当前流行的构建工具,但这完全取决于创造者的意愿。Gulp 仍在使用中,只是不再像以前那么流行了。 + +#### Webpack 和 NPM/Yarn 脚本 + +[Webpack][8] 是现代前端开发工具中最热门的宠儿,它是一个开源的 JavaScript 模块打包器。Webpack 主要是为处理 JavaScript 而创造的,但如果包含相应的加载器,它也可以转换 HTML、CSS 和图片等前端资源。通过 Webpack,你也可以像 Gulp 一样编写构建脚本,并通过 [NPM/Yarn][9] 来执行它们。 + +**Webpack 的未来:** Webpack 是目前 JavaScript 工具生态系统中最热门的工具,最近几乎所有的 JavaScript 库都在使用 React 和 Webpack。Webpack 目前处于第四个版本,不会很快消失。(LCTT 译注:Webpack 目前已经发布了第五个版本了,且还在火热更新中) + +#### Parcel + +[Parcel][10] 是一个 Web 应用打包器,于 2018 年推出,因其开发者体验而与众不同。Parcel 能利用处理器多核功能提供极快的打包性能,且还零配置。但 Parcel 还是一个新星,对于一些大型应用,其采用率并不高。相比之下,开发人员更喜欢使用 Webpack,因为 Webpack 有更广泛的支持和可定制性。 + +**Parcel 的未来:** Parcel 非常容易使用,如果你统计打包和构建时间,它会比 Webpack 更快,而且它还提供了更好的开发者体验。Parcel 没有被大量采用的原因可能是它仍然比较新。在前端构建工具的生态系统中,Parcel 的前景会非常光明,它将会存在一段时间。 + +#### Rollup + +[Rollup][11] 是 JavaScript 的一个模块分包器,它可将一小段代码编译为更大更复杂的库或应用。Rollup 一般建议用来构建 JavaScript 库,特别是那种导入和依赖的第三方库较少的那种库。 + +**Rollup 的未来:** Rollup 很酷,且正在被迅速采用。它有很多强大的功能,将在很长一段时间内作为前端工具生态系统的一个组成部分而存在。 + +### 了解更多 + +JavaScript 前端工具的生态系统充满着变数和竞争,且只有最好的工具才能存活下来。在不久的将来,我们的构建工具将具有更少(或没有)的配置,更方便的定制化,更好的扩展性的和更好的构建速度。 + +该用什么样的构建工具用于你的前端项目,你需要根据具体的项目需求来做出决定。至于选择什么样的工具,才是最合适自己的,大多数时候,需要我们自己作出取舍。 + +更多信息, 请看: + + * [JavaScript tooling: The evolution and future of JS/frontend build tools][12] + * [Tools and modern workflow for frontend developers][13] + * [Modern frontend: The tools and build process explained][14] + * [Best build tools in frontend development][15] + +* * * + +_这篇文章最初发表在 [Shedrack Akintayo 的博客][16] 上,经许可后重新发表。_ + +-------------------------------------------------------------------------------- + +via: https://opensource.com/article/20/11/javascript-build-tools + +作者:[Shedrack Akintayo][a] +选题:[lujun9972][b] +译者:[ywxgod](https://github.com/ywxgod) +校对:[wxy](https://github.com/wxy) + +本文由 [LCTT](https://github.com/LCTT/TranslateProject) 原创编译,[Linux中国](https://linux.cn/) 荣誉推出 + +[a]: https://opensource.com/users/shedrack-akintayo +[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://www.javascript.com/ +[3]: https://babeljs.io/ +[4]: https://gruntjs.com/ +[5]: https://bower.io/ +[6]: https://gulpjs.com/ +[7]: http://browserify.org/ +[8]: https://webpack.js.org/ +[9]: https://github.com/yarnpkg/yarn +[10]: https://parceljs.org/ +[11]: https://rollupjs.org/guide/en/ +[12]: https://qmo.io/blog/javascript-tooling-the-evolution-and-future-of-js-front-end-build-tools/ +[13]: https://blog.logrocket.com/tools-and-modern-workflow-for-front-end-developers-505c7227e917/ +[14]: https://medium.com/@trevorpoppen/modern-front-end-the-tools-and-build-process-explained-36641b5c1a53 +[15]: https://www.developerdrive.com/best-build-tools-frontend-development/ +[16]: https://www.sheddy.xyz/posts/javascript-build-tools-past-and-beyond diff --git a/published/202105/20210104 Network address translation part 1 - packet tracing.md b/published/202105/20210104 Network address translation part 1 - packet tracing.md new file mode 100644 index 0000000000..b1b8c31243 --- /dev/null +++ b/published/202105/20210104 Network address translation part 1 - packet tracing.md @@ -0,0 +1,226 @@ +[#]: collector: (lujun9972) +[#]: translator: (cooljelly) +[#]: reviewer: (wxy) +[#]: publisher: (wxy) +[#]: url: (https://linux.cn/article-13364-1.html) +[#]: subject: (Network address translation part 1 – packet tracing) +[#]: via: (https://fedoramagazine.org/network-address-translation-part-1-packet-tracing/) +[#]: author: (Florian Westphal https://fedoramagazine.org/author/strlen/) + +网络地址转换(NAT)之报文跟踪 +====== + +![](https://img.linux.net.cn/data/attachment/album/202105/06/112410xhdkvvdajis3jhlj.jpg) + +这是有关网络地址转换network address translation(NAT)的系列文章中的第一篇。这一部分将展示如何使用 iptables/nftables 报文跟踪功能来定位 NAT 相关的连接问题。 + +### 引言 + +网络地址转换(NAT)是一种将容器或虚拟机暴露在互联网中的一种方式。传入的连接请求将其目标地址改写为另一个地址,随后被路由到容器或虚拟机。相同的技术也可用于负载均衡,即传入的连接被分散到不同的服务器上去。 + +当网络地址转换没有按预期工作时,连接请求将失败,会暴露错误的服务,连接最终出现在错误的容器中,或者请求超时,等等。调试此类问题的一种方法是检查传入请求是否与预期或已配置的转换相匹配。 + +### 连接跟踪 + +NAT 不仅仅是修改 IP 地址或端口号。例如,在将地址 X 映射到 Y 时,无需添加新规则来执行反向转换。一个被称为 “conntrack” 的 netfilter 系统可以识别已有连接的回复报文。每个连接都在 conntrack 系统中有自己的 NAT 状态。反向转换是自动完成的。 + +### 规则匹配跟踪 + +nftables 工具(以及在较小的程度上,iptables)允许针对某个报文检查其处理方式以及该报文匹配规则集合中的哪条规则。为了使用这项特殊的功能,可在合适的位置插入“跟踪规则”。这些规则会选择被跟踪的报文。假设一个来自 IP 地址 C 的主机正在访问一个 IP 地址是 S 以及端口是 P 的服务。我们想知道报文匹配了哪条 NAT 转换规则,系统检查了哪些规则,以及报文是否在哪里被丢弃了。 + +由于我们要处理的是传入连接,所以我们将规则添加到 prerouting 钩子上。prerouting 意味着内核尚未决定将报文发往何处。修改目标地址通常会使报文被系统转发,而不是由主机自身处理。 + +### 初始配置 + +``` +# nft 'add table inet trace_debug' +# nft 'add chain inet trace_debug trace_pre { type filter hook prerouting priority -200000; }' +# nft "insert rule inet trace_debug trace_pre ip saddr $C ip daddr $S tcp dport $P tcp flags syn limit rate 1/second meta nftrace set 1" +``` + +第一条规则添加了一张新的规则表,这使得将来删除和调试规则可以更轻松。一句 `nft delete table inet trace_debug` 命令就可以删除调试期间临时加入表中的所有规则和链。 + +第二条规则在系统进行路由选择之前(`prerouting` 钩子)创建了一个基本钩子,并将其优先级设置为负数,以保证它在连接跟踪流程和 NAT 规则匹配之前被执行。 + +然而,唯一最重要的部分是第三条规则的最后一段:`meta nftrace set 1`。这条规则会使系统记录所有匹配这条规则的报文所关联的事件。为了尽可能高效地查看跟踪信息(提高信噪比),考虑对跟踪的事件增加一个速率限制,以保证其数量处于可管理的范围。一个好的选择是限制每秒钟最多一个报文或一分钟最多一个报文。上述案例记录了所有来自终端 `$C` 且去往终端 `$S` 的端口 `$P` 的所有 SYN 报文和 SYN/ACK 报文。限制速率的配置语句可以防范事件过多导致的洪泛风险。事实上,大多数情况下只记录一个报文就足够了。 + +对于 iptables 用户来讲,配置流程是类似的。等价的配置规则类似于: + +``` +# iptables -t raw -I PREROUTING -s $C -d $S -p tcp --tcp-flags SYN SYN  --dport $P  -m limit --limit 1/s -j TRACE +``` + +### 获取跟踪事件 + +原生 nft 工具的用户可以直接运行 `nft` 进入 nft 跟踪模式: + +``` +# nft monitor trace +``` + +这条命令会将收到的报文以及所有匹配该报文的规则打印出来(用 `CTRL-C` 来停止输出): + +``` +trace id f0f627 ip raw prerouting  packet: iif "veth0" ether saddr .. +``` + +我们将在下一章详细分析该结果。如果你用的是 iptables,首先通过 `iptables –version` 命令检查一下已安装的版本。例如: + +``` + +# iptables --version +iptables v1.8.5 (legacy) +``` + +`(legacy)` 意味着被跟踪的事件会被记录到内核的环形缓冲区中。你可以用 `dmesg` 或 `journalctl` 命令来查看这些事件。这些调试输出缺少一些信息,但和新工具提供的输出从概念上来讲很类似。你将需要首先查看规则被记录下来的行号,并与活跃的 iptables 规则集合手动关联。如果输出显示 `(nf_tables)`,你可以使用 `xtables-monitor` 工具: + +``` +# xtables-monitor --trace +``` + +如果上述命令仅显示版本号,你仍然需要查看 `dmesg`/`journalctl` 的输出。`xtables-monitor` 工具和 `nft` 监控跟踪工具使用相同的内核接口。它们之间唯一的不同点就是,`xtables-monitor` 工具会用 `iptables` 的语法打印事件,且如果你同时使用了 `iptables-nft` 和 `nft`,它将不能打印那些使用了 maps/sets 或其他只有 nftables 才支持的功能的规则。 + +### 示例 + +我们假设需要调试一个到虚拟机/容器的端口不通的问题。`ssh -p 1222 10.1.2.3` 命令应该可以远程连接那台服务器上的某个容器,但连接请求超时了。 + +你拥有运行那台容器的主机的登录权限。现在登录该机器并增加一条跟踪规则。可通过前述案例查看如何增加一个临时的调试规则表。跟踪规则类似于这样: + +``` +nft "insert rule inet trace_debug trace_pre ip daddr 10.1.2.3 tcp dport 1222 tcp flags syn limit rate 6/minute meta nftrace set 1" +``` + +在添加完上述规则后,运行 `nft monitor trace`,在跟踪模式下启动 nft,然后重试刚才失败的 `ssh` 命令。如果规则集较大,会出现大量的输出。不用担心这些输出,下一节我们会做逐行分析。 + +``` +trace id 9c01f8 inet trace_debug trace_pre packet: iif "enp0" ether saddr .. ip saddr 10.2.1.2 ip daddr 10.1.2.3 ip protocol tcp tcp dport 1222 tcp flags == syn +trace id 9c01f8 inet trace_debug trace_pre rule ip daddr 10.2.1.2 tcp dport 1222 tcp flags syn limit rate 6/minute meta nftrace set 1 (verdict continue) +trace id 9c01f8 inet trace_debug trace_pre verdict continue +trace id 9c01f8 inet trace_debug trace_pre policy accept +trace id 9c01f8 inet nat prerouting packet: iif "enp0" ether saddr .. ip saddr 10.2.1.2 ip daddr 10.1.2.3 ip protocol tcp  tcp dport 1222 tcp flags == syn +trace id 9c01f8 inet nat prerouting rule ip daddr 10.1.2.3  tcp dport 1222 dnat ip to 192.168.70.10:22 (verdict accept) +trace id 9c01f8 inet filter forward packet: iif "enp0" oif "veth21" ether saddr .. ip daddr 192.168.70.10 .. tcp dport 22 tcp flags == syn tcp window 29200 +trace id 9c01f8 inet filter forward rule ct status dnat jump allowed_dnats (verdict jump allowed_dnats) +trace id 9c01f8 inet filter allowed_dnats rule drop (verdict drop) +trace id 20a4ef inet trace_debug trace_pre packet: iif "enp0" ether saddr .. ip saddr 10.2.1.2 ip daddr 10.1.2.3 ip protocol tcp tcp dport 1222 tcp flags == syn +``` + +### 对跟踪结果作逐行分析 + +输出结果的第一行是触发后续输出的报文编号。这一行的语法与 nft 规则语法相同,同时还包括了接收报文的首部字段信息。你也可以在这一行找到接收报文的接口名称(此处为 `enp0`)、报文的源和目的 MAC 地址、报文的源 IP 地址(可能很重要 - 报告问题的人可能选择了一个错误的或非预期的主机),以及 TCP 的源和目的端口。同时你也可以在这一行的开头看到一个“跟踪编号”。该编号标识了匹配跟踪规则的特定报文。第二行包括了该报文匹配的第一条跟踪规则: + +``` +trace id 9c01f8 inet trace_debug trace_pre rule ip daddr 10.2.1.2 tcp dport 1222 tcp flags syn limit rate 6/minute meta nftrace set 1 (verdict continue) +``` + +这就是刚添加的跟踪规则。这里显示的第一条规则总是激活报文跟踪的规则。如果在这之前还有其他规则,它们将不会在这里显示。如果没有任何跟踪输出结果,说明没有抵达这条跟踪规则,或者没有匹配成功。下面的两行表明没有后续的匹配规则,且 `trace_pre` 钩子允许报文继续传输(判定为接受)。 + +下一条匹配规则是: + +``` +trace id 9c01f8 inet nat prerouting rule ip daddr 10.1.2.3  tcp dport 1222 dnat ip to 192.168.70.10:22 (verdict accept) +``` + +这条 DNAT 规则设置了一个到其他地址和端口的映射。规则中的参数 `192.168.70.10` 是需要收包的虚拟机的地址,目前为止没有问题。如果它不是正确的虚拟机地址,说明地址输入错误,或者匹配了错误的 NAT 规则。 + +### IP 转发 + +通过下面的输出我们可以看到,IP 路由引擎告诉 IP 协议栈,该报文需要被转发到另一个主机: + +``` +trace id 9c01f8 inet filter forward packet: iif "enp0" oif "veth21" ether saddr .. ip daddr 192.168.70.10 .. tcp dport 22 tcp flags == syn tcp window 29200 +``` + +这是接收到的报文的另一种呈现形式,但和之前相比有一些有趣的不同。现在的结果有了一个输出接口集合。这在之前不存在的,因为之前的规则是在路由决策之前(`prerouting` 钩子)。跟踪编号和之前一样,因此仍然是相同的报文,但目标地址和端口已经被修改。假设现在还有匹配 `tcp dport 1222` 的规则,它们将不会对现阶段的报文产生任何影响了。 + +如果该行不包含输出接口(`oif`),说明路由决策将报文路由到了本机。对路由过程的调试属于另外一个主题,本文不再涉及。 + +``` +trace id 9c01f8 inet filter forward rule ct status dnat jump allowed_dnats (verdict jump allowed_dnats) +``` + +这条输出表明,报文匹配到了一个跳转到 `allowed_dnats` 链的规则。下一行则说明了连接失败的根本原因: + +``` +trace id 9c01f8 inet filter allowed_dnats rule drop (verdict drop) +``` + +这条规则无条件地将报文丢弃,因此后续没有关于该报文的日志输出。下一行则是另一个报文的输出结果了: + +``` +trace id 20a4ef inet trace_debug trace_pre packet: iif "enp0" ether saddr .. ip saddr 10.2.1.2 ip daddr 10.1.2.3 ip protocol tcp tcp dport 1222 tcp flags == syn +``` + +跟踪编号已经和之前不一样,然后报文的内容却和之前是一样的。这是一个重传尝试:第一个报文被丢弃了,因此 TCP 尝试了重传。可以忽略掉剩余的输出结果了,因为它并没有提供新的信息。现在是时候检查那条链了。 + +### 规则集合分析 + +上一节我们发现报文在 inet filter 表中的一个名叫 `allowed_dnats` 的链中被丢弃。现在我们来查看它: + +``` +# nft list chain inet filter allowed_dnats +table inet filter { + chain allowed_dnats { +  meta nfproto ipv4 ip daddr . tcp dport @allow_in accept +  drop +   } +} +``` + +接受 `@allow_in` 集的数据包的规则没有显示在跟踪日志中。我们通过列出元素的方式,再次检查上述报文的目标地址是否在 `@allow_in` 集中: + +``` +# nft "get element inet filter allow_in { 192.168.70.10 . 22 }" +Error: Could not process rule: No such file or directory +``` + +不出所料,地址-服务对并没有出现在集合中。我们将其添加到集合中。 + +``` +# nft "add element inet filter allow_in { 192.168.70.10 . 22 }" +``` + +现在运行查询命令,它将返回新添加的元素。 + +``` +# nft "get element inet filter allow_in { 192.168.70.10 . 22 }" +table inet filter { + set allow_in { + type ipv4_addr . inet_service + elements = { 192.168.70.10 . 22 } + } +} +``` + +`ssh` 命令现在应该可以工作,且跟踪结果可以反映出该变化: + +``` +trace id 497abf58 inet filter forward rule ct status dnat jump allowed_dnats (verdict jump allowed_dnats) + +trace id 497abf58 inet filter allowed_dnats rule meta nfproto ipv4 ip daddr . tcp dport @allow_in accept (verdict accept) + +trace id 497abf58 ip postrouting packet: iif "enp0" oif "veth21" ether .. trace id 497abf58 ip postrouting policy accept +``` + +这表明报文通过了转发路径中的最后一个钩子 - `postrouting`。 + +如果现在仍然无法连接,问题可能处在报文流程的后续阶段,有可能并不在 nftables 的规则集合范围之内。 + +### 总结 + +本文介绍了如何通过 nftables 的跟踪机制检查丢包或其他类型的连接问题。本系列的下一篇文章将展示如何检查连接跟踪系统和可能与连接跟踪流相关的 NAT 信息。 + +-------------------------------------------------------------------------------- + +via: https://fedoramagazine.org/network-address-translation-part-1-packet-tracing/ + +作者:[Florian Westphal][a] +选题:[lujun9972][b] +译者:[cooljelly](https://github.com/cooljelly) +校对:[wxy](https://github.com/wxy) + +本文由 [LCTT](https://github.com/LCTT/TranslateProject) 原创编译,[Linux中国](https://linux.cn/) 荣誉推出 + +[a]: https://fedoramagazine.org/author/strlen/ +[b]: https://github.com/lujun9972 +[1]: https://fedoramagazine.org/wp-content/uploads/2020/12/network-address-translation-part-1-816x346.png diff --git a/published/202105/20210114 Cross-compiling made easy with Golang.md b/published/202105/20210114 Cross-compiling made easy with Golang.md new file mode 100644 index 0000000000..72a662d890 --- /dev/null +++ b/published/202105/20210114 Cross-compiling made easy with Golang.md @@ -0,0 +1,217 @@ +[#]: collector: "lujun9972" +[#]: translator: "MjSeven" +[#]: reviewer: "wxy" +[#]: publisher: "wxy" +[#]: url: "https://linux.cn/article-13385-1.html" +[#]: subject: "Cross-compiling made easy with Golang" +[#]: via: "https://opensource.com/article/21/1/go-cross-compiling" +[#]: author: "Gaurav Kamathe https://opensource.com/users/gkamathe" + +使用 Golang 的交叉编译 +====== + +> 走出舒适区,我了解了 Go 的交叉编译功能。 + +![](https://img.linux.net.cn/data/attachment/album/202105/13/092632nrg2z17i8vea4cf8.jpg) + +在 Linux 上测试软件时,我使用各种架构的服务器,例如 Intel、AMD、Arm 等。当我 [分配了一台满足我的测试需求的 Linux 机器][2],我仍然需要执行许多步骤: + + 1. 下载并安装必备软件 + 2. 验证构建服务器上是否有新的测试软件包 + 3. 获取并设置依赖软件包所需的 yum 仓库 + 4. 下载并安装新的测试软件包(基于步骤 2) + 5. 获取并设置必需的 SSL 证书 + 6. 设置测试环境,获取所需的 Git 仓库,更改配置,重新启动守护进程等 + 7. 做其他需要做的事情 + +### 用脚本自动化 + +这些步骤非常常规,以至于有必要对其进行自动化并将脚本保存到中央位置(例如文件服务器),在需要时可以在此处下载脚本。为此,我编写了 100-120 行的 Bash shell 脚本,它为我完成了所有配置(包括错误检查)。这个脚本通过以下方式简化了我的工作流程: + + 1. 配置新的 Linux 系统(支持测试的架构) + 2. 登录系统并从中央位置下载自动化 shell 脚本 + 3. 运行它来配置系统 + 4. 开始测试 + +### 学习 Go 语言 + +我想学习 [Go 语言][3] 有一段时间了,将我心爱的 Shell 脚本转换为 Go 程序似乎是一个很好的项目,可以帮助我入门。它的语法看起来很简单,在尝试了一些测试程序后,我开始着手提高自己的知识并熟悉 Go 标准库。 + +我花了一个星期的时间在笔记本电脑上编写 Go 程序。我经常在我的 x86 服务器上测试程序,清除错误并使程序健壮起来,一切都很顺利。 + +直到完全转换到 Go 程序前,我继续依赖自己的 shell 脚本。然后,我将二进制文件推送到中央文件服务器上,以便每次配置新服务器时,我要做的就是获取二进制文件,将可执行标志打开,然后运行二进制文件。我对早期的结果很满意: + +``` +$ wget http://file.example.com//bins/prepnode +$ chmod +x ./prepnode +$ ./prepnode +``` + +### 然后,出现了一个问题 + +第二周,我从资源池中分配了一台新的服务器,像往常一样,我下载了二进制文件,设置了可执行标志,然后运行二进制文件。但这次它出错了,是一个奇怪的错误: + +``` +$ ./prepnode +bash: ./prepnode: cannot execute binary file: Exec format error +$ +``` + +起初,我以为可能没有成功设置可执行标志。但是,它已按预期设置: + +``` +$ ls -l prepnode +-rwxr-xr-x. 1 root root 2640529 Dec 16 05:43 prepnode +``` + +发生了什么事?我没有对源代码进行任何更改,编译没有引发任何错误或警告,而且上次运行时效果很好,因此我仔细查看了错误消息 `format error`。 + +我检查了二进制文件的格式,一切看起来都没问题: + +``` +$ file prepnode +prepnode: ELF 64-bit LSB executable, x86-64, version 1 (SYSV), statically linked, not stripped +``` + +我迅速运行了以下命令,识别所配置的测试服务器的架构以及二进制试图运行的平台。它是 Arm64 架构,但是我编译的二进制文件(在我的 x86 笔记本电脑上)生成的是 x86-64 格式的二进制文件: + +``` +$ uname -m +aarch64 +``` + +### 脚本编写人员的编译第一课 + +在那之前,我从未考虑过这种情况(尽管我知道这一点)。我主要研究脚本语言(通常是 Python)以及 Shell 脚本。在任何架构的大多数 Linux 服务器上都可以使用 Bash Shell 和 Python 解释器。总之,之前一切都很顺利。 + +但是,现在我正在处理 Go 这种编译语言,它生成可执行的二进制文件。编译后的二进制文件由特定架构的 [指令码][4] 或汇编指令组成,这就是为什么我收到格式错误的原因。由于 Arm64 CPU(运行二进制文件的地方)无法解释二进制文件的 x86-64 指令,因此它抛出错误。以前,shell 和 Python 解释器为我处理了底层指令码或特定架构的指令。 + +### Go 的交叉编译 + +我检查了 Golang 的文档,发现要生成 Arm64 二进制文件,我要做的就是在运行 `go build` 命令编译 Go 程序之前设置两个环境变量。 + +`GOOS` 指的是操作系统,例如 Linux、Windows、BSD 等,而 `GOARCH` 指的是要在哪种架构上构建程序。 + +``` +$ env GOOS=linux GOARCH=arm64 go build -o prepnode_arm64 +``` + +构建程序后,我重新运行 `file` 命令,这一次它显示的是 ARM AArch64,而不是之前显示的 x86。因此,我在我的笔记本上能为不同的架构构建二进制文件。 + +``` +$ file prepnode_arm64 +prepnode_arm64: ELF 64-bit LSB executable, ARM aarch64, version 1 (SYSV), statically linked, not stripped +``` + +我将二进制文件从笔记本电脑复制到 ARM 服务器上。现在运行二进制文件(将可执行标志打开)不会产生任何错误: + +``` +$ ./prepnode_arm64  -h +Usage of ./prepnode_arm64: +  -c    Clean existing installation +  -n    Do not start test run (default true) +  -s    Use stage environment, default is qa +  -v    Enable verbose output +``` + +### 其他架构呢? + +x86 和 Arm 是我测试软件所支持的 5 种架构中的两种,我担心 Go 可能不会支持其它架构,但事实并非如此。你可以查看 Go 支持的架构: + +``` +$ go tool dist list +``` + +Go 支持多种平台和操作系统,包括: + + * AIX + * Android + * Darwin + * Dragonfly + * FreeBSD + * Illumos + * JavaScript + * Linux + * NetBSD + * OpenBSD + * Plan 9 + * Solaris + * Windows + +要查找其支持的特定 Linux 架构,运行: + +``` +$ go tool dist list | grep linux +``` + +如下面的输出所示,Go 支持我使用的所有体系结构。尽管 x86_64 不在列表中,但 AMD64 兼容 x86-64,所以你可以生成 AMD64 二进制文件,它可以在 x86 架构上正常运行: + +``` +$ go tool dist list | grep linux +linux/386 +linux/amd64 +linux/arm +linux/arm64 +linux/mips +linux/mips64 +linux/mips64le +linux/mipsle +linux/ppc64 +linux/ppc64le +linux/riscv64 +linux/s390x +``` + +### 处理所有架构 + +为我测试的所有体系结构生成二进制文件,就像从我的 x86 笔记本电脑编写一个微小的 shell 脚本一样简单: + +``` +#!/usr/bin/bash +archs=(amd64 arm64 ppc64le ppc64 s390x) + +for arch in ${archs[@]} +do + env GOOS=linux GOARCH=${arch} go build -o prepnode_${arch} +done + +``` + +``` +$ file prepnode_* +prepnode_amd64: ELF 64-bit LSB executable, x86-64, version 1 (SYSV), statically linked, Go BuildID=y03MzCXoZERH-0EwAAYI/p909FDnk7xEUo2LdHIyo/V2ABa7X_rLkPNHaFqUQ6/5p_q8MZiR2WYkA5CzJiF, not stripped +prepnode_arm64: ELF 64-bit LSB executable, ARM aarch64, version 1 (SYSV), statically linked, Go BuildID=q-H-CCtLv__jVOcdcOpA/CywRwDz9LN2Wk_fWeJHt/K4-3P5tU2mzlWJa0noGN/SEev9TJFyvHdKZnPaZgb, not stripped +prepnode_ppc64: ELF 64-bit MSB executable, 64-bit PowerPC or cisco 7500, version 1 (SYSV), statically linked, Go BuildID=DMWfc1QwOGIq2hxEzL_u/UE-9CIvkIMeNC_ocW4ry/r-7NcMATXatoXJQz3yUO/xzfiDIBuUxbuiyaw5Goq, not stripped +prepnode_ppc64le: ELF 64-bit LSB executable, 64-bit PowerPC or cisco 7500, version 1 (SYSV), statically linked, Go BuildID=C6qCjxwO9s63FJKDrv3f/xCJa4E6LPVpEZqmbF6B4/Mu6T_OR-dx-vLavn1Gyq/AWR1pK1cLz9YzLSFt5eU, not stripped +prepnode_s390x: ELF 64-bit MSB executable, IBM S/390, version 1 (SYSV), statically linked, Go BuildID=faC_HDe1_iVq2XhpPD3d/7TIv0rulE4RZybgJVmPz/o_SZW_0iS0EkJJZHANxx/zuZgo79Je7zAs3v6Lxuz, not stripped +``` + +现在,每当配置一台新机器时,我就运行以下 `wget` 命令下载特定体系结构的二进制文件,将可执行标志打开,然后运行: + +``` +$ wget http://file.domain.com//bins/prepnode_ +$ chmod +x ./prepnode_ +$ ./prepnode_ +``` + +### 为什么? + +你可能想知道,为什么我没有坚持使用 shell 脚本或将程序移植到 Python 而不是编译语言上来避免这些麻烦。所以有舍有得,那样的话我不会了解 Go 的交叉编译功能,以及程序在 CPU 上执行时的底层工作原理。在计算机中,总要考虑取舍,但绝不要让它们阻碍你的学习。 + +-------------------------------------------------------------------------------- + +via: https://opensource.com/article/21/1/go-cross-compiling + +作者:[Gaurav Kamathe][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/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://opensource.com/article/20/12/linux-server +[3]: https://golang.org/ +[4]: https://en.wikipedia.org/wiki/Opcode \ No newline at end of file diff --git a/published/202105/20210204 A guide to understanding Linux software libraries in C.md b/published/202105/20210204 A guide to understanding Linux software libraries in C.md new file mode 100644 index 0000000000..66d2e89b71 --- /dev/null +++ b/published/202105/20210204 A guide to understanding Linux software libraries in C.md @@ -0,0 +1,481 @@ +[#]: collector: (lujun9972) +[#]: translator: (mengxinayan) +[#]: reviewer: (wxy) +[#]: publisher: (wxy) +[#]: url: (https://linux.cn/article-13413-1.html) +[#]: subject: (A guide to understanding Linux software libraries in C) +[#]: via: (https://opensource.com/article/21/2/linux-software-libraries) +[#]: author: (Marty Kalin https://opensource.com/users/mkalindepauledu) + +用 C 语言理解 Linux 软件库 +====== + +> 软件库是重复使用代码的一种简单而合理的方式。 + +![](https://img.linux.net.cn/data/attachment/album/202105/22/165307u0n970uivji7kiim.jpg) + +软件库是一种是一直以来长期存在的、简单合理的复用代码的方式。这篇文章解释了如何从头开始构建库并使得其可用。尽管这两个示例库都以 Linux 为例,但创建、发布和使用这些库的步骤也可以应用于其它类 Unix 系统。 + +这些示例库使用 C 语言编写,非常适合该任务。Linux 内核大部分由 C 语言和少量汇编语言编写(Windows 和 Linux 的表亲如 macOS 也是如此)。用于输入/输出、网络、字符串处理、数学、安全、数据编码等的标准系统库等主要由 C 语言编写。所以使用 C 语言编写库就是使用 Linux 的原生语言来编写。除此之外,C 语言的性能也在一众高级语言中鹤立鸡群。 + +还有两个来访问这些库的示例客户程序client(一个使用 C,另一个使用 Python)。毫无疑问可以使用 C 语言客户程序来访问 C 语言编写的库,但是 Python 客户程序示例说明了一个由 C 语言编写的库也可以服务于其他编程语言。 + +### 静态库和动态库对比 + +Linux 系统存在两种类型库: + + * **静态库(也被称为归档库)**:在编译过程中的链接阶段,静态库会被编译进程序(例如 C 或 Rust)中。每个客户程序都有属于自己的一份库的拷贝。静态库有一个显而易见的缺点 —— 当库需要进行一定改动时(例如修复一个 bug),静态库必须重新链接一次。接下来要介绍的动态库避免了这一缺点。 + * **动态库(也被称为共享库)**:动态库首先会在程序编译中的链接阶段被标记,但是客户程序和库代码在运行之前仍然没有联系,且库代码不会进入到客户程序中。系统的动态加载器会把一个共享库和正在运行的客户程序进行连接,无论该客户程序是由静态编译语言(如 C)编写,还是由动态解释语言(如 Python)编写。因此,动态库不需要麻烦客户程序便可以进行更新。最后,多个客户程序可以共享同一个动态库的单一副本。 + +通常来说,动态库优于静态库,尽管其复杂性较高而性能较低。下面是两种类型的库如何创建和发布: + + 1. 库的源代码会被编译成一个或多个目标模块,目标模块是二进制文件,可以被包含在库中并且链接到可执行的二进制中。 + 2. 目标模块会会被打包成一个文件。对于静态库,标准的文件拓展名是 `.a` 意为“归档archive”;对于动态库,标准的文件拓展名是 `.so` 意为“共享目标shared object”。对于这两个相同功能的示例库,分别发布为 `libprimes.a` (静态库)和 `libshprimes.so` (动态库)。两种库的文件名都使用前缀 `lib` 进行标识。 + 3. 库文件被复制到标准目录下,使得客户程序可以轻松地访问到库。无论是静态库还是动态库,典型的位置是 `/usr/lib` 或者 `/usr/local/lib`,当然其他位置也是可以的。 + +构建和发布每种库的具体步骤会在下面详细介绍。首先我将介绍两种库里涉及到的 C 函数。 + +### 示例库函数 + +这两个示例库都是由五个相同的 C 函数构建而成的,其中四个函数可供客户程序使用。第五个函数是其他四个函数的一个工具函数,它显示了 C 语言怎么隐藏信息。每个函数的源代码都很短,可以将这些函数放在单个源文件中,尽管也可以放在多个源文件中(如四个公布的函数都有一个文件)。 + +这些库函数是基本的处理函数,以多种方式来处理质数。所有的函数接收无符号(即非负)整数值作为参数: + +- `is_prime` 函数测试其单个参数是否为质数。 +- `are_coprimes` 函数检查了其两个参数的最大公约数greatest common divisor(gcd)是否为 1,即是否为互质数。 +- `prime_factors`:函数列出其参数的质因数。 +- `glodbach`:函数接收一个大于等于 4 的偶数,列出其可以分解为两个质数的和。它也许存在多个符合条件的数对。该函数是以 18 世纪数学家 [克里斯蒂安·哥德巴赫][2]Christian Goldbach 命名的,他的猜想是任意一个大于 2 的偶数可以分解为两个质数之和,这依旧是数论里最古老的未被解决的问题。 + +工具函数 `gcd` 留在已部署的库文件中,但是在没有包含这个函数的文件无法访问此函数。因此,一个使用库的客户程序无法调用 `gcd` 函数。仔细观察 C 函数可以明白这一点。 + +### 更多关于 C 函数的内容 + +每个在 C 语言中的函数都有一个存储类,它决定了函数的范围。对于函数,有两种选择。 + +- 函数默认的存储类是 `extern`,它给了函数一个全局域。一个客户程序可以调用在示例库中用 `extern` 修饰的任意函数。下面是一个带有显式 `extern` 声明的 `are_coprimes` 函数定义: + + ``` + extern unsigned are_coprimes(unsigned n1, unsigned n2) { + ... + } + ``` +- 存储类 `static` 将一个函数的的范围限制到函数被定义的文件中。在示例库中,工具函数 `gcd` 是静态的(`static`): + + ``` + static unsigned gcd(unsigned n1, unsigned n2) { + ... + } + ``` + +只有在 `primes.c` 文件中的函数可以调用 `gcd`,而只有 `are_coprimes` 函数会调用它。当静态库和动态库被构建和发布后,其他的程序可以调用外部的(`extern`)函数,如 `are_coprimes` ,但是不可以调用静态(`static`)函数 `gcd`。静态(`static`)存储类通过将函数范围限制在其他库函数内,进而实现了对库的客户程序隐藏 `gcd` 函数。 + +在 `primes.c` 文件中除了 `gcd` 函数外,其他函数并没有指明存储类,默认将会设置为外部的(`extern`)。然而,在库中显式注明 `extern` 更加常见。 + +C 语言区分了函数的定义definition声明declaration,这对库来说很重要。接下来让我们开始了解定义。C 语言仅允许命名函数不允许匿名函数,并且每个函数需要定义以下内容: + +- 一个唯一的名字。一个程序不允许存在两个同名的函数。 +- 一个可以为空的参数列表。参数需要指明类型。 +- 一个返回值类型(例如:`int` 代表 32 位有符号整数),当没有返回值时设置为空类型(`void`)。 +- 用一对花括号包围起来的函数主体部分。在一个特制的示例中,函数主体部分可以为空。 + +程序中的每个函数必须要被定义一次。 + +下面是库函数 `are_coprimes` 的完整定义: + +``` +extern unsigned are_coprimes(unsigned n1, unsigned n2) { /* 定义 */ + return 1 == gcd(n1, n2); /* 最大公约数是否为 1? */ +} +``` + +函数返回一个布尔值(`0` 代表假,`1` 代表真),取决于两个整数参数值的最大公约数是否为 1。工具函数 `gcd` 计算两个整数参数 `n1` 和 `n2` 的最大公约数。 + +函数声明不同于定义,其不需要主体部分: + +``` +extern unsigned are_coprimes(unsigned n1, unsigned n2); /* 声明 */ +``` + +声明在参数列表后用一个分号代表结束,它没有被花括号包围起来的主体部分。程序中的函数可以被多次声明。 + +为什么需要声明?在 C 语言中,一个被调用的函数必须对其调用者可见。有多种方式可以提供这样的可见性,具体依赖于编译器如何实现。一个必然可行的方式就是当它们二者位于同一个文件中时,将被调用的函数定义在在它的调用者之前。 + +``` +void f() {...} /* f 定义在其被调用前 */ +void g() { f(); } /* ok */ +``` + +当函数 `f` 被在调用前声明,此时函数 `f` 的定义可以移动到函数 `g` 的下方。 + +``` +void f(); /* 声明使得函数 f 对调用者可见 */ +void g() { f(); } /* ok */ +void f() {...} /* 相较于前一种方式,此方式显得更简洁 */ +``` + +但是当如果一个被调用的函数和调用它的函数不在同一个文件中时呢?因为前文提到一个函数在一个程序中需要被定义一次,那么如何使得让一个文件中被定义的函数在另一个文件中可见? + +这个问题会影响库,无论是静态库还是动态库。例如在这两个质数库中函数被定义在源文件 `primes.c` 中,每个库中都有该函数的二进制副本,但是这些定义的函数必须要对使用库的 C 程序可见,该 C 程序有其自身的源文件。 + +函数声明可以帮助提供跨文件的可见性。对于上述的“质数”例子,它有一个名为 `primes.h` 的头文件,其声明了四个函数使得它们对使用库的 C 程序可见。 + +``` +/** 头文件 primes.h:函数声明 **/ +extern unsigned is_prime(unsigned); +extern void prime_factors(unsigned); +extern unsigned are_coprimes(unsigned, unsigned); +extern void goldbach(unsigned); +``` + +这些声明通过为每个函数指定其调用语法来作为接口。 + +为了客户程序的便利性,头文件 `primes.h` 应该存储在 C 编译器查找路径下的目录中。典型的位置有 `/usr/include` 和 `/usr/local/include`。一个 C 语言客户程序应使用 `#include` 包含这个头文件,并尽可能将这条语句其程序源代码的首部(头文件将会被导入另一个源文件的“头”部)。C 语言头文件可以被导入其他语言(如 Rust 语言)中的 `bindgen`,使其它语言的客户程序可以访问 C 语言的库。 + +总之,一个库函数只可以被定义一次,但可以在任何需要它的地方进行声明,任一使用 C 语言库的程序都需要该声明。头文件可以包含函数声明,但不能包含函数定义。如果头文件包含了函数定义,那么该文件可能会在一个 C 语言程序中被多次包含,从而破坏了一个函数在 C 语言程序中必须被精确定义一次的规则。 + +### 库的源代码 + +下面是两个库的源代码。这部分代码、头文件、以及两个示例客户程序都可以在 [我的网页][3] 上找到。 + +``` +#include +#include + +extern unsigned is_prime(unsigned n) { + if (n <= 3) return n > 1; /* 2 和 3 是质数 */ + if (0 == (n % 2) || 0 == (n % 3)) return 0; /* 2 和 3 的倍数不会是质数 */ + + /* 检查 n 是否是其他 < n 的值的倍数 */ + unsigned i; + for (i = 5; (i * i) <= n; i += 6) + if (0 == (n % i) || 0 == (n % (i + 2))) return 0; /* 不是质数 */ + + return 1; /* 一个不是 2 和 3 的质数 */ +} + +extern void prime_factors(unsigned n) { + /* 在数字 n 的质因数分解中列出所有 2 */ + while (0 == (n % 2)) { + printf("%i ", 2); + n /= 2; + } + + /* 数字 2 已经处理完成,下面处理奇数 */ + unsigned i; + for (i = 3; i <= sqrt(n); i += 2) { + while (0 == (n % i)) { + printf("%i ", i); + n /= i; + } + } + + /* 还有其他质因数?*/ + if (n > 2) printf("%i", n); +} + +/* 工具函数:计算最大公约数 */ +static unsigned gcd(unsigned n1, unsigned n2) { + while (n1 != 0) { + unsigned n3 = n1; + n1 = n2 % n1; + n2 = n3; + } + return n2; +} + +extern unsigned are_coprimes(unsigned n1, unsigned n2) { + return 1 == gcd(n1, n2); +} + +extern void goldbach(unsigned n) { + /* 输入错误 */ + if ((n <= 2) || ((n & 0x01) > 0)) { + printf("Number must be > 2 and even: %i is not.\n", n); + return; + } + + /* 两个简单的例子:4 和 6 */ + if ((4 == n) || (6 == n)) { + printf("%i = %i + %i\n", n, n / 2, n / 2); + return; + } + + /* 当 n > 8 时,存在多种可能性 */ + unsigned i; + for (i = 3; i < (n / 2); i++) { + if (is_prime(i) && is_prime(n - i)) { + printf("%i = %i + %i\n", n, i, n - i); + /* 如果只需要一对,那么用 break 语句替换这句 */ + } + } +} +``` + +*库函数* + +这些函数可以被库利用。两个库可以从相同的源代码中获得,同时头文件 `primes.h` 是两个库的 C 语言接口。 + +### 构建库 + +静态库和动态库在构建和发布的步骤上有一些细节的不同。静态库需要三个步骤,而动态库需要增加两个步骤即一共五个步骤。额外的步骤表明了动态库的动态方法具有更多的灵活性。让我们先从静态库开始。 + +库的源文件 `primes.c` 被编译成一个目标模块。下面是命令,百分号 `%` 代表系统提示符,两个井字符 `#` 是我的注释。 + +``` +% gcc -c primes.c ## 步骤1(静态) +``` + +这一步生成目标模块是二进制文件 `primes.o`。`-c` 标志意味着只编译。 + +下一步是使用 Linux 的 `ar` 命令将目标对象归档。 + +``` +% ar -cvq libprimes.a primes.o ## 步骤2(静态) +``` + +`-cvq` 三个标识分别是“创建”、“详细的”、“快速添加”(以防新文件没有添加到归档中)的简称。回忆一下,前文提到过前缀 `lib` 是必须的,而库名是任意的。当然,库的文件名必须是唯一的,以避免冲突。 + +归档已经准备好要被发布: + +``` +% sudo cp libprimes.a /usr/local/lib ## 步骤3(静态) +``` + +现在静态库对接下来的客户程序是可见的,示例在后面。(包含 `sudo` 可以确保有访问权限将文件复制进 `/usr/local/lib` 目录中) + +动态库还需要一个或多个对象模块进行打包: + +``` +% gcc primes.c -c -fpic ## 步骤1(动态) +``` + +增加的选项 `-fpic` 指示编译器生成与位置无关的代码,这意味着不需要将该二进制模块加载到一个固定的内存位置。在一个拥有多个动态库的系统中这种灵活性是至关重要的。生成的对象模块会略大于静态库生成的对象模块。 + +下面是从对象模块创建单个库文件的命令: + +``` +% gcc -shared -Wl,-soname,libshprimes.so -o libshprimes.so.1 primes.o ## 步骤2(动态) +``` + +选项 `-shared` 表明了该库是一个共享的(动态的)而不是静态的。`-Wl` 选项引入了一系列编译器选项,第一个便是设置动态库的 `-soname`,这是必须设置的。`soname` 首先指定了库的逻辑名字(`libshprimes.so`),接下来的 `-o` 选项指明了库的物理文件名字(`libshprimes.so.1`)。这样做的目的是为了保持逻辑名不变的同时允许物理名随着新版本而发生变化。在本例中,在物理文件名 `libshprimes.so.1` 中最后的 1 代表是第一个库的版本。尽管逻辑文件名和物理文件名可以是相同的,但是最佳做法是将它们命名为不同的名字。一个客户程序将会通过逻辑名(本例中为 `libshprimes.so`)来访问库,稍后我会进一步解释。 + +接下来的一步是通过复制共享库到合适的目录下使得客户程序容易访问,例如 `/usr/local/lib` 目录: + +``` +% sudo cp libshprimes.so.1 /usr/local/lib ## 步骤3(动态) +``` + +现在在共享库的逻辑名(`libshprimes.so`)和它的物理文件名(`/usr/local/lib/libshprimes.so.1`)之间设置一个符号链接。最简单的方式是将 `/usr/local/lib` 作为工作目录,在该目录下输入命令: + +``` +% sudo ln --symbolic libshprimes.so.1 libshprimes.so ## 步骤4(动态) +``` + +逻辑名 `libshprimes.so` 不应该改变,但是符号链接的目标(`libshrimes.so.1`)可以根据需要进行更新,新的库实现可以是修复了 bug,提高性能等。 + +最后一步(一个预防措施)是调用 `ldconfig` 工具来配置系统的动态加载器。这个配置保证了加载器能够找到新发布的库。 + +``` +% sudo ldconfig ## 步骤5(动态) +``` + +到现在,动态库已为包括下面的两个在内的示例客户程序准备就绪了。 + +### 一个使用库的 C 程序 + +这个示例 C 程序是一个测试程序,它的源代码以两条 `#include` 指令开始: + +``` +#include /* 标准输入/输出函数 */ +#include /* 我的库函数 */ +``` + +文件名两边的尖括号表示可以在编译器的搜索路径中找到这些头文件(对于 `primes.h` 文件来说在 `/usr/local/inlcude` 目录下)。如果不包含 `#include`,编译器会抱怨缺少 `is_prime` 和 `prime_factors` 等函数的声明,它们在两个库中都有发布。顺便提一句,测试程序的源代码不需要更改即可测试两个库中的每一个库。 + +相比之下,库的源文件(`primes.c`)使用 `#include` 指令打开以下头文件: + +``` +#include +#include +``` + +`math.h` 头文件是必须的,因为库函数 `prime_factors` 会调用数学函数 `sqrt`,其在标准库 `libm.so` 中。 + +作为参考,这是测试库程序的源代码: + +``` +#include +#include + +int main() { + /* 是质数 */ + printf("\nis_prime\n"); + unsigned i, count = 0, n = 1000; + for (i = 1; i <= n; i++) { + if (is_prime(i)) { + count++; + if (1 == (i % 100)) printf("Sample prime ending in 1: %i\n", i); + } + } + printf("%i primes in range of 1 to a thousand.\n", count); + + /* prime_factors */ + printf("\nprime_factors\n"); + printf("prime factors of 12: "); + prime_factors(12); + printf("\n"); + + printf("prime factors of 13: "); + prime_factors(13); + printf("\n"); + + printf("prime factors of 876,512,779: "); + prime_factors(876512779); + printf("\n"); + + /* 是合数 */ + printf("\nare_coprime\n"); + printf("Are %i and %i coprime? %s\n", + 21, 22, are_coprimes(21, 22) ? "yes" : "no"); + printf("Are %i and %i coprime? %s\n", + 21, 24, are_coprimes(21, 24) ? "yes" : "no"); + + /* 哥德巴赫 */ + printf("\ngoldbach\n"); + goldbach(11); /* error */ + goldbach(4); /* small one */ + goldbach(6); /* another */ + for (i = 100; i <= 150; i += 2) goldbach(i); + + return 0; +} +``` + +*测试程序* + +在编译 `tester.c` 文件到可执行文件时,难处理的部分时链接选项的顺序。回想前文中提到两个示例库都是用 `lib` 作为前缀开始,并且每一个都有一个常规的拓展后缀:`.a` 代表静态库 `libprimes.a`,`.so` 代表动态库 `libshprimes.so`。在链接规范中,前缀 `lib` 和拓展名被忽略了。链接标志以 `-l` (小写 L)开始,并且一条编译命令可能包含多个链接标志。下面是一个完整的测试程序的编译指令,使用动态库作为示例: + +``` +% gcc -o tester tester.c -lshprimes -lm +``` + +第一个链接标志指定了库 `libshprimes.so`,第二个链接标志指定了标准数学库 `libm.so`。 + +链接器是懒惰的,这意味着链接标志的顺序是需要考虑的。例如,调整上述实例中的链接顺序将会产生一个编译时错误: + +``` +% gcc -o tester tester.c -lm -lshprimes ## 危险! +``` + +链接 `libm.so` 库的标志先出现,但是这个库中没有函数被测试程序显式调用;因此,链接器不会链接到 `math.so` 库。调用 `sqrt` 库函数仅发生在 `libshprimes.so` 库中包含的 `prime_factors` 函数。编译测试程序返回的错误是: + +``` +primes.c: undefined reference to 'sqrt' +``` + +因此,链接标志的顺序应该是通知链接器需要 `sqrt` 函数: + +``` +% gcc -o tester tester.c -lshprimes -lm ## 首先链接 -lshprimes +``` + +链接器在 `libshprimes.so` 库中发现了对库函数 `sqrt` 的调用,所以接下来对数学库 `libm.so`做了合适的链接。链接还有一个更复杂的选项,它支持链接的标志顺序。然而在本例中,最简单的方式就是恰当地排列链接标志。 + +下面是运行测试程序的部分输出结果: + +``` +is_prime +Sample prime ending in 1: 101 +Sample prime ending in 1: 401 +... +168 primes in range of 1 to a thousand. + +prime_factors +prime factors of 12: 2 2 3 +prime factors of 13: 13 +prime factors of 876,512,779: 211 4154089 + +are_coprime +Are 21 and 22 coprime? yes +Are 21 and 24 coprime? no + +goldbach +Number must be > 2 and even: 11 is not. +4 = 2 + 2 +6 = 3 + 3 +... +32 = 3 + 29 +32 = 13 + 19 +... +100 = 3 + 97 +100 = 11 + 89 +... +``` + +对于 `goldbach` 函数,即使一个相当小的偶数值(例如 18)也许存在多个一对质数之和的组合(在这种情况下,5+13 和 7+11)。因此这种多个质数对是使得尝试证明哥德巴赫猜想变得复杂的因素之一。 + +### 封装使用库的 Python 程序 + +与 C 不同,Python 不是一个静态编译语言,这意味着 Python 客户示例程序必须访问动态版本而非静态版本的 `primes` 库。为了能这样做,Python 中有众多的支持外部语言接口foreign function interface(FFI)的模块(标准的或第三方的),它们允许用一种语言编写的程序来调用另一种语言编写的函数。Python 中的 `ctypes` 是一个标准的、相对简单的允许 Python 代码调用 C 函数的 FFI。 + +任何 FFI 都面临挑战,因为对接的语言不大可能会具有完全相同的数据类型。例如:`primes` 库使用 C 语言类型 `unsigned int`,而 Python 并不具有这种类型;因此 `ctypes` FFI 将 C 语言中的 `unsigned int` 类型映射为 Python 中的 `int` 类型。在 `primes` 库中发布的四个 `extern` C 函数中,有两个在具有显式 `ctypes` 配置的 Python 中会表现得更好。 + +C 函数 `prime_factors` 和 `goldbach` 返回 `void` 而不是返回一个具体类型,但是 `ctypes` 默认会将 C 语言中的 `void` 替换为 Python 语言中的 `int`。当从 Python 代码中调用时,这两个 C 函数会从栈中返回一个随机整数值(因此,该值无任何意义)。然而,可以对 `ctypes` 进行配置,让这些函数返回 `None` (Python 中为 `null` 类型)。下面是对 `prime_factors` 函数的配置: + +``` +primes.prime_factors.restype = None +``` + +可以用类似的语句处理 `goldbach` 函数。 + +下面的交互示例(在 Python3 中)展示了在 Python 客户程序和 `primes` 库之间的接口是简单明了的。 + +``` +>>> from ctypes import cdll + +>>> primes = cdll.LoadLibrary("libshprimes.so") ## 逻辑名 + +>>> primes.is_prime(13) +1 +>>> primes.is_prime(12) +0 + +>>> primes.are_coprimes(8, 24) +0 +>>> primes.are_coprimes(8, 25) +1 + +>>> primes.prime_factors.restype = None +>>> primes.goldbach.restype = None + +>>> primes.prime_factors(72) +2 2 2 3 3 + +>>> primes.goldbach(32) +32 = 3 + 29 +32 = 13 + 19 +``` + +在 `primes` 库中的函数只使用一个简单数据类型:`unsigned int`。如果这个 C 语言库使用复杂的类型如结构体,如果库函数传递和返回指向结构体的指针,那么比 `ctypes` 更强大的 FFI 更适合作为一个在 Python 语言和 C 语言之间的平滑接口。尽管如此,`ctypes` 示例展示了一个 Python 客户程序可以使用 C 语言编写的库。值得注意的是,用作科学计算的流行的 `Numpy` 库是用 C 语言编写的,然后在高级 Python API 中公开。 + +简单的 `primes` 库和高级的 `Numpy` 库强调了 C 语言仍然是编程语言中的通用语言。几乎每一个语言都可以与 C 语言交互,同时通过 C 语言也可以和任何其他语言交互。Python 很容易和 C 语言交互,作为另外一个例子,当 [Panama 项目](https://openjdk.java.net/projects/panama) 成为 Java Native Interface(JNI)一个替代品后,Java 语言和 C 语言交互也会变的很容易。 + +-------------------------------------------------------------------------------- + +via: https://opensource.com/article/21/2/linux-software-libraries + +作者:[Marty Kalin][a] +选题:[lujun9972][b] +译者:[萌新阿岩](https://github.com/mengxinayan) +校对:[wxy](https://github.com/wxy) + +本文由 [LCTT](https://github.com/LCTT/TranslateProject) 原创编译,[Linux中国](https://linux.cn/) 荣誉推出 + +[a]: https://opensource.com/users/mkalindepauledu +[b]: https://github.com/lujun9972 +[1]: https://opensource.com/sites/default/files/styles/image-full-size/public/lead-images/rh_003499_01_linux31x_cc.png?itok=Pvim4U-B (5 pengiuns floating on iceburg) +[2]: https://en.wikipedia.org/wiki/Christian_Goldbach +[3]: https://condor.depaul.edu/mkalin +[4]: http://www.opengroup.org/onlinepubs/009695399/functions/printf.html +[5]: http://www.opengroup.org/onlinepubs/009695399/functions/sqrt.html +[6]: https://openjdk.java.net/projects/panama diff --git a/published/202105/20210212 Network address translation part 2 - the conntrack tool.md b/published/202105/20210212 Network address translation part 2 - the conntrack tool.md new file mode 100644 index 0000000000..6a779f4a74 --- /dev/null +++ b/published/202105/20210212 Network address translation part 2 - the conntrack tool.md @@ -0,0 +1,133 @@ +[#]: collector: (lujun9972) +[#]: translator: (cooljelly) +[#]: reviewer: (wxy) +[#]: publisher: (wxy) +[#]: url: (https://linux.cn/article-13373-1.html) +[#]: subject: (Network address translation part 2 – the conntrack tool) +[#]: via: (https://fedoramagazine.org/network-address-translation-part-2-the-conntrack-tool/) +[#]: author: (Florian Westphal https://fedoramagazine.org/author/strlen/) + +网络地址转换(NAT)之连接跟踪工具 +====== + +![](https://img.linux.net.cn/data/attachment/album/202105/09/120958wwocez99o2nofw8s.jpg) + +这是有关网络地址转换network address translation(NAT)的系列文章中的第二篇。之前的第一篇文章介绍了 [如何使用 iptables/nftables 的报文跟踪功能][2] 来定位 NAT 相关的连接问题。作为第二部分,本文介绍 `conntrack` 命令,它允许你查看和修改被跟踪的连接。 + +### 引言 + +通过 iptables 或 nftables 配置的 NAT 建立在 netfilters 连接跟踪子系统之上。`conntrack` 命令作为 “conntrack-tools” 软件包的一部分,用于查看和更改连接状态表。 + +### 连接跟踪状态表 + +连接跟踪子系统会跟踪它看到的所有报文流。运行 `sudo conntrack -L` 可查看其内容: + +``` +tcp 6 43184 ESTABLISHED src=192.168.2.5 dst=10.25.39.80 sport=5646 dport=443 src=10.25.39.80 dst=192.168.2.5 sport=443 dport=5646 [ASSURED] mark=0 use=1 +tcp 6 26 SYN_SENT src=192.168.2.5 dst=192.168.2.10 sport=35684 dport=443 [UNREPLIED] src=192.168.2.10 dst=192.168.2.5 sport=443 dport=35684 mark=0 use=1 +udp 17 29 src=192.168.8.1 dst=239.255.255.250 sport=48169 dport=1900 [UNREPLIED] src=239.255.255.250 dst=192.168.8.1 sport=1900 dport=48169 mark=0 use=1 +``` + +上述显示结果中,每行表示一个连接跟踪项。你可能会注意到,每行相同的地址和端口号会出现两次,而且第二次出现的源地址/端口对和目标地址/端口对会与第一次正好相反!这是因为每个连接跟踪项会先后两次被插入连接状态表。第一个四元组(源地址、目标地址、源端口、目标端口)记录的是原始方向的连接信息,即发送者发送报文的方向。而第二个四元组则记录的是连接跟踪子系统期望收到的对端回复报文的连接信息。这解决了两个问题: + + 1. 如果报文匹配到一个 NAT 规则,例如 IP 地址伪装,相应的映射信息会记录在链接跟踪项的回复方向部分,并自动应用于同一条流的所有后续报文。 + 2. 即使一条流经过了地址或端口的转换,也可以成功在连接状态表中查找到回复报文的四元组信息。 + +原始方向的(第一个显示的)四元组信息永远不会改变:它就是发送者发送的连接信息。NAT 操作只会修改回复方向(第二个)四元组,因为这是接受者看到的连接信息。修改第一个四元组没有意义:netfilter 无法控制发起者的连接状态,它只能在收到/转发报文时对其施加影响。当一个报文未映射到现有连接表项时,连接跟踪可以为其新建一个表项。对于 UDP 报文,该操作会自动进行。对于 TCP 报文,连接跟踪可以配置为只有 TCP 报文设置了 [SYN 标志位][3] 才新建表项。默认情况下,连接跟踪会允许从流的中间报文开始创建,这是为了避免对启用连接跟踪之前就存在的流处理出现问题。 + +### 连接跟踪状态表和 NAT + +如上一节所述,回复方向的四元组包含 NAT 信息。你可以通过命令过滤输出经过源地址 NAT 或目标地址 NAT 的连接跟踪项。通过这种方式可以看到一个指定的流经过了哪种类型的 NAT 转换。例如,运行 `sudo conntrack -L -p tcp –src-nat` 可显示经过源 NAT 的连接跟踪项,输出结果类似于以下内容: + +``` +tcp 6 114 TIME_WAIT src=10.0.0.10 dst=10.8.2.12 sport=5536 dport=80 src=10.8.2.12 dst=192.168.1.2 sport=80 dport=5536 [ASSURED] +``` + +这个连接跟踪项表示一条从 10.0.0.10:5536 到 10.8.2.12:80 的连接。与前面示例不同的是,回复方向的四元组不是原始方向四元组的简单翻转:源地址已修改。目标主机(10.8.2.12)将回复数据包发送到 192.168.1.2,而不是 10.0.0.10。每当 10.0.0.10 发送新的报文时,具有此连接跟踪项的路由器会将源地址替换为 192.168.1.2。当 10.8.2.12 发送回复报文时,该路由器将目的地址修改回 10.0.0.10。上述源 NAT 行为源自一条 [NFT 伪装][4] 规则: + +``` +inet nat postrouting meta oifname "veth0" masquerade +``` + +其他类型的 NAT 规则,例如目标地址 DNAT 规则或重定向规则,其连接跟踪项也会以类似的方式显示,回复方向四元组的远端地址或端口与原始方向四元组的远端地址或端口不同。 + +### 连接跟踪扩展 + +连接跟踪的记帐功能和时间戳功能是两个有用的扩展功能。运行 `sudo sysctl net.netfilter.nf_conntrack_acct=1` 可以在运行 `sudo conntrack -L` 时显示每个流经过的字节数和报文数。运行 `sudo sysctl net.netfilter.nf_conntrack_timestamp=1` 为每个连接记录一个开始时间戳,之后每次运行 `sudo conntrack -L` 时都可以显示这个流从开始经过了多少秒。在上述命令中增加 `–output ktimestamp` 选项也可以看到流开始的绝对时间。 + +### 插入和更改连接跟踪项 + +你可以手动为状态表添加连接跟踪项,例如: + +``` +sudo conntrack -I -s 192.168.7.10 -d 10.1.1.1 --protonum 17 --timeout 120 --sport 12345 --dport 80 +``` + +这项命令通常被 conntrackd 用于状态复制,即将主防火墙的连接跟踪项复制到备用防火墙系统。于是当切换发生的时候,备用系统可以接管已经建立的连接且不会造成中断。连接跟踪还可以存储报文的带外元数据,例如连接跟踪标记和连接跟踪标签。可以用更新选项(`-U`)来修改它们: + +``` +sudo conntrack -U -m 42 -p tcp +``` + +这条命令将所有的 TCP 流的连接跟踪标记修改为 42。 + +### 删除连接跟踪项 + +在某些情况下,你可能想从状态表中删除条目。例如,对 NAT 规则的修改不会影响表中已存在流的经过报文。因此对 UDP 长连接(例如像 VXLAN 这样的隧道协议),删除表项可能很有意义,这样新的 NAT 转换规则才能生效。可以通过 `sudo conntrack -D` 命令附带可选的地址和端口列表选项,来删除相应的表项,如下例所示: + +``` +sudo conntrack -D -p udp --src 10.0.12.4 --dst 10.0.0.1 --sport 1234 --dport 53 +``` + +### 连接跟踪错误计数 + +`conntrack` 也可以输出统计数字: + +``` +# sudo conntrack -S +cpu=0 found=0 invalid=130 insert=0 insert_failed=0 drop=0 early_drop=0 error=0 search_restart=10 +cpu=1 found=0 invalid=0 insert=0 insert_failed=0 drop=0 early_drop=0 error=0 search_restart=0 +cpu=2 found=0 invalid=0 insert=0 insert_failed=0 drop=0 early_drop=0 error=0 search_restart=1 +cpu=3 found=0 invalid=0 insert=0 insert_failed=0 drop=0 early_drop=0 error=0 search_restart=0 +``` + +大多数计数器将为 0。`Found` 和 `insert` 数将始终为 0,它们只是为了后向兼容。其他错误计数包括: + + * `invalid`:报文既不匹配已有连接跟踪项,也未创建新连接。 + * `insert_failed`:报文新建了一个连接,但插入状态表时失败。这在 NAT 引擎在伪装时恰好选择了重复的源地址和端口时可能出现。 + * `drop`:报文新建了一个连接,但是没有可用的内存为其分配新的状态条目。 + * `early_drop`:连接跟踪表已满。为了接受新的连接,已有的未看到双向报文的连接被丢弃。 + * `error`:icmp(v6) 收到与已知连接不匹配的 icmp 错误数据包。 + * `search_restart`:查找过程由于另一个 CPU 的插入或删除操作而中断。 + * `clash_resolve`:多个 CPU 试图插入相同的连接跟踪条目。 + +除非经常发生,这些错误条件通常无害。一些错误可以通过针对预期工作负载调整连接跟踪子系统的参数来降低其发生概率,典型的配置包括 `net.netfilter.nf_conntrack_buckets` 和 `net.netfilter.nf_conntrack_max` 参数。可在 [nf_conntrack-sysctl 文档][5] 中查阅相应配置参数的完整列表。 + +当报文状态是 `invalid` 时,请使用 `sudo sysctl net.netfilter.nf_conntrack_log_invalid=255` 来获取更多信息。例如,当连接跟踪遇到一个所有 TCP 标志位均为 0 的报文时,将记录以下内容: + +``` +nf_ct_proto_6: invalid tcp flag combination SRC=10.0.2.1 DST=10.0.96.7 LEN=1040 TOS=0x00 PREC=0x00 TTL=255 ID=0 PROTO=TCP SPT=5723 DPT=443 SEQ=1 ACK=0 +``` + +### 总结 + +本文介绍了如何检查连接跟踪表和存储在跟踪流中的 NAT 信息。本系列的下一部分将延伸讨论连接跟踪工具和连接跟踪事件框架。 + +-------------------------------------------------------------------------------- + +via: https://fedoramagazine.org/network-address-translation-part-2-the-conntrack-tool/ + +作者:[Florian Westphal][a] +选题:[lujun9972][b] +译者:[cooljelly](https://github.com/cooljelly) +校对:[wxy](https://github.com/wxy) + +本文由 [LCTT](https://github.com/LCTT/TranslateProject) 原创编译,[Linux中国](https://linux.cn/) 荣誉推出 + +[a]: https://fedoramagazine.org/author/strlen/ +[b]: https://github.com/lujun9972 +[1]: https://fedoramagazine.org/wp-content/uploads/2021/02/network-address-translation-part-2-816x345.jpg +[2]: https://linux.cn/article-13364-1.html +[3]: https://en.wikipedia.org/wiki/Transmission_Control_Protocol#TCP_segment_structure +[4]: https://wiki.nftables.org/wiki-nftables/index.php/Performing_Network_Address_Translation_(NAT)#Masquerading +[5]: https://git.kernel.org/pub/scm/linux/kernel/git/torvalds/linux.git/tree/Documentation/networking/nf_conntrack-sysctl.rst diff --git a/published/202105/20210218 Not an engineer- Find out where you belong.md b/published/202105/20210218 Not an engineer- Find out where you belong.md new file mode 100644 index 0000000000..a043bab7fc --- /dev/null +++ b/published/202105/20210218 Not an engineer- Find out where you belong.md @@ -0,0 +1,106 @@ +[#]: collector: (lujun9972) +[#]: translator: (max27149) +[#]: reviewer: (wxy) +[#]: publisher: (wxy) +[#]: url: (https://linux.cn/article-13445-1.html) +[#]: subject: (Not an engineer? Find out where you belong) +[#]: via: (https://opensource.com/article/21/2/advice-non-technical) +[#]: author: (Dawn Parzych https://opensource.com/users/dawnparzych) + +不是程序员?那就找到自己的定位 +=== + +> 无论你是已经工作了几十年的还是刚开始从业的非工程型技术人,此建议都可以帮助你确定你的位置归属。 + +![](https://img.linux.net.cn/data/attachment/album/202105/31/192647jl354n1jezx1ea1c.jpg) + +在 [本系列第一篇文章][2] 中 ,我解释了将人员和角色分为“技术”或“非技术”类别的问题。在 [第二篇文章][3] 中,我为不写代码的人分享了一些技术岗位角色。这一次,我将把这次探索总结为——“技术或非技术意味着什么”,并提供一些能够在职业发展上帮到你的建议。 + +无论你是已经从事技术工作数十年,或是刚刚起步,还是正在寻求职业变更,请考虑本文中来自非技术人员但在技术角色方面取得成功的人士的建议。 + +> “不要把你的工作和身份捆绑起来 —— 把它们分开。” +> +> —— Adam Gordon Bell,Earthly Technologies 开发者关系部 + +转换角色,并不意味着你的技能会消失且你不再具有价值。如果你担任了新角色,则需要专注于该角色的关键技能。培养技能是需要时间的。花点时间,找出新职位的重要技能。 + +如果你管理工程师们,请鼓励他们提升技术技能的同时发展非工程技能,这些技能往往能比编程能力和技术技能对职业发展和成功产生更显著的变化。 + +### 做你自己 + +> “不要让其他人定义你是技术人员还是非技术人员。什么是技术人员,什么不是技术人员,以及这是否重要,是人们必须自己搞清楚的事情。” +> +> —— Adam Gordon Bell + +> “永远不要用‘我不是技术人员’为开头进行对话。因为很可能让对方产生‘这点我需要提醒你’的想法,这在面试的时候可从来不会留下好印象,而且还有可能会让人觉得你对自己技能缺乏信心。” +> +> —— Mary Thengvall,Camunda 开发者关系总监 + +避免刻板成见;不是所有的工程师都喜欢《星球大战》或《星际迷航》。不是所有工程师都穿连帽卫衣。工程师也可以和别人交流。 + +> “单单就你的行为举止,旁人就有很多关于技术或非技术方面的看法。在办公室工作的时候,我会穿裙子,因为只有这样我才能舒服一点。” +> +> —— Shailvi Wakhlu,Strava 高级数据总监 + +### 了解你的价值 + +正如我在第一篇文章中讨论的那样,被打上“非技术”的标签会导致 [冒充者综合症][4]。承认自己的价值,不要在自己身上贴上“非技术”标签,因为它会限制你的收入潜力和职业发展。 + +> “人们之所以把我重新包装成其他东西,是因为他们认为我和工程师的刻板印象不一样。我很高兴我没有听这些人的话,因为他们本质上是在告诉我,在我拥有的技能之外,去找一份低薪的工作。” +> +> —— Shailvi Wakhlu + +> “年轻的或者女性技术人,特别是刚接触技术的女性,更容易患上冒名综合症,认为自己技术不够好。比如,‘哦,我只会前端。’,什​​么叫你*只会*前端?前端也很难的好吧。” +> +> —— Liz Harris + +### 寻找那些可以提升价值并帮到人们的地方 + +你不需要创建 PR 就可以参与开源。 + +> “当有人想为开源项目做点贡献时,我总是对他说,‘不要想着,得是一个提交才行、得提一个 PR 才可以。’这就好像,‘不行。怎么才能为那个项目贡献点价值呢?’ 如果你没时间提交 PR,那你是不是提个议题并把要点写下来?” +> +> —— Eddie Jaoude,Jaoude Studios 开源程序员 + +### 思维的多样性有助于事业成功 + +看看所有角色和人员的价值和贡献。不要根据头衔将人归到同能力的一组。 + +> “要认识到,所有人(包括自己在内),在任何时候,以及事情全貌的重要性。创造力这个事儿不应该由自我驱动。要知道,对于你所做的事情,你可以做的更好,也可以做的更糟。不要害怕寻求帮助,知道到我们在一起。” +> +> —— Therese Eberhard,电影/广告和视频场景画师 + +> “在我参加过的黑客马拉松中,我们都是技术人员,组建了一支四五个硬核程序员组成的强大团队,但我们输了。我不骗你,我们输了。在新冠疫情之前,我赢了前六次的黑客马拉松,而且当时团队中一半的人属于其他领域的专家。在我们赢过的比赛中,大多数人会认为团队一半人是非技术的,尽管我不喜欢这个术语,因为这像是给团队/项目贴金。我们之所以获胜,是因为我们对所构建的东西有很多不同的看法。” +> +> —— Eddie Jaoude + +> “我们越能摆脱‘技术/非技术’、‘开发人员/非开发人员’的标签,并理解到一个连续统一的整体存在,我们就越能全力以赴地雇用到合适的人来做这项工作,只要不被你需要‘技术团队’的假设所困扰。” +> +> —— Mary Thengvall + +我们的社区和团队越多样化,它们的包容性就越大。 + +> “老实说,无论是从社区角度还是从产品角度,我认为,总的来说,最重要的事情都是,我们应该确保我们建立的是一个包容性的社区,这不仅是为了我们的产品,也不仅是为了我们正在使用的技术,还为了整个人类社会,我想……我敢打赌,如果我们做到了这一点,那么作为人类,我们就比过去更进步了。” +> +> —— Leon Stigter,Lightbend 高级产品经理 + +如果你以非程序员的技术身份工作,你会给那些认为自己“非技术”的人(或被他人认为是“非技术”的人)提供什么建议? 在评论中分享你的见解。 + +--- + +via: https://opensource.com/article/21/2/advice-non-technical + +作者:[Dawn Parzych][a] +选题:[lujun9972][b] +译者:[max27149](https://github.com/max27149) +校对:[wxy](https://github.com/wxy) + +本文由 [LCTT](https://github.com/LCTT/TranslateProject) 原创编译,[Linux中国](https://linux.cn/) 荣誉推出 + +[a]: https://opensource.com/users/dawnparzych +[b]: https://github.com/lujun9972 +[1]: https://opensource.com/sites/default/files/styles/image-full-size/public/lead-images/career_journey_road_gps_path_map_520.png?itok=PpL6jJgY (Looking at a map for career journey) +[2]: https://linux.cn/article-13168-1.html +[3]: https://linux.cn/article-13178-1.html +[4]: https://opensource.com/business/15/9/tips-avoiding-impostor-syndrome + diff --git a/published/202105/20210325 How to use the Linux sed command.md b/published/202105/20210325 How to use the Linux sed command.md new file mode 100644 index 0000000000..fa8818a8e2 --- /dev/null +++ b/published/202105/20210325 How to use the Linux sed command.md @@ -0,0 +1,184 @@ +[#]: subject: "How to use the Linux sed command" +[#]: via: "https://opensource.com/article/21/3/sed-cheat-sheet" +[#]: author: "Seth Kenlon https://opensource.com/users/seth" +[#]: collector: "lujun9972" +[#]: translator: "MjSeven" +[#]: reviewer: "wxy" +[#]: publisher: "wxy" +[#]: url: "https://linux.cn/article-13417-1.html" + +使用 sed 命令进行复制、剪切和粘贴 +====== + +> 了解 sed 的基本用法,然后下载我们的备忘单,方便快速地参考 Linux 流编辑器。 + +![](https://img.linux.net.cn/data/attachment/album/202105/23/181625abgrg4dsbw4y4fue.jpg) + +很少有 Unix 命令像 `sed`、[grep][2] 和 [awk][3] 一样出名,它们经常组合在一起,可能是因为它们具有奇怪的名称和强大的文本解析能力。它们还在一些语法和逻辑上有相似之处。虽然它们都能用于文本解析,但都有其特殊性。本文研究 `sed` 命令,它是一个 流编辑器stream editor。 + +我之前写过关于 [sed][4] 以及它的远亲 [ed][5] 的文章。要熟悉 `sed`,对 `ed` 有一点了解是有帮助的,因为这有助于你熟悉缓冲区的概念。本文假定你熟悉 `sed` 的基本知识,这意味着你至少已经运行过经典的 `s/foo/bar` 风格的查找和替换命令。 + +- 下载我们的免费 [sed 备忘录][6] + +### 安装 sed + +如果你使用的是 Linux、BSD 或 macOS,那么它们已经安装了 GNU 的或 BSD 的 sed。这些是原始 `sed` 命令的独特重新实现。虽然它们很相似,但也有一些细微的差别。本文已经在 Linux 和 NetBSD 版本上进行了测试,所以你可以使用你的计算机上找到的任何 sed,但是对于 BSD sed,你必须使用短选项(例如 `-n` 而不是 `--quiet`)。 + +GNU sed 通常被认为是功能最丰富的 sed,因此无论你是否运行 Linux,你可能都想要尝试一下。如果在 Ports 树中找不到 GNU sed(在非 Linux 系统上通常称为 gsed),你可以从 GNU 网站 [下载源代码][7]。 安装 GNU sed 的好处是,你可以使用它的额外功能,但是如果需要可移植性,还可以限制它以遵守 sed 的 [POSIX][8] 规范。 + +MacOS 用户可以在 [MacPorts][9] 或 [Homebrew][10] 上找到 GNU sed。 + +在 Windows 上,你可以通过 [Chocolatey][12] 来 [安装 GNU sed][11]。 + +### 了解模式空间和保留空间 + +sed 一次只能处理一行。因为它没有可视化模式,所以会创建一个 模式空间pattern space,这是一个内存空间,其中包含来自输入流的当前行(删除了尾部的任何换行符)。填充模式空间后,sed 将执行你的指令。当命令执行完时,sed 将模式空间中的内容打印到输出流,默认是 **标准输出**,但是可以将输出重定向到文件,甚至使用 `--in-place=.bak` 选项重定向到同一文件。 + +然后,循环从下一个输入行再次开始。 + +为了在遍历文件时提供一点灵活性,sed 还提供了保留空间hold space(有时也称为 保留缓冲区hold buffer),即 sed 内存中为临时数据存储保留的空间。你可以将保留空间当作剪贴板,实际上,这正是本文所演示的内容:如何使用 sed 复制/剪切和粘贴。 + +首先,创建一个示例文本文件,其内容如下: + +``` +Line one +Line three +Line two +``` + +### 复制数据到保留空间 + +要将内容放置在 sed 的保留空间,使用 `h` 或 `H` 命令。小写的 `h` 告诉 sed 覆盖保留空间中的当前内容,而大写的 `H` 告诉 sed 将数据追加到保留空间中已经存在的内容之后。 + +单独使用,什么都看不到: + +``` +$ sed --quiet -e '/three/ h' example.txt +$ +``` + +`--quiet`(缩写为 `-n`)选项禁止显示所有输出,但 sed 执行了我的搜索需求。在这种情况下,sed 选择包含字符串 `three` 的任何行,并将其复制到保留空间。我没有告诉 sed 打印任何东西,所以没有输出。 + +### 从保留空间复制数据 + +要了解保留空间,你可以从保留空间复制内容,然后使用 `g` 命令将其放入模式空间,观察会发生什么: + +``` +$ sed -n -e '/three/h' -e 'g;p' example.txt + +Line three +Line three +``` + +第一个空白行是因为当 sed 第一次复制内容到模式空间时,保留空间为空。 + +接下来的两行包含 `Line three` 是因为这是从第二行开始的保留空间。 + +该命令使用两个唯一的脚本(`-e`)纯粹是为了帮助提高可读性和组织性。将步骤划分为单独的脚本可能会很有用,但是从技术上讲,以下命令与一个脚本语句一样有效: + +``` +$ sed -n -e '/three/h ; g ; p' example.txt + +Line three +Line three +``` + +### 将数据追加到模式空间 + +`G` 命令会将一个换行符和保留空间的内容添加到模式空间。 + +``` +$ sed -n -e '/three/h' -e 'G;p' example.txt +Line one + +Line three +Line three +Line two +Line three +``` + +此输出的前两行同时包含模式空间(`Line one`)的内容和空的保留空间。接下来的两行与搜索文本(`three`)匹配,因此它既包含模式空间又包含保留空间。第三行的保留空间没有变化,因此在模式空间(`Line two`)的末尾是保留空间(仍然是 `Line three`)。 + +### 用 sed 剪切和粘贴 + +现在你知道了如何将字符串从模式空间转到保留空间并再次返回,你可以设计一个 sed 脚本来复制、删除,然后在文档中粘贴一行。例如,将示例文件的 `Line three` 挪至第三行,sed 可以解决这个问题: + +``` +$ sed -n -e '/three/ h' -e '/three/ d' \ +-e '/two/ G;p' example.txt +Line one +Line two +Line three +``` + + * 第一个脚本找到包含字符串 `three` 的行,并将其从模式空间复制到保留空间,替换当前保留空间中的任何内容。 + * 第二个脚本删除包含字符串 `three` 的任何行。这样就完成了与文字处理器或文本编辑器中的 _剪切_ 动作等效的功能。 + * 最后一个脚本找到包含字符串 `two` 的行,并将保留空间的内容_追加_到模式空间,然后打印模式空间。 + +任务完成。 + +### 使用 sed 编写脚本 + +再说一次,使用单独的脚本语句纯粹是为了视觉和心理上的简单。剪切和粘贴命令作为一个脚本同样有效: + +``` +$ sed -n -e '/three/ h ; /three/ d ; /two/ G ; p' example.txt +Line one +Line two +Line three +``` + +它甚至可以写在一个专门的脚本文件中: + +``` +#!/usr/bin/sed -nf + +/three/h +/three/d +/two/ G +p +``` + +要运行该脚本,将其加入可执行权限,然后用示例文件尝试: + +``` +$ chmod +x myscript.sed +$ ./myscript.sed example.txt +Line one +Line two +Line three +``` + +当然,你需要解析的文本越可预测,则使用 sed 解决问题越容易。发明 sed 操作(例如复制和粘贴)的“配方”通常是不切实际的,因为触发操作的条件可能因文件而异。但是,你对 sed 命令的使用越熟练,就越容易根据需要解析的输入来设计复杂的动作。 + +重要的事情是识别不同的操作,了解 sed 何时移至下一行,并预测模式和保留空间包含的内容。 + +### 下载备忘单 + +sed 很复杂。虽然它只有十几个命令,但它灵活的语法和原生功能意味着它充满了无限的潜力。为了充分利用 sed,我曾经参考过一些巧妙的单行命令,但是直到我开始发明(有时是重新发明)自己的解决方案时,我才觉得自己真正开始学习 sed 了 。如果你正在寻找命令提示和语法方面的有用技巧,[下载我们的 sed 备忘单][6],然后开始一劳永逸地学习 sed! + +-------------------------------------------------------------------------------- + +via: https://opensource.com/article/21/3/sed-cheat-sheet + +作者:[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/linux_penguin_green.png?itok=ENdVzW22 "Penguin with green background" +[2]: https://opensource.com/article/21/3/grep-cheat-sheet +[3]: https://opensource.com/article/20/9/awk-ebook +[4]: https://opensource.com/article/20/12/sed +[5]: https://opensource.com/article/20/12/gnu-ed +[6]: https://opensource.com/downloads/sed-cheat-sheet +[7]: http://www.gnu.org/software/sed/ +[8]: https://opensource.com/article/19/7/what-posix-richard-stallman-explains +[9]: https://opensource.com/article/20/11/macports +[10]: https://opensource.com/article/20/6/homebrew-mac +[11]: https://chocolatey.org/packages/sed +[12]: https://opensource.com/article/20/3/chocolatey \ No newline at end of file diff --git a/published/202105/20210330 Access Python package index JSON APIs with requests.md b/published/202105/20210330 Access Python package index JSON APIs with requests.md new file mode 100644 index 0000000000..437bd5c3ea --- /dev/null +++ b/published/202105/20210330 Access Python package index JSON APIs with requests.md @@ -0,0 +1,208 @@ +[#]: subject: "Access Python package index JSON APIs with requests" +[#]: via: "https://opensource.com/article/21/3/python-package-index-json-apis-requests" +[#]: author: "Ben Nuttall https://opensource.com/users/bennuttall" +[#]: collector: "lujun9972" +[#]: translator: "MjSeven" +[#]: reviewer: "wxy" +[#]: publisher: "wxy" +[#]: url: "https://linux.cn/article-13356-1.html" + +使用 requests 访问 Python 包索引(PyPI)的 JSON API +====== + +> PyPI 的 JSON API 是一种机器可直接使用的数据源,你可以访问和你浏览网站时相同类型的数据。 + +![](https://img.linux.net.cn/data/attachment/album/202105/03/111943du0lgbjj6br6sruu.jpg) + +PyPI(Python 软件包索引)提供了有关其软件包信息的 JSON API。本质上,它是机器可以直接使用的数据源,与你在网站上直接访问是一样的的。例如,作为人类,我可以在浏览器中打开 [Numpy][2] 项目页面,点击左侧相关链接,查看有哪些版本,哪些文件可用以及发行日期和支持的 Python 版本等内容: + +![NumPy project page][3] + +但是,如果我想编写一个程序来访问此数据,则可以使用 JSON API,而不必在这些页面上抓取和解析 HTML。 + +顺便说一句:在旧的 PyPI 网站上,还托管在 `pypi.python.org` 时,NumPy 的项目页面位于 `pypi.python.org/pypi/numpy`,访问其 JSON API 也很简单,只需要在最后面添加一个 `/json` ,即 `https://pypi.org/pypi/numpy/json`。现在,PyPI 网站托管在 `pypi.org`,NumPy 的项目页面是 `pypi.org/project/numpy`。新站点不会有单独的 JSON API URL,但它仍像以前一样工作。因此,你不必在 URL 后添加 `/json`,只要记住 URL 就够了。 + +你可以在浏览器中打开 NumPy 的 JSON API URL,Firefox 很好地渲染了数据: + +![JSON rendered in Firefox][5] + +你可以查看 `info`,`release` 和 `urls` 其中的内容。或者,你可以将其加载到 Python Shell 中,以下是几行入门教程: + +``` +import requests +url = "https://pypi.org/pypi/numpy/json" +r = requests.get(url) +data = r.json() +``` + +获得数据后(调用 `.json()` 提供了该数据的 [字典][6]),你可以对其进行查看: + +![Inspecting data][7] + +查看 `release` 中的键: + +![Inspecting keys in releases][8] + +这表明 `release` 是一个以版本号为键的字典。选择一个并查看以下内容: + +![Inspecting version][9] + +每个版本都包含一个列表,`release` 包含 24 项。但是每个项目是什么?由于它是一个列表,因此你可以索引第一项并进行查看: + +![Indexing an item][10] + +这是一个字典,其中包含有关特定文件的详细信息。因此,列表中的 24 个项目中的每一个都与此特定版本号关联的文件相关,即在 列出的 24 个文件。 + +你可以编写一个脚本在可用数据中查找内容。例如,以下的循环查找带有 sdist(源代码包)的版本,它们指定了 `requires_python` 属性并进行打印: + +``` +for version, files in data['releases'].items(): +    for f in files: +        if f.get('packagetype') == 'sdist' and f.get('requires_python'): +            print(version, f['requires_python']) +``` + +![sdist files with requires_python attribute][11] + +### piwheels + +去年,我在 piwheels 网站上[实现了类似的 API][12]。[piwheels.org][13] 是一个 Python 软件包索引,为树莓派架构提供了 wheel(预编译的二进制软件包)。它本质上是 PyPI 软件包的镜像,但带有 Arm wheel,而不是软件包维护者上传到 PyPI 的文件。 + +由于 piwheels 模仿了 PyPI 的 URL 结构,因此你可以将项目页面 URL 的 `pypi.org` 部分更改为 `piwheels.org`。它将向你显示类似的项目页面,其中详细说明了构建的版本和可用的文件。由于我喜欢旧站点允许你在 URL 末尾添加 `/json` 的方式,所以我也支持这种方式。NumPy 在 PyPI 上的项目页面为 [pypi.org/project/numpy][14],在 piwheels 上,它是 [piwheels.org/project/numpy][15],而 JSON API 是 [piwheels.org/project/numpy/json][16] 页面。 + +没有必要重复 PyPI API 的内容,所以我们提供了 piwheels 上可用内容的信息,包括所有已知发行版的列表,一些基本信息以及我们拥有的文件列表: + +![JSON files available in piwheels][17] + +与之前的 PyPI 例子类似,你可以创建一个脚本来分析 API 内容。例如,对于每个 NumPy 版本,其中有多少 piwheels 文件: + +``` +import requests + +url = "https://www.piwheels.org/project/numpy/json" +package = requests.get(url).json() + +for version, info in package['releases'].items(): +    if info['files']: +        print('{}: {} files'.format(version, len(info['files']))) +    else: +        print('{}: No files'.format(version)) +``` + +此外,每个文件都包含一些元数据: + +![Metadata in JSON files in piwheels][18] + +方便的是 `apt_dependencies` 字段,它列出了使用该库所需的 Apt 软件包。本例中的 NumPy 文件,或者通过 `pip` 安装 Numpy,你还需要使用 Debian 的 `apt` 包管理器安装 `libatlas3-base` 和 `libgfortran`。 + +以下是一个示例脚本,显示了程序包的 Apt 依赖关系: + + +``` +import requests + +def get_install(package, abi): +    url = 'https://piwheels.org/project/{}/json'.format(package) +    r = requests.get(url) +    data = r.json() +    for version, release in sorted(data['releases'].items(), reverse=True): +        for filename, file in release['files'].items(): +            if abi in filename: +                deps = ' '.join(file['apt_dependencies']) +                print("sudo apt install {}".format(deps)) +                print("sudo pip3 install {}=={}".format(package, version)) +                return + +get_install('opencv-python', 'cp37m') +get_install('opencv-python', 'cp35m') +get_install('opencv-python-headless', 'cp37m') +get_install('opencv-python-headless', 'cp35m') +``` + +我们还为软件包列表提供了一个通用的 API 入口,其中包括每个软件包的下载统计: + +```python +import requests + +url = "https://www.piwheels.org/packages.json" +packages = requests.get(url).json() +packages = { +    pkg: (d_month, d_all) +    for pkg, d_month, d_all, *_ in packages +} + +package = 'numpy' +d_month, d_all = packages[package] + +print(package, "has had", d_month, "downloads in the last month") +print(package, "has had", d_all, "downloads in total") +``` + +### pip search + +`pip search` 因为其 XMLRPC 接口过载而被禁用,因此人们一直在寻找替代方法。你可以使用 piwheels 的 JSON API 来搜索软件包名称,因为软件包的集合是相同的: + +``` +#!/usr/bin/python3 +import sys + +import requests + +PIWHEELS_URL = 'https://www.piwheels.org/packages.json' + +r = requests.get(PIWHEELS_URL) +packages = {p[0] for p in r.json()} + +def search(term): +    for pkg in packages: +        if term in pkg: +            yield pkg + +if __name__ == '__main__': +    if len(sys.argv) == 2: +        results = search(sys.argv[1].lower()) +        for res in results: +            print(res) +    else: +        print("Usage: pip_search TERM") +``` + +有关更多信息,参考 piwheels 的 [JSON API 文档][19]. + +* * * + +_本文最初发表在 Ben Nuttall 的 [Tooling Tuesday 博客上][20],经许可转载使用。_ + +-------------------------------------------------------------------------------- + +via: https://opensource.com/article/21/3/python-package-index-json-apis-requests + +作者:[Ben Nuttall][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/bennuttall +[b]: https://github.com/lujun9972 +[1]: https://opensource.com/sites/default/files/styles/image-full-size/public/lead-images/python_programming_question.png?itok=cOeJW-8r "Python programming language logo with question marks" +[2]: https://pypi.org/project/numpy/ +[3]: https://opensource.com/sites/default/files/uploads/numpy-project-page.png "NumPy project page" +[4]: https://creativecommons.org/licenses/by-sa/4.0/ +[5]: https://opensource.com/sites/default/files/uploads/pypi-json-firefox.png "JSON rendered in Firefox" +[6]: https://docs.python.org/3/tutorial/datastructures.html#dictionaries +[7]: https://opensource.com/sites/default/files/uploads/pypi-json-notebook.png "Inspecting data" +[8]: https://opensource.com/sites/default/files/uploads/pypi-json-releases.png "Inspecting keys in releases" +[9]: https://opensource.com/sites/default/files/uploads/pypi-json-inspect.png "Inspecting version" +[10]: https://opensource.com/sites/default/files/uploads/pypi-json-release.png "Indexing an item" +[11]: https://opensource.com/sites/default/files/uploads/pypi-json-requires-python.png "sdist files with requires_python attribute " +[12]: https://blog.piwheels.org/requires-python-support-new-project-page-layout-and-a-new-json-api/ +[13]: https://www.piwheels.org/ +[14]: https://pypi.org/project/numpy +[15]: https://www.piwheels.org/project/numpy +[16]: https://www.piwheels.org/project/numpy/json +[17]: https://opensource.com/sites/default/files/uploads/piwheels-json.png "JSON files available in piwheels" +[18]: https://opensource.com/sites/default/files/uploads/piwheels-json-numpy.png "Metadata in JSON files in piwheels" +[19]: https://www.piwheels.org/json.html +[20]: https://tooling.bennuttall.com/accessing-python-package-index-json-apis-with-requests/ diff --git a/published/202105/20210331 A tool to spy on your DNS queries- dnspeep.md b/published/202105/20210331 A tool to spy on your DNS queries- dnspeep.md new file mode 100644 index 0000000000..c194b860c8 --- /dev/null +++ b/published/202105/20210331 A tool to spy on your DNS queries- dnspeep.md @@ -0,0 +1,154 @@ +[#]: subject: (A tool to spy on your DNS queries: dnspeep) +[#]: via: (https://jvns.ca/blog/2021/03/31/dnspeep-tool/) +[#]: author: (Julia Evans https://jvns.ca/) +[#]: collector: (lujun9972) +[#]: translator: (wyxplus) +[#]: reviewer: (wxy) +[#]: publisher: (wxy) +[#]: url: (https://linux.cn/article-13353-1.html) + +dnspeep:监控 DNS 查询的工具 +====== + +![](https://img.linux.net.cn/data/attachment/album/202105/02/191521i4ycjm7veln426vy.jpg) + +在过去的几天中,我编写了一个叫作 [dnspeep][1] 的小工具,它能让你看到你电脑中正进行的 DNS 查询,并且还能看得到其响应。它现在只有 [250 行 Rust 代码][2]。 + +我会讨论如何去尝试它、能做什么、为什么我要编写它,以及当我在开发时所遇到的问题。 + +### 如何尝试 + +我构建了一些二进制文件,因此你可以快速尝试一下。 + +对于 Linux(x86): + +``` +wget https://github.com/jvns/dnspeep/releases/download/v0.1.0/dnspeep-linux.tar.gz +tar -xf dnspeep-linux.tar.gz +sudo ./dnspeep +``` + +对于 Mac: + +``` +wget https://github.com/jvns/dnspeep/releases/download/v0.1.0/dnspeep-macos.tar.gz +tar -xf dnspeep-macos.tar.gz +sudo ./dnspeep +``` + +它需要以超级用户root身份运行,因为它需要访问计算机正在发送的所有 DNS 数据包。 这与 `tcpdump` 需要以超级身份运行的原因相同:它使用 `libpcap`,这与 tcpdump 使用的库相同。 + +如果你不想在超级用户下运行下载的二进制文件,你也能在 查看源码并且自行编译。 + +### 输出结果是什么样的 + +以下是输出结果。每行都是一次 DNS 查询和响应: + +``` +$ sudo dnspeep +query name server IP response +A firefox.com 192.168.1.1 A: 44.235.246.155, A: 44.236.72.93, A: 44.236.48.31 +AAAA firefox.com 192.168.1.1 NOERROR +A bolt.dropbox.com 192.168.1.1 CNAME: bolt.v.dropbox.com, A: 162.125.19.131 +``` + +这些查询是来自于我在浏览器中访问的 `neopets.com`,而 `bolt.dropbox.com` 查询是因为我正在运行 Dropbox 代理,并且我猜它不时会在后台运行,因为其需要同步。 + +### 为什么我要开发又一个 DNS 工具? + +之所以这样做,是因为我认为当你不太了解 DNS 时,DNS 似乎真的很神秘! + +你的浏览器(和你电脑上的其他软件)一直在进行 DNS 查询,我认为当你能真正看到请求和响应时,似乎会有更多的“真实感”。 + +我写这个也把它当做一个调试工具。我想“这是 DNS 的问题?”的时候,往往很难回答。我得到的印象是,当尝试检查问题是否由 DNS 引起时,人们经常使用试错法或猜测,而不是仅仅查看计算机所获得的 DNS 响应。 + +### 你可以看到哪些软件在“秘密”使用互联网 + +我喜欢该工具的一方面是,它让我可以感知到我电脑上有哪些程序正使用互联网!例如,我发现在我电脑上,某些软件出于某些理由不断地向 `ping.manjaro.org` 发送请求,可能是为了检查我是否已经连上互联网了。 + +实际上,我的一个朋友用这个工具发现,他的电脑上安装了一些以前工作时的企业监控软件,但他忘记了卸载,因此你甚至可能发现一些你想要删除的东西。 + +### 如果你不习惯的话, tcpdump 会令人感到困惑 + +当我试图向人们展示他们的计算机正在进行的 DNS 查询时,我的第一感是想“好吧,使用 tcpdump”!而 `tcpdump` 确实可以解析 DNS 数据包! + +例如,下方是一次对 `incoming.telemetry.mozilla.org.` 的 DNS 查询结果: + +``` +11:36:38.973512 wlp3s0 Out IP 192.168.1.181.42281 > 192.168.1.1.53: 56271+ A? incoming.telemetry.mozilla.org. (48) +11:36:38.996060 wlp3s0 In IP 192.168.1.1.53 > 192.168.1.181.42281: 56271 3/0/0 CNAME telemetry-incoming.r53-2.services.mozilla.com., CNAME prod.data-ingestion.prod.dataops.mozgcp.net., A 35.244.247.133 (180) +``` + +绝对可以学着去阅读理解一下,例如,让我们分解一下查询: + +`192.168.1.181.42281 > 192.168.1.1.53: 56271+ A? incoming.telemetry.mozilla.org. (48)` + + * `A?` 意味着这是一次 A 类型的 DNS **查询** + * `incoming.telemetry.mozilla.org.` 是被查询的名称 + * `56271` 是 DNS 查询的 ID + * `192.168.1.181.42281` 是源 IP/端口 + * `192.168.1.1.53` 是目的 IP/端口 + * `(48)` 是 DNS 报文长度 + +在响应报文中,我们可以这样分解: + +`56271 3/0/0 CNAME telemetry-incoming.r53-2.services.mozilla.com., CNAME prod.data-ingestion.prod.dataops.mozgcp.net., A 35.244.247.133 (180)` + + * `3/0/0` 是在响应报文中的记录数:3 个回答,0 个权威记录,0 个附加记录。我认为 tcpdump 甚至只打印出回答响应报文。 + * `CNAME telemetry-incoming.r53-2.services.mozilla.com`、`CNAME prod.data-ingestion.prod.dataops.mozgcp.net.` 和 `A 35.244.247.133` 是三个响应记录。 + * `56271` 是响应报文 ID,和查询报文的 ID 相对应。这就是你如何知道它是对前一行请求的响应。 + +我认为,这种格式最难处理的是(作为一个只想查看一些 DNS 流量的人),你必须手动匹配请求和响应,而且它们并不总是相邻的行。这就是计算机擅长的事情! + +因此,我决定编写一个小程序(`dnspeep`)来进行匹配,并排除一些我认为多余的信息。 + +### 我在编写时所遇到的问题 + +在撰写本文时,我遇到了一些问题: + + * 我必须给 `pcap` 包打上补丁,使其能在 Mac 操作系统上和 Tokio 配合工作([这个更改][3])。这是其中的一个 bug,花了很多时间才搞清楚,用了 1 行代码才解决 :) + * 不同的 Linux 发行版似乎有不同的 `libpcap.so` 版本。所以我不能轻易地分发一个动态链接 libpcap 的二进制文件(你可以 [在这里][4] 看到其他人也有同样的问题)。因此,我决定在 Linux 上将 libpcap 静态编译到这个工具中。但我仍然不太了解如何在 Rust 中正确做到这一点作,但我通过将 `libpcap.a` 文件复制到 `target/release/deps` 目录下,然后直接运行 `cargo build`,使其得以工作。 + * 我使用的 `dns_parser` carte 并不支持所有 DNS 查询类型,只支持最常见的。我可能需要更换一个不同的工具包来解析 DNS 数据包,但目前为止还没有找到合适的。 + * 因为 `pcap` 接口只提供原始字节(包括以太网帧),所以我需要 [编写代码来计算从开头剥离多少字节才能获得数据包的 IP 报头][5]。我很肯定我还遗漏了一些情形。 + +我对于给它取名也有过一段艰难的时光,因为已经有许多 DNS 工具了(dnsspy!dnssnoop!dnssniff!dnswatch!)我基本上只是查了下有关“监听”的每个同义词,然后选择了一个看起来很有趣并且还没有被其他 DNS 工具所占用的名称。 + +该程序没有做的一件事就是告诉你哪个进程进行了 DNS 查询,我发现有一个名为 [dnssnoop][6] 的工具可以做到这一点。它使用 eBPF,看上去很酷,但我还没有尝试过。 + +### 可能会有许多 bug + +我只在 Linux 和 Mac 上简单测试了一下,并且我已知至少有一个 bug(不支持足够多的 DNS 查询类型),所以请在遇到问题时告知我! + +尽管这个 bug 没什么危害,因为这 libpcap 接口是只读的。所以可能发生的最糟糕的事情是它得到一些它无法解析的输入,最后打印出错误或是崩溃。 + +### 编写小型教育工具很有趣 + +最近,我对编写小型教育的 DNS 工具十分感兴趣。 + +到目前为止我所编写的工具: + + * (一种进行 DNS 查询的简单方法) + * (向你显示在进行 DNS 查询时内部发生的情况) + * 本工具(`dnspeep`) + +以前我尽力阐述已有的工具(如 `dig` 或 `tcpdump`)而不是编写自己的工具,但是经常我发现这些工具的输出结果让人费解,所以我非常关注以更加友好的方式来看这些相同的信息,以便每个人都能明白他们电脑正在进行的 DNS 查询,而不仅仅是依赖 tcmdump。 + +-------------------------------------------------------------------------------- + +via: https://jvns.ca/blog/2021/03/31/dnspeep-tool/ + +作者:[Julia Evans][a] +选题:[lujun9972][b] +译者:[wyxplus](https://github.com/wyxplus) +校对:[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://github.com/jvns/dnspeep +[2]: https://github.com/jvns/dnspeep/blob/f5780dc822df5151f83703f05c767dad830bd3b2/src/main.rs +[3]: https://github.com/ebfull/pcap/pull/168 +[4]: https://github.com/google/gopacket/issues/734 +[5]: https://github.com/jvns/dnspeep/blob/f5780dc822df5151f83703f05c767dad830bd3b2/src/main.rs#L136 +[6]: https://github.com/lilydjwg/dnssnoop diff --git a/published/202105/20210412 Scheduling tasks with cron.md b/published/202105/20210412 Scheduling tasks with cron.md new file mode 100644 index 0000000000..c14e44cd5f --- /dev/null +++ b/published/202105/20210412 Scheduling tasks with cron.md @@ -0,0 +1,202 @@ +[#]: subject: "Scheduling tasks with cron" +[#]: via: "https://fedoramagazine.org/scheduling-tasks-with-cron/" +[#]: author: "Darshna Das https://fedoramagazine.org/author/climoiselle/" +[#]: collector: "lujun9972" +[#]: translator: "MjSeven" +[#]: reviewer: "wxy" +[#]: publisher: "wxy" +[#]: url: "https://linux.cn/article-13383-1.html" + +使用 cron 调度任务 +====== + +![](https://img.linux.net.cn/data/attachment/album/202105/12/120220f7wwchadgwmsg1dw.jpg) + +cron 是一个调度守护进程,它以指定的时间间隔执行任务,这些任务称为 corn 作业,主要用于自动执行系统维护或管理任务。例如,你可以设置一个 cron 作业来自动执行重复的任务,比如备份数据库或数据,使用最新的安全补丁更新系统,检查磁盘空间使用情况,发送电子邮件等等。 cron 作业可以按分钟、小时、日、月、星期或它们的任意组合运行。 + +### cron 的一些优点 + +以下是使用 cron 作业的一些优点: + + * 你可以更好地控制作业的运行时间。例如,你可以精确到分钟、小时、天等。 + * 它消除了为循环任务逻辑而去写代码的需要,当你不再需要执行任务时,可以直接关闭它。 + * 作业在不执行时不会占用内存,因此你可以节省内存分配。 + * 如果一个作业执行失败并由于某种原因退出,它将在适当的时间再次运行。 + +### 安装 cron 守护进程 + +幸运的是,Fedora Linux 预先配置了运行重要的系统任务来保持系统更新,有几个实用程序可以运行任务例如 cron、`anacron`、`at` 和 `batch` 。本文只关注 cron 实用程序的安装。cron 和 cronie 包一起安装,cronie 包也提供 `cron` 服务。 + +要确定软件包是否已经存在,使用 `rpm` 命令: + +``` +$ rpm -q cronie + Cronie-1.5.2-4.el8.x86_64 +``` + +如果安装了 cronie ,它将返回 cronie 包的全名。如果你的系统中没有安装,则会显示未安装。 + +使用以下命令安装: + +``` +$ dnf install cronie +``` + +### 运行 cron 守护进程 + +cron 作业由 crond 服务来执行,它会读取配置文件中的信息。在将作业添加到配置文件之前,必须启动 crond 服务,或者安装它。什么是 crond 呢?crond 是 cron 守护程序的简称。要确定 crond 服务是否正在运行,输入以下命令: + +``` +$ systemctl status crond.service +● crond.service - Command Scheduler + Loaded: loaded (/usr/lib/systemd/system/crond.service; enabled; vendor pre> + Active: active (running) since Sat 2021-03-20 14:12:35 PDT; 1 day 21h ago + Main PID: 1110 (crond) +``` + +如果你没有看到类似的内容 `Active: active (running) since…`,你需要启动 crond 守护进程。要在当前会话中运行 crond 服务,输入以下命令: + +``` +$ systemctl run crond.service +``` + +将其配置为开机自启动,输入以下命令: + +``` +$ systemctl enable crond.service +``` + +如果出于某种原因,你希望停止 crond 服务,按以下方式使用 `stop` 命令: + +``` +$ systemctl stop crond.service +``` + +要重新启动它,只需使用 `restart` 命令: + +``` +$ systemctl restart crond.service +``` + +### 定义一个 cron 作业 + +#### cron 配置 + +以下是一个 cron 作业的配置细节示例。它定义了一个简单的 cron 作业,将 `git` master 分支的最新更改拉取到克隆的仓库中: + +``` +*/59 * * * * username cd /home/username/project/design && git pull origin master +``` + +主要有两部分: + + * 第一部分是 `*/59 * * * *`。这表明计时器设置为第 59 分钟执行一次。(LCTT 译注:原文此处有误。) + * 该行的其余部分是命令,因为它将从命令行运行。 + 在此示例中,命令本身包含三个部分: + * 作业将以用户 `username` 的身份运行 + * 它将切换到目录 `/home/username/project/design` + * 运行 `git` 命令拉取 master 分支中的最新更改 + +#### 时间语法 + +如上所述,时间信息是 cron 作业字符串的第一部分,如上所属。它决定了 cron 作业运行的频率和时间。它按以下顺序包括 5 个部分: + + * 分钟 + * 小时 + * 一个月中的某天 + * 月份 + * 一周中的某天 + +下面是一种更图形化的方式来解释语法: + +``` + .--------------- 分钟 (0 - 59) + | .------------- 小时 (0 - 23) + | | .---------- 一月中的某天 (1 - 31) + | | | .------- 月份 (1 - 12) 或 jan、feb、mar、apr … + | | | | .---- 一周中的某天 (0-6) (周日=0 或 7) + | | | | | 或 sun、mon、tue、wed、thr、fri、sat + | | | | | + * * * * * user-name command-to-be-executed +``` + +#### 星号的使用 + +星号(`*`)可以用来替代数字,表示该位置的所有可能值。例如,分钟位置上的星号会使它每分钟运行一次。以下示例可能有助于更好地理解语法。 + +这个 cron 作业将每分钟运行一次: + +``` +* * * * [command] +``` + +斜杠表示分钟的间隔数。下面的示例将每小时运行 12 次,即每 5 分钟运行一次: + +``` +*/5 * * * * [command] +``` + +下一个示例将每月的第二天午夜(例如 1 月 2 日凌晨 12:00,2 月 2 日凌晨 12:00 等等): + +``` +0 0 2 * * [command] +``` + +(LCTT 译注:关于 cron 时间格式,还有更多格式符号,此处没有展开) + +#### 使用 crontab 创建一个 cron 作业 + +cron 作业会在后台运行,它会不断检查 `/etc/crontab` 文件和 `/etc/cron.*/` 以及 `/var/spool/cron/` 目录。每个用户在 `/var/spool/cron/` 中都有一个唯一的 crontab 文件。 + +不应该直接编辑这些 cron 文件。`crontab` 命令是用于创建、编辑、安装、卸载和列出 cron 作业的方法。 + +更酷的是,在创建新文件或编辑现有文件后,你无需重新启动 cron。 + +``` +$ crontab -e +``` + +这将打开你现有的 crontab 文件,或者创建一个。调用 `crontab -e` 时,默认情况下会使用 `vi` 编辑器。注意:要使用 Nano 编辑 crontab 文件,可以设置 `EDITOR=nano` 环境变量。 + +使用 `-l` 选项列出所有 cron 作业。如果需要,使用 `-u` 选项指定一个用户。 + +``` +$ crontab -l +$ crontab -u username -l +``` + +使用以下命令删除所有 cron 作业: + +``` +$ crontab -r +``` + +要删除特定用户的作业,你必须以 root 用户身份运行以下命令: + +``` +$ crontab -r -u username +``` + +感谢你的阅读。cron 作业看起来可能只是系统管理员的工具,但它实际上与许多 Web 应用程序和用户任务有关。 + +### 参考 + +Fedora Linux 文档的 [自动化任务][4] + +-------------------------------------------------------------------------------- + +via: https://fedoramagazine.org/scheduling-tasks-with-cron/ + +作者:[Darshna Das][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://fedoramagazine.org/author/climoiselle/ +[b]: https://github.com/lujun9972 +[1]: https://fedoramagazine.org/wp-content/uploads/2021/03/schedule_with_cron-816x345.jpg +[2]: https://unsplash.com/@yomex4life?utm_source=unsplash&utm_medium=referral&utm_content=creditCopyText +[3]: https://unsplash.com/s/photos/clock?utm_source=unsplash&utm_medium=referral&utm_content=creditCopyText +[4]: https://docs.fedoraproject.org/en-US/Fedora/12/html/Deployment_Guide/ch-autotasks.html \ No newline at end of file diff --git a/published/202105/20210412 Send your scans to a Linux machine over your network.md b/published/202105/20210412 Send your scans to a Linux machine over your network.md new file mode 100644 index 0000000000..f4169f4076 --- /dev/null +++ b/published/202105/20210412 Send your scans to a Linux machine over your network.md @@ -0,0 +1,193 @@ +[#]: subject: (Send your scans to a Linux machine over your network) +[#]: via: (https://opensource.com/article/21/4/linux-scan-samba) +[#]: author: (Marc Skinner https://opensource.com/users/marc-skinner) +[#]: collector: (lujun9972) +[#]: translator: (geekpi) +[#]: reviewer: (wxy) +[#]: publisher: (wxy) +[#]: url: (https://linux.cn/article-13395-1.html) + +通过网络将你的扫描结果发送到 Linux 机器上 +====== + +> 设置一个 Samba 共享,使扫描仪可以容易地被网络上的一台 Linux 计算机访问。 + +![](https://img.linux.net.cn/data/attachment/album/202105/16/111724ft11r181pc1bu21p.jpg) + +自由软件运动 [因为一台设计不良的打印机][2] 而开始。几十年后,打印机和扫描仪制造商继续重新发明轮子,无视既定的通用协议。因此,每隔一段时间,你就会偶然发现一台打印机或扫描仪似乎无法与你的操作系统配合使用。 + +最近,我在一台佳能三合一扫描仪(佳能 Maxify MB2720)上遇到了这种情况。我用开源方案解决这个扫描仪的问题。具体来说,我设置了一个 Samba 共享,使扫描仪在我的网络上可用。 + +[Samba 项目][3] 是一个用于 Linux/Unix 与 Windows 互操作的套件。尽管它是大多数用户从未与之交互的低级代码,但该软件使得在你的本地网络上共享文件变得很容易,而不管使用的是什么平台。 + +我使用的是 Fedora,所以这些说明应该适用于任何基于 RPM 的 Linux 发行版。对于其他发行版,可能需要做一些小的修改。下面是我的做法。 + +### 获取佳能工具 + +从佳能的网站上下载所需的用于 Windows 的 “佳能快速实用工具箱Canon Quick Utility Toolbox”。该软件是必需的,因为它是配置打印机目标文件夹位置和凭证的唯一方法。完成后,你就不需要再使用该工具了,除非你想做出改变。 + +在配置打印机之前,你必须在你的 Linux 电脑或服务器上设置一个 Samba 共享。用以下命令安装 Samba: + +``` +$ sudo dnf -y install samba +``` + +创建 `/etc/smb.conf` 文件,内容如下: + +``` +[global] +        workgroup = WORKGROUP +        netbios name = MYSERVER +        security = user +        #CORE needed for CANON PRINTER SCAN FOLDER +        min protocol = CORE +        #NTML AUTHV1 needed for CANON PRINTER SCAN FOLDER +        ntlm auth = yes +        passdb backend = tdbsam + +        printing = cups +        printcap name = cups +        load printers = no +        cups options = raw + +        hosts allow = 127. 192.168.33. +        max smbd processes = 1000 + +[homes] +        comment = Home Directories +        valid users = %S, %D%w%S +        browseable = No +        writable = yes +        read only = No +        inherit acls = Yes + +[SCANS] +        comment = MB2720 SCANS +        path = /mnt/SCANS +        public = yes +        writable = yes +        browseable = yes +        printable = no +        force user = tux +        create mask = 770 +``` + +在接近结尾的 `force user` 这行中,将用户名从 `tux` 改为你自己的用户名。 + +不幸的是,佳能打印机不能与高于 CORE 或 NTML v2 认证的服务器信息块([SMB][4])协议一起工作。由于这个原因,Samba 共享必须配置最古老的 SMB 协议和 NTML 认证版本。这无论如何都不理想,而且有安全问题,所以我创建了一个单独的 Samba 服务器,专门用于扫描仪。我的另一台共享所有家庭网络文件的 Samba 服务器仍然使用 SMB 3 和 NTML v2 认证版本。 + +启动 Samba 服务端服务,并启用它: + +``` +$ sudo systemctl start smb +$ sudo systemctl enable smb +``` + +### 创建一个 Samba 用户 + +创建你的 Samba 用户并为其设置密码: + +``` +$ sudo smbpasswd -a tux +``` + +在提示符下输入你的密码。 + +假设你想在 Linux 系统上挂载你的 Samba 扫描仪,你需要做几个步骤。 + +创建一个 Samba 客户端凭证文件。我的看起来像这样: + +``` +$ sudo cat /root/smb-credentials.txt +username=tux +password=mySTRONGpassword +``` + +改变权限,使其不能被其他人阅读: + +``` +$ sudo chmod 640 /root/smb-credentials.txt +``` + +创建一个挂载点并将其添加到 `/etc/fstab` 中: + +``` +$ sudo mkdir /mnt/MB2720-SCANS +``` + +在你的 `/etc/fstab` 中添加以下这行: + +``` +//192.168.33.50/SCANS  /mnt/MB2720-SCANS  cifs vers=3.0,credentials=/root/smb-credentials.txt,gid=1000,uid=1000,_netdev    0 0 +``` + +这将使用 [CIFS][5] 将 Samba 共享扫描挂载到新的挂载点,强制采用 SMBv3,并使用存储在 `/root/smb-credetials.txt` 中的用户名和密码。它还传递用户的组标识符(GID)和用户标识符(UID),让你拥有 Linux 挂载的全部所有权。`_netdev` 选项是必需的,以便在网络正常后(例如重启后)挂载该挂载点,因为该挂载点需要网络来访问。 + +### 配置佳能软件 + +现在你已经创建了 Samba 共享,在服务器上进行了配置,并将该共享配置到 Linux 客户端上,你需要启动“佳能快速实用工具箱”来配置打印机。因为佳能没有为 Linux 发布工具箱,所以这一步需要 Windows。你可以尝试 [在 WINE 上运行它][6],但如果失败了,你就必须向别人借一台 Windows 电脑,或者在 [GNOME Boxes][8] 或 [VirtualBox][9] 中运行一个 [Windows 开发者虚拟机][7]。 + +打开打印机,然后启动佳能快速实用工具箱。它应该能找到你的打印机。如果不能看到你的打印机,你必须先将打印机配置为 LAN 或无线网络。 + +在工具箱中,点击“目标文件夹设置Destination Folder Settings”。 + +![Canon Quick Utility Toolbox][10] + +输入打印机管理密码。我的默认密码是 “canon”。 + +单击“添加Add”按钮。 + +![Add destination folder][12] + +在表格中填写“显示名Displayed Name”、“目标位置共享文件夹名称Shared Folder Name in Destination”,以及你的 Samba “域名/用户名Domain Name/User Name”和“密码Password”。 + +我把 “PIN 码PIN Code”留空,但如果你想要求每次从打印机扫描时都要输入 PIN 码,你可以设置一个。这在办公室里很有用,每个用户都有自己的 Samba 共享和 PIN 码来保护他们的扫描。 + +点击“连接测试Connection Test”来验证表格数据。 + +点击 “OK” 按钮。 + +点击 “注册到打印机Register to Printer”,将你的配置保存到打印机上。 + +![Register to Printer ][13] + +一切都设置好了。点击“退出Exit”。你现在已经完成了 Windows 的操作,可能还有工具箱,除非你需要改变什么。 + +### 开始扫描 + +你现在可以从打印机扫描,并从其 LCD 菜单中选择你的“目标文件夹”。扫描结果将直接保存到 Samba 共享中,你可以从你的 Linux 电脑上访问该共享。 + +为方便起见,用以下命令在你的 Linux 桌面或家目录上创建一个符号链接: + +``` +$ sudo ln -sd /mnt/MB2720-SCANS /home/tux/Desktop/MB2720-SCANS +``` + +这就是全部内容了! + +-------------------------------------------------------------------------------- + +via: https://opensource.com/article/21/4/linux-scan-samba + +作者:[Marc Skinner][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/marc-skinner +[b]: https://github.com/lujun9972 +[1]: https://opensource.com/sites/default/files/styles/image-full-size/public/lead-images/files_documents_paper_folder.png?itok=eIJWac15 (Files in a folder) +[2]: https://opensource.com/article/18/2/pivotal-moments-history-open-source +[3]: http://samba.org/ +[4]: https://en.wikipedia.org/wiki/Server_Message_Block +[5]: https://searchstorage.techtarget.com/definition/Common-Internet-File-System-CIFS +[6]: https://opensource.com/article/21/2/linux-wine +[7]: https://developer.microsoft.com/en-us/windows/downloads/virtual-machines/ +[8]: https://opensource.com/article/19/5/getting-started-gnome-boxes-virtualization +[9]: https://www.virtualbox.org/ +[10]: https://opensource.com/sites/default/files/uploads/canontoolbox.png (Canon Quick Utility Toolbox) +[11]: https://creativecommons.org/licenses/by-sa/4.0/ +[12]: https://opensource.com/sites/default/files/add_destination_folder.png (Add destination folder) +[13]: https://opensource.com/sites/default/files/uploads/canonregistertoprinter.png (Register to Printer ) diff --git a/published/202105/20210414 4 tips for context switching in Git.md b/published/202105/20210414 4 tips for context switching in Git.md new file mode 100644 index 0000000000..a557074975 --- /dev/null +++ b/published/202105/20210414 4 tips for context switching in Git.md @@ -0,0 +1,178 @@ +[#]: subject: (4 tips for context switching in Git) +[#]: via: (https://opensource.com/article/21/4/context-switching-git) +[#]: author: (Olaf Alders https://opensource.com/users/oalders) +[#]: collector: (lujun9972) +[#]: translator: (Chao-zhi) +[#]: reviewer: (wxy) +[#]: publisher: (wxy) +[#]: url: (https://linux.cn/article-13422-1.html) + +Git 中上下文切换的 4 种方式 +====== + +> 比较 Git 中四种切换分支的方法的优缺点。 + +![](https://img.linux.net.cn/data/attachment/album/202105/25/091803a6ww3r7yo32oxdzx.jpg) + +所有大量使用 Git 的人都会用到某种形式的上下文切换。有时这只会给你的工作流程增加少量的开销,但有时,这可能是一段痛苦的经历。 + +让我们用以下这个例子来讨论一些常见的上下文切换策略的优缺点: + +> 假设你在一个名为 `feature-X` 的分支中工作。你刚刚发现你需要解决一个无关的问题。这不能在 `feature-X` 分支中完成。你需要在一个新的分支 `feature-Y` 中完成这项工作。 + +### 方案 1:暂存 + 分支 + +解决此问题最常见的工作流程可能如下所示: + + 1. 停止分支 `feature-X` 上的工作 + 2. `git stash` + 3. `git checkout -b feature-Y origin/main` + 4. 一顿鼓捣,解决 `feature-Y` 的问题 + 5. `git checkout feature-X` 或 `git switch -` + 6. `git stash pop` + 7. 继续在 `feature-X` 中工作 + +**优点:** 这种方法的优点在于,对于简单的更改,这是一个相当简单的工作流程。它可以很好地工作,特别是对于小型仓库。 + +**缺点:** 使用此工作流程时,一次只能有一个工作区。另外,根据你的仓库的状态,使用暂存是一个麻烦的环节。 + +### 方案 2:WIP 提交 + 分支 + +这个解决方案和前一个非常相似,但是它使用 WIP(正在进行的工作Work in Progress)提交而不是暂存。当你准备好切换回来,而不是弹出暂存时,`git reset HEAD~1` 会展开 WIP 提交,你可以自由地继续,就像之前的方案一样,但不会触及暂存。 + + 1. 停止分支 `feature-X` 上的工作 + 2. `git add -u`(仅仅添加修改和删除的文件) + 3. `git commit -m "WIP"` + 4. `git checkout -b feature-Y origin/master` + 5. 一顿鼓捣,解决 `feature-Y` 的问题 + 6. `git checkout feature-X` 或 `git switch -` + 7. `git reset HEAD~1` + +**优点:** 对于简单的更改,这是一个简单的工作流,也适合于小型仓库。你不需要使用暂存。 + +**缺点:** 任何时候都只能有一个工作区。此外,如果你或你的代码审阅者不够谨慎,WIP 提交可能会合并到最终产品。 + +使用此工作流时,你**永远**不要想着将 `--hard` 添加到 `git reset`。如果你不小心这样做了,你应该能够使用 `git reflog` 恢复提交,但是你最好完全避免这种情况发生,否则你会听到心碎的声音。 + +### 方案 3:克隆一个新仓库 + +在这个解决方案中,不是创建新的分支,而是为每个新的功能分支创建存储库的新克隆。 + +**优点:** 你可以同时在多个工作区中工作。你不需要 `git stash` 或者是 WIP 提交。 + +**缺点:** 需要考虑仓库的大小,因为这可能会占用大量磁盘空间(浅层克隆可以帮助解决这种情况,但它们可能并不总是很合适。)此外,你的仓库克隆将互不可知。因为他们不能互相追踪,所以你必须手动追踪你的克隆的源仓库。如果需要 git 钩子,则需要为每个新克隆设置它们。 + +### 方案 4:git 工作树 + +要使用此解决方案,你可能需要了解 `git add worktree`。如果你不熟悉 Git 中的工作树,请不要难过。许多人多年来都对这个概念一无所知。 + +#### 什么是工作树? + +将工作树视为仓库中属于项目的文件。本质上,这是一种工作区。你可能没有意识到你已经在使用工作树了。开始使用 Git 时,你将自动获得第一个工作树。 + +``` +$ mkdir /tmp/foo && cd /tmp/foo +$ git init +$ git worktree list +/tmp  0000000 [master] +``` + +你可以在以上代码看到,甚至在第一次提交前你就有了一个工作树。接下来去尝试再添加一个工作树到你的项目中吧。 + +#### 添加一个工作树 + +想要添加一个新的工作树你需要提供: + + 1. 硬盘上的一个位置 + 2. 一个分支名 + 3. 添加哪些分支 + +``` +$ git clone https://github.com/oalders/http-browserdetect.git +$ cd http-browserdetect/ +$ git worktree list +/Users/olaf/http-browserdetect 90772ae [master] + +$ git worktree add ~/trees/oalders/feature-X -b oalders/feature-X origin/master +$ git worktree add ~/trees/oalders/feature-Y -b oalders/feature-Y e9df3c555e96b3f1 + +$ git worktree list +/Users/olaf/http-browserdetect 90772ae [master] +/Users/olaf/trees/oalders/feature-X 90772ae [oalders/feature-X] +/Users/olaf/trees/oalders/feature-Y e9df3c5 [oalders/feature-Y] +``` + +与大多数其他 Git 命令一样,你需要在仓库路径下使用此命令。一旦创建了工作树,就有了隔离的工作环境。Git 仓库会跟踪工作树在磁盘上的位置。如果 Git 钩子已经在父仓库中设置好了,那么它们也可以在工作树中使用。 + +请注意到,每个工作树只使用父仓库磁盘空间的一小部分。在这种情况下,工作树需要只大约三分之一的原始磁盘空间。这这非常适合进行扩展。如果你的仓库达到了千兆字节的级别,你就会真正体会到工作树对硬盘空间的节省。 + +``` +$ du -sh /Users/olaf/http-browserdetect +2.9M + +$ du -sh /Users/olaf/trees/oalders/feature-X +1.0M +``` + +**优点:** 你可以同时在多个工作区中工作。你不需要使用暂存。Git 会跟踪所有的工作树。你不需要设置 Git 钩子。这也比 `git clone` 更快,并且可以节省网络流量,因为你可以在飞行模式下执行此操作。你还可以更高效地使用磁盘空间,而无需借助于浅层克隆。 + +**缺点:** 这是个需要你额外学习和记忆的新东西,但是如果你能养成使用这个功能的习惯,它会给你丰厚的回报。 + +#### 额外的小技巧 + +有很多方式可以清除工作树,最受欢迎的方式是使用 Git 来移除工作树: + +``` +git worktree remove /Users/olaf/trees/oalders/feature-X +``` + +如果你喜欢 RM 大法,你也可以用 `rm -rf` 来删除工作树。 + +``` +rm -rf /Users/olaf/trees/oalders/feature-X +``` + +但是,如果执行此操作,则可能需要使用 `git worktree prune` 清理所有剩余的文件。或者你现在可以跳过清理,这将在将来的某个时候通过 `git gc` 自行完成。 + +#### 注意事项 + +如果你准备尝试 `git worktree`,请记住以下几点: + +* 删除工作树并不会删除该分支。 +* 可以在工作树中切换分支。 +* 你不能在多个工作树中同时签出同一个分支。 +* 像其他命令一样,`git worktree` 需要从仓库内运行。 +* 你可以同时拥有许多工作树。 +* 要从同一个本地仓库签出创建工作树,否则它们将互不可知。 + +#### git rev-parse + +最后一点注意:在使用 `git worktree` 时,仓库根所在的位置可能取决于上下文。幸运的是,`git rev parse` 可以让你区分这两者。 + +* 要查找父仓库的根目录,请执行以下操作: + ``` + git rev-parse --git-common-dir + ``` +* 要查找你当前所在仓库的根目录,请执行: + ``` + git rev-parse --show-toplevel + ``` + +### 根据你的需要选择最好的方法 + +就像很多事情一样,TIMTOWDI(条条大道通罗马there's more than one way to do it)。重要的是你要找到一个适合你需要的工作流程。你的需求可能因手头的问题而异。也许你偶尔会发现自己将 `git worktree` 作为版本控制工具箱中的一个方便工具。 + +-------------------------------------------------------------------------------- + +via: https://opensource.com/article/21/4/context-switching-git + +作者:[Olaf Alders][a] +选题:[lujun9972][b] +译者:[Chao-zhi](https://github.com/Chao-zhi) +校对:[wxy](https://github.com/wxy) + +本文由 [LCTT](https://github.com/LCTT/TranslateProject) 原创编译,[Linux中国](https://linux.cn/) 荣誉推出 + +[a]: https://opensource.com/users/oalders +[b]: https://github.com/lujun9972 +[1]: https://opensource.com/sites/default/files/styles/image-full-size/public/lead-images/browser_screen_windows_files.png?itok=kLTeQUbY (Computer screen with files or windows open) diff --git a/published/202105/20210416 Metro Exodus is Finally Here on Steam for Linux.md b/published/202105/20210416 Metro Exodus is Finally Here on Steam for Linux.md new file mode 100644 index 0000000000..6a70a602d6 --- /dev/null +++ b/published/202105/20210416 Metro Exodus is Finally Here on Steam for Linux.md @@ -0,0 +1,61 @@ +[#]: subject: (Metro Exodus is Finally Here on Steam for Linux) +[#]: via: (https://news.itsfoss.com/metro-exodus-steam/) +[#]: author: (Asesh Basu https://news.itsfoss.com/author/asesh/) +[#]: collector: (lujun9972) +[#]: translator: (alim0x) +[#]: reviewer: (wxy) +[#]: publisher: (wxy) +[#]: url: (https://linux.cn/article-13370-1.html) + +《地铁:离去》终于来到了 Steam for Linux +====== + +> 在其他平台上推出后,《地铁:离去》正式登陆 Linux/GNU 平台。准备好体验最好的射击游戏之一了吗? + +![](https://i0.wp.com/news.itsfoss.com/wp-content/uploads/2021/04/metro-exodus-linux.png?w=1200&ssl=1) + +《地铁:离去Metro Exodus》是一款长久以来深受粉丝喜爱的游戏,现在终于来到了 Linux 平台。在超过两年的漫长等待之后,Linux 用户终于可以上手《地铁》三部曲的第三部作品。虽然先前已经有一些非官方移植的版本,但这个版本是 4A Games 发布的官方版本。 + +《地铁:离去》是一款第一人称射击游戏,拥有华丽的光线跟踪画面,故事背景设置在横跨俄罗斯广阔土地的荒野之上。这条精彩的故事线横跨了从春、夏、秋到核冬天的整整一年。游戏结合了快节奏的战斗和隐身以及探索和生存,可以轻而易举地成为 Linux 中最具沉浸感的游戏之一。 + +### 我的 PC 可以运行它吗? + +作为一款图形计算密集型游戏,你得有像样的硬件来运行以获得不错的帧率。这款游戏重度依赖光线追踪来让画面看起来更棒。 + +运行游戏的最低要求需要 **Intel Core i5 4400**、**8 GB** 内存,以及最低 **NVIDIA GTX670** 或 **AMD Radeon R9 380** 的显卡。推荐配置是 **Intel Core i7 4770K** 搭配 **GTX1070** 或 **RX 5500XT**。 + +这是开发者提及的官方配置清单: + +![][1] + +《地铁:离去》是付费游戏,你需要花费 39.99 美元来获取这个最新最棒的版本。 + +如果你在游玩的时候遇到持续崩溃的情况,检查一下你的显卡驱动以及 Linux 内核版本。有人反馈了一些相关的问题,但不是普遍性的问题。 + +### 从哪获取游戏? + +Linux 版本的游戏可以从 [Steam][2] for Linux 获取。如果你已经购买了游戏,它会自动出现在你的 Steam for Linux 游戏库内。 + +- [Metro Exodus (Steam)][2] + +如果你还没有安装 Steam,你可以参考我们的教程:[在 Ubuntu 上安装 Steam][3] 和 [在 Fedora 上安装 Steam][4]。 + +你的 Steam 游戏库中已经有《地铁:离去》了吗?准备购买一份吗?可以在评论区写下你的想法。 + +-------------------------------------------------------------------------------- + +via: https://news.itsfoss.com/metro-exodus-steam/ + +作者:[Asesh Basu][a] +选题:[lujun9972][b] +译者:[alim0x](https://github.com/alim0x) +校对:[校对者ID](https://github.com/校对者ID) + +本文由 [LCTT](https://github.com/LCTT/TranslateProject) 原创编译,[Linux中国](https://linux.cn/) 荣誉推出 + +[a]: https://news.itsfoss.com/author/asesh/ +[b]: https://github.com/lujun9972 +[1]: https://i1.wp.com/news.itsfoss.com/wp-content/uploads/2021/04/METRO-EXODUS-LINUX-System-Requirements.jpg?w=1454&ssl=1 +[2]: https://store.steampowered.com/app/412020/Metro_Exodus/ +[3]: https://itsfoss.com/install-steam-ubuntu-linux/ +[4]: https://itsfoss.com/install-steam-fedora/ diff --git a/published/202105/20210416 Play a fun math game with Linux commands.md b/published/202105/20210416 Play a fun math game with Linux commands.md new file mode 100644 index 0000000000..64cdaf210d --- /dev/null +++ b/published/202105/20210416 Play a fun math game with Linux commands.md @@ -0,0 +1,199 @@ +[#]: subject: (Play a fun math game with Linux commands) +[#]: via: (https://opensource.com/article/21/4/math-game-linux-commands) +[#]: author: (Jim Hall https://opensource.com/users/jim-hall) +[#]: collector: (lujun9972) +[#]: translator: (geekpi) +[#]: reviewer: (wxy) +[#]: publisher: (wxy) +[#]: url: (https://linux.cn/article-13358-1.html) + +用 Linux 命令玩一个有趣的数学游戏 +====== + +> 在家玩流行的英国游戏节目 “Countdown” 中的数字游戏。 + +![](https://img.linux.net.cn/data/attachment/album/202105/03/221459uchb0f8xcxfrhc86.jpg) + +像许多人一样,我在大流行期间看了不少新的电视节目。我最近发现了一个英国的游戏节目,叫做 [Countdown][2],参赛者在其中玩两种游戏:一种是 _单词_ 游戏,他们试图从杂乱的字母中找出最长的单词;另一种是 _数字_ 游戏,他们从随机选择的数字中计算出一个目标数字。因为我喜欢数学,我发现自己被数字游戏所吸引。 + +数字游戏可以为你的下一个家庭游戏之夜增添乐趣,所以我想分享我自己的一个游戏变体。你以一组随机数字开始,分为 1 到 10 的“小”数字和 15、20、25,以此类推,直到 100 的“大”数字。你从大数字和小数字中挑选六个数字的任何组合。 + +接下来,你生成一个 200 到 999 之间的随机“目标”数字。然后用你的六个数字进行简单的算术运算,尝试用每个“小”和“大”数字计算出目标数字,但使用不能超过一次。如果你能准确地计算出目标数字,你就能得到最高分,如果距离目标数字 10 以内就得到较低的分数。 + +例如,如果你的随机数是 75、100、2、3、4 和 1,而你的目标数是 505,你可以说 `2+3=5`,`5×100=500`,`4+1=5`,以及 `5+500=505`。或者更直接地:`(2+3)×100 + 4 + 1 = 505`。 + +### 在命令行中随机化列表 + +我发现在家里玩这个游戏的最好方法是从 1 到 10 的池子里抽出四个“小”数字,从 15 到 100 的 5 的倍数中抽出两个“大”数字。你可以使用 Linux 命令行来为你创建这些随机数。 + +让我们从“小”数字开始。我希望这些数字在 1 到 10 的范围内。你可以使用 Linux 的 `seq` 命令生成一个数字序列。你可以用几种不同的方式运行 `seq`,但最简单的形式是提供序列的起始和结束数字。要生成一个从 1 到 10 的列表,你可以运行这个命令: + +``` +$ seq 1 10 +1 +2 +3 +4 +5 +6 +7 +8 +9 +10 +``` + +为了随机化这个列表,你可以使用 Linux 的 `shuf`(“shuffle”,打乱)命令。`shuf` 将随机化你给它的东西的顺序,通常是一个文件。例如,如果你把 `seq` 命令的输出发送到 `shuf` 命令,你会收到一个 1 到 10 之间的随机数字列表: + +``` +$ seq 1 10 | shuf +3 +6 +8 +10 +7 +4 +5 +2 +1 +9 +``` + +要从 1 到 10 的列表中只选择四个随机数,你可以将输出发送到 `head` 命令,它将打印出输入的前几行。使用 `-4` 选项来指定 `head` 只打印前四行: + +``` +$ seq 1 10 | shuf | head -4 +6 +1 +8 +4 +``` + +注意,这个列表与前面的例子不同,因为 `shuf` 每次都会生成一个随机顺序。 + +现在你可以采取下一步措施来生成“大”数字的随机列表。第一步是生成一个可能的数字列表,从 15 开始,以 5 为单位递增,直到达到 100。你可以用 Linux 的 `seq` 命令生成这个列表。为了使每个数字以 5 为单位递增,在 `seq` 命令中插入另一个选项来表示 _步进_: + +``` +$ seq 15 5 100 +15 +20 +25 +30 +35 +40 +45 +50 +55 +60 +65 +70 +75 +80 +85 +90 +95 +100 +``` + +就像以前一样,你可以随机化这个列表,选择两个“大”数字: + +``` +$ seq 15 5 100 | shuf | head -2 +75 +40 +``` + +### 用 Bash 生成一个随机数 + +我想你可以用类似的方法从 200 到 999 的范围内选择游戏的目标数字。但是生成单个随机数的最简单的方案是直接在 Bash 中使用 `RANDOM` 变量。当你引用这个内置变量时,Bash 会生成一个大的随机数。要把它放到 200 到 999 的范围内,你需要先把随机数放到 0 到 799 的范围内,然后加上 200。 + +要把随机数放到从 0 开始的特定范围内,你可以使用**模数**算术运算符。模数计算的是两个数字相除后的 _余数_。如果我用 801 除以 800,结果是 1,余数是 1(模数是 1)。800 除以 800 的结果是 1,余数是 0(模数是 0)。而用 799 除以 800 的结果是 0,余数是 799(模数是 799)。 + +Bash 通过 `$(())` 结构支持算术展开。在双括号之间,Bash 将对你提供的数值进行算术运算。要计算 801 除以 800 的模数,然后加上 200,你可以输入: + +``` +$ echo $(( 801 % 800 + 200 )) +201 +``` + +通过这个操作,你可以计算出一个 200 到 999 之间的随机目标数: + +``` +$ echo $(( RANDOM % 800 + 200 )) +673 +``` + +你可能想知道为什么我在 Bash 语句中使用 `RANDOM` 而不是 `$RANDOM`。在算术扩展中, Bash 会自动扩展双括号内的任何变量. 你不需要在 `$RANDOM` 变量上的 `$` 来引用该变量的值, 因为 Bash 会帮你做这件事。 + +### 玩数字游戏 + +让我们把所有这些放在一起,玩玩数字游戏。产生两个随机的“大”数字, 四个随机的“小”数值,以及目标值: + +``` +$ seq 15 5 100 | shuf | head -2 +75 +100 +$ seq 1 10 | shuf | head -4 +4 +3 +10 +2 +$ echo $(( RANDOM % 800 + 200 )) +868 +``` + +我的数字是 **75**、**100**、**4**、**3**、**10** 和 **2**,而我的目标数字是 **868**。 + +如果我用每个“小”和“大”数字做这些算术运算,并不超过一次,我就能接近目标数字了: + +``` +10×75 = 750 +750+100 = 850 + +然后: + +4×3 = 12 +850+12 = 862 +862+2 = 864 +``` + +只相差 4 了,不错!但我发现这样可以用每个随机数不超过一次来计算出准确的数字: + +``` +4×2 = 8 +8×100 = 800 + +然后: + +75-10+3 = 68 +800+68 = 868 +``` + +或者我可以做 _这些_ 计算来准确地得到目标数字。这只用了六个随机数中的五个: + +``` +4×3 = 12 +75+12 = 87 + +然后: + +87×10 = 870 +870-2 = 868 +``` + +试一试 _Countdown_ 数字游戏,并在评论中告诉我们你做得如何。 + +-------------------------------------------------------------------------------- + +via: https://opensource.com/article/21/4/math-game-linux-commands + +作者:[Jim Hall][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/jim-hall +[b]: https://github.com/lujun9972 +[1]: https://opensource.com/sites/default/files/styles/image-full-size/public/lead-images/edu_math_formulas.png?itok=B59mYTG3 (Math formulas in green writing) +[2]: https://en.wikipedia.org/wiki/Countdown_%28game_show%29 diff --git a/published/202105/20210417 How to Download Ubuntu via Torrent -Absolute Beginner-s Tip.md b/published/202105/20210417 How to Download Ubuntu via Torrent -Absolute Beginner-s Tip.md new file mode 100644 index 0000000000..d4228a0c9d --- /dev/null +++ b/published/202105/20210417 How to Download Ubuntu via Torrent -Absolute Beginner-s Tip.md @@ -0,0 +1,81 @@ +[#]: subject: (How to Download Ubuntu via Torrent [Absolute Beginner’s Tip]) +[#]: via: (https://itsfoss.com/download-ubuntu-via-torrent/) +[#]: author: (Abhishek Prakash https://itsfoss.com/author/abhishek/) +[#]: collector: (lujun9972) +[#]: translator: (geekpi) +[#]: reviewer: (wxy) +[#]: publisher: (wxy) +[#]: url: (https://linux.cn/article-13386-1.html) + +初级:如何通过 Torrent 下载 Ubuntu +====== + +![](https://img.linux.net.cn/data/attachment/album/202105/13/094313jdukww0zkli78hpg.jpg) + +下载 Ubuntu 是非常直接简单的。你可以去它的 [官方网站][1],点击 [桌面下载部分][2],选择合适的 Ubuntu 版本并点击下载按钮。 + +![][3] + +Ubuntu 是以一个超过 2.5GB 大小的单一镜像形式提供的。直接下载对于拥有高速网络连接的人来说效果很好。 + +然而,如果你的网络连接很慢或不稳定,你将很难下载这样一个大文件。在这个过程中,下载可能会中断几次,或者可能需要几个小时。 + +![Direct download may take several hours for slow internet connections][4] + +### 通过 Torrent 下载 Ubuntu + +如果你也困扰于受限数据或网络连接过慢,使用下载管理器或 torrent 将是一个更好的选择。我不打算在这个快速教程中讨论什么是 torrent。你只需要知道,通过 torrent,你可以在多个会话内下载一个大文件。 + +好的是,Ubuntu 实际上提供了通过 torrent 的下载。不好的是,它隐藏在网站上,如果你不熟悉它,很难猜到在哪。 + +如果你想通过 torrent 下载 Ubuntu,请到你所选择的 Ubuntu 版本中寻找**其他下载方式**。 + +![][5] + +点击这个“**alternative downloads and torrents**” 链接,它将打开一个新的网页。**在这个页面向下滚动**,看到 BitTorrent 部分。你会看到下载所有可用版本的 torrent 文件的选项。如果你要在你的个人电脑或笔记本电脑上使用 Ubuntu,你应该选择桌面版本。 + +![][6] + +阅读 [这篇文章以获得一些关于你应该使用哪个 Ubuntu 版本的指导][7]。考虑到你要使用这个发行版,了解 [Ubuntu LTS 和非 LTS 版本会有所帮助][8]。 + +#### 你是如何使用下载的 torrent 文件来获取 Ubuntu 的? + +我推测你知道如何使用 torrent。如果没有,让我为你快速总结一下。 + +你已经下载了一个几 KB 大小的 .torrent 文件。你需要下载并安装一个 Torrent 应用,比如 uTorrent 或 Deluge 或 BitTorrent。 + +我建议在 Windows 上使用 [uTorrent][9]。如果你使用的是某个 Linux 发行版,你应该已经有一个 [像 Transmission 这样的 torrent 客户端][10]。如果没有,你可以从你的发行版的软件管理器中安装它。 + +当你安装了 Torrent 应用,运行它。现在拖放你从 Ubuntu 网站下载的 .torrent 文件。你也可以使用菜单中的打开选项。 + +当 torrent 文件被添加到 Torrent 应用中,它就开始下载该文件。如果你关闭了系统,下载就会暂停。再次启动 Torrent 应用,下载就会从同一个地方恢复。 + +当下载 100% 完成后,你可以用它来 [全新安装 Ubuntu][11] 或 [与 Windows 双启动][12]。 + +享受 Ubuntu :) + +-------------------------------------------------------------------------------- + +via: https://itsfoss.com/download-ubuntu-via-torrent/ + +作者:[Abhishek Prakash][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/abhishek/ +[b]: https://github.com/lujun9972 +[1]: https://ubuntu.com +[2]: https://ubuntu.com/download/desktop +[3]: https://i2.wp.com/itsfoss.com/wp-content/uploads/2021/04/download-ubuntu.png?resize=800%2C325&ssl=1 +[4]: https://i2.wp.com/itsfoss.com/wp-content/uploads/2021/04/slow-direct-download-ubuntu.png?resize=800%2C365&ssl=1 +[5]: https://i1.wp.com/itsfoss.com/wp-content/uploads/2021/04/ubuntu-torrent-download.png?resize=800%2C505&ssl=1 +[6]: https://i1.wp.com/itsfoss.com/wp-content/uploads/2021/04/ubuntu-torrent-download-option.png?resize=800%2C338&ssl=1 +[7]: https://itsfoss.com/which-ubuntu-install/ +[8]: https://itsfoss.com/long-term-support-lts/ +[9]: https://www.utorrent.com/ +[10]: https://itsfoss.com/best-torrent-ubuntu/ +[11]: https://itsfoss.com/install-ubuntu/ +[12]: https://itsfoss.com/install-ubuntu-1404-dual-boot-mode-windows-8-81-uefi/ diff --git a/published/202105/20210419 21 reasons why I think everyone should try Linux.md b/published/202105/20210419 21 reasons why I think everyone should try Linux.md new file mode 100644 index 0000000000..d21535f086 --- /dev/null +++ b/published/202105/20210419 21 reasons why I think everyone should try Linux.md @@ -0,0 +1,167 @@ +[#]: subject: (21 reasons why I think everyone should try Linux) +[#]: via: (https://opensource.com/article/21/4/linux-reasons) +[#]: author: (Seth Kenlon https://opensource.com/users/seth) +[#]: collector: (lujun9972) +[#]: translator: (ShuyRoy) +[#]: reviewer: (wxy) +[#]: publisher: (wxy) +[#]: url: (https://linux.cn/article-13404-1.html) + +每个人都应该尝试 Linux 的 21 个理由 +====== + +> 游戏、交易、预算、艺术、编程等等,这些都只是任何人都可以使用 Linux 的众多方式中的一种。 + +![](https://img.linux.net.cn/data/attachment/album/202105/19/111929by99711lq1iuz7y1.jpg) + +当我在度假时,我经常会去一家或者多家的二手书店。我经常能够找到我想读的一本好书,而且我总是以 “我在度假;我应该用这本书来犒劳自己” 来为不可避免的购买行为辩护。这很有效,我用这种方式获得了一些我最喜欢的书。但是,买一本好书在生活中很常见,这个理由经不起推敲。事实上,我不需要为买一本好书来找理由。事情都是这样的,我可以在任何时候做我想做的事。但不知何故,有一个理由似乎确实能让这个过程更有趣。 + +在我的日常生活中,我会收到很多关于 Linux 的问题。有时候我会不自觉地滔滔不绝地讲述开源软件的历史,或者共享资源的知识和利益。有时候,我会设法提到一些我喜欢的 Linux 上的特性,然后对这些好处进行逆向工程以便它们可以在其它的操作系统上享用。这些讨论经常是有趣且有益的,但只有一个问题:这些讨论都没有回答大家真正要问的问题。 + +当一个人问你关于 Linux 的问题时,他们经常希望你能够给他们一些使用 Linux 的理由。当然,也有例外。从来没有听过“Linux”的人们可能会问一些字面定义。但是当你的朋友或者同事吐露出他们对当前的操作系统有些不满意的时候,解释一下你为什么喜欢 Linux 可能更好,而不是告诉他们为什么 Linux 是一个比专有系统更好的选择。换句话说,你不需要销售演示,你需要的是度假照片(如果你是个书虫的话,也可以是度假时买的一本书)。 + +为了达到这个目的,下面是我喜欢 Linux 的 21 个原因,分别在 21 个不同的场合讲给 21 个不同的人。 + +### 游戏 + +![Gaming on Linux][2] + +说到玩电脑,最明显的活动之一就是玩游戏,说到玩游戏,我很喜欢。我很高兴花一个晚上玩一个 8 位的益智游戏或者 epic 工作室的一个 AAA 级游戏。其它时候,我还会沉浸在棋盘游戏或者角色扮演游戏(RPG)中。 + +这些我都是 [在 Linux 系统的电脑上做的][4]。 + +### 办公 + +![LibreOffice][5] + +一种方法并不适合所有人。这对帽子和办公室工作来说都是如此。看到同事们被困在一个不适合他们的单一工作流程中,我感到很痛苦,我喜欢 Linux 鼓励用户找到他们喜欢的工具。我曾使用过的应用大到套件(例如 LibreOffice 和 OpenOffice),小到轻量级文字处理器(如 Abiword),再到最小的文本编辑器(利用 Pandoc 进行转换)。 + +不管我周围的用户被限制在什么范围内,我都可以 [自由地使用可以在我的电脑上工作的最好的工具][6],并且以我希望的方式工作。 + +### 选择 + +![Linux login screen][7] + +开源最有价值的特性之一是用户在使用这些软件的时候是可以信任它的。这种信任来自于好友网络,他们可以阅读他们所使用的应用程序和操作系统的源代码。也就是说,即使你不知道源代码的好坏,你也可以在 [开源社区][8] 中结交一些知道的朋友。这些都是 Linux 用户在探索他们运行的发行版时建立的重要联系。如果你不信任构建和维护的发行版的社区,你可以去找其它的发行版。我们都是这样做的,这是有许多发行版可供选择的优势之一。 + +[Linux 提供了可选择的特性][9]。一个强大的社区,充满了真实的人际关系,结合 Linux 提供的选择自由,所有这些都让用户对他们运行的软件有信心。因为我读过一些源码,也因为我信任哪些维护我没读过的代码的人,[所以我信任 Linux][10]。 + +### 预算 + +![Skrooge][11] + +做预算并不有趣,但是很重要。我很早就认识到,在业余时间做一些不起眼的工作,就像我学会了一种 _免费_ 的操作系统(Linux!)一样。预算不是为了追踪你的钱,而是为了追踪你的习惯。这意味着无论你是靠薪水生活,还是正在计划退休,你都应该 [保持预算][12]。 + +如果你在美国,你甚至可以 [用 Linux 来交税][13]。 + +### 艺术 + +![MyPaint][14] + +不管你是画画还是做像素艺术、[编辑视频][15] 还是随性记录,你都可以在 Linux 上创建出色的内容。我所见过的一些最优秀的艺术作品都是使用一些非“行业标准”的工具随意创作出来的,并且你可能会惊讶于你所看到的许多内容都是基于同样的方式创造出来的。Linux 是一个不会被宣扬的引擎,但它是具有强大功能的引擎,驱动着独立艺术家和大型制作人。 + +尝试使用 Linux 来 [创作一些艺术作品][16]。 + +### 编程 + +![NetBeans][17] + +听着,用 Linux 来编程几乎是定论。仅次于服务器管理,开源和 Linux 是一个明显的组合。这其中有 [许多原因][18],但我这里给出了一个有趣的原因。我在发明新东西时遇到了很多障碍,所以我最不希望的就是操作系统或者软件工具开发包(SDK)成为失败的原因。在 Linux 上,我可以访问一切,字面意义上的一切。 + +### 封包 + +![Packaging GNOME software][19] + +当他们在谈编程的时候,没有人谈封包。作为一个开发者,你必须将你的代码提供给您的用户,否则你将没有任何用户。Linux 使得开发人员可以轻松地 [发布应用程序][20],用户也可以轻松地 [安装这些应用程序][21]。 + +令很多人感到惊讶的是 [Linux 可以像运行本地程序一样运行许多 Windows 应用程序][22]。你不应该期望一个 Windows 应用可以在 Linux 上执行。不过,许多主要的通用应用要么已经在 Linux 上原生存在,要么可以通过名为 Wine 的兼容层运行。 + + +### 技术 + +![Data center][23] + +如果你正在找一份 IT 工作,Linux 是很好的第一步。作为一个曾经为了更快地渲染视频而误入 Linux 的前艺术系学生,我说的是经验之谈。 + +尖端技术发生在 Linux 上。Linux 驱动着大部分的互联网、世界上最快的超级计算机以及云本身。现在,Linux 驱动着 [边缘计算][26],将云数据中心的能力与分散的节点相结合,以实现快速响应。 + +不过,你不需要从最顶层开始。你可以学习在笔记本电脑或者台式机上[自动][27]完成任务,并通过一个 [好的终端][28] 远程控制系统。 + +Linux 对你的新想法是开放的,并且 [可以进行定制][29]。 + +### 分享文件 + +![Beach with cloudy sky][30] + +无论你是一个新手系统管理员,还是仅仅是要将一个将文件分发给室友,Linux 都可以使 [文件共享变得轻而易举][31]。 + +### 多媒体 + +![Waterfall][32] + +在所有关于编程和服务器的讨论中,人们有时把 Linux 想象成一个充满绿色的 1 和 0 的黑屏。对于我们这些使用它的人来说,Linux 也能 [播放你所有的媒体][33],这并不令人惊讶。 + +### 易于安装 + +![CentOS installation][34] + +以前从来没有安装过操作系统吗?Linux 非常简单。一步一步来,Linux 安装程序会手把手带你完成操作系统的安装,让你在一个小时内感觉到自己是个电脑专家。 + +[来安装 Linux 吧][35]! + +### 试一试 Linux + +![Porteus][36] + +如果你还没有准备好安装 Linux,你可以 _试一试_ Linux。不知道如何开始?它没有你想象的那么吓人。这里给了一些你 [一开始需要考虑的事情][37]。然后选择下载一个发行版,并想出你自己使用 Linux 的 21 个理由。 + +-------------------------------------------------------------------------------- + +via: https://opensource.com/article/21/4/linux-reasons + +作者:[Seth Kenlon][a] +选题:[lujun9972][b] +译者:[ShuyRoy](https://github.com/ShuyRoy) +校对:[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/linux_keyboard_desktop.png?itok=I2nGw78_ (Linux keys on the keyboard for a desktop computer) +[2]: https://opensource.com/sites/default/files/uploads/game_0ad-egyptianpyramids.jpg (Gaming on Linux) +[3]: https://creativecommons.org/licenses/by-sa/4.0/ +[4]: https://opensource.com/article/21/2/linux-gaming +[5]: https://opensource.com/sites/default/files/uploads/office_libreoffice.jpg (LibreOffice) +[6]: https://linux.cn/article-13133-1.html +[7]: https://opensource.com/sites/default/files/uploads/trust_sddm.jpg (Linux login screen) +[8]: https://opensource.com/article/21/2/linux-community +[9]: https://linux.cn/article-13284-1.html +[10]: https://opensource.com/article/21/2/open-source-security +[11]: https://opensource.com/sites/default/files/uploads/skrooge_1.jpg (Skrooge) +[12]: https://opensource.com/article/21/2/linux-skrooge +[13]: https://opensource.com/article/21/2/linux-tax-software +[14]: https://opensource.com/sites/default/files/uploads/art_mypaint.jpg (MyPaint) +[15]: https://opensource.com/article/21/2/linux-python-video +[16]: https://linux.cn/article-13157-1.html +[17]: https://opensource.com/sites/default/files/uploads/programming_java-netbeans.jpg (NetBeans) +[18]: https://opensource.com/article/21/2/linux-programming +[19]: https://opensource.com/sites/default/files/uploads/packaging_gnome-software.png (Packaging GNOME software) +[20]: https://opensource.com/article/21/2/linux-packaging +[21]: https://linux.cn/article-13160-1.html +[22]: https://opensource.com/article/21/2/linux-wine +[23]: https://opensource.com/sites/default/files/uploads/edge_taylorvick-unsplash.jpg (Data center) +[24]: https://unsplash.com/@tvick +[25]: https://unsplash.com/license +[26]: https://opensource.com/article/21/2/linux-edge-computing +[27]: https://opensource.com/article/21/2/linux-automation +[28]: https://linux.cn/article-13186-1.html +[29]: https://opensource.com/article/21/2/linux-technology +[30]: https://opensource.com/sites/default/files/uploads/cloud_beach-sethkenlon.jpg (Beach with cloudy sky) +[31]: https://linux.cn/article-13192-1.html +[32]: https://opensource.com/sites/default/files/uploads/media_waterfall.jpg (Waterfall) +[33]: https://opensource.com/article/21/2/linux-media-players +[34]: https://opensource.com/sites/default/files/uploads/install_centos8.jpg (CentOS installation) +[35]: https://linux.cn/article-13164-1.html +[36]: https://opensource.com/sites/default/files/uploads/porteus_0.jpg (Porteus) +[37]: https://opensource.com/article/21/2/try-linux diff --git a/published/202105/20210420 5 ways to protect your documents with open source software.md b/published/202105/20210420 5 ways to protect your documents with open source software.md new file mode 100644 index 0000000000..ec773ff7b5 --- /dev/null +++ b/published/202105/20210420 5 ways to protect your documents with open source software.md @@ -0,0 +1,145 @@ +[#]: subject: (5 ways to protect your documents with open source software) +[#]: via: (https://opensource.com/article/21/4/secure-documents-open-source) +[#]: author: (Ksenia Fedoruk https://opensource.com/users/ksenia-fedoruk) +[#]: collector: (lujun9972) +[#]: translator: (wxy) +[#]: reviewer: (wxy) +[#]: publisher: (wxy) +[#]: url: (https://linux.cn/article-13428-1.html) + +用开源软件保护你的文件的 5 种方法 +====== + +> 控制你自己的数据,使未经授权的用户无法访问它。 + +![](https://img.linux.net.cn/data/attachment/album/202105/27/000829h3fcdd9b6p9v9xx9.jpg) + +用户完全有权利关心他们数据的安全和保障。当你在计算机上创建数据时,希望对其进行独家控制是合理的。 + +有许多方法保护你的文件。在文件系统层面,你可以 [加密你的硬盘][2] 或 [只是加密一个文件][3]。不过,一个好的办公套件为你提供了更多的选择,我收集了五种我用开源软件保护文件的方法。 + +### 5 种保护你的文件的方法 + +#### 1、将文件保存在安全的云存储服务中 + +自托管一个开源的内容管理系统(CMS)平台可以让你完全控制你的数据。你的所有数据都留在你的服务器上,你可以控制谁可以访问它。 + +**选项:** [Nextcloud][4]、[ownCloud][5]、[Pydio][6] 和 [Seafile][7] + +所有这些都提供了存储、同步和共享文件和文件夹、管理内容、文件版本等功能。它们可以很容易地取代 Dropbox、Google Drive 和其他专有的云存储,不用将你的数据放在你不拥有、不维护、不管理的服务器上。 + +上面列出的开源的自托管方式符合 GDPR 和其他保护用户数据的国际法规。它们提供备份和数据恢复选项、审计和监控工具、权限管理和数据加密。 + +![Pydio 审计控制][8] + +*Pydio 细胞中的审计控制。(来源:[Pydio.com][9])* + +#### 2、启用静态、传输和端到端的加密功能 + +我们经常笼统地谈论数据加密,但在加密文件时有几个方面需要考虑: + + * 通过**静态加密**(或磁盘加密),你可以保护存储在你的基础设施内或硬盘上的数据。 + * 在使用 HTTPS 等协议时,**传输加密**会保护流量形式的数据。它可以保护你的数据在从一个地方移动到另一个地方时不被拦截和转换。当你把文件上传到你的云端时,这很重要。 + * **端到端加密**(E2EE)通过在一端加密,在另一端解密来保护数据。除非有解密密钥,否则任何第三方都无法读取你的文件,即使他们干扰了这个过程并获得了这个文件的权限。 + +**选项:** CryptPad、ownCloud、ONLYOFFICE 工作区、Nextcloud 和 Seafile + +ownCloud、ONLYOFFICE 工作区、Nextcloud 和 Seafile 支持所有三层的加密。但它们在实现端到端加密的方式上有所不同。 + + * 在 ownCloud 中,有一个 E2EE 插件,允许你对文件夹共享进行加密。 + * 在 Nextcloud 中,桌面客户端有一个文件夹级别的选项。 + * Seafile 通过创建加密库来提供客户端的 E2EE。 + * [ONLYOFFICE 工作区][10] 不仅允许你在存储和共享文件时对其进行加密,而且还允许你在“私人房间”中实时安全地共同编辑文件。加密数据是自动生成和传输的,并且是自己加密的 —— 你不需要保留或记住任何密码。 + * 正如其名称所示,[CryptPad][11] 是完全私有的。所有的内容都是由你的浏览器进行加密和解密的。这意味着文件、聊天记录和文件在你登录的会话之外是无法阅读的。即使是服务管理员也无法得到你的信息。 + +![加密的 CryptPad 存储][12] + +*加密的 CryptPad 存储。(来源:[Cryptpad.fr][13])* + +#### 3、使用数字签名 + +数字签名可以让你验证你是文件内容的原作者,并且没有对其进行过修改。 + +**选项:** LibreOffice Writer、ONLYOFFICE 桌面编辑器、OpenESignForms 和 SignServer + +[LibreOffice][14] 和 [ONLYOFFICE][15] 套件提供了一个对文件数字签名的集成工具。你可以添加一个在文档文本中可见的签名行,并允许你向其他用户请求签名。 + +一旦你应用了数字签名,任何人都不能编辑该文件。如果有人修改文档,签名就会失效,这样你就会知道内容被修改了。 + +在 ONLYOFFICE 中,你可以在 LibreOffice 中签名 OOXML 文件(例如,DOCX、XLSX、PPTX)作为 ODF 和 PDF。如果你试图在 LibreOffice 中签名一个 OOXML 文件,该签名将被标记为“只有部分文件被签署”。 + +![ONLYOFFICE 中的数字签名][16] + +*ONLYOFFICE 中的数字签名。 (来源:[ONLYOFFICE帮助中心][17])* + +[SignServer][18] 和 [Open eSignForms][19] 是免费的电子签名服务,如果你不需要在编辑器中直接签名文件,你可以使用它们。这两个工具都可以让你处理文档,SignServer 还可以让你签名包括 Java 在内的代码,并应用时间戳。 + +#### 4、添加水印 + +水印可避免你的内容在未经授权的情况下被重新分发,并保护你的文件可能包含的任何机密信息。 + +**选项:**Nextcloud 中的 Collabora Online 或 ONLYOFFICE Docs + +当与 Nextcloud 集成时,[ONLYOFFICE Docs][20] 和 [Collabora][21] 允许你在文件、电子表格和演示文稿中嵌入水印。要激活水印功能,必须以管理员身份登录你的 Nextcloud 实例,并在解决方案的设置页面上进入**安全视图设置**。 + +你可以使用占位符将默认的水印替换成你自己的文本。在打开文件时,水印将针对每个用户单独显示。你也可以定义组来区分将看到水印的用户,并选择必须显示水印的共享类型。 + +![水印][22] + +*水印 (Ksenia Fedoruk, [CC BY-SA 4.0][23])* + +你也可以在 LibreOffice 和 ONLYOFFICE 桌面应用程序中的文档中插入水印。然而,在这种情况下,它只是一个放置在主文本层下的文本或图像,任何人都可以轻易地删除它。 + +#### 5、用密码保护文件 + +密码保护允许你安全地存储和交换本地文件。如果有人访问你的桌面或通过电子邮件或其他方法得到受保护的文件,他们不知道密码就无法打开它。 + +**选项:** Apache OpenOffice、LibreOffice 和 ONLYOFFICE 桌面编辑器 + +所有这三种解决方案都提供了为你的敏感文件设置密码的能力。 + +如果一个受保护的文档对你很重要,强烈建议你使用密码管理器保存密码或记住它,因为 LibreOffice、ONLYOFFICE 和 [OpenOffice][24] 不提供密码恢复选项。因此,如果你忘记或丢失了密码,就没有办法恢复或重置密码并打开文件。 + +### 你的数据属于你 + +使用这些方法中的一种或多种来保护你的文件,以保持更安全的在线活动。现在是 21 世纪,计算机太先进了,不能冒险把你的数据交给你无法控制的服务。使用开源,掌握你的数字生活的所有权。 + +你最喜欢的安全使用文档的工具是什么?请在评论中分享它们。 + +-------------------------------------------------------------------------------- + +via: https://opensource.com/article/21/4/secure-documents-open-source + +作者:[Ksenia Fedoruk][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/ksenia-fedoruk +[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/article/21/3/encryption-luks +[3]: https://opensource.com/article/21/3/luks-truecrypt +[4]: https://nextcloud.com/ +[5]: https://owncloud.com/ +[6]: https://pydio.com/ +[7]: https://www.seafile.com/en/home/ +[8]: https://opensource.com/sites/default/files/uploads/pydiocells.png (Pydio audit control) +[9]: http://pydio.com +[10]: https://www.onlyoffice.com/workspace.aspx +[11]: https://cryptpad.fr/ +[12]: https://opensource.com/sites/default/files/uploads/cryptdrive.png (Encrypted CryptPad storage) +[13]: http://cryptpad.fr +[14]: https://www.libreoffice.org/ +[15]: https://www.onlyoffice.com/desktop.aspx +[16]: https://opensource.com/sites/default/files/uploads/onlyoffice_digitalsig.png (Digital signature in ONLYOFFICE) +[17]: http://helpcenter.onlyoffice.com +[18]: https://www.signserver.org/ +[19]: https://github.com/OpenESignForms +[20]: https://www.onlyoffice.com/office-for-nextcloud.aspx +[21]: https://www.collaboraoffice.com/ +[22]: https://opensource.com/sites/default/files/uploads/onlyoffice_watermark.png (Watermark) +[23]: https://creativecommons.org/licenses/by-sa/4.0/ +[24]: https://www.openoffice.org/ diff --git a/published/202105/20210420 A beginner-s guide to network management.md b/published/202105/20210420 A beginner-s guide to network management.md new file mode 100644 index 0000000000..7d5e004bbf --- /dev/null +++ b/published/202105/20210420 A beginner-s guide to network management.md @@ -0,0 +1,203 @@ +[#]: subject: "A beginner's guide to network management" +[#]: via: "https://opensource.com/article/21/4/network-management" +[#]: author: "Seth Kenlon https://opensource.com/users/seth" +[#]: collector: "lujun9972" +[#]: translator: "ddl-hust" +[#]: reviewer: "wxy" +[#]: publisher: "wxy" +[#]: url: "https://linux.cn/article-13374-1.html" + +网络管理初学者指南 +====== + +> 了解网络是如何工作的,以及使用开源工具进行网络性能调优的一些窍门。 + +![](https://img.linux.net.cn/data/attachment/album/202105/09/164127umsevtfspssppmsp.jpg) + +大多数人每一天至少会接触到两种类型的网络。当你打开计算机或者移动设备,设备连接到本地 WiFi,本地 WiFi 然后连接到所谓“互联网”的互联网络。 + +但是网络实际上是如何工作的?你的设备如何能够找到互联网、共享打印机或文件共享?这些东西如何知道响应你的设备?系统管理员用什么措施来优化网络的性能? + +开源思想在网络技术领域根深蒂固,因此任何想更多了解网络的人,可以免费获得网络相关的资源。本文介绍了使用开源技术的网络管理相关的基础知识。 + +### 网络是什么? + +计算机网络是由两台或者多台计算机组成的、互相通信的集合。为了使得网络能够工作,网络上一台计算机必须能够找到其他计算机,且通信必须能够从一台计算机到达另外一台。为了解决这一需求,开发和定义了两种不同的通信协议:TCP 和 IP。 + +#### 用于传输的 TCP 协议 + +为了使得计算机之间能够通信,它们之间必须有一种传输信息的手段。人说话产生的声音是通过声波来传递的,计算机是通过以太网电缆、无线电波或微波传输的数字信号进行通信的。这方面的规范被正式定义为 [TCP 协议][2]。 + +#### 用于寻址的 IP 协议 + +计算机必须有一些识别手段才能相互寻址。当人类相互称呼时,我们使用名字和代名词。当计算机相互寻址时,它们使用 IP 地址,如 `192.168.0.1`,IP 地址可以被映射到名称上,如“Laptop”、“Desktop”、“Tux” 或 “Penguin”。这方面的规范被定义为 [IP 协议][3]。 + +### 最小配置设置 + +最简单的网络是一个两台计算机的网络,使用称为“交叉电缆”的特殊布线方式的以太网电缆。交叉电缆将来自一台计算机的信号连接并传输到另一台计算机上的适当受体。还有一些交叉适配器可以将标准的以太网转换为交叉电缆。 + +![Crossover cable][4] + +由于在这两台计算机之间没有路由器,所有的网络管理都必须在每台机器上手动完成,因此这是一个很好的网络基础知识的入门练习。 + +用一根交叉电缆,你可以把两台计算机连接在一起。因为这两台计算机是直接连接的,没有网络控制器提供指导,所以这两台计算机都不用做什么创建网络或加入网络的事情。通常情况下,这项任务会由交换机和 DHCP 服务器或路由器来提示,但在这个简单的网络设置中,这一切都由你负责。 + +要创建一个网络,你必须先为每台计算机分配一个 IP 地址,为自行分配而保留的地址从 169.254 开始,这是一个约定俗成的方式,提醒你本 IP 段是一个闭环系统。 + +#### 找寻网络接口 + +首先,你必须知道你正在使用什么网络接口。以太网端口通常用 “eth” 加上一个从 0 开始的数字来指定,但有些设备用不同的术语来表示接口。你可以用 `ip` 命令来查询计算机上的接口: + +``` +$ ip address show +1: lo: mtu 65536 ... + link/loopback 00:00:00:00:00:00 brd ... + inet 127.0.0.1/8 scope host lo + valid_lft forever preferred_lft forever + inet6 ::1/128 scope host + valid_lft forever preferred_lft forever +2: eth0: ... + link/ether dc:a6:32:be:a3:e1 brd ... +3: wlan0: ... + link/ether dc:a6:32:be:a3:e2 brd ... +``` + +在这个例子中,`eth0` 是正确的接口名称。然而,在某些情况下,你会看到 `en0` 或 `enp0s1` 或类似的东西,所以在使用设备名称之前,一定要先检查它。 + +#### 分配 IP 地址 + +通常情况下,IP 地址是从路由器获得的,路由器在网络上广播提供地址。当一台计算机连接到一个网络时,它请求一个地址。路由器通过介质访问控制(MAC)地址识别设备(注意这个 MAC 与苹果 Mac 电脑无关),并被分配 IP 地址。这就是计算机在网络上找到彼此的方式。 + +在本文的简单网络中,没有路由器来分配 IP 地址及注册设备,因此我们需要手动分配 IP 地址,使用 `ip` 命令来给计算机分配 IP 地址: + +``` +$ sudo ip address add 169.254.0.1 dev eth0 +``` + +给另外一台计算机分配 IP 地址,将 IP 地址增 1: + +``` +$ sudo ip address add 169.254.0.2 dev eth0 +``` + +现在计算机有了交叉电缆作为通信介质,有了独一无二的 IP 地址用来识别身份。但是这个网络还缺少一个重要成分:计算机不知道自己是网络的一部分。 + +#### 设置路由 + +路由器另外的一个功能是设置从一个地方到另一个地方的网络路径,称作路由表,路由表可以简单的看作网络的城市地图。 + +虽然现在我们还没有设置路由表,但是我们可以通过 `route` 命令来查看路由表: + +``` +$ route +Kernel IP routing table +Destination | Gateway | Genmask | Flags|Metric|Ref | Use | Iface +$ +``` + +同样,你可以通过 `ip` 命令来查看路由表: + +``` +$ ip route +$ +``` + +通过 `ip` 命令添加一条路由信息: + +``` +$ sudo ip route \ + add 169.254.0.0/24 \ + dev eth0 \ + proto static +``` + +这条命令为 `eth0` 接口添加一个地址范围(从 `169.254.0.0` 开始到 `169.254.0.255` 结束)的路由。它将路由协议设置为“静态”,表示作为管理员的你创建了这个路由,作为对该范围内的任何动态路由进行覆盖。 + +通过 `route` 命令来查询路由表: + +``` +$ route +Kernel IP routing table +Destination | Gateway | Genmask       | ... | Iface +link-local  | 0.0.0.0 | 255.255.255.0 | ... | eth0 +``` + +或者使用`ip`命令从不同角度来查询路由表: + +``` +$ ip route +169.254.0.0/24 dev eth0 proto static scope link +``` + +#### 探测相邻网络 + +现在,你的网络有了传输方式、寻址方法以及网络路由。你可以联系到你的计算机以外的主机。向另一台计算机发送的最简单的信息是一个 “呯”,这也是产生该信息的命令的名称(`ping`)。 + +``` +$ ping -c1 169.254.0.2 +64 bytes from 169.254.0.2: icmp_seq=1 ttl=64 time=0.233 ms + +--- 169.254.0.2 ping statistics --- +1 packets transmitted, 1 received, 0% packet loss, time 0ms +rtt min/avg/max/mdev = 0.244/0.244/0.244/0.000 ms +``` + +你可以通过下面的命令看到与你交互的邻居: + +``` +$ ip neighbour +169.254.0.2 dev eth0 lladdr e8:6a:64:ac:ef:7c STALE +``` + +### 通过交换机扩展你的网络 + +只需要双节点的网络并不多。为了解决这个问题,人们开发了特殊的硬件,称为网络“交换机”。网络交换机允许你将几条以太网电缆连接到它上面,它将消息不加区分地从发送消息的计算机分发到交换机上所有监听的计算机。除了拥有与预期接收者相匹配的 IP 地址的计算机外,其他所有计算机都会忽略该信息。这使得网络变得相对嘈杂,但这是物理上,将一组计算机连接在一起的简单方法。 + +在大多数现代家庭网络中,用于物理电缆的物理交换机并不实用。所以 WiFi 接入点代替了物理交换机。WiFi 接入点的功能与交换机相同:它允许许多计算机连接到它并在它们之间传递信息。 + +接入互联网不仅仅是一种期望,它通常是家庭网络存在的原因。没有接入互联网的交换机或 WiFi 接入点不是很有用,但要将你的网络连接到另一个网络,你需要一个路由器。 + +#### 添加路由器 + +实际上,本地网络连接了许多设备,并且越来越多的设备具备联网能力,使得网络的规模呈数量级级别增长。 + +手动配置网络是不切实际的,因此这些任务分配给网络中特定的节点来处理,网络中每台计算机运行一个后台守护进程,以填充从网络上的权威服务器收到的网络设置。家庭网络中,这些工作通常被整合到一个小型嵌入式设备中,通常由你的互联网服务提供商(ISP)提供,称为**路由器**(人们有时错误地将其称为调制解调器)。在一个大型网络中,每项工作通常被分配到一个单独的专用服务器上,以确保专用服务器能够专注于自己的工作以及保证工作弹性。这些任务包括: + +- DHCP 服务器,为加入网络的设备分配和跟踪 IP 地址 +- DNS 服务器将诸如域名 [redhat.com][7] 转换成 IP 地址 `209.132.183.105` +- [防火墙][8] 保护你的网络免受不需要的传入流量或被禁止的传出流量 +- 路由器有效传输网络流量,作为其他网络(如互联网)的网关,并进行网络地址转换(NAT) + +你现在的网络上可能有一个路由器,它可能管理着所有这些任务,甚至可能更多。感谢像 VyOS 这样的项目,现在你可以运行 [自己的开源路由器][9]。对于这样一个项目,你应该使用一台专门的计算机,至少有两个网络接口控制器(NIC):一个连接到你的 ISP,另一个连接到交换机,或者更有可能是一个 WiFi 接入点。 + +### 扩大你的知识规模 + +无论你的网络上有多少设备,或你的网络连接到多少其他网络,其原则仍然与你的双节点网络相同。你需要一种传输方式,一种寻址方案,以及如何路由到网络的知识。 + +### 网络知识速查表 + +了解网络是如何运作的,对管理网络至关重要。除非你了解你的测试结果,否则你无法排除问题,除非你知道哪些命令能够与你的网络设备交互,否则你无法运行测试。对于重要的网络命令的基本用法以及你可以用它们提取什么样的信息,[请下载我们最新的网络速查表][10]。 + +-------------------------------------------------------------------------------- + +via: https://opensource.com/article/21/4/network-management + +作者:[Seth Kenlon][a] +选题:[lujun9972][b] +译者:[ddl-hust](https://github.com/ddl-hust) +校对:[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/gears_devops_learn_troubleshooting_lightbulb_tips_520.png?itok=HcN38NOk "Tips and gears turning" +[2]: https://tools.ietf.org/html/rfc793 +[3]: https://tools.ietf.org/html/rfc791 +[4]: https://opensource.com/sites/default/files/uploads/crossover.jpg "Crossover cable" +[5]: https://creativecommons.org/licenses/by-sa/4.0/ +[6]: https://opensource.com/article/17/4/build-your-own-name-server +[7]: http://redhat.com +[8]: https://www.redhat.com/sysadmin/secure-linux-network-firewall-cmd +[9]: https://opensource.com/article/20/1/open-source-networking +[10]: https://opensource.com/downloads/cheat-sheet-networking \ No newline at end of file diff --git a/published/202105/20210420 Application observability with Apache Kafka and SigNoz.md b/published/202105/20210420 Application observability with Apache Kafka and SigNoz.md new file mode 100644 index 0000000000..e61e766e37 --- /dev/null +++ b/published/202105/20210420 Application observability with Apache Kafka and SigNoz.md @@ -0,0 +1,135 @@ +[#]: subject: (Application observability with Apache Kafka and SigNoz) +[#]: via: (https://opensource.com/article/21/4/observability-apache-kafka-signoz) +[#]: author: (Nitish Tiwari https://opensource.com/users/tiwarinitish86) +[#]: collector: (lujun9972) +[#]: translator: (geekpi) +[#]: reviewer: (wxy) +[#]: publisher: (wxy) +[#]: url: (https://linux.cn/article-13352-1.html) + +使用 Apache Kafka 和 SigNoz 实现应用可观测性 +====== + +> SigNoz 帮助开发者使用最小的精力快速实现他们的可观测性目标。 + +![](https://img.linux.net.cn/data/attachment/album/202105/01/231703oy5ln5nnqkuhxt1t.jpg) + +SigNoz 是一个开源的应用可观察性平台。SigNoz 是用 React 和 Go 编写的,它从头到尾都是为了让开发者能够以最小的精力尽快实现他们的可观察性目标。 + +本文将详细介绍该软件,包括架构、基于 Kubernetes 的部署以及一些常见的 SigNoz 用途。 + +### SigNoz 架构 + +SigNoz 将几个组件捆绑在一起,创建了一个可扩展的、耦合松散的系统,很容易上手使用。其中一些最重要的组件有: + + * OpenTelemetry Collector + * Apache Kafka + * Apache Druid + +[OpenTelemetry Collector][2] 是跟踪或度量数据收集引擎。这使得 SigNoz 能够以行业标准格式获取数据,包括 Jaeger、Zipkin 和 OpenConsensus。之后,收集的数据被转发到 Apache Kafka。 + +SigNoz 使用 Kafka 和流处理器来实时获取大量的可观测数据。然后,这些数据被传递到 Apache Druid,它擅长于存储这些数据,用于短期和长期的 SQL 分析。 + +当数据被扁平化并存储在 Druid 中,SigNoz 的查询服务可以查询并将数据传递给 SigNoz React 前端。然后,前端为用户创建漂亮的图表,使可观察性数据可视化。 + +![SigNoz architecture][3] + +### 安装 SigNoz + +SigNoz 的组件包括 Apache Kafka 和 Druid。这些组件是松散耦合的,并协同工作,以确保终端用户的无缝体验。鉴于这些组件,最好将 SigNoz 作为 Kubernetes 或 Docker Compose(用于本地测试)上的微服务组合来运行。 + +这个例子使用基于 Kubernetes Helm Chart 的部署在 Kubernetes 上安装 SigNoz。作为先决条件,你需要一个 Kubernetes 集群。如果你没有可用的 Kubernetes 集群,你可以使用 [MiniKube][5] 或 [Kind][6] 等工具,在你的本地机器上创建一个测试集群。注意,这台机器至少要有 4GB 的可用空间才能工作。 + +当你有了可用的集群,并配置了 kubectl 来与集群通信,运行: + +``` +$ git clone https://github.com/SigNoz/signoz.git && cd signoz +$ helm dependency update deploy/kubernetes/platform +$ kubectl create ns platform +$ helm -n platform install signoz deploy/kubernetes/platform +$ kubectl -n platform apply -Rf deploy/kubernetes/jobs +$ kubectl -n platform apply -f deploy/kubernetes/otel-collector +``` + +这将在集群上安装 SigNoz 和相关容器。要访问用户界面 (UI),运行 `kubectl port-forward` 命令。例如: + +``` +$ kubectl -n platform port-forward svc/signoz-frontend 3000:3000 +``` + +现在你应该能够使用本地浏览器访问你的 SigNoz 仪表板,地址为 `http://localhost:3000`。 + +现在你的可观察性平台已经建立起来了,你需要一个能产生可观察性数据的应用来进行可视化和追踪。对于这个例子,你可以使用 [HotROD][7],一个由 Jaegar 团队开发的示例应用。 + +要安装它,请运行: + +``` +$ kubectl create ns sample-application +$ kubectl -n sample-application apply -Rf sample-apps/hotrod/ +``` + +### 探索功能 + +现在你应该有一个已经安装合适仪表的应用,并可在演示设置中运行。看看 SigNoz 仪表盘上的指标和跟踪数据。当你登录到仪表盘的主页时,你会看到一个所有已配置的应用列表,这些应用正在向 SigNoz 发送仪表数据。 + +![SigNoz dashboard][8] + +#### 指标 + +当你点击一个特定的应用时,你会登录到该应用的主页上。指标页面显示最近 15 分钟的信息(这个数字是可配置的),如应用的延迟、平均吞吐量、错误率和应用目前访问最高的接口。这让你对应用的状态有一个大概了解。任何错误、延迟或负载的峰值都可以立即看到。 + +![Metrics in SigNoz][9] + +#### 追踪 + +追踪页面按时间顺序列出了每个请求的高层细节。当你发现一个感兴趣的请求(例如,比预期时间长的东西),你可以点击追踪,查看该请求中发生的每个行为的单独时间跨度。下探模式提供了对每个请求的彻底检查。 + +![Tracing in SigNoz][10] + +![Tracing in SigNoz][11] + +#### 用量资源管理器 + +大多数指标和跟踪数据都非常有用,但只在一定时期内有用。随着时间的推移,数据在大多数情况下不再有用。这意味着为数据计划一个适当的保留时间是很重要的。否则,你将为存储支付更多的费用。用量资源管理器提供了每小时、每一天和每一周获取数据的概况。 + +![SigNoz Usage Explorer][12] + +### 添加仪表 + +到目前为止,你一直在看 HotROD 应用的指标和追踪。理想情况下,你会希望对你的应用进行检测,以便它向 SigNoz 发送可观察数据。参考 SigNoz 网站上的[仪表概览][13]。 + +SigNoz 支持一个与供应商无关的仪表库,OpenTelemetry,作为配置仪表的主要方式。OpenTelemetry 提供了各种语言的仪表库,支持自动和手动仪表。 + +### 了解更多 + +SigNoz 帮助开发者快速开始度量和跟踪应用。要了解更多,你可以查阅 [文档][14],加入[社区][15],并访问 [GitHub][16] 上的源代码。 + +-------------------------------------------------------------------------------- + +via: https://opensource.com/article/21/4/observability-apache-kafka-signoz + +作者:[Nitish Tiwari][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/tiwarinitish86 +[b]: https://github.com/lujun9972 +[1]: https://opensource.com/sites/default/files/styles/image-full-size/public/lead-images/ship_captain_devops_kubernetes_steer.png?itok=LAHfIpek (Ship captain sailing the Kubernetes seas) +[2]: https://github.com/open-telemetry/opentelemetry-collector +[3]: https://opensource.com/sites/default/files/uploads/signoz_architecture.png (SigNoz architecture) +[4]: https://creativecommons.org/licenses/by-sa/4.0/ +[5]: https://minikube.sigs.k8s.io/docs/start/ +[6]: https://kind.sigs.k8s.io/docs/user/quick-start/ +[7]: https://github.com/jaegertracing/jaeger/tree/master/examples/hotrod +[8]: https://opensource.com/sites/default/files/uploads/signoz_dashboard.png (SigNoz dashboard) +[9]: https://opensource.com/sites/default/files/uploads/signoz_applicationmetrics.png (Metrics in SigNoz) +[10]: https://opensource.com/sites/default/files/uploads/signoz_tracing.png (Tracing in SigNoz) +[11]: https://opensource.com/sites/default/files/uploads/signoz_tracing2.png (Tracing in SigNoz) +[12]: https://opensource.com/sites/default/files/uploads/signoz_usageexplorer.png (SigNoz Usage Explorer) +[13]: https://signoz.io/docs/instrumentation/overview/ +[14]: https://signoz.io/docs/ +[15]: https://github.com/SigNoz/signoz#community +[16]: https://github.com/SigNoz/signoz diff --git a/published/202105/20210421 Build smaller containers.md b/published/202105/20210421 Build smaller containers.md new file mode 100644 index 0000000000..5d54b9d024 --- /dev/null +++ b/published/202105/20210421 Build smaller containers.md @@ -0,0 +1,345 @@ +[#]: subject: (Build smaller containers) +[#]: via: (https://fedoramagazine.org/build-smaller-containers/) +[#]: author: (Daniel Schier https://fedoramagazine.org/author/danielwtd/) +[#]: collector: (lujun9972) +[#]: translator: (ShuyRoy) +[#]: reviewer: (wxy) +[#]: publisher: (wxy) +[#]: url: (https://linux.cn/article-13382-1.html) + +如何构建更小的容器 +====== + +![](https://img.linux.net.cn/data/attachment/album/202105/12/112108han4e111a6v16act.jpg) + +使用容器工作是很多用户和开发者的日常任务。容器开发者经常需要频繁地(重新)构建容器镜像。如果你开发容器,你有想过减小镜像的大小吗?较小的镜像有一些好处。在下载的时候所需要的带宽更少,而且在云环境中运行的时候也可以节省开销。而且在 Fedora [CoreOS][4]、[IoT][5] 以及[Silverblue][6] 上使用较小的容器镜像可以提升整体系统性能,因为这些操作系统严重依赖于容器工作流。这篇文章将会提供一些减小容器镜像大小的技巧。 + +### 工具 + +以下例子所用到的主机操作系统是 Fedora Linux 33。例子使用 [Podman][7] 3.1.0 和[Buildah][8] 1.2.0。Podman 和 Buildah 已经预装在大多数 Fedora Linux 变种中。如果你没有安装 Podman 和 Buildah,可以用下边的命令安装: + +``` +$ sudo dnf install -y podman buildah +``` + +### 任务 + +从一个基础的例子开始。构建一个满足以下需求的 web 容器: + + * 容器必须基于 Fedora Linux + * 使用 Apache httpd web 服务器 + * 包含一个定制的网站 + * 容器应该比较小 + +下边的步骤也适用于比较复杂的镜像。 + +### 设置 + +首先,创建一个工程目录。这个目录将会包含你的网站和容器文件: + +``` +$ mkdir smallerContainer +$ cd smallerContainer +$ mkdir files +$ touch files/index.html +``` + +制作一个简单的登录页面。对于这个演示,你可以将下面的 HTML 复制到 `index.html` 文件中。 + +``` + + + + + Container Page + + + +
+

Container Page

+
+
+

Fedora

+ +

Podman

+ +

Buildah

+ +

Skopeo

+ +

CRI-O

+ +
+ + + +``` + +此时你可以选择在浏览器中测试上面的 `index.html` 文件: + +``` +$ firefox files/index.html +``` + +最后,创建一个容器文件。这个文件可以命名为 `Dockerfile` 或者 `Containerfile`: + +``` +$ touch Containerfile +``` + +现在你应该有了一个工程目录,并且该目录中的文件系统布局如下: + +``` +smallerContainer/ +|- files/ +| |- index.html +| +|- Containerfile +``` + +### 构建 + +现在构建镜像。下边的每个阶段都会添加一层改进来帮助减小镜像的大小。你最终会得到一系列镜像,但只有一个 `Containerfile`。 + +#### 阶段 0:一个基本的容器镜像 + +你的新镜像将会非常简单,它只包含强制性步骤。在 `Containerfile` 中添加以下内容: + +``` +# 使用 Fedora 33 作为基镜像 +FROM registry.fedoraproject.org/fedora:33 + +# 安装 httpd +RUN dnf install -y httpd + +# 复制这个网站 +COPY files/* /var/www/html/ + +# 设置端口为 80/tcp +EXPOSE 80 + +# 启动 httpd +CMD ["httpd", "-DFOREGROUND"] +``` + +在上边的文件中有一些注释来解释每一行内容都是在做什么。更详细的步骤: + + 1. 在 `FROM registry.fedoraproject.org/fedora:33` 的基础上创建一个构建容器 + 2. 运行命令: `dnf install -y httpd` + 3. 将与 `Containerfile` 有关的文件拷贝到容器中 + 4. 设置 `EXPOSE 80` 来说明哪个端口是可以自动设置的 + 5. 设置一个 `CMD` 指令来说明如果从这个镜像创建一个容器应该运行什么 + +运行下边的命令从工程目录创建一个新的镜像: + +``` +$ podman image build -f Containerfile -t localhost/web-base +``` + +使用一下命令来查看你的镜像的属性。注意你的镜像的大小(467 MB)。 + +``` +$ podman image ls +REPOSITORY TAG IMAGE ID CREATED SIZE +localhost/web-base latest ac8c5ed73bb5 5 minutes ago 467 MB +registry.fedoraproject.org/fedora 33 9f2a56037643 3 months ago 182 MB +``` + +以上这个例子中展示的镜像在现在占用了467 MB的空间。剩下的阶段将会显著地减小镜像的大小。但是首先要验证镜像是否能够按照预期工作。 + +输入以下命令来启动容器: + +``` +$ podman container run -d --name web-base -P localhost/web-base +``` + +输入以下命令可以列出你的容器: + +``` +$ podman container ls +CONTAINER ID IMAGE COMMAND CREATED STATUS PORTS NAMES +d24063487f9f localhost/web-base httpd -DFOREGROUN... 2 seconds ago Up 3 seconds ago 0.0.0.0:46191->80/tcp web-base +``` + +以上展示的容器正在运行,它正在监听的端口是 `46191` 。从运行在主机操作系统上的 web 浏览器转到 `localhost:46191` 应该呈现你的 web 页面: + +``` +$ firefox localhost:46191 +``` + +#### 阶段 1:清除缓存并将残余的内容从容器中删除 + +为了优化容器镜像的大小,第一步应该总是执行“清理”。这将保证安装和打包所残余的内容都被删掉。这个过程到底需要什么取决于你的容器。对于以上的例子,只需要编辑 `Containerfile` 让它包含以下几行。 + +``` +[...] +# Install httpd +RUN dnf install -y httpd && \ + dnf clean all -y +[...] +``` + +构建修改后的 `Containerfile` 来显著地减小镜像(这个例子中是 237 MB)。 + +``` +$ podman image build -f Containerfile -t localhost/web-clean +$ podman image ls +REPOSITORY TAG IMAGE ID CREATED SIZE +localhost/web-clean latest f0f62aece028 6 seconds ago 237 MB +``` + +#### 阶段 2:删除文档和不需要的依赖包 + +许多包在安装时会被建议拉下来,包含一些弱依赖和文档。这些在容器中通常是不需要的,可以删除。 `dnf` 命令有选项可以表明它不需要包含弱依赖或文档。 + +再次编辑 `Containerfile` ,并在 `dnf install` 行中添加删除文档和弱依赖的选项: + +``` +[...] +# Install httpd +RUN dnf install -y httpd --nodocs --setopt install_weak_deps=False && \ + dnf clean all -y +[...] +``` + +构建经过以上修改后的 `Containerfile` 可以得到一个更小的镜像(231 MB)。 + +``` +$ podman image build -f Containerfile -t localhost/web-docs +$ podman image ls +REPOSITORY TAG IMAGE ID CREATED SIZE +localhost/web-docs latest 8a76820cec2f 8 seconds ago 231 MB +``` + +#### 阶段 3:使用更小的容器基镜像 + +前面的阶段结合起来,使得示例镜像的大小减少了一半。但是仍然还有一些途径来进一步减小镜像的大小。这个基镜像 `registry.fedoraproject.org/fedora:33` 是通用的。它提供了一组软件包,许多人希望这些软件包预先安装在他们的 Fedora Linux 容器中。但是,通用的 Fedora Linux 基镜像中提供的包通常必须要的更多。Fedora 项目也为那些希望只从基本包开始,然后只添加所需内容来实现较小总镜像大小的用户提供了一个 `fedora-minimal` 镜像。 + +使用 `podman image search` 来查找 `fedora-minimal` 镜像,如下所示: + +``` +$ podman image search fedora-minimal +INDEX NAME DESCRIPTION STARS OFFICIAL AUTOMATED +fedoraproject.org registry.fedoraproject.org/fedora-minimal 0 +``` + +`fedora-minimal` 基镜像不包含 [DNF][9],而是倾向于使用不需要 Python 的较小的 [microDNF][10]。当 `registry.fedoraproject.org/fedora:33` 被 `registry.fedoraproject.org/fedora-minimal:33` 替换后,需要用 `microdnf` 命令来替换 `dnf`。 + +``` +# 使用 Fedora minimal 33 作为基镜像 +FROM registry.fedoraproject.org/fedora-minimal:33 + +# 安装 httpd +RUN microdnf install -y httpd --nodocs --setopt install_weak_deps=0 && \ + microdnf clean all -y +[...] +``` +使用 `fedora-minimal` 重新构建后的镜像大小如下所示 (169 MB): + +``` +$ podman image build -f Containerfile -t localhost/web-docs +$ podman image ls +REPOSITORY TAG IMAGE ID CREATED SIZE +localhost/web-minimal latest e1603bbb1097 7 minutes ago 169 MB +``` + +最开始的镜像大小是 **467 MB**。结合以上每个阶段所提到的方法,进行重新构建之后可以得到最终大小为 **169 MB** 的镜像。最终的 _总_ 镜像大小比最开始的 _基_ 镜像小了 182 MB! + +### 从零开始构建容器 + +前边的内容使用一个容器文件和 Podman 来构建一个新的镜像。还有最后一个方法要展示——使用 Buildah 来从头构建一个容器。Podman 使用与 Buildah 相同的库来构建容器。但是 Buildah 被认为是一个纯构建工具。Podman 被设计来是为了代替 Docker 的。 + +使用 Buildah 从头构建的容器是空的——它里边什么都 _没有_ 。所有的东西都需要安装或者从容器外复制。幸运地是,使用 Buildah 相当简单。下边是一个从头开始构建镜像的小的 Bash 脚本。除了运行这个脚本,你也可以在终端逐条地运行脚本中的命令,来更好的理解每一步都是做什么的。 + +``` +#!/usr/bin/env bash +set -o errexit + +# 创建一个容器 +CONTAINER=$(buildah from scratch) + +# 挂载容器文件系统 +MOUNTPOINT=$(buildah mount $CONTAINER) + +# 安装一个基本的文件系统和最小的包以及 nginx +dnf install -y --installroot $MOUNTPOINT --releasever 33 glibc-minimal-langpack httpd --nodocs --setopt install_weak_deps=False + +dnf clean all -y --installroot $MOUNTPOINT --releasever 33 + +# 清除 +buildah unmount $CONTAINER + +# 复制网站 +buildah copy $CONTAINER 'files/*' '/var/www/html/' + +# 设置端口为 80/tcp +buildah config --port 80 $CONTAINER + +# 启动 httpd +buildah config --cmd "httpd -DFOREGROUND" $CONTAINER + +# 将容器保存为一个镜像 +buildah commit --squash $CONTAINER web-scratch +``` + +或者,可以通过将上面的脚本传递给 Buildah 来构建镜像。注意不需要 root 权限。 + +``` +$ buildah unshare bash web-scratch.sh +$ podman image ls +REPOSITORY TAG IMAGE ID CREATED SIZE +localhost/web-scratch latest acca45fc9118 9 seconds ago 155 MB +``` + +最后的镜像只有 **155 MB**!而且 [攻击面][11] 也减少了。甚至在最后的镜像中都没有安装 DNF(或者 microDNF)。 + +### 结论 + +构建一个比较小的容器镜像有许多优点。减少所需要的带宽、磁盘占用以及攻击面,都会得到更好的镜像。只用很少的更改来减小镜像的大小很简单。许多更改都可以在不改变结果镜像的功能下完成。 + +只保存所需的二进制文件和配置文件来构建非常小的镜像也是可能的。 + +-------------------------------------------------------------------------------- + +via: https://fedoramagazine.org/build-smaller-containers/ + +作者:[Daniel Schier][a] +选题:[lujun9972][b] +译者:[ShuyRoy](https://github.com/Shuyroy) +校对:[wxy](https://github.com/wxy) + +本文由 [LCTT](https://github.com/LCTT/TranslateProject) 原创编译,[Linux中国](https://linux.cn/) 荣誉推出 + +[a]: https://fedoramagazine.org/author/danielwtd/ +[b]: https://github.com/lujun9972 +[1]: https://fedoramagazine.org/wp-content/uploads/2021/04/podman-smaller-1-816x345.jpg +[2]: https://unsplash.com/@errbodysaycheese?utm_source=unsplash&utm_medium=referral&utm_content=creditCopyText +[3]: https://unsplash.com/s/photos/otter?utm_source=unsplash&utm_medium=referral&utm_content=creditCopyText +[4]: https://fedoramagazine.org/getting-started-with-fedora-coreos/ +[5]: https://getfedora.org/en/iot/ +[6]: https://fedoramagazine.org/what-is-silverblue/ +[7]: https://podman.io/ +[8]: https://buildah.io/ +[9]: https://github.com/rpm-software-management/dnf +[10]: https://github.com/rpm-software-management/microdnf +[11]: https://en.wikipedia.org/wiki/Attack_surface diff --git a/published/202105/20210422 Running Linux Apps In Windows Is Now A Reality.md b/published/202105/20210422 Running Linux Apps In Windows Is Now A Reality.md new file mode 100644 index 0000000000..b28e1eb194 --- /dev/null +++ b/published/202105/20210422 Running Linux Apps In Windows Is Now A Reality.md @@ -0,0 +1,117 @@ +[#]: subject: (Running Linux Apps In Windows Is Now A Reality) +[#]: via: (https://news.itsfoss.com/linux-gui-apps-wsl/) +[#]: author: (Jacob Crume https://news.itsfoss.com/author/jacob/) +[#]: collector: (lujun9972) +[#]: translator: (Kevin3599) +[#]: reviewer: (wxy) +[#]: publisher: (wxy) +[#]: url: (https://linux.cn/article-13376-1.html) + +在 Windows 中运行基于 Linux 的应用程序已经成为现实 +====== + +> 微软宣布对其 WSL 进行重大改进,使你能够轻松地运行 Linux 图形化应用程序。 + +![](https://i2.wp.com/news.itsfoss.com/wp-content/uploads/2021/04/linux-apps-windows.png?w=1200&ssl=1) + +当微软在 2016 年发布 “Windows subsystem for Linux”(也就是 WSL)的时候显然有夸大宣传的嫌疑,当时人们梦想着无需重启就可以同时运行基于 Windows 和 Linux 的应用程序,令人可惜的是,WSL 只能运行 Linux 终端程序。 + +去年,微软再次尝试去颠覆 Windows 的应用生态,这一次,他们替换了老旧的模拟核心,转而使用了真正的 Linux 核心,这一变化使你可以 [在 Windows 中运行 Linux 应用程序][2]。 + +### WSL 图形化应用的初步预览 + +![https://youtu.be/f8_nvJzuaSU](https://img.linux.net.cn//static/video/Introducing%20Linux%20GUI%20apps%20running%20on%20Windows%20using%20the%20Windows%20Subsystem%20for%20Linux%20%28WSL%29-f8_nvJzuaSU.mp4) + +从技术上讲,用户最初确实在 WSL 上获得了对 Linux 图形化应用程序的支持,但仅限于使用第三方 X 服务器时。这通常是不稳定的、缓慢、难以设置,并且使人们有隐私方面的顾虑。 + +结果是小部分 Linux 爱好者(碰巧运行 Windows),他们具有设置 X 服务器的能力。但是,这些爱好者对没有硬件加速支持感到失望。 + +所以,较为明智的方法是在 WSL 上只运行基于命令行的程序。 + +**但是现在这个问题得到了改善**。现在,微软 [正式支持][4] 了 Linux 图形化应用程序,我们很快就能够享受硬件加速了, + +### 面向大众的 Linux 图形化应用程序:WSLg + +![图片来源:Microsoft Devblogs][5] + +随着微软发布新的 WSL,有了一系列巨大的改进,它们包括: + + * GPU 硬件加速 + * 开箱即用的音频和麦克风支持 + * 自动启用 X 服务器和 Pulse 音频服务 + +有趣的是,开发者们给这个功能起了一个有趣的外号 “WSLg”。 + +这些功能将使在 WSL 上运行 Linux 应用程序几乎与运行原生应用程序一样容易,同时无需占用过多性能资源。 + +因此,你可以尝试运行 [自己喜欢的 IDE][6]、特定于 Linux 的测试用例以及诸如 [CAD][7] 之类的各种软件。 + +#### Linux 应用的 GPU 硬件加速 + +![图片鸣谢:Microsoft Devblogs][8] + +以前在 Windows 上运行图形化 Linux 程序的最大问题之一是它们无法使用硬件加速。当用户尝试移动窗口和执行任何需要对 GPU 性能有要求的任务时候,它常常陷入缓慢卡顿的局面。 + +根据微软发布的公告: + +> “作为此次更新的一部分,我们也启用了对 3D 图形的 GPU 加速支持,多亏了 Mesa 21.0 中完成的工作,所有的复杂 3D 渲染的应用程序都可以利用 OpenGL 在 Windows 10 上使用 GPU 为这些应用程序提供硬件加速。” + +这是一个相当实用的改进,这对用户在 WSL 下运行需求强大 GPU 性能的应用程序提供了莫大帮助。 + +#### 开箱即用的音频和麦克风支持! + +如果想要良好的并行 Windows 和 Linux 程序,好的音频支持是必不可少的,随着新的 WSL 发布,音频得到开箱即用的支持,这都要归功于随着 X 服务器一同启动的 Pulse 音频服务。 + +微软解释说: + +> “WSL 上的 Linux 图形化应用程序还将包括开箱即用的音频和麦克风支持。这一令人兴奋的改进将使你的应用程序可以播放音频提示并调用麦克风,适合构建、测试或使用电影播放器、电信应用程序等。” + +如果我们希望 Linux 变得更加普及,这是一项关键功能。这也将允许 Windows 应用的开发人员更好地将其应用移植到 Linux。 + +#### 自动启动所有必需的服务器 + +![图片鸣谢:Microsoft Devblogs][9] + +以前,你必须先手动启动 [PulseAudio][10] 和 [X 服务器][11],然后才能运行应用程序。现在,微软已经实现了一项服务,可以检查 Linux 应用程序是否正在运行,然后自动启动所需的服务器。 + +这使得用户更容易在 Windows 上运行 Linux 应用程序。 + +微软声称这些改动会显著提升用户体验。 + +> “借助此功能,我们将启动一个配套的系统分发包,其中包含 Wayland、X 服务器、Pulse 音频服务以及使 Linux 图形化应用程序与 Windows 通信所需的所有功能。使用完图形化应用程序并终止 WSL 发行版后,系统分发包也会自动结束其会话。” + +这些组件的结合使 Linux 图形化应用程序与常规 Windows 程序并行运行更为简单。 + +### 总结 + +有了这些新功能,微软似乎正在竭尽全力使 Linux 应用程序在 Windows 上运行。随着越来越多的用户在 Windows 上运行 Linux 应用程序,我们可能会看到更多的用户转向 Linux。特别是因为他们习惯的应用程序能够运行。 + +如果这种做法取得了成功(并且微软几年后仍未将其雪藏),它将结束 5 年来对将 Linux 应用引入 Windows 的探索。如果你想了解更多信息,可以查看 [发行公告][12]。 + +你对在 Windows 上运行 Linux 图形化应用程序怎么看?请在下面留下你的评论。 + +-------------------------------------------------------------------------------- + +via: https://news.itsfoss.com/linux-gui-apps-wsl/ + +作者:[Jacob Crume][a] +选题:[lujun9972][b] +译者:[Kevin3599](https://github.com/Kevin3599) +校对:[wxy](https://github.com/wxy) + +本文由 [LCTT](https://github.com/LCTT/TranslateProject) 原创编译,[Linux中国](https://linux.cn/) 荣誉推出 + +[a]: https://news.itsfoss.com/author/jacob/ +[b]: https://github.com/lujun9972 +[1]: https://docs.microsoft.com/en-us/windows/wsl/ +[2]: https://itsfoss.com/run-linux-apps-windows-wsl/ +[3]: https://i0.wp.com/i.ytimg.com/vi/f8_nvJzuaSU/hqdefault.jpg?w=780&ssl=1 +[4]: https://devblogs.microsoft.com/commandline/the-initial-preview-of-gui-app-support-is-now-available-for-the-windows-subsystem-for-linux-2/ +[5]: https://i0.wp.com/news.itsfoss.com/wp-content/uploads/2021/04/gedit-wsl-gui.png?w=800&ssl=1 +[6]: https://itsfoss.com/best-modern-open-source-code-editors-for-linux/ +[7]: https://itsfoss.com/cad-software-linux/ +[8]: https://i2.wp.com/news.itsfoss.com/wp-content/uploads/2021/04/gpu-acceleration-wsl.png?w=800&ssl=1 +[9]: https://i0.wp.com/news.itsfoss.com/wp-content/uploads/2021/04/wslg-architecture.png?w=800&ssl=1 +[10]: https://www.freedesktop.org/wiki/Software/PulseAudio/ +[11]: https://x.org/wiki/ +[12]: https://blogs.windows.com/windows-insider/2021/04/21/announcing-windows-10-insider-preview-build-21364/ diff --git a/published/202105/20210423 What-s New in Ubuntu MATE 21.04.md b/published/202105/20210423 What-s New in Ubuntu MATE 21.04.md new file mode 100644 index 0000000000..870b8c13fc --- /dev/null +++ b/published/202105/20210423 What-s New in Ubuntu MATE 21.04.md @@ -0,0 +1,107 @@ +[#]: subject: (What’s New in Ubuntu MATE 21.04) +[#]: via: (https://news.itsfoss.com/ubuntu-mate-21-04-release/) +[#]: author: (Asesh Basu https://news.itsfoss.com/author/asesh/) +[#]: collector: (lujun9972) +[#]: translator: (Kevin3599) +[#]: reviewer: (wxy) +[#]: publisher: (wxy) +[#]: url: (https://linux.cn/article-13349-1.html) + +Ubuntu MATE 21.04 更新,多项新功能来袭 +====== + +> 与 Yaru 团队合作,Ubuntu MATE 带来了一个主题大修、一系列有趣的功能和性能改进。 + +![](https://i0.wp.com/news.itsfoss.com/wp-content/uploads/2021/04/ubuntu-21-04-mate-release.png?w=1200&ssl=1) + +自从 18.10 发行版以来,Yaru 一直都是 Ubuntu 的默认用户桌面,今年,Yaru 团队与Canonical Design 和 Ubuntu 桌面团队携手合作,为 Ubuntu MATE 21.04 创建了新的外观界面。 + +### Ubuntu MATE 21.04 有什么新变化? + +以下就是 Ubuntu MATE 21.04 此次发布中的关键变化: + +#### MATE 桌面 + +此次更新的 MATE 桌面相比以往并没有较大改动,此次只是修复了错误 BUG 同时更新了语言翻译,Debian 中的 MATE 软件包已经更新,用户可以下载所有的 BUG 修复和更新。 + +#### Avatana 指示器 + +![][1] + +这是一个控制面板指示器(也称为系统托盘)的动作、布局和行为的系统。现在,你可以从控制中心更改 Ayatana 指示器的设置。 + +添加了一个新的打印机标识,并删除了 RedShift 以保持稳定。 + +#### Yaru MATE 主题 + +Yaru MATE 现在是 Yaru 主题的派生产品。Yaru MATE 将提供浅色和深色主题,浅色作为默认主题。来确保更好的应用程序兼容性。 + +从现在开始,用户可以使用 GTK 2.x、3.x、4.x 浅色和深色主题,也可以使用 Suru 图标以及一些新的图标。 + +LibreOffice 在 MATE 上会有新的默认桌面图标,字体对比度也得到了改善。你会发现阅读小字体文本或远距离阅读更加容易。 + +如果在系统层面选择了深色模式,网站将维持深色。要让网站和系统的其它部分一起使用深色主题,只需启用 Yaru MATE 深色主题即可。 + +现在,Macro、Metacity 和 Compiz 的管理器主题使用了矢量图标。这意味着,如果你的屏幕较大,图标不会看起来像是像素画,又是一个小细节! + +#### Yaru MATE Snap 包 + +尽管你现在无法安装 MATE 主题,但是不要着急,它很快就可以了。gtk-theme-yaru-mate 和 icon-theme-yaru-mate Snap 包是预安装的,可以在需要将主题连接到兼容的 Snap 软件包时使用。 + +根据官方发布的公告,Snapd 很快就会自动将你的主题连接到兼容的 Snap 包: + +> Snapd 很快就能自动安装与你当前活动主题相匹配的主题的 snap 包。我们创建的 snap 包已经准备好在该功能可用时与之整合。 + +#### Mutiny 布局的新变化 + +![应用了深色主题的 Mutiny 布局][2] + +Mutiny 布局模仿了 Unity 的桌面布局。删除了 MATE 软件坞小应用,并且对 Mutiny 布局进行了优化以使用 Plank。Plank 会被系统自动应用主题。这是通过 Mate Tweak 切换到 Mutiny 布局完成的。Plank 的深色和浅色 Yaru 主题都包含在内。 + +其他调整和更新使得 Mutiny 在不改变整体风格的前提下具备了更高的可靠性 + +#### 主要应用升级 + + * Firefox 87(火狐浏览器) + * LibreOffice 7.1.2.2(办公软件) + * Evolution 3.40(邮件) + * Celluloid 0.20(视频播放器) + +#### 其他更改 + + * Linux 命令的忠实用户会喜欢在 Ubuntu MATE 中默认安装的 `neofetch`、`htop` 和 `inxi` 之类的命令。 + * 树莓派的 21.04 版本很快将会发布。 + * Ubuntu MATE 上没有离线升级选项。 + * 针对侧边和底部软件坞引入了新的 Plank 主题,使其与 Yaru MATE 的配色方案相匹配。 + * Yaru MATE 的窗口管理器为侧边平铺的窗口应用了简洁的边缘风格。 + * Ubuntu MATE 欢迎窗口有多种色彩可供选择。 + * Yaru MATE 主题和图标主题的快照包已在 Snap Store 中发布。 + * 为 Ubuntu MATE 20.04 LTS 的用户发布了 Yaru MATE PPA。 + +### 下载 Ubuntu MATE 21.04 + +你可以从官网上下载镜像: + +- [Ubuntu MATE 21.04][3] + +如果你对此感兴趣,[请查看发行说明][4]。 + +你对尝试新的 Yaru MATE 感到兴奋吗?你觉得怎么样?请在下面的评论中告诉我们。 + +-------------------------------------------------------------------------------- + +via: https://news.itsfoss.com/ubuntu-mate-21-04-release/ + +作者:[Asesh Basu][a] +选题:[lujun9972][b] +译者:[Kevin3599](https://github.com/Kevin3599) +校对:[wxy](https://github.com/wxy) + +本文由 [LCTT](https://github.com/LCTT/TranslateProject) 原创编译,[Linux中国](https://linux.cn/) 荣誉推出 + +[a]: https://news.itsfoss.com/author/asesh/ +[b]: https://github.com/lujun9972 +[1]: https://i0.wp.com/news.itsfoss.com/wp-content/uploads/2021/04/yaru-mate-mutiny-dark.jpg?resize=1568%2C882&ssl=1 +[2]: https://i0.wp.com/news.itsfoss.com/wp-content/uploads/2021/04/yaru-mate-mutiny-dark.jpg?resize=1568%2C882&ssl=1 +[3]: https://ubuntu-mate.org/download/ +[4]: https://discourse.ubuntu.com/t/hirsute-hippo-release-notes/19221 \ No newline at end of file diff --git a/published/202105/20210424 Making computers more accessible and sustainable with Linux.md b/published/202105/20210424 Making computers more accessible and sustainable with Linux.md new file mode 100644 index 0000000000..b405dcb76d --- /dev/null +++ b/published/202105/20210424 Making computers more accessible and sustainable with Linux.md @@ -0,0 +1,74 @@ +[#]: subject: (Making computers more accessible and sustainable with Linux) +[#]: via: (https://opensource.com/article/21/4/linux-free-geek) +[#]: author: (Don Watkins https://opensource.com/users/don-watkins) +[#]: collector: (lujun9972) +[#]: translator: (geekpi) +[#]: reviewer: (wxy) +[#]: publisher: (wxy) +[#]: url: (https://linux.cn/article-13362-1.html) + +用 Linux 使计算机更容易使用和可持续 +====== + +> Free Geek 是一个非营利组织,通过向有需要的人和团体提供 Linux 电脑,帮助减少数字鸿沟。 + +![](https://img.linux.net.cn/data/attachment/album/202105/05/135048extplppp7miznpdp.jpg) + +有很多理由选择 Linux 作为你的桌面操作系统。在 [为什么每个人都应该选择 Linux][2] 中,Seth Kenlon 强调了许多选择 Linux 的最佳理由,并为人们提供了许多开始使用该操作系统的方法。 + +这也让我想到了我通常向人们介绍 Linux 的方式。这场大流行增加了人们上网购物、远程教育以及与家人和朋友 [通过视频会议][3] 联系的需求。 + +我和很多有固定收入的退休人员一起工作,他们并不特别精通技术。对于这些人中的大多数人来说,购买电脑是一项充满担忧的大投资。我的一些朋友和客户对在大流行期间去零售店感到不舒服,而且他们完全不熟悉如何买电脑,无论是台式机还是笔记本电脑,即使在非大流行时期。他们来找我,询问在哪里买,要注意些什么。 + +我总是想看到他们得到一台 Linux 电脑。他们中的许多人买不起名牌供应商出售的 Linux 设备。直到最近,我一直在为他们购买翻新的设备,然后用 Linux 改装它们。 + +但是,当我发现 [Free Geek][4] 时,这一切都改变了,这是一个位于俄勒冈州波特兰的非营利组织,它的使命是“可持续地重复使用技术,实现数字访问,并提供教育,以创建一个使人们能够实现其潜力的社区。” + +Free Geek 有一个 eBay 商店,我在那里以可承受的价格购买了几台翻新的笔记本电脑。他们的电脑都安装了 [Linux Mint][5]。 事实上,电脑可以立即使用,这使得向 [新用户介绍 Linux][6] 很容易,并帮助他们快速体验操作系统的力量。 + +### 让电脑继续使用,远离垃圾填埋场 + +Oso Martin 在 2000 年地球日发起了 Free Geek。该组织为其志愿者提供课程和工作计划,对他们进行翻新和重建捐赠电脑的培训。志愿者们在服务 24 小时后还会收到一台捐赠的电脑。 + +这些电脑在波特兰的 Free Geek 实体店和 [网上][7] 出售。该组织还通过其项目 [Plug Into Portland][8]、[Gift a Geekbox][9] 以及[组织][10]和[社区资助][11]向有需要的人和实体提供电脑。 + +该组织表示,它已经“从垃圾填埋场翻新了 200 多万件物品,向非营利组织、学校、社区变革组织和个人提供了 75000 多件技术设备,并从 Free Geek 学习者那里提供了 5000 多课时”。 + +### 参与其中 + +自成立以来,Free Geek 已经从 3 名员工发展到近 50 名员工,并得到了世界各地的认可。它是波特兰市的 [数字包容网络][12] 的成员。 + +你可以在 [Twitter][13]、[Facebook][14]、[LinkedIn][15]、[YouTube][16] 和 [Instagram][17] 上与 Free Geek 联系。你也可以订阅它的[通讯][18]。从 Free Geek 的 [商店][19] 购买物品,可以直接支持其工作,减少数字鸿沟。 + +-------------------------------------------------------------------------------- + +via: https://opensource.com/article/21/4/linux-free-geek + +作者:[Don Watkins][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/don-watkins +[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://opensource.com/article/21/2/try-linux +[3]: https://opensource.com/article/20/8/linux-laptop-video-conferencing +[4]: https://www.freegeek.org/ +[5]: https://opensource.com/article/21/4/restore-macbook-linux +[6]: https://opensource.com/article/18/12/help-non-techies +[7]: https://www.ebay.com/str/freegeekbasicsstore +[8]: https://www.freegeek.org/our-programs/plug-portland +[9]: https://www.freegeek.org/our-programs/gift-geekbox +[10]: https://www.freegeek.org/our-programs-grants/organizational-hardware-grants +[11]: https://www.freegeek.org/our-programs-grants/community-hardware-grants +[12]: https://www.portlandoregon.gov/oct/73860 +[13]: https://twitter.com/freegeekpdx +[14]: https://www.facebook.com/freegeekmothership +[15]: https://www.linkedin.com/company/free-geek/ +[16]: https://www.youtube.com/user/FreeGeekMothership +[17]: https://www.instagram.com/freegeekmothership/ +[18]: https://app.e2ma.net/app2/audience/signup/1766417/1738557/?v=a +[19]: https://www.freegeek.org/shop diff --git a/published/202105/20210425 Play retro video games on Linux with this open source project.md b/published/202105/20210425 Play retro video games on Linux with this open source project.md new file mode 100644 index 0000000000..4117da3f5c --- /dev/null +++ b/published/202105/20210425 Play retro video games on Linux with this open source project.md @@ -0,0 +1,119 @@ +[#]: subject: (Play retro video games on Linux with this open source project) +[#]: via: (https://opensource.com/article/21/4/scummvm-retro-gaming) +[#]: author: (Joshua Allen Holm https://opensource.com/users/holmja) +[#]: collector: (lujun9972) +[#]: translator: (wxy) +[#]: reviewer: (wxy) +[#]: publisher: (wxy) +[#]: url: (https://linux.cn/article-13433-1.html) + +用这个开源项目在 Linux 上玩复古视频游戏 +====== + +> ScummVM 是在现代硬件上玩老式视频游戏的最直接的方法之一。 + +![](https://img.linux.net.cn/data/attachment/album/202105/28/061555r14mbzb1g1n545rr.jpg) + +玩冒险游戏一直是我使用计算机经验的一个重要部分。从最早的基于文本的冒险游戏到 2D 像素艺术、全动态视频和 3D 游戏,冒险游戏类型为我提供了很多美好的回忆。 + +有时我想重温那些老游戏,但它们很多都是在 Linux 出现之前发布的,那么我如何去重玩这些游戏呢?我使用 [ScummVM][2],说实话,这是我最喜欢的开源项目之一。 + +### 什么是 ScummVM + +![ScummVM][3] + +ScummVM 是一个设计用来在现代硬件上玩老式冒险游戏的程序。ScummVM 最初是为了运行使用卢卡斯艺术LucasArt疯狂豪宅脚本创作工具Script Creation Utility for Maniac Mansion(SCUMM)开发的游戏,现在支持许多不同的游戏引擎。它可以支持几乎所有经典的雪乐山娱乐Sierra On-Line和卢卡斯艺术的冒险游戏,以及其他发行商的大量冒险游戏。ScummVM 并不支持所有的冒险游戏(目前),但它可以用来玩数百种冒险游戏。ScummVM 可用于多个平台,包括 Windows、macOS、Linux、Android、iOS 和一些游戏机。 + +### 为什么使用 ScummVM + +有很多方法可以在现代硬件上玩老游戏,但它们往往比使用 ScummVM 更复杂。[DOSBox][5] 可以用来玩 DOS 游戏,但它需要调整设置,使其以正确的速度进行游戏。Windows 游戏可以用 [WINE][6] 来玩,但这需要游戏及其安装程序都与 WINE 兼容。 + +即使游戏可以在 WINE 下运行,一些游戏仍然不能在现代硬件上很好地运行,因为硬件的速度太快了。这方面的一个例子是《国王密使 6King's Quest VI》中的一个谜题,它涉及将点燃的鞭炮带到某个地方。在现代硬件上,鞭炮爆炸的速度太快了,这使得在角色不死很多次的情况下不可能到达正确的位置。 + +ScummVM 消除了其他玩复古冒险游戏的方法中存在的许多问题。如果是 ScummVM 支持的游戏,那么它的配置和玩都很简单。在大多数情况下,将游戏文件从原始游戏光盘复制到一个目录,并在 ScummVM 中添加该目录,就可以玩该游戏了。对于多张光盘上的游戏,可能需要重命名一些文件以避免文件名冲突。需要哪些数据文件的说明以及任何重命名的说明都记录在 [每个支持的游戏][7] 的 ScummVM 维基页面上。 + +ScummVM 的一个奇妙之处在于,每一个新版本都会增加对更多游戏的支持。ScummVM 2.2.0 增加了对十几种互动小说解释器的支持,这意味着 ScummVM 现在可以玩数百种基于文本的冒险游戏。ScummVM 的开发分支应该很快就会变成 2.3.0 版本,它整合了 [ResidualVM][8] 对 3D 冒险游戏的支持,所以现在 ScummVM 可以用来玩《冥界狂想曲Grim Fandango》、《神秘岛 3:放逐者Myst III: Exile
》和《最长的旅程The Longest Journey》。其开发分支最近还增加了对使用 [Adventure Game Studio][9] 创建的游戏的支持,这为 ScummVM 增加了成百上千的游戏。 + +### 如何安装 ScummVM + +如果你想从你的 Linux 发行版的仓库中安装 ScummVM,过程非常简单。你只需要运行一个命令。然而,你的发行版可能会提供一个旧版本的 ScummVM,它不像最新版本那样支持许多游戏,所以要记住这一点。 + +在 Debian/Ubuntu 上安装 ScummVM: + +``` +sudo apt install scummvm +``` + +在 Fedora 上安装 ScummVM: + +``` +sudo dnf install scummvm +``` + +#### 使用 Flatpak 或 Snap 安装 ScummVM + +ScummVM 也可以以 Flatpak 和 Snap 的形式提供。如果你使用这些方式之一,你可以使用以下命令来安装相关的版本,它应该总是 ScummVM 的最新版本。 + +``` +flatpak install flathub org.scummvm.ScummVM +``` + +或 + +``` +snap install scummvm +``` + +#### 编译 ScummVM 的开发分支 + +如果你想尝试 ScummVM 尚未稳定的开发分支中的最新和主要的功能,你可以通过编译 ScummVM 的源代码来实现。请注意,开发分支是不断变化的,所以事情可能不总是正确的。如果你仍有兴趣尝试开发分支,请按照下面的说明进行。 + +首先,你需要为你的发行版准备必要的开发工具和库,这些工具和库在 ScummVM 维基上的 [编译 ScummVM/GCC][10] 页面列出。 + +一旦你安装了先决条件,运行以下命令: + +``` +git clone +cd scummvm +./configure +make +sudo make install +``` + +### 向 ScummVM 添加游戏 + +将游戏添加到 ScummVM 是你在游戏前需要做的最后一件事。如果你的收藏集中没有任何支持的冒险游戏,你可以从 [ScummVM 游戏][11] 页面下载 11 个精彩的游戏。你还可以从 [GOG.com][12] 购买许多 ScummVM 支持的游戏。如果你从 GOG.com 购买了游戏,并需要从 GOG 下载中提取游戏文件,你可以使用 [innoextract][13] 工具。 + +大多数游戏需要放在自己的目录中(唯一的例外是由单个数据文件组成的游戏),所以最好先创建一个目录来存储你的 ScummVM 游戏。你可以使用命令行或图形化文件管理器来完成这个工作。在哪里存储游戏并不重要(除了 ScummVM Flatpak,它是一个沙盒,要求游戏存储在 `~/Documents` 目录中)。创建这个目录后,将每个游戏的数据文件放在各自的子目录中。 + +一旦文件被复制到你想要的地方,运行 ScummVM,并通过点击“Add Game…”将游戏添加到收藏集中,在打开的文件选择器对话框中选择适当的目录,并点击“Choose”。如果 ScummVM 正确检测到游戏,它将打开其设置选项。如果你想的话,你可以从各个标签中选择高级配置选项(也可以在以后通过使用“Edit Game…”按钮进行更改),或者你可以直接点击“OK”,以默认选项添加游戏。如果没有检测到游戏,请查看 ScummVM 维基上的 [支持的游戏][14] 页面,以了解特定游戏的数据文件可能需要的特殊说明的细节。 + +现在唯一要做的就是在 ScummVM 的游戏列表中选择游戏,点击“Start”,享受重温旧爱或首次体验经典冒险游戏的乐趣。 + +-------------------------------------------------------------------------------- + +via: https://opensource.com/article/21/4/scummvm-retro-gaming + +作者:[Joshua Allen Holm][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/holmja +[b]: https://github.com/lujun9972 +[1]: https://opensource.com/sites/default/files/styles/image-full-size/public/lead-images/open_gaming_games_roundup_news.png?itok=KM0ViL0f (Gaming artifacts with joystick, GameBoy, paddle) +[2]: https://www.scummvm.org/ +[3]: https://opensource.com/sites/default/files/uploads/scummvm.png (ScummVM) +[4]: https://creativecommons.org/licenses/by-sa/4.0/ +[5]: https://www.dosbox.com/ +[6]: https://www.winehq.org/ +[7]: https://wiki.scummvm.org/index.php?title=Category:Supported_Games +[8]: https://www.residualvm.org/ +[9]: https://www.adventuregamestudio.co.uk/ +[10]: https://wiki.scummvm.org/index.php/Compiling_ScummVM/GCC +[11]: https://www.scummvm.org/games/ +[12]: https://www.gog.com/ +[13]: https://constexpr.org/innoextract/ +[14]: https://wiki.scummvm.org/index.php/Category:Supported_Games diff --git a/published/202105/20210426 3 beloved USB drive Linux distros.md b/published/202105/20210426 3 beloved USB drive Linux distros.md new file mode 100644 index 0000000000..505b90a5e2 --- /dev/null +++ b/published/202105/20210426 3 beloved USB drive Linux distros.md @@ -0,0 +1,87 @@ +[#]: subject: (3 beloved USB drive Linux distros) +[#]: via: (https://opensource.com/article/21/4/usb-drive-linux-distro) +[#]: author: (Seth Kenlon https://opensource.com/users/seth) +[#]: collector: (lujun9972) +[#]: translator: (geekpi) +[#]: reviewer: (wxy) +[#]: publisher: (wxy) +[#]: url: (https://linux.cn/article-13355-1.html) + +爱了!3 个受欢迎的 U 盘 Linux 发行版 +====== + +> 开源技术人员对此深有体会。 + +![](https://img.linux.net.cn/data/attachment/album/202105/03/104610np5piwaavaa5qu2u.jpg) + +Linux 用户几乎都会记得他们第一次发现无需实际安装,就可以用 Linux 引导计算机并在上面运行。当然,许多用户都知道可以引导计算机进入操作系统安装程序,但是 Linux 不同:它根本就不需要安装!你的计算机甚至不需要有一个硬盘。你可以通过一个 U 盘运行 Linux 几个月甚至几 _年_。 + +自然,有几种不同的 “临场live” Linux 发行版可供选择。我们向我们的作者们询问了他们的最爱,他们的回答如下。 + +### 1、Puppy Linux + +“作为一名前 **Puppy Linux** 开发者,我对此的看法自然有些偏见,但 Puppy 最初吸引我的地方是: + + * 它专注于第三世界国家容易获得的低端和老旧硬件。这为买不起最新的现代系统的贫困地区开放了计算能力 + * 它能够在内存中运行,可以利用该能力提供一些有趣的安全优势 + * 它在一个单一的 SFS 文件中处理用户文件和会话,使得备份、恢复或移动你现有的桌面/应用/文件到另一个安装中只需一个拷贝命令” + +—— [JT Pennington][2] + +“对我来说,一直就是 **Puppy Linux**。它启动迅速,支持旧硬件。它的 GUI 很容易就可以说服别人第一次尝试 Linux。” —— [Sachin Patil][3] + +“Puppy 是真正能在任何机器上运行的临场发行版。我有一台废弃的 microATX 塔式电脑,它的光驱坏了,也没有硬盘(为了数据安全,它已经被拆掉了),而且几乎没有多少内存。我把 Puppy 插入它的 SD 卡插槽,运行了好几年。” —— [Seth Kenlon][4] + +“我在使用 U 盘上的 Linux 发行版没有太多经验,但我把票投给 **Puppy Linux**。它很轻巧,非常适用于旧机器。”  —— [Sergey Zarubin][5] + +### 2、Fedora 和 Red Hat + +“我最喜欢的 USB 发行版其实是 **Fedora Live USB**。它有浏览器、磁盘工具和终端仿真器,所以我可以用它来拯救机器上的数据,或者我可以浏览网页或在需要时用 ssh 进入其他机器做一些工作。所有这些都不需要在 U 盘或在使用中的机器上存储任何数据,不会在受到入侵时被泄露。” —— [Steve Morris][6] + +“我曾经用过 Puppy 和 DSL。如今,我有两个 U 盘:**RHEL7** 和 **RHEL8**。 这两个都被配置为完整的工作环境,能够在 UEFI 和 BIOS 上启动。当我有问题要解决而又面对随机的硬件时,在现实生活中这就是时间的救星。” —— [Steven Ellis][7] + +### 3、Porteus + +“不久前,我安装了 Porteus 系统每个版本的虚拟机。很有趣,所以有机会我会再试试它们。每当提到微型发行版的话题时,我总是想起我记得的第一个使用的发行版:**tomsrtbt**。它总是安装适合放在软盘上来设计。我不知道它现在有多大用处,但我想我应该把它也算上。”  —— [Alan Formy-Duval][8] + +“作为一个 Slackware 的长期用户,我很欣赏 **Porteus** 提供的 Slack 的最新版本和灵活的环境。你可以用运行在内存中的 Porteus 进行引导,这样就不需要把 U 盘连接到你的电脑上,或者你可以从驱动器上运行,这样你就可以保留你的修改。打包应用很容易,而且 Slacker 社区有很多现有的软件包。这是我唯一需要的实时发行版。” —— [Seth Kenlon][4] + +### 其它:Knoppix + +“我已经有一段时间没有使用过 **Knoppix** 了,但我曾一度经常使用它来拯救那些被恶意软件破坏的 Windows 电脑。它最初于 2000 年 9 月发布,此后一直在持续开发。它最初是由 Linux 顾问 Klaus Knopper 开发并以他的名字命名的,被设计为临场 CD。我们用它来拯救由于恶意软件和病毒而变得无法访问的 Windows 系统上的用户文件。” —— [Don Watkins][9] + +“Knoppix 对临场 Linux 影响很大,但它也是对盲人用户使用最方便的发行版之一。它的 [ADRIANE 界面][10] 被设计成可以在没有视觉显示器的情况下使用,并且可以处理任何用户可能需要从计算机上获得的所有最常见的任务。” —— [Seth Kenlon][11] + +### 选择你的临场 Linux + +有很多没有提到的,比如 [Slax][12](一个基于 Debian 的实时发行版)、[Tiny Core][13]、[Slitaz][14]、[Kali][15](一个以安全为重点的实用程序发行版)、[E-live][16],等等。如果你有一个空闲的 U 盘,请把 Linux 放在上面,在任何时候都可以在任何电脑上使用 Linux! + +-------------------------------------------------------------------------------- + +via: https://opensource.com/article/21/4/usb-drive-linux-distro + +作者:[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/linux_keyboard_desktop.png?itok=I2nGw78_ (Linux keys on the keyboard for a desktop computer) +[2]: https://opensource.com/users/jtpennington +[3]: https://opensource.com/users/psachin +[4]: http://opensource.com/users/seth +[5]: https://opensource.com/users/sergey-zarubin +[6]: https://opensource.com/users/smorris12 +[7]: https://opensource.com/users/steven-ellis +[8]: https://opensource.com/users/alanfdoss +[9]: https://opensource.com/users/don-watkins +[10]: https://opensource.com/life/16/7/knoppix-adriane-interface +[11]: https://opensource.com/article/21/4/opensource.com/users/seth +[12]: http://slax.org +[13]: http://www.tinycorelinux.net/ +[14]: http://www.slitaz.org/en/ +[15]: http://kali.org +[16]: https://www.elivecd.org/ diff --git a/published/202105/20210427 An Open-Source App to Control All Your RGB Lighting Settings.md b/published/202105/20210427 An Open-Source App to Control All Your RGB Lighting Settings.md new file mode 100644 index 0000000000..b9a5ec566e --- /dev/null +++ b/published/202105/20210427 An Open-Source App to Control All Your RGB Lighting Settings.md @@ -0,0 +1,92 @@ +[#]: subject: (An Open-Source App to Control All Your RGB Lighting Settings) +[#]: via: (https://itsfoss.com/openrgb/) +[#]: author: (Ankush Das https://itsfoss.com/author/ankush/) +[#]: collector: (lujun9972) +[#]: translator: (geekpi) +[#]: reviewer: (wxy) +[#]: publisher: (wxy) +[#]: url: (https://linux.cn/article-13377-1.html) + +OpenRGB:一个控制所有 RGB 灯光设置的开源应用 +====== + +> OpenRGB 是一个有用的开源工具,可以一个工具管理所有的 RGB 灯光。让我们来了解一下它。 + +![](https://img.linux.net.cn/data/attachment/album/202105/10/113851zqod756ft373tz36.jpg) + +无论是你的键盘、鼠标、CPU 风扇、AIO,还是其他连接的外围设备或组件,Linux 都没有官方软件支持来控制 RGB 灯光。 + +而 OpenRGB 似乎是一个适用于 Linux 的多合一 RGB 灯光控制工具。 + +### OpenRGB:多合一的 RGB 灯光控制中心 + +![][1] + +是的,你可能会找到不同的工具来调整设置,如 **Piper** 专门 [在 Linux 上配置游戏鼠标][2]。但是,如果你有各种组件或外设,要把它们都设置成你喜欢的 RGB 颜色,那将是一件很麻烦的事情。 + +OpenRGB 是一个令人印象深刻的工具,它不仅专注于 Linux,也可用于 Windows 和 MacOS。 + +它不仅仅是一个将所有 RGB 灯光设置放在一个工具下的想法,而是旨在摆脱所有需要安装来调整灯光设置的臃肿软件。 + +即使你使用的是 Windows 系统的机器,你可能也知道像 Razer Synapse 这样的软件工具是占用资源的,并伴随着它们的问题。因此,OpenRGB 不仅仅局限于 Linux 用户,还适用于每一个希望调整 RGB 设置的用户。 + +它支持大量设备,但你不应该期待对所有设备的支持。 + +### OpenRGB 的特点 + +![][3] + +它在提供简单的用户体验的同时,赋予了你许多有用的功能。其中的一些特点是: + + * 轻便的用户界面 + * 跨平台支持 + * 能够使用插件扩展功能 + * 设置颜色和效果 + * 能够保存和加载配置文件 + * 查看设备信息 + * 连接 OpenRGB 的多个实例,在多台电脑上同步灯光 + +![][4] + +除了上述所有的特点外,你还可以很好地控制照明区域、色彩模式、颜色等。 + +### 在 Linux 中安装 OpenRGB + +你可以在其官方网站上找到 AppImage 文件和 DEB 包。对于 Arch Linux 用户,你也可以在 [AUR][5] 中找到它。 + +如需更多帮助,你可以参考我们的 [AppImage 指南][6]和[安装 DEB 文件的方法][7]来设置。 + +官方网站应该也可以让你下载其他平台的软件包。但是,如果你想探索更多关于它的信息或自己编译它,请前往它的 [GitLab 页面][8]。 + +- [OpenRGB][9] + +### 总结 + +尽管我没有很多支持 RGB 的设备/组件,但我可以成功地调整我的罗技 G502 鼠标。 + +如果你想摆脱多个应用,用一个轻量级的界面来管理你所有的 RGB 灯光,我肯定会推荐你试一试。 + +你已经试过它了吗?欢迎在评论中分享你对它的看法! + +-------------------------------------------------------------------------------- + +via: https://itsfoss.com/openrgb/ + +作者:[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/2021/04/openrgb.jpg?resize=800%2C406&ssl=1 +[2]: https://itsfoss.com/piper-configure-gaming-mouse-linux/ +[3]: https://i2.wp.com/itsfoss.com/wp-content/uploads/2021/04/openrgb-supported-devices.jpg?resize=800%2C404&ssl=1 +[4]: https://i1.wp.com/itsfoss.com/wp-content/uploads/2021/04/openrgb-logi.jpg?resize=800%2C398&ssl=1 +[5]: https://itsfoss.com/aur-arch-linux/ +[6]: https://itsfoss.com/use-appimage-linux/ +[7]: https://itsfoss.com/install-deb-files-ubuntu/ +[8]: https://gitlab.com/CalcProgrammer1/OpenRGB +[9]: https://openrgb.org/ diff --git a/published/202105/20210427 Fedora Linux 34 is officially here.md b/published/202105/20210427 Fedora Linux 34 is officially here.md new file mode 100644 index 0000000000..ac0df71962 --- /dev/null +++ b/published/202105/20210427 Fedora Linux 34 is officially here.md @@ -0,0 +1,75 @@ +[#]: subject: (Fedora Linux 34 is officially here!) +[#]: via: (https://fedoramagazine.org/announcing-fedora-34/) +[#]: author: (Matthew Miller https://fedoramagazine.org/author/mattdm/) +[#]: collector: (lujun9972) +[#]: translator: (geekpi) +[#]: reviewer: (wxy) +[#]: publisher: (wxy) +[#]: url: (https://linux.cn/article-13365-1.html) + +Fedora Linux 34 各版本介绍 +====== + +![](https://img.linux.net.cn/data/attachment/album/202105/06/121307el07t08iiw01j7q8.jpg) + +今天(4/27),我很高兴地与大家分享成千上万的 Fedora 项目贡献者的辛勤工作成果:我们的最新版本,Fedora Linux 34 来了!我知道你们中的很多人一直在等待。我在社交媒体和论坛上看到的“它出来了吗?”的期待比我记忆中的任何一个版本都多。所以,如果你想的话,不要再等了,[现在升级][2] 或者去 [获取 Fedora][3] 下载一个安装镜像。或者,如果你想先了解更多,请继续阅读。  + +你可能注意到的第一件事是我们漂亮的新标志。这个新标志是由 Fedora 设计团队根据广大社区的意见开发的,它在保持 Fedoraness 的同时解决了我们旧标志的很多技术问题。请继续关注以新设计为特色的 Fedora 宣传品。 + +### 适合各种使用场景的 Fedora Linux + +Fedora Editions 面向桌面、服务器、云环境和物联网等各种特定场景。 + +Fedora Workstation 专注于台式机,尤其是面向那些希望获得“正常使用”的 Linux 操作系统体验的软件开发者。这个版本的带来了 [GNOME 40][4],这是专注、无干扰计算的下一步。无论你使用触控板、键盘还是鼠标,GNOME 40 都带来了导航方面的改进。应用网格和设置已经被重新设计,以使交互更加直观。你可以从 3 月份的 [Fedora Magazine][5] 文章中阅读更多的变化和原因。 + +Fedora CoreOS 是一个新兴的 Fedora 版本。它是一个自动更新的最小化操作系统,用于安全和大规模地运行容器化工作负载。它提供了几个更新流,跟随它之后大约每两周自动更新一次,当前,next 流基于 Fedora Linux 34,随后是 testing 流和 stable 流。你可以从 [下载页面][6] 中找到关于跟随 next 流的已发布工件的信息,以及在 [Fedora CoreOS 文档][7] 中找到如何使用这些工件的信息。 + +Fedora IoT 为物联网生态系统和边缘计算场景提供了一个强大的基础。在这个版本中,我们改善了对流行的 ARM 设备的支持,如 Pine64、RockPro64 和 Jetson Xavier NX。一些 i.MX8 片上系统设备,如 96boards Thor96 和 Solid Run HummingBoard-M 的硬件支持也有所改善。此外,Fedora IoT 34 改进了对用于自动系统恢复的硬件看门狗的支持。 + +当然,我们不仅仅提供 Editions。[Fedora Spins][8] 和 [Labs][9] 针对不同的受众和使用情况,例如 [Fedora Jam][10],它允许你释放你内心的音乐家,以及像新的 Fedora i3 Spin 这样的桌面环境,它提供了一个平铺的窗口管理器。还有,别忘了我们的备用架构。[ARM AArch64 Power 和 S390x][11]。 + +### 一般性改进 + +无论你使用的是 Fedora 的哪个变种,你都会得到开源世界所能提供的最新成果。秉承我们的 “[First][12]” 原则,我们已经更新了关键的编程语言和系统库包,包括 Ruby 3.0 和 Golang 1.16。在 Fedora KDE Plasma 中,我们已经从 X11 切换到 Wayland 作为默认。 + +在 Fedora Linux 33 中 BTRFS 作为桌面变体中的默认文件系统引入之后,我们又引入了 [BTRFS 文件系统的透明压缩][13]。 + +我们很高兴你能试用这个新发布版本!现在就去 下载它。或者如果你已经在运行 Fedora Linux,请按照 [简易升级说明][2]。关于 Fedora Linux 34 的新功能的更多信息,请看 [发行说明][14]。 + +### 万一出现问题…… + +如果你遇到了问题,请查看 [Fedora 34 常见问题页面][15],如果你有问题,请访问我们的 Ask Fedora 用户支持平台。 + +### 谢谢各位 + +感谢在这个发布周期中为 Fedora 项目做出贡献的成千上万的人,特别是那些在大流行期间为使这个版本按时发布而付出额外努力的人。Fedora 是一个社区,很高兴看到我们如此互相支持! + +-------------------------------------------------------------------------------- + +via: https://fedoramagazine.org/announcing-fedora-34/ + +作者:[Matthew Miller][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/mattdm/ +[b]: https://github.com/lujun9972 +[1]: https://fedoramagazine.org/wp-content/uploads/2021/04/f34-final-816x345.jpg +[2]: https://docs.fedoraproject.org/en-US/quick-docs/upgrading/ +[3]: https://getfedora.org +[4]: https://forty.gnome.org/ +[5]: https://fedoramagazine.org/fedora-34-feature-focus-updated-activities-overview/ +[6]: https://getfedora.org/en/coreos +[7]: https://docs.fedoraproject.org/en-US/fedora-coreos/ +[8]: https://spins.fedoraproject.org/ +[9]: https://labs.fedoraproject.org/ +[10]: https://labs.fedoraproject.org/en/jam/ +[11]: https://alt.fedoraproject.org/alt/ +[12]: https://docs.fedoraproject.org/en-US/project/#_first +[13]: https://fedoramagazine.org/fedora-workstation-34-feature-focus-btrfs-transparent-compression/ +[14]: https://docs.fedoraproject.org/en-US/fedora/f34/release-notes/ +[15]: https://fedoraproject.org/wiki/Common_F34_bugs +[16]: https://hopin.com/events/fedora-linux-34-release-party diff --git a/published/202105/20210427 Perform Linux memory forensics with this open source tool.md b/published/202105/20210427 Perform Linux memory forensics with this open source tool.md new file mode 100644 index 0000000000..85fd06058b --- /dev/null +++ b/published/202105/20210427 Perform Linux memory forensics with this open source tool.md @@ -0,0 +1,485 @@ +[#]: subject: (Perform Linux memory forensics with this open source tool) +[#]: via: (https://opensource.com/article/21/4/linux-memory-forensics) +[#]: author: (Gaurav Kamathe https://opensource.com/users/gkamathe) +[#]: collector: (lujun9972) +[#]: translator: (ShuyRoy) +[#]: reviewer: (wxy) +[#]: publisher: (wxy) +[#]: url: (https://linux.cn/article-13425-1.html) + +使用开源工具进行 Linux 内存取证 +====== + +> 利用 Volatility 找出应用程序、网络连接、内核模块、文件等方面的情况。 + +![](https://img.linux.net.cn/data/attachment/album/202105/26/111959fzkhzf7q3qwmhh7z.jpg) + +计算机的操作系统和应用使用主内存(RAM)来执行不同的任务。这种易失性内存包含大量关于运行应用、网络连接、内核模块、打开的文件以及几乎所有其他的内容信息,但这些信息每次计算机重启的时候都会被清除。 + +内存取证Memory forensics是一种从内存中找到和抽取这些有价值的信息的方式。[Volatility][2] 是一种使用插件来处理这类信息的开源工具。但是,存在一个问题:在你处理这些信息前,必须将物理内存转储到一个文件中,而 Volatility 没有这种能力。 + +因此,这篇文章分为两部分: + + * 第一部分是处理获取物理内存并将其转储到一个文件中。 + * 第二部分使用 Volatility 从这个内存转储中读取并处理这些信息。 + +我在本教程中使用了以下测试系统,不过它可以在任何 Linux 发行版上工作: + +``` +$ cat /etc/redhat-release +Red Hat Enterprise Linux release 8.3 (Ootpa) +$ +$ uname -r +4.18.0-240.el8.x86_64 +$ +``` + +> **注意事项:** 部分 1 涉及到编译和加载一个内核模块。不要担心:它并不像听起来那么困难。 +> +> 一些指南: +> +> * 按照以下的步骤。 +> * 不要在生产系统或你的主要计算机上尝试任何这些步骤。 +> * 始终使用测试的虚拟机(VM)来尝试,直到你熟悉使用这些工具并理解它们的工作原理为止。 + +### 安装需要的包 + +在开始之前安装必要的工具。如果你经常使用基于 Debian 的发行版,可以使用 `apt-get` 命令。这些包大多数提供了需要的内核信息和工具来编译代码: + +``` +$ yum install kernel-headers kernel-devel gcc elfutils-libelf-devel make git libdwarf-tools python2-devel.x86_64-y +``` + +### 部分 1:使用 LiME 获取内存并将其转储到一个文件中 + +在开始分析内存之前,你需要一个内存转储供你使用。在实际的取证活动中,这可能来自一个被破坏或者被入侵的系统。这些信息通常会被收集和存储来分析入侵是如何发生的及其影响。由于你可能没有可用的内存转储,你可以获取你的测试 VM 的内存转储,并使用它来执行内存取证。 + +Linux 内存提取器Linux Memory Extractor([LiME][3])是一个在 Linux 系统上获取内存很常用的工具。使用以下命令获得 LiME: + +``` +$ git clone https://github.com/504ensicsLabs/LiME.git +$ +$ cd LiME/src/ +$ +$ ls +deflate.c  disk.c  hash.c  lime.h  main.c  Makefile  Makefile.sample  tcp.c +$ +``` + +#### 构建 LiME 内核模块 + +在 `src` 文件夹下运行 `make` 命令。这会创建一个以 .ko 为扩展名的内核模块。理想情况下,在 `make` 结束时,`lime.ko` 文件会使用格式 `lime-.ko` 被重命名。 + +``` +$ make +make -C /lib/modules/4.18.0-240.el8.x86_64/build M="/root/LiME/src" modules +make[1]: Entering directory '/usr/src/kernels/4.18.0-240.el8.x86_64' + +<< 删节 >> + +make[1]: Leaving directory '/usr/src/kernels/4.18.0-240.el8.x86_64' +strip --strip-unneeded lime.ko +mv lime.ko lime-4.18.0-240.el8.x86_64.ko +$ +$ +$ ls -l lime-4.18.0-240.el8.x86_64.ko +-rw-r--r--. 1 root root 25696 Apr 17 14:45 lime-4.18.0-240.el8.x86_64.ko +$ +$ file lime-4.18.0-240.el8.x86_64.ko +lime-4.18.0-240.el8.x86_64.ko: ELF 64-bit LSB relocatable, x86-64, version 1 (SYSV), BuildID[sha1]=1d0b5cf932389000d960a7e6b57c428b8e46c9cf, not stripped +$ +``` + +#### 加载LiME 内核模块 + +现在是时候加载内核模块来获取系统内存了。`insmod` 命令会帮助加载内核模块;模块一旦被加载,会在你的系统上读取主内存(RAM)并且将内存的内容转储到命令行所提供的 `path` 目录下的文件中。另一个重要的参数是 `format`;保持 `lime` 的格式,如下所示。在插入内核模块之后,使用 `lsmod` 命令验证它是否真的被加载。 + +``` +$ lsmod  | grep lime +$ +$ insmod ./lime-4.18.0-240.el8.x86_64.ko "path=../RHEL8.3_64bit.mem format=lime" +$ +$ lsmod  | grep lime +lime                   16384  0 +$ +``` + +你应该看到给 `path` 命令的文件已经创建好了,而且文件大小与你系统的物理内存(RAM)大小相同(并不奇怪)。一旦你有了内存转储,你就可以使用 `rmmod` 命令删除该内核模块: + +``` +$ +$ ls -l ~/LiME/RHEL8.3_64bit.mem +-r--r--r--. 1 root root 4294544480 Apr 17 14:47 /root/LiME/RHEL8.3_64bit.mem +$ +$ du -sh ~/LiME/RHEL8.3_64bit.mem +4.0G    /root/LiME/RHEL8.3_64bit.mem +$ +$ free -m +              total        used        free      shared  buff/cache   available +Mem:           3736         220         366           8        3149        3259 +Swap:          4059           8        4051 +$ +$ rmmod lime +$ +$ lsmod  | grep lime +$ +``` + +#### 内存转储中是什么? + +这个内存转储文件只是原始数据,就像使用 `file` 命令可以看到的一样。你不可能通过手动去理解它;是的,在这里边有一些 ASCII 字符,但是你无法用编辑器打开这个文件并把它读出来。`hexdump` 的输出显示,最初的几个字节是 `EmiL`;这是因为你的请求格式在上面的命令行中是 `lime`: + +``` +$ file ~/LiME/RHEL8.3_64bit.mem +/root/LiME/RHEL8.3_64bit.mem: data +$ + +$ hexdump -C ~/LiME/RHEL8.3_64bit.mem | head +00000000  45 4d 69 4c 01 00 00 00  00 10 00 00 00 00 00 00  |EMiL............| +00000010  ff fb 09 00 00 00 00 00  00 00 00 00 00 00 00 00  |................| +00000020  b8 fe 4c cd 21 44 00 32  20 00 00 2a 2a 2a 2a 2a  |..L.!D.2 ..*****| +00000030  2a 2a 2a 2a 2a 2a 2a 2a  2a 2a 2a 2a 2a 2a 2a 2a  |****************| +00000040  2a 2a 2a 2a 2a 2a 2a 2a  2a 2a 2a 2a 2a 20 00 20  |************* . | +00000050  00 00 00 00 00 00 00 00  00 00 00 00 00 00 00 00  |................| +* +00000080  00 00 00 00 00 00 00 00  00 00 00 00 70 78 65 6c  |............pxel| +00000090  69 6e 75 78 2e 30 00 00  00 00 00 00 00 00 00 00  |inux.0..........| +000000a0  00 00 00 00 00 00 00 00  00 00 00 00 00 00 00 00  |................| +$ +``` + +### 部分 2:获得 Volatility 并使用它来分析你的内存转储 + +现在你有了要分析的示例内存转储,使用下面的命令获取 Volatility 软件。Volatility 已经用 Python 3 重写了,但是本教程使用的是用 Python 2 写的原始的 Volatility 包。如果你想用 Volatility 3 进行实验,可以从合适的 Git 仓库下载它,并在以下命令中使用 Python 3 而不是 Python 2: + +``` +$ git clone https://github.com/volatilityfoundation/volatility.git +$ +$ cd volatility/ +$ +$ ls +AUTHORS.txt    contrib      LEGAL.txt    Makefile     PKG-INFO     pyinstaller.spec  resources  tools       vol.py +CHANGELOG.txt  CREDITS.txt  LICENSE.txt  MANIFEST.in  pyinstaller  README.txt        setup.py   volatility +$ +``` + +Volatility 使用两个 Python 库来实现某些功能,所以使用以下命令来安装它们。否则,在你运行 Volatility 工具时,你可能看到一些导入错误;你可以忽略它们,除非你正在运行的插件需要这些库;这种情况下,工具将会报错: + +``` +$ pip2 install pycrypto +$ pip2 install distorm3 +``` + +#### 列出 Volatility 的 Linux 配置文件 + +你将要运行的第一个 Volatility 命令列出了可用的 Linux 配置文件,运行 Volatility 命令的主要入口点是 `vol.py` 脚本。使用 Python 2 解释器调用它并提供 `--info` 选项。为了缩小输出,查找以 Linux 开头的字符串。正如你所看到的,并没有很多 Linux 配置文件被列出: + +``` +$ python2 vol.py --info  | grep ^Linux +Volatility Foundation Volatility Framework 2.6.1 +LinuxAMD64PagedMemory          - Linux-specific AMD 64-bit address space. +$ +``` + +#### 构建你自己的 Linux 配置文件 + +Linux 发行版是多种多样的,并且是为不同架构而构建的。这就是为什么配置文件是必要的 —— Volatility 在提取信息前必须知道内存转储是从哪个系统和架构获得的。有一些 Volatility 命令可以找到这些信息;但是这个方法很费时。为了加快速度,可以使用以下命令构建一个自定义的 Linux 配置文件: + +移动到 Volatility 仓库的 `tools/linux`目录下,运行 `make` 命令: + +``` +$ cd tools/linux/ +$ +$ pwd +/root/volatility/tools/linux +$ +$ ls +kcore  Makefile  Makefile.enterprise  module.c +$ +$ make +make -C //lib/modules/4.18.0-240.el8.x86_64/build CONFIG_DEBUG_INFO=y M="/root/volatility/tools/linux" modules +make[1]: Entering directory '/usr/src/kernels/4.18.0-240.el8.x86_64' +<< 删节 >> +make[1]: Leaving directory '/usr/src/kernels/4.18.0-240.el8.x86_64' +$ +``` + +你应该看到一个新的 `module.dwarf` 文件。你也需要 `/boot` 目录下的 `System.map` 文件,因为它包含了所有与当前运行的内核相关的符号: + +``` +$ ls +kcore  Makefile  Makefile.enterprise  module.c  module.dwarf +$ +$ ls -l module.dwarf +-rw-r--r--. 1 root root 3987904 Apr 17 15:17 module.dwarf +$ +$ ls -l /boot/System.map-4.18.0-240.el8.x86_64 +-rw-------. 1 root root 4032815 Sep 23  2020 /boot/System.map-4.18.0-240.el8.x86_64 +$ +$ +``` + +要创建一个自定义配置文件,移动回到 Volatility 目录并且运行下面的命令。第一个参数提供了一个自定义 .zip 文件,文件名是你自己命名的。我经常使用操作系统和内核版本来命名。下一个参数是前边创建的 `module.dwarf` 文件,最后一个参数是 `/boot` 目录下的 `System.map` 文件: + +``` +$ +$ cd volatility/ +$ +$ zip volatility/plugins/overlays/linux/Redhat8.3_4.18.0-240.zip tools/linux/module.dwarf /boot/System.map-4.18.0-240.el8.x86_64 +  adding: tools/linux/module.dwarf (deflated 91%) +  adding: boot/System.map-4.18.0-240.el8.x86_64 (deflated 79%) +$ +``` + +现在自定义配置文件就准备好了,所以在前边给出的位置检查一下 .zip 文件是否被创建好。如果你想知道 Volatility 是否检测到这个自定义配置文件,再一次运行 `--info` 命令。现在,你应该可以在下边的列出的内容中看到新的配置文件: + +``` +$ +$ ls -l volatility/plugins/overlays/linux/Redhat8.3_4.18.0-240.zip +-rw-r--r--. 1 root root 1190360 Apr 17 15:20 volatility/plugins/overlays/linux/Redhat8.3_4.18.0-240.zip +$ +$ +$ python2 vol.py --info  | grep Redhat +Volatility Foundation Volatility Framework 2.6.1 +LinuxRedhat8_3_4_18_0-240x64 - A Profile for Linux Redhat8.3_4.18.0-240 x64 +$ +$ +``` + +#### 开始使用 Volatility + +现在你已经准备好去做一些真正的内存取证了。记住,Volatility 是由自定义的插件组成的,你可以针对内存转储来获得信息。命令的通用格式是: + +``` +python2 vol.py -f --profile= +``` + +有了这些信息,运行 `linux_banner` 插件来看看你是否可从内存转储中识别正确的发行版信息: + +``` +$ python2 vol.py -f ~/LiME/RHEL8.3_64bit.mem linux_banner --profile=LinuxRedhat8_3_4_18_0-240x64 +Volatility Foundation Volatility Framework 2.6.1 +Linux version 4.18.0-240.el8.x86_64 ([mockbuild@vm09.test.com][4]) (gcc version 8.3.1 20191121 (Red Hat 8.3.1-5) (GCC)) #1 SMP Wed Sep 23 05:13:10 EDT 2020 +$ +``` + +#### 找到 Linux 插件 + +到现在都很顺利,所以现在你可能对如何找到所有 Linux 插件的名字比较好奇。有一个简单的技巧:运行 `--info` 命令并抓取 `linux_` 字符串。有各种各样的插件可用于不同的用途。这里列出一部分: + +``` +$ python2 vol.py --info  | grep linux_ +Volatility Foundation Volatility Framework 2.6.1 +linux_apihooks             - Checks for userland apihooks +linux_arp                  - Print the ARP table +linux_aslr_shift           - Automatically detect the Linux ASLR shift + +<< 删节 >> + +linux_banner               - Prints the Linux banner information +linux_vma_cache            - Gather VMAs from the vm_area_struct cache +linux_volshell             - Shell in the memory image +linux_yarascan             - A shell in the Linux memory image +$ +``` + +使用 `linux_psaux` 插件检查内存转储时系统上正在运行哪些进程。注意列表中的最后一个命令:它是你在转储之前运行的 `insmod` 命令。 + +``` +$ python2 vol.py -f ~/LiME/RHEL8.3_64bit.mem linux_psaux --profile=LinuxRedhat8_3_4_18_0-240x64 +Volatility Foundation Volatility Framework 2.6.1 +Pid    Uid    Gid    Arguments                                                       +1      0      0      /usr/lib/systemd/systemd --switched-root --system --deserialize 18 +2      0      0      [kthreadd]                                                       +3      0      0      [rcu_gp]                                                         +4      0      0      [rcu_par_gp]                                                     +861    0      0      /usr/libexec/platform-python -Es /usr/sbin/tuned -l -P           +869    0      0      /usr/bin/rhsmcertd                                               +875    0      0      /usr/libexec/sssd/sssd_be --domain implicit_files --uid 0 --gid 0 --logger=files +878    0      0      /usr/libexec/sssd/sssd_nss --uid 0 --gid 0 --logger=files       + +<< 删节 >> + +11064  89     89     qmgr -l -t unix -u                                               +227148 0      0      [kworker/0:0]                                                   +227298 0      0      -bash                                                           +227374 0      0      [kworker/u2:1]                                                   +227375 0      0      [kworker/0:2]                                                   +227884 0      0      [kworker/0:3]                                                   +228573 0      0      insmod ./lime-4.18.0-240.el8.x86_64.ko path=../RHEL8.3_64bit.mem format=lime +228576 0      0                                                                       +$ +``` + +想要知道系统的网络状态吗?运行 `linux_netstat` 插件来找到在内存转储期间网络连接的状态: + +``` +$ python2 vol.py -f ~/LiME/RHEL8.3_64bit.mem linux_netstat --profile=LinuxRedhat8_3_4_18_0-240x64 +Volatility Foundation Volatility Framework 2.6.1 +UNIX 18113              systemd/1     /run/systemd/private +UNIX 11411              systemd/1     /run/systemd/notify +UNIX 11413              systemd/1     /run/systemd/cgroups-agent +UNIX 11415              systemd/1     +UNIX 11416              systemd/1     + +<< 删节 >> +$ +``` + +接下来,使用 `linux_mount` 插件来看在内存转储期间哪些文件系统被挂载: + +``` +$ python2 vol.py -f ~/LiME/RHEL8.3_64bit.mem linux_mount --profile=LinuxRedhat8_3_4_18_0-240x64 +Volatility Foundation Volatility Framework 2.6.1 +tmpfs                     /sys/fs/cgroup                      tmpfs        ro,nosuid,nodev,noexec                   +cgroup                    /sys/fs/cgroup/pids                 cgroup       rw,relatime,nosuid,nodev,noexec         +systemd-1                 /proc/sys/fs/binfmt_misc            autofs       rw,relatime                             +sunrpc                    /var/lib/nfs/rpc_pipefs             rpc_pipefs   rw,relatime                             +/dev/mapper/rhel_kvm--03--guest11-root /                                   xfs          rw,relatime                 +tmpfs                     /dev/shm                            tmpfs        rw,nosuid,nodev                         +selinuxfs                 /sys/fs/selinux                     selinuxfs    rw,relatime +                                                       +<< 删节 >> + +cgroup                    /sys/fs/cgroup/net_cls,net_prio     cgroup       rw,relatime,nosuid,nodev,noexec         +cgroup                    /sys/fs/cgroup/cpu,cpuacct          cgroup       rw,relatime,nosuid,nodev,noexec         +bpf                       /sys/fs/bpf                         bpf          rw,relatime,nosuid,nodev,noexec         +cgroup                    /sys/fs/cgroup/memory               cgroup       ro,relatime,nosuid,nodev,noexec         +cgroup                    /sys/fs/cgroup/cpuset               cgroup       rw,relatime,nosuid,nodev,noexec         +mqueue                    /dev/mqueue                         mqueue       rw,relatime                             +$ +``` + +好奇哪些内核模块被加载了吗?Volatility 也为这个提供了一个插件 `linux_lsmod`: + +``` +$ python2 vol.py -f ~/LiME/RHEL8.3_64bit.mem linux_lsmod --profile=LinuxRedhat8_3_4_18_0-240x64 +Volatility Foundation Volatility Framework 2.6.1 +ffffffffc0535040 lime 20480 +ffffffffc0530540 binfmt_misc 20480 +ffffffffc05e8040 sunrpc 479232 +<< 删节 >> +ffffffffc04f9540 nfit 65536 +ffffffffc0266280 dm_mirror 28672 +ffffffffc025e040 dm_region_hash 20480 +ffffffffc0258180 dm_log 20480 +ffffffffc024bbc0 dm_mod 151552 +$ +``` + +想知道哪些文件被哪些进程打开了吗?使用 `linux_bash` 插件可以列出这些信息: + +``` +$ python2 vol.py -f ~/LiME/RHEL8.3_64bit.mem linux_bash --profile=LinuxRedhat8_3_4_18_0-240x64 -v +Volatility Foundation Volatility Framework 2.6.1 +Pid      Name                 Command Time                   Command +-------- -------------------- ------------------------------ ------- +  227221 bash                 2021-04-17 18:38:24 UTC+0000   lsmod +  227221 bash                 2021-04-17 18:38:24 UTC+0000   rm -f .log +  227221 bash                 2021-04-17 18:38:24 UTC+0000   ls -l /etc/zzz +  227221 bash                 2021-04-17 18:38:24 UTC+0000   cat ~/.vimrc +  227221 bash                 2021-04-17 18:38:24 UTC+0000   ls +  227221 bash                 2021-04-17 18:38:24 UTC+0000   cat /proc/817/cwd +  227221 bash                 2021-04-17 18:38:24 UTC+0000   ls -l /proc/817/cwd +  227221 bash                 2021-04-17 18:38:24 UTC+0000   ls /proc/817/ +<< 删节 >> +  227298 bash                 2021-04-17 18:40:30 UTC+0000   gcc prt.c +  227298 bash                 2021-04-17 18:40:30 UTC+0000   ls +  227298 bash                 2021-04-17 18:40:30 UTC+0000   ./a.out +  227298 bash                 2021-04-17 18:40:30 UTC+0000   vim prt.c +  227298 bash                 2021-04-17 18:40:30 UTC+0000   gcc prt.c +  227298 bash                 2021-04-17 18:40:30 UTC+0000   ./a.out +  227298 bash                 2021-04-17 18:40:30 UTC+0000   ls +$ +``` + +想知道哪些文件被哪些进程打开了吗?使用 `linux_lsof` 插件可以列出这些信息: + +``` +$ python2 vol.py -f ~/LiME/RHEL8.3_64bit.mem linux_lsof --profile=LinuxRedhat8_3_4_18_0-240x64 +Volatility Foundation Volatility Framework 2.6.1 +Offset             Name                           Pid      FD       Path +------------------ ------------------------------ -------- -------- ---- +0xffff9c83fb1e9f40 rsyslogd                          71194        0 /dev/null +0xffff9c83fb1e9f40 rsyslogd                          71194        1 /dev/null +0xffff9c83fb1e9f40 rsyslogd                          71194        2 /dev/null +0xffff9c83fb1e9f40 rsyslogd                          71194        3 /dev/urandom +0xffff9c83fb1e9f40 rsyslogd                          71194        4 socket:[83565] +0xffff9c83fb1e9f40 rsyslogd                          71194        5 /var/log/messages +0xffff9c83fb1e9f40 rsyslogd                          71194        6 anon_inode:[9063] +0xffff9c83fb1e9f40 rsyslogd                          71194        7 /var/log/secure + +<< 删节 >> + +0xffff9c8365761f40 insmod                           228573        0 /dev/pts/0 +0xffff9c8365761f40 insmod                           228573        1 /dev/pts/0 +0xffff9c8365761f40 insmod                           228573        2 /dev/pts/0 +0xffff9c8365761f40 insmod                           228573        3 /root/LiME/src/lime-4.18.0-240.el8.x86_64.ko +$ +``` + +#### 访问 Linux 插件脚本位置 + +通过读取内存转储和处理这些信息,你可以获得更多的信息。如果你会 Python,并且好奇这些信息是如何被处理的,可以到存储所有插件的目录,选择一个你感兴趣的,并看看 Volatility 是如何获得这些信息的: + +``` +$ ls volatility/plugins/linux/ +apihooks.py              common.py            kernel_opened_files.py   malfind.py          psaux.py +apihooks.pyc             common.pyc           kernel_opened_files.pyc  malfind.pyc         psaux.pyc +arp.py                   cpuinfo.py           keyboard_notifiers.py    mount_cache.py      psenv.py +arp.pyc                  cpuinfo.pyc          keyboard_notifiers.pyc   mount_cache.pyc     psenv.pyc +aslr_shift.py            dentry_cache.py      ld_env.py                mount.py            pslist_cache.py +aslr_shift.pyc           dentry_cache.pyc     ld_env.pyc               mount.pyc           pslist_cache.pyc +<< 删节 >> +check_syscall_arm.py     __init__.py          lsmod.py                 proc_maps.py        tty_check.py +check_syscall_arm.pyc    __init__.pyc         lsmod.pyc                proc_maps.pyc       tty_check.pyc +check_syscall.py         iomem.py             lsof.py                  proc_maps_rb.py     vma_cache.py +check_syscall.pyc        iomem.pyc            lsof.pyc                 proc_maps_rb.pyc    vma_cache.pyc +$ +$ +``` + +我喜欢 Volatility 的理由是他提供了许多安全插件。这些信息很难手动获取: + +``` +linux_hidden_modules       - Carves memory to find hidden kernel modules +linux_malfind              - Looks for suspicious process mappings +linux_truecrypt_passphrase - Recovers cached Truecrypt passphrases +``` + +Volatility 也允许你在内存转储中打开一个 shell,所以你可以运行 shell 命令来代替上面所有命令,并获得相同的信息: + +``` +$ python2 vol.py -f ~/LiME/RHEL8.3_64bit.mem linux_volshell --profile=LinuxRedhat8_3_4_18_0-240x64 -v +Volatility Foundation Volatility Framework 2.6.1 +Current context: process systemd, pid=1 DTB=0x1042dc000 +Welcome to volshell! Current memory image is: +file:///root/LiME/RHEL8.3_64bit.mem +To get help, type 'hh()' +>>> +>>> sc() +Current context: process systemd, pid=1 DTB=0x1042dc000 +>>> +``` + +### 接下来的步骤 + +内存转储是了解 Linux 内部情况的好方法。试一试 Volatility 的所有插件,并详细研究它们的输出。然后思考这些信息如何能够帮助你识别入侵或安全问题。深入了解这些插件的工作原理,甚至尝试改进它们。如果你没有找到你想做的事情的插件,那就写一个并提交给 Volatility,这样其他人也可以使用它。 + +-------------------------------------------------------------------------------- + +via: https://opensource.com/article/21/4/linux-memory-forensics + +作者:[Gaurav Kamathe][a] +选题:[lujun9972][b] +译者:[RiaXu](https://github.com/ShuyRoy) +校对:[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/brain_computer_solve_fix_tool.png?itok=okq8joti (Brain on a computer screen) +[2]: https://github.com/volatilityfoundation/volatility +[3]: https://github.com/504ensicsLabs/LiME +[4]: mailto:mockbuild@vm09.test.com diff --git a/published/202105/20210427 What-s new in Fedora Workstation 34.md b/published/202105/20210427 What-s new in Fedora Workstation 34.md new file mode 100644 index 0000000000..88369c6f6a --- /dev/null +++ b/published/202105/20210427 What-s new in Fedora Workstation 34.md @@ -0,0 +1,106 @@ +[#]: subject: (What’s new in Fedora Workstation 34) +[#]: via: (https://fedoramagazine.org/whats-new-fedora-34-workstation/) +[#]: author: (Christian Fredrik Schaller https://fedoramagazine.org/author/uraeus/) +[#]: collector: (lujun9972) +[#]: translator: (wxy) +[#]: reviewer: (wxy) +[#]: publisher: (wxy) +[#]: url: (https://linux.cn/article-13359-1.html) + +Fedora Workstation 34 中的新变化 +====== + +![](https://img.linux.net.cn/data/attachment/album/202105/03/233735glmkkimcz8ilmcmr.jpg) + +Fedora Workstation 34 是我们领先的操作系统的最新版本,这次你将获得重大改进。最重要的是,你可以从 [官方网站][2] 下载它。我听到你在问,有什么新的东西?好吧,让我们来介绍一下。 + +### GNOME 40 + +[GNOME 40][3] 是对 GNOME 桌面的一次重大更新,Fedora 社区成员在其设计和实现过程中发挥了关键作用,因此你可以确信 Fedora 用户的需求被考虑在内。 + +当你登录到 GNOME 40 桌面时,首先注意到的就是你现在会被直接带到一个重新设计的概览屏幕。你会注意到仪表盘已经移到了屏幕的底部。GNOME 40 的另一个主要变化是虚拟工作空间现在是水平摆放的,这使 GNOME 与其他大多数桌面更加一致,因此应该使新用户更容易适应 GNOME 和 Fedora。 + +我们还做了一些工作来改善桌面中的手势支持,用三根手指水平滑动来切换工作空间,用三根手指垂直滑动来调出概览。 + +![][4] + +更新后的概览设计带来了一系列其他改进,包括: + + * 仪表盘现在将收藏的和未收藏的运行中的应用程序分开。这使得可以清楚了解哪些应用已经被收藏,哪些未收藏。 + * 窗口缩略图得到了改进,现在每个窗口上都有一个应用程序图标,以帮助识别。 + * 当工作区被设置为在所有显示器上显示时,工作区切换器现在会显示在所有显示器上,而不仅仅是主显示器。 + * 应用启动器的拖放功能得到了改进,可以更轻松地自定义应用程序网格的排列方式。 + +GNOME 40 中的变化经历了大量的用户测试,到目前为止反应非常正面,所以我们很高兴能将它们介绍给 Fedora 社区。更多信息请见 [forty.gnome.org][3] 或 [GNOME 40 发行说明][5]。 + +### 应用程序的改进 + +GNOME “天气”为这个版本进行了重新设计,具有两个视图,一个是未来 48 小时的小时预报,另一个是未来 10 天的每日预报。 + +新版本现在显示了更多的信息,并且更适合移动设备,因为它支持更窄的尺寸。 + +![][6] + +其他被改进的应用程序包括“文件”、“地图”、“软件”和“设置”。更多细节请参见 [GNOME 40 发行说明][5]。 + +### PipeWire + +PipeWire 是新的音频和视频服务器,由 Wim Taymans 创建,他也共同创建了 GStreamer 多媒体框架。到目前为止,它只被用于视频捕获,但在 Fedora Workstation 34 中,我们也开始将其用于音频,取代 PulseAudio。 + +PipeWire 旨在与 PulseAudio 和 Jack 兼容,因此应用程序通常应该像以前一样可以工作。我们还与 Firefox 和 Chrome 合作,确保它们能与 PipeWire 很好地配合。OBS Studio 也即将支持 PipeWire,所以如果你是一个播客,我们已经帮你搞定了这些。 + +PipeWire 在专业音频界获得了非常积极的回应。谨慎地说,从一开始就可能有一些专业音频应用不能完全工作,但我们会源源不断收到测试报告和补丁,我们将在 Fedora Workstation 34 的生命周期内使用这些报告和补丁来延续专业音频 PipeWire 的体验。 + +### 改进的 Wayland 支持 + +我们预计将在 Fedora Workstation 34 的生命周期内解决在专有的 NVIDIA 驱动之上运行 Wayland 的支持。已经支持在 NVIDIA 驱动上运行纯 Wayland 客户端。然而,当前还缺少对许多应用程序使用的 Xwayland 兼容层的支持。这就是为什么当你安装 NVIDIA 驱动时,Fedora 仍然默认为 X.Org。 + +我们正在 [与 NVIDIA 上游合作][7],以确保 Xwayland 能在 Fedora 中使用 NVIDIA 硬件加速。 + +### QtGNOME 平台和 Adwaita-Qt + +Jan Grulich 继续他在 QtGNOME 平台和 Adawaita-qt 主题上的出色工作,确保 Qt 应用程序与 Fedora 工作站的良好整合。多年来,我们在 Fedora 中使用的 Adwaita 主题已经发生了演变,但随着 QtGNOME 平台和 Adwaita-Qt 在 Fedora 34 中的更新,Qt 应用程序将更接近于 Fedora Workstation 34 中当前的 GTK 风格。 + +作为这项工作的一部分,Fedora Media Writer 的外观和风格也得到了改进。 + +![][8] + +### Toolbox + +Toolbox 是我们用于创建与主机系统隔离的开发环境的出色工具,它在 Fedora 34 上有了很多改进。例如,我们在改进 Toolbox 的 CI 系统集成方面做了大量的工作,以避免在我们的环境中出现故障时导致 Toolbox 停止工作。 + +我们在 Toolbox 的 RHEL 集成方面投入了大量的工作,这意味着你可以很容易地在 Fedora 系统上建立一个容器化的 RHEL 环境,从而方便地为 RHEL 服务器和云实例做开发。现在在 Fedora 上创建一个 RHEL 环境就像运行:`toolbox create -distro rhel -release 8.4` 一样简单。  + +这给你提供了一个最新桌面的优势:支持最新硬件,同时能够以一种完全原生的方式进行针对 RHEL 的开发。 + +![][9] + +### Btrfs + +自 Fedora 33 以来,Fedora Workstation 一直使用 Btrfs 作为其默认文件系统。Btrfs 是一个现代文件系统,由许多公司和项目开发。Workstation 采用 Btrfs 是通过 Facebook 和 Fedora 社区之间的奇妙合作实现的。根据到目前为止的用户反馈,人们觉得与旧的 ext4 文件系统相比,Btrfs 提供了更快捷、更灵敏的体验。 + +在 Fedora 34 中,新安装的 Workstation 系统现在默认使用 Btrfs 透明压缩。与未压缩的 Btrfs 相比,这可以节省 20-40% 的大量磁盘空间。它也增加了 SSD 和其他闪存介质的寿命。 + + +-------------------------------------------------------------------------------- + +via: https://fedoramagazine.org/whats-new-fedora-34-workstation/ + +作者:[Christian Fredrik Schaller][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://fedoramagazine.org/author/uraeus/ +[b]: https://github.com/lujun9972 +[1]: https://fedoramagazine.org/wp-content/uploads/2021/04/f34-workstation-816x345.jpg +[2]: https://getfedora.org/workstation +[3]: https://forty.gnome.org/ +[4]: https://lh3.googleusercontent.com/xDklMWAGBWvRGRp2kby-XKr6b0Jvan8Obmn11sfmkKnsnXizKePYV9aWdEgyxmJetcvwMifYRUm6TcPRCH9szZfZOE9pCpv2bkjQhnq2II05Yu6o_DjEBmqTlRUGvvUyMN_VRtq8zkk2J7GUmA +[5]: https://help.gnome.org/misc/release-notes/40.0/ +[6]: https://lh6.googleusercontent.com/pQ3IIAvJDYrdfXoTUnrOcCQBjtpXqd_5Rmbo4xwxIj2qMCXt7ZxJEQ12OoV7yUSF8zpVR0VFXkMP0M8UK1nLbU7jhgQPJAHPayzjAscQmTtqqGsohyzth6-xFDjUXogmeFmcP-yR9GWXfXv-yw +[7]: https://gitlab.freedesktop.org/xorg/xserver/-/merge_requests/587 +[8]: https://lh6.googleusercontent.com/PDXxFS7SBFGI-3jRtR-TmqupvJRxy_CbWTfjB4sc1CKyO1myXkqfpg4jGHQJRK2e1vUh1KD_jyBsy8TURwCIkgAJcETCOlSPFBabqB5yDeWj3cvygOOQVe3X0tLFjuOz3e-ZX6owNZJSqIEHOQ +[9]: https://lh6.googleusercontent.com/dVRCL14LGE9WpmdiH3nI97OW2C1TkiZqREvBlHClNKdVcYvR1nZpZgWfup_GP5SN17iQtSJf59FxX2GYqoajXbdXLRfOwAREn7gVJ1fa_bspmcTZ81zkUQC4tNUx3f7D7uD7Peeg2Zc9Kldpww diff --git a/published/202105/20210429 Encrypting and decrypting files with OpenSSL.md b/published/202105/20210429 Encrypting and decrypting files with OpenSSL.md new file mode 100644 index 0000000000..a3cbe64aec --- /dev/null +++ b/published/202105/20210429 Encrypting and decrypting files with OpenSSL.md @@ -0,0 +1,440 @@ +[#]: subject: "Encrypting and decrypting files with OpenSSL" +[#]: via: "https://opensource.com/article/21/4/encryption-decryption-openssl" +[#]: author: "Gaurav Kamathe https://opensource.com/users/gkamathe" +[#]: collector: "lujun9972" +[#]: translator: "MjSeven" +[#]: reviewer: "wxy" +[#]: publisher: "wxy" +[#]: url: "https://linux.cn/article-13368-1.html" + +使用 OpenSSL 加密和解密文件 +====== + +> OpenSSL 是一个实用工具,它可以确保其他人员无法打开你的敏感和机密消息。 + +![](https://img.linux.net.cn/data/attachment/album/202105/07/163825a9yh74h9yh4h77y2.jpg) + +加密是对消息进行编码的一种方法,这样可以保护消息的内容免遭他人窥视。一般有两种类型: + + 1. 密钥加密或对称加密 + 2. 公钥加密或非对称加密 + +密钥加密secret-key encryption使用相同的密钥进行加密和解密,而公钥加密public-key encryption使用不同的密钥进行加密和解密。每种方法各有利弊。密钥加密速度更快,而公钥加密更安全,因为它解决了安全共享密钥的问题,将它们结合在一起可以最大限度地利用每种类型的优势。 + +### 公钥加密 + +公钥加密使用两组密钥,称为密钥对。一个是公钥,可以与你想要秘密通信的任何人自由共享。另一个是私钥,应该是一个秘密,永远不会共享。 + +公钥用于加密。如果某人想与你交流敏感信息,你可以将你的公钥发送给他们,他们可以使用公钥加密消息或文件,然后再将其发送给你。私钥用于解密。解密发件人加密的消息的唯一方法是使用私钥。因此,它们被称为“密钥对”,它们是相互关联的。 + +### 如何使用 OpenSSL 加密文件 + +[OpenSSL][2] 是一个了不起的工具,可以执行各种任务,例如加密文件。本文使用安装了 OpenSSL 的 Fedora 计算机。如果你的机器上没有,则可以使用软件包管理器进行安装: + +``` +alice $ cat /etc/fedora-release +Fedora release 33 (Thirty Three) +alice $ +alice $ openssl version +OpenSSL 1.1.1i FIPS  8 Dec 2020 +alice $ +``` + +要探索文件加密和解密,假如有两个用户 Alice 和 Bob,他们想通过使用 OpenSSL 交换加密文件来相互通信。 + +#### 步骤 1:生成密钥对 + +在加密文件之前,你需要生成密钥对。你还需要一个密码短语passphrase,每当你使用 OpenSSL 时都必须使用该密码短语,因此务必记住它。 + +Alice 使用以下命令生成她的一组密钥对: + +``` +alice $ openssl genrsa -aes128 -out alice_private.pem 1024 +``` + +此命令使用 OpenSSL 的 [genrsa][3] 命令生成一个 1024 位的公钥/私钥对。这是可以的,因为 RSA 算法是不对称的。它还使用了 aes128 对称密钥算法来加密 Alice 生成的私钥。 + +输入命令后,OpenSSL 会提示 Alice 输入密码,每次使用密钥时,她都必须输入该密码: + +``` +alice $ openssl genrsa -aes128 -out alice_private.pem 1024 +Generating RSA private key, 1024 bit long modulus (2 primes) +..........+++++ +..................................+++++ +e is 65537 (0x010001) +Enter pass phrase for alice_private.pem: +Verifying - Enter pass phrase for alice_private.pem: +alice $ +alice $ +alice $ ls -l alice_private.pem +-rw-------. 1 alice alice 966 Mar 22 17:44 alice_private.pem +alice $ +alice $ file alice_private.pem +alice_private.pem: PEM RSA private key +alice $ +``` + +Bob 使用相同的步骤来创建他的密钥对: + +``` +bob $ openssl genrsa -aes128 -out bob_private.pem 1024 +Generating RSA private key, 1024 bit long modulus (2 primes) +..................+++++ +............................+++++ +e is 65537 (0x010001) +Enter pass phrase for bob_private.pem: +Verifying - Enter pass phrase for bob_private.pem: +bob $ +bob $ ls -l bob_private.pem +-rw-------. 1 bob bob 986 Mar 22 13:48 bob_private.pem +bob $ +bob $ file bob_private.pem +bob_private.pem: PEM RSA private key +bob $ +``` + +如果你对密钥文件感到好奇,可以打开命令生成的 .pem 文件,但是你会看到屏幕上的一堆文本: + + +``` +alice $ head alice_private.pem +-----BEGIN RSA PRIVATE KEY----- +Proc-Type: 4,ENCRYPTED +DEK-Info: AES-128-CBC,E26FAC1F143A30632203F09C259200B9 + +pdKj8Gm5eeAOF0RHzBx8l1tjmA1HSSvy0RF42bOeb7sEVZtJ6pMnrJ26ouwTQnkL +JJjUVPPHoKZ7j4QpwzbPGrz/hVeMXVT/y33ZEEA+3nrobwisLKz+Q+C9TVJU3m7M +/veiBO9xHMGV01YBNeic7MqXBkhIrNZW6pPRfrbjsBMBGSsL8nwJbb3wvHhzPkeM +e+wtt9S5PWhcnGMj3T+2mtFfW6HWpd8Kdp60z7Nh5mhA9+5aDWREfJhJYzl1zfcv +Bmxjf2wZ3sFJNty+sQVajYfk6UXMyJIuWgAjnqjw6c3vxQi0KE3NUNZYO93GQgEF +pyAnN9uGUTBCDYeTwdw8TEzkyaL08FkzLfFbS2N9BDksA3rpI1cxpxRVFr9+jDBz +alice $ +``` + +要查看密钥的详细信息,可以使用以下 OpenSSL 命令打开 .pem 文件并显示内容。你可能想知道在哪里可以找到另一个配对的密钥,因为这是单个文件。你观察的很细致,获取公钥的方法如下: + +``` +alice $ openssl rsa -in alice_private.pem -noout -text +Enter pass phrase for alice_private.pem: +RSA Private-Key: (1024 bit, 2 primes) +modulus: + 00:bd:e8:61:72:f8:f6:c8:f2:cc:05:fa:07:aa:99: + 47:a6:d8:06:cf:09:bf:d1:66:b7:f9:37:29:5d:dc: + c7:11:56:59:d7:83:b4:81:f6:cf:e2:5f:16:0d:47: + 81:fe:62:9a:63:c5:20:df:ee:d3:95:73:dc:0a:3f: + 65:d3:36:1d:c1:7d:8b:7d:0f:79:de:80:fc:d2:c0: + e4:27:fc:e9:66:2d:e2:7e:fc:e6:73:d1:c9:28:6b: + 6a:8a:e8:96:9d:65:a0:8a:46:e0:b8:1f:b0:48:d4: + db:d4:a3:7f:0d:53:36:9a:7d:2e:e7:d8:f2:16:d3: + ff:1b:12:af:53:22:c0:41:51 +publicExponent: 65537 (0x10001) + +<< 截断 >> + +exponent2: + 6e:aa:8c:6e:37:d0:57:37:13:c0:08:7e:75:43:96: + 33:01:99:25:24:75:9c:0b:45:3c:a2:39:44:69:84: + a4:64:48:f4:5c:bc:40:40:bf:84:b8:f8:0f:1d:7b: + 96:7e:16:00:eb:49:da:6b:20:65:fc:a9:20:d9:98: + 76:ca:59:e1 +coefficient: + 68:9e:2e:fa:a3:a4:72:1d:2b:60:61:11:b1:8b:30: + 6e:7e:2d:f9:79:79:f2:27:ab:a0:a0:b6:45:08:df: + 12:f7:a4:3b:d9:df:c5:6e:c7:e8:81:29:07:cd:7e: + 47:99:5d:33:8c:b7:fb:3b:a9:bb:52:c0:47:7a:1c: + e3:64:90:26 +alice $ +``` + +#### 步骤 2:提取公钥 + +注意,公钥是你可以与他人自由共享的密钥,而你必须将私钥保密。因此,Alice 必须提取她的公钥,并将其保存到文件中: + +``` +alice $ openssl rsa -in alice_private.pem -pubout > alice_public.pem +Enter pass phrase for alice_private.pem: +writing RSA key +alice $ +alice $ ls -l *.pem +-rw-------. 1 alice alice 966 Mar 22 17:44 alice_private.pem +-rw-rw-r--. 1 alice alice 272 Mar 22 17:47 alice_public.pem +alice $ +``` + +你可以使用与之前相同的方式查看公钥详细信息,但是这次,输入公钥 .pem 文件: + +``` +alice $ +alice $ openssl rsa -in alice_public.pem -pubin -text -noout +RSA Public-Key: (1024 bit) +Modulus: +    00:bd:e8:61:72:f8:f6:c8:f2:cc:05:fa:07:aa:99: +    47:a6:d8:06:cf:09:bf:d1:66:b7:f9:37:29:5d:dc: +    c7:11:56:59:d7:83:b4:81:f6:cf:e2:5f:16:0d:47: +    81:fe:62:9a:63:c5:20:df:ee:d3:95:73:dc:0a:3f: +$ +``` + +Bob 可以按照相同的过程来提取他的公钥并将其保存到文件中: + +``` +bob $ openssl rsa -in bob_private.pem -pubout > bob_public.pem +Enter pass phrase for bob_private.pem: +writing RSA key +bob $ +bob $ ls -l *.pem +-rw-------. 1 bob bob 986 Mar 22 13:48 bob_private.pem +-rw-r--r--. 1 bob bob 272 Mar 22 13:51 bob_public.pem +bob $ +``` + +#### 步骤 3:交换公钥 + +这些公钥在 Alice 和 Bob 彼此交换之前没有太大用处。有几种共享公钥的方法,例如使用 `scp` 命令将密钥复制到彼此的工作站。 + +将 Alice 的公钥发送到 Bob 的工作站: + +``` +alice $ scp alice_public.pem bob@bob-machine-or-ip:/path/ +``` + +将 Bob 的公钥发送到 Alice 的工作站: + +``` +bob $ scp bob_public.pem alice@alice-machine-or-ip:/path/ +``` + +现在,Alice 有了 Bob 的公钥,反之亦然: + +``` +alice $ ls -l bob_public.pem +-rw-r--r--. 1 alice alice 272 Mar 22 17:51 bob_public.pem +alice $ +``` + +``` +bob $ ls -l alice_public.pem +-rw-r--r--. 1 bob bob 272 Mar 22 13:54 alice_public.pem +bob $ +``` + +#### 步骤 4:使用公钥交换加密的消息 + +假设 Alice 需要与 Bob 秘密交流。她将秘密信息写入文件中,并将其保存到 `top_secret.txt` 中。由于这是一个普通文件,因此任何人都可以打开它并查看其内容,这里并没有太多保护: + + +``` +alice $ +alice $ echo "vim or emacs ?" > top_secret.txt +alice $ +alice $ cat top_secret.txt +vim or emacs ? +alice $ +``` + +要加密此秘密消息,Alice 需要使用 `openssls -encrypt` 命令。她需要为该工具提供三个输入: + + 1. 秘密消息文件的名称 + 2. Bob 的公钥(文件) + 3. 加密后新文件的名称 + +``` +alice $ openssl rsautl -encrypt -inkey bob_public.pem -pubin -in top_secret.txt -out top_secret.enc +alice $ +alice $ ls -l top_secret.* +-rw-rw-r--. 1 alice alice 128 Mar 22 17:54 top_secret.enc +-rw-rw-r--. 1 alice alice  15 Mar 22 17:53 top_secret.txt +alice $ +alice $ +``` + +加密后,原始文件仍然是可见的,而新创建的加密文件在屏幕上看起来像乱码。这样,你可以确定秘密消息已被加密: + +``` +alice $ cat top_secret.txt +vim or emacs ? +alice $ +alice $ cat top_secret.enc +�s��uM)M&>��N��}dmCy92#1X�q󺕦��v���M��@��E�~��1�k~&PU�VhHL�@^P��(��zi�M�4p�e��g+R�1�Ԁ���s�������q_8�lr����C�I-��alice $ +alice $ +alice $ +alice $ hexdump -C ./top_secret.enc +00000000 9e 73 12 8f e3 75 4d 29 4d 26 3e bf 80 4e a0 c5 |.s...uM)M&>..N..| +00000010 7d 64 6d 43 79 39 32 23 31 58 ce 71 f3 ba 95 a6 |}dmCy92#1X.q....| +00000020 c0 c0 76 17 fb f7 bf 4d ce fc 40 e6 f4 45 7f db |..v....M..@..E..| +00000030 7e ae c0 31 f8 6b 10 06 7e 26 50 55 b5 05 56 68 |~..1.k..~&PU..Vh| +00000040 48 4c eb 40 5e 50 fe 19 ea 28 a8 b8 7a 13 69 d7 |HL.@^P...(..z.i.| +00000050 4d b0 34 70 d8 65 d5 07 95 67 2b 52 ea 31 aa d4 |M.4p.e...g+R.1..| +00000060 80 b3 a8 ec a1 73 ed a7 f9 17 c3 13 d4 fa c1 71 |.....s.........q| +00000070 5f 38 b9 6c 07 72 81 a6 fe af 43 a6 49 2d c4 ee |_8.l.r....C.I-..| +00000080 +alice $ +alice $ file top_secret.enc +top_secret.enc: data +alice $ +``` + +删除秘密消息的原始文件是安全的,这样确保任何痕迹都没有: + +``` +alice $ rm -f top_secret.txt +``` + +现在,Alice 需要再次使用 `scp` 命令将此加密文件通过网络发送给 Bob 的工作站。注意,即使文件被截获,其内容也会是加密的,因此内容不会被泄露: + +``` +alice $  scp top_secret.enc bob@bob-machine-or-ip:/path/ +``` + +如果 Bob 使用常规方法尝试打开并查看加密的消息,他将无法看懂该消息: + +``` +bob $ ls -l top_secret.enc +-rw-r--r--. 1 bob bob 128 Mar 22 13:59 top_secret.enc +bob $ +bob $ cat top_secret.enc +�s��uM)M&>��N��}dmCy92#1X�q󺕦��v���M��@��E�~��1�k~&PU�VhHL�@^P��(��zi�M�4p�e��g+R�1�Ԁ���s�������q_8�lr����C�I-��bob $ +bob $ +bob $ hexdump -C top_secret.enc +00000000 9e 73 12 8f e3 75 4d 29 4d 26 3e bf 80 4e a0 c5 |.s...uM)M&>..N..| +00000010 7d 64 6d 43 79 39 32 23 31 58 ce 71 f3 ba 95 a6 |}dmCy92#1X.q....| +00000020 c0 c0 76 17 fb f7 bf 4d ce fc 40 e6 f4 45 7f db |..v....M..@..E..| +00000030 7e ae c0 31 f8 6b 10 06 7e 26 50 55 b5 05 56 68 |~..1.k..~&PU..Vh| +00000040 48 4c eb 40 5e 50 fe 19 ea 28 a8 b8 7a 13 69 d7 |HL.@^P...(..z.i.| +00000050 4d b0 34 70 d8 65 d5 07 95 67 2b 52 ea 31 aa d4 |M.4p.e...g+R.1..| +00000060 80 b3 a8 ec a1 73 ed a7 f9 17 c3 13 d4 fa c1 71 |.....s.........q| +00000070 5f 38 b9 6c 07 72 81 a6 fe af 43 a6 49 2d c4 ee |_8.l.r....C.I-..| +00000080 +bob $ +``` + +#### 步骤 5:使用私钥解密文件 + +Bob 需要使用 OpenSSL 来解密消息,但是这次使用的是 `-decrypt` 命令行参数。他需要向工具程序提供以下信息: + + 1. 加密的文件(从 Alice 那里得到) + 2. Bob 的私钥(用于解密,因为文件是用 Bob 的公钥加密的) + 3. 通过重定向保存解密输出的文件名 + +``` +bob $ openssl rsautl -decrypt -inkey bob_private.pem -in top_secret.enc > top_secret.txt +Enter pass phrase for bob_private.pem: +bob $ +``` + +现在,Bob 可以阅读 Alice 发送给他的秘密消息: + +``` +bob $ ls -l top_secret.txt +-rw-r--r--. 1 bob bob 15 Mar 22 14:02 top_secret.txt +bob $ +bob $ cat top_secret.txt +vim or emacs ? +bob $ +``` + +Bob 需要回复 Alice,因此他将秘密回复写在一个文件中: + +``` +bob $ echo "nano for life" > reply_secret.txt +bob $ +bob $ cat reply_secret.txt +nano for life +bob $ +``` + +#### 步骤 6:使用其他密钥重复该过程 + +为了发送消息,Bob 采用和 Alice 相同的步骤,但是由于该消息是发送给 Alice 的,因此他需要使用 Alice 的公钥来加密文件: + +``` +bob $ openssl rsautl -encrypt -inkey alice_public.pem -pubin -in reply_secret.txt -out reply_secret.enc +bob $ +bob $ ls -l reply_secret.enc +-rw-r--r--. 1 bob bob 128 Mar 22 14:03 reply_secret.enc +bob $ +bob $ cat reply_secret.enc +�F݇��.4"f�1��\��{o԰$�M��I{5�|�\�l͂�e��Y�V��{�|!$c^a + �*Ԫ\vQ�Ϡ9����'��ٮsP��'��Z�1W�n��k���J�0�I;P8������&:bob $ +bob $ +bob $ hexdump -C ./reply_secret.enc +00000000 92 46 dd 87 04 bc a7 2e 34 22 01 66 1a 13 31 db |.F......4".f..1.| +00000010 c4 5c b4 8e 7b 6f d4 b0 24 d2 4d 92 9b 49 7b 35 |.\..{o..$.M..I{5| +00000020 da 7c ee 5c bb 6c cd 82 f1 1b 92 65 f1 8d f2 59 |.|.\.l.....e...Y| +00000030 82 56 81 80 7b 89 07 7c 21 24 63 5e 61 0c ae 2a |.V..{..|!$c^a..*| +00000040 d4 aa 5c 76 51 8d cf a0 39 04 c1 d7 dc f0 ad 99 |..\vQ...9.......| +00000050 27 ed 8e de d9 ae 02 73 50 e0 dd 27 13 ae 8e 5a |'......sP..'...Z| +00000060 12 e4 9a 31 57 b3 03 6e dd e1 16 7f 6b c0 b3 8b |...1W..n....k...| +00000070 4a cf 30 b8 49 3b 50 38 e0 9f 84 f6 83 da 26 3a |J.0.I;P8......&:| +00000080 +bob $ +bob $ # remove clear text secret message file +bob $ rm -f reply_secret.txt +``` + +Bob 通过 `scp` 将加密的文件发送至 Alice 的工作站: + +``` +$ scp reply_secret.enc alice@alice-machine-or-ip:/path/ +``` + +如果 Alice 尝试使用常规工具去阅读加密的文本,她将无法理解加密的文本: + +``` +alice $ +alice $ ls -l reply_secret.enc +-rw-r--r--. 1 alice alice 128 Mar 22 18:01 reply_secret.enc +alice $ +alice $ cat reply_secret.enc +�F݇��.4"f�1��\��{o԰$�M��I{5�|�\�l͂�e��Y�V��{�|!$c^a + �*Ԫ\vQ�Ϡ9����'��ٮsP��'��Z�1W�n��k���J�0�I;P8������&:alice $ +alice $ +alice $ +alice $ hexdump -C ./reply_secret.enc +00000000 92 46 dd 87 04 bc a7 2e 34 22 01 66 1a 13 31 db |.F......4".f..1.| +00000010 c4 5c b4 8e 7b 6f d4 b0 24 d2 4d 92 9b 49 7b 35 |.\..{o..$.M..I{5| +00000020 da 7c ee 5c bb 6c cd 82 f1 1b 92 65 f1 8d f2 59 |.|.\.l.....e...Y| +00000030 82 56 81 80 7b 89 07 7c 21 24 63 5e 61 0c ae 2a |.V..{..|!$c^a..*| +00000040 d4 aa 5c 76 51 8d cf a0 39 04 c1 d7 dc f0 ad 99 |..\vQ...9.......| +00000050 27 ed 8e de d9 ae 02 73 50 e0 dd 27 13 ae 8e 5a |'......sP..'...Z| +00000060 12 e4 9a 31 57 b3 03 6e dd e1 16 7f 6b c0 b3 8b |...1W..n....k...| +00000070 4a cf 30 b8 49 3b 50 38 e0 9f 84 f6 83 da 26 3a |J.0.I;P8......&:| +00000080 +alice $ +``` + +所以,她使用 OpenSSL 解密消息,只不过这次她提供了自己的私钥并将输出保存到文件中: + +``` +alice $ openssl rsautl -decrypt -inkey alice_private.pem -in reply_secret.enc > reply_secret.txt +Enter pass phrase for alice_private.pem: +alice $ +alice $ ls -l reply_secret.txt +-rw-rw-r--. 1 alice alice 14 Mar 22 18:02 reply_secret.txt +alice $ +alice $ cat reply_secret.txt +nano for life +alice $ +``` + +### 了解 OpenSSL 的更多信息 + +OpenSSL 在加密界是真正的瑞士军刀。除了加密文件外,它还可以执行许多任务,你可以通过访问 OpenSSL [文档页面][4]来找到使用它的所有方式,包括手册的链接、 《OpenSSL Cookbook》、常见问题解答等。要了解更多信息,尝试使用其自带的各种加密算法,看看它是如何工作的。 + +-------------------------------------------------------------------------------- + +via: https://opensource.com/article/21/4/encryption-decryption-openssl + +作者:[Gaurav Kamathe][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/gkamathe +[b]: https://github.com/lujun9972 +[1]: https://opensource.com/sites/default/files/styles/image-full-size/public/lead-images/rh_003601_05_mech_osyearbook2016_security_cc.png?itok=3V07Lpko "A secure lock." +[2]: https://www.openssl.org/ +[3]: https://www.openssl.org/docs/man1.0.2/man1/genrsa.html +[4]: https://www.openssl.org/docs/ \ No newline at end of file diff --git a/published/202105/20210429 Experiencing the -e- OS- The Open Source De-Googled Android Version.md b/published/202105/20210429 Experiencing the -e- OS- The Open Source De-Googled Android Version.md new file mode 100644 index 0000000000..6a957af93e --- /dev/null +++ b/published/202105/20210429 Experiencing the -e- OS- The Open Source De-Googled Android Version.md @@ -0,0 +1,132 @@ +[#]: subject: (Experiencing the /e/ OS: The Open Source De-Googled Android Version) +[#]: via: (https://itsfoss.com/e-os-review/) +[#]: author: (Dimitrios https://itsfoss.com/author/dimitrios/) +[#]: collector: (lujun9972) +[#]: translator: (wxy) +[#]: reviewer: (wxy) +[#]: publisher: (wxy) +[#]: url: (https://linux.cn/article-13442-1.html) + +体验 /e/ OS:开源的去谷歌化的安卓 +====== + +![](https://img.linux.net.cn/data/attachment/album/202105/30/222621vsgf8q1et5oyysgs.jpg) + +/e/ 安卓操作系统是一个以隐私为导向的去谷歌化的移动操作系统,是 Lineage OS 的复刻,由 Mandrake Linux(现在的 [Mandriva Linux][2])的创建者 [Gaël Duval][1] 于 2018 年中期创立。 + +尽管安卓在 2007 年成为了一个开源项目,但当安卓得到普及时,谷歌使用专有软件取代了一些操作系统元素。/e/ 基金会用 [MicroG][3] 取代了其中的专有的应用程序和服务,这是一个开源的替代框架,可以最大限度地减少跟踪和设备活动。 + +我们收到的 [Fairphone 3][4] 预装了 /e/ OS,这是一个来自 /e/ 基金会的 [以道德的方式创造的智能手机][5]。我使用了一个月这个设备,然后把它返还给了他们,我将分享我对这个隐私设备的体验。我忘了截图,所以我将分享来自官方网站的通用图片。 + +### 在道德的 Fairphone 设备上体验 /e/ 移动操作系统 + +在我进一步说明之前,让我澄清一下,Fairphone 3 并不是使用 /e/ 的唯一选择。如果你要从他们那里购买设备,/e/ 基金会会给你 [一些智能手机的选择][6]。 + +你不需要购买设备来使用 /e/ OS。按照 /e/ 基金会的说法,你可以 [在 100 多个支持的设备上使用它][7]。 + +尽管我很喜欢使用 Fairphone 3,而且我的个人信仰与 Fairphone 的宣言一致,但我不会把注意力放在设备上,而只是放在 /e/ OS 上。 + +#### 有评级隐私的应用程序 + +![][8] + +我把 Fairphone 3 作为我的日常使用设备用了几天时间,以比较与我的“普通”安卓手机在现实中的使用情况。 + +首先,我想看看我使用的所有应用程序是否都可以在 /e/ 基金会创建的“[应用商店][9]”上找到。/e/ 应用商店包含有隐私评级的应用程序。 + +![/e/ OS 应用商店有应用程序的隐私评级][10] + +我可以找到许多应用程序,包括来自谷歌的应用程序。这意味着,如果有人真的想使用一些谷歌的服务,它仍然可以作为一个选项来下载。尽管与其他安卓设备不同,没有强行将谷歌服务塞进你的嘴里。 + +虽然有很多应用程序,但我无法找到我在英国使用的手机银行应用程序。我不得不承认,手机银行应用程序可以在一定程度上促进便利。作为替代方案,我不得不在需要时进入电脑使用网上银行平台。 + +从可用性的角度来看,/e/ OS 可以取代我的“标准”安卓操作系统,但会有一些小插曲,比如银行应用程序。 + +#### 如果不是谷歌的,那是什么? + +想知道 /e/ OS 使用哪些基本的应用程序,而不是谷歌的那些?这里有一个快速列表: + + * [魔法地球][11] —— 逐向道路导航 + * 浏览器 —— Chromium 的一个非谷歌复刻版本 + * 邮件 —— [K9-mail][12] 的一个复刻 + * 短信 —— QKSMS 的一个复刻 + * 照相机 —— OpenCamera 的一个复刻 + * 天气 —— GoodWeather 的一个复刻 + * OpenTasks —— 任务组织者 + * 日历:[Etar calendar][13] 的一个复刻 + +#### Bliss Launcher 和整体设计 + +![][14] + +/e/ OS 的默认启动程序被称为 “Bliss Launcher”,其目的是为了获得有吸引力的外观和感觉。对我来说,这个设计感觉与 iOS 相似。 + +通过向左滑动面板,你可以访问 /e/ 选择的一些有用的小工具。 + +![][15] + + * 搜索:快速搜索预装的应用程序或搜索 Web + * APP 建议:前 4 个最常用的应用程序将出现在这个小部件上 + * 天气:天气小部件显示的是当地的天气。它不会自动检测位置,需要进行配置。 + * 编辑:如果你想在屏幕上有更多的小部件,你可以通过点击“编辑”按钮添加它们。 + +总而言之,用户界面是干净整洁的简单明了,增强了愉快的用户体验。 * 天气。天气小部件显示的是当地的天气。它不会自动检测位置,需要进行配置。 + * 编辑:如果你想在屏幕上有更多的小部件,你可以通过点击编辑按钮添加它们。 + +总而言之,用户界面干净整洁、简单明了,增强了愉快的用户体验。 + +#### 去谷歌化和面向隐私的操作系统 + +如前所述,/e/ 操作系统是一个去谷歌化的操作系统,它基于 [Lineage OS][16] 的开源核心。所有的谷歌应用程序已经被删除,谷歌服务已经被 MicroG 框架所取代。/e/ OS 仍然与所有的安卓应用兼容。 + +主要的隐私功能: + + * 谷歌搜索引擎已被 DuckDuckGo 等替代品取代 + * 谷歌服务已被 microG 框架所取代 + * 使用替代的默认应用程序,而不是谷歌应用程序 + * 取消了对谷歌服务器的连接检查 + * NTP 服务器已被替换为标准的 NTP 服务:pool.ntp.org + * DNS 默认服务器由 9.9.9.9 取代,可以根据用户的选择进行编辑 + * 地理定位是在 GPS 的基础上使用 Mozilla 定位服务 + +> 隐私声明 +> +> 请注意,使用由 /e/ 基金会提供的智能手机并不自动意味着无论你做什么都能保证你的隐私。分享你的个人信息的社交媒体应用程序应在你的意识下使用。 + +### 结论 + +我成为安卓用户已经超过十年了。/e/ OS 给我带来了积极的惊喜。关注隐私的用户可以发现这个解决方案非常吸引人,而且根据所选择的应用程序和设置,可以再次感觉到使用智能手机的安全。 + +如果你是一个有隐私意识的技术专家,并且能够自己找到解决问题的方法,我向你推荐它。对于那些习惯于谷歌主流服务的人来说,/e/ 生态系统可能会让他们不知所措。 + +你使用过 /e/ OS 吗?你的使用经验如何?你怎么看这些关注隐私的项目? + +-------------------------------------------------------------------------------- + +via: https://itsfoss.com/e-os-review/ + +作者:[Dimitrios][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://itsfoss.com/author/dimitrios/ +[b]: https://github.com/lujun9972 +[1]: https://en.wikipedia.org/wiki/Ga%C3%ABl_Duval +[2]: https://en.wikipedia.org/wiki/Mandriva_Linux +[3]: https://en.wikipedia.org/wiki/MicroG +[4]: https://esolutions.shop/shop/e-os-fairphone-3-fr/ +[5]: https://www.fairphone.com/en/story/?ref=header +[6]: https://esolutions.shop/shop/ +[7]: https://doc.e.foundation/devices/ +[8]: https://i1.wp.com/itsfoss.com/wp-content/uploads/2021/04/e-ecosystem.png?resize=768%2C510&ssl=1 +[9]: https://e.foundation/e-os-available-applications/ +[10]: https://i1.wp.com/itsfoss.com/wp-content/uploads/2021/04/e-os-apps-privacy-ratings.png?resize=300%2C539&ssl=1 +[11]: https://www.magicearth.com/ +[12]: https://k9mail.app/ +[13]: https://github.com/Etar-Group/Etar-Calendar +[14]: https://i2.wp.com/itsfoss.com/wp-content/uploads/2021/04/fairphone.jpg?resize=600%2C367&ssl=1 +[15]: https://i2.wp.com/itsfoss.com/wp-content/uploads/2021/04/e-bliss-launcher.jpg?resize=300%2C533&ssl=1 +[16]: https://lineageos.org/ diff --git a/published/202105/20210429 Linux tips for using GNU Screen.md b/published/202105/20210429 Linux tips for using GNU Screen.md new file mode 100644 index 0000000000..969c31dcfb --- /dev/null +++ b/published/202105/20210429 Linux tips for using GNU Screen.md @@ -0,0 +1,96 @@ +[#]: subject: (Linux tips for using GNU Screen) +[#]: via: (https://opensource.com/article/21/4/gnu-screen-cheat-sheet) +[#]: author: (Seth Kenlon https://opensource.com/users/seth) +[#]: collector: (lujun9972) +[#]: translator: (ddl-hust) +[#]: reviewer: (wxy) +[#]: publisher: (wxy) +[#]: url: (https://linux.cn/article-13387-1.html) + +使用 GNU Screen 的小技巧 +====== + +> 学习基本的 GNU Screen 终端复用技术,然后下载我们的终端命令备忘录,以便你能够熟悉常用的快捷方式。 + +![](https://img.linux.net.cn/data/attachment/album/202105/13/105050halpppp0pop96ap7.jpg) + +对于一般用户而言,命令行终端窗口可能是令人困惑和神秘的。但随着你对 Linux 终端的进一步了解,你很快就会意识到它的高效和强大。不过,也不需要很长时间,你就会想让终端变得更加高效,除了将更多的终端放到你的终端,还有什么高好的方法能够提升你的终端效率呢? + +### 终端复用 + +终端的许多优点之一是它是一个集中控制的界面。它是一个能让你访问数百个应用程序的窗口,而你与每一个应用程序进行交互所需要的只是一个键盘。但是,现代计算机几乎总是有多余的处理能力,而且现代计算机专家喜欢多任务处理,导致一个窗口处理数百个应用程序的能力是相当有限的。 + +解决这一问题的常见答案是终端复用:即将虚拟终端叠放在一起,然后在它们之间移动的能力。通过终端复用器,你保持了集中控制,但是当你进行多任务时,你能够进行终端切换。更好的是,你能够在终端中拆分屏幕,使得在同一时间显示多个屏幕窗口。 + +### 选择合适的复用器 + +一些终端提供类似的功能,有标签式界面和分割式视图,但也有细微的差别。首先,这些终端的功能依赖于图形化的桌面环境。其次,许多图形化的终端功能需要鼠标交互或使用不方便的键盘快捷键。终端复用器的功能在文本控制台上和在图形桌面上一样好用,而且键位绑定是针对常见的终端序列设计的,很方便。 + +现有两种流行的复用器:[tmux][2] 和 [GNU Screen][3]。尽管你与它们互动的方式略有不同,但它们做同样的事情,而且大多具有相同的功能。这篇文章是 GNU Screen 的入门指南。关于 tmux 的相关介绍,请阅读 Kevin Sonney 的 [tmux 介绍][4]。 + +### 使用 GNU Screen + +GNU Screen 的基本用法很简单,通过 `screen` 命令启动,你将进入 Screen 会话的第 0 个窗口。在你决定需要一个新的终端提示符前,你可能很难注意到有什么变化。 + +当一个终端窗口被某项活动占用(比如,你启动了文本编辑器 [Vim][5] 或 [Jove][6] 或者你在处理音视频,或运行批处理任务),你可以新建一个窗口。要打开一个新的窗口,按 `Ctrl+A`,释放,然后按 `c`。这将在你现有窗口的基础上创建一个新的窗口。 + +你会知道当前你是在一个新的窗口中,因为你的终端除了默认的提示符外,似乎没有任何东西。当然,你的另一个终端仍然存在,它只是躲在新窗口的后面。要遍历打开的窗口,按 `Ctrl+A`,释放,然后按 `n`(表示下一个)或按 `p`(表示上一个)。在只打开两个窗口的情况下, `n` 和 `p` 的功能是一样的,但你可以随时打开更多的窗口(`Ctrl+A`,然后 `c` ),并在它们之间切换。 + +### 分屏 + +GNU Screen 的默认行为更像移动设备的屏幕,而不是桌面:你一次只能看到一个窗口。如果你因为喜欢多任务而使用 GNU Screen ,那么只关注一个窗口可能看起来是一种退步。幸运的是,GNU Screen 可以让你把终端分成窗口中的窗口。 + +要创建一个水平分割窗口,按 `Ctrl+A`,然后按 `s` 。这将把一个窗口置于另一个窗口之上,就像窗格一样。然而,在你告诉它要显示什么之前,分割的空间是没有用途的。因此,在创建一个分割窗后,你可以用 `Ctrl+A` ,然后用 `Tab` 移动到分割窗中。一旦进入,使用 `Ctrl+A` 然后 `n` 浏览所有可用的窗口,直到你想显示的内容出现在分割窗格中。 + +你也可以按 `Ctrl+A` 然后按 `|` (这是一个管道字符,在大多数键盘上通过按下 `shift` 键加上 `\`)创建垂直分割窗口。 + +### 自定义 GNU Screen + + GNU Screen 使用基于 `Ctrl+A` 的快捷键。根据你的习惯,这可能会让你感觉非常自然,也可能非常不方便,因为你可能会用 `Ctrl+A` 来移动到一行的开头。无论怎样,GNU Screen 允许通过 `.screenrc` 配置文件进行各种定制。你可以用这个来改变触发键的绑定(称为 “转义” 键绑定)。 + +``` +escape ^jJ +``` + +你还可以添加一个状态行,以帮助你在 Screen 会话中保持自己不迷失。 + +``` +# status bar, with current window highlighted +hardstatus alwayslastline +hardstatus string '%{= kG}[%{G}%H%? %1`%?%{g}][%= %{= kw}%-w%{+b yk} %n*%t%?(%u)%? %{-}%+w %=%{g}][%{B}%m/%d %{W}%C%A%{g}]' + +# enable 256 colors +attrcolor b ".I" +termcapinfo xterm 'Co#256:AB=\E[48;5;%dm:AF=\E[38;5;%dm' +defbce on +``` + +在有多个窗口打开的会话中,有一个时刻提醒哪些窗口具有焦点活动,哪些窗口有后台活动的提醒器特别有用。它类似一种终端的任务管理器。 + +### 下载备忘单 + +当你学习 GNU Screen 的使用方法时,需要记住很多新的键盘命令。有些命令你马上就能记住,但那些你不常使用的命令可能就很难记住了。你可以按 `Ctrl+A` 然后再按 `?` 来访问 GNU Screen 的帮助界面,但如果你更喜欢一些可以打印出来并放在键盘边的东西,请 [下载我们的 GNU Screen 备忘单][7]。 + +学习 GNU Screen 是提高你使用你最喜欢的 [终端模拟器][8] 的效率和敏捷性的一个好方法。请试一试吧! + +-------------------------------------------------------------------------------- + +via: https://opensource.com/article/21/4/gnu-screen-cheat-sheet + +作者:[Seth Kenlon][a] +选题:[lujun9972][b] +译者:[ddl-hust](https://github.com/ddl-hust) +校对:[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) +[2]: https://github.com/tmux/tmux/wiki +[3]: https://www.gnu.org/software/screen/ +[4]: https://opensource.com/article/20/1/tmux-console +[5]: https://opensource.com/tags/vim +[6]: https://opensource.com/article/17/1/jove-lightweight-alternative-vim +[7]: https://opensource.com/downloads/gnu-screen-cheat-sheet +[8]: https://opensource.com/article/21/2/linux-terminals diff --git a/published/202105/20210430 Access an alternate internet with OpenNIC.md b/published/202105/20210430 Access an alternate internet with OpenNIC.md new file mode 100644 index 0000000000..5381d44ab5 --- /dev/null +++ b/published/202105/20210430 Access an alternate internet with OpenNIC.md @@ -0,0 +1,139 @@ +[#]: subject: (Access an alternate internet with OpenNIC) +[#]: via: (https://opensource.com/article/21/4/opennic-internet) +[#]: author: (Seth Kenlon https://opensource.com/users/seth) +[#]: collector: (lujun9972) +[#]: translator: (geekpi) +[#]: reviewer: (wxy) +[#]: publisher: (wxy) +[#]: url: (https://linux.cn/article-13393-1.html) + +用 OpenNIC 访问另一个互联网 +====== + +> 在超级信息高速公路上绕行。 + +![](https://img.linux.net.cn/data/attachment/album/202105/15/181625le76l758lel653b5.jpg) + +用传奇的 DNS 黑客 Dan Kaminsky 的话说,“事实证明,互联网对全球社会而言意义重大”。为了使互联网发挥作用,计算机必须能够在最复杂的网络万维网(WWW)中找到彼此。这是几十年前给政府工作人员和学术界 IT 人员提出的问题,而今天我们使用的正是他们的解决方案。然而,他们实际上并不是在寻求建立 互联网the Internet,他们是在为 互联网络(实际上是 级联网catenets,即“级联的网络concatenated networks
”,但这个术语最终不再流行)定义规范,它是一个互连的网络interconnected networks的通用术语。 + +根据这些规范,网络使用数字组合,作为每台在线计算机的一种家地址,并为每个网站分配一个人性化但高度结构化的“主机名”(如 `example.com`)。由于用户主要是通过网站 _名称_ 与互联网互动,可以说互联网的运作只是因为我们都同意一个标准化的命名方案。如果有足够多的人决定使用不同的命名方案,互联网的工作方式 _可能_ 会有所不同。一群用户可以形成一个平行的互联网,它使用相同的物理基础设施(电缆、卫星和其他传输方式,将数据从一个地方传送到另一个地方),但使用不同的方法将主机名与编号地址联系起来。 + +事实上,这已经存在了,这篇文章展示了你如何访问它。 + +### 了解名称服务器 + +术语“互联网internet”实际上是 互联interconnected网络networks 这两个术语的组合,因为这正是它的本质。就像一个城市里的邻里、一个国家里的城市、或一个大陆里的国家,或一个星球里的大陆一样,互联网通过将数据从一个家庭或办公室网络传输到数据中心和服务器房或其他家庭或办公室网络而跨越了全球。这是一项艰巨的任务,但它并非没有先例。毕竟,电话公司很久以前就把世界连接起来了,在那之前,电报和邮政服务也是这样做的。 + +在电话或邮件系统中,有一份名单,无论是正式的还是非正式的,都将人名与实际地址联系起来。它过去以电话簿的形式传递到家里,该电话簿是社区内每个电话所有者的目录。邮局的运作方式不同:他们通常依靠寄信人知道预定收信人的姓名和地址,但邮政编码和城市名称被用来把信送到正确的邮局。无论哪种方式,都需要有一个标准的组织方案。 + +对于计算机来说,[IP 协议][2] 描述了必须如何设置互联网上的地址格式。域名服务器 [(DNS) 协议][3] 描述了如何将人性化名称分配给 IP 以及从 IP 解析。无论你使用的是 IPv4 还是 IPv6,其想法都是一样的:当一个节点(可能是一台计算机或通往另一个网络的网关)加入一个网络时,它被分配一个 IP 地址。 + +如果你愿意,你可以在 [ICANN][4](一个帮助协调互联网上的网站名称的非营利组织)注册一个域名,并将该名称指向该 IP。没有要求你“拥有”该 IP 地址。任何人都可以将任何域名指向任何 IP 地址。唯一的限制是,一次只能有一个人拥有一个特定的域名,而且域名必须遵循公认的 DNS 命名方案。 + +域名及其相关 IP 地址的记录被输入到 DNS 中。当你在浏览器中导航到一个网站时,它会迅速查询 DNS 网络,以找到与你所输入(或从搜索引擎点击)的任何 URL 相关的 IP 地址。 + +### 一个不同的 DNS + +为了避免在谁拥有哪个域名的问题上发生争论,大多数域名注册商对域名注册收取一定的费用。该费用通常是象征性的,有时甚至是 0 美元(例如,`freenom.com` 提供免费的 `.tk`、`.ml`、`.gq` 和 `.cf` 域名,先到先得)。 + +在很长一段时间里,只有几个“顶级”域名,包括 `.org`、`.edu` 和 `.com`。现在有很多,包括 `.club`、`.biz`、`.name`、`.international` 等等。本质上它们就是字母组合,但是,有很多潜在的顶级域名是无效的,如 `.null`。如果你试图导航到一个以 `.null` 结尾的网站,那么你不会成功。它不能注册,也不是域名服务器的有效条目,而且它根本就不存在。 + +[OpenNIC项目][5] 已经建立了一个备用的 DNS 网络,将域名解析为 IP 地址,但它包括目前互联网不使用的名字。可用的顶级域名包括: + + * .geek + * .indy + * .bbs + * .gopher + * .o + * .libre + * .oss + * .dyn + * .null + +你可以在这些(以及更多的)顶级域名中注册一个域名,并在 OpenNIC 的 DNS 系统上注册,使它们映射到你选择的 IP 地址。 + +换句话说,一个网站可能存在于 OpenNIC 网络中,但对于不使用 OpenNIC 名称服务器的人来说,仍然无法访问。这绝不是一种安全措施,甚至不是一种混淆手段。这只是一种有意识的选择,在 _超级信息高速公路上绕行_ 。 + +### 如何使用 OpenNIC 的 DNS 服务器 + +要访问 OpenNIC 网站,你必须配置你的计算机使用 OpenNIC 的 DNS 服务器。幸运的是,这并不是一个非此即彼的选择。通过使用一个 OpenNIC 的 DNS 服务器,你可以同时访问 OpenNIC 和标准网络。 + +要配置你的 Linux 电脑使用 OpenNIC 的 DNS 服务器,你可以使用 [nmcli][6] 命令,这是 Network Manager 的一个终端界面。在开始配置之前,请访问 [opennic.org][5],寻找离你最近的 OpenNIC DNS 服务器。与标准 DNS 和 [边缘计算][7] 一样,服务器在地理上离你越近,你的浏览器查询时的延迟就越少。 + +下面是如何使用 OpenNIC: + +1、首先,获得一个连接列表: + +``` +$ sudo nmcli connection +NAME                TYPE             DEVICE +Wired connection 1  802-3-ethernet   eth0 +MyPersonalWifi      802-11-wireless  wlan0 +ovpn-phx2-tcp       vpn              -- +``` + +你的连接肯定与这个例子不同,但要关注第一栏。这提供了你的连接的可读名称。在这个例子中,我将配置我的以太网连接,但这个过程对无线连接是一样的。 + +2、现在你知道了需要修改的连接的名称,使用 `nmcli` 更新其 `ipv4.dns` 属性: + +``` +$ sudo nmcli con modify "Wired connection 1" ipv4.dns "134.195.4.2" +``` + +在这个例子中,`134.195.4.2` 是离我最近的服务器。 + +3、防止 Network Manager 使用你路由器设置的内容自动更新 `/etc/resolv.conf`: + +``` +$ sudo nmcli con modify "Wired connection 1" ipv4.ignore-auto-dns yes +``` + +4、将你的网络连接关闭,然后再次启动,以实例化新的设置: + +``` +$ sudo nmcli con down "Wired connection 1" +$ sudo nmcli con up "Wired connection 1" +``` + +完成了。你现在正在使用 OpenNIC 的 DNS 服务器。 + +#### 路由器上的 DNS + +你可以通过对你的路由器做这样的修改,将你的整个网络设置为使用 OpenNIC。你将不必配置你的计算机的连接,因为路由器将自动提供正确的 DNS 服务器。我无法演示这个,因为路由器的接口因制造商而异。此外,一些互联网服务提供商 (ISP) 不允许你修改名称服务器的设置,所以这并不总是一种选择。 + +### 测试 OpenNIC + +为了探索你所解锁的“其他”互联网,尝试在你的浏览器中导航到 `grep.geek`。如果你输入 `http://grep.geek`,那么你的浏览器就会带你到 OpenNIC 的搜索引擎。如果你只输入 `grep.geek`,那么你的浏览器会干扰你,把你带到你的默认搜索引擎(如 [Searx][8] 或 [YaCy][9]),并在窗口的顶部提供一个导航到你首先请求的页面。 + +![OpenNIC][10] + +不管怎么说,你最终还是来到了 `grep.geek`,现在可以在网上搜索 OpenNIC 的版本了。 + +### 广阔天地 + +互联网旨在成为一个探索、发现和平等访问的地方。OpenNIC 利用现有的基础设施和技术帮助确保这些东西。它是一个可选择的互联网替代方案。如果这些想法吸引了你,那就试一试吧! + +-------------------------------------------------------------------------------- + +via: https://opensource.com/article/21/4/opennic-internet + +作者:[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/LAW-Internet_construction_9401467_520x292_0512_dc.png?itok=RPkPPtDe (An intersection of pipes.) +[2]: https://tools.ietf.org/html/rfc791 +[3]: https://tools.ietf.org/html/rfc1035 +[4]: https://www.icann.org/resources/pages/register-domain-name-2017-06-20-en +[5]: http://opennic.org +[6]: https://opensource.com/article/20/7/nmcli +[7]: https://opensource.com/article/17/9/what-edge-computing +[8]: http://searx.me +[9]: https://opensource.com/article/20/2/open-source-search-engine +[10]: https://opensource.com/sites/default/files/uploads/did-you-mean.jpg (OpenNIC) +[11]: https://creativecommons.org/licenses/by-sa/4.0/ diff --git a/published/202105/20210501 Chrome Browser Keeps Detecting Network Change in Linux- Here-s How to Fix it.md b/published/202105/20210501 Chrome Browser Keeps Detecting Network Change in Linux- Here-s How to Fix it.md new file mode 100644 index 0000000000..d111cd3755 --- /dev/null +++ b/published/202105/20210501 Chrome Browser Keeps Detecting Network Change in Linux- Here-s How to Fix it.md @@ -0,0 +1,96 @@ +[#]: subject: "Chrome Browser Keeps Detecting Network Change in Linux? Here’s How to Fix it" +[#]: via: "https://itsfoss.com/network-change-detected/" +[#]: author: "Abhishek Prakash https://itsfoss.com/author/abhishek/" +[#]: collector: "lujun9972" +[#]: translator: "HuengchI" +[#]: reviewer: "wxy" +[#]: publisher: "wxy" +[#]: url: "https://linux.cn/article-13389-1.html" + +Linux 下 Chrome 浏览器一直报“检测到网络变化”,修复方法来了 +====== + +![](https://img.linux.net.cn/data/attachment/album/202105/14/140644y6xx6e8100wzxrr5.jpg) + +过去几天,我在 Ubuntu Linux系统上遇到了一个奇怪的问题。我用的是 Firefox 浏览器和 [Brave 浏览器][1]。Brave 浏览器一直报“network change detection”错误,几乎每次刷新都报错,但是在 Firefox 浏览器中一切正常。 + +![][2] + +这个问题严重到了几乎不能使用浏览器的地步。我不能用 [Feedly][3] 来从我最喜欢的网站浏览信息流,每一个搜索结果都要多次刷新,网站也需要多次刷新。 + +作为替代,我尝试 [在 Ubuntu 上安装 Chrome 浏览器][4]。但是问题依然存在。我还 [在 Linux 上安装了微软 Edge][5],但是问题依旧。基本上,任何 Chromium 内核的浏览器都会持续报“ERR_NETWORK_CHANGED”错误。 + +幸运地是,我找到了一个方法来修复这个问题。我将会把解决步骤分享给你,如果你也遇到了同样的问题,这将能够帮到你。 + +### 解决基于 Chromium 内核的浏览器频繁报“network change detection”错的问题 + +对我而言,关闭网络设置中的 IPv6 是一个有效的诀窍。虽然现在我还不确定是什么导致了这个故障,但是 IPv6 会在很多系统中导致错误并不是什么鲜为人知的事。如果你的系统,路由器和其他设备用了 IPv6 而不是古老却好用的 IPv4,那么你就可能遭遇和我相同的网络连接故障。 + +幸亏,[关闭 Ubuntu 的 IPv6][6] 并不算难。有好几种方法都能够达到目的,我将会分享一个大概是最容易的方法。这个方法就是用 GRUB 来关闭 IPv6。 + +> 新手注意! +> +> 如果你不习惯于用命令行和终端,请额外注意这些步骤。仔细的阅读这些操作说明。 + +#### 第 1 步:打开 GRUB 配置文件以编辑 + +打开终端。用下面的命令来在 Nano 编辑器中打开 GRUB 配置文件。这里你需要输入你的账户密码。 + +``` +sudo nano /etc/default/grub +``` + +我希望你懂得一点 [使用 Nano 编辑器][7] 的方法。使用方向键移动光标,找到以`GRUB_CMDLINE_LINUX` 开头的这行。把它的值修改成这样: + +``` +GRUB_CMDLINE_LINUX="ipv6.disable=1" +``` + +注意引号和空格。不要动其他行。 + +![][8] + +使用 `Ctrl+x` 快捷键保存更改。按 `Y` 或者回车确认。 + +#### 第 2 步:更新 GRUB + +你已经修改了 GRUB 引导器的配置,但是在你更新 GRUB 之前这些更改都不会生效。使用下面的命令来更新: + +``` +sudo update-grub +``` + +![][9] + +现在当你重启系统之后,IPv6 将会被关闭了。你不应该再遇到网络中断的故障了。 + +你可能会想为什么我没提从网络设置中关掉 IPv6。这是因为目前 Ubuntu 用了 [Netplan][10] 来管理网络配置,似乎在网络设置中做出的更改并没有被完全应用到 Netplan 中。我试过虽然在网络设置中关掉了 IPv6,但是这个问题并没有被解决,直到我用了上述命令行的方法。 + +即使过了这么多年,IPv6 的支持还是没有成熟,并且持续引发了很多故障。比如关闭 IPv6 有时候能 [提高 Linux 下的 Wi-Fi 速度][11]。够扯吧? + +不管怎样,我希望上述小方法也能够帮助你解决系统中的“network change detection”故障。 + +-------------------------------------------------------------------------------- + +via: https://itsfoss.com/network-change-detected/ + +作者:[Abhishek Prakash][a] +选题:[lujun9972][b] +译者:[HuengchI](https://github.com/HuengchI) +校对:[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/brave-web-browser/ +[2]: https://i0.wp.com/itsfoss.com/wp-content/uploads/2021/04/network-change-detected.png?resize=800%2C418&ssl=1 +[3]: https://feedly.com/ +[4]: https://itsfoss.com/install-chrome-ubuntu/ +[5]: https://itsfoss.com/microsoft-edge-linux/ +[6]: https://itsfoss.com/disable-ipv6-ubuntu-linux/ +[7]: https://itsfoss.com/nano-editor-guide/ +[8]: https://i2.wp.com/itsfoss.com/wp-content/uploads/2021/04/disabling-ipv6-via-grub.png?resize=800%2C453&ssl=1 +[9]: https://i0.wp.com/itsfoss.com/wp-content/uploads/2021/04/updating-grub-ubuntu.png?resize=800%2C434&ssl=1 +[10]: https://netplan.io/ +[11]: https://itsfoss.com/speed-up-slow-wifi-connection-ubuntu/ diff --git a/published/202105/20210502 Fedora Vs Red Hat- Which Linux Distro Should You Use and Why.md b/published/202105/20210502 Fedora Vs Red Hat- Which Linux Distro Should You Use and Why.md new file mode 100644 index 0000000000..c721782052 --- /dev/null +++ b/published/202105/20210502 Fedora Vs Red Hat- Which Linux Distro Should You Use and Why.md @@ -0,0 +1,183 @@ +[#]: subject: (Fedora Vs Red Hat: Which Linux Distro Should You Use and Why?) +[#]: via: (https://itsfoss.com/fedora-vs-red-hat/) +[#]: author: (Sarvottam Kumar https://itsfoss.com/author/sarvottam/) +[#]: collector: (lujun9972) +[#]: translator: (wxy) +[#]: reviewer: (wxy) +[#]: publisher: (wxy) +[#]: url: (https://linux.cn/article-13372-1.html) + +Fedora 和红帽 Linux:你应该使用哪个,为什么? +====== + +Fedora 和红帽 Linux。这两个 Linux 发行版都属于同一个组织,都使用 RPM 包管理器,都提供桌面版和服务器版。这两个 Linux 发行版对操作系统世界都有较大的影响。 + +这就是为什么在这两个类似的发行版之间比较容易混淆的原因。在这篇文章中,我将讨论红帽 Linux 和 Fedora 的相似之处和区别。 + +如果你想在两者之间做出选择,或者只是想了解来自同一组织的两个发行版的概念,这将对你有所帮助。 + +### Fedora 和红帽 Linux 的区别 + +![][1] + +我们先来谈谈这两个发行版的区别。 + +#### 社区版与企业版 + +早在 1995 年,红帽 Linux 就有了它的第一个正式版本,它是作为盒装产品出售的。它也被称为红帽商业 LinuxRed Hat Commercial Linux。 + +后来在 2003 年,红帽把红帽 Linux 变成了完全以企业客户为中心的红帽企业 LinuxRed Hat Enterprise Linux(RHEL)。从那时起,红帽 Linux 就是一个企业版的 Linux 发行版。 + +它的意思是,你必须订阅并付费才能使用红帽 Linux,因为它不是作为一个免费的操作系统。甚至所有的软件、错误修复和安全支持都只对那些拥有红帽订阅的人开放。 + +当红帽 Linux 变成 RHEL 时,它也导致了 Fedora 项目的成立,该项目负责 Fedora Linux的开发。 + +与红帽不同,Fedora 是一个社区版的 Linux 发行版,每个人都可以免费使用,包括错误修复和其他服务。 + +尽管红帽公司赞助了 Fedora 项目,但 Fedora Linux 主要由一个独立的开源社区维护。 + +#### 免费与付费 + +好吧,你会发现大多数的 Linux 发行版都可以免费下载。Fedora Linux 也是这样一个发行版,它的桌面版、服务器版、所有其他版本和 Spin 版都是免费 [可下载][2] 的。 + +还有一些 Linux 发行版,你必须付费购买。红帽企业 Linux 就是这样一个流行的基于 Linux 的操作系统,它是需要付费的。 + +除了价格为 99 美元的 RHEL [开发者版本][3],你必须支付超过 100 美元才能购买 [其他 RHEL 版本][4],用于服务器、虚拟数据中心和台式机。 + +然而,如果你碰巧是一个个人开发者,而不是一个组织或团队,你可以加入 [红帽开发者计划][5]。根据该计划,你可以在 12 个月内免费获得红帽企业 Linux 包括其他产品的使用权。 + +#### 上游还是下游 + +Fedora 是 RHEL 的上游,RHEL 是 Fedora 的下游。这意味着当 Fedora 的新版本发布时,红帽公司会利用 Fedora 的源代码,在其下一个版本中加入所需的功能。 + +当然,红帽公司也会在合并到自己的 RHEL 代码库之前测试这些拉来的代码。 + +换句话说,Fedora Linux 作为红帽公司的一个试验场,首先检查功能,然后将其纳入 RHEL 系统中。 + +#### 发布周期 + +为了给操作系统的所有组件提供定期更新,RHEL 和 Fedora 都遵循一个标准的定点发布模式。 + +Fedora 大约每六个月发布一个新版本(主要在四月和十月),并提供长达 13 个月的维护支持。 + +红帽 Linux 每年发布一个特定系列的新的定点版本,大约 5 年后发布一个主要版本。红帽 Linux 的每个主要版本都要经过四个生命周期阶段,从 5 年的支持到使用附加订阅的 10 年的延长寿命阶段。 + +#### 尝鲜 Linux 发行版 + +当涉及到创新和新技术时,Fedora 比 RHEL 更积极。即使 Fedora 不遵循 [滚动发布模式][6],它也是以早期提供尝鲜技术而闻名的发行版。 + +这是因为 Fedora 定期将软件包更新到最新版本,以便在每六个月后提供一个最新的操作系统。 + +如果你知道,[GNOME 40][7] 是 GNOME 桌面环境的最新版本,上个月才发布。而 Fedora 的最新稳定版 [版本 34][8] 确实包含了它,而 RHEL 的最新稳定版 8.3 仍然带有 GNOME 3.32。 + +#### 文件系统 + +在选择操作系统时,你是否把系统中数据的组织和检索放在了很重要的位置?如果是的话,在决定选择 Red Hat 和 Fedora 之前,你应该了解一下 XFS 和 Btrfs 文件系统。 + +那是在 2014 年,RHEL 7.0 用 XFS 取代 Ext4 作为其默认文件系统。从那时起,红帽在每个版本中都默认有一个 XFS 64 位日志文件系统。 + +虽然 Fedora 是红帽 Linux 的上游,但 Fedora 继续使用 Ext4,直到去年 [Fedora 33][9] 引入 [Btrfs 作为默认文件系统][10]。 + +有趣的是,红帽在最初发布的 RHEL 6 中包含了 Btrfs 作为“技术预览”。后来,红帽放弃了使用 Btrfs 的计划,因此在 2019 年从 RHEL 8 和后来发布的主要版本中完全 [删除][11] 了它。 + +#### 可用的变体 + +与 Fedora 相比,红帽 Linux 的版本数量非常有限。它主要适用于台式机、服务器、学术界、开发者、虚拟服务器和 IBM Power LE。 + +而 Fedora 除了桌面、服务器和物联网的官方版本外,还提供不可变的桌面 Silverblue 和专注于容器的 Fedora CoreOS。 + +不仅如此,Fedora 也有特定目的的定制变体,称为 [Fedora Labs][12]。每个 ISO 都为专业人士、神经科学、设计师、游戏玩家、音乐家、学生和科学家打包了一套软件。 + +想要 Fedora 中不同的桌面环境吗?你也可以查看官方的 [Fedora Spins][13],它预先配置了几种桌面环境,如 KDE、Xfce、LXQT、LXDE、Cinnamon 和 i3 平铺窗口管理器。 + +![Fedora Cinnamon Spin][14] + +此外,如果你想在新软件登陆稳定版 Fedora 之前就得到它,Fedora Rawhide 是另一个基于滚动发布模式的版本。 + +### Fedora 和红帽 Linux 的相似之处 + +除了不同之处,Fedora 和红帽 Linux 也有几个共同点。 + +#### 母公司 + +红帽公司是支持 Fedora 项目和 RHEL 的共同公司,在开发和财务方面都有支持。 + +即使红帽公司在财务上赞助 Fedora 项目,Fedora 也有自己的理事会,在没有红帽公司干预的情况下监督其发展。 + +#### 开源产品 + +在你认为红帽 Linux 要收钱,那么它怎么能成为一个开源产品之前,我建议阅读我们的 [文章][15],它分析了关于 FOSS 和开源的一切。 + +作为一个开源软件,并不意味着你可以免费得到它,有时它可能要花钱。红帽公司是一个已经在开源中建立了业务的开源公司。 + +Fedora 和红帽 Linux 都是开源的操作系统。所有的 Fedora 软件包都可以在 [这里][16] 得到源代码和在 [这里][2] 得到已经打包好的软件。 + +然而,就红帽 Linux 而言,源代码也 [免费提供][17] 给任何人。但与 Fedora 不同的是,你需要为使用可运行的代码付费,要么你可以自由地自行构建。 + +你支付给红帽的订阅费实际上是用于系统维护和技术支持。 + +#### 桌面环境和初始系统 + +Fedora 和红帽 Linux 的旗舰桌面版采用了 GNOME 图形界面。所以,如果你已经熟悉了 GNOME,从任何一个发行版开始都不会有太大的问题。 + +![GNOME 桌面][18] + +你是少数讨厌 SystemD 初始化系统的人吗?如果是这样,那么 Fedora 和红帽 Linux 都不适合你,因为它们都默认支持并使用 SystemD。 + +总之,如果你想用 Runit 或 OpenRC 等其他初始化系统代替它,也不是不可能,但我认为这不是一个好主意。 + +#### 基于 RPM 的发行版 + +如果你已经精通使用 YUM、RPM 或 DNF 命令行工具来处理 RPM 软件包,赞一个!你可以在这两个基于 RPM 的发行版中选一个。 + +默认情况下,红帽 Linux 使用 RPM(红帽包管理器Red Hat Package Manager)来安装、更新、删除和管理 RPM 软件包。 + +Fedora 在 2015 年的 Fedora 21 之前使用 YUM(黄狗更新器修改版Yellowdog Updater Modified)。从 Fedora 22 开始,它现在使用 DNF(时髦版 YumDandified Yum)代替 YUM 作为默认的 [软件包管理器][19]。 + +### Fedora 或红帽 Linux:你应该选择哪一个? + +坦率地说,这真的取决于你是谁以及你为什么要使用它。如果你是一个初学者、开发者,或者是一个想用它来提高生产力或学习 Linux 的普通用户,Fedora 可以是一个不错的选择。 + +它可以帮助你轻松地设置系统,进行实验,节省资金,还可以成为 Fedora 项目的一员。让我提醒你,Linux 的创造者 [Linus Torvalds][20] 在他的主要工作站上使用 Fedora Linux。 + +然而,这绝对不意味着你也应该使用 Fedora。如果你碰巧是一个企业,考虑到 Fedora 的支持生命周期在一年内就会结束,你可能会重新考虑选择它。 + +而且,如果你不喜欢每个新版本的快速变化,你可能不喜欢尝鲜的 Fedora 来满足你的服务器和业务需求。 + +使用企业版红帽,你可以得到高稳定性、安全性和红帽专家工程师为你的大型企业提供的支持品质。 + +那么,你是愿意每年升级你的服务器并获得免费的社区支持,还是购买订阅以获得超过 5 年的生命周期和专家技术支持?决定权在你。 + +-------------------------------------------------------------------------------- + +via: https://itsfoss.com/fedora-vs-red-hat/ + +作者:[Sarvottam Kumar][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://itsfoss.com/author/sarvottam/ +[b]: https://github.com/lujun9972 +[1]: https://i2.wp.com/itsfoss.com/wp-content/uploads/2021/05/fedora-vs-red-hat.jpg?resize=800%2C450&ssl=1 +[2]: https://getfedora.org/ +[3]: https://www.redhat.com/en/store/red-hat-enterprise-linux-developer-suite +[4]: https://www.redhat.com/en/store/linux-platforms +[5]: https://developers.redhat.com/register/ +[6]: https://itsfoss.com/rolling-release/ +[7]: https://news.itsfoss.com/gnome-40-release/ +[8]: https://news.itsfoss.com/fedora-34-release/ +[9]: https://itsfoss.com/fedora-33/ +[10]: https://itsfoss.com/btrfs-default-fedora/ +[11]: https://access.redhat.com/documentation/en-us/red_hat_enterprise_linux/8/html/considerations_in_adopting_rhel_8/file-systems-and-storage_considerations-in-adopting-rhel-8#btrfs-has-been-removed_file-systems-and-storage +[12]: https://labs.fedoraproject.org/ +[13]: https://spins.fedoraproject.org/ +[14]: https://i2.wp.com/itsfoss.com/wp-content/uploads/2021/04/Fedora-Cinnamon-Spin.jpg?resize=800%2C450&ssl=1 +[15]: https://itsfoss.com/what-is-foss/ +[16]: https://src.fedoraproject.org/ +[17]: http://ftp.redhat.com/pub/redhat/linux/enterprise/ +[18]: https://i2.wp.com/itsfoss.com/wp-content/uploads/2021/04/GNOME-desktop.jpg?resize=800%2C450&ssl=1 +[19]: https://itsfoss.com/package-manager/ +[20]: https://itsfoss.com/linus-torvalds-facts/ diff --git a/published/202105/20210503 Configure WireGuard VPNs with NetworkManager.md b/published/202105/20210503 Configure WireGuard VPNs with NetworkManager.md new file mode 100644 index 0000000000..2c46177c34 --- /dev/null +++ b/published/202105/20210503 Configure WireGuard VPNs with NetworkManager.md @@ -0,0 +1,238 @@ +[#]: subject: (Configure WireGuard VPNs with NetworkManager) +[#]: via: (https://fedoramagazine.org/configure-wireguard-vpns-with-networkmanager/) +[#]: author: (Maurizio Garcia https://fedoramagazine.org/author/malgnuz/) +[#]: collector: (lujun9972) +[#]: translator: (DCOLIVERSUN) +[#]: reviewer: (wxy) +[#]: publisher: (wxy) +[#]: url: (https://linux.cn/article-13379-1.html) + +用 NetworkManager 配置 WireGuard 虚拟私有网络 +====== + +![](https://img.linux.net.cn/data/attachment/album/202105/10/235609bmbzbr4bikupbjjr.jpg) + +虚拟私有网络Virtual Private Networks应用广泛。如今有各种方案可供使用,用户可通过这些方案访问任意类型的资源,同时保持其机密性与隐私性。 + +最近,WireGuard 因为其简单性、速度与安全性成为最广泛使用的虚拟私有网络协议之一。WireGuard 最早应用于 Linux 内核,但目前可以用在其他平台,例如 iOS、Android 等。 + +WireGuard 使用 UDP 作为其传输协议,并在 Critokey Routing(CKR)的基础上建立对等节点之间的通信。每个对等节点(无论是服务器或客户端)都有一对密钥key(公钥与私钥),公钥与许可 IP 间建立通信连接。有关 WireGuard 更多信息请访问其 [主页][4]。 + +本文描述了如何在两个对等节点(PeerA 与 PeerB)间设置 WireGuard。两个节点均运行 Fedora Linux 系统,使用 NetworkManager 进行持久性配置。 + +### WireGuard 设置与网络配置 + +在 PeerA 与 PeerB 之间建立持久性虚拟私有网络连接只需三步: + + 1. 安装所需软件包。 + 2. 生成密钥对key pair。 + 3. 配置 WireGuard 接口。 + +### 安装 + +在两个对等节点(PeerA 与 PeerB)上安装 `wireguard-tools` 软件包: + +``` +$ sudo -i +# dnf -y install wireguard-tools +``` + +这个包可以从 Fedora Linux 更新库中找到。它在 `/etc/wireguard/` 中创建一个配置目录。在这里你将创建密钥和接口配置文件。 + +### 生成密钥对 + +现在,使用 `wg` 工具在每个节点上生成公钥与私钥: + +``` +# cd /etc/wireguard +# wg genkey | tee privatekey | wg pubkey > publickey +``` + +### 在 PeerA 上配置 WireGuard 接口 + +WireGuard 接口命名规则为 `wg0`、`wg1` 等等。完成下述步骤为 WireGuard 接口创建配置: + + * PeerA 节点上配置想要的 IP 地址与掩码。 + * 该节点监听的 UDP 端口。 + * PeerA 的私钥。 + +``` +# cat << EOF > /etc/wireguard/wg0.conf +[Interface] +Address = 172.16.1.254/24 +SaveConfig = true +ListenPort = 60001 +PrivateKey = mAoO2RxlqRvCZZoHhUDiW3+zAazcZoELrYbgl+TpPEc= + +[Peer] +PublicKey = IOePXA9igeRqzCSzw4dhpl4+6l/NiQvkDSAnj5LtShw= +AllowedIPs = 172.16.1.2/32 +EOF +``` + +允许 UDP 流量通过节点监听的端口: + +``` +# firewall-cmd --add-port=60001/udp --permanent --zone=public +# firewall-cmd --reload +success +``` + +最后,将接口配置文件导入 NetworkManager。这样,WireGuard 接口在重启后将持续存在。 + +``` +# nmcli con import type wireguard file /etc/wireguard/wg0.conf +Connection 'wg0' (21d939af-9e55-4df2-bacf-a13a4a488377) successfully added. +``` + +验证 `wg0`的状态: + +``` +# wg +interface: wg0 + public key: FEPcisOjLaZsJbYSxb0CI5pvbXwIB3BCjMUPxuaLrH8= + private key: (hidden) + listening port: 60001 + +peer: IOePXA9igeRqzCSzw4dhpl4+6l/NiQvkDSAnj5LtShw= + allowed ips: 172.16.1.2/32 + +# nmcli -p device show wg0 + +=============================================================================== + Device details (wg0) +=============================================================================== +GENERAL.DEVICE: wg0 +------------------------------------------------------------------------------- +GENERAL.TYPE: wireguard +------------------------------------------------------------------------------- +GENERAL.HWADDR: (unknown) +------------------------------------------------------------------------------- +GENERAL.MTU: 1420 +------------------------------------------------------------------------------- +GENERAL.STATE: 100 (connected) +------------------------------------------------------------------------------- +GENERAL.CONNECTION: wg0 +------------------------------------------------------------------------------- +GENERAL.CON-PATH: /org/freedesktop/NetworkManager/ActiveC> +------------------------------------------------------------------------------- +IP4.ADDRESS[1]: 172.16.1.254/24 +IP4.GATEWAY: -- +IP4.ROUTE[1]: dst = 172.16.1.0/24, nh = 0.0.0.0, mt => +------------------------------------------------------------------------------- +IP6.GATEWAY: -- +------------------------------------------------------------------------------- +``` + +上述输出显示接口 `wg0` 已连接。现在,它可以和虚拟私有网络 IP 地址为 172.16.1.2 的对等节点通信。 + +### 在 PeerB 上配置 WireGuard 接口 + +现在可以在第二个对等节点上创建 `wg0` 接口的配置文件了。确保你已经完成以下步骤: + + * PeerB 节点上设置 IP 地址与掩码。 + * PeerB 的私钥。 + * PeerA 的公钥。 + * PeerA 的 IP 地址或主机名、监听 WireGuard 流量的 UDP 端口。 + +``` +# cat << EOF > /etc/wireguard/wg0.conf +[Interface] +Address = 172.16.1.2 +SaveConfig = true +PrivateKey = UBiF85o7937fBK84c2qLFQwEr6eDhLSJsb5SAq1lF3c= + +[Peer] +PublicKey = FEPcisOjLaZsJbYSxb0CI5pvbXwIB3BCjMUPxuaLrH8= +AllowedIPs = 172.16.1.254/32 +Endpoint = peera.example.com:60001 +EOF +``` + +最后一步是将接口配置文件导入 NetworkManager。如上所述,这一步是重启后保持 WireGuard 接口持续存在的关键。 + +``` +# nmcli con import type wireguard file /etc/wireguard/wg0.conf +Connection 'wg0' (39bdaba7-8d91-4334-bc8f-85fa978777d8) successfully added. +``` + +验证 `wg0` 的状态: + +``` +# wg +interface: wg0 + public key: IOePXA9igeRqzCSzw4dhpl4+6l/NiQvkDSAnj5LtShw= + private key: (hidden) + listening port: 47749 + +peer: FEPcisOjLaZsJbYSxb0CI5pvbXwIB3BCjMUPxuaLrH8= + endpoint: 192.168.124.230:60001 + allowed ips: 172.16.1.254/32 + +# nmcli -p device show wg0 + +=============================================================================== + Device details (wg0) +=============================================================================== +GENERAL.DEVICE: wg0 +------------------------------------------------------------------------------- +GENERAL.TYPE: wireguard +------------------------------------------------------------------------------- +GENERAL.HWADDR: (unknown) +------------------------------------------------------------------------------- +GENERAL.MTU: 1420 +------------------------------------------------------------------------------- +GENERAL.STATE: 100 (connected) +------------------------------------------------------------------------------- +GENERAL.CONNECTION: wg0 +------------------------------------------------------------------------------- +GENERAL.CON-PATH: /org/freedesktop/NetworkManager/ActiveC> +------------------------------------------------------------------------------- +IP4.ADDRESS[1]: 172.16.1.2/32 +IP4.GATEWAY: -- +------------------------------------------------------------------------------- +IP6.GATEWAY: -- +------------------------------------------------------------------------------- +``` + +上述输出显示接口 `wg0` 已连接。现在,它可以和虚拟私有网络 IP 地址为 172.16.1.254 的对等节点通信。 + +### 验证节点间通信 + +完成上述步骤后,两个对等节点可以通过虚拟私有网络连接相互通信,以下是 ICMP 测试结果: + +``` +[root@peerb ~]# ping 172.16.1.254 -c 4 +PING 172.16.1.254 (172.16.1.254) 56(84) bytes of data. +64 bytes from 172.16.1.254: icmp_seq=1 ttl=64 time=0.566 ms +64 bytes from 172.16.1.254: icmp_seq=2 ttl=64 time=1.33 ms +64 bytes from 172.16.1.254: icmp_seq=3 ttl=64 time=1.67 ms +64 bytes from 172.16.1.254: icmp_seq=4 ttl=64 time=1.47 ms +``` + +在这种情况下,如果你在 PeerA 端口 60001 上捕获 UDP 通信,则将看到依赖 WireGuard 协议的通信过程和加密的数据: + +![捕获依赖 WireGuard 协议的节点间 UDP 流量][5] + +## 总结 + +虚拟私有网络很常见。在用于部署虚拟私有网络的各种协议和工具中,WireGuard 是一种简单、轻巧和安全的选择。它可以在对等节点之间基于 CryptoKey 路由建立安全的点对点连接,过程非常简单。此外,NetworkManager 支持 WireGuard 接口,允许重启后进行持久配置。 + +-------------------------------------------------------------------------------- + +via: https://fedoramagazine.org/configure-wireguard-vpns-with-networkmanager/ + +作者:[Maurizio Garcia][a] +选题:[lujun9972][b] +译者:[DCOLIVERSUN](https://github.com/DCOLIVERSUN) +校对:[wxy](https://github.com/wxy) + +本文由 [LCTT](https://github.com/LCTT/TranslateProject) 原创编译,[Linux中国](https://linux.cn/) 荣誉推出 + +[a]: https://fedoramagazine.org/author/malgnuz/ +[b]: https://github.com/lujun9972 +[1]: https://fedoramagazine.org/wp-content/uploads/2021/05/wireguard-nm-816x345.jpg +[2]: https://youtu.be/0eiXMGfZc60?t=633 +[3]: https://www.youtube.com/c/HighTreason610/featured +[4]: https://www.wireguard.com/ +[5]: https://fedoramagazine.org/wp-content/uploads/2021/04/capture-1024x601.png diff --git a/published/202105/20210504 5 ways the Star Wars universe embraces open source.md b/published/202105/20210504 5 ways the Star Wars universe embraces open source.md new file mode 100644 index 0000000000..100fff6490 --- /dev/null +++ b/published/202105/20210504 5 ways the Star Wars universe embraces open source.md @@ -0,0 +1,102 @@ +[#]: subject: (5 ways the Star Wars universe embraces open source) +[#]: via: (https://opensource.com/article/21/5/open-source-star-wars) +[#]: author: (Seth Kenlon https://opensource.com/users/seth) +[#]: collector: (lujun9972) +[#]: translator: (wxy) +[#]: reviewer: (wxy) +[#]: publisher: (wxy) +[#]: url: (https://linux.cn/article-13367-1.html) + +《星球大战》的世界拥抱开源的 5 种方式 +====== + +> 与《星球大战》一起成长的过程中,我学到了很多关于开源的知识。 + +![](https://img.linux.net.cn/data/attachment/album/202105/07/160338h1l01l8077wwd1j1.jpg) + +让我们先说清楚一件事:在现实生活中,《星球大战Star Wars》特许经营权没有任何开放性(尽管其所有者确实发布了 [一些开源代码][2])。《星球大战》是一个严格控制的资产,没有任何东西是在自由文化许可证下出版的。抛开任何关于 [文化形象应该成为伴随它们成长的人们的财产][3] 的争论,本文邀请你走进《星球大战》的世界,想象你是很久以前的一个电脑用户,在一个遥远的星系里…… + +### 机器人 + +> “但我还要去托西站Tosche Station弄些电力转换器呢。” +> —— 卢克•天行者 + +在乔治•卢卡斯George Lucas拍摄他的第一部《星球大战》电影之前,他导演了一部名为《美国涂鸦American Graffiti》的电影,这是一部以上世纪 60 年代为背景的成长电影。这部电影的部分背景是改装车hot-rod和街头赛车文化,一群机械修理工在车库里花了好几个小时,无休止地改装他们的汽车。今天仍然可以这样做,但大多数汽车爱好者会告诉你,“经典”汽车改装起来容易得多,因为它们主要使用机械部件而不是技术部件,而且它们以一种可预测的方式使用普通部件。 + +我一直把卢克和他的朋友们看作是对同样怀旧的科幻小说诠释。当然,花哨的新战斗堡垒是高科技,可以摧毁整个星球,但当 [防爆门不能正确打开][4] 或监禁层的垃圾压实机开始压扁人时,你会怎么做?如果你没有一个备用的 R2 机器人与主机对接,你就没辙了。卢克对修理和维护“机器人”的热情以及他在修理蒸发器和 X 翼飞机方面的天赋从第一部电影中就可以看出。 + +看到塔图因星球对待技术的态度,我不禁相信,大多数常用设备都是大众的技术。卢克并没有为 C-3PO 或 R2-D2 签订最终用户许可协议。当他让 C-3PO 在热油浴中放松时,或者当楚巴卡在兰多的云城重新组装他时,并没有使他的保修失效。同样,汉•索罗和楚巴卡从来没有把千年隼带到经销商那里去购买经批准的零件。 + +我无法证明这都是开源技术。鉴于电影中大量的终端用户维修和定制,我相信在星战世界中,技术是开放的,[用户是有拥有和维修的常识的][5]。 + +### 加密和隐写术 + +> “帮助我,欧比旺•克诺比。你是我唯一的希望。” +> —— 莱亚公主 + +诚然,《星球大战》世界中的数字身份认证很难理解,但如果有一点是明确的,加密和隐写术对叛军的成功至关重要。而当你身处叛军时,你就不能依靠公司的标准,怀疑它们是由你正在斗争的邪恶帝国批准的。当 R2-D2 隐瞒莱娅公主绝望的求救时,它的记忆库中没有任何后门,而叛军在潜入敌方领土时努力获得认证凭证(这是一个旧的口令,但它通过检查了)。 + +加密不仅仅是一个技术问题。它是一种通信形式,在历史上有这样的例子。当政府试图取缔加密时,就是在努力取缔社区。我想这也是“叛乱”本应抵制的一部分。 + +### 光剑 + +> “我看到你已经打造了新的光剑,你的技能现在已经完成了。” +> —— 达斯•维德 + +在《帝国反击战》中,天行者卢克失去了他标志性的蓝色光剑,同时他的手也被邪恶霸主达斯•维德砍断。在下一部电影《绝地归来》中,卢克展示了他自己打造的绿色光剑 —— 每一个粉丝都为之着迷。 + +虽然没有明确说明绝地武士的激光剑的技术规格是开源的,但有一定的暗指。例如,没有迹象表明卢克在制造他的武器之前必须从拥有版权的公司获得设计许可。他没有与一家高科技工厂签订合同来生产他的剑。 + +他自己打造了它,作为一种成年仪式。也许制造如此强大的武器的方法是绝地武士团所守护的秘密;再者,也许这只是描述开源的另一种方式。我所知道的所有编码知识都是从值得信赖的导师、某些互联网 UP 主、精心撰写的博客文章和技术讲座中学到的。 + +严密保护的秘密?还是对任何寻求知识的人开放的信息? + +根据我在原三部曲中看到的绝地武士秩序,我选择相信后者。 + +### 伊沃克文化 + +> “Yub nub!” +> —— 伊沃克人 + +恩多的伊沃克人与帝国其他地区的文化形成了鲜明的对比。他们热衷于集体生活、分享饮食和故事到深夜。他们自己制作武器、陷阱和安全防火墙,还有他们自己的树顶村庄。作为象征意义上的弱者,他们不可能摆脱帝国的占领。他们通过咨询礼仪机器人做了研究,汇集了他们的资源,并在关键时刻发挥了作用。当陌生人进入他们的家时,他们并没有拒绝他们。相反,他们帮助他们(在确定他们毕竟不是食物之后)。当他们面对令人恐惧的技术时,他们就参与其中并从中学习。 + +伊沃克人是《星球大战》世界中开放文化和开源的庆典。他们是我们应该努力的社区:分享信息、分享知识、接受陌生人和进步的技术,以及维护捍卫正义的决心。 + +### 原力 + +> “原力将与你同在,永远。” +> —— 欧比旺•克诺比 + +在最初的电影中,甚至在新生的衍生宇宙中(最初的衍生宇宙小说,也是我个人的最爱,是《心灵之眼的碎片》,其中卢克从一个叫哈拉的女人那里学到了更多关于原力的知识),原力只是:一种任何人都可以学习使用的力量。它不是一种与生俱来的天赋,而是一门需要掌握的强大学科。 + +![衍生宇宙的最开始][6] + +相比之下,邪恶的西斯人对他们的知识是保护性的,只邀请少数人加入他们的行列。他们可能认为自己有一个群体,但这正是看似随意的排他性的模式。 + +我不知道对开源和开放文化还有什么更好的比喻。永远存在被认为是排他的危险,因为爱好者似乎总是在“人群中”。但现实是,每个人都可以加入这些邀请,而且任何人都可以回到源头(字面意思是源代码或资产)。 + +### 愿源与你同在 + +作为一个社区,我们的任务是要问,我们如何能让人明白,无论我们拥有什么知识,都不是为了成为特权信息,而是一种任何人都可以学习使用的力量,以改善他们的世界。 + +套用欧比旺•克诺比的不朽名言:“使用源”。 + +-------------------------------------------------------------------------------- + +via: https://opensource.com/article/21/5/open-source-star-wars + +作者:[Seth Kenlon][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/seth +[b]: https://github.com/lujun9972 +[1]: https://opensource.com/sites/default/files/styles/image-full-size/public/lead-images/tobias-cornille-light-sabres-unsplash.jpg?itok=rYwXA2CX (Man with lasers in night sky) +[2]: https://disney.github.io/ +[3]: https://opensource.com/article/18/1/creative-commons-real-world +[4]: https://www.hollywoodreporter.com/heat-vision/star-wars-40th-anniversary-head-banging-stormtrooper-explains-classic-blunder-1003769 +[5]: https://www.eff.org/issues/right-to-repair +[6]: https://opensource.com/sites/default/files/20210501_100930.jpg (The very beginning of the expanded universe) diff --git a/published/202105/20210504 Keep multiple Linux distros on a USB with this open source tool.md b/published/202105/20210504 Keep multiple Linux distros on a USB with this open source tool.md new file mode 100644 index 0000000000..dc17b8fd95 --- /dev/null +++ b/published/202105/20210504 Keep multiple Linux distros on a USB with this open source tool.md @@ -0,0 +1,92 @@ +[#]: subject: (Keep multiple Linux distros on a USB with this open source tool) +[#]: via: (https://opensource.com/article/21/5/linux-ventoy) +[#]: author: (Don Watkins https://opensource.com/users/don-watkins) +[#]: collector: (lujun9972) +[#]: translator: (wxy) +[#]: reviewer: (wxy) +[#]: publisher: (wxy) +[#]: url: (https://linux.cn/article-13361-1.html) + +神器:在一个 U 盘上放入多个 Linux 发行版 +====== + +> 用 Ventoy 创建多启动 U 盘,你将永远不会缺少自己喜欢的 Linux 发行版。 + +![](https://img.linux.net.cn/data/attachment/album/202105/05/131432p5q7hh5cm7a8ffsd.jpg) + +给朋友和邻居一个可启动 U 盘,里面包含你最喜欢的 Linux 发行版,是向 Linux 新手介绍我们都喜欢的 Linux 体验的好方法。仍然有许多人从未听说过 Linux,把你喜欢的发行版放在一个可启动的 U 盘上是让他们进入 Linux 世界的好办法。 + +几年前,我在给一群中学生教授计算机入门课。我们使用旧笔记本电脑,我向学生们介绍了 Fedora、Ubuntu 和 Pop!_OS。下课后,我给每个学生一份他们喜欢的发行版的副本,让他们带回家安装在自己选择的电脑上。他们渴望在家里尝试他们的新技能。 + +### 把多个发行版放在一个驱动器上 + +最近,一个朋友向我介绍了 Ventoy,它(根据其 [GitHub 仓库][2])是 “一个开源工具,可以为 ISO/WIM/IMG/VHD(x)/EFI 文件创建可启动的 USB 驱动器”。与其为每个我想分享的 Linux 发行版创建单独的驱动器,我可以在一个 U 盘上放入我喜欢的 _所有_ Linux 发行版! + +![USB 空间][3] + +正如你所能想到的那样,U 盘的大小决定了你能在上面容纳多少个发行版。在一个 16GB 的 U 盘上,我放置了 Elementary 5.1、Linux Mint Cinnamon 5.1 和 Linux Mint XFCE 5.1......但仍然有 9.9GB 的空间。 + +### 获取 Ventoy + +Ventoy 是开源的,采用 [GPLv3][5] 许可证,可用于 Windows 和 Linux。有很好的文档介绍了如何在 Windows 上下载和安装 Ventoy。Linux 的安装是通过命令行进行的,所以如果你不熟悉这个过程,可能会有点混乱。然而,其实很容易。 + +首先,[下载 Ventoy][6]。我把存档文件下载到我的桌面上。 + +接下来,使用 `tar` 命令解压 `ventoy-x.y.z-linux.tar.gz` 档案(但要用你下载的版本号替换 `x.y.z`)(为了保持简单,我在命令中使用 `*` 字符作为任意通配符): + +``` +$ tar -xvf ventoy*z +``` + +这个命令将所有必要的文件提取到我桌面上一个名为 `ventoy-x.y.z` 的文件夹中。 + +你也可以使用你的 Linux 发行版的存档管理器来完成同样的任务。下载和提取完成后,你就可以把 Ventoy 安装到你的 U 盘上了。 + +### 在 U 盘上安装 Ventoy 和 Linux + +把你的 U 盘插入你的电脑。改变目录进入 Ventoy 的文件夹,并寻找一个名为 `Ventoy2Disk.sh` 的 shell 脚本。你需要确定你的 U 盘的正确挂载点,以便这个脚本能够正常工作。你可以通过在命令行上发出 `mount` 命令或者使用 [GNOME 磁盘][7] 来找到它,后者提供了一个图形界面。后者显示我的 U 盘被挂载在 `/dev/sda`。在你的电脑上,这个位置可能是 `/dev/sdb` 或 `/dev/sdc` 或类似的位置。 + +![GNOME 磁盘中的 USB 挂载点][8] + +下一步是执行 Ventoy shell 脚本。因为它被设计成不加选择地复制数据到一个驱动器上,我使用了一个假的位置(`/dev/sdX`)来防止你复制/粘贴错误,所以用你想覆盖的实际驱动器的字母替换后面的 `X`。 + +**让我重申**:这个 shell 脚本的目的是把数据复制到一个驱动器上, _破坏该驱动器上的所有数据。_ 如果该驱动器上有你关心的数据,在尝试这个方法之前,先把它备份! 如果你不确定你的驱动器的位置,在你继续进行之前,请验证它,直到你完全确定为止。 + +一旦你确定了你的驱动器的位置,就运行这个脚本: + +``` +$ sudo sh Ventoy2Disk.sh -i /dev/sdX +``` + +这样就可以格式化它并将 Ventoy 安装到你的 U 盘上。现在你可以复制和粘贴所有适合放在 U 盘上的 Linux 发行版文件。如果你在电脑上用新创建的 U 盘引导,你会看到一个菜单,上面有你复制到 U 盘上的发行版。 + +![Ventoy 中的 Linux 发行版][9] + +### 构建一个便携式的动力源 + +Ventoy 是你在钥匙串上携带多启动 U 盘的关键(钥匙),这样你就永远不会缺少你所依赖的发行版。你可以拥有一个全功能的桌面、一个轻量级的发行版、一个纯控制台的维护工具,以及其他你想要的东西。 + +我从来没有在没有 Linux 发行版的情况下离开家,你也不应该。拿上 Ventoy、一个 U 盘,和一串 ISO。你不会后悔的。 + +-------------------------------------------------------------------------------- + +via: https://opensource.com/article/21/5/linux-ventoy + +作者:[Don Watkins][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/don-watkins +[b]: https://github.com/lujun9972 +[1]: https://opensource.com/sites/default/files/styles/image-full-size/public/lead-images/markus-winkler-usb-unsplash.jpg?itok=5ZXDp0V4 (USB drive) +[2]: https://github.com/ventoy/Ventoy +[3]: https://opensource.com/sites/default/files/uploads/ventoy1.png (USB space) +[4]: https://creativecommons.org/licenses/by-sa/4.0/ +[5]: https://www.ventoy.net/en/doc_license.html +[6]: https://github.com/ventoy/Ventoy/releases +[7]: https://wiki.gnome.org/Apps/Disks +[8]: https://opensource.com/sites/default/files/uploads/usb-mountpoint.png (USB mount point in GNOME Disks) +[9]: https://opensource.com/sites/default/files/uploads/ventoy_distros.jpg (Linux distros in Ventoy) diff --git a/published/202105/20210505 Drop telnet for OpenSSL.md b/published/202105/20210505 Drop telnet for OpenSSL.md new file mode 100644 index 0000000000..5258c011e0 --- /dev/null +++ b/published/202105/20210505 Drop telnet for OpenSSL.md @@ -0,0 +1,187 @@ +[#]: subject: (Drop telnet for OpenSSL) +[#]: via: (https://opensource.com/article/21/5/drop-telnet-openssl) +[#]: author: (Seth Kenlon https://opensource.com/users/seth) +[#]: collector: (lujun9972) +[#]: translator: (geekpi) +[#]: reviewer: (wxy) +[#]: publisher: (wxy) +[#]: url: (https://linux.cn/article-13381-1.html) + +用 OpenSSL 替代 telnet +====== + +> Telnet 缺乏加密,这使得 OpenSSL 成为连接远程系统的更安全的选择。 + +![](https://img.linux.net.cn/data/attachment/album/202105/11/115934cggzmq8rm8suaqlq.png) + +[telnet][2] 命令是最受欢迎的网络故障排除工具之一,从系统管理员到网络爱好者都可以使用。在网络计算的早期,`telnet` 被用来连接到一个远程系统。你可以用 `telnet` 访问一个远程系统的端口,登录并在该主机上运行命令。 + +由于 `telnet` 缺乏加密功能,它在很大程度上已经被 OpenSSL 取代了这项工作。然而,作为一种智能的 `ping`,`telnet` 的作用仍然存在(甚至在某些情况下至今仍然存在)。虽然 `ping` 命令是一个探测主机响应的好方法,但这是它能做的 _全部_。另一方面,`telnet` 不仅可以确认一个活动端口,而且还可以与该端口的服务进行交互。即便如此,由于大多数现代网络服务都是加密的,`telnet` 的作用可能要小得多,这取决于你想实现什么。 + +### OpenSSL s_client + +对于大多数曾经需要 `telnet` 的任务,我现在使用 OpenSSL 的 `s_client` 命令。(我在一些任务中使用 [curl][3],但那些情况下我可能无论如何也不会使用 `telnet`)。大多数人都知道 [OpenSSL][4] 是一个加密的库和框架,但不是所有人都意识到它也是一个命令。`openssl` 命令的 `s_client` 组件实现了一个通用的 SSL 或 TLS 客户端,帮助你使用 SSL 或 TLS 连接到远程主机。它是用来测试的,至少在内部使用与该库相同的功能。 + +### 安装 OpenSSL + +OpenSSL 可能已经安装在你的 Linux 系统上了。如果没有,你可以用你的发行版的软件包管理器安装它: + +``` +$ sudo dnf install openssl +``` + +在 Debian 或类似的系统上: + +``` +$ sudo apt install openssl +``` + +安装后,验证它的响应是否符合预期: + +``` +$ openssl version +OpenSSL x.y.z FIPS +``` + +### 验证端口访问 + +最基本的 `telnet` 用法是一个看起来像这样的任务: + +``` +$ telnet mail.example.com 25 +Trying 98.76.54.32... +Connected to example.com. +Escape character is '^]'. +``` + +在此示例中,这将与正在端口 25(可能是邮件服务器)监听的任意服务打开一个交互式会话。只要你获得访问权限,就可以与该服务进行通信。 + +如果端口 25 无法访问,连接就会被拒绝。 + +OpenSSL 也是类似的,尽管通常较少互动。要验证对一个端口的访问: + +``` +$ openssl s_client -connect example.com:80 +CONNECTED(00000003) +140306897352512:error:1408F10B:SSL [...] + +no peer certificate available + +No client certificate CA names sent + +SSL handshake has read 5 bytes and written 309 bytes +Verification: OK + +New, (NONE), Cipher is (NONE) +Secure Renegotiation IS NOT supported +Compression: NONE +Expansion: NONE +No ALPN negotiated +Early data was not sent +Verify return code: 0 (ok) +``` + +但是,这仅是目标性 `ping`。从输出中可以看出,没有交换 SSL 证书,所以连接立即终止。为了充分利用 `openssl s_client`,你必须连接加密的端口。 + +### 交互式 OpenSSL + +Web 浏览器和 Web 服务器进行交互,可以使指向 80 端口的流量实际上被转发到 443,这是保留给加密 HTTP 流量的端口。知道了这一点,你就可以用 `openssl` 命令连接到加密的端口,并与在其上运行的任何网络服务进行交互。 + +首先,使用 SSL 连接到一个端口。使用 `-showcerts` 选项会使 SSL 证书打印到你的终端上,一开始的输出要比 telnet 要冗长得多: + +``` +$ openssl s_client -connect example.com:443 -showcerts +[...] +    0080 - 52 cd bd 95 3d 8a 1e 2d-3f 84 a0 e3 7a c0 8d 87   R...=..-?...z... +    0090 - 62 d0 ae d5 95 8d 82 11-01 bc 97 97 cd 8a 30 c1   b.............0. +    00a0 - 54 78 5c ad 62 5b 77 b9-a6 35 97 67 65 f5 9b 22   Tx\\.b[w..5.ge.." +    00b0 - 18 8a 6a 94 a4 d9 7e 2f-f5 33 e8 8a b7 82 bd 94   ..j...~/.3...... + +    Start Time: 1619661100 +    Timeout   : 7200 (sec) +    Verify return code: 0 (ok) +    Extended master secret: no +    Max Early Data: 0 +- +read R BLOCK +``` + +你被留在一个交互式会话中。最终,这个会话将关闭,但如果你及时行动,你可以向服务器发送 HTTP 信号: + +``` +[...] +GET / HTTP/1.1 +HOST: example.com +``` + +按**回车键**两次,你会收到 `example.com/index.html` 的数据: + +``` +[...] + +
+

Example Domain

+

This domain is for use in illustrative examples in documents. You may use this + domain in literature without prior coordination or asking for permission.

+

More information...

+
+ + +``` + +#### Email 服务器 + +你也可以使用 OpenSSL 的 `s_client` 来测试一个加密的 Email 服务器。要做到这点,你必须把你的测试用户的用户名和密码用 Base64 编码。 + +这里有一个简单的方法来做到: + +``` +$ perl -MMIME::Base64 -e 'print encode_base64("username");' +$ perl -MMIME::Base64 -e 'print encode_base64("password");' +``` + +当你记录了这些值,你就可以通过 SSL 连接到邮件服务器,它通常在 587 端口: + +``` +$ openssl s_client -starttls smtp \ +-connect email.example.com:587 +> ehlo example.com +> auth login +##paste your user base64 string here## +##paste your password base64 string here## + +> mail from: noreply@example.com +> rcpt to: admin@example.com +> data +> Subject: Test 001 +This is a test email. +. +> quit +``` + +检查你的邮件(在这个示例代码中,是 `admin@example.com`),查看来自 `noreply@example.com` 的测试邮件。 + +### OpenSSL 还是 Telnet? + +`telnet` 仍然有用途,但它已经不是以前那种不可缺少的工具了。该命令在许多发行版上被归入 “遗留” 网络软件包,而且还没有 `telnet-ng` 之类的明显的继任者,管理员有时会对它被排除在默认安装之外感到疑惑。答案是,它不再是必不可少的,它的作用越来越小,这 _很好_。网络安全很重要,所以要适应与加密接口互动的工具,这样你就不必在排除故障时禁用你的保护措施。 + +-------------------------------------------------------------------------------- + +via: https://opensource.com/article/21/5/drop-telnet-openssl + +作者:[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/security-lock-password.jpg?itok=KJMdkKum (Lock) +[2]: https://www.redhat.com/sysadmin/telnet-netcat-troubleshooting +[3]: https://opensource.com/downloads/curl-command-cheat-sheet +[4]: https://www.openssl.org/ +[5]: https://www.iana.org/domains/example"\>More +[6]: mailto:noreply@example.com +[7]: mailto:admin@example.com diff --git a/published/202105/20210506 Learn essential Kubernetes commands with a new cheat sheet.md b/published/202105/20210506 Learn essential Kubernetes commands with a new cheat sheet.md new file mode 100644 index 0000000000..f7a6a9f8a9 --- /dev/null +++ b/published/202105/20210506 Learn essential Kubernetes commands with a new cheat sheet.md @@ -0,0 +1,131 @@ +[#]: subject: (Learn essential Kubernetes commands with a new cheat sheet) +[#]: via: (https://opensource.com/article/21/5/kubernetes-cheat-sheet) +[#]: author: (Seth Kenlon https://opensource.com/users/seth) +[#]: collector: (lujun9972) +[#]: translator: (geekpi) +[#]: reviewer: (wxy) +[#]: publisher: (wxy) +[#]: url: (https://linux.cn/article-13390-1.html) + +速查表:学习 Kubernetes 的基本命令 +====== + +> 开始探索 kubectl、容器、吊舱等,接着下载我们的免费的速查表,这样你就可以随时掌握关键的命令了。 + +![](https://img.linux.net.cn/data/attachment/album/202105/14/144523ynjr88nm4oaa7nzn.jpg) + +云计算主要是在 Kubernetes 上运行,Kubernetes 主要是在 Linux 上运行,而 Linux 在有熟练的系统管理员控制时运行得最好。无论你认为自己是云计算架构师还是只是一个保守的系统管理员,现代互联网都需要了解如何在容器中创建应用和服务,按需扩展,按需扩展以及如何明智地进行监视和管理。 + +进入勇敢的容器世界的第一步是学习 Kubernetes 和它的基本命令:`kubectl`。 + +### 安装 kubectl + +`kubectl` 命令允许你在 Kubernetes 集群上运行命令。你使用 `kubectl` 来部署应用、查看日志、检查和管理集群资源,并在出现问题时进行故障排除。`kubectl`(以及整个 Kubernetes)的典型“问题”是,要对集群运行命令,你首先需要一个集群。然而,有一些简单的解决方案。 + +首先,你可以创建自己的 Kubernetes 集群,只需买三块树莓派板和相关外围设备(主要是电源)。当你获得了硬件,阅读 Chris Collins 的 [使用树莓派构建 Kubernetes 集群][2],你就会拥有自己的安装有 `kubectl` 的集群。 + +另一种获得集群的方法是使用 [Minikube][3],这是一个 Kubernetes 的实践环境。在所有建立和运行集群的方法中,这是最简单的。 + +还有更多的选择;例如,你可以参加一个关于 Kubernetes 的课程,以获得一个运行集群的实验室,或者你可以在云上购买时间。只要你有一个 Kubernetes 环境来练习,如何获得集群并不重要。 + +当你你能访问一个集群,你就可以开始探索 `kubectl` 命令。 + +### 了解吊舱和容器 + +容器是一个轻量级的、部分的 Linux 系统,专门用于运行一个应用或服务。容器受到 [内核命名空间][4] 的限制,这使它能够访问其主机(运行容器的计算机)上的重要系统组件,同时防止它向其主机发送数据。容器以容器镜像(或简称 _镜像_)的形式保存,并由称为 `Containerfile` 或 `Dockerfile` 的文本文件定义。 + +吊舱Pod是容器的正式集合,也是管理员扩展、监控和维护任何数量的容器的一种简单方法。 + +这些一起就像 Kubernetes 的“应用程序”。创建或获取容器镜像是你在云上运行服务的方式。 + +### 运行一个吊舱 + +容器镜像的两个可靠的仓库是 Docker Hub 和 Quay。你可以在仓库中搜索可用的镜像列表。通常有由项目提供的大型项目的官方镜像,也有专门的、定制的或特殊项目的社区镜像。最简单和最小的镜像之一是 [BusyBox][5] 容器,它提供了一个最小的 shell 环境和一些常用命令。 + +无论你是从仓库中拉取镜像,还是自己编写镜像定义并从 Git 仓库中拉取到集群中,其工作流程都是一样的。当你想在 Kubernetes 中启动一个吊舱时: + + 1. 在 [Docker Hub][6] 或 [Quay][7] 上找到一个你想使用的镜像 + 2. 拉取镜像 + 3. 创建一个吊舱 + 4. 部署吊舱 + +以 BusyBox 容器为例子,你可以用一条命令完成最后三个步骤: + +``` +$ kubectl create deployment my-busybox --image=busybox +``` + +等待 `kubectl` 完成这个过程,最后你就有了一个正在运行的 BusyBox 实例。这个吊舱并没有暴露给其他人。它只是在后台安静地在你的集群上运行。 + +要看你的集群上有哪些吊舱在运行: + +``` +$ kubectl get pods --all-namespaces +``` + +你也可以获得关于吊舱部署的信息: + +``` +$ kubectl describe deployment my-busybox +``` + +### 与吊舱互动 + +容器通常包含使其自动化的配置文件。例如,将 Nginx httpd 服务器作为容器安装,应该不需要你的互动。你开始运行容器,它就会工作。对于你添加到吊舱中的第一个容器和之后的每个容器都是如此。 + +Kubernetes 模型的优点之一是,你可以根据需要扩展你的服务。如果你的网络服务被意外的流量淹没,你可以在你的云中启动一个相同的容器(使用 `scale` 或 `autoscale` 子命令),使你的服务处理传入请求的能力增加一倍。 + +即便如此,有时还是很高兴看到一些证明吊舱正在按预期运行的证据,或者能够对似乎无法正常运行的某些问题进行故障排除。为此,你可以在一个容器中运行任意的命令: + +``` +$ kubectl exec my-busybox -- echo "hello cloud" +``` + +另外,你可以在你的容器中打开一个 shell,用管道将你的标准输入输入到其中,并将其输出到终端的标准输出: + +``` +$ kubectl exec --stdin --tty my-busybox -- /bin/sh +``` + +### 暴露服务 + +默认情况下,吊舱在创建时不会暴露给外界,这样你就有时间在上线前进行测试和验证。假设你想把 Nginx Web 服务器作为一个吊舱安装和部署在你的集群上,并使其可以访问。与任何服务一样,你必须将你的吊舱指向服务器上的一个端口。`kubectl` 子命令 `expose` 可以为你做到这点: + +``` +$ kubectl create deployment \ + my-nginx --image=nginx +$ kubectl expose deployment \ + my-nginx --type=LoadBalancer --port=8080 +``` + +只要你的集群可以从互联网上访问,你就可以通过打开浏览器并导航到你的公共 IP 地址来测试你的新 Web 服务器的可访问性。 + +### 不仅仅是吊舱 + +Kubernetes 提供了很多东西,而不仅仅是存储普通服务的镜像。除了作为一个 [容器编排][8] 系统,它还是一个云开发的平台。你可以编写和部署应用,管理和监控性能和流量,实施智能负载平衡策略等。 + +Kubernetes 是一个强大的系统,它已经迅速成为各种云的基础,最主要的是 [开放混合云][9]。今天就开始学习 Kubernetes 吧。随着你对 Kubernetes 的进一步了解,你会需要一些关于其主要概念和一般语法的快速提醒,所以 [下载我们的 Kubernetes 速查表][10] 并将它放在身边。 + +-------------------------------------------------------------------------------- + +via: https://opensource.com/article/21/5/kubernetes-cheat-sheet + +作者:[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/coverimage_cheat_sheet.png?itok=lYkNKieP (Cheat Sheet cover image) +[2]: https://opensource.com/article/20/6/kubernetes-raspberry-pi +[3]: https://opensource.com/article/18/10/getting-started-minikube +[4]: https://opensource.com/article/19/10/namespaces-and-containers-linux +[5]: https://www.busybox.net/ +[6]: http://hub.docker.com +[7]: http://quay.io +[8]: https://opensource.com/article/20/11/orchestration-vs-automation +[9]: https://opensource.com/article/20/10/keep-cloud-open +[10]: https://opensource.com/downloads/kubernetes-cheat-sheet diff --git a/published/202105/20210510 Make Jenkins logs pretty.md b/published/202105/20210510 Make Jenkins logs pretty.md new file mode 100644 index 0000000000..82859c31e2 --- /dev/null +++ b/published/202105/20210510 Make Jenkins logs pretty.md @@ -0,0 +1,176 @@ +[#]: subject: (Make Jenkins logs pretty) +[#]: via: (https://opensource.com/article/21/5/jenkins-logs) +[#]: author: (Evan "Hippy" Slatis https://opensource.com/users/hippyod) +[#]: collector: (lujun9972) +[#]: translator: (DCOLIVERSUN) +[#]: reviewer: (wxy) +[#]: publisher: (wxy) +[#]: url: (https://linux.cn/article-13392-1.html) + +如何使 Jenkins 日志更可读 +====== + +> Jenkins 的默认日志难以阅读,但日志本不必如此。 + +![](https://img.linux.net.cn/data/attachment/album/202105/15/093017vd34foo00wpy2yot.jpg) + +Jenkins 是一个自由开源的自动化服务器,用于构建、测试和部署代码。它是持续集成Continuous Integration(CI)、持续交付Continuous Delivery(CD)的基础,可以为开发人员每天节约几小时,并保护他们免受失败的代码上线的影响。一旦代码失效或开发人员需要查看测试输出时,[Jenkins][2] 提供了日志文件以供检查。 + +默认的 Jenkins 管道Pipeline日志可能难以阅读。这篇关于 Jenkins 日志的基础知识的总结文章提供了一些技巧(和代码),说明了如何提升它们的可读性。 + +### 你获得什么 + +Jenkins 管道分为 [几个阶段][3]。Jenkins 自动记录每个阶段的开始,记录内容如下: + +``` +[Pipeline] // stage +[Pipeline] stage (hide) +[Pipeline] { (Apply all openshift resources) +[Pipeline] dir +``` + +上文显示的内容没有太大区分度,重要的内容(如阶段的开始)未突出显示。在多达数百行的管道日志中,要找到一个阶段的起始和另外一个阶段的终止位置可能会很艰巨。当随意浏览日志寻找一个特定的阶段的时候,这种艰巨尤其明显。 + +Jenkins 管道是由 [Groovy][4] 和 Shell 脚本混合编写的。在 Groovy 代码中,日志记录很少。很多时候,日志是由命令中的不起眼的文本组成,没有详细信息。在 Shell 脚本中,打开了调试模式(`set -x`),所以每条命令都会被完全具现化realized(变量被解除引用并打印出数值)并详细记录,输出也是如此。 + +鉴于日志可能有很多内容,通读日志获取相关信息可能很繁琐。由于在管道中被处理,并跟着一个 Shell 脚本的 Groovy 日志可读性差,它们很多时候缺少上下文: + +``` +[Pipeline] dir +Running in /home/jenkins/agent/workspace/devop-master/devops-server-pipeline/my-repo-dir/src +[Pipeline] { (hide) +[Pipeline] findFiles +[Pipeline] findFiles +[Pipeline] readYaml +[Pipeline] } +``` + +我可以知道我正在使用的目录,并且知道我正在使用 Jenkins 的步骤搜索文件、读取 YAML 文件。但是我在寻找什么?我找到并读取的内容是什么? + +### 能做什么? + +我很高兴你这么问,因为这里有一些简单的做法和一些小的代码片段可以提供帮助。首先,代码如下: + +``` +def echoBanner(def ... msgs) { + echo createBanner(msgs) +} + +def errorBanner(def ... msgs) { + error(createBanner(msgs)) +} + +def createBanner(def ... msgs) { + return """ + =========================================== + + ${msgFlatten(null, msgs).join("\n ")} + + =========================================== + """ +} + +// flatten function hack included in case Jenkins security +// is set to preclude calling Groovy flatten() static method +// NOTE: works well on all nested collections except a Map +def msgFlatten(def list, def msgs) { + list = list ?: [] + if (!(msgs instanceof String) && !(msgs instanceof GString)) { + msgs.each { msg -> + list = msgFlatten(list, msg) + } + } + else { + list += msgs + } + + return list +} +``` + +将这段代码添加到每个管道的末尾,也可以 [加载一个 Groovy 文件][5] 或者使其成为 [Jenkins 共享库][6] 的一部分,这样更有效。 + +在每个阶段起始处(或者在阶段中的特定位置),只需调用 `echoBanner`: + +``` +echoBanner("MY STAGE", ["DOING SOMETHING 1", "DOING SOMETHING 2"]) +``` + +你的 Jenkins 日志会展示如下: + +``` +    =========================================== + +    MY STAGE +    DOING SOMETHING 1 +    DOING SOMETHING 2 + +    =========================================== +``` + +这个横幅很容易从日志中分辨出来。当正确使用它们时,它们还有助于界定管道流,并且可以很好的将日志分解开来进行阅读。 + +我已经在某些地方专业地使用这些代码一些时间了。在帮助管道日志更易读和流程更易理解方面,反馈是非常积极的。 + +上述的 `errorBanner` 方法以相同的方式工作,但是它会立即使脚本失效。这有助于突显失败的位置与原因。 + +### 最佳实践 + + 1. 在你的 Groovy 代码中大量使用 `echo` Jenkins 步骤来通知用户你在做什么。这些也可以帮助记录你的代码。 + 2. 使用空的日志语句(Groovy 中空的 echo 步骤、`echo ''` 或 Shell 中的 `echo`)来分割输出,提高可读性。你可能在你的代码中为同样的目的使用空行。 + 3. 避免在脚本中使用 `set +x` 的陷阱,因为它隐藏了日志记录已执行的 Shell 语句。它并没有清理你的日志,而是使你的管道成为一个黑盒子,隐藏了管道正在做的行为以及出现的任何错误。确保管道功能尽可能透明。 + 4. 如果你的管道创建了中间工件Intermediate Artifacts,开发人员和 DevOps 人员可以使用这些工件来帮助调试问题,那么也要记录它的内容。是的,它会加长日志,但这只是文本。在某些时候,这会是有用的信息,而(利用得当的)日志不就是关于发生了什么和为什么发生的大量信息吗? + +### Kubernetes 机密信息:无法完全透明的地方 + +有些事情你不希望出现在日志里暴露出来。如果你在使用 Kubernetes 并引用保存在 Kubernetes 机密信息Secrets中的数据,那么你绝对不希望在日志中公开该数据,因为这些数据只是被混淆了,而没有被加密。 + +假如你想获取一些保存在机密信息中的数据,然后将其注入模板化 JSON 文件中。(机密信息和 JSON 模板的完整内容与此例无关。)按照最佳实践,你希望保持透明并记录你的操作,但你不想公开机密信息数据。 + +将脚本模式从调试(`set -x`)更改为命令记录(`set -v`)。在脚本敏感部分的结尾,将 Shell 重置为调试模式: + +``` +sh """ +   # change script mode from debugging to command logging +   set +x -v + +   # capture data from secret in shell variable +   MY_SECRET=\$(kubectl get secret my-secret --no-headers -o 'custom-column=:.data.my-secret-data') + +   # replace template placeholder inline +   sed s/%TEMPLATE_PARAM%/${MY_SECRET_DATA}/ my-template-file.json + +   # do something with modified template-file.json... + +   # reset the shell to debugging mode +   set -x +v +""" +``` + +这将输出此行到日志: + +``` +sed s/%TEMPLATE_PARAM%/${MY_SECRET_DATA}/ my-template-file.json +``` + +与 Shell 调试模式中不同,这不会具现化 Shell 变量 `MY_SECRET_DATA`。显然,如果管道中在这一点出现问题,而你试图找出问题出在哪里,那么这不如调试模式有用。但这是在保持管道执行对开发人员和 DevOps 透明的同时,也保持你的秘密的最佳平衡。 + +-------------------------------------------------------------------------------- + +via: https://opensource.com/article/21/5/jenkins-logs + +作者:[Evan "Hippy" Slatis][a] +选题:[lujun9972][b] +译者:[DCOLIVERSUN](https://github.com/DCOLIVERSUN) +校对:[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/laptop_screen_desk_work_chat_text.png?itok=UXqIDRDD (Person using a laptop) +[2]: https://www.jenkins.io/ +[3]: https://www.jenkins.io/doc/book/pipeline/syntax/#stage +[4]: https://opensource.com/article/20/12/groovy +[5]: https://www.jenkins.io/doc/pipeline/steps/workflow-cps/#load-evaluate-a-groovy-source-file-into-the-pipeline-script +[6]: https://www.jenkins.io/doc/book/pipeline/shared-libraries/ diff --git a/published/202105/20210511 SonoBus- An Open Source Peer-to-Peer Audio Streaming App with Cross-Platform Support.md b/published/202105/20210511 SonoBus- An Open Source Peer-to-Peer Audio Streaming App with Cross-Platform Support.md new file mode 100644 index 0000000000..7616cb6433 --- /dev/null +++ b/published/202105/20210511 SonoBus- An Open Source Peer-to-Peer Audio Streaming App with Cross-Platform Support.md @@ -0,0 +1,104 @@ +[#]: subject: (SonoBus: An Open Source Peer-to-Peer Audio Streaming App with Cross-Platform Support) +[#]: via: (https://itsfoss.com/sonobus/) +[#]: author: (Ankush Das https://itsfoss.com/author/ankush/) +[#]: collector: (lujun9972) +[#]: translator: (geekpi) +[#]: reviewer: (wxy) +[#]: publisher: (wxy) +[#]: url: (https://linux.cn/article-13405-1.html) + +SonoBus:支持跨平台的开源点对点音频流应用 +====== + +![](https://img.linux.net.cn/data/attachment/album/202105/19/122610n5qgu4443jf4nf4k.jpg) + +> 一个有趣的开源点对点音频流应用,它提供了一个简单的用户界面和强大的功能。 + +### SonoBus: 跨平台音频流应用 + +如今,音频流服务在听音乐时非常受欢迎。然而,本地音乐集仍然是一种有用的方式,这不需要一直连接到互联网。 + +尽管流媒体音乐服务很方便,但你并不真正拥有这些音乐。因此,如果出现许可问题,该平台可能会删除你最喜欢的音乐,而你对此无能为力。 + +而有了本地音乐音乐集,你就不会遇到这个问题了。但是,你如何通过设备网络串流你本地的音乐,或者与一个小组分享? + +![][1] + +SonoBus 可以成为解决这个问题的办法。不仅仅限于音乐,还包括任何音频,如与一群朋友远程练习音乐或合作制作音乐,为什么不呢? + +让我们来看看它提供了什么。 + +### SonoBus 的功能 + +![][2] + +SonoBus 使用起来比较简单,但提供的功能可能会让人震惊。因此,在继续使用之前,你可能想先知道它能让你做什么: + + * 能够连接到多个用户 + * 创建一个有可选密码的小组 + * 分享来自你的麦克风的音频输入 + * 分享来自文件的音频流 + * 支持单声道/立体声 + * 组内播放 + * 录制所有人的音频 + * 能够使个别用户或所有人都静音 + * 可以通过互联网或本地网络连接 + * 支持节拍器,用于协作制作音乐或远程练习课程 + * 支持高质量的音频,最高可达 256Kbps + * 输入混音器 + * 支持声相 + * 支持有用的效果器(噪声门、压缩器和均衡器) + * 可在 JACK 和 ALSA 下工作 + * 跨平台支持(Windows、macOS、Android、iOS 和 Linux) + +虽然我试图提到所有的基本功能,但你可以在效果器的帮助下得到非常多的控制,来调整音量、质量、延迟,以及音频效果。 + +![][3] + +它最好的一点是**跨平台支持**,这使它成为任何用户群的有趣选择,而无论你出于什么原因要串流音频。 + +### 在 Linux 中安装 SonoBus + +无论你使用什么 Linux 发行版,你都可以轻松地安装 [Snap 包][4]或 [Flatpak 包][5]。如果你不想使用它们,你可以手动添加官方仓库来安装: + +``` +echo "deb http://pkg.sonobus.net/apt stable main" | sudo tee /etc/apt/sources.list.d/sonobus.list + +sudo wget -O /etc/apt/trusted.gpg.d/sonobus.gpg https://pkg.sonobus.net/apt/keyring.gpg + +sudo apt update && sudo apt install sonobus +``` + +你也可以通过其官方网站为你喜欢的平台下载它。 + +- [SonoBus][6] + +### 总结 + +SonoBus 是一个令人印象深刻的音频流应用,有很多潜在的用途,但它也有一些问题,可能不是每个人的完美解决方案。 + +例如,我注意到桌面应用占用大量的系统资源,所以这对较旧的系统来说可能是个问题。 + +另外,Play Store 上的安卓应用仍处于早期访问阶段(测试版)。在我的快速测试中,它工作符合预期,但我已经很久没有使用它了。因此,当依靠它进行跨平台会话时,可能会出现预期的小问题。 + +在任何情况下,它都适用于每种用例的大量功能。如果你还没有使用过,请试一试。 + +-------------------------------------------------------------------------------- + +via: https://itsfoss.com/sonobus/ + +作者:[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/2021/05/sonobus-screenshot.png?resize=800%2C605&ssl=1 +[2]: https://i0.wp.com/itsfoss.com/wp-content/uploads/2021/05/sonus-screenshot-1.png?resize=800%2C619&ssl=1 +[3]: https://i0.wp.com/itsfoss.com/wp-content/uploads/2021/05/sonobus-official.png?resize=800%2C545&ssl=1 +[4]: https://snapcraft.io/sonobus +[5]: https://flathub.org/apps/details/net.sonobus.SonoBus +[6]: https://sonobus.net/ diff --git a/published/202105/20210512 3 features that debuted in Python 3.0 you should use now.md b/published/202105/20210512 3 features that debuted in Python 3.0 you should use now.md new file mode 100644 index 0000000000..4134f0dbc3 --- /dev/null +++ b/published/202105/20210512 3 features that debuted in Python 3.0 you should use now.md @@ -0,0 +1,191 @@ +[#]: subject: (3 features that debuted in Python 3.0 you should use now) +[#]: via: (https://opensource.com/article/21/5/python-30-features) +[#]: author: (Moshe Zadka https://opensource.com/users/moshez) +[#]: collector: (lujun9972) +[#]: translator: (geekpi) +[#]: reviewer: (wxy) +[#]: publisher: (wxy) +[#]: url: (https://linux.cn/article-13407-1.html) + +3 个值得使用的首次亮相在 Python 3.0 中的特性 +====== + +> 探索一些未被充分利用但仍然有用的 Python 特性。 + +![](https://img.linux.net.cn/data/attachment/album/202105/20/103117me72dllr6lebk1fv.jpg) + +这是 Python 3.x 首发特性系列文章的第一篇。Python 3.0 于 2008 年首次发布,尽管它已经发布了一段时间,但它引入的许多特性都没有被充分利用,而且相当酷。这里有三个你应该知道的。 + +### 仅限关键字参数 + +Python 3.0 首次引入了**仅限关键字参数**参数的概念。在这之前,不可能指定一个只通过关键字传递某些参数的 API。这在有许多参数,其中一些参数可能是可选的函数中很有用。 + +请看一个特意设计的例子: + +``` +def show_arguments(base, extended=None, improved=None, augmented=None): + print("base is", base) + if extended is not None: + print("extended is", extended) + if improved is not None: + print("improved is", improved) + if augmented is not None: + print("augmented is", augmented) +``` + +当阅读调用该函数的代码时,有时很难理解发生了什么: + +``` +show_arguments("hello", "extra") + + base is hello + extended is extra + +show_arguments("hello", None, "extra") + + base is hello + improved is extra +``` + +虽然可以用关键字参数来调用这个函数,但这明显不是最好的方法。相反,你可以将这些参数标记为仅限关键字: + +``` +def show_arguments(base, *, extended=None, improved=None, augmented=None): + print("base is", base) + if extended is not None: + print("extended is", extended) + if improved is not None: + print("improved is", improved) + if augmented is not None: + print("augmented is", augmented) +``` + +现在,你不能用位置参数传入额外的参数: + +``` +show_arguments("hello", "extra") + --------------------------------------------------------------------------- + + TypeError Traceback (most recent call last) + + in + ----> 1 show_arguments("hello", "extra") + + + TypeError: show_arguments() takes 1 positional argument but 2 were given +``` + +对该函数的有效调用更容易预测: + +``` +show_arguments("hello", improved="extra") + base is hello + improved is extra +``` + +### nonlocal + +有时,函数式编程的人根据编写累加器的难易程度来判断一种语言。累加器是一个函数,当它被调用时,返回目前为止发给它的所有参数的总和。 + +在 3.0 之前,Python 的标准答案是: + +``` +class _Accumulator: + def __init__(self): + self._so_far = 0 + def __call__(self, arg): + self._so_far += arg + return self._so_far + +def make_accumulator(): + return _Accumulator() +``` + +虽然我承认有些啰嗦,但这确实有效: + +``` +acc = make_accumulator() +print("1", acc(1)) +print("5", acc(5)) +print("3", acc(3)) +``` + +这样做的输出结果将是: + +``` +1 1 +5 6 +3 9 +``` + +在 Python 3.x 中,`nonlocal` 关键字可以用少得多的代码实现同样的行为。 + + +``` +def make_accumulator(): + so_far = 0 + def accumulate(arg): + nonlocal so_far + so_far += arg + return so_far + return accumulate +``` + +虽然累加器是人为的例子,但使用 `nonlocal` 关键字使内部函数拥有具有状态的的能力是一个强大的工具。 + +### 扩展析构 + +想象一下,你有一个 CSV 文件,每一行由几个元素组成: + + * 第一个元素是年份 + * 第二个元素是月 + * 其他元素是该月发表的全部文章数,每天一个条目 + +请注意,最后一个元素是 _文章总数_,而不是 _每天发表的文章_。例如,一行的开头可以是: + +``` +2021,1,5,8,10 +``` + +这意味着在 2021 年 1 月,第一天发表了 5 篇文章。第二天,又发表了三篇文章,使总数达到 8 篇。第三天,又发表了两篇文章。 + +一个月可以有 28 天、30 天或 31 天。提取月份、日期和文章总数有多难? + +在 3.0 之前的 Python 版本中,你可能会这样写: + +``` +year, month, total = row[0], row[1], row[-1] +``` + +这是正确的,但它掩盖了格式。使用**扩展析构**,同样可以这样表达: + +``` +year, month, *rest, total = row +``` + +这意味着如果该格式改为前缀了一个描述,你可以把代码改成: + +``` +_, year, month, *rest, total = row +``` + +而不需要在每个索引中添加 `1`。 + +### 接下来是什么? + +Python 3.0 和它的后期版本已经推出了 12 年多,但是它的一些功能还没有被充分利用。在本系列的下一篇文章中,我将会写另外三个。 + +-------------------------------------------------------------------------------- + +via: https://opensource.com/article/21/5/python-30-features + +作者:[Moshe Zadka][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/moshez +[b]: https://github.com/lujun9972 +[1]: https://opensource.com/sites/default/files/styles/image-full-size/public/lead-images/python-programming-code-keyboard.png?itok=fxiSpmnd (Hands on a keyboard with a Python book ) \ No newline at end of file diff --git a/published/202105/20210512 4 Linux terminal multiplexers to try.md b/published/202105/20210512 4 Linux terminal multiplexers to try.md new file mode 100644 index 0000000000..107077cb74 --- /dev/null +++ b/published/202105/20210512 4 Linux terminal multiplexers to try.md @@ -0,0 +1,143 @@ +[#]: subject: (4 Linux terminal multiplexers to try) +[#]: via: (https://opensource.com/article/21/5/linux-terminal-multiplexer) +[#]: author: (Seth Kenlon https://opensource.com/users/seth) +[#]: collector: (lujun9972) +[#]: translator: (wxy) +[#]: reviewer: (wxy) +[#]: publisher: (wxy) +[#]: url: (https://linux.cn/article-13420-1.html) + +4 款值得一试的 Linux 终端多路复用器 +====== + +> 比较 tmux、GNU Screen、Konsole 和 Terminator,看看哪个最适合你。 + +![](https://img.linux.net.cn/data/attachment/album/202105/24/205044ez55fdw99alhhgn8.jpg) + +Linux 用户通常需要大量的虚拟视觉空间。一个终端窗口是永远不够的,所以终端有了标签。一个桌面太受限制了,所以有了虚拟桌面。当然,应用程序窗口可以堆叠,但当它们堆叠起来时,又有多大的好处呢?哎呀,即使是后台文本控制台也有 `F1` 到 `F7`,可以在任务之间来回翻转。 + +有了这么多的多任务处理方式,有人发明了终端 *多路复用器* 的概念就不奇怪了。诚然,这是一个令人困惑的术语。在传统的电子学中,“多路复用器multiplexer”是一个接收多个输入信号并将选定的信号转发到单一输出的部件。终端多路复用器的作用正好相反。它从一个输入(人类在键盘上向一个终端窗口打字)接收指令,并将该输入转发给任意数量的输出(例如,一组服务器)。 + +然后,“多路复用器”一词在美国也是一个流行的术语,指的是有许多屏幕的电影院(与“影城cineplex”一词一个意思)。在某种程度上,这很好地描述了终端复用器的作用。它可以在一个框内提供许多屏幕。 + +不管这个词是什么意思,任何尝试过它的人都有自己的喜好的某一种多路复用器。因此,我决定考察一些流行的终端多路复用器,看看每一个都怎么样。就我的评估标准而言,最低限度,我需要每个多路复用器能够分割*和*堆叠终端窗口。 + +### tmux + +![tmux][2] + +据我所知,是从 tmux 开始使用“多路复用器”这个术语的。它工作的很出色。 + +它作为一个守护程序运行,这样即使你关闭了正在查看的终端模拟器,你的终端会话仍然处于活动状态。它将你的终端屏幕分割成多个面板,这样你就可以在每个面板上打开独特的终端提示符。 + +推而广之,这意味着你也可以远程连接到任何数量的系统,并在你的终端中打开它们。利用 tmux 的能力,将输入镜像(或者以电子学术语说是“反向多路复用”)到其他打开的窗格,就能从一个中央命令窗格同时控制几台计算机。 + +tmux 在 GNU Screen 还只能水平分割的时候就有了垂直分割能力,这吸引了追求最大灵活性的粉丝。而灵活性正是用户在 tmux 中得到的。它可以分割、堆叠、选择和提供服务;几乎没有什么是它做不到的。 + +#### 📦 软件包大小 + +从软件包中安装 tmux 大约需要 700K,这还不算它所依赖的十几个共享库。 + +#### 🎛️ 控制键 + +tmux 的默认触发键是 `Ctrl+B`,尽管很容易在其配置文件中重新定义。 + +#### ⌨️ 黑客因子 + +即使你只是在学习如何使用终端,你也一定会觉得使用 tmux 的人很像黑客。它看起来很复杂,但一旦你了解了正确的键绑定,就很容易使用。它为你提供了很多有用的技巧,让你玩的飞起,而且它是一种快速构建 HUD(抬头显示器)的超简单方法,可以把你需要的所有信息摆在你面前。 + +### GNU Screen + +![GNU Screen][4] + +像 tmux 一样,GNU Screen 也运行一个守护程序,所以即使你关闭了用来启动它的终端,你的 shell 仍然可用。你可以从不同的计算机上连接并共享屏幕。它可以将你的终端屏幕分割成水平或垂直的窗格。 + +与 tmux 不同的是,GNU Screen 可以通过串行连接进行连接(`screen 9600 /dev/ttyUSB0` 就可以了),通过按键绑定可以方便地发出 `XON` 和 `XOFF` 信号。 + +与 SSH 会话相比,在串行连接中需要多路复用器的情况可能并不常见,所以大多数用户并不了解 Screen 这个真正特殊的功能。不过,GNU Screen 是一个很棒的多路复用器,有很多有用的选项。而如果你真的需要同时向多个服务器发送信号,还有专门的工具,比如 ClusterSSH 和 [Ansible][5]。 + +#### 📦 软件包大小 + +从软件包中安装 GNU Screen 大约需要 970K,这还不算它所依赖的十几个共享库。 + +#### 🎛️ 控制键 + +GNU Screen 的默认触发键是 `Ctrl+A`,这对于熟悉 Bash 快捷键的人来说可能特别烦人。幸运的是,你可以在配置文件中轻松地重新定义这个触发键。 + +#### ⌨️ 黑客因子 + +当使用 Screen 通过串行连接到你的路由器或你的原型电路板时,你会成为你所有硬件黑客朋友羡慕的对象。 + +### Konsole + +![Konsole][6] + +对于没有标榜自己是多路复用器的 Konsole 来说,令人惊讶的是它也是其中一个。它可以使用 Qt 窗格和标签进行必要的窗口分割和堆叠,但它也可以通过“编辑(将输入复制到)”菜单中的一个选项将输入从一个窗格传到另一个(或全部)。 + +然而,它所最明显缺乏的功能是作为一个守护程序运行以进行远程重新连接的能力。与 tmux 和 GNU Screen 不同,你不能远程连接到运行 Konsole 的机器并加入会话。对于一些管理员来说,这可能不是一个问题。许多管理员用 [VNC][7] 连接到机器的次数比用 [SSH][8] 还要多,所以“重新加入”一个会话就像在 VNC 客户端上点击 Konsole 窗口一样简单。 + +使用 Konsole 作为多路复用器是 KDE 极客们的大招。Konsole 是我使用的第一个 Linux 终端(直到今天,我有时也会按 `Ctrl+N` 来切换新标签),所以有能力使用这个熟悉的终端作为多路复用器是一个很大的便利。这绝不是必要的,因为无论如何 tmux 和 Screen 都可以在 Konsole 里面运行,但是通过让 Konsole 处理窗格,我就不必调整肌肉记忆。这种微妙的功能包容正是 [KDE 的伟大之处][9]。 + +#### 📦 软件包大小 + +Konsole 本身大约是 11KB,但它依赖于 105 个 KDE 和 Qt 库,所以实际上,它至少有 50MB。 + +#### 🎛️ 控制键 + +大多数重要的 Konsole 快捷键以 `Shift+Ctrl` 开始,分割屏幕、打开新标签、复制输入到其他窗格等都是如此。这是 KDE 里的主控台,所以如果你对 Plasma 桌面很熟悉,会感觉快捷键很熟悉。 + +#### ⌨️ 黑客因子 + +使用 Konsole 作为你的多路复用器让你有资格称自己为 KDE 高级用户。 + +### Terminator + +![Terminator][10] + +对于 GNOME 用户来说,Terminator 多路复用器是为他们原本极简的 GNOME 终端增加功能的一个简单方法。除了必要的多路复用功能外,Terminator 还可以向所有打开的窗格广播输入,但和 Konsole 一样,它不会在后台运行以便你可以通过 SSH 重新连接到它。话说回来,由于 GNOME 和 Wayland 让 VNC 变得如此简单,你有可能会觉得没有必要通过 SSH 来恢复终端会话。 + +如果你愿意,Terminator 可以完全由鼠标驱动。Konsole 通过其主菜单也有同样的能力。有了 Terminator,你可以在 Shell 的任何地方点击右键,弹出相关选项,以水平或垂直分割窗口,将窗格分组作为广播目标,广播输入,关闭窗格,等等。你还可以为所有这些动作配置键盘快捷键,所以在许多方面,你可以形成自己的体验。 + +我认为自己主要是一个 KDE 用户,所以当我说 Terminator 感觉像一个 KDE 应用时,我其实是一种极大的赞美。Terminator 是一个令人惊讶的可配置的和灵活的应用程序。在许多方面,它体现了开源的力量,把简陋的 GNOME 终端变成了一个强大的多路复用器。 + +#### 📦 软件包大小 + +Terminator 的安装容量为 2.2MB,其中大部分是 Python 模块。但它依赖于 GTK3 和 GNOME,所以如果你没有运行完整的 GNOME 桌面,可以预料你需要一个更大的安装来拉入这些依赖。 + +#### 🎛️ 控制键 + +Terminator 的默认控制键没有什么一致性。你可以用 `Alt` 键来执行一些命令,用 `Ctrl` 来执行其他命令,还可以用 `Shift+Ctrl`、`Ctrl+Alt`、`Shift+Super` 等等,还有鼠标。话说回来,这是我试过的最可配置的多路复用器之一,所以只要有想法,稍加努力,你就能设计出适合你的模式。 + +#### ⌨️ 黑客因子 + +当你使用 Terminator 时,你会觉得自己是最现代、最务实的黑客。由于它的各种极客选项,它是多路复用的最佳选择,而且由于它非常灵活,无论你的手是在键盘上,还是键盘和鼠标并用,你都可以同样轻松地使用它。 + +### 我全要 + +还有更多的多路复用器和一些具有类似多路复用能力的应用。你不必非要找到*一个*完全按照你想要的方式完成你需要的所有工作的多路复用器。你可以使用不止一个。事实上,你甚至可以同时使用多个,因为 tmux 和 Screen 实际上是 shell,而 Konsole 和 Terminator 是显示 shell 的终端。对唾手可得的工具感到舒适,而且它们能帮助你管理你的工作空间,使你能有效地工作,才是最重要的。 + +去尝试一下多路复用器,或者在你喜欢的应用程序中发现类似多路复用器的功能。它可能会改变你看待计算的方式。 + +-------------------------------------------------------------------------------- + +via: https://opensource.com/article/21/5/linux-terminal-multiplexer + +作者:[Seth Kenlon][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/seth +[b]: https://github.com/lujun9972 +[1]: https://opensource.com/sites/default/files/styles/image-full-size/public/lead-images/freedos.png?itok=aOBLy7Ky (4 different color terminal windows with code) +[2]: https://opensource.com/sites/default/files/uploads/multiplex-tmux.png (tmux) +[3]: https://creativecommons.org/licenses/by-sa/4.0/ +[4]: https://opensource.com/sites/default/files/uploads/multiplex-screen.png (GNU Screen) +[5]: https://opensource.com/article/19/2/quickstart-guide-ansible +[6]: https://opensource.com/sites/default/files/uploads/multiplex-konsole.png (Konsole) +[7]: https://en.wikipedia.org/wiki/Virtual_Network_Computing +[8]: https://en.wikipedia.org/wiki/Secure_Shell_Protocol +[9]: https://opensource.com/article/19/12/linux-kde-plasma +[10]: https://opensource.com/sites/default/files/uploads/multiplex-terminator.png (Terminator) diff --git a/published/202105/20210512 Test Your Typing Speed in Linux Terminal With Ttyper.md b/published/202105/20210512 Test Your Typing Speed in Linux Terminal With Ttyper.md new file mode 100644 index 0000000000..54e0c22dca --- /dev/null +++ b/published/202105/20210512 Test Your Typing Speed in Linux Terminal With Ttyper.md @@ -0,0 +1,140 @@ +[#]: subject: (Test Your Typing Speed in Linux Terminal With Ttyper) +[#]: via: (https://itsfoss.com/ttyper/) +[#]: author: (Abhishek Prakash https://itsfoss.com/author/abhishek/) +[#]: collector: (lujun9972) +[#]: translator: (geekpi) +[#]: reviewer: (wxy) +[#]: publisher: (wxy) +[#]: url: (https://linux.cn/article-13401-1.html) + +用 Ttyper 测试你在 Linux 终端的打字速度 +====== + +![](https://img.linux.net.cn/data/attachment/album/202105/18/092309xnzs2qgey3ss8cmq.jpg) + +有几种方法可以测试和提高你的打字速度。你可以使用在线工具,在桌面上安装专门的应用,或者在 Linux 终端测试。 + +Linux 终端?是的。从 [浏览互联网][1] 到 [玩游戏][2],你可以在强大的 Linux 终端中做 [许多有趣的事情][3]。测试你的打字速度就是其中之一。 + +### Ttyper:基于终端的打字测试工具 + +[Ttyper][4] 是一个用 [Rust][5] 编写的工具,允许你练习打字。 + +它给出了一些最常见的英语单词的随机选择。打出的正确单词用绿色突出显示,错误的用红色突出显示,而且这是实时发生的。你可以按退格键纠正单词,但这将导致分数下降。 + +![][6] + +当你打完所有显示的单词后,你会得到你的打字速度(每分钟字数)、准确率和正确按键数的结果。如果你没有心情打完全部,你可以使用 `Ctrl+C` 退出 Ttyper。 + +![][7] + +你可以在这个由开发者录制的 GIF 中看到 Ttyper 的操作。 + +![][8] + +默认情况下,你有 50 个单词可以练习,但你可以用命令选项来扩大。你还可以使用一个自定义的文本文件,用它的内容来练习打字。 + +命令 | 内容 +---|--- +`ttyper` | 200 个最常见的英语单词中的 50 个 +`ttyper -w 100` | 200 个最常见的英语单词中的 100 个 +`ttyper -w 100 -l english1000` | 1000 个最常见的英语单词中的 100 个 +`ttyper text.txt` | 内容来自用空格分隔的 `test.txt` + +Ttyper 也专注于开发者。它支持几种编程语言,如果你是一个程序员,你可以用它来测试和改进你在编码时的打字速度。 + +![][9] + +截至目前,支持 C、Csharp、Go、HTML、Java、JavaScript、Python、Ruby 和 Rust 语言。 + +你可以通过以下方式改变语言: + +``` +ttyper -l html +``` + +顺便说一下,“Ttyper” 中的双 “T” 不是一个打字错误。它是故意的,因为TTY(**T**ele**TY**pewriter)代表 [终端模拟器][10],表明它是一个终端工具。 + +### 在 Linux 上安装 Ttyper + +Ttyper 是用 Rust 构建的,你可以把它安装在任何支持 Rust 编程语言及其 [Cargo 软件包管理器][13]的 Linux 发行版上。 + +Cargo 相当于 Python 中的 PIP。它有一个[中央仓库][14],你可以用 Cargo 轻松地下载和安装 Rust 包和它的依赖项。 + +我将添加在基于 Ubuntu 的 Linux 发行版上安装 Cargo 的说明。你应该可以用你的[发行版的包管理器][15]来安装它。 + +请确保你在 Ubuntu 上启用了 universe 仓库。你可以用这个命令来安装 Cargo: + +``` +sudo apt install cargo +``` + +它将安装 Cargo 包管理器和 Rust 语言的 `rustc` 包。 + +当你的系统安装了 Cargo,就可以用这个命令来安装 Ttyper: + +``` +cargo install ttyper +``` + +这将在你的主目录下的 `.cargo/bin` 目录中添加一个可执行 Rust 文件。它将在软件包安装输出的最后显示。 + +![][16] + +你可以切换到这个目录: + +``` +cd ~/.cargo/bin +``` + +并运行 `ttyper` 可执行文件: + +``` +./ttyper +``` + +当然,这不是很方便。这就是为什么你应该 [把这个目录添加到 PATH 变量中][17]。如果你熟悉 Linux 的命令行,你可以很容易做到这一点。 + +不幸的是,我不能在这里给你确切的命令,因为你需要提供这个目录的绝对路径,而这个路径名称会根据你的用户名而不同。例如,对我来说,它是 `/home/abhishek/.cargo/bin`。这个绝对路径对你来说会有所不同。 + +我建议阅读 [绝对路径和相对路径][18] 以了解更多关于这个问题的信息。 + +你可以通过删除二进制文件来卸载 Ttyper,或者用 Cargo 命令来卸载: + +``` +cargo uninstall ttyper +``` + +如果你喜欢这个灵巧的终端工具,[在 GitHub 上给它加星][4] 以感谢开发者的努力。 + +正如我在本文开头提到的,你可以在终端做很多很酷的事情。如果你想给你的同事一个惊喜,也许你可以试试 [完全在 Linux 终端中制作幻灯片][12]。 + +-------------------------------------------------------------------------------- + +via: https://itsfoss.com/ttyper/ + +作者:[Abhishek Prakash][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/abhishek/ +[b]: https://github.com/lujun9972 +[1]: https://itsfoss.com/terminal-web-browsers/ +[2]: https://itsfoss.com/best-command-line-games-linux/ +[3]: https://itsfoss.com/funny-linux-commands/ +[4]: https://github.com/max-niederman/ttyper +[5]: https://www.rust-lang.org/ +[6]: https://i0.wp.com/itsfoss.com/wp-content/uploads/2021/05/ttyper-typing-speed-test-linux.png?resize=800%2C441&ssl=1 +[7]: https://i1.wp.com/itsfoss.com/wp-content/uploads/2021/05/ttyper-typing-test-result.png?resize=800%2C547&ssl=1 +[8]: https://i0.wp.com/itsfoss.com/wp-content/uploads/2021/05/ttyper.gif?resize=800%2C498&ssl=1 +[9]: https://i2.wp.com/itsfoss.com/wp-content/uploads/2021/05/ttyper-typing-test-html.png?resize=800%2C441&ssl=1 +[10]: https://itsfoss.com/linux-terminal-emulators/ +[13]: https://doc.rust-lang.org/cargo/index.html +[14]: https://crates.io/ +[15]: https://itsfoss.com/package-manager/ +[16]: https://i1.wp.com/itsfoss.com/wp-content/uploads/2021/05/installing-ttyper-linux.png?resize=800%2C399&ssl=1 +[17]: https://itsfoss.com/add-directory-to-path-linux/ +[18]: https://linuxhandbook.com/absolute-vs-relative-path/ diff --git a/published/202105/20210512 Using Ansible to configure Podman containers.md b/published/202105/20210512 Using Ansible to configure Podman containers.md new file mode 100644 index 0000000000..97d71793f7 --- /dev/null +++ b/published/202105/20210512 Using Ansible to configure Podman containers.md @@ -0,0 +1,235 @@ +[#]: subject: (Using Ansible to configure Podman containers) +[#]: via: (https://fedoramagazine.org/using-ansible-to-configure-podman-containers/) +[#]: author: (mahesh1b https://fedoramagazine.org/author/mahesh1b/) +[#]: collector: (lujun9972) +[#]: translator: (DCOLIVERSUN) +[#]: reviewer: (wxy) +[#]: publisher: (wxy) +[#]: url: (https://linux.cn/article-13396-1.html) + +使用 Ansible 配置 Podman 容器 +====== + +![](https://img.linux.net.cn/data/attachment/album/202105/16/121225oyf5q2sn4fyyeu6z.jpg) + +在复杂的 IT 基础设施中,有许多重复性任务。成功运行这些任务并不容易。运行失败大多数是人为错误引发。在 Ansible 帮助下,你可以通过远程主机来执行所有任务,这些远程主机按照行动手册playbook执行,行动手册可以根据需要重复使用多次。在本文中,你将学习如何在 Fedora Linux 上安装、配置 Ansible,以及如何使用它来管理、配置 Podman 容器。 + +### Ansible + +[Ansible][4] 是一个由红帽赞助的开源基础设施自动化工具。它可以处理大型基础设施带来的所有问题,例如安装和更新软件包、备份、确保特定服务持续运行等等。你用 YAML 写的行动手册来做这些事。Ansible 行动手册可以反复使用,使系统管理员的工作不那么复杂。行动手册减少了重复任务,并且可以轻松修改。但是我们有很多像 Ansible 一样的自动化工具,为什么要用它呢?与其他一些配置管理工具不同,Ansible 是无代理的:你不必在受管节点上安装任何东西。 + +### Podman + +[Podman][6] 是一个开源的容器引擎,用于开发、管理和运行容器镜像。但什么是容器呢?每当你创建任何新应用程序并将其部署在物理服务器、云服务器或虚拟机上时,你面临的最常见问题是可移植性和兼容性。这就是容器出现的原因。容器在操作系统级别上进行虚拟化,因此它们只包含所需的库和应用程序服务。容器的好处包括: + + * 便携性 + * 隔离性 + * 扩展性 + * 轻量级 + * 快速启动 + * 更小的磁盘和内存需求 + +简而言之:当你为任何应用程序构建容器镜像时,所有必需的依赖项都被打包到容器中。你现在可以在任何主机操作系统上运行该容器,没有任何可移植性和兼容性问题。 + +Podman 的关键亮点在于它没有守护程序,因此不需要 root 权限来运行容器。你可以借助 Dockerfile 构建容器镜像,或者从 Docker Hub、[fedoraproject.org][7] 或 [Quay][8] 上拉取镜像。 + +### 为什么用 Ansible 配置 Podman? + +Ansible 提供了一种轻松多次运行重复任务的方法。它还为云提供商(如 AWS、GCP 和 Azure)、容器管理工具(如 Docker 和 Podman)与数据库管理提供了大量模块。Ansible 还有一个社区([Ansible Galaxy][10]),在这里你可以找到大量 Ansible 角色Roles,它们由来自世界各地的贡献者创建。因为这些,Ansible 成为了 DevOps 工程师和系统管理员手中的好工具。 + +借助 DevOps,应用程序的开发步伐很快。开发的应用不局限于任意操作系统,这点至关重要。这就是 Podman 出现的地方。 + +### 安装 Ansible + +首先,安装 Ansible: + +``` +$ sudo dnf install ansible -y +``` + +### 配置 Ansible + +Ansible 需要在受管节点上运行 ssh,所以首先生成一个密钥对Key Pair。 + +``` +$ ssh-keygen +``` + +生成密钥后,将密钥复制到受管节点。 + +输入 `yes`,然后输入受管节点的密码。现在可以远程访问受管主机。 + +为了能够访问受管节点,你需要将所有主机名或 IP 地址存储在清单文件中。默认情况下,这是在 `~/etc/ansible/hosts`。 + +这是库存inventory文件的样子。方括号用于将组分配给某些特定的节点。 + +``` +[group1] +green.example.com +blue.example.com +[group2] +192.168.100.11 +192.168.100.10 +``` + +检查所有受管节点是否可以到达。 + +``` +$ ansible all -m ping +``` + +你可以看到如下输出: + +``` +[mahesh@fedora new] $ ansible all -m ping +fedora.example.com I SUCCESS { + "ansibe_facts": { + "discovered_interpreter_python": "/usr/bin/python" + }, + "changed": false, + "ping": "pong" +} +[mahesh@fedora new] $ +``` + +现在创建你的第一个行动手册playbook,它将在受管节点上安装 Podman。首先用 .yml 拓展名创建一个任意名称的文件。 + +``` +$ vim name_of_playbook.yml +``` + +行动手册应该如下所示。第一个字段是行动手册的名称。主机字段(`hosts`)用于提及清单中提到的主机名或组名。`become: yes` 表示升级权限,以及任务(`tasks`)包含所要执行的任务,这里的名称(`name`)指定任务(`tasks`)名称,`yum` 是安装软件包的模块,下面在名称字段(`name`)指定软件包名称,在状态字段(`state`)指定安装或删除软件包。 + +``` +--- + - name: First playbook +   hosts: fedora.example.com +   become: yes +   tasks: +    - name: Installing podman. +       yum: +         name: podman +         state: present +``` + +检查文件中是否有语法错误: + +``` +$ ansible-playbook filename --syntax-check +``` + +现在运行行动手册: + +``` +$ ansible-playbook filename +``` + +你可以看到如下输出: + +``` +[mahesh@fedora new] $ ansible-playbook podman_installation.yml +PLAY [First playbook] ************************************************************************************************* + +TASK [Gathering Facts] ************************************************************************************************* +0k: [fedora.example.com] + +TASK [Installing podman] ************************************************************************************************ +changed: [fedora.example.com] + +PLAY RECAP ************************************************************************************************* +fedora.example.com : ok=2 changed=1 unreachable=0 failed=0 skipped=0 rescued=0 ignored=0 +[mahesh@fedora new] $ +``` + +现在创建一个新的行动手册,从 Docker Hub 中拉取一个镜像。你将使用 `podman_image` 模块从 Docker Hub 中提取版本号为 2-alpine 的 httpd 镜像。 + +``` +--- + - name: Playbook for podman. + hosts: fedora.example.com + tasks: + - name: Pull httpd:2-alpine image from dockerhub. + podman_image: + name: docker.io/httpd + tag: 2-alpine +``` + +现在检查已拉取的镜像: + +``` +[mahesh@fedora new] $ podman images +REPOSITORY TAG IMAGE ID CREATED SIZE +docker.io/library/httpd 2-alpine fa848876521a 11 days ago 57 MB + +[mahesh@fedora new] $ +``` + +创建一个新的行动手册来运行 httpd 镜像。更多信息请查看 [podman_container][11] 模块文档。 + +``` +--- + - name: Playbook for podman. + hosts: fedora.example.com + tasks: + - name: Running httpd image. + containers.podman.podman_container: + name: my-first-container + image: docker.io/httpd:2-alpine + state: started +``` + +检查容器运行状态。 + +``` +[mahesh@fedora new] $ podman ps +CONTAINER ID IMAGE COMMAND CREATED STATUS PORTS NAMES +45d966eOe207 docker.io/library/httpd:2-alpine httpd-foreground 13 seconds ago Up 13 seconds ago my-first-container + +[mahesh@fedora new] $ +``` + +现在停止已运行的容器,改变状态,由 `started` 变为 `absent`。 + +``` +- name: Stopping httpd container. + containers.podman.podman_container: + name: my-first-container + image: docker.io/httpd:2-alpine + state: absent +``` + +当你执行 `podman ps` 命令时,你看不到任何运行的容器。 + +``` +[mahesh@fedora new] $ podman ps +CONTAINER ID IMAGE COMMAND CREATED STATUS PORTS NAMES + +[mahesh@fedora new] $ +``` + +`podman_container` 可以做很多事情,例如重新创建容器、重新启动容器、检查容器是否正在运行等等。有关执行这些操作的信息,请参考 [文档][11]。 + +-------------------------------------------------------------------------------- + +via: https://fedoramagazine.org/using-ansible-to-configure-podman-containers/ + +作者:[mahesh1b][a] +选题:[lujun9972][b] +译者:[DCOLIVERSUN](https://github.com/DCOLIVERSUN) +校对:[wxy](https://github.com/wxy) + +本文由 [LCTT](https://github.com/LCTT/TranslateProject) 原创编译,[Linux中国](https://linux.cn/) 荣誉推出 + +[a]: https://fedoramagazine.org/author/mahesh1b/ +[b]: https://github.com/lujun9972 +[1]: https://fedoramagazine.org/wp-content/uploads/2021/04/ansible-podman-1-816x345.jpg +[2]: https://unsplash.com/@vnevremeni?utm_source=unsplash&utm_medium=referral&utm_content=creditCopyText +[3]: https://unsplash.com/s/photos/container?utm_source=unsplash&utm_medium=referral&utm_content=creditCopyText +[4]: https://www.ansible.com/ +[5]: https://fedoramagazine.org/tag/ansible/ +[6]: https://podman.io/ +[7]: https://registry.fedoraproject.org/ +[8]: https://www.projectquay.io/ +[9]: https://fedoramagazine.org/tag/podman/ +[10]: https://galaxy.ansible.com/ +[11]: https://docs.ansible.com/ansible/latest/collections/containers/podman/podman_container_module.html diff --git a/published/202105/20210513 3 features released in Python 3.1 you should use in 2021.md b/published/202105/20210513 3 features released in Python 3.1 you should use in 2021.md new file mode 100644 index 0000000000..87a5508583 --- /dev/null +++ b/published/202105/20210513 3 features released in Python 3.1 you should use in 2021.md @@ -0,0 +1,87 @@ +[#]: subject: (3 features released in Python 3.1 you should use in 2021) +[#]: via: (https://opensource.com/article/21/5/python-31-features) +[#]: author: (Moshe Zadka https://opensource.com/users/moshez) +[#]: collector: (lujun9972) +[#]: translator: (geekpi) +[#]: reviewer: (wxy) +[#]: publisher: (wxy) +[#]: url: (https://linux.cn/article-13432-1.html) + +3 个值得使用的在 Python 3.1 中发布的特性 +====== + +> 探索一些未被充分利用但仍然有用的 Python 特性。 + +![](https://img.linux.net.cn/data/attachment/album/202105/27/225101wkeoeqd7bb8ckr8d.jpg) + +这是 Python 3.x 首发特性系列文章的第二篇。Python 3.1 于 2009 年首次发布,尽管它已经发布了很长时间,但它引入的许多特性都没有被充分利用,而且相当酷。下面是其中的三个。 + +### 千位数格式化 + +在格式化大数时,通常是每三位数放置逗号,使数字更易读(例如,1,048,576 比 1048576 更容易读)。从 Python 3.1 开始,可以在使用字符串格式化函数时直接完成: + +``` +"2 to the 20th power is {:,d}".format(2**20) +``` + +``` +'2 to the 20th power is 1,048,576' +``` + +`,d` 格式符表示数字必须用逗号格式化。 + +### Counter 类 + +`collections.Counter` 类是标准库模块 `collections` 的一部分,是 Python 中的一个秘密超级武器。它经常在 Python 的面试题的简单解答中首次遇到,但它的价值并不限于此。 + +例如,在 [Humpty Dumpty 的歌][2] 的前八行中找出五个最常见的字母: + +``` +hd_song = """ +In winter, when the fields are white, +I sing this song for your delight. + +In Spring, when woods are getting green, +I'll try and tell you what I mean. + +In Summer, when the days are long, +Perhaps you'll understand the song. + +In Autumn, when the leaves are brown, +Take pen and ink, and write it down. +""" +``` + +``` +import collections + +collections.Counter(hd_song.lower().replace(' ', '')).most_common(5) +``` + +``` +[('e', 29), ('n', 27), ('i', 18), ('t', 18), ('r', 15)] +``` + +### 执行软件包 + +Python 允许使用 `-m` 标志来从命令行执行模块。甚至一些标准库模块在被执行时也会做一些有用的事情;例如,`python -m cgi` 是一个 CGI 脚本,用来调试网络服务器的 CGI 配置。 + +然而,直到 Python 3.1,都不可能像这样执行 _软件包_。从 Python 3.1 开始,`python -m package` 将执行软件包中的 `__main__` 模块。这是一个放调试脚本或命令的好地方,这些脚本主要是用工具执行的,不需要很短。 + +Python 3.0 在 11 年前就已经发布了,但是在这个版本中首次出现的一些功能是很酷的,而且没有得到充分利用。如果你还没使用,那么将它们添加到你的工具箱中。 + +-------------------------------------------------------------------------------- + +via: https://opensource.com/article/21/5/python-31-features + +作者:[Moshe Zadka][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/moshez +[b]: https://github.com/lujun9972 +[1]: https://opensource.com/sites/default/files/styles/image-full-size/public/lead-images/python_programming_question.png?itok=cOeJW-8r (Python programming language logo with question marks) +[2]: http://www2.open.ac.uk/openlearn/poetryprescription/humpty-dumptys-recitation.html diff --git a/published/202105/20210513 5 reasons to host your container registry with Pulp.md b/published/202105/20210513 5 reasons to host your container registry with Pulp.md new file mode 100644 index 0000000000..47f0158018 --- /dev/null +++ b/published/202105/20210513 5 reasons to host your container registry with Pulp.md @@ -0,0 +1,84 @@ +[#]: subject: (5 reasons to host your container registry with Pulp) +[#]: via: (https://opensource.com/article/21/5/container-management-pulp) +[#]: author: (Melanie Corr https://opensource.com/users/melanie-corr) +[#]: collector: (lujun9972) +[#]: translator: (geekpi) +[#]: reviewer: (wxy) +[#]: publisher: (wxy) +[#]: url: (https://linux.cn/article-13410-1.html) + +用 Pulp 托管你的容器注册中心的 5 个理由 +====== + +> 有很多令人信服的理由来用 Pulp 来托管你自己的容器注册中心。下面是其中的一些。 + +![](https://img.linux.net.cn/data/attachment/album/202105/21/091220vpckb2yywo2eq12y.jpg) + +Linux 容器极大地简化了软件发布。将一个应用程序与它运行所需的一切打包的能力有助于提高环境的稳定性和可重复性。 + +虽然有许多公共注册中心可以上传、管理和分发容器镜像,但有许多令人信服的论据支持托管自己的容器注册中心。让我们来看看为什么自我托管是有意义的,以及 [Pulp][2],一个自由开源项目,如何帮助你在企业内部环境中管理和分发容器。 + +### 为什么要托管你自己的容器注册中心 + +你可以考虑托管自己的容器注册中心,原因有很多: + + * **体积**:一些容器镜像是相当大的。如果你有多个团队下载同一个镜像,这可能需要大量的时间,并给你的网络和预算带来压力。 + * **带宽**:如果你在一个带宽有限的地区工作,或在一个出于安全原因限制访问互联网的组织中工作,你需要一个可靠的方法来管理你工作的容器。 + * **金钱**:服务条款可以改变。外部容器注册中心能引入或增加速率限制阈值,这可能会对你的操作造成极大的限制。 + * **稳定性**:托管在外部资源上的容器镜像可能会因为一些原因消失几天。小到你所依赖的更新容器镜像,可能会导致你想要避免的重大更改。 + * **隐私**:你可能也想开发和分发容器,但你不想在公共的第三方注册中心托管。 + +### 使用 Pulp 进行自我托管 + +使用 Pulp,你可以避免这些问题并完全控制你的容器。 + +#### 1、避免速率限制 + +在 Pulp 中创建容器镜像的本地缓存,可以让你组织中的每个人都能拉取到 Pulp 上托管的容器镜像,而不是从外部注册中心拉取。这意味着你可以避免速率限制,只有当你需要新的东西时才从外部注册中心进行同步。当你确实需要从外部注册中心同步容器时,Pulp 首先检查内容是否已经存在,然后再从远程注册中心启动同步。如果你受到注册中心的速率限制,你就只镜像你需要的内容,然后用 Pulp 在整个组织中分发它。 + +#### 2、整理你的容器 + +使用 Pulp,你可以创建一个仓库,然后从任何与 Docker Registry HTTP API V2 兼容的注册中心镜像和同步容器。这包括 Docker、Google Container registry、Quay.io 等,也包括另一个 Pulp 服务器。对于你结合来自不同注册中心的镜像容器的方式,没有任何限制或约束。你可以自由地混合来自不同来源的容器。这允许你整理一套公共和私人容器,以满足你的确切要求。 + +#### 3、无风险的实验 + +在 Pulp 中,每当你对仓库进行修改时,就会创建一个新的不可变的版本。你可以创建多个版本的仓库,例如,development、test、stage 和 production,并在它们之间推送容器。你可以自由地将容器镜像的最新更新从外部注册中心同步到 Pulp,然后让最新的变化在开发或其他环境中可用。你可以对你认为必要的仓库进行任何修改,并促进容器内容被测试团队或其他环境使用。如果出了问题,你可以回滚到早期版本。 + +#### 4、只同步你需要的内容 + +如果你想使用 Pulp 来创建一个容器子集的本地缓存,而不是一个完整的容器注册中心,你可以从一个远程源过滤选择容器。使用 Pulp,有多种内容同步选项,以便你只存储你需要的内容,或配置你的部署,按需缓存内容。 + +#### 5、在断线和空气隔离的环境中工作 + +如果你在一个断线或受限制的环境中工作,你可以从一个连接的 Pulp 实例中同步更新到你断连的 Pulp。目前,有计划为 Pulp 实现一个原生的空气隔离功能,以促进完全断线的工作流程。同时,作为一种变通方法,你可以使用 [Skopeo][3] 等工具来下载你需要的容器镜像,然后将它们推送到你断线的 Pulp 容器注册中心。 + +#### 还有更多! + +通过 Pulp,你还可以从容器文件中构建容器,将私有容器推送到仓库,并在整个组织中分发这些容器。我们将在未来的文章中对这个工作流程进行介绍。 + +### 如何开始 + +如果你对自我托管你的容器注册中心感兴趣,你现在就可以 [安装 Pulp][4]。随着 Pulp Ansible 安装程序的加入,安装过程已经被大量自动化和简化了。 + +Pulp 有一个基于插件的架构。当你安装 Pulp 时,选择容器插件和其他任何你想管理的内容插件类型。如果你想测试一下 Pulp,你今天就可以评估 Pulp 的容器化版本。 + +如果你有任何问题或意见,请随时在 Freenode IRC 的 #pulp 频道与我们联系,我们也很乐意在我们的邮件列表 [pulp-list@redhat.com][5] 中接受问题。 + +-------------------------------------------------------------------------------- + +via: https://opensource.com/article/21/5/container-management-pulp + +作者:[Melanie Corr][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/melanie-corr +[b]: https://github.com/lujun9972 +[1]: https://opensource.com/sites/default/files/styles/image-full-size/public/lead-images/containers_2015-2-osdc-lead.png?itok=kAfHrBoy (Containers for shipping overseas) +[2]: https://pulpproject.org/ +[3]: https://github.com/containers/skopeo +[4]: https://pulpproject.org/installation-introduction/ +[5]: mailto:pulp-list@redhat.com diff --git a/published/202105/20210514 3 Python 3.2 features that are still relevant today.md b/published/202105/20210514 3 Python 3.2 features that are still relevant today.md new file mode 100644 index 0000000000..1d986bb788 --- /dev/null +++ b/published/202105/20210514 3 Python 3.2 features that are still relevant today.md @@ -0,0 +1,188 @@ +[#]: subject: (3 Python 3.2 features that are still relevant today) +[#]: via: (https://opensource.com/article/21/5/python-32) +[#]: author: (Moshe Zadka https://opensource.com/users/moshez) +[#]: collector: (lujun9972) +[#]: translator: (geekpi) +[#]: reviewer: (wxy) +[#]: publisher: (wxy) +[#]: url: (https://linux.cn/article-13435-1.html) + +3 个到今天仍然有用的 Python 3.2 特性 +====== + +> 探索一些未被充分利用但仍然有用的 Python 特性。 + +![](https://img.linux.net.cn/data/attachment/album/202105/28/202023pz86mg88r18o6e22.jpg) + +这是Python 3.x 首发特性系列文章中的第三篇。其中一些 Python 版本已经推出了一段时间。例如,Python 3.2 是在 2011 年首次发布的,但其中引入的一些很酷、很有用的特性仍然没有被使用。下面是其中的三个。 + +### argparse 子命令 + +`argparse` 模块首次出现在 Python 3.2 中。有许多用于命令行解析的第三方模块。但是内置的 `argparse` 模块比许多人认为的要强大。 + +要记录所有的 `argparse` 的特性,那需要专门写系列文章。下面是一个例子,说明如何用 `argparse` 做子命令。 + +想象一下,一个命令有两个子命令:`negate`,需要一个参数,`multiply`,需要两个参数: + +``` +$ computebot negate 5 +-5 +$ computebot multiply 2 3 +6 +``` + +``` +import argparse + +parser = argparse.ArgumentParser() +subparsers = parser.add_subparsers() +``` + +`add_subparsers()` 方法创建一个对象,你可以向其添加子命令。唯一需要记住的技巧是,你需要添加通过 `set_defaults()` 调用的子命令: + +``` +negate = subparsers.add_parser("negate") +negate.set_defaults(subcommand="negate") +negate.add_argument("number", type=float) +``` + +``` +multiply = subparsers.add_parser("multiply") +multiply.set_defaults(subcommand="multiply") +multiply.add_argument("number1", type=float) +multiply.add_argument("number2", type=float) +``` + +我最喜欢的一个 `argparse` 功能是,因为它把解析和运行分开,测试解析逻辑特别令人愉快。 + +``` +parser.parse_args(["negate", "5"]) +``` + +``` + Namespace(number=5.0, subcommand='negate') +``` + +``` +parser.parse_args(["multiply", "2", "3"]) +``` + +``` + Namespace(number1=2.0, number2=3.0, subcommand='multiply') +``` + +### contextlib.contextmanager + +上下文是 Python 中一个强大的工具。虽然很多人 _使用_ 它们,但编写一个新的上下文常常看起来像一门黑暗艺术。有了 `contextmanager` 装饰器,你所需要的只是一个一次性的生成器。 + +编写一个打印出做某事所需时间的上下文,就像这样简单: + +``` +import contextlib, timeit + +@contextlib.contextmanager +def timer(): + before = timeit.default_timer() + try: + yield + finally: + after = timeit.default_timer() + print("took", after - before) +``` +你可以这样使用: + + +``` +import time + +with timer(): + time.sleep(10.5) +``` + +``` + took 10.511025413870811` +``` + +### functools.lru_cache + +有时,在内存中缓存一个函数的结果是有意义的。例如,想象一下经典的问题:“有多少种方法可以用 25 美分、1 美分、2 美分和 3 美分可以来换取 1 美元?” + +这个问题的代码可以说是非常简单: + +``` +def change_for_a_dollar(): + def change_for(amount, coins): + if amount == 0: + return 1 + if amount < 0 or len(coins) == 0: + return 0 + some_coin = next(iter(coins)) + return ( + change_for(amount, coins - set([some_coin])) + + + change_for(amount - some_coin, coins) + ) + return change_for(100, frozenset([25, 10, 5, 1])) +``` + +在我的电脑上,这需要 13ms 左右: + +``` +with timer(): + change_for_a_dollar() +``` + +``` + took 0.013737603090703487` +``` + +事实证明,当你计算有多少种方法可以做一些事情,比如用 50 美分找钱,你会重复使用相同的硬币。你可以使用 `lru_cache` 来避免重复计算。 + +``` +import functools + +def change_for_a_dollar(): + @functools.lru_cache + def change_for(amount, coins): + if amount == 0: + return 1 + if amount < 0 or len(coins) == 0: + return 0 + some_coin = next(iter(coins)) + return ( + change_for(amount, coins - set([some_coin])) + + + change_for(amount - some_coin, coins) + ) + return change_for(100, frozenset([25, 10, 5, 1])) +``` + +``` +with timer(): + change_for_a_dollar() +``` + +``` + took 0.004180959425866604` +``` + +一行的代价是三倍的改进。不错。 + +### 欢迎来到 2011 年 + +尽管 Python 3.2 是在 10 年前发布的,但它的许多特性仍然很酷,而且没有得到充分利用。如果你还没使用,那么将他们添加到你的工具箱中。 + +-------------------------------------------------------------------------------- + +via: https://opensource.com/article/21/5/python-32 + +作者:[Moshe Zadka][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/moshez +[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) \ No newline at end of file diff --git a/published/202105/20210514 Drop Autotools for CMake.md b/published/202105/20210514 Drop Autotools for CMake.md new file mode 100644 index 0000000000..992ec57659 --- /dev/null +++ b/published/202105/20210514 Drop Autotools for CMake.md @@ -0,0 +1,288 @@ +[#]: subject: "Drop Autotools for CMake" +[#]: via: "https://opensource.com/article/21/5/cmake" +[#]: author: "Seth Kenlon https://opensource.com/users/seth" +[#]: collector: "lujun9972" +[#]: translator: "amwps290" +[#]: reviewer: "wxy" +[#]: publisher: "wxy" +[#]: url: "https://linux.cn/article-13419-1.html" + +抛弃 Autotools 向 CMake 迈进吧 +====== + +> CMake 是一个跨平台的编译、测试和打包软件,即使你以前从来没有使用过构建系统,也可以轻松上手。 + +![](https://img.linux.net.cn/data/attachment/album/202105/24/183520grnp3821rmmpg1ug.jpg) + +在我以前的文章 [Autotools 入门][2] 一文中,我说明了如何使用 Autotools 来管理和打包代码。这是一个强大且通用的平台,可轻松集成到许多打包系统中,包括 RPM、APT、[pkgsrc][3] 等等。它的语法和结构可能会令人困惑,但幸运的是,我们还有其他选择,开源的 [CMake][4] 就是其中一个。 + +CMake 是一个用于构建、测试和打包软件的跨平台套件。它使用简单而清晰的语法,因此即使你以前从未使用过构建系统,也很容易开始使用。 + +### 安装 CMake + +CMake 可能已经安装在你的 Linux 系统上。如果没有,你可以使用发行版的程序包管理器进行安装: + +``` +$ sudo dnf install cmake +``` + +在 Debian 或者其他相似的系统上: + +``` +$ sudo apt install cmake +``` + +在 Mac 上,你可以使用 [MacPorts][5] 或者 [Homebrew][6] 来安装: + +``` +$ sudo port install cmake +``` + +在 Windows 上,你可以使用 [Chocolatey][7] 或者直接从 [CMake 网站][8] 下载二进制来安装。 + +### 使用 CMake + +对于想要从源代码构建软件的开发人员或用户来说,CMake 是一种快速简便的编译和安装方法。 CMake 分阶段工作: + +1. 首先,在 `cmake` 步骤中,CMake 扫描计算机查看一些默认设置。默认设置包括库的位置以及在系统上安装软件的位置。 +2. 接下来,使用系统上的 `make` 命令(在 Linux 上是 GUN Make,在 [NetBSD][9] 上是 NetBSD Make)来编译程序。这个过程通常是将人类可读的源代码转换成机器语言。 +3. 最后,在 `make install` 一步中,那些编译过的文件将被拷贝到(在 `cmake` 步骤中扫描出来的)计算机上合适的位置。 + +这看起来很简单,当你使用 CMake 时就是这样。 + +### CMake 的可移植性 + +CMake 在设计时就考虑了可移植性。虽然它不能使你的项目在所有 POSIX 平台上都能正常工作(这取决于作为开发者的你),但它可以确保将标记为要安装的文件安装到已知平台上最合适的位置。而且由于有了 CMake 之类的工具,对于高级用户而言,根据其系统需求自定义和覆盖任何不合适的选项都很容易。 + +使用 CMake,你只需要知道将哪些文件安装到哪个常规位置即可。它会照顾其他一切。不再需要自定义安装脚本,它们有可能在任何未经测试的操作系统上失败。 + +### 打包 + +像 Autotools 一样,CMake 也得到了很好的打包支持。无论它们是打包成 RPM 还是 DEB 或 TGZ(或其他任何东西),将带有 CMake 的项目交给打包者,他们的工作既简单又直接。打包工具支持 CMake,因此可能不需要进行任何修补或者调整。在许多情况下,可以自动将 CMake 项目整合到工作流中。 + +### 如何使用 CMake + +要在项目中使用 CMake,只需在项目目录中创建 `CMakeLists.txt` 文件。首先,声明最低要求的 CMake 版本以及项目名称和版本。CMake 会努力在尽可能长时间内保持兼容性,但是随着你使用的时间越长,并且关注它最新的开发动态,你就会知道哪些特性是你所依赖的。 + +``` +cmake_minimum_required(VERSION 3.10) + +project(Hello VERSION 1.0) +``` + +如你可能已经看到的那样,CMake 的语法是一个带有括号和参数的命令。大写的 `VERSION` 字符串不是任意的,也不只是格式。它们是 `project` 命令中的有效参数。 + +在继续之前,先写一个简单的 C 或者 C++ 的 `hello world` 程序。为了简单,我就写了六行 C 代码,并把它保存在 `hello.c` 中(为了匹配我在 `CMakeLists.txt` 中可执行文件的名字)。 + +``` +#include + +int main() { +   printf("Hello open source\n"); +   return 0; +} +``` + +不过,不要搞错了,CMake 不仅适用于 C 和 C++。它可以处理任意文件,并且有许多可用的命令,因此它可以帮助你维护许多不同形式的项目。 + +CMake 网站中记录了所有有效的内置命令及其可用参数,因此无论你要做什么,都可以轻松发现所需的功能。不过,这是一个简单的示例,因此,你需要的下一个命令是必不可少的 —— 你必须为 CMake 定义要构建的代码: + +``` +add_executable(Hello hello.c) +``` + +这个命令指定了你编译后的二进制文件的名字为 `Hello`。因此,它与你在终端中执行带有 `-o Hello` 的 `gcc` 命令是一样的。 + +在一些比较复杂的项目中,你可能还需要使用库文件,你可以使用 `add library` 命令来链接库文件。 + +在你设置了你想要构建和标记为安装的文件之后,你必须要告诉 CMake 一旦用户安装了程序,最终的应用程序应该在哪个位置。 + +在这个简单的例子里,你仅需要做的一件事就是在你的 `CMakeLists.txt` 文件里添加 `install` 命令。`install` 命令接受几个参数。但是在这个例子中,你仅需要使用 `TARGET` 命令来指定你要安装文件的名字。 + +``` +install(TARGETS Hello) +``` + +### 向 CMake 工程添加一些文件 + +一个软件项目向用户交付的往往不仅仅只有代码,还有一些其他的文件数据,例如手册或者是信息页、示例项目,或者是配置文件。你可以使用与包含编译文件时类似的工作流程,将任意数据包含在 CMake 项目中:在 `CMakelists.txt` 文件中使用 `file` 命令,然后说明一下这些文件要安装在哪里。 + +例如,你可以在这个项目中包含一个 `assets` 目录,你可以使用 `file` 命令,后面跟上 `COPY` 和 `DESTINATION` 参数来告诉 CMake 将这些额外的文件复制到你的分发包中。 + +``` +file(COPY assets DESTINATION "${CMAKE_CURRENT_BINARY_DIR}") +``` + +这个 `${CMAKE_CURRENT_BINARY_DIR}` 变量是一个特殊的 CMake 内置变量,表示 CMake 正在处理的目录。换句话说,你的任何文件都会被复制到编译目录(在你运行 `cmake` 命令后,这个过程会更加清晰,到时候回过头来看一下)。 + +因为这些额外的数据文件有些杂乱不堪(如果你不信的话,可以看一下 `/usr/share` 这个目录)。对于你自己的项目创建一个子文件夹对谁都有好处。最好也带上版本名字。你可以通过在 `CMAKE_CURRENT_BINARY_DIR` 中指定一个新的目录,使用你选择的项目名称,后面跟一个为你的项目命名的特殊变量和你在项目声明中为它设置的 `VERSION`。 + +``` +file(COPY assets DESTINATION "${CMAKE_CURRENT_BINARY_DIR}/Hello-${Hello_VERSION}") +``` + +### 定义安装位置 + +你已经定义你要编译的文件,因此现在你要告诉 CMake 你的程序要安装在哪个位置。比如你的主程序,这个要程使用 `install` 命令: + +``` +install(DIRECTORY "${CMAKE_CURRENT_BINARY_DIR}/Hello-${Hello_VERSION}" TYPE DATA) +``` + +这里有一些新的参数。`DIRECTORY` 参数指定了数据文件是一个目录,而不是一个文件(`FILE`)或者脚本(`SCRIPT`)。你使用的参数和复制一些额外文件到编译目录时是一样。另外,在 `install` 命令中 `TYPE` 或者 `DESTINATION` 必须要指定其一。`TYPE` 参数指定了通用的文件类型,这些文件通常将会被放到合适的位置。在 Linux 系统上,`TYPE DATA` 一般是 `/usr/local/share` 或者 `/usr/share`,除非用户定义了其他的位置。 + +这是诸如 CMake 之类的良好构建系统的强大功能之一。你不必担心文件的确切位置,因为你知道用户可以更改 CMake 的首选默认设置,并且 CMake 将构建代码以使其正常工作。 + +### 运行 CMake + +CMake 有多种方式来让你执行命令,你可以在终端或者在一个可交互的程序上执行命令,或者你也可以使用它的图形界面(GUI)。我比较偏向于使用终端命令,但是我也喜欢使用一些其他的方式(相比与在 `Makefile` 中查找那些晦涩的变量然后去修改它们更胜一筹)。 + +对于编译过开源 C++ 项目的任何人,都熟悉的第一步是创建一个 `build` 目录,进入到该目录,然后运行 `cmake ..` 命令。 我是一个懒惰的打字员,所以我将构建目录命名为 `b`,但是你可以使用最合适的方式: + +``` +$ mkdir b +$ cd b +$ cmake .. +-- The C compiler identification is GNU 11.1.1 +-- The CXX compiler identification is GNU 11.1.1 +-- Detecting C compiler ABI info +-- Detecting C compiler ABI info - done +-- Check for working C compiler: /usr/bin/cc - skipped +-- Detecting C compile features +-- Detecting C compile features - done +-- Detecting CXX compiler ABI info +-- Detecting CXX compiler ABI info - done +-- Check for working CXX compiler: /usr/bin/c++ - skipped +-- Detecting CXX compile features +-- Detecting CXX compile features - done +-- Configuring done +-- Generating done +-- Build files have been written to: /var/home/seth/demo-hello/b +$ +``` + +这或多或少相当于经典的 `./configure; make; make install` 中的 `./configure`。看一下你的构建目录,CMake 已经帮你生成了几个新的文件,来让你的项目更完整。这里生成了 CMake 的数据文件、一个常规的 `Makefile` 文件(这是一个免费提供的 247 行的文件,但对于越复杂的项目,行数要多得多),还有一个包含这个示例程序的任意非编译数据的 `Hello-1.0` 目录。 + +``` +$ ls +CMakeCache.txt +CMakeFiles +Makefile +Hello-1.0 +cmake_install.cmake +``` + +接下来,你可以进行构建。你可以使用 CMake 的 `--build` 选项来做这件事,使用当前的构建目录作为源目录。 + +``` +$ cmake --build . +Scanning dependencies of target Hello +[ 50%] Building C object CMakeFiles/Hello.dir/hello.c.o +[100%] Linking C executable Hello +[100%] Built target Hello +``` + +或者你可以运行 `make` 命令。这将读取由 CMake 生成的 `Makefile` 文件。在这个例子中,`make` 默认的行为就是由源程序 `hello.c` 生成目标文件。 + +``` +$ make +Scanning dependencies of target Hello +[ 50%] Building C object CMakeFiles/Hello.dir/hello.c.o +[100%] Linking C executable Hello +[100%] Built target Hello +$ +``` + +如你所料,`Hello` 二进制可执行文件现在存在于当前的构建目录中。因为它是一个简单的自包含应用程序,所以你可以运行它进行测试: + +``` +$ ./Hello +Hello open source +$ +``` + +最后,你可以用 `--install` 选项进行安装。因为我不希望我的简单的 “hello world” 应用程序真的被安装到我的系统上,我设置了 `--prefix` 选项,将 CMake 的目标从根目录(`/`)重定向到 `/tmp` 的一个子目录。 + +``` +$ cmake --install . --prefix /tmp/hello/ +-- Install configuration: "" +-- Installing: /tmp/dist-hello/usr/local/bin/Hello +-- Installing: /tmp/dist-hello/usr/local/share/Hello-1.0 +-- Installing: /tmp/dist-hello/usr/local/share/Hello-1.0/assets/file0 +-- Installing: /tmp/dist-hello/usr/local/share/Hello-1.0/assets/file1 +``` + +另外,你也可以运行 `make install` 来调用 `Makefile` 的安装动作。同样,为了避免在我的系统上安装一个演示程序,我在这个例子中设置了 `DESTDIR` 变量,将安装目标重定向到 `/tmp` 的一个子目录: + +``` +$ mkdir /tmp/dist-hello +$ make install DESTDIR=/tmp/dist-hello +[100%] Built target Hello +Install the project... +-- Install configuration: "" +-- Installing: /tmp/dist-hello/usr/local/bin/Hello +-- Installing: /tmp/dist-hello/usr/local/share/Hello-1.0 +-- Installing: /tmp/dist-hello/usr/local/share/Hello-1.0/assets/file0 +-- Installing: /tmp/dist-hello/usr/local/share/Hello-1.0/assets/file1 +``` + +看一下输出的内容,来确定它具体的安装位置,这个程序已经安装好了。 + +### 快速自定义 + +CMake 的安装前缀(由 `CMAKE_INSTALL_PREFIX` 变量指定)默认是在 `/usr/local` 这个位置,但是所有的 CMake 变量都可以在你运行 `cmake` 命令的时候,加一个 `-D` 选项来改变它。 + +``` +$ cmake -DCMAKE_INSTALL_PREFIX=/usr .. +$ make install DESTDIR=/tmp/dist-hello +$ make install DESTDIR=/tmp/dist-hello +[100%] Built target Hello +Install the project... +-- Install configuration: "" +-- Installing: /tmp/dist-hello/usr/bin/Hello +-- Installing: /tmp/dist-hello/usr/share/Hello-1.0 +-- Installing: /tmp/dist-hello/usr/share/Hello-1.0/assets/file0 +-- Installing: /tmp/dist-hello/usr/share/Hello-1.0/assets/file1 +``` + +所有由 CMake 使用的变量都可以通过这种方式来修改。 + +### 交互式的 CMake + +CMake 的交互模式是一种用于配置安装环境的友好而有用的方法。要让用户知道该项目使用的所有可能的 CMake 变量是一件工作量很大的事,因此 CMake 交互式界面是他们无需查看 `Makefile` 和 `CMakeLists` 即可发现自定义选项的简便方法。 + +为了调用这个交互式的 CMake,使用 `ccmake` 命令,在这个简单的项目里没有太多的东西。但是对于像 [Rosegarden][11] 这样的大型项目,这将非常有用。 + +![Rosegarden][12] + +### CMake 的更多知识 + +还有很多很多的 CMake 知识需要去了解。作为一个开发者,我非常喜欢它简洁的语法、详尽的文档、可扩展性以及便捷性。作为一个用户我非常喜欢 CMake 友好且实用的错误提示信息还有它的用户界面,如果你的项目还未开始使用构建系统,请了解一下 CMake 吧。你以及以后尝试打包你应用程序的任何人都不会后悔。 + +-------------------------------------------------------------------------------- + +via: https://opensource.com/article/21/5/cmake + +作者:[Seth Kenlon][a] +选题:[lujun9972][b] +译者:[amwps290](https://github.com/amwps290) +校对:[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/build_structure_tech_program_code_construction.png?itok=nVsiLuag "Someone wearing a hardhat and carrying code " +[2]: https://opensource.com/article/19/7/introduction-gnu-autotools +[3]: https://opensource.com/article/19/11/pkgsrc-netbsd-linux +[4]: http://cmake.org +[5]: https://opensource.com/article/20/11/macports +[6]: https://opensource.com/article/20/6/homebrew-linux +[7]: https://opensource.com/article/20/3/chocolatey +[8]: https://cmake.org/download +[9]: https://opensource.com/article/19/3/netbsd-raspberry-pi +[10]: http://www.opengroup.org/onlinepubs/009695399/functions/printf.html +[11]: https://opensource.com/article/18/3/make-sweet-music-digital-audio-workstation-rosegarden +[12]: https://opensource.com/sites/default/files/uploads/rosegarden-ccmake.jpg "Rosegarden" +[13]: https://creativecommons.org/licenses/by-sa/4.0/ +[14]: https://cmake.org/cmake/help/latest/ diff --git a/published/202105/20210515 What Python 3.3 did to improve exception handling in your code.md b/published/202105/20210515 What Python 3.3 did to improve exception handling in your code.md new file mode 100644 index 0000000000..0e22667170 --- /dev/null +++ b/published/202105/20210515 What Python 3.3 did to improve exception handling in your code.md @@ -0,0 +1,191 @@ +[#]: subject: (What Python 3.3 did to improve exception handling in your code) +[#]: via: (https://opensource.com/article/21/5/python-33) +[#]: author: (Moshe Zadka https://opensource.com/users/moshez) +[#]: collector: (lujun9972) +[#]: translator: (wxy) +[#]: reviewer: (wxy) +[#]: publisher: (wxy) +[#]: url: (https://linux.cn/article-13439-1.html) + +Python 3.3 为改进代码中的异常处理所做的工作 +====== + +> 探索异常处理和其他未被充分利用但仍然有用的 Python 特性。 + +![](https://img.linux.net.cn/data/attachment/album/202105/29/221357mxpj2kitltdez6zj.jpg) + +这是 Python 3.x 首发特性系列文章的第四篇。Python 3.3 于 2012 年首次发布,尽管它已经发布了很长时间,但它引入的许多特性都没有得到充分利用,而且相当酷。下面是其中的三个。 + +### yield from + +`yield` 关键字使 Python 更加强大。可以预见的是,人们都开始使用它来创建整个迭代器的生态系统。[itertools][2] 模块和 [more-itertools][3] PyPI 包就是其中两个例子。 + +有时,一个新的生成器会想要使用一个现有的生成器。作为一个简单的(尽管有点故意设计)的例子,设想你想枚举所有的自然数对。 + +一种方法是按照“自然数对的和,自然数对的第一项”的顺序生成所有的自然数对。用 `yield from` 来实现这个方法是很自然的。 + +`yield from ` 关键字是以下的简称: + +``` +for item in x: +    yield item +``` + +``` +import itertools + +def pairs(): + for n in itertools.count(): + yield from ((i, n-i) for i in range(n+1)) +``` + +``` +list(itertools.islice(pairs(), 6)) +``` + +``` + [(0, 0), (0, 1), (1, 0), (0, 2), (1, 1), (2, 0)] +``` + +### 隐式命名空间包 + +假设有一个叫 Parasol 的虚构公司,它制造了一堆东西。它的大部分内部软件都是用 Python 编写的。虽然 Parasol 已经开源了它的一些代码,但其中一些代码对于开源来说过于专有或专业。 + +该公司使用内部 [DevPI][4] 服务器来管理内部软件包。对于 Parasol 的每个 Python 程序员来说,在 PyPI 上找一个未使用的名字是没有意义的,所以所有的内部包都被称为 `parasol..`。遵守最佳实践,开发人员希望包的名字能反映出这个命名系统。 + +这一点很重要!如果 `parasol.accounting.numeric_tricks` 包安装了一个名为 `numeric_tricks` 的顶层模块,这意味着依赖这个包的人将无法使用名为 `numeric_tricks` 的 PyPI 包,不管它写的有多好。 + +然而,这给开发者留下了一个两难的选择:哪个包拥有 `parasol/__init__.py` 文件?从 Python 3.3 开始,最好的解决办法是把 `parasol`,可能还有 `parasol.accounting`,变成没有 `__init__.py` 文件的 [命名空间包][5]。 + +### 抑制异常的上下文 + +有时,在从异常中恢复的过程中出现的异常是一个问题,有上下文来跟踪它是很有用的。然而,有时却不是这样:异常已经被处理了,而新的情况是一个不同的错误状况。 + +例如,想象一下,在字典中查找一个键失败后,如果不能分析它,则希望失败并返回 `ValueError()`。 + +``` +import time + +def expensive_analysis(data): +    time.sleep(10) +    if data[0:1] == ">": +        return data[1:] +    return None +``` + +这个函数需要很长的时间,所以当你使用它时,想要对结果进行缓存: + +``` +cache = {} + +def last_letter_analyzed(data): +    try: +        analyzed = cache[data] +    except KeyError: +        analyzed = expensive_analysis(data) +        if analyzed is None: +            raise ValueError("invalid data", data) +        cached[data] = analyzed +    return analyzed[-1] +``` + +不幸的是,当出现缓存没有命中时,回溯看起来很难看: + +``` +last_letter_analyzed("stuff") +``` + +``` + --------------------------------------------------------------------------- + + KeyError Traceback (most recent call last) + + in last_letter_analyzed(data) + 4 try: + ----> 5 analyzed = cache[data] + 6 except KeyError: + + + KeyError: 'stuff' +``` + +在处理上述异常的过程中,发生了另一个异常: + +``` + ValueError Traceback (most recent call last) + + in + ----> 1 last_letter_analyzed("stuff") + + + in last_letter_analyzed(data) + 7 analyzed = expensive_analysis(data) + 8 if analyzed is None: + ----> 9 raise ValueError("invalid data", data) + 10 cached[data] = analyzed + 11 return analyzed[-1] + + + ValueError: ('invalid data', 'stuff') +``` + +如果你使用 `raise ... from None`,你可以得到更多可读的回溯: + +``` +def last_letter_analyzed(data): + try: + analyzed = cache[data] + except KeyError: + analyzed = expensive_analysis(data) + if analyzed is None: + raise ValueError("invalid data", data) from None + cached[data] = analyzed + return analyzed[-1] +``` + +``` +last_letter_analyzed("stuff") +``` + +``` + --------------------------------------------------------------------------- + + ValueError Traceback (most recent call last) + + in + ----> 1 last_letter_analyzed("stuff") + + + in last_letter_analyzed(data) + 5 analyzed = expensive_analysis(data) + 6 if analyzed is None: + ----> 7 raise ValueError("invalid data", data) from None + 8 cached[data] = analyzed + 9 return analyzed[-1] + + + ValueError: ('invalid data', 'stuff') +``` + +### 欢迎来到 2012 年 + +尽管 Python 3.3 在十年前就已经发布了,但它的许多功能仍然很酷,而且没有得到充分利用。如果你还没有,就把它们添加到你的工具箱中吧。 + +-------------------------------------------------------------------------------- + +via: https://opensource.com/article/21/5/python-33 + +作者:[Moshe Zadka][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/moshez +[b]: https://github.com/lujun9972 +[1]: https://opensource.com/sites/default/files/styles/image-full-size/public/lead-images/code_computer_laptop_hack_work.png?itok=aSpcWkcl (Coding on a computer) +[2]: https://docs.python.org/3/library/itertools.html +[3]: https://more-itertools.readthedocs.io/en/stable/ +[4]: https://opensource.com/article/18/7/setting-devpi +[5]: https://www.python.org/dev/peps/pep-0420/ diff --git a/published/202105/20210516 How to install a Desktop Environment (GUI) on Ubuntu Server.md b/published/202105/20210516 How to install a Desktop Environment (GUI) on Ubuntu Server.md new file mode 100644 index 0000000000..a03a8f6d54 --- /dev/null +++ b/published/202105/20210516 How to install a Desktop Environment (GUI) on Ubuntu Server.md @@ -0,0 +1,263 @@ +[#]: subject: "How to install a Desktop Environment (GUI) on Ubuntu Server" +[#]: via: "https://itsfoss.com/install-gui-ubuntu-server/" +[#]: author: "Chris Patrick Carias Stas https://itsfoss.com/author/chris/" +[#]: collector: "lujun9972" +[#]: translator: "lxbwolf" +[#]: reviewer: "wxy" +[#]: publisher: "wxy" +[#]: url: "https://linux.cn/article-13408-1.html" + +如何在 Ubuntu 服务器上安装桌面环境(GUI) +====== + +![](https://img.linux.net.cn/data/attachment/album/202105/20/110026zm3mmam0iztaaczz.jpg) + +你想在你的 Ubuntu 服务器上安装 GUI 吗?大部分情况下你是可以安装的,在本教程中我会详细介绍安装的步骤。 + +在正式开始之前,我来告诉你为什么服务器版的 Ubuntu 不带 GUI,以及在什么情况下你可以在服务器上安装 GUI。 + +### 为什么 Ubuntu 服务器没有 GUI? + +你对比过 Ubuntu 的桌面版和服务器版会发现,两者的主要区别是服务器版缺少 GUI(比如 [桌面环境][1])。Ubuntu 服务器基本上就是桌面版去掉图形模块后的降级版本。 + +这是刻意为之的。Linux 服务器需要占用系统资源来运行服务。图形化桌面环境会消耗大量的系统资源,因此服务器操作系统默认不包含桌面环境。 + +你可以在只有 512 MB RAM 的机器上使用 Ubuntu 服务器,但是 Ubuntu 桌面需要至少 2 GB 的 RAM 才能提供正常的功能。在服务器运行桌面环境被认为是浪费资源。 + +作为一个服务器使用者(或系统管理员),你应该通过命令行来使用和管理你的系统。为了达到这个水平,你需要掌握丰富的 Linux 命令相关的知识。 + +![Typically, you have to manage a server from the command line][2] + +### 你是否真正需要在你的服务器上安装 GUI? + +有些用户可能不太习惯在终端下使用命令行来完成工作。毕竟大部分用户是有条件通过图形界面操作计算机的。 + +你可能会在你的服务器上安装桌面环境并使用图形界面。大部分人不会这么干,但这是可行的。 + +但是这只有在你可以直接操作服务器时才行得通。假设你是在物理机器上运行它,比如服务器、台式机或笔记本电脑,抑或类似树莓派的设备。如果你可以直接操作宿主机系统,那么你还可以在运行在虚拟机上的服务器上安装。 + +如果你是通过 [云服务器提供商如 Linode、DigitalOcean 或 AWS][3] 部署的服务器,那么安装 GUI 就行不通了。如果你想通过图形界面来管理你的远程服务器,你可以使用 Webmin 或 [Cockpit][4] 等工具。你可以在 Web 浏览器中通过这些工具使用和管理你的服务器。相比于成熟的桌面环境,它能大大降低资源消耗。 + +![Tools like Cockpit allow managing Linux servers graphically][5] + +### 如何在 Ubuntu 服务器上安装 GUI? + +当你了解了基础知识后,我们一起来看看在 Ubuntu 服务器上安装桌面环境的步骤。 + +你需要做以下准备: + + * 已经配置好 Ubuntu 服务器,且 RAM 至少 2 GB + * 管理员权限(你需要用 `sudo` 执行命令) + * 网络连接正常(你需要下载和安装新包) + +我是在虚拟机上安装的 Ubuntu 服务器,并且我可以直接操作宿主机器。我使用同样的方法[在树莓派上安装了 Ubuntu 服务器][6]。 + +> 注意! +> +> 如果你是出于学习和调研等实验性的目的,那么你可以进行这些操作。请不要在生产环境的服务器上添加 GUI。后续删除 GUI 时可能会导致依赖问题,有些情况会破坏系统。 + +#### 准备系统 + +首先,因为你将要做一些系统级的修改,因此先进行更新和升级以确保我们系统的包是最新的: + +``` +sudo apt update && sudo apt upgrade +``` + +#### 安装桌面环境 + +更新结束后,你就可以安装桌面环境了。 + +有两种方法: + + * 使用 [apt][7] 来安装包 + * 使用一个名为 [tasksel][8] 的 Debian 工具,这个工具可以通过一条龙处理(任务)方式来安装多个包 + +任何一种方法都可以用完整包的方式来安装完整的桌面环境,就跟你从头安装桌面版本一样。我的意思是你可以得到跟桌面版本一样的所有的默认应用程序和工具。 + +如果你想使用 `tasksel`,需要先用下面的命令安装它: + +``` +sudo apt install tasksel +``` + +执行结束后,你就可以用 `tasksel` 来安装桌面环境(也叫 DE)了。 + +你可能知道有 [很多可用的桌面环境][9]。你可以选择自己喜欢的一个。有些桌面环境对系统资源占用得多(像 GNOME),有些占用得少(像 Xfce、MATE 等等)。 + +你可以自己决定使用哪个 DE。我会安装 [GNOME 桌面][10],因为它是 Ubuntu 默认的桌面。之后我也会介绍其他桌面的安装。 + +如果你使用的是 `tasksel`,执行下面这条命令: + +``` +sudo tasksel install ubuntu-desktop +``` + +如果你使用 `apt`,执行下面这条命令: + +``` +sudo apt install ubuntu-desktop +``` + +这个过程可能会持续几分钟到一个小时,执行速度取决于你的网速和硬件。 + +我想提醒下,上面两个命令执行后都会安装完整的 GNOME 桌面环境。在本文中我两个命令都会执行,两个命令的结果是一样的。 + +#### 安装和配置显示管理器 + +安装完成后,你需要一个名为 [显示管理器][11] 或“登录管理器”的组件。这个工具的功能是在管理用户对话和鉴权时启动 [显示服务器][12] 并加载桌面。 + +GNOME 桌面默认使用 GDM3 作为显示管理器,但从资源角度考虑它有点重。你可以使用更轻量级和资源友好的管理器。这里我们使用一个平台无关的显示管理器 [lightdm][13]。使用 `apt` 安装它: + +``` +sudo apt install lightdm +``` + +安装 lightdm 时系统会让我们选择默认的显示管理器,因为即使你可以安装多个管理器,也只能运行一个。 + +![Use the arrow key to select an option and then use the tab key to select and press enter][14] + +选择列表中的 “lightdm” 并点击 “\”。这应该用不了几分钟。完成后你可以用下面的命令启动显示管理器并加载 GUI: + +``` +sudo service lightdm start +``` + +你可以使用下面的命令来检查当前的显示管理器: + +``` +cat /etc/X11/default-display-manager +``` + +运行后得到的结果类似这样: + +![Checking the default Display Manager][15] + +如果一切顺利,你现在会来到欢迎界面。 + +![Greetings screen of GNOME Desktop with LightDM on an Ubuntu server][16] + +输入你的凭证,你的桌面就运行起来了。 + +![GNOME Desktop fully loaded on Ubutnu server][17] + +如果你想关闭 GUI,那么打开一个终端并输入: + +``` +sudo service lightdm stop +``` + +#### 安装其他的桌面环境(可选) + +前面我说过我们可以选择不同的桌面。我们一起来看看一些其他的选项: + +##### MATE + +[MATE][18] 是基于 GNOME2 源码的轻量级桌面,它完全开源,是一个不错的选项。 + +用下面的命令来安装 MATE: + +``` +sudo tasksel install ubuntu-mate-core +``` + +或 + +``` +sudo apt install ubuntu-mate-core +``` + +##### Lubuntu / LXDE/LXQT + +如果你的系统资源有限或者电脑很旧,那么我推荐另一个轻量级的 [Lubuntu][19]。使用下面的命令安装它: + +``` +sudo tasksel install lubuntu-core +``` + +或 + +``` +sudo apt install lubuntu-core +``` + +##### Xubuntu / Xfce + +[Xubuntu][20] 是基于 [Xfce][21] 的 Ubuntu 衍生版,轻量、简单、稳定但可高度定制。如果你想使用它,执行下面的命令: + +``` +sudo tasksel install xubuntu-core +``` + +或 + +``` +sudo apt install xubuntu-core +``` + +还有一些桌面没有列出来,像 [KDE][22],[Cinnamon][23] 和 [Budgie][24],不代表它们不好,它们也都是非常卓越的,你可以自己尝试安装它们。 + +### 如何从 Ubuntu 服务器上删除 GUI? + +如果你觉得桌面环境占用了太多的计算资源,你可以把之前安装的包删除掉。 + +请注意在某些情况下删除 GUI 可能会带来依赖问题,因此请备份好重要数据或创建一个系统快照。 + +- [如何从 Ubuntu 上删除包][25] + +``` +sudo apt remove ubuntu-desktop +sudo apt remove lightdm +sudo apt autoremove +sudo service lightdm stop +``` + +现在重启你的系统。你应该回到了正常的命令行登录。 + +### 结语 + +在大多数场景下是可以安装桌面 GUI 的。如果你不适应命令行,那么请使用类似 [YunoHost][26] 的发行版的服务器,YunoHost 基于 Debian 系统,你可以通过 GUI 来管理服务器。 + +上面说了,如果你是从头安装系统,那么我建议你使用桌面版本以避免后续的步骤。 + +如果你有任何问题,请在评论区留言。你会在服务器上使用 GUI 吗?参照本文后你遇到了什么问题吗? + +-------------------------------------------------------------------------------- + +via: https://itsfoss.com/install-gui-ubuntu-server/ + +作者:[Chris Patrick Carias Stas][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://itsfoss.com/author/chris/ +[b]: https://github.com/lujun9972 +[1]: https://itsfoss.com/what-is-desktop-environment/ +[2]: https://i1.wp.com/itsfoss.com/wp-content/uploads/2021/05/system-restart-required.png?resize=800%2C469&ssl=1 +[3]: https://linuxhandbook.com/free-linux-cloud-servers/ +[4]: https://linuxhandbook.com/cockpit/ +[5]: https://i1.wp.com/itsfoss.com/wp-content/uploads/2021/05/cockpit-2-2.png?resize=800%2C450&ssl=1 +[6]: https://itsfoss.com/install-ubuntu-server-raspberry-pi/ +[7]: https://itsfoss.com/apt-command-guide/ +[8]: https://manpages.ubuntu.com/manpages/bionic/man8/tasksel.8.html +[9]: https://itsfoss.com/best-linux-desktop-environments/ +[10]: https://www.gnome.org/ +[11]: https://itsfoss.com/display-manager/ +[12]: https://itsfoss.com/display-server/ +[13]: https://wiki.debian.org/LightDM +[14]: https://i0.wp.com/itsfoss.com/wp-content/uploads/2021/05/installing-gui-ubuntu-server-select-dm.png?resize=799%2C354&ssl=1 +[15]: https://i2.wp.com/itsfoss.com/wp-content/uploads/2021/05/installing-gui-ubuntu-server-default.png?resize=800%2C68&ssl=1 +[16]: https://i2.wp.com/itsfoss.com/wp-content/uploads/2021/05/installing-gui-ubuntu-server-gnome-desktop-greet.png?resize=798%2C600&ssl=1 +[17]: https://i0.wp.com/itsfoss.com/wp-content/uploads/2021/05/installing-gui-ubuntu-server-gnome-desktop.png?resize=792%2C597&ssl=1 +[18]: https://mate-desktop.org/ +[19]: https://lubuntu.net/ +[20]: https://xubuntu.org/ +[21]: https://www.xfce.org/ +[22]: https://itsfoss.com/install-kde-on-ubuntu/ +[23]: https://itsfoss.com/install-cinnamon-on-ubuntu/ +[24]: https://itsfoss.com/install-budgie-ubuntu/ +[25]: https://itsfoss.com/uninstall-programs-ubuntu/ +[26]: https://yunohost.org/ \ No newline at end of file diff --git a/published/202105/20210516 Looking back at what Python 3.4 did for enum.md b/published/202105/20210516 Looking back at what Python 3.4 did for enum.md new file mode 100644 index 0000000000..3c83459607 --- /dev/null +++ b/published/202105/20210516 Looking back at what Python 3.4 did for enum.md @@ -0,0 +1,204 @@ +[#]: subject: (Looking back at what Python 3.4 did for enum) +[#]: via: (https://opensource.com/article/21/5/python-34-features) +[#]: author: (Moshe Zadka https://opensource.com/users/moshez) +[#]: collector: (lujun9972) +[#]: translator: (geekpi) +[#]: reviewer: (wxy) +[#]: publisher: (wxy) +[#]: url: (https://linux.cn/article-13443-1.html) + +回顾一下 Python 3.4 中的枚举 +====== + +> 另外探索一些未被充分利用但仍然有用的 Python 特性。 + +![](https://img.linux.net.cn/data/attachment/album/202105/30/230947j19r2772m12tccrh.jpg) + +这是 Python 3.x 首发特性系列文章的第五篇。Python 3.4 在 2014 年首次发布,尽管它已经发布了很长时间,但它引入的许多特性都没有被充分利用,而且相当酷。下面是其中的三个。 + +### 枚举 + +我最喜欢的逻辑谜题之一是自我描述的 [史上最难的逻辑谜题][2]。在其中,它谈到了三个“神”,他们被称为 A、B 和 C,他们的身份是真、假和随机,按一定顺序排列。你可以问他们问题,但他们只用神的语言回答,其中 “da” 和 “ja” 表示 “是” 和 “不是”,但你不知道哪个是哪个。 + +如果你决定使用 Python 来解决这个问题,你将如何表示神的名字和身份以及神的语言中的词语?传统的答案是使用字符串。然而,字符串的拼写错误可能会带来灾难性的后果。 + +如果在解题的关键部分,你用字符串 “jaa” 而不是 “ja” 进行比较,你就会得到一个错误的答案。虽然谜题没有说明风险是什么,但这可能是最好的避免方式。 + +`enum` 模块让你能够以一种可调试但安全的方式来定义这些东西: + +``` +import enum + +@enum.unique +class Name(enum.Enum): + A = enum.auto() + B = enum.auto() + C = enum.auto() + +@enum.unique +class Identity(enum.Enum): + RANDOM = enum.auto() + TRUE = enum.auto() + FALSE = enum.auto() + + +@enum.unique +class Language(enum.Enum): + ja = enum.auto() + da = enum.auto() +``` + +枚举的一个好处是,在调试日志或异常中,枚举的呈现方式是有帮助的: + +``` +name = Name.A +identity = Identity.RANDOM +answer = Language.da +print("I suspect", name, "is", identity, "because they answered", answer) +``` + +``` + I suspect Name.A is Identity.RANDOM because they answered Language.da +``` + +### functools.singledispatch + +在开发游戏的“基础设施”层时,你想通用地处理各种游戏对象,但仍然允许这些对象自定义动作。为了使这个例子更容易解释,假设这是一个基于文本的游戏。当你使用一个对象时,大多数情况下,它只会打印 `You are using `。但是使用一把特殊的剑可能需要随机滚动,否则会失败。 + +当你获得一个物品时,它通常会被添加到库存中。然而,一块特别重的石头会砸碎一个随机物品。如果发生这种情况,库存中会失去该物体。 + +处理这个问题的一个方法是在物品上设置 `use` 和 `acquire` 方法。随着游戏复杂性的增加,这些方法会越来越多,使游戏对象变得难以编写。 + +相反,`functools.singledispatch` 允许你以安全和尊重命名空间的方式追溯性地添加方法。 + +你可以定义没有行为的类: + +``` +class Torch: + name="torch" + +class Sword: + name="sword" + +class Rock: + name="rock" +``` + +``` +import functools + +@functools.singledispatch +def use(x): + print("You use", x.name) + +@functools.singledispatch +def acquire(x, inventory): + inventory.add(x) +``` + +对于火炬来说,这些通用的实现已经足够了: + +``` +inventory = set() + +def deploy(thing): + acquire(thing, inventory) + use(thing) + print("You have", [item.name for item in inventory]) + +deploy(Torch()) +``` + +``` + You use torch + You have ['torch'] +``` + +然而,剑和石头需要一些专门的功能: + +``` +import random + +@use.register(Sword) +def use_sword(sword): + print("You try to use", sword.name) + if random.random() < 0.9: + print("You succeed") + else: + print("You fail") + +deploy(sword) +``` + +``` + You try to use sword + You succeed + You have ['sword', 'torch'] +``` + +``` +import random + +@acquire.register(Rock) +def acquire_rock(rock, inventory): + to_remove = random.choice(list(inventory)) + inventory.remove(to_remove) + inventory.add(rock) + +deploy(Rock()) +``` + +``` + You use rock + You have ['sword', 'rock'] +``` + +岩石可能压碎了火炬,但你的代码更容易阅读。 + +### pathlib + +从一开始,Python 中文件路径的接口就是“智能字符串操作”。现在,通过 `pathlib`,Python 有了一种面向对象的方法来操作路径。 + +``` +import pathlib +``` + +``` +gitconfig = pathlib.Path.home() / ".gitconfig" +text = gitconfig.read_text().splitlines() +``` + +诚然,用 `/` 作为操作符来生成路径名有点俗气,但在实践中却不错。像 `.read_text()` 这样的方法允许你从小文件中获取文本,而不需要手动打开和关闭文件句柄。 + +这使你可以集中精力处理重要的事情: + +``` +for line in text: + if not line.strip().startswith("name"): + continue + print(line.split("=")[1]) +``` + +``` + Moshe Zadka +``` + +### 欢迎来到 2014 年 + +Python 3.4 大约在七年前就发布了,但是在这个版本中首次出现的一些功能非常酷,而且没有得到充分利用。如果你还没使用,那么将他们添加到你的工具箱中。 + +-------------------------------------------------------------------------------- + +via: https://opensource.com/article/21/5/python-34-features + +作者:[Moshe Zadka][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/moshez +[b]: https://github.com/lujun9972 +[1]: https://opensource.com/sites/default/files/styles/image-full-size/public/lead-images/math_money_financial_calculator_colors.jpg?itok=_yEVTST1 (old school calculator) +[2]: https://en.wikipedia.org/wiki/The_Hardest_Logic_Puzzle_Ever diff --git a/published/202105/20210519 1Password for Linux Is Officially Here With Brand New Features.md b/published/202105/20210519 1Password for Linux Is Officially Here With Brand New Features.md new file mode 100644 index 0000000000..f56c1c4ea5 --- /dev/null +++ b/published/202105/20210519 1Password for Linux Is Officially Here With Brand New Features.md @@ -0,0 +1,80 @@ +[#]: subject: (1Password for Linux Is Officially Here With Brand New Features) +[#]: via: (https://news.itsfoss.com/1password-linux-released/) +[#]: author: (Ankush Das https://news.itsfoss.com/author/ankush/) +[#]: collector: (lujun9972) +[#]: translator: (wxy) +[#]: reviewer: (wxy) +[#]: publisher: (wxy) +[#]: url: (https://linux.cn/article-13416-1.html) + +全新 1Password for Linux 正式推出 +====== + +![](https://i0.wp.com/news.itsfoss.com/wp-content/uploads/2021/05/1password-linux-feat.png?w=1200&ssl=1) + +1Password 是一个相当不错的密码管理器(尽管不是开源的),在开源社区也有很好的口碑。他们甚至 [为从事开源项目的用户提供免费的团队成员资格][1]。 + +它的 Linux 桌面客户端已经处于测试阶段,但现在它已经准备好进入黄金时间。 + +他们已经正式 [宣布][2] 推出 1Password Linux 版,具有完整的桌面体验,可以与你的网络浏览器集成。 + +它还亮相了一些很快会进入 Android、iOS、Mac 和 Windows **的新功能**。 + +在这里,我要安利一下,Linux 上的 1Password 值得期待。 + +### 1Password Linux 桌面客户端 + +虽然它可以作为浏览器扩展而无需考虑平台,但桌面客户端的出现使体验更好。 + +![](https://i2.wp.com/news.itsfoss.com/wp-content/uploads/2021/05/1pass-account-dark.png?w=1280&ssl=1) + +桌面客户端内置了基于 GTK 主题的**黑暗模式支持**。它还能与 **GNOME、KDE 和你选择的任何其他窗口管理器**很好地整合。 + +看起来他们也在更多的细节上花费了心思,因此桌面客户端也支持**系统托盘图标**,即使你关闭了它也能保持活跃。 + +你可以用它直接在你的默认浏览器上自动填入密码。不过,虽然它提到了 **X11 剪贴板集成和支持**,但没有提到 Wayland。 + +![](https://i2.wp.com/news.itsfoss.com/wp-content/uploads/2021/05/1pass-screenshot.png?w=1280&ssl=1) + +它还包括了对 GNOME 钥匙环和 KDE 钱包的支持、内核钥匙环的集成、与系统锁定和闲置服务的集成。 + +除了这些,1Password for Linux 还首次推出了新的功能,这些功能将很快用于其他平台。 + + * 安全文件附件 + * 项目归档和删除功能,以便更好地组织文件 + * Watchtower 仪表板,检查和评估你的密码安全状况 + * 新的共享细节,查看谁可以访问什么 + * 快速查找和智能搜索建议 + * 翻新的外观和感觉 + +如果你想了解该版本以及他们对开源和 Linux 社区的计划,请浏览 [官方公告][2]。 + +### 在 Linux 中安装 1Password + +其官方称,该桌面客户端支持几个 Linux 发行版,包括 Ubuntu、 Debian、 Arch Linux、 Fedora、 CentOS 和 RHEL。你可以得到用来安装的 **.deb** 和 **.rpm** 软件包,或者使用软件包管理器找到它们。 + +- [下载 1Password for Linux][4] + +它也有一个可用的 [snap 包][5],你可以参考我们的 [在 Linux 中使用 snap][6] 的指南。 + +关于安装的更多信息,你也可以参考 [官方说明][7]。 + +-------------------------------------------------------------------------------- + +via: https://news.itsfoss.com/1password-linux-released/ + +作者:[Ankush Das][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://news.itsfoss.com/author/ankush/ +[b]: https://github.com/lujun9972 +[1]: https://news.itsfoss.com/1password-free-subscriptions/ +[2]: https://blog.1password.com/welcoming-linux-to-the-1password-family/ +[4]: https://1password.com/downloads/linux/ +[5]: https://snapcraft.io/1password +[6]: https://itsfoss.com/use-snap-packages-ubuntu-16-04/ +[7]: https://support.1password.com/install-linux/ diff --git a/published/202105/20210519 What is serverless with Java.md b/published/202105/20210519 What is serverless with Java.md new file mode 100644 index 0000000000..48b28c8514 --- /dev/null +++ b/published/202105/20210519 What is serverless with Java.md @@ -0,0 +1,80 @@ +[#]: subject: (What is serverless with Java?) +[#]: via: (https://opensource.com/article/21/5/what-serverless-java) +[#]: author: (Daniel Oh https://opensource.com/users/daniel-oh) +[#]: collector: (lujun9972) +[#]: translator: (DCOLIVERSUN) +[#]: reviewer: (wxy) +[#]: publisher: (wxy) +[#]: url: (https://linux.cn/article-13429-1.html) + +什么是 Java 的无服务器化? +====== + +> Java 仍是开发企业应用程序最流行的语言之一。那么,为什么无服务器serverless开发人员对它望而却步? + +![](https://img.linux.net.cn/data/attachment/album/202105/27/090038pd7ff7x0yohh38nd.jpg) + +几十年来,企业已经在各类平台上开发了关键业务应用程序,包括物理服务器、虚拟机和云环境。这些应用程序在各行各业都有一个共同点,那就是无论需求如何,它们都需要持续可用(24x7x365),保证稳定性、可靠性和性能。因此,即使实际资源利用率低于 50%,每个企业都必须付出高额成本维护基础架构(如 CPU、内存、磁盘、网络等)。 + +无服务器架构是为了帮助解决这些问题而产生的。无服务器允许开发人员按需构建和运行应用程序,保证高可用性,不必在多云和混合云环境中管理服务器。在幕后,无服务器拓扑中仍有很多服务器,但它们是从应用程序开发中抽象出来的。相反,云提供商使用无服务器进行资源管理,例如配置、维护、联网和扩展服务器实例。 + +由于其高效性,无服务器开发模式现在是一些企业的需求,这些企业希望按需启动服务,而不是一直运行服务。 + +许多新建的开源项目用来在 [Kubernetes][2] 集群上通过 Linux 容器包来管理无服务器应用程序。CNCF 的《[交互式无服务器全景][3]》 是一份关于开源项目、工具、框架和公共云平台的指南,帮助 DevOps 团队处理无服务器应用程序。 + +![CNCF Serverless Landscape][4] + +开发人员可以编写代码,然后将其快速部署到各种无服务器环境中。然后,无服务器应用程序响应需求,并根据需要自动伸缩扩展。 + +你可能想知道什么编程语言和运行环境最适合无服务器应用程序开发,以便与上图中的技术集成。这个问题不只一个答案,但是让我们退一步来讨论在企业生产环境中开发业务应用程序最流行的应用程序运行环境:Java。 + +据 [Developer Economics][6] 称,截至 2020 年第三季度,仍有 800 多万家企业开发人员在使用 Java 来实现其业务需求。然而,根据 2020 年的一项调查,Java(占比 6%)显然不是有前瞻意识的开发人员的首选,他们使用当前云服务做开发。 + +![NewRelic data on serverless runtimes and languages][8] + +*来自 NewRelic 无服务器基准报告的数据(Daniel Oh, [CC BY-SA 4.0][9])* + +资源使用、响应时间和延迟在无服务器开发中至关重要。公有云提供商提供的无服务器产品通常是按需计量的,只有在无服务器应用程序启动时,才会通过事件驱动的执行模式收费。因此,当无服务器应用程序闲置或缩减为零时,企业无需支付任何费用。 + +### 带有容器的 Java 状态 + +在这种背景下,你可能会问:“_既然现有业务应用程序很可能是在 Java 技术上开发的,那么开发人员为什么不尝试使用 Java 栈进行无服务器应用程序开发呢?_” + +隐藏的真相是:很难在新的不可变更的基础设施(例如 Kubernetes 这样的容器平台)中优化 Java 应用程序。 + +![Differences in memory resource usage][10] + +该图描述了 Java 进程与竞争的语言、框架(如 [Node.js][11] 和 [Go][12])之间内存资源使用的差异。Java HotSpot 占用资源最大,其中包括每个Java 虚拟机Java Virtual Machine(JVM)实例分配的堆内存。中间显示了 Node.js 每个进程要比 Java 小得多。最后,Go 是一种流行的云服务编程语言,因为它的内存消耗最低。 + +如你所见,当你在这张图从左到右走,你会看到更密的节点。这就是开发人员在云、容器和 Kubernetes 上编写无服务器应用程序时回避 Java(包括 [Spring Boot][13],一种顽固的微服务 Java 框架)的原因。 + +### 下一步是什么? + +企业可以通过实现无服务器应用程序获得明显的好处,但是资源密度问题导致他们避免使用 Java 堆栈在 Kubernetes 上开发无服务器应用程序开发。但是选择其他语言会给全球数百万 Java 开发人员带来学习负担。因此,在本系列的下一篇文章中,我将指导你如何开始使用 Java 无服务器函数,而不是使用其他语言。 + +-------------------------------------------------------------------------------- + +via: https://opensource.com/article/21/5/what-serverless-java + +作者:[Daniel Oh][a] +选题:[lujun9972][b] +译者:[DCOLIVERSUN](https://github.com/DCOLIVERSUN) +校对:[wxy](https://github.com/wxy) + +本文由 [LCTT](https://github.com/LCTT/TranslateProject) 原创编译,[Linux中国](https://linux.cn/) 荣誉推出 + +[a]: https://opensource.com/users/daniel-oh +[b]: https://github.com/lujun9972 +[1]: https://opensource.com/sites/default/files/styles/image-full-size/public/lead-images/java-coffee-mug.jpg?itok=Bj6rQo8r (Coffee beans and a cup of coffee) +[2]: https://opensource.com/article/19/6/reasons-kubernetes +[3]: https://landscape.cncf.io/serverless?zoom=150 +[4]: https://opensource.com/sites/default/files/uploads/cncf-serverless-landscape.png (CNCF Serverless Landscape) +[5]: https://github.com/cncf/landscape/blob/master/LICENSE +[6]: https://developereconomics.com/ +[7]: https://newrelic.com/resources/ebooks/serverless-benchmark-report-aws-lambda-2020 +[8]: https://opensource.com/sites/default/files/uploads/newrelic_serverlessbenchmarkreport.png (NewRelic data on serverless runtimes and languages) +[9]: https://creativecommons.org/licenses/by-sa/4.0/ +[10]: https://opensource.com/sites/default/files/uploads/java-containers.png (Differences in memory resource usage) +[11]: https://nodejs.org/ +[12]: https://golang.org/ +[13]: https://spring.io/projects/spring-boot diff --git a/published/202105/20210520 Remap your Caps Lock key on Linux.md b/published/202105/20210520 Remap your Caps Lock key on Linux.md new file mode 100644 index 0000000000..2695eb3d9d --- /dev/null +++ b/published/202105/20210520 Remap your Caps Lock key on Linux.md @@ -0,0 +1,136 @@ +[#]: subject: (Remap your Caps Lock key on Linux) +[#]: via: (https://opensource.com/article/21/5/remap-caps-lock-key-linux) +[#]: author: (Seth Kenlon https://opensource.com/users/seth) +[#]: collector: (lujun9972) +[#]: translator: (wxy) +[#]: reviewer: (wxy) +[#]: publisher: (wxy) +[#]: url: (https://linux.cn/article-13414-1.html) + +在 Linux 上重新映射你的大写锁定键 +====== + +> 通过在 GNOME 3 和 Wayland 上重新映射你的键盘,提高你的打字和导航速度,避免重复性压力伤害。 + +![](https://img.linux.net.cn/data/attachment/album/202105/22/174755hs0dbmm4idl5rbrr.jpg) + +对我来说,有许多改变生活的 Linux 时刻,但大多数都在成为现状后淡忘了。有一个 Linux 教给我的键盘小技巧,每次我使用它的时候(也许每天有 1000 次),我都会想起这件事,那就是把大写锁定键转换为 `Ctrl` 键。 + +我从不使用大写锁定键,但我整天使用 `Ctrl` 键进行复制、粘贴、在 [Emacs][2] 内导航,以及 [调用 Bash][3]、[GNU Screen][4] 或 [tmux][5] 等操作。大写锁定键在我的键盘上占据了宝贵的空间,而将实际上有用的 `Ctrl` 键挤到了难以触及的底部角落。 + +![手指放在键盘上][6] + +*这看起来就痛苦* + +重新映射 `Ctrl` 提高了我的打字和导航速度,并可能使我免受重复性压力伤害。 + +### 消失的控制 + +系好安全带,这是个过山车式的历史课。 + +对于像我这样的大写锁定键交换者来说,不幸的是,当 GNOME 3 问世时,它几乎删除了改变 `Ctrl` 键位置的功能。 + +幸运的是,优秀的 GNOME Tweaks 应用程序带回了这些 “失踪” 的控制面板。 + +不幸的是,[GNOME 40][8] 没有 GNOME Tweaks 应用程序(还没有?) + +另外,不幸的是,过去在 X11 上可以工作的老的 `xmodmap` 技巧在新的 [Wayland 显示服务器][9] 上没有用。 + +有一小段时间(最多一个下午),我觉得对于那些讨厌大写锁定键的人来说人生都灰暗了。然后我想起我是一个开源的用户,总有一种方法可以解决诸如被忽略的 GUI 控制面板之类的简单问题。 + +### dconf + +GNOME 桌面使用 dconf,这是一个存储重要配置选项的数据库。它是 GSettings 的后端,GSettings 是 GNOME 系统应用程序需要发现系统偏好时的接口。你可以使用 `gsetting` 命令查询 dconf 数据库,也可以使用 `dconf` 命令直接设置 dconf 的键值。 + +### GSettings + +dconf 数据库不一定是你可能称为可发现的数据库。它是一个不起眼的数据库,你通常不需要去考虑它,它包含了许多通常无需直接交互的数据。然而,如果你想更好地了解 GNOME 所要管理的所有偏好选项,那么浏览它是很有趣的。 + +你可以用 `list-schemas` 子命令列出所有 dconf 的模式。在浏览了数百个模式之后,你可以使用 [grep][10] 将你的注意力缩小到一些看起来特别相关的东西上,比如 `org.gnome.desktop`。 + +``` +$ gsettings list-schemas | grep ^org.gnome.desktop +[...] +org.gnome.desktop.background +org.gnome.desktop.privacy +org.gnome.desktop.remote-desktop.vnc +org.gnome.desktop.interface +org.gnome.desktop.default-applications.terminal +org.gnome.desktop.session +org.gnome.desktop.thumbnailers +org.gnome.desktop.app-folders +org.gnome.desktop.notifications +org.gnome.desktop.sound +org.gnome.desktop.lockdown +org.gnome.desktop.default-applications.office +``` + +无论是通过手动搜索还是通过 [阅读 GSetting 文档][11],你可能会注意到 `org.gnome.desktop.input-sources` 模式,它有助于定义键盘布局。从设计上来说,GSetting 模式包含了键和值。 + +### 用 dconf 重新映射大写字母锁 + +`xkb-options` 键包含了可选的键盘覆写。要设置这个键值,请使用`dconf`,将上面模式中的点(`.`)转换为斜线(`/`),因为 dconf 数据库需要使用 `/`。 + +``` +$ dconf write /org/gnome/desktop/input-sources/xkb-options "['caps:ctrl_modifier']" +``` + +我把 `caps` 设置为 `ctrl_modifier`,因为我使用 `Ctrl` 修饰键的次数多于其他修饰键,但 Vim 用户可能喜欢把它设置为 `escape`。 + +### 查看你的设置 + +这个改变会立即生效,并在重启后仍然生效。这是你在 GNOME 中定义的首选项,在你改变它之前一直有效。 + +你可以通过 `gsettings` 查看 dconf 中的新值。首先,查看可用的键: + +``` +$ gsettings list-keys \ + org.gnome.desktop.input-sources +xkb-options +mru-sources +show-all-sources +current +per-window +sources +``` + +然后用 `xkb-options` 键名查看设置: + +``` +$ gsettings get \ + org.gnome.desktop.input-sources \ + xkb-options +['caps:ctrl_modifier'] +``` + +### 选项丰富 + +我在我的 GNOME 3.4 系统上使用这个小技巧来设置大写锁定键以及 [Compose][12] 键(`compose:ralt`)。虽然我相信正在开发中的 GUI 控件可以控制这些选项,但我也不得不承认,能以编程方式设置这些选项的能力是我的荣幸。作为以前没有可靠方法来调整桌面设置的系统的管理员,能够用命令修改我的首选项使得设置新桌面变得快速而容易。 + +GSettings 提供了很多有用的选项,而且文档也很详尽。如果你有想要改变的东西,可以看看有什么可用的。 + +-------------------------------------------------------------------------------- + +via: https://opensource.com/article/21/5/remap-caps-lock-key-linux + +作者:[Seth Kenlon][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/seth +[b]: https://github.com/lujun9972 +[1]: https://opensource.com/sites/default/files/styles/image-full-size/public/lead-images/emoji-keyboard.jpg?itok=JplrSZ9c (Emoji keyboard) +[2]: https://opensource.com/article/20/12/emacs +[3]: https://opensource.com/article/18/5/bash-tricks#key +[4]: https://opensource.com/article/17/3/introduction-gnu-screen +[5]: https://opensource.com/article/19/6/tmux-terminal-joy +[6]: https://opensource.com/sites/default/files/uploads/bendy-fingers.jpg (Fingers on a keyboard) +[7]: https://creativecommons.org/licenses/by-sa/4.0/ +[8]: https://discourse.gnome.org/t/new-gnome-versioning-scheme/4235 +[9]: https://wayland.freedesktop.org +[10]: https://opensource.com/downloads/grep-cheat-sheet +[11]: https://access.redhat.com/documentation/en-us/red_hat_enterprise_linux/8/html/using_the_desktop_environment_in_rhel_8/configuring-gnome-at-low-level_using-the-desktop-environment-in-rhel-8 +[12]: https://opensource.com/article/17/5/7-cool-kde-tweaks-will-improve-your-life diff --git a/published/202105/20210521 Joining Fedora Linux to an enterprise domain.md b/published/202105/20210521 Joining Fedora Linux to an enterprise domain.md new file mode 100644 index 0000000000..25ad7ac46b --- /dev/null +++ b/published/202105/20210521 Joining Fedora Linux to an enterprise domain.md @@ -0,0 +1,101 @@ +[#]: subject: (Joining Fedora Linux to an enterprise domain) +[#]: via: (https://fedoramagazine.org/join-fedora-linux-enterprise-domain/) +[#]: author: (ogutierrez https://fedoramagazine.org/author/ogutierrez/) +[#]: collector: (lujun9972) +[#]: translator: (Chao-zhi) +[#]: reviewer: (wxy) +[#]: publisher: (wxy) +[#]: url: (https://linux.cn/article-13426-1.html) + +将 Fedora Linux 系统添加到企业域中 +====== + +![](https://img.linux.net.cn/data/attachment/album/202105/26/120149o01pzllgw119w66l.jpg) + +在企业互联网场景中,一般情况下最广泛使用的基于 Linux 的操作系统是 Red Hat Enterprise Linux(RHEL),它主要用于服务器,但也可以用作工作站。Fedora linux 其实也是工作站系统的一个很好的选择,它提供了许多在企业环境中工作的特性,使管理成为一项简单的任务。 + +当你的工作网络中有许多机器时,你需要一种以集中方式管理用户和机器的方法。[FreeIPA][4] 和 [活动目录][5]Active Directory 就是用于这个任务的技术。它们允许系统管理员使用网络中所有实体的目录来管理大量的机器。 + +### Fedora 中的活动目录 + +活动目录在公司环境中非常常见。Fedora 和 RHEL 通过使用 SSSD ( 系统安全服务守护进程 System Security Services Daemon)与 FreeIPA 或活动目录等服务很好地集成。SSSD 是一种访问远程目录和身份验证机制的系统服务。使用此软件的计算机能够使用远程凭据进行身份验证,并访问该目录网络中可用的其他服务。 + +要加入域网络,你需要域管理员的权限才能添加计算机。可以通过在域凭据上设置特殊权限或代表你对该计算机进行预配置。Fedora Linux 有一个在安装时配置机器的选项,叫做企业登录Enterprise Login。如果你的计算机网络自动配置为企业域网络,那么你可以直接使用域凭据登录。 + +![][6] + +如果你的配置不是自动的,或者你已经安装了 Fedora Linux,你可以通过以下几个配置步骤加入一个活动目录域: + + 1. 设置此计算机的 DNS。要连接到目录服务,首先需要能够解析目录域名。如果你的网络使用 DHCP 设置正确的 DNS,则可以跳过此步骤。 + 2. 更改你的计算机名称,以反映它将是新域的一部分。编辑文件 `/etc/hostname`,并将机器名更改为 `machinename.my_domain`。 + 3. 通过执行以下命令加入域:`sudo realm join my_domain -v`( 用域名称替换 `my_domain`)。 + +运行此命令后,系统将请求允许加入该域中新计算机的用户的凭据。如果进程中没有错误,则机器将成为域的一部分。 + +![][7] + +现在,此计算机已成为你的域的一部分,你可以: + + * 使用域用户名登录到计算机 + * 获取 kerberos 票据以访问域网络中的不同服务 + * 访问其他服务,具体取决于域的配置方式 + +### 使用 Fleet Commander 管理 Fedora Linux + +现在这台计算机已经是你的域的一部分了,你可以使用活动目录的域管理员工具来管理它。由于你的计算机没有运行 Windows,因此你只能进行身份验证以及访问网络和目录服务。无法在此计算机上设置与桌面相关的配置。 + +幸运的是,Fedora 有个工具叫 [Fleet Commander][8]。 + +#### 创建配置 + +Fleet Commander 是一个管理工具,允许你为网络中的所有 Fedora Linux 机器设置桌面配置文件。 + +这意味着,你可以简单地为 GNOME 桌面、Firefox、Chrome、LibreOffice 和其他支持的软件设置任何配置,然后在登录到选定的用户/组/计算机时以细粒度的方式应用该配置。 + +![][9] + +要使用这个工具首先安装 `fleet-commander-admin` 软件包: + +``` +sudo dnf install fleet-commander-admin +``` + +然后,用浏览器访问 [http://localhost:9090][10] 来登录。在左边的菜单中,点击 “Fleet Commander”。 + +Fleet Commander 有一个工具,可以使用“实时会话”机制直观地设置配置概要文件。它运行一个虚拟机,作为基本机器的模板。你需要手动进行所需的配置更改。然后检查所有配置更改,选择要添加到配置文件中的更改,然后部署它。 + +#### 管理客户端 + +在每个 Fedora Linux 或 RHEL 机器中,你都需要安装 Fleet Commander 客户端服务。此服务在用户登录时激活。它在域中搜索应用于当前用户/计算机的配置文件,并应用这个配置。 + +安装 `fleet-commander-client`: + +``` +sudo dnf install fleet-commander-client +``` + +软件将自动检测机器是否是域的一部分。当用户登录时,它将使用应用于该用户的配置文件来设置会话。 + +-------------------------------------------------------------------------------- + +via: https://fedoramagazine.org/join-fedora-linux-enterprise-domain/ + +作者:[ogutierrez][a] +选题:[lujun9972][b] +译者:[Chao-zhi](https://github.com/Chao-zhi) +校对:[wxy](https://github.com/wxy) + +本文由 [LCTT](https://github.com/LCTT/TranslateProject) 原创编译,[Linux中国](https://linux.cn/) 荣誉推出 + +[a]: https://fedoramagazine.org/author/ogutierrez/ +[b]: https://github.com/lujun9972 +[1]: https://fedoramagazine.org/wp-content/uploads/2021/05/enterprise-816x345.jpg +[2]: https://unsplash.com/@genefoto?utm_source=unsplash&utm_medium=referral&utm_content=creditCopyText +[3]: https://unsplash.com/s/photos/fleet?utm_source=unsplash&utm_medium=referral&utm_content=creditCopyText +[4]: https://www.freeipa.org/page/Main_Page +[5]: https://en.wikipedia.org/wiki/Active_Directory +[6]: https://lh5.googleusercontent.com/aIRYn2TDgaaUrErzBV_KPVgpm94OrVgySlwqlI3VsotslWKN5UnLQ0VYjESSFB12aZWf_UnbmOOwa_rcxvRoI-MB6gFaw8p-RgBP9Lswnb2YV3iIlQ8YeXgpwJC_-B5tPrFTfUe_ +[7]: https://lh6.googleusercontent.com/DVvr7cHuZxvgqhAHk9v7jAYSER7VSP1G7CJ1xHx1kT5ZS-v1yt3rKMmwk9JhsLnYGfwAjOPPpSC2BGTpZtAdKrnx7XLUWgOZBhFFwB6SL7vR_q_2N1c_OGYp7YmNLRk7oRW8IEVB +[8]: https://fleet-commander.org/ +[9]: https://lh6.googleusercontent.com/ATeNp5niX37MW7ARiMVSkqe9Vr5Fv4IN6eUW5xf1UPO0AMO1DxXLypw0CbqTNOfzLJYDM18ggc7Mrh3LZK8Foh80K1WjSW9LHQD081BbJg0owQJj_ZQdICLr0tGILmBRco-xbq92 +[10]: http://localhost:9090/ diff --git a/published/202105/20210527 Port operating systems to new chip architectures.md b/published/202105/20210527 Port operating systems to new chip architectures.md new file mode 100644 index 0000000000..5de254f018 --- /dev/null +++ b/published/202105/20210527 Port operating systems to new chip architectures.md @@ -0,0 +1,115 @@ +[#]: subject: (Port operating systems to new chip architectures) +[#]: via: (https://opensource.com/article/21/5/port-chip-architectures) +[#]: author: (Alan Smithee https://opensource.com/users/alansmithee) +[#]: collector: (lujun9972) +[#]: translator: (wxy) +[#]: reviewer: (wxy) +[#]: publisher: (wxy) +[#]: url: (https://linux.cn/article-13436-1.html) + +将操作系统移植到新的芯片架构的经验 +====== + +> 在将嵌入式系统操作系统移植到不同的芯片架构时,RT-Thread 的维护者们从中学到了什么。 + +![](https://img.linux.net.cn/data/attachment/album/202105/28/221925tuv6j9lsg6xovog2.jpg) + +曾经有人问我,为什么计算机被称为“计算机”,它们做的事情可远不止计算数字。一台现代的个人电脑可以浏览互联网、播放音频和视频、为视频游戏和电影生成漂亮的图形、模拟和预测复杂的天气模式和流行病风险、将建筑和工程蓝图变为现实等等。 + +计算机之所以能做到这些,是因为所有这些问题都可以归结为数字方程,而计算机的 CPU —— 其中央处理单元 —— 实际上不过是一个简单的计算器。 + +为了让 CPU 向硬盘驱动器发送信号以写入数据,或向显示器发送信号以显示图像,它必须接收指令。这些指令是以 “代码” 的形式出现的,这是一种简明的说法,即必须有人写一个 _程序_ ,与CPU “说” 同样的语言。CPU 理解的是 _机器语言_,这是一个大多数人都无法理解的比特阵列,大多数人都不可能手动写出来。相反,我们使用像 C、C++、Java、Python 等编程语言。这些语言被解析并编译成机器语言,然后交付给 CPU。 + +如果你试图用一种它不理解的语言来指示 CPU,它不知道该怎么做。你可以通过尝试用 [x86_64 RHEL][3] 镜像启动 [树莓派][2] 来体验这种误传尝试的尴尬结果。如果它能工作就好了,但是不能。 + +### 将一个操作系统移植到一个新的架构上 + +[RT-Thread 项目][4] 为嵌入式系统程序员提供了一个开源的操作系统(OS)。嵌入式领域是非常多样化的,有很多物联网(IoT)、定制工业和业余设备。RT-Thread 的目标是使嵌入式编程对每个人来说都很容易,无论你使用什么设备。有时,这意味着要将一个操作系统移植到一个新的架构上,不管是用于相同架构但指令集略有不同的的芯片,还是用于全新的架构。 + +一开始处理这个问题可能会有点吓人 —— 你可能不知道从哪里开始或如何开始。这篇文章收集了 RT-Thread 维护者在将 [RTOS][5] 移植到新的芯片架构时学到的经验。 + +### 你在开始之前需要知道什么 + +这里是一个看似难以逾越的过程的高屋建瓴的观点。这对你的项目来说可能有所不同,但从概念上来说,这是相对普遍的,即使一些具体的细节是不同的: + + 1. 准备好一个 C 语言的执行环境 + 2. 确认可以通过串行端口发送和接收字符 + 3. 确认上下文切换代码可以工作 + 4. 获取支持的硬件定时器 + 5. 确认中断程序可以通过串口接收和解析数据 + +### 执行模式 + +对于大多数先进的体系结构,操作系统和用户应用程序运行在不同的权限级别上。这可以防止有功能故障的代码影响操作系统的集成和安全。例如,在 ARMv7-A 架构中,操作系统通常在系统模式下运行,而在 ARMv8-A 中,操作系统可以在 EL2 或 EL3 权限级别上运行。 + +通常情况下,芯片在通电时以最高权限级别执行启动代码。但在此之后,操作系统会将特权级别切换到其目标模式。 + +#### 1、执行 C 代码 + +这一步的关键动作是将 [块起始符号][6]block starting symbol(.bss)部分设置为零,并设置堆栈指针。 + +在 C 语言的实现中,未初始化的全局变量和静态变量通常存储在 .bss 部分,它不占用存储设备的任何空间。当程序被加载时,相应的空间被分配到内存中,并被初始化为零。当操作系统启动时,它必须自己做这项工作。 + +另一方面,操作系统必须初始化堆栈空间并设置堆栈指针。由于 C 语言程序在进入和退出函数时在堆栈上保存和恢复局部变量,所以在调用任何 C 函数之前必须设置堆栈指针。RT-Thread 必须为每个新创建的线程做这个步骤。 + +#### 2、至少使用一个串行驱动器 + +RT-Thread 通过串口输出信息和日志,这也有助于在移植过程中对代码进行调试。在这个阶段,通过串口 _接收_ 数据是不必要的。当我们第一次在串口上看到我们友好的、熟悉的 RT-Thread 的标志时,我们就知道我们走对了路! + +#### 3、确认上下文切换逻辑 + +一个任务的上下文是它的整个执行环境,它包含通用寄存器、程序计数器、堆栈帧的位置等等。当一个新的线程被创建时,RT-Thread 必须手动分配和设置它的上下文,这样调度器就可以切换到新的线程,就像它对其他线程一样。 + +有三件事需要注意: + + * 首先,当 RT-Thread 启动时,默认情况下中断是禁用的。当任务调度器第一次被启用时,它们就会被启用;这个过程是在上下文切换期间用汇编语言实现的。 + * 第二,当一个线程退出时,下一个调度将开始,这时拥有的资源会被空闲的线程回收。 + * 第三,数据被推入堆栈的顺序必须与从堆栈中弹出数据的顺序一致。 + +一般来说,你希望正常进入主函数和 msh 控制台。然而,在这个阶段无法实现输入控制,因为串行输入中断还没有实现。当串行中断实现后,就可以进行 msh 输入了。 + +#### 4、设置定时器 + +RT-Thread 需要一个定时器来定期产生中断;它被用来计算自系统启动以来所经过的“滴答”。计数器的编号用于提供软件中断功能,并指示内核何时开始调度一个任务。 + +设置时间片的值可能是一件棘手的事情。它通常是 10ms 到 1ms。如果你在一个慢速的 CPU 上选择一个小的时间片,大部分时间就会花在任务切换上 —— 不利于完成其他事情。 + +#### 5、确认串口工作正常 + +在这一步,我们通过串口与 RT-Thread msh 进行交互。我们发送命令,按回车键,然后看着 msh 执行命令并显示结果。 + +这个过程通常不难实现。不过,有一点要提醒大家。在某些平台上,在处理完串口中断后,别忘了清除中断标志。 + +一旦串口工作正常,移植过程基本上就完成了。 + +### 实践 + +为了将你的项目移植到不同的芯片架构上,你需要非常清楚地了解你所针对的芯片的架构。熟悉你的项目中最关键的部分的底层代码。通过对照芯片的手册结合大量的实际工作经验,你会了解芯片的特权模式、寄存器和编译方法。 + +如果你没有需要移植到新芯片的项目,请加入我们;RT-Thread 项目总是需要帮助将 RTOS 移植到新的芯片上!作为一个开源项目,RT-Thread 正在改变开源嵌入式编程的面貌。请在 [RT-Thread 俱乐部][7]介绍你自己并寻求帮助! + +* * * + +本文基于 DEV 社区上的 [如何将操作系统移植到不同的芯片架构上?][8],并经许可转载。 + +-------------------------------------------------------------------------------- + +via: https://opensource.com/article/21/5/port-chip-architectures + +作者:[Alan Smithee][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/alansmithee +[b]: https://github.com/lujun9972 +[1]: https://opensource.com/sites/default/files/styles/image-full-size/public/lead-images/BIZ_darwincloud_520x292_0311LL.png?itok=74DLgd8Q (diagram of planning a cloud) +[2]: https://opensource.com/resources/raspberry-pi +[3]: https://www.redhat.com/en/store/red-hat-enterprise-linux-developer-suite +[4]: https://opensource.com/article/20/6/open-source-rtos +[5]: https://www.rt-thread.io/ +[6]: https://en.wikipedia.org/wiki/.bss +[7]: https://club.rt-thread.io/ +[8]: https://dev.to/abby06/how-to-port-operating-system-to-different-chip-architecture-3od9 diff --git a/published/202106/20200108 6 requirements of cloud-native software.md b/published/202106/20200108 6 requirements of cloud-native software.md new file mode 100644 index 0000000000..e2848eb214 --- /dev/null +++ b/published/202106/20200108 6 requirements of cloud-native software.md @@ -0,0 +1,65 @@ +[#]: collector: (lujun9972) +[#]: translator: (geekpi) +[#]: reviewer: (wxy) +[#]: publisher: (wxy) +[#]: url: (https://linux.cn/article-13497-1.html) +[#]: subject: (6 requirements of cloud-native software) +[#]: via: (https://opensource.com/article/20/1/cloud-native-software) +[#]: author: (Daniel Oh https://opensource.com/users/daniel-oh) + +云原生软件的 6 个要求 +====== + +> 开发和实施云原生(容器优先)软件的检查清单。 + +![](https://img.linux.net.cn/data/attachment/album/202106/18/101348dcjg3u7wugo5uouw.jpg) + +许多年来,单体应用是实现业务需求的标准企业架构。但是,当云基础设施开始以规模和速度为业务加速,这种情况就发生了重大变化。应用架构也发生了转变,以适应云原生应用和 [微服务][2]、[无服务器][3] 以及事件驱动的服务,这些服务运行在跨混合云和多云平台的不可变的基础设施上。 + +### 云原生与 Kubernetes 的联系 + +根据 [云原生计算基金会][4] (CNCF) 的说法: + +> “云原生技术使企业能够在现代动态环境中建立和运行可扩展的应用,如公共云、私有云和混合云。容器、服务网格、微服务、不可变的基础设施和声明式 API 就是这种方法的典范。” +> +> “这些技术使松散耦合的系统具有弹性、可管理和可观察性。与强大的自动化相结合,它们使工程师能够以最小的工作量频繁地、可预测地进行重要的改变。” + +像 [Kubernetes][5] 这样的容器编排平台允许 DevOps 团队建立不可变的基础设施,以开发、部署和管理应用服务。现在,快速迭代的速度与业务需求相一致。构建容器以在 Kubernetes 中运行的开发人员需要一个有效的地方来完成。 + +### 云原生软件的要求 + +创建云原生应用架构需要哪些能力,开发人员将从中获得哪些好处? + +虽然构建和架构云原生应用的方法有很多,但以下是一些需要考虑的部分: + + * **运行时:** 它们更多是以容器优先或/和 Kubernetes 原生语言编写的,这意味着运行时会如 Java、Node.js、Go、Python 和 Ruby。 + * **安全:** 在多云或混合云应用环境中部署和维护应用时,安全是最重要的,应该是环境的一部分。 + * **可观察性:** 使用 Prometheus、Grafana 和 Kiali 等工具,这些工具可以通过提供实时指标和有关应用在云中的使用和行为的更多信息来增强可观察性。 + * **效率:** 专注于极小的内存占用、更小的构件大小和快速启动时间,使应用可跨混合/多云平台移植。 + * **互操作性:** 将云原生应用与能够满足上述要求的开源技术相结合,包括 Infinispan、MicroProfile、Hibernate、Kafka、Jaeger、Prometheus 等,以构建标准运行时架构。 + * **DevOps/DevSecOps:** 这些方法论是为持续部署到生产而设计的,与最小可行产品 (MVP) 一致,并将安全作为工具的一部分。 + +### 让云原生具体化 + +云原生似乎是一个抽象的术语,但回顾一下定义并像开发人员一样思考可以使其更加具体。为了使云原生应用获得成功,它们需要包括一长串定义明确的组成清单。 + +你是如何规划云原生应用的设计的?在评论中分享你的想法。 + +-------------------------------------------------------------------------------- + +via: https://opensource.com/article/20/1/cloud-native-software + +作者:[Daniel Oh][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/daniel-oh +[b]: https://github.com/lujun9972 +[1]: https://opensource.com/sites/default/files/styles/image-full-size/public/lead-images/checklist_todo_clock_time_team.png?itok=1z528Q0y (Team checklist) +[2]: https://opensource.com/resources/what-are-microservices +[3]: https://opensource.com/article/18/11/open-source-serverless-platforms +[4]: https://github.com/cncf/toc/blob/master/DEFINITION.md +[5]: https://opensource.com/resources/what-is-kubernetes diff --git a/published/202106/20200206 How key Python projects are maintained.md b/published/202106/20200206 How key Python projects are maintained.md new file mode 100644 index 0000000000..6fd2a1952c --- /dev/null +++ b/published/202106/20200206 How key Python projects are maintained.md @@ -0,0 +1,92 @@ +[#]: collector: (lujun9972) +[#]: translator: (stevenzdg988) +[#]: reviewer: (wxy) +[#]: publisher: (wxy) +[#]: url: (https://linux.cn/article-13526-1.html) +[#]: subject: (How key Python projects are maintained) +[#]: via: (https://opensource.com/article/20/2/python-maintained) +[#]: author: (Moshe Zadka https://opensource.com/users/moshez) + +如何维护关键的 Python 项目 +====== + +> 一窥开源 Python 项目保持平稳运行的社区幕后。 + +![](https://img.linux.net.cn/data/attachment/album/202106/27/130401uu3l1nkq1padn1gn.jpg) + +Jannis Leidel 是 [Jazzband][2] 社区的一部分。Jazzband 是一个协作社区,共同承担维护基于 [Python][3] 的项目。 + +Jazzband 的诞生源于长期独自维护一个开源项目的压力。Jannis 是“roadie”,这意味着他负责管理任务并确保团队中的人可以在他们想要的时候参与。 + +Jazzband 并不是他的第一个开源志愿者工作——他是前 [Django][4] 核心开发人员,[Django 软件基金会][5] 董事会成员,编写了许多 Django 应用程序和 Python 项目,曾是 [pip][6] 和 [virtualenv][7] 核心开发人员和发布经理,共同创立了 [Python 打包机构][8]Python Packaging Authority,还担任过 [PyPI][9] 管理员。在社区方面,他共同创立了德国 Django 协会,担任 [DjangoCon Europe][10] 2010 联合主席,在多个会议上发言,并在去年担任了 [Python 软件基金会][11] 董事和联席主席。 + +### Moshe Zadka: 你是如何开始编程的? + +Jannis Leidel:我开始接触编程是在高中的常规德国计算机科学课程中,在那里我涉猎了 Turbo Pascal 和 Prolog。我很快就进入了 Web 开发的世界,并使用 PHP3、[Perl5][12] 和 [MySQL][13] 编写了一些小型网站。后来在大学里,我在从事媒体艺术项目时再次学习了编程,发现 [Ruby][14]、Perl 和 Python 特别有用。我最终坚持使用 Python,因为它的多功能性和易用性。从那时起,我很高兴能够在我的职业生涯中使用 Python 和开放 Web 技术(HTML/JS/CSS)。 + +### Zadka: 你是如何开始接触开源的? + +Leidel:作为大学艺术项目的一部分,我需要一种与各种 Web 服务对话并与一些电子设备交互的方法,但发现我之前的 PHP 技能无法胜任这项任务。因此,我参加了有关使用 Python 编程的课程,相比库,我对学习更多有关框架如何工作更感兴趣,因为它们进一步体现了我想了解的最佳实践。特别是,新生的 Django Web 框架对我很有吸引力,因为它倾向于一种务实的方法,并为如何开发 Web 应用程序提供了大量指导。 2007 年,我作为学生参与了 Google Summer of Code for Django,后来为 Django 及其可重用组件生态系统做出了更多贡献,不久我也成为了 Django 核心开发人员。在完成学位期间,我能够利用这些技能成为一名自由职业者,并花时间在 Django 社区的许多不同部分工作。在那时,横向移动到更广泛的 Python 社区不过是很自然的。 + +### Zadka: 你的日常工作是什么? + +Leidel:我是 Mozilla 的一名软件工程师,致力于为 Firefox 数据管道开发数据工具。实际上,这意味着我在更广泛的 Firefox 工程团队中工作,从事各种内部和面向公众的基于 Web 的项目,这些项目帮助 Mozilla 员工和社区成员理解 Firefox Web 浏览器发送的遥测数据。我目前的部分重点是维护我们的数据分析和可视化平台,该平台基于开源项目 [Redash][15],并对其做出贡献。我参与的其他项目是我们的下一代遥测系统 [Glean][16] 和一个允许你在浏览器(包括 Scientific Python 堆栈)中进行数据科学的工具 [Iodide][17]。 + +### Zadka: 你是如何参与 Jazzband 的? + +Leidel:早在 2015 年,我就对单独维护很多人所依赖的项目感到沮丧,并看到我的许多社区同行都在为类似的问题苦苦挣扎。我不知道有什么好方法可以让社区中更多的人对长期维护感兴趣。在某些情况下,我觉得新的“社会编码”范式的社会性的不足,而且常常是孤立的,有时甚至对新老贡献者来说都是创伤。我相信在我们的社区中,我现在觉得无法容忍的不平等现象在当时更加猖獗,这使得为贡献者提供一个安全的环境变得困难——我们现在知道这对于稳定的项目维护至关重要。我想知道我们是否缺少一种更具协作性和包容性的软件开发方法。 + +Jazzband 项目的启动是为了降低进入维护的门槛,并简化其中一些较无聊的方面(例如,围绕 [CI][18] 的最佳实践)。 + +### Zadka: 你最喜欢 Jazzband 的哪一点? + +Leidel:我最喜欢 Jazzband 的一点是,我们确保了许多人所依赖的许多项目的维护,同时还确保任何经验水平的新贡献者都可以加入。 + +### Zadka: Jazzband 的“roadie”的工作是什么? + +Leidel:“roadie”是指处理 Jazzband 幕后所有事务的人。这意味着,例如,处理新项目的进入、维护 Jazzband 网站以处理用户管理和项目发布、充当安全或行为准则事件的第一响应者等等。“roadie”这个词是从音乐和演出行业借来的,指的是支持人员,他们负责在巡回演出中几乎所有需要做的事情,除了实际的艺术表演。在 Jazzband,他们的存在是为了确保成员可以在项目中工作。这也意味着,在有意义的情况下,某些任务是部分或完全自动化的,并且最佳实践被应用于大多数 Jazzband 项目,如打包设置、文档托管或持续集成。 + +### Zadka: 作为 Jazzband 的“roadie”,你工作中最具挑战性的方面是什么? + +Leidel:目前,我作为“roadie”的工作中最具挑战性的方面是实施社区成员提出的 Jazzband 改进,而不影响他们所依赖的工作流程。换句话说,Jazzband 越大,在概念级别上扩展项目变得越困难。具有讽刺意味的是,我是目前唯一的“roadie”,独自处理一些任务,而 Jazzband 却试图阻止其项目发生这种情况。这是 Jazzband 未来的一大担忧。 + +### Zadka: 对于有兴趣想知道能否加入 Jazzband 的人,你有什么想说的? + +Leidel:如果你有兴趣加入一群相信协作工作比单独工作更好的人,或者如果你一直在为自己的维护负担而苦苦挣扎,并且不知道如何继续,请考虑加入 Jazzband。它简化了新贡献者的进入流程,提供了一个争议解决框架,并自动发布到 [PyPI][19]。有许多最佳实践可以很好地降低项目无人维护的风险。 + +### Zadka: 你还有什么想告诉我们的读者的吗? + +Leidel:我鼓励每个从事开源项目的人都考虑屏幕另一边的人。要有同理心,记住你自己的经历可能不是你同龄人的经历。要明白你是全球多元化社区的成员,这要求我们始终尊重我们之间的差异。 + +-------------------------------------------------------------------------------- + +via: https://opensource.com/article/20/2/python-maintained + +作者:[Moshe Zadka][a] +选题:[lujun9972][b] +译者:[stevenzdg988](https://github.com/stevenzdg988) +校对:[wxy](https://github.com/wxy) + +本文由 [LCTT](https://github.com/LCTT/TranslateProject) 原创编译,[Linux中国](https://linux.cn/) 荣誉推出 + +[a]: https://opensource.com/users/moshez +[b]: https://github.com/lujun9972 +[1]: https://opensource.com/sites/default/files/styles/image-full-size/public/lead-images/migration_innovation_computer_software.png?itok=VCFLtd0q (and old computer and a new computer, representing migration to new software or hardware) +[2]: https://jazzband.co/ +[3]: https://opensource.com/resources/python +[4]: https://opensource.com/article/18/8/django-framework +[5]: https://www.djangoproject.com/foundation/ +[6]: https://opensource.com/article/19/11/python-pip-cheat-sheet +[7]: https://virtualenv.pypa.io/en/latest/ +[8]: https://www.pypa.io/en/latest/ +[9]: https://pypi.org/ +[10]: https://djangocon.eu/ +[11]: https://www.python.org/psf/ +[12]: http://opensource.com/article/18/1/why-i-love-perl-5 +[13]: https://opensource.com/life/16/10/all-things-open-interview-dave-stokes +[14]: http://opensource.com/business/16/4/save-development-time-and-effort-ruby +[15]: https://redash.io/ +[16]: https://firefox-source-docs.mozilla.org/toolkit/components/telemetry/start/report-gecko-telemetry-in-glean.html +[17]: https://alpha.iodide.io/ +[18]: https://opensource.com/article/19/12/cicd-resources +[19]: https://opensource.com/downloads/7-essential-pypi-libraries diff --git a/published/202106/20200228 4 technologists on careers in tech for minorities.md b/published/202106/20200228 4 technologists on careers in tech for minorities.md new file mode 100644 index 0000000000..34ffe23bcd --- /dev/null +++ b/published/202106/20200228 4 technologists on careers in tech for minorities.md @@ -0,0 +1,125 @@ +[#]: collector: (lujun9972) +[#]: translator: (M4Xrun) +[#]: reviewer: (wxy) +[#]: publisher: (wxy) +[#]: url: (https://linux.cn/article-13480-1.html) +[#]: subject: (4 technologists on careers in tech for minorities) +[#]: via: (https://opensource.com/article/20/2/careers-tech-minorities) +[#]: author: (Shilla Saebi https://opensource.com/users/shillasaebi) + +4 位技术专家谈少数族群的技术职业 +====== + +> 了解 BHM 对他们意味着什么,什么影响了他们的职业生涯,为想要进入科技领域的少数族群提供资源,等等。 + +![Team meeting][1] + +为了纪念 BHM,我收集了一些我最喜欢的技术专家和开源贡献者的意见。这四位正在为下一代铺路,同时也在为他们在科技行业所做的工作铺路。了解 BHM 对他们意味着什么,是什么影响了他们的职业生涯,为想要进入科技领域的少数族群提供资源,等等。 + +**[Tameika Reed][2],Women In Linux 创始人** + +自 Women In Linux 发起以来,Tameika 一直致力于探索基础设施、网络安全、DevOps 和物联网领域的职业生涯,并致力于领导力和持续技能的培养。作为一个自学成才的系统管理员,Tameika 相信学习技术的最好方法就是深入其中。为了给女性一个全面的角度来看技术,Tameika 每周都会举办一次线上会议来探讨 Hyperledger、Kubernetes、微服务和高性能计算等 Linux 常规之外的技术。Tameika 的职业生涯包括与 OSCon、LISA 2018、Seagl、HashiCorp EU 2019 不同的会议以及各种当地活动进行会议发言。 + +**[Michael Scott Winslow][3],Comcast 公司核心应用与平台总监** + +“我是一个父亲、丈夫、兄弟、儿子。我出生在一个小家庭,所以我很乐于把朋友们变成一个大家庭。当我把我的名字附在某件事上时,我就非常希望它能成功,所以我很在意我参与的事情。噢,在我的职业生涯中我已经做了数十年的软件开发。我解决问题,和别人合作一起帮助解决大问题,我带领、引导和指导年轻的软件工程师的同时观察我想要学习的人。” + +**[Bryan Liles][4],VMware 资深工程师** + +“我正在和我们的团队一起重新思考开发人员如何与 Kubernetes 进行交互。当我不工作的时候,我就制造机器人和在社区里努力激励下一代的软件工程师。” + +**[Mutale Nkonde][5],AI For the People(AFP)首席执行官** + +AFP 是一家非营利性的创意机构。在创办非营利组织之前,Nkonde 从事人工智能治理工作。在此期间,她是向美国众议院提出《算法和深度伪造算法法案》以及《无生物识别障碍住房法案》的团队成员之一。Nkonde 的职业生涯中最开始是做广播记者,曾在英国广播公司(BBC)、美国有线电视新闻网(CNN)和美国广播公司(ABC)工作。她还广泛从事种族和科技方面的写作,并在哈佛大学和斯坦福大学获得奖学金。 + +### 是什么影响了你选择技术领域的职业? + +当我回到大学的时候,我害怕电脑。我害怕电脑是因为我从大学辍学了。之后我又回去了,我就把尽我所能学习作为自己的任务。这是我至今的座右铭,学习永不停止。— Tameika Reed + +我不会拐弯抹角,我小时候是个极客!在我 10 岁的时候,我就从印刷杂志上读到的代码开始每天写 GW-BASIC。在我上高中的时候,我给了自己一点喘息的时间来享受生活,但是当到了为大学选择专业的时候,这是一个很容易做出的选择。我留在了科技行业,这得感谢我一路走来遇到的了不起的导师和同事。— Michael Scott Winslow + +我从中学就开始写软件了。我喜欢告诉电脑去做事情并看到结果。长大后,我很快就意识到,拥有一份让我满意、收入高的工作才是正确的选择。— Bryan Liles + +我想知道为什么科技公司雇佣的黑人女性这么少。 — Mutale Nkonde + +### 在开源技术领域有没有某个特别的人给了你启发? + +我从很多其他人和项目中得到启发。比如我喜欢看到其他人来到 [Women In Linux][6],并确定他们想去哪里。我试着让人们从更全面的角度来看科技,这样他们就可以决定自己喜欢什么。说自己想在科技行业工作很容易,但要入手并坚持下去很难。你不必仅仅是一个程序员,你也可以成为一个云计算架构师。— Tameika Reed + +[Kelsey Hightower][7]、[Bryan Liles][4] 和 Kim Scott 激励了我。他们是如此真实!他们说的都是我每天的感受和经历。做好你的工作!别抱怨了!承认你的行为,并明白你是如何促成你的处境的![Gene Kim][8] 也给了我很大的启发。作为 DevOps 运动的领导者,我看到自己在追随和模仿他做的很多事情。 — Michael Scott Winslow + +不,我没有看到我想要的灵感,所以我努力成为 20 年前那个给我启发的人。 — Bryan Liles + +太多了!我最喜欢的一个是:[Dorothy Vaughan][9],她是美国第一个为 IBM 沃森电脑编程的人。她的故事被记录在电影《Hidden Figures》中。 — Mutale Nkonde + +### 你有什么特别的资源可以推荐给那些想要加入科技行业的少数人吗? + +有,我建议你在 Twitter 上交一些朋友,然后提问。以下是我在科技界关注和欣赏的一些人: — Tameika Reed + + * [@techgirl1908][10] + * [@bryanl][4] + * [@kelseyhightower][7] + * [@kstewart][11] + * [@tiffani][12] + * [@EricaJoy][13] + * [@womeninlinux][6] + * [@ArlanWasHere][14] + * [@blkintechnology][15] + * [@digundiv][16] + +受重视的新人训练营确实缩短了人们加入科技行业的时间。我遇到过几位经过培训的专业人士,他们都比 4 年制学校的同行更出色。我认为我们可以真正开始尊重人们创造的成果,而不是技术的熟练。 — Michael Scott Winslow + +我不确定我能推荐什么具体的东西。科技是一个很大的整体,所以没有一个简单的答案。我的建议是选择你认为会感兴趣的东西,并努力成为这个方面的专家。从问为什么开始,而不是怎么做,并且开始理解事物是如何一起运作的。 — Bryan Liles + +这取决于他们想做什么工作。对于那些在科技和社会公正的交汇处工作的人,我推荐 Safiya Noble 的《[Algorithms of Oppression][17]》一书。 —Mutale Nkonde + +### 你对有色人种将科技作为他们的职业有什么建议? + +我建议你学习自己的技能。你将是一个永远的学习者。总会有人或事挡在你的路上,你的反应和行动将取决于你自己。永远不要拒绝第一个提议,要知道自己的价值。我看技术就像看艺术一样。发展需要时间,所以要对自己有耐心,拔掉插头说不也没关系。 — Tameika Reed + +作为一个有点像行业保护者一样的人,我不想要不适合技术的人。所以要真正判断自己是否适合科技。你是一个能解决问题的人吗?你是否理性多于感性?你是否经常发现自己在创造过程?如果是这样,无论你的背景如何,我认为你都可以在科技行业找到一个家。— Michael Scott Winslow + +事情不会那么简单。你的进步会因为你的族群而减慢。你必须更努力工作。把逆境当作动力。你要比周围的人准备的更充分,这样当机会出现时你就能够应对它。找一个与你相似的人的网络,私下发泄不满,公开展示实力。你属于这里,你就能成功。 — Bryan Liles + +除了为一家公司工作,也在发展公共利益技术领域,我们的工作中心是技术如何影响真实的人。许多领导这项工作的人是有色人种妇女,黑人妇女正在取得巨大的进步。— Mutale Nkonde + +### BHM 对你来说意味着什么? + +意味着永不停止,为你永远不会忘记。 —Tameika Reed + +BHM 对我来说意味着关注塔斯克基飞行队而不是奴隶制。强调我们如何为历史做出贡献,而不是如何成为历史的受害者。我希望人们理解我们的骄傲来自哪里,而不是我们的愤怒。在我们的人民身上发生了很多非常糟糕的事情,但我们还站在这里。坚强!— Michael Scott Winslow + +BHM 是一个反思被遗忘的美国黑人历史的日子。我把它当作是感谢我的祖先所做的牺牲的时刻。— Bryan Liles + +这是一个集中体现全球黑人所作贡献的时刻。我喜欢它,这是我一年中最喜欢的时间之一。 — Mutale Nkonde + +-------------------------------------------------------------------------------- + +via: https://opensource.com/article/20/2/careers-tech-minorities + +作者:[Shilla Saebi][a] +选题:[lujun9972][b] +译者:[M4Xrun](https://github.com/M4Xrun) +校对:[wxy](https://github.com/wxy) + +本文由 [LCTT](https://github.com/LCTT/TranslateProject) 原创编译,[Linux中国](https://linux.cn/) 荣誉推出 + +[a]: https://opensource.com/users/shillasaebi +[b]: https://github.com/lujun9972 +[1]: https://opensource.com/sites/default/files/styles/image-full-size/public/lead-images/meeting-team-listen-communicate.png?itok=KEBP6vZ_ (Team meeting) +[2]: https://www.linkedin.com/in/tameika-reed-1a7290128/ +[3]: https://twitter.com/michaelswinslow +[4]: https://twitter.com/bryanl +[5]: https://twitter.com/mutalenkonde +[6]: https://twitter.com/WomenInLinux +[7]: https://twitter.com/kelseyhightower +[8]: https://twitter.com/RealGeneKim +[9]: https://en.wikipedia.org/wiki/Dorothy_Vaughan +[10]: https://twitter.com/techgirl1908 +[11]: https://twitter.com/kstewart +[12]: https://twitter.com/tiffani +[13]: https://twitter.com/EricaJoy +[14]: https://twitter.com/ArlanWasHere +[15]: https://twitter.com/blkintechnology +[16]: https://twitter.com/digundiv +[17]: http://algorithmsofoppression.com/ diff --git a/published/202106/20200511 Start using systemd as a troubleshooting tool.md b/published/202106/20200511 Start using systemd as a troubleshooting tool.md new file mode 100644 index 0000000000..60bb8550d3 --- /dev/null +++ b/published/202106/20200511 Start using systemd as a troubleshooting tool.md @@ -0,0 +1,264 @@ +[#]: collector: (lujun9972) +[#]: translator: (tt67wq) +[#]: reviewer: (wxy) +[#]: publisher: (wxy) +[#]: url: (https://linux.cn/article-13452-1.html) +[#]: subject: (Start using systemd as a troubleshooting tool) +[#]: via: (https://opensource.com/article/20/5/systemd-troubleshooting-tool) +[#]: author: (David Both https://opensource.com/users/dboth) + +使用 systemd 作为问题定位工具 +====== + +> 虽然 systemd 并非真正的故障定位工具,但其输出中的信息为解决问题指明了方向。 + +![](https://img.linux.net.cn/data/attachment/album/202106/02/214321uqzzrqza9mlt9iam.jpg) + +没有人会认为 systemd 是一个故障定位工具,但当我的 web 服务器遇到问题时,我对 systemd 和它的一些功能的不断了解帮助我找到并规避了问题。 + +我遇到的问题是这样,我的服务器 yorktown 为我的家庭办公网络提供名称服务 、DHCP、NTP、HTTPD 和 SendMail 邮件服务,它在正常启动时未能启动 Apache HTTPD 守护程序。在我意识到它没有运行之后,我不得不手动启动它。这个问题已经持续了一段时间,我最近才开始尝试去解决它。 + +你们中的一些人会说,systemd 本身就是这个问题的原因,根据我现在了解的情况,我同意你们的看法。然而,我在使用 SystemV 时也遇到了类似的问题。(在本系列文章的 [第一篇][2] 中,我探讨了围绕 systemd 作为旧有 SystemV 启动程序和启动脚本的替代品所产生的争议。如果你有兴趣了解更多关于 systemd 的信息,也可以阅读 [第二篇][3] 和 [第三篇][4] 文章。)没有完美的软件,systemd 和 SystemV 也不例外,但 systemd 为解决问题提供的信息远远多于 SystemV。 + +### 确定问题所在 + +找到这个问题根源的第一步是确定 httpd 服务的状态: + +``` +[root@yorktown ~]# systemctl status httpd +● httpd.service - The Apache HTTP Server +   Loaded: loaded (/usr/lib/systemd/system/httpd.service; enabled; vendor preset: disabled) +   Active: failed (Result: exit-code) since Thu 2020-04-16 11:54:37 EDT; 15min ago +     Docs: man:httpd.service(8) +  Process: 1101 ExecStart=/usr/sbin/httpd $OPTIONS -DFOREGROUND (code=exited, status=1/FAILURE) + Main PID: 1101 (code=exited, status=1/FAILURE) +   Status: "Reading configuration..." +      CPU: 60ms + +Apr 16 11:54:35 yorktown.both.org systemd[1]: Starting The Apache HTTP Server... +Apr 16 11:54:37 yorktown.both.org httpd[1101]: (99)Cannot assign requested address: AH00072: make_sock: could not bind to address 192.168.0.52:80 +Apr 16 11:54:37 yorktown.both.org httpd[1101]: no listening sockets available, shutting down +Apr 16 11:54:37 yorktown.both.org httpd[1101]: AH00015: Unable to open logs +Apr 16 11:54:37 yorktown.both.org systemd[1]: httpd.service: Main process exited, code=exited, status=1/FAILURE +Apr 16 11:54:37 yorktown.both.org systemd[1]: httpd.service: Failed with result 'exit-code'. +Apr 16 11:54:37 yorktown.both.org systemd[1]: Failed to start The Apache HTTP Server. +[root@yorktown ~]# +``` + +这种状态信息是 systemd 的功能之一,我觉得比 SystemV 提供的任何功能都要有用。这里的大量有用信息使我很容易得出逻辑性的结论,让我找到正确的方向。我从旧的 `chkconfig` 命令中得到的是服务是否在运行,以及如果它在运行的话,进程 ID(PID)是多少。这可没多大帮助。 + +该状态报告中的关键条目显示,HTTPD 不能与 IP 地址绑定,这意味着它不能接受传入的请求。这表明网络启动速度不够快,因为 IP 地址还没有设置好,所以 HTTPD 服务还没有准备好与 IP 地址绑定。这是不应该发生的,所以我查看了我的网络服务的 systemd 启动配置文件;在正确的 `after` 和 `requires` 语句下,所有这些似乎都没问题。下面是我服务器上的 `/lib/systemd/system/httpd.service` 文件: + +``` +# Modifying this file in-place is not recommended, because changes +# will be overwritten during package upgrades. To customize the +# behaviour, run "systemctl edit httpd" to create an override unit. + +# For example, to pass additional options (such as -D definitions) to +# the httpd binary at startup, create an override unit (as is done by +# systemctl edit) and enter the following: + +# [Service] +# Environment=OPTIONS=-DMY_DEFINE + +[Unit] +Description=The Apache HTTP Server +Wants=httpd-init.service +After=network.target remote-fs.target nss-lookup.target httpd-init.service +Documentation=man:httpd.service(8) + +[Service] +Type=notify +Environment=LANG=C + +ExecStart=/usr/sbin/httpd $OPTIONS -DFOREGROUND +ExecReload=/usr/sbin/httpd $OPTIONS -k graceful +# Send SIGWINCH for graceful stop +KillSignal=SIGWINCH +KillMode=mixed +PrivateTmp=true + +[Install] +WantedBy=multi-user.target +``` + +`httpd.service` 单元文件明确规定,它应该在 `network.target` 和 `httpd-init.service`(以及其他)之后加载。我试着用 `systemctl list-units` 命令找到所有这些服务,并在结果数据流中搜索它们。所有这些服务都存在,应该可以确保在设置网络 IP 地址之前,httpd 服务没有加载。 + +### 第一个解决方案 + +在互联网上搜索了一下,证实其他人在 httpd 和其他服务也遇到了类似的问题。这似乎是由于其中一个所需的服务向 systemd 表示它已经完成了启动,但实际上它却启动了一个尚未完成的子进程。通过更多搜索,我想到了一个规避方法。 + +我搞不清楚为什么花了这么久才把 IP 地址分配给网卡。所以我想,如果我可以将 HTTPD 服务的启动推迟合理的一段时间,那么 IP 地址就会在那个时候分配。 + +幸运的是,上面的 `/lib/systemd/system/httpd.service` 文件提供了一些方向。虽然它说不要修改它,但是它还是指出了如何操作:使用 `systemctl edit httpd` 命令,它会自动创建一个新文件(`/etc/systemd/system/httpd.service.d/override.conf`)并打开 [GNU Nano][5] 编辑器(如果你对 Nano 不熟悉,一定要看一下 Nano 界面底部的提示)。 + +在新文件中加入以下代码并保存: + +``` +[root@yorktown ~]# cd /etc/systemd/system/httpd.service.d/ +[root@yorktown httpd.service.d]# ll +total 4 +-rw-r--r-- 1 root root 243 Apr 16 11:43 override.conf +[root@yorktown httpd.service.d]# cat override.conf +# Trying to delay the startup of httpd so that the network is +# fully up and running so that httpd can bind to the correct +# IP address +# +# By David Both, 2020-04-16 + +[Service] +ExecStartPre=/bin/sleep 30 +``` + +这个覆盖文件的 `[Service]` 段有一行代码,将 HTTPD 服务的启动时间推迟了 30 秒。下面的状态命令显示了等待时间里的服务状态: + +``` +[root@yorktown ~]# systemctl status httpd +● httpd.service - The Apache HTTP Server +   Loaded: loaded (/usr/lib/systemd/system/httpd.service; enabled; vendor preset: disabled) +  Drop-In: /etc/systemd/system/httpd.service.d +           └─override.conf +           /usr/lib/systemd/system/httpd.service.d +           └─php-fpm.conf +   Active: activating (start-pre) since Thu 2020-04-16 12:14:29 EDT; 28s ago +     Docs: man:httpd.service(8) +Cntrl PID: 1102 (sleep) +    Tasks: 1 (limit: 38363) +   Memory: 260.0K +      CPU: 2ms +   CGroup: /system.slice/httpd.service +           └─1102 /bin/sleep 30 + +Apr 16 12:14:29 yorktown.both.org systemd[1]: Starting The Apache HTTP Server... +Apr 16 12:15:01 yorktown.both.org systemd[1]: Started The Apache HTTP Server. +[root@yorktown ~]# +``` + +这个命令显示了 30 秒延迟过后 HTTPD 服务的状态。该服务已经启动并正常运行。 + +``` +[root@yorktown ~]# systemctl status httpd +● httpd.service - The Apache HTTP Server +   Loaded: loaded (/usr/lib/systemd/system/httpd.service; enabled; vendor preset: disabled) +  Drop-In: /etc/systemd/system/httpd.service.d +           └─override.conf +           /usr/lib/systemd/system/httpd.service.d +           └─php-fpm.conf +   Active: active (running) since Thu 2020-04-16 12:15:01 EDT; 1min 18s ago +     Docs: man:httpd.service(8) +  Process: 1102 ExecStartPre=/bin/sleep 30 (code=exited, status=0/SUCCESS) + Main PID: 1567 (httpd) +   Status: "Total requests: 0; Idle/Busy workers 100/0;Requests/sec: 0; Bytes served/sec:   0 B/sec" +    Tasks: 213 (limit: 38363) +   Memory: 21.8M +      CPU: 82ms +   CGroup: /system.slice/httpd.service +           ├─1567 /usr/sbin/httpd -DFOREGROUND +           ├─1569 /usr/sbin/httpd -DFOREGROUND +           ├─1570 /usr/sbin/httpd -DFOREGROUND +           ├─1571 /usr/sbin/httpd -DFOREGROUND +           └─1572 /usr/sbin/httpd -DFOREGROUND + +Apr 16 12:14:29 yorktown.both.org systemd[1]: Starting The Apache HTTP Server... +Apr 16 12:15:01 yorktown.both.org systemd[1]: Started The Apache HTTP Server. +``` + +我本来可以实验下更短的延迟时间是否也能奏效,但是我的系统并不用那么严格,所以我觉得不这样做。目前系统的工作状态很可靠,所以我很高兴。 + +因为我收集了所有这些信息,我将其作为 Bug[1825554][6] 报告给红帽 Bugzilla。我相信报告 Bug 比抱怨 Bug 更有有用。 + +### 更好的解决方案 + +把这个问题作为 bug 上报几天后,我收到了回复,表示 systemd 只是一个管理工具,如果 httpd 需要在满足某些要求之后被拉起,需要在单元文件中表达出来。这个回复指引我去查阅 `httpd.service` 的手册页。我希望我能早点发现这个,因为它是比我自己想出的更优秀的解决方案。这种方案明确的针对了前置目标单元,而不仅仅是随机延迟。 + +来自 [httpd.service 手册页][7]: + +> **在启动时开启服务** +> +> `httpd.service` 和 `httpd.socket` 单元默认是 _禁用_ 的。为了在启动阶段开启 httpd 服务,执行:`systemctl enable httpd.service`。在默认配置中,httpd 守护进程会接受任何配置好的 IPv4 或 IPv6 地址的 80 口上的连接(如果安装了 mod_ssl,就会接受 443 端口上的 TLS 连接)。 +> +> 如果 httpd 被配置成依赖任一特定的 IP 地址(比如使用 `Listen` 指令),该地址可能只在启动阶段可用,又或者 httpd 依赖其他服务(比如数据库守护进程),那么必须配置该服务,以确保正确的启动顺序。 +> +> 例如,为了确保 httpd 在所有配置的网络接口配置完成之后再运行,可以创建一个带有以下代码段的 drop-in 文件(如上述): +> +> ``` +> [Unit] +> After=network-online.target +> Wants=network-online.target +> ``` + + +我仍然觉得这是个 bug,因为在 `httpd.conf` 配置文件中使用 Listen 指令是很常见的,至少在我的经验中。我一直在使用 Listen 指令,即使在只有一个 IP 地址的主机上,在多个网卡和 IP 地址的机器上这显然也是有必要的。在 `/usr/lib/systemd/system/httpd.service` 默认配置文件中加入上述几行,对不使用 `Listen` 指令的不会造成问题,对使用 `Listen` 指令的则会规避这个问题。 + +同时,我将使用建议的方法。 + +### 下一步 + +本文描述了一个我在服务器上启动 Apache HTTPD 服务时遇到的一个问题。它指引你了解我在解决这个问题上的思路,并说明了我是如何使用 systemd 来协助解决问题。我也介绍了我用 systemd 实现的规避方法,以及我按照我的 bug 报告得到的更好的解决方案。 + +如我在开头处提到的那样,这有很大可能是一个 systemd 的问题,特别是 httpd 启动的配置问题。尽管如此,systemd 还是提供了工具让我找到了问题的可能来源,并制定和实现了规避方案。两种方案都没有真正令我满意地解决问题。目前,这个问题根源依旧存在,必须要解决。如果只是在 `/usr/lib/systemd/system/httpd.service` 文件中添加推荐的代码,那对我来说是可行的。 + +在这个过程中我发现了一件事,我需要了解更多关于定义服务启动顺序的知识。我会在下一篇文章中探索这个领域,即本系列的第五篇。 + +### 资源 + +网上有大量的关于 systemd 的参考资料,但是大部分都有点简略、晦涩甚至有误导性。除了本文中提到的资料,下列的网页提供了跟多可靠且详细的 systemd 入门信息。 + +- Fedora 项目有一篇切实好用的 [systemd 入门][8],它囊括了几乎所有你需要知道的关于如何使用 systemd 配置、管理和维护 Fedora 计算机的信息。 +- Fedora 项目也有一个不错的 [备忘录][9],交叉引用了过去 SystemV 命令和 systemd 命令做对比。 +- 关于 systemd 的技术细节和创建这个项目的原因,请查看 [Freedesktop.org][10] 上的 [systemd 描述][11]。 +- [Linux.com][12] 的“更多 systemd 的乐趣”栏目提供了更多高级的 systemd [信息和技巧][13]。 + +此外,还有一系列深度的技术文章,是由 systemd 的设计者和主要开发者 Lennart Poettering 为 Linux 系统管理员撰写的。这些文章写于 2010 年 4 月至 2011 年 9 月间,但它们现在和当时一样具有现实意义。关于 systemd 及其生态的许多其他好文章都是基于这些文章: + + * [Rethinking PID 1][14] + * [systemd for Administrators,Part I][15] + * [systemd for Administrators,Part II][16] + * [systemd for Administrators,Part III][17] + * [systemd for Administrators,Part IV][18] + * [systemd for Administrators,Part V][19] + * [systemd for Administrators,Part VI][20] + * [systemd for Administrators,Part VII][21] + * [systemd for Administrators,Part VIII][22] + * [systemd for Administrators,Part IX][23] + * [systemd for Administrators,Part X][24] + * [systemd for Administrators,Part XI][25] + +-------------------------------------------------------------------------------- + +via: https://opensource.com/article/20/5/systemd-troubleshooting-tool + +作者:[David Both][a] +选题:[lujun9972][b] +译者:[tt67wq](https://github.com/tt67wq) +校对:[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/4/systemd +[3]: https://opensource.com/article/20/4/systemd-startup +[4]: https://opensource.com/article/20/4/understanding-and-using-systemd-units +[5]: https://www.nano-editor.org/ +[6]: https://bugzilla.redhat.com/show_bug.cgi?id=1825554 +[7]: https://www.mankier.com/8/httpd.service#Description-Starting_the_service_at_boot_time +[8]: https://docs.fedoraproject.org/en-US/quick-docs/understanding-and-administering-systemd/index.html +[9]: https://fedoraproject.org/wiki/SysVinit_to_Systemd_Cheatsheet +[10]: http://Freedesktop.org +[11]: http://www.freedesktop.org/wiki/Software/systemd +[12]: http://Linux.com +[13]: https://www.linux.com/training-tutorials/more-systemd-fun-blame-game-and-stopping-services-prejudice/ +[14]: http://0pointer.de/blog/projects/systemd.html +[15]: http://0pointer.de/blog/projects/systemd-for-admins-1.html +[16]: http://0pointer.de/blog/projects/systemd-for-admins-2.html +[17]: http://0pointer.de/blog/projects/systemd-for-admins-3.html +[18]: http://0pointer.de/blog/projects/systemd-for-admins-4.html +[19]: http://0pointer.de/blog/projects/three-levels-of-off.html +[20]: http://0pointer.de/blog/projects/changing-roots +[21]: http://0pointer.de/blog/projects/blame-game.html +[22]: http://0pointer.de/blog/projects/the-new-configuration-files.html +[23]: http://0pointer.de/blog/projects/on-etc-sysinit.html +[24]: http://0pointer.de/blog/projects/instances.html +[25]: http://0pointer.de/blog/projects/inetd.html diff --git a/published/202106/20200731 Why we open sourced our Python platform.md b/published/202106/20200731 Why we open sourced our Python platform.md new file mode 100644 index 0000000000..75e6c2cb59 --- /dev/null +++ b/published/202106/20200731 Why we open sourced our Python platform.md @@ -0,0 +1,102 @@ +[#]: collector: "lujun9972" +[#]: translator: "zepoch" +[#]: reviewer: "wxy" +[#]: publisher: "wxy" +[#]: url: "https://linux.cn/article-13533-1.html" +[#]: subject: "Why we open sourced our Python platform" +[#]: via: "https://opensource.com/article/20/7/why-open-source" +[#]: author: "Meredydd Luff https://opensource.com/users/meredydd-luff" + +为什么我们要开源我们的 Python 平台 +====== + +> 开源开发的理念使得 Anvil 的整个解决方案更加有用且值得信赖。 + +![](https://img.linux.net.cn/data/attachment/album/202106/29/041151fpvlz4a75ihlr0lv.jpg) + +Anvil 团队最近开源了 [Anvil App Server][2], 一个用于托管完全用 Python 构建的 Web 程序的运行时引擎。 + +社区的反应十分积极,我们 Anvil 团队已经将许多反馈纳入了我们的 [下一个版本][3]。但是我们不断被问到的问题是,“为什么你们选择开源这个产品的核心呢?” + +### 我们为何创造 Anvil + +[Anvil][4] 是一个可以使得构建 Web 应用更加简单的工具。我们让你们有能力仅使用一种语言—— Python —— 就可以来构建你的整个应用。 + +在 Anvil 之前,如果你想要构建一个 Web app,你需要写很多代码,用很多的技术,比如 HTML、Javascript、CSS、Python、SQL、React、Redux、Bootstrap、Sass、Webpack 等。这需要花费很长时间来学习。对于一个简单的应用便是这样子;相信我,一般的应用其实 [更加复杂][5]。 + +![A complex framework of development tools needed for a simple web app][6] + +*是的。对于一个简单的 web 应用便是需要如此多的技术。* + +但即使如此,你还没有完成!你需要了解有关 Git 和云托管提供商的所有信息、如何保护(很有可能是)Linux 操作系统、如何调整数据库,然后随时待命以保持其运行。一直如此。 + +因此,我们开发出了 Anvil,这是一个在线 IDE,你可以在用 [拖放编辑器][7] 来设计你的 UI 界面,用 Python 编写你的 [逻辑][8],然后 Anvil 会负责其余的工作。我们将所有的繁杂的技术栈进行了替换,只用 Python 就行啦! + +### 简单的 Web 托管很重要,但还不够 + +Anvil 还可以为你托管你的应用程序。为什么不呢?部署 Web 应用程序非常复杂,因此运行我们自己的云托管服务是提供我们所需的简单性的唯一方法。在 Anvil 编辑器中构建一个应用程序,[单击按钮][9],它就在网上发布了。 + +但我们不断听到有人说,“那太好了,但是……” + + * “我需要在没有可靠互联网接入的海外平台上运行这个应用。” + * “我想要将我的应用程序嵌入到我售出的 IoT 设备中” + * "如果我把我的宝都压到你的 Anvil 上,我怎么能确定十年后我的应用仍然能够运行呢?” + +这些都是很好的观点!云服务并不是适合所有人的解决方案。如果我们想为这些用户提供服务,就必须有一些方法让他们把自己的应用从 Anvil 中取出来,在本地运行,由他们自己完全控制。 + +### 开源是一个逃生舱,而不是弹射座椅 + +在会议上,我们有时会被问到,“我可以将它导出为 Flask+JS 的应用程序吗?” 当然,我们可以将 Anvil 项目分别导出为 Python 和 JavaScript —— 我们可以生成一个服务器包,将客户端中的 Python 编译为 Javascript,然后生成一个经典的 Web 应用程序。但它会有严重的缺点,因为:**代码生成是一个弹射座椅。** + +![Code generation is an ejector seat from a structured platform][10] + +生成的代码聊胜于无;至少你可以编辑它!但是在你编辑该代码的那一刻,你就失去了生成它的系统的所有好处。如果你使用 Anvil 是因为它的 [拖放编辑器][12] 和 [运行在浏览器中的 Python][13],那么你为什么必须使用 vim 和 Javascript 才能在本地托管你的应用程序? + +我们相信 [逃生舱,而不是弹射座椅][14]。所以我们选择了一个正确的方式——我们 [开源了 Anvil 的运行引擎][2],这与在我们的托管服务中为你的应用程序提供服务的代码相同。这是一个独立的应用程序;你可以使用文本编辑器编辑代码并在本地运行。但是你也可以将它直接用 `git` 推回到我们的在线 IDE。这不是弹射座椅;没有爆炸性的转变。这是一个逃生舱;你可以爬出来,做你需要做的事情,然后再爬回来。 + +### 如果它开源了,它还可靠吗 + +开源中的一个看似矛盾的是,它的免费可用性是它的优势,但有时也会产生不稳定的感觉。毕竟,如果你不收费,你如何保持这个平台的长期健康运行? + +我们正在做我们一直在做的事情 —— 提供一个开发工具,使构建 Web 应用程序变得非常简单,尽管你使用 Anvil 构建的应用程序 100% 是你的。我们为 Anvil 应用程序提供托管,并为 [企业客户][15] 提供整个现场开发和托管平台。这使我们能够提供免费计划,以便每个人都可以将 Anvil 用于业余爱好或教育目的,或者开始构建某些东西并查看它的发展。 + +### 得到的多,失去的少 + +开源我们的运行引擎并没有减少我们的业务 —— 它使我们的在线 IDE 在今天和未来变得更有用、更值得信赖。我们为需要它的人开放了 Anvil App Server 的源代码,并提供最终的安全保障。对于我们的用户来说,这是正确的举措 —— 现在他们可以放心地进行构建,因为他们知道开源代码 [就在那里][3],如果他们需要的话。 + +如果我们的开发理念与你产生共鸣,何不亲自尝试 Anvil? + +----- + +这篇文章改编自 [Why We Open Sourced the Anvil App Server][16],经许可重复使用。 + +-------------------------------------------------------------------------------- + +via: https://opensource.com/article/20/7/why-open-source + +作者:[Meredydd Luff][a] +选题:[lujun9972][b] +译者:[zepoch](https://github.com/zepoch) +校对:[wxy](https://github.com/wxy) + +本文由 [LCTT](https://github.com/LCTT/TranslateProject) 原创编译,[Linux中国](https://linux.cn/) 荣誉推出 + +[a]: https://opensource.com/users/meredydd-luff +[b]: https://github.com/lujun9972 +[1]: https://opensource.com/sites/default/files/styles/image-full-size/public/lead-images/BUS_OSwhy_520x292_ma.png?itok=lqfhAs8L "neon sign with head outline and open source why spelled out" +[2]: https://anvil.works/blog/open-source +[3]: https://github.com/anvil-works/anvil-runtime +[4]: https://anvil.works/ +[5]: https://github.com/kamranahmedse/developer-roadmap#introduction +[6]: https://opensource.com/sites/default/files/uploads/frameworks.png "A complex framework of development tools needed for a simple web app" +[7]: https://anvil.works/docs/client/ui +[8]: https://anvil.works/docs/client/python +[9]: https://anvil.works/docs/deployment +[10]: https://opensource.com/sites/default/files/uploads/ejector-seat-opensourcecom.jpg "Code generation is an ejector seat from a structured platform" +[11]: https://commons.wikimedia.org/wiki/File:Crash.arp.600pix.jpg +[12]: https://anvil.works/docs/editor +[13]: https://anvil.works/docs/client +[14]: https://anvil.works/blog/escape-hatches-and-ejector-seats +[15]: https://anvil.works/docs/overview/enterprise +[16]: https://anvil.works/blog/why-open-source + diff --git a/published/202106/20200930 FCC auctions should be a long-term boost for 5G availability.md b/published/202106/20200930 FCC auctions should be a long-term boost for 5G availability.md new file mode 100644 index 0000000000..c51a38e7d9 --- /dev/null +++ b/published/202106/20200930 FCC auctions should be a long-term boost for 5G availability.md @@ -0,0 +1,75 @@ +[#]: collector: (lujun9972) +[#]: translator: (littlebirdnest) +[#]: reviewer: (wxy) +[#]: publisher: (wxy) +[#]: url: (https://linux.cn/article-13525-1.html) +[#]: subject: (FCC auctions should be a long-term boost for 5G availability) +[#]: via: (https://www.networkworld.com/article/3584072/fcc-auctions-should-be-a-long-term-boost-for-5g-availability.html) +[#]: author: (Jon Gold https://www.networkworld.com/author/Jon-Gold/) + +FCC 的频谱拍卖是对 5G 普及的长期助推 +====== + +> FCC 制定新政策是为了让更多的频谱能够被用于通信以此来创造新的服务。 + +![FCC][1] + +随着 5G 的发展,为了完全实现它的服务,显然需要更多的频谱来,FCC 显然对此当成重中之重。 + +FCC 近日完成了有关公民宽带无线电服务Citizen’s Broadband Radio Service(CBRS)的 5G 频谱的[拍卖][8],这些频谱是位于 3.5GHz 频段中的 70MHz 新带宽。它拍卖了 45.8 个亿,是近几年为无线传输释放更多频道的拍卖会之一。FCC 在 2011、2014 和 2015 年在中低频段(大致在 1.7GHz 至 2.2GHz)和 700MHz 上拍卖了 65MHz。 + +当前频谱可操作的范围是低于 6GHz 频段或是中频段的频谱,与 [CBRS][9] 拍卖中出售的频谱处于同一区域。据专家称,即将举行的 C 频段拍卖将会是重要一环,将会有高达 280 MHz 频谱被拍卖。 + +IDC 的研究主管 Jasom leigh 说,“C 频段的拍卖将带来大笔资金。……美国的中频段频谱是稀缺的,这就是为什么你会看到这种巨大的紧迫性。” + +虽然几大主要移动运营商仍有望抢到这次拍卖中的大部分可用的许可证,但频谱的一些最具创新性的用途将由企业实施,所以将会与运营商竞争一系列可用的频段。 + +[物联网][11]、资产追踪以及其他私人网络应用的专用网络早已可以通过私人 LTE 实现,但由于 5G 技术先进的频谱共享、低延迟和多连接的特性,它的成熟大大拓宽了它们的范围。广义上讲,能替代更多当前需要连线的应用,如工业自动化、设备管理等等。 + +### 重新分配频谱就意味着谈判 + +对于想要改变美国的频谱优先事项上的问题并不是小事,FCC 前主席 Tom Wheeler 对此绝对深有体会,过去 10 年里,美国政府一直在推动重新分配频段,而持有频段者的大多是政府机构或者是卫星网络运营商。 + +Wheeler 说,这些利益相关者必须被分配到不同频段,通常以纳税人出资补偿,而让各个相关方参与分享和进行分享经常是一个复杂的过程。 + + +他指出,“FCC 现在面临的挑战之一是,频谱的分配是根据假定使用模拟信号做出的,而这些假定由于数字技术而被改写”。就像电视从模拟电视转变成数字电视。当模拟电视占用了 6MHz 频段,并需要两侧的保护带以避免干扰时,数字信号却能够在一个频段里容纳四到五个信号。 + +事实证明,这些假定是很难面对的。反对者公开反对 FCC 在中频段的动作,认为这样做没有足够的预防措施来避免对他们原有的设备和服务的干扰,而改变频率也意味着必须购买新的设备。 + +“我们和[美国国防部]还有卫星公司讨论过,事实上其中一个较大的原因是监管的挑战,没人想放弃现有体系下基于模拟信号假定下的安全地位。”Wheeler 说到,“我认为你也必须考虑周全,但我发现那些所谓宣声信号冲突的人,其实是将眼下当作避难所,根本没有竞争和威胁方面的意识。” + +### 未来:更多的服务 + +Leigh 表示,无论开放频谱的确切方式如何,但广泛的观点认为将中频频段开放给运营商和企业,对美国商业会有潜在的优势。而当美国坚持以拍卖形式分配无线频谱时,其他国家,像德国,就已经专门预留了供企业使用的中频段频谱。 + +对于试图推出自己的私有 5G 网络的公司而言,可能会推高频谱拍卖价格。但是,只要最终有足够可用的频谱,就有服务足够可用,无论它们是内部提供的,还是由移动运营商或供应商销售的。 + +他说:“企业在 5G 方面做的事情,将推动真正的未来。” + +------ + +via: https://www.networkworld.com/article/3584072/fcc-auctions-should-be-a-long-term-boost-for-5g-availability.html + +作者:[Jon Gold][a] +选题:[lujun9972][b] +译者:[littlebirdnest](https://github.com/littlebirdnest) +校对:[wxy](https://github.com/wxy) + +本文由 [LCTT](https://github.com/LCTT/TranslateProject) 原创编译,[Linux中国](https://linux.cn/) 荣誉推出 + +[a]: https://www.networkworld.com/author/Jon-Gold/ +[b]: https://github.com/lujun9972 +[1]: https://images.techhive.com/images/article/2017/01/fcc-100704762-large.jpg +[2]: https://www.networkworld.com/article/3203489/what-is-5g-fast-wireless-technology-for-enterprises-and-phones.html +[3]: https://www.networkworld.com/article/3568253/how-5g-frequency-affects-range-and-speed.html +[4]: https://www.networkworld.com/article/3568614/private-5g-can-solve-some-enterprise-problems-that-wi-fi-can-t.html +[5]: https://www.networkworld.com/article/3488799/private-5g-keeps-whirlpool-driverless-vehicles-rolling.html +[6]: https://www.networkworld.com/article/3570724/5g-can-make-for-cost-effective-private-backhaul.html +[7]: https://www.networkworld.com/article/3529291/cbrs-wireless-can-bring-private-5g-to-enterprises.html +[8]: https://www.networkworld.com/article/3572564/cbrs-wireless-yields-45b-for-licenses-to-support-5g.html +[9]: https://www.networkworld.com/article/3180615/faq-what-in-the-wireless-world-is-cbrs.html +[10]: https://www.networkworld.com/newsletters/signup.html +[11]: https://www.networkworld.com/article/3207535/what-is-iot-the-internet-of-things-explained.html +[12]: https://www.facebook.com/NetworkWorld/ +[13]: https://www.linkedin.com/company/network-world diff --git a/published/202106/20201026 7 Git tricks that changed my life.md b/published/202106/20201026 7 Git tricks that changed my life.md new file mode 100644 index 0000000000..d7b1c17f59 --- /dev/null +++ b/published/202106/20201026 7 Git tricks that changed my life.md @@ -0,0 +1,189 @@ +[#]: collector: "lujun9972" +[#]: translator: "BoosterY" +[#]: reviewer: "wxy" +[#]: publisher: "wxy" +[#]: url: "https://linux.cn/article-13529-1.html" +[#]: subject: "7 Git tricks that changed my life" +[#]: via: "https://opensource.com/article/20/10/advanced-git-tips" +[#]: author: "Rajeev Bera https://opensource.com/users/acompiler" + +七个改变我生活的 Git 小技巧 +====== + +> 这些有用的小技巧将改变你在当前最流行的版本控制系统下的工作方式。 + +![](https://img.linux.net.cn/data/attachment/album/202106/28/110029d64pblurlh5a4a50.jpg) + +Git 是当前最流行最普遍的版本控制系统之一,它被应用于私有系统和公开网站上各种各样的开发工作。不论我变得对 Git 有多熟悉,似乎总有些功能等待着被发掘。下面分享下和 Git 相关的改变我工作方式的一些小技巧。 + +### 1、Git 中的自动纠错 + +我们每个人都不时在输入时犯拼写错误,但是如果你使能了 Git 的自动纠错功能,你就能让 Git 自动纠正一些输入错误的子命令。 + +假如你想用命令 `git status` 来检查状态,但是你恰巧错误地输入了 `git stats`。通常情况下,Git 会告诉你 ‘stats’ 不是个有效的命令: + +``` +$ git stats +git: ‘stats’ is not a git command. See ‘git --help’. + +The most similar command is +status +``` + +为了避免类似情形,只需要在你的 Git 配置中使能自动纠错功能。 + +``` +$ git config --global help.autocorrect 1 +``` + +如果你只想对当前的仓库生效,就省略掉选项 `--global`。 + +这个命令会使能自动纠错功能。在相应的 [Git 官方文档][2] 中可以看到这个命令的详细说明,但是试着敲一下上面的错误命令会使你对这个设置干了什么有个直观的了解: + +``` +$ git stats +git: ‘stats’ is not a git command. See ‘git --help’. +On branch master +Your branch is up to date with ‘origin/master’. + +nothing to commit, working tree clean +``` + +在上面的例子中,Git 直接运行了它建议命令的第一个,也就是 `git status`,而不是给你展示它所建议的子命令。 + +### 2、对提交进行计数 + +需要对提交进行计数的原因有很多。例如,一些开发人员利用提交计数来判断什么时候递增工程构建序号,也有一些开发人员用提交计数来对项目进展取得一个整体上的感观。 + +对提交进行计数相当简单而且直接,下面就是相应的 Git 命令: + +``` +$ git rev-list --count branch-name +``` + +在上述命令中,参数 `branch-name` 必须是一个你当前仓库里的有效分支名。 + +``` +$ git rev-list –count master +32 +$ git rev-list –count dev +34 +``` + +### 3、仓库优化 + +你的代码仓库不仅对你来说很宝贵,对你所在的组织也一样。通过少数几个惯例你就能使自己的仓库整洁并且保持最新。[使用 .gitignore 文件][3] 就是这些最好的惯例之一。通过使用这个文件你可以告诉 Git 不要保存一些不需要记录的文件,如二进制文件、临时文件等等。 + +当然,你还可以使用 Git 的垃圾回收来进一步优化你的仓库。 + +``` +$ git gc --prune=now --aggressive +``` + +这个命令在你和你的团队经常使用 `pull` 或者 `push` 操作的时候很有帮助。 + +它是一个内部工具,能清理掉你的仓库里没法访问或者说“空悬”的 Git 对象。 + +### 4、给未追踪的文件来个备份 + +大多数时候,删除所有未追踪的文件是安全的。但很多时候也有这么一种场景,你想删掉这些未追踪的文件同时也想做个备份防止以后需要用到。 + +Git 组合一些 Bash 命令和管道操作,可以让你可以很容易地给那些未追踪的文件创建 zip 压缩包。 + +``` +$ git ls-files --others --exclude-standard -z |\ + xargs -0 tar rvf ~/backup-untracked.zip +``` + +上面的命令就生成了一个名字为 `backup-untracked.zip` 的压缩包文件(当然,在 `.gitignore` 里面忽略了的文件不会包含在内)。 + +### 5、了解你的 .git 文件夹 + +每个仓库都有一个 `.git` 文件夹,它是一个特殊的隐藏文件夹。 + +``` +$ ls -a +. … .git +``` + +Git 主要通过两个东西来工作: + +1. 当前工作树(你当前检出的文件状态) +2. 你的 Git 仓库的文件夹(准确地说,包含版本信息的 `.git` 文件夹的位置) + +这个文件夹存储了所有参考信息和一些其他的如配置、仓库数据、HEAD 状态、日志等更多诸如此类的重要细节。 + +一旦你删除了这个文件夹,尽管你的源码没被删,但是类似你的工程历史记录等远程信息就没有了。删除这个文件夹意味着你的工程(至少本地的复制)不再在版本控制的范畴之内了。这也就意味着你没法追踪你的修改;你没法从远程仓拉取或推送到远程仓了。 + +通常而言,你需要或者应当对你的 `.git` 文件夹的操作并不多。它是被 Git 管理的,而且大多数时候是一个禁区。然而,在这个文件夹内还是有一些有趣的工件,比如说当前的 HEAD 状态在内的就在其中。 + +``` +$ cat .git/HEAD +ref: refs/heads/master +``` + +它也隐含着对你仓库地描述: + +``` +$ cat .git/description +``` + +这是一个未命名的仓库;通过编辑文件 ‘description’ 可以给这个仓库命名。 + +Git 钩子文件夹连同一些钩子文件例子也在这里。参考这些例子你就能知道 Git 钩子能干什么了。当然,你也可以 [参考这个 Seth Kenlon 写的 Git 钩子介绍][4]。 + +### 6、浏览另一个分支的文件 + +有时,你会想要浏览另一个分支下某个文件的内容。这其实用一个简单的 Git 命令就可以实现,甚至都不用切换分支。 + +设想你有一个命名为 [README.md][5] 的文件,并且它在 `main` 分支上。当前你正工作在一个名为 `dev` 的分支。 + +用下面的 Git 命令,在终端上就行。 + +``` +$ git show main:README.md +``` + +一旦你执行这个命令,你就能在你的终端上看到 `main` 分支上该文件的内容。 + +### 7、Git 中的搜索 + +用一个简单的命令你就能在 Git 中像专业人士一样搜索了。更有甚者,尽管你不确定你的修改在哪次提交或者哪个分支上,你依然能搜索。 + +``` +$ git rev-list --all | xargs git grep -F '' +``` + +例如,假设你想在你的仓库中搜索字符串 `“font-size: 52 px;"` : + +``` +$ git rev-list –all | xargs git grep -F ‘font-size: 52 px;’ +F3022…9e12:HtmlTemplate/style.css: font-size: 52 px; +E9211…8244:RR.Web/Content/style/style.css: font-size: 52 px; +``` + +### 试试这些小技巧 + +我希望这些小技巧对你是有用的,或者增加你的生产力或者节省你的大量时间。 + +你也有一些喜欢的 [Git 技巧][6] 吗?在评论区分享吧。 + +-------------------------------------------------------------------------------- + +via: https://opensource.com/article/20/10/advanced-git-tips + +作者:[Rajeev Bera][a] +选题:[lujun9972][b] +译者:[BoosterY](https://github.com/BoosterY) +校对:[wxy](https://github.com/wxy) + +本文由 [LCTT](https://github.com/LCTT/TranslateProject) 原创编译,[Linux中国](https://linux.cn/) 荣誉推出 + +[a]: https://opensource.com/users/acompiler +[b]: https://github.com/lujun9972 +[1]: https://opensource.com/sites/default/files/styles/image-full-size/public/lead-images/browser_screen_windows_files.png?itok=kLTeQUbY (Computer screen with files or windows open) +[2]: https://git-scm.com/book/en/v2/Customizing-Git-Git-Configuration#_code_help_autocorrect_code +[3]: https://opensource.com/article/20/8/dont-ignore-gitignore +[4]: https://opensource.com/life/16/8/how-construct-your-own-git-server-part-6 +[5]: http://README.md +[6]: https://acompiler.com/git-tips/ diff --git a/published/202106/20210222 A friendly guide to the syntax of C-- method pointers.md b/published/202106/20210222 A friendly guide to the syntax of C-- method pointers.md new file mode 100644 index 0000000000..a80a7bffc1 --- /dev/null +++ b/published/202106/20210222 A friendly guide to the syntax of C-- method pointers.md @@ -0,0 +1,222 @@ +[#]: collector: (lujun9972) +[#]: translator: (mengxinayan) +[#]: reviewer: (wxy) +[#]: publisher: (wxy) +[#]: url: (https://linux.cn/article-13498-1.html) +[#]: subject: (A friendly guide to the syntax of C++ method pointers) +[#]: via: (https://opensource.com/article/21/2/ccc-method-pointers) +[#]: author: (Stephan Avenwedde https://opensource.com/users/hansic99) + +C++ 类成员函数指针语法的友好指南 +====== + +> 一旦你理解了一般原则,C++ 类成员函数指针不再那么令人生畏。 + +![](https://img.linux.net.cn/data/attachment/album/202106/18/104200rm48h22eghehg2p3.jpg) + +如果你正在寻找性能、复杂性或许多可能的解决方法来解决问题,那么在涉及到极端的情况下,[C++][2] 总是一个很好的选择。当然,功能通常伴随着复杂性,但是一些 C++ 的特性几乎难以分辨。根据我的观点,C++ 的 [类成员函数指针][3] 也许是我接触过的最复杂的表达式,但是我会先从一些较简单的开始。 + +文章中的例子可以在我的 [Github 仓库][4] 里找到。 + +### C 语言:函数指针 + +让我们先从一些基础开始:假设你有一个函数接收两个整数作为参数返回一个整数: + +``` +int sum(int a, int b) { + return a+b; +} +``` + +在纯 C 语言中,你可以创建一个指向这个函数的指针,将其分配给你的 `sum(...)` 函数,通过解引用来调用它。函数的签名(参数、返回类型)必须符合指针的签名。除此之外,一个函数指针表现和普通的指针相同: + +``` +int (*funcPtrOne)(int, int); + +funcPtrOne = ∑ + +int resultOne = funcPtrOne(2, 5); +``` + +如果你使用指针作为参数并返回一个指针,这会显得很丑陋: + +``` +int *next(int *arrayOfInt){ + return ++arrayOfInt; +} + +int *(*funcPtrTwo)(int *intPtr); + +funcPtrTwo = &next; + +int resultTwo = *funcPtrTwo(&array[0]); +``` + +C 语言中的函数指针存储着子程序的地址。 + +### 指向类成员函数的指针 + +让我们来进入 C++:好消息是你也许不需要使用类成员函数指针,除非在一个特别罕见的情况下,比如说接下来的例子。首先,你已经知道定义一个类和其中一个成员函数: + +``` +class MyClass +{ +public: + + int sum(int a, int b) { + return a+b; + } + +}; +``` + +#### 1、定义一个指针指向某一个类中一个成员函数 + +声明一个指针指向 `MyClass` 类成员函数。在此时,你并不知道想调用的具体函数。你仅仅声明了一个指向 `MyClass` 类中任意成员函数的指针。当然,签名(参数、返回值类型)需要匹配你接下想要调用的 `sum(...)` 函数: + +``` +int (MyClass::*methodPtrOne)(int, int); +``` + +#### 2、赋值给一个具体的函数 + +为了和 C 语言(或者 [静态成员函数][5])对比,类成员函数指针不需要指向绝对地址。在 C++ 中,每一个类中都有一个虚拟函数表(vtable)用来储存每个成员函数的地址偏移量。一个类成员函数指针指向 vtable 中的某个条目,因此它也只存储偏移值。这样的原则使得 [多态][6] 变得可行。 + +因为 `sum(...)` 函数的签名和你的指针声明匹配,你可以赋值签名给它: + +``` +methodPtrOne = &MyClass::sum; +``` + +#### 3、调用成员函数 + +如果你想使用指针调用一个类成员函,你必须提供一个类的实例: + +``` +MyClass clsInstance; +int result = (clsInstance.*methodPtrOne)(2,3); +``` + +你可以使用 `.` 操作符来访问,使用 `*` 对指针解引用,通过提供两个整数作为调用函数时的参数。这是丑陋的,对吧?但是你可以进一步应用。 + +### 在类内使用类成员函数指针 + +假设你正在创建一个带有后端和前端的 [客户端/服务器][7] 原理架构的应用程序。你现在并不需要关心后端,相反的,你将基于 C++ 类的前端。前端依赖于后端提供的数据完成初始化,所以你需要一个额外的初始化机制。同时,你希望通用地实现此机制,以便将来可以使用其他初始化函数(可能是动态的)来拓展你的前端。 + +首先定义一个数据类型用来存储初始化函数(`init`)的指针,同时描述何时应调用此函数的信息(`ticks`): + +``` +template +struct DynamicInitCommand { + void (T::*init)(); // 指向额外的初始化函数 + unsigned int ticks; // 在 init() 调用后 ticks 的数量 +}; +``` + +下面一个 `Frontend` 类示例代码: + +``` +class Frontend +{ +public: + + Frontend(){ + DynamicInitCommand init1, init2, init3; + + init1 = { &Frontend::dynamicInit1, 5}; + init2 = { &Frontend::dynamicInit2, 10}; + init3 = { &Frontend::dynamicInit3, 15}; + + m_dynamicInit.push_back(init1); + m_dynamicInit.push_back(init2); + m_dynamicInit.push_back(init3); + } + + void tick(){ + std::cout << "tick: " << ++m_ticks << std::endl; + + /* 检查延迟初始化 */ + std::vector>::iterator it = m_dynamicInit.begin(); + + while (it != m_dynamicInit.end()){ + if (it->ticks < m_ticks){ + + if(it->init) + ((*this).*(it->init))(); // 这里是具体调用 + + it = m_dynamicInit.erase(it); + + } else { + it++; + } + } + } + + unsigned int m_ticks{0}; + +private: + + void dynamicInit1(){ + std::cout << "dynamicInit1 called" << std::endl; + }; + + void dynamicInit2(){ + std::cout << "dynamicInit2 called" << std::endl; + } + + void dynamicInit3(){ + std::cout << "dynamicInit3 called" << std::endl; + } + + unsigned int m_initCnt{0}; + std::vector > m_dynamicInit; +}; +``` + +在 `Frontend` 完成实例化后,`tick()` 函数会被后端以固定的时间时间调用。例如,你可以每 200 毫秒调用一次: + +``` +int main(int argc, char* argv[]){ + Frontend frontendInstance; + + while(true){ + frontendInstance.tick(); // 仅用于模拟目的 + std::this_thread::sleep_for(std::chrono::milliseconds(200)); + } +} +``` + +`Fronted` 有三个额外的初始化函数,它们必须根据 `m_ticks` 的值来选择调用哪个。在 ticks 等于何值调用哪个初始化函数的信息存储在数组 `m_dynamicInit` 中。在构造函数(`Frontend()`)中,将此信息附加到数组中,以便在 5、10 和 15 个 tick 后调用其他初始化函数。当后端调用 `tick()` 函数时,`m_ticks` 值会递增,同时遍历数组 `m_dynamicInit` 以检查是否必须调用初始化函数。 + +如果是这种情况,则必须通过引用 `this` 指针来取消引用成员函数指针: + +``` +((*this).*(it->init))() +``` + +### 总结 + +如果你并不熟悉类成员函数指针,它们可能会显得有些复杂。我做了很多尝试和经历了很多错误,花了一些时间来找到正确的语法。然而,一旦你理解了一般原理后,方法指针就变得不那么可怕了。 + +这是迄今为止我在 C++ 中发现的最复杂的语法。 你还知道更糟糕的吗? 在评论中发布你的观点! + +-------------------------------------------------------------------------------- + +via: https://opensource.com/article/21/2/ccc-method-pointers + +作者:[Stephan Avenwedde][a] +选题:[lujun9972][b] +译者:[萌新阿岩](https://github.com/mengxinayan) +校对:[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/coffee_tea_laptop_computer_work_desk.png?itok=D5yMx_Dr (Person drinking a hot drink at the computer) +[2]: https://en.wikipedia.org/wiki/C++ +[3]: https://en.wikipedia.org/wiki/Function_pointer#Method_pointers +[4]: https://github.com/hANSIc99/worst_possible_syntax +[5]: https://en.wikipedia.org/wiki/Static_(keyword)#Static_method +[6]: https://en.wikipedia.org/wiki/Dynamic_dispatch +[7]: https://en.wikipedia.org/wiki/Client%E2%80%93server_model diff --git a/published/202106/20210325 Identify Linux performance bottlenecks using open source tools.md b/published/202106/20210325 Identify Linux performance bottlenecks using open source tools.md new file mode 100644 index 0000000000..55b95a5034 --- /dev/null +++ b/published/202106/20210325 Identify Linux performance bottlenecks using open source tools.md @@ -0,0 +1,265 @@ +[#]: subject: (Identify Linux performance bottlenecks using open source tools) +[#]: via: (https://opensource.com/article/21/3/linux-performance-bottlenecks) +[#]: author: (Howard Fosdick https://opensource.com/users/howtech) +[#]: collector: (lujun9972) +[#]: translator: (wxy) +[#]: reviewer: (wxy) +[#]: publisher: (wxy) +[#]: url: (https://linux.cn/article-13462-1.html) + +使用开源工具识别 Linux 的性能瓶颈 +====== + +> 不久前,识别硬件瓶颈还需要深厚的专业知识。今天的开源 GUI 性能监视器使它变得相当简单。 + +![](https://img.linux.net.cn/data/attachment/album/202106/07/000141z5shv5nzxeln5y5c.jpg) + +计算机是一个集成的系统,它的性能取决于最慢的硬件组件。如果一个组件的能力比其他组件差,性能落后而不能跟上,它就会拖累你的整个系统。这就是一个 _性能瓶颈_。消除一个严重的瓶颈可以使你的系统飞起来。 + +本文解释了如何识别 Linux 系统中的硬件瓶颈。这些技术同时适用于个人的电脑和服务器。我强调的是个人电脑 —— 我不会涉及局域网管理或数据库系统等领域的服务器特定的瓶颈。这些通常涉及专门的工具。 + +我也不会多谈解决方案。这对本文来说是个太大的话题。相反,我将写一篇关于性能调整的后续文章。 + +我将只使用开源的图形用户界面(GUI)工具来完成这项工作。大多数关于 Linux 瓶颈的文章都相当复杂。它们使用专门的命令,并深入研究神秘的细节。 + +开源提供的 GUI 工具使得识别许多瓶颈变得简单。我的目标是给你一个快速、简单的方法,你可以在任何地方使用。 + +### 从哪里开始 + +一台计算机由六个关键的硬件资源组成。 + + * 处理器 + * 内存 + * 存储器 + * USB 端口 + * 互联网连接 + * 图形处理器 + +如果任何一个资源表现不佳,就会产生一个性能瓶颈。为了识别瓶颈,你必须监测这六种资源。 + +开源提供了大量的工具来完成这项工作。我会使用 [GNOME 系统监视器][2]。它的输出很容易理解,而且你可以在大多数软件库中找到它。 + +启动它并点击“资源”标签。你可以马上发现许多性能问题。 + +![系统监控-资源面板][3] + +*图 1. 系统监控器发现问题。(Howard Fosdick, [CC BY-SA 4.0][4])* + +在“资源”面板上显示三个部分:CPU 历史、内存和交换历史,以及网络历史。一眼就能看出你的处理器是否不堪负荷了,还是你的电脑没有内存了,抑或你的网络带宽被用光了。 + +我将在下面探讨这些问题。现在,当你的电脑速度变慢时,首先检查系统监视器。它可以立即为你提供最常见的性能问题的线索。 + +现在让我们来探讨一下如何识别特定方面的瓶颈。 + +### 如何识别处理器的瓶颈 + +要发现瓶颈,你必须首先知道你有什么硬件。开源为这个目的提供了几个工具。我喜欢 [HardInfo][5],因为它的屏幕显示很容易阅读,而且广泛流行。 + +启动 HardInfo。它的“计算机->摘要”面板可以识别你的 CPU 并告诉你它的核心数、线程数和速度。它还能识别你的主板和其他计算机部件。 + +![HardInfo Summary Panel][6] + +*图 2. HardInfo 显示了硬件细节。(Howard Fosdick, [CC BY-SA 4.0][4])* + +HardInfo 显示,这台计算机有一个物理 CPU 芯片。该芯片包含两个处理器(或称为核心)。每个核心支持两个线程(或称为逻辑处理器)。这就是总共四个逻辑处理器 —— 正是图 1 中系统监控器的 CPU 历史部分所显示的。 + +当处理器不能在其时间内对请求做出反应时,就会出现 _处理器瓶颈_,说明它们已经很忙了。 + +当系统监控器显示逻辑处理器的利用率持续在 80% 或 90% 以上时,你就可以确定这一点。这里有一个例子,四个逻辑处理器中有三个被淹没在 100% 的利用率中。这是一个瓶颈,因为它没有留下多少 CPU 用于其他工作。 + +![系统监视器的处理器瓶颈][7] + +*图 3. 一个处理器的瓶颈。(Howard Fosdick, [CC BY-SA 4.0][4])* + +#### 哪个程序导致了这个问题? + +你需要找出是哪个程序在消耗所有的 CPU。点击系统监视器的“进程”标签。然后点击“CPU 百分比”标头,根据它们消耗的 CPU 的多少对进程进行排序。你将看到哪些应用程序正在扼杀你的系统。 + +![系统监控进程面板][8] + +*图 4. 识别违规的进程。(Howard Fosdick, [CC BY-SA 4.0][4])* + +前三个进程各消耗了 _总 CPU 资源的 24%_。由于有四个逻辑处理器,这意味着每个进程消耗了一整个处理器。这就像图 3 所示。 + +在“进程”面板上,一个名为“analytical_AI”的程序被确定为罪魁祸首。你可以在面板上右键单击它,以查看其资源消耗的更多细节,包括内存使用、它所打开的文件、其输入/输出细节,等等。 + +如果你的登录会话有管理员权限,你可以管理这个进程。你可以改变它的优先级,并停止、继续、结束或杀死它。因此,你可以在这里立即解决你的瓶颈问题。 + +![系统监视器管理一个进程][9] + +*图 5. 右键点击一个进程来管理它。(Howard Fosdick, [CC BY-SA 4.0][4])* + +如何解决处理瓶颈问题?除了实时管理违规的进程外,你也可以防止瓶颈的发生。例如,你可以用另一个应用程序来代替违规进程,绕过它,改变你使用该应用程序的行为,将该应用程序安排在非工作时间,解决潜在的内存问题,对该应用程序或你的系统软件进行性能调整,或升级你的硬件。这里涉及的内容太多,所以我将在下一篇文章中探讨这些方式。 + +#### 常见的处理器瓶颈 + +在用系统监控器监控你的 CPU 时,你会遇到几种常见的瓶颈问题。 + +有时一个逻辑处理器出现瓶颈,而其他所有的处理器都处于低利用率。这意味着你有一个应用程序,它的代码不够智能,无法利用一个以上的逻辑处理器,而且它已经把正在使用的那个处理器耗尽了。这个应用程序完成的时间将比使用更多的处理器要长。但另一方面,至少它能让你的其他处理器腾出手来做别的工作,而不会接管你的电脑。 + +你也可能看到一个逻辑处理器永远停留在 100% 的利用率。要么它非常忙,要么是一个进程被挂起了。判断它是否被挂起的方法是,是看该进程是否从不进行任何磁盘活动(正如系统监视器“进程”面板所显示的那样)。 + +最后,你可能会注意到,当你所有的处理器都陷入瓶颈时,你的内存也被完全利用了。内存不足的情况有时会导致处理器瓶颈。在这种情况下,你要解决的是根本的内存问题,而不是体现出症状的 CPU 问题。 + +### 如何识别内存瓶颈 + +鉴于现代 PC 中有大量的内存,内存瓶颈比以前要少得多。然而,如果你运行内存密集型程序,特别是当你的计算机没有很多的随机存取内存(RAM)时,你仍然可能遇到这些问题。 + +Linux [使用内存][10] 既用于程序,也用于缓存磁盘数据。后者加快了磁盘数据的访问速度。Linux 可以在它需要的任何时候回收这些内存供程序使用。 + +系统监视器的“资源”面板显示了你的总内存和它被使用的程度。在“进程”面板上,你可以看到单个进程的内存使用情况。 + +下面是系统监控器“资源”面板中跟踪总内存使用的部分。 + +![系统监控器的内存瓶颈][11] + +*图 6. 一个内存瓶颈。(Howard Fosdick, [CC BY-SA 4.0][4])* + +在“内存”的右边,你会注意到 [交换空间][12]。这是 Linux 在内存不足时使用的磁盘空间。它将内存写入磁盘以继续操作,有效地将交换空间作为你的内存的一个较慢的扩展。 + +你要注意的两个内存性能问题是: + +1. 内存被大量使用,而且你看到交换空间的活动频繁或不断增加。 +2. 内存和交换空间都被大量使用。 + +情况一意味着更慢的性能,因为交换空间总是比内存更慢。你是否认为这是一个性能问题,取决于许多因素(例如,你的交换空间有多活跃、它的速度、你的预期,等等)。我的看法是,对于现代个人电脑来说,交换空间任何超过象征性的使用都是不可接受的。 + +情况二是指内存和交换空间都被大量使用。这是一个 _内存瓶颈_。计算机变得反应迟钝。它甚至可能陷入一种“咆哮”的状态,在这种状态下,除了内存管理之外,它几乎不能完成其他任务。 + +上面的图 6 显示了一台只有 2GB 内存的旧电脑。当内存使用量超过 80% 时,系统开始向交换空间写入,响应速度下降了。这张截图显示了内存使用量超过了 90%,而且这台电脑已经无法使用。 + +解决内存问题的最终答案是要么少用内存,要么多买内存。我将在后续文章中讨论解决方案。 + +### 如何识别存储瓶颈 + +如今的存储有固态和机械硬盘等多个品种。设备接口包括 PCIe、SATA、雷电和 USB。无论有哪种类型的存储,你都要使用相同的程序来识别磁盘瓶颈。 + +从系统监视器开始。它的“进程”面板显示各个进程的输入/输出率。因此,你可以快速识别哪些进程做了最多的磁盘 I/O。 + +但该工具并不显示每个磁盘的总数据传输率。你需要查看特定磁盘上的总负载,以确定该磁盘是否是一个存储瓶颈。 + +要做到这一点,使用 [atop][13] 命令。它在大多数 Linux 软件库中都有。 + +只要在命令行提示符下输入 `atop` 即可。下面的输出显示,设备 `sdb` 达到 `busy 101%`。很明显,它已经达到了性能极限,限制了你的系统完成工作的速度。 + +![atop 磁盘瓶颈][14] + +*图 7. atop 命令识别了一个磁盘瓶颈。(Howard Fosdick, [CC BY-SA 4.0][4])* + +注意到其中一个 CPU 有 85% 的时间在等待磁盘完成它的工作(`cpu001 w 85%`)。这是典型的存储设备成为瓶颈的情况。事实上,许多人首先看 CPU 的 I/O 等待时间来发现存储瓶颈。 + +因此,要想轻松识别存储瓶颈,请使用 `atop` 命令。然后使用系统监视器上的“进程”面板来识别导致瓶颈的各个进程。 + +### 如何识别 USB 端口的瓶颈 + +有些人整天都在使用他们的 USB 端口。然而,他们从不检查这些端口是否被最佳地使用。无论你是插入外部磁盘、U 盘,还是其他东西,你都要确认你是否从 USB 连接的设备中获得了最大性能。 + +这个图表显示了原因。潜在的 USB 数据传输率差异 _很大_。 + +![USB 标准][15] + +*图 8. USB 速度变化很大。(Howard Fosdick,根据 [Tripplite][16] 和 [Wikipedia][17] 提供的数字,[CC BY-SA 4.0][4])* + +HardInfo 的“USB 设备”标签显示了你的计算机支持的 USB 标准。大多数计算机提供不止一种速度。你怎么知道一个特定端口的速度呢?供应商对它们进行颜色编码,如图表中所示。或者你可以在你的计算机的文档中查找。 + +要看到你得到的实际速度,可以使用开源的 [GNOME 磁盘][18] 程序进行测试。只要启动 GNOME 磁盘,选择它的“磁盘基准”功能,然后运行一个基准测试。这将告诉你在一个端口插入特定设备时,你将得到的最大实际速度。 + +你可能会得到不同的端口传输速度,这取决于你将哪个设备插入它。数据速率取决于端口和设备的特定组合。 + +例如,一个可以以 3.1 速度运行的设备如果使用 2.0 端口就会以 2.0 的速度运行。(而且它不会告诉你它是以较慢的速度运行的!)相反,如果你把一个 USB 2.0 设备插入 3.1 端口,它能工作,但速度是 2.0 的速度。所以要获得快速的 USB,你必须确保端口和设备都支持它。GNOME 磁盘为你提供了验证这一点的方法。 + +要确定 USB 的处理瓶颈,使用你对固态和硬盘所做的同样程序。运行 `atop` 命令来发现 USB 存储瓶颈。然后,使用系统监视器来获取违规进程的详细信息。 + +### 如何识别互联网带宽瓶颈 + +系统监控器的“资源”面板会实时告诉你互联网连接速度(见图 1)。 + +有 [很好的 Python 工具][19] 可以测试你的最大网速,但你也可以在 [Speedtest][20]、[Fast.com][21] 和 [Speakeasy][22] 等网站进行测试。为了获得最佳结果,关闭所有东西,只运行 _速度测试_;关闭你的虚拟私有网络;在一天中的不同时间运行测试;并比较几个测试网站的结果。 + +然后将你的结果与你的供应商声称的下载和上传速度进行比较。这样,你就可以确认你得到的是你所付费的速度。 + +如果你有一个单独的路由器,在有和没有它的情况下进行测试。这可以告诉你,你的路由器是否是一个瓶颈。如果你使用 WiFi,在有 WiFi 和没有 WiFi 的情况下进行测试(通过将你的笔记本电脑直接与调制解调器连接)。我经常看到人们抱怨他们的互联网供应商,而实际上他们只是有一个 WiFi 瓶颈,可以自己解决。 + +如果某些程序正在消耗你的整个互联网连接,你想知道是哪一个。通过使用 `nethogs` 命令找到它。它在大多数软件库中都有。 + +有一天,我的系统监视器突然显示我的互联网访问量激增。我只是在命令行中输入了 `nethogs`,它立即确定带宽消耗者是 Clamav 防病毒更新。 + +![Nethogs][23] + +*图 9. Nethogs 识别带宽用户。(Howard Fosdick, [CC BY-SA 4.0][4])* + +### 如何识别图形处理瓶颈 + +如果你把显示器插在台式电脑后面的主板上,你就在使用 _板载显卡_。如果你把它插在后面的卡上,你就有一个专门的图形子系统。大多数人称它为 _视频卡_ 或 _显卡_。对于台式电脑来说,附加显卡通常比主板上的显卡更强大、更昂贵。笔记本电脑总是使用板载显卡。 + +HardInfo 的“PCI 设备”面板告诉你关于你的图形处理单元(GPU)。它还显示你的专用视频内存的数量(寻找标有“可预取”的内存)。 + +![视频芯片组信息][24] + +*图 10. HardInfo提供图形处理信息。(Howard Fosdick, [CC BY-SA 4.0][4])* + +CPU 和 GPU [非常密切地][25] 一起工作。简而言之,CPU 为 GPU 准备渲染的帧,然后 GPU 渲染这些帧。 + +当你的 CPU 在等待 100% 繁忙的 GPU 时,就会出现 _GPU 瓶颈_。 + +为了确定这一点,你需要监控 CPU 和 GPU 的利用率。像 [Conky][26] 和 [Glances][27] 这样的开源监控器,如果它们的扩展插件支持你的图形芯片组,就可以做到这一点。 + +看一下 Conky 的这个例子。你可以看到,这个系统有很多可用的 CPU。GPU 只有 25% 的使用率。想象一下,如果这个 GPU 的数量接近 100%。那么你就会知道 CPU 在等待 GPU,你就会有一个 GPU 的瓶颈。 + +![Conky CPU 和 GPU 监控][28] + +*图 11. Conky 显示 CPU 和 GPU 的利用率。 (图片来源:[AskUbuntu论坛][29])* + +在某些系统上,你需要一个供应商专属的工具来监控你的 GPU。它们可以从 GitHub 上下载,并在 [GPU 监控和诊断命令行工具][30] 这篇文章中有所描述。 + +### 总结 + +计算机由一系列集成的硬件资源组成。如果它们中的任何一个在工作量上远远落后于其他资源,就会产生性能瓶颈。这可能会拖累你的整个系统。你需要能够识别和纠正瓶颈,以实现最佳性能。 + +不久前,识别瓶颈需要深厚的专业知识。今天的开源 GUI 性能监控器使它变得相当简单。 + +在我的下一篇文章中,我将讨论改善你的 Linux 电脑性能的具体方法。同时,请在评论中分享你自己的经验。 + +-------------------------------------------------------------------------------- + +via: https://opensource.com/article/21/3/linux-performance-bottlenecks + +作者:[Howard Fosdick][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/howtech +[b]: https://github.com/lujun9972 +[1]: https://opensource.com/sites/default/files/styles/image-full-size/public/lead-images/BUSINESS_lightning.png?itok=wRzjWIlm (Lightning in a bottle) +[2]: https://wiki.gnome.org/Apps/SystemMonitor +[3]: https://opensource.com/sites/default/files/uploads/1_system_monitor_resources_panel.jpg (System Monitor - Resources Panel ) +[4]: https://creativecommons.org/licenses/by-sa/4.0/ +[5]: https://itsfoss.com/hardinfo/ +[6]: https://opensource.com/sites/default/files/uploads/2_hardinfo_summary_panel.jpg (HardInfo Summary Panel) +[7]: https://opensource.com/sites/default/files/uploads/3_system_monitor_100_processor_utilization.jpg (System Monitor processor bottleneck) +[8]: https://opensource.com/sites/default/files/uploads/4_system_monitor_processes_panel.jpg (System Monitor Processes panel) +[9]: https://opensource.com/sites/default/files/uploads/5_system_monitor_manage_a_process.jpg (System Monitor managing a process) +[10]: https://www.networkworld.com/article/3394603/when-to-be-concerned-about-memory-levels-on-linux.html +[11]: https://opensource.com/sites/default/files/uploads/6_system_monitor_out_of_memory.jpg (System Monitor memory bottleneck) +[12]: https://opensource.com/article/18/9/swap-space-linux-systems +[13]: https://opensource.com/life/16/2/open-source-tools-system-monitoring +[14]: https://opensource.com/sites/default/files/uploads/7_atop_storage_bottleneck.jpg (atop disk bottleneck) +[15]: https://opensource.com/sites/default/files/uploads/8_usb_standards_speeds.jpg (USB standards) +[16]: https://www.samsung.com/us/computing/memory-storage/solid-state-drives/ +[17]: https://en.wikipedia.org/wiki/USB +[18]: https://wiki.gnome.org/Apps/Disks +[19]: https://opensource.com/article/20/1/internet-speed-tests +[20]: https://www.speedtest.net/ +[21]: https://fast.com/ +[22]: https://www.speakeasy.net/speedtest/ +[23]: https://opensource.com/sites/default/files/uploads/9_nethogs_bandwidth_consumers.jpg (Nethogs) +[24]: https://opensource.com/sites/default/files/uploads/10_hardinfo_video_card_information.jpg (Video Chipset Information) +[25]: https://www.wepc.com/tips/cpu-gpu-bottleneck/ +[26]: https://itsfoss.com/conky-gui-ubuntu-1304/ +[27]: https://opensource.com/article/19/11/monitoring-linux-glances +[28]: https://opensource.com/sites/default/files/uploads/11_conky_cpu_and_gup_monitoring.jpg (Conky CPU and GPU monitoring) +[29]: https://askubuntu.com/questions/387594/how-to-measure-gpu-usage +[30]: https://www.cyberciti.biz/open-source/command-line-hacks/linux-gpu-monitoring-and-diagnostic-commands/ diff --git a/published/202106/20210427 Upgrade your Linux PC hardware-using open source tools.md b/published/202106/20210427 Upgrade your Linux PC hardware-using open source tools.md new file mode 100644 index 0000000000..7ddd890346 --- /dev/null +++ b/published/202106/20210427 Upgrade your Linux PC hardware-using open source tools.md @@ -0,0 +1,251 @@ +[#]: subject: (Upgrade your Linux PC hardware using open source tools) +[#]: via: (https://opensource.com/article/21/4/upgrade-linux-hardware) +[#]: author: (Howard Fosdick https://opensource.com/users/howtech) +[#]: collector: (lujun9972) +[#]: translator: (wxy) +[#]: reviewer: (wxy) +[#]: publisher: (wxy) +[#]: url: (https://linux.cn/article-13472-1.html) + +使用开源工具升级你的 Linux PC 硬件 +====== + +> 升级你的电脑硬件来提升性能,以获得最大的回报。 + +![](https://img.linux.net.cn/data/attachment/album/202106/09/204443k8dz09dddhd7xu65.jpg) + +在我的文章《[使用开源工具识别 Linux 性能瓶颈][2]》中,我解释了一些使用开源的图形用户界面(GUI)工具监测 Linux 性能的简单方法。我的重点是识别 _性能瓶颈_,即硬件资源达到极限并阻碍你的 PC 性能的情况。 + +你会如何解决性能瓶颈问题呢?你可以调整应用程序或系统软件。或者你可以运行更高效的应用程序。你甚至可以改变你使用电脑的行为,例如,将后台程序安排在非工作时间。 + +你也可以通过硬件升级来提高电脑的性能。本文重点介绍可以给你带来最大回报的升级。 + +开源工具是关键。GUI 工具可以帮助你监控你的系统,预测哪些硬件改进会有效。否则,你可能买了硬件后发现它并没有提高性能。在升级之后,这些工具也有助于验证升级是否产生了你预期的好处。 + +这篇文章概述了一种简单的 PC 硬件升级的方法,其“秘诀”是开源的 GUI 工具。 + +### 如何升级内存 + +几年前,升级内存是不用多想的。增加内存几乎总是能提高性能。 + +今天,情况不再是这样了。个人电脑配备了更多的内存,而且 Linux 能非常有效地使用它。如果你购买了系统用不完的内存,就浪费了钱。 + +因此,你要花一些时间来监测你的电脑,看看内存升级是否会有助于提升它的性能。例如,在你进行典型的一天工作时观察内存的使用情况。而且一定要检查在内存密集型工作负载中发生了什么。 + +各种各样的开源工具可以帮助你进行这种监测,不过我用的是 [GNOME 系统监视器][3]。它在大多数 Linux 软件库中都有。 + +当你启动系统监视器时,它的“资源”面板会显示这样的输出: + +![用 GNOME 系统监控器监控内存][4] + +*图 1. 用 GNOME 系统监视器监控内存 (Howard Fosdick, [CC BY-SA 4.0][5])* + +屏幕中间显示了内存的使用情况。[交换空间][6] 是 Linux 在内存不足时使用的磁盘空间。Linux 通过使用交换空间作为内存的一个较慢的扩展来有效地增加内存。 + +由于交换空间比内存慢,如果内存交换活动变得显著,增加内存将改善你的计算机的性能。你会得到多大的改善取决于交换活动的数量和交换空间所在的设备的速度。 + +如果使用了大量的交换空间,你通过增加内存会得到比只使用了少量交换空间更多的性能改善。 + +如果交换空间位于慢速的机械硬盘上,你会发现增加内存比将交换空间放在最快的固态硬盘上改善更多。 + +下面是一个关于何时增加内存的例子。这台电脑在内存利用率达到 80% 后显示交换活动在增加。当内存利用率超过 90% 时,它就变得失去反应了。 + +![系统监控 - 内存不足的情况][7] + +*图 2. 内存升级会有帮助(Howard Fosdick, [CC BY-SA 4.0][5])* + +#### 如何进行内存升级 + +在升级之前,你需要确定你有多少个内存插槽,有多少个是空的,它们需要什么样的内存条,以及你的主板所允许的最大内存。 + +你可以阅读你的计算机的文档来获得这些答案。或者,你可以直接输入这些 Linux 命令行: + +问题 | 命令 +---|--- +已安装的内存条有什么特点? | `sudo lshw -short -C memory` +这台计算机允许的最大内存是多少? | `sudo dmidecode -t memory | grep -i max` +有多少个内存插槽是空的?(没有输出意味着没有可用的) | `sudo lshw -short -C memory | grep -i empty` + +与所有的硬件升级一样,事先拔掉计算机的电源插头。在你接触硬件之前,将自己接地 —— 即使是最微小的电涌也会损坏电路。将内存条完全插入主板的插槽中。 + +升级后,启动系统监视器。运行之前使你的内存超载的相同程序。 + +系统监控器应该显示出你扩充的内存,而且你应该发现性能更好了。 + +### 如何升级存储 + +我们正处在一个存储快速改进的时代。即使是只用了几年的计算机也可以从磁盘升级中受益。但首先,你要确保升级对你的计算机和工作负载是有意义的。 + +首先,要找出你有什么磁盘。许多开源工具会告诉你。[Hardinfo][8] 或 [GNOME 磁盘][9] 是不错的选择,因为它们都是广泛可用的,而且它们的输出很容易理解。这些应用程序会告诉你磁盘的品牌、型号和其他细节。 + +接下来,通过基准测试来确定你的磁盘性能。GNOME 磁盘让这一切变得简单。只要启动该工具并点击它的“磁盘基准测试”选项。这会给出你磁盘的读写率和平均磁盘访问时间。 + +![GNOME 磁盘基准测试][10] + +*图 3. GNOME 磁盘基准输出(Howard Fosdick, [CC BY-SA 4.0][5])* + +有了这些信息,你可以在 [PassMark Software][11] 和 [UserBenchmark][12] 等基准测试网站上将你的磁盘与其他人进行比较。这些网站提供性能统计、速度排名,甚至价格和性能数字。你可以了解到你的磁盘与可能的替代品相比的情况。 + +下面是你可以在 UserBenchmark 找到的一些详细磁盘信息的例子。 + +![UserBenchmark 的磁盘比较][13] + +*图 4. 在 [UserBenchmark][14] 进行的磁盘比较* + +#### 监测磁盘利用率 + +就像你对内存所做的那样,实时监控你的磁盘,看看更换磁盘是否会提高性能。[atop 命令行][15] 会告诉你一个磁盘的繁忙程度。 + +在它下面的输出中,你可以看到设备 `sdb` 是 `busy 101%`。其中一个处理器有 85% 的时间在等待该磁盘进行工作(`cpu001 w 85%`)。 + +![atop 命令显示磁盘利用率][16] + +*图 5. atop 命令显示磁盘利用率(Howard Fosdick, [CC BY-SA 4.0][5])* + +很明显,你可以用一个更快的磁盘来提高性能。 + +你也会想知道是哪个程序使用了磁盘。只要启动系统监视器并点击其“进程”标签。 + +现在你知道了你的磁盘有多忙,以及哪些程序在使用它,所以你可以做出一个有根据的判断,是否值得花钱买一个更快的磁盘。 + +#### 购买磁盘 + +购买新的内置磁盘时,你会遇到三种主流技术: + + * 机械硬盘(HDD) + * SATA 接口的固态硬盘(SSD) + * PCIe 接口的 NVMe 固态磁盘(NVMe SSD) + +它们的速度差异是什么?你会在网上看到各种不同的数字。这里有一个典型的例子。 + +![相对磁盘速度][17] + +*图 6. 内部磁盘技术的相对速度([Unihost][18])* + + * **红色柱形图:** 机械硬盘提供最便宜的大容量存储。但就性能而言,它们是迄今为止最慢的。 + * **绿色柱形图:** 固态硬盘比机械硬盘快。但如果固态硬盘使用 SATA 接口,就会限制其性能。这是因为 SATA 接口是十多年前为机械硬盘设计的。 + * **蓝色柱形图:** 最快的内置磁盘技术是新的 [PCIe 接口的 NVMe 固态盘][19]。这些可以比 SATA 连接的固态硬盘大约快 5 倍,比机械硬盘快 20 倍。 + +对于外置 SSD,你会发现 [最新的雷电接口和 USB 接口][20] 是最快的。 + +#### 如何安装一个内置磁盘 + +在购买任何磁盘之前,请确认你的计算机支持必要的物理接口。 + +例如,许多 NVMe 固态硬盘使用流行的新 M.2(2280)外形尺寸。这需要一个量身定做的主板插槽、一个 PCIe 适配器卡,或一个外部 USB 适配器。你的选择可能会影响你的新磁盘的性能。 + +在安装新磁盘之前,一定要备份你的数据和操作系统。然后把它们复制到新磁盘上。像 Clonezilla、Mondo Rescue 或 GParted 这样的开源 [工具][21] 可以完成这项工作。或者你可以使用 Linux 命令行,如 `dd` 或 `cp`。 + +请确保在最有影响的情况下使用你的快速新磁盘。把它用作启动盘、存储操作系统和应用程序、交换空间,以及最常处理的数据。 + +升级之后,运行 GNOME 磁盘来测试你的新磁盘。这可以帮助你验证你是否得到了预期的性能提升。你可以用 `atop` 命令来验证实时运行。 + +### 如何升级 USB 端口 + +与磁盘存储一样,USB 的性能在过去几年中也有了长足的进步。许多只用了几年的计算机只需增加一个廉价的 USB 端口卡就能获得很大的性能提升。 + +这种升级是否值得,取决于你使用端口的频率。很少使用它们,如果它们很慢也没有关系。经常使用它们,升级可能真的会影响你的工作。 + +下面是不同端口标准的最大 USB 数据速率的巨大差异。  + +![USB 速度][22] + +*图 7. USB 速度差别很大(Howard Fosdick,[CC BY-SA 4.0][5],基于 [Tripplite][23] 和 [维基][24] 的数据* + +要查看你得到的实际 USB 速度,请启动 GNOME 磁盘。GNOME 磁盘可以对 USB 连接的设备进行基准测试,就像对内部磁盘一样。选择其“磁盘基准测试”选项。 + +你插入的设备和 USB 端口共同决定了你将得到的速度。如果端口和设备不匹配,你将体验到两者中较慢的速度。 + +例如,将一个支持 USB 3.1 速度的设备连接到一个 2.0 端口,你将得到 2.0 的数据速率。你的系统不会告诉你这一点,除非你用 GNOME 磁盘这样的工具来检查)。反之,将 2.0 设备连接到 3.1 端口,你也会得到 2.0 的速度。因此,为了获得最好的结果,总是要匹配你的端口和设备的速度。 + +要实时监控 USB 连接的设备,请使用 `atop` 命令和系统监控器,就像你监控内部磁盘一样。这可以帮助你看到是否碰到了当前设置的限制,并可以通过升级而受益。 + +升级你的端口很容易。只要购买一个适合你的空闲的 PCIe 插槽的 USB 卡。 + +USB 3.0 卡的价格只有 25 美元左右。较新、较贵的卡提供 USB 3.1 和 3.2 端口。几乎所有的 USB 卡都是即插即用的,所以 Linux 会自动识别它们。但在购买前一定要核实。 + +请确保在升级后运行 GNOME 磁盘以验证新的速度。 + +### 如何升级你的互联网连接 + +升级你的互联网带宽很容易。只要给你的 ISP 写一张支票即可。 + +问题是,应该升级吗? + +系统监控器显示了你的带宽使用情况(见图 1)。如果你经常遇到你从 ISP 购买的带宽限额,你会从购买更高的限额中受益。 + +但首先,要确认你是否有一个可以自己解决的问题。我见过很多案例,有人认为他们需要从 ISP 那里购买更多的带宽,而实际上他们只是有一个可以自己解决的连接问题。 + +首先在 [Speedtest][25] 或 [Fast.com][26] 等网站测试你的最大网速。为了获得准确的结果,关闭所有程序,只运行速度测试;关闭你的虚拟私有网络;在一天中的不同时间运行测试;并比较几个测试网站的结果。如果你使用 WiFi,在有 WiFi 和没有 WiFi 的情况下进行测试(将你的笔记本电脑直接与调制解调器连接)。 + +如果你有一个单独的路由器,在有它和没有它的情况下进行测试。这将告诉你路由器是否是瓶颈。有时,只是重新定位你家里的路由器或更新其固件就能提高连接速度。 + +这些测试将验证你是否得到了你从 ISP 购买的带宽速度。它们也会暴露出任何你可以自己解决的本地 WiFi 或路由器问题。 + +只有在你做了这些测试之后,你才应该得出结论,你需要购买更多的网络带宽。 + +### 你应该升级你的 CPU 还是 GPU? + +升级你的 CPU(中央处理单元)或 GPU(图形处理单元)呢? + +笔记本电脑用户通常不能升级这两个单元,因为它们被焊接在主板上。 + +大多数台式机主板支持一系列的 CPU,并且是可以升级的 —— 假设你还没有使用该系列中最顶级的处理器。 + +使用系统监视器观察你的 CPU,并确定升级是否有帮助。它的“资源”面板将显示你的 CPU 负载。如果你的所有逻辑处理器始终保持在 80% 或 90% 以上,你可以从更多的 CPU 功率中受益。 + +这是一个升级 CPU 的有趣项目。只要小心谨慎,任何人都可以做到这一点。 + +不幸的是,这几乎没有成本效益。大多数卖家对单个 CPU 芯片收取溢价,比他们卖给你的新系统要高。因此,对许多人来说,升级 CPU 并不具有经济意义。 + +如果你将显示器直接插入台式机的主板,你可能会通过升级图形处理器而受益。只需添加一块显卡。 + +诀窍是在新显卡和你的 CPU 之间实现平衡的工作负荷。这个 [在线工具][27] 能准确识别哪些显卡能与你的 CPU 最好地配合。[这篇文章][28] 详细解释了如何去升级你的图形处理。 + +### 在升级前收集数据 + +个人电脑用户有时会根据直觉来升级他们的 Linux 硬件。一个更好的方法是先监控性能并收集一些数据。开源的 GUI 工具使之变得简单。它们有助于预测硬件升级是否值得你花时间和金钱。然后,在你升级之后,你可以用它们来验证你的改变是否达到了预期效果。 + +这些是最常见的硬件升级。只要稍加努力并使用正确的开源工具,任何 Linux 用户都可以经济有效地升级一台 PC。 + +-------------------------------------------------------------------------------- + +via: https://opensource.com/article/21/4/upgrade-linux-hardware + +作者:[Howard Fosdick][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/howtech +[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://linux.cn/article-13462-1.html +[3]: https://vitux.com/how-to-install-and-use-task-manager-system-monitor-in-ubuntu/ +[4]: https://opensource.com/sites/default/files/uploads/system_monitor_-_resources_panel_0.jpg (Monitoring memory with GNOME System Monitor) +[5]: https://creativecommons.org/licenses/by-sa/4.0/ +[6]: https://opensource.com/article/18/9/swap-space-linux-systems +[7]: https://opensource.com/sites/default/files/uploads/system_monitor_-_out_of_memory_0.jpg (System Monitor - Out Of Memory Condition) +[8]: https://itsfoss.com/hardinfo/ +[9]: https://en.wikipedia.org/wiki/GNOME_Disks +[10]: https://opensource.com/sites/default/files/uploads/gnome_disks_-_benchmark_0.jpg (GNOME Disks benchmark) +[11]: https://www.harddrivebenchmark.net/ +[12]: https://www.userbenchmark.com/ +[13]: https://opensource.com/sites/default/files/uploads/userbenchmark_disk_comparisons_0.jpg (Disk comparisons at UserBenchmark) +[14]: https://ssd.userbenchmark.com/ +[15]: https://opensource.com/life/16/2/open-source-tools-system-monitoring +[16]: https://opensource.com/sites/default/files/uploads/atop_-_storage_bottleneck_0.jpg (atop command shows disk utilization) +[17]: https://opensource.com/sites/default/files/uploads/hdd_vs_ssd_vs_nvme_speeds_0.jpg (Relative disk speeds) +[18]: https://unihost.com/help/nvme-vs-ssd-vs-hdd-overview-and-comparison/ +[19]: https://www.trentonsystems.com/blog/pcie-gen4-vs-gen3-slots-speeds +[20]: https://www.howtogeek.com/449991/thunderbolt-3-vs.-usb-c-whats-the-difference/ +[21]: https://www.linuxlinks.com/diskcloning/ +[22]: https://opensource.com/sites/default/files/uploads/usb_standards_-_speeds_0.jpg (USB speeds) +[23]: https://www.tripplite.com/products/usb-connectivity-types-standards +[24]: https://en.wikipedia.org/wiki/USB +[25]: https://www.speedtest.net/ +[26]: https://fast.com/ +[27]: https://www.gpucheck.com/gpu-benchmark-comparison +[28]: https://helpdeskgeek.com/how-to/see-how-much-your-cpu-bottlenecks-your-gpu-before-you-buy-it/ diff --git a/published/202106/20210517 Convenient matrices and other improvements Python 3.5 brought us.md b/published/202106/20210517 Convenient matrices and other improvements Python 3.5 brought us.md new file mode 100644 index 0000000000..10ee2c88b7 --- /dev/null +++ b/published/202106/20210517 Convenient matrices and other improvements Python 3.5 brought us.md @@ -0,0 +1,165 @@ +[#]: subject: (Convenient matrices and other improvements Python 3.5 brought us) +[#]: via: (https://opensource.com/article/21/5/python-35-features) +[#]: author: (Moshe Zadka https://opensource.com/users/moshez) +[#]: collector: (lujun9972) +[#]: translator: (geekpi) +[#]: reviewer: (wxy) +[#]: publisher: (wxy) +[#]: url: (https://linux.cn/article-13448-1.html) + +Python 3.5 带给我们的方便的矩阵以及其他改进 +====== + +> 探索一些未被充分利用但仍然有用的 Python 特性。 + +![](https://img.linux.net.cn/data/attachment/album/202106/01/201953lua9t9f3vvwqbqet.jpg) + +这是 Python 3.x 首发特性系列文章的第六篇。Python 3.5 在 2015 年首次发布,尽管它已经发布了很长时间,但它引入的许多特性都没有被充分利用,而且相当酷。下面是其中的三个。 + +### @ 操作符 + +`@` 操作符在 Python 中是独一无二的,因为在标准库中没有任何对象可以实现它!它是为了在有矩阵的数学包中使用而添加的。 + +矩阵有两个乘法的概念。元素积是用 `*` 运算符完成的。但是矩阵组合(也被认为是乘法)需要自己的符号。它是用 `@` 完成的。 + +例如,将一个“八转”矩阵(将轴旋转 45 度)与自身合成,就会产生一个四转矩阵。 + +``` +import numpy + +hrt2 = 2**0.5 / 2 +eighth_turn = numpy.array([ + [hrt2, hrt2], + [-hrt2, hrt2] +]) +eighth_turn @ eighth_turn +``` + +``` + array([[ 4.26642159e-17, 1.00000000e+00], + [-1.00000000e+00, -4.26642159e-17]]) +``` + +浮点数是不精确的,这比较难以看出。从结果中减去四转矩阵,将其平方相加,然后取其平方根,这样就比较容易检查。 + +这是新运算符的一个优点:特别是在复杂的公式中,代码看起来更像基础数学: + +``` +almost_zero = ((eighth_turn @ eighth_turn) - numpy.array([[0, 1], [-1, 0]]))**2 +round(numpy.sum(almost_zero) ** 0.5, 10) +``` + +``` + 0.0 +``` + +### 参数中的多个关键词字典 + +Python 3.5 使得调用具有多个关键字-参数字典的函数成为可能。这意味着多个默认值的源可以与更清晰的代码”互操作“。 + +例如,这里有个可笑的关键字参数的函数: + +``` +def show_status( + *, + the_good=None, + the_bad=None, + the_ugly=None, + fistful=None, + dollars=None, + more=None +): + if the_good: + print("Good", the_good) + if the_bad: + print("Bad", the_bad) + if the_ugly: + print("Ugly", the_ugly) + if fistful: + print("Fist", fistful) + if dollars: + print("Dollars", dollars) + if more: + print("More", more) +``` + +当你在应用中调用这个函数时,有些参数是硬编码的: + +``` +defaults = dict( + the_good="You dig", + the_bad="I have to have respect", + the_ugly="Shoot, don't talk", +) +``` + +从配置文件中读取更多参数: + +``` +import json + +others = json.loads(""" +{ +"fistful": "Get three coffins ready", +"dollars": "Remember me?", +"more": "It's a small world" +} +""") +``` + +你可以从两个源一起调用这个函数,而不必构建一个中间字典: + +``` +show_status(**defaults, **others) +``` + +``` + Good You dig + Bad I have to have respect + Ugly Shoot, don't talk + Fist Get three coffins ready + Dollars Remember me? + More It's a small world +``` + +### os.scandir + +`os.scandir` 函数是一种新的方法来遍历目录内容。它返回一个生成器,产生关于每个对象的丰富数据。例如,这里有一种打印目录清单的方法,在目录的末尾跟着 `/`: + +``` +for entry in os.scandir(".git"): + print(entry.name + ("/" if entry.is_dir() else "")) +``` + +``` + refs/ + HEAD + logs/ + index + branches/ + config + objects/ + description + COMMIT_EDITMSG + info/ + hooks/ +``` + +### 欢迎来到 2015 年 + +Python 3.5 在六年前就已经发布了,但是在这个版本中首次出现的一些特性非常酷,而且没有得到充分利用。如果你还没使用,那么将他们添加到你的工具箱中。 + +-------------------------------------------------------------------------------- + +via: https://opensource.com/article/21/5/python-35-features + +作者:[Moshe Zadka][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/moshez +[b]: https://github.com/lujun9972 +[1]: https://opensource.com/sites/default/files/styles/image-full-size/public/lead-images/markus-spiske-iar-matrix-unsplash.jpg?itok=78u_4veR (Hacker code matrix) \ No newline at end of file diff --git a/published/202106/20210517 Use open source tools to set up a private VPN.md b/published/202106/20210517 Use open source tools to set up a private VPN.md new file mode 100644 index 0000000000..416c8d5aef --- /dev/null +++ b/published/202106/20210517 Use open source tools to set up a private VPN.md @@ -0,0 +1,199 @@ +[#]: subject: (Use open source tools to set up a private VPN) +[#]: via: (https://opensource.com/article/21/5/open-source-private-vpn) +[#]: author: (Lukas Janėnas https://opensource.com/users/lukasjan) +[#]: collector: (lujun9972) +[#]: translator: (stevenzdg988) +[#]: reviewer: (wxy) +[#]: publisher: (wxy) +[#]: url: (https://linux.cn/article-13539-1.html) + +使用开源工具创建私有的虚拟专用网络 +====== + +> 使用 OpenWRT 和 Wireguard 在路由器上创建自己的虚拟专用网络。 + +![](https://img.linux.net.cn/data/attachment/album/202107/01/101629ym69mwpmcmetdp99.jpg) + +通过计算机网络从一个地方到另一个地方可能是一件棘手的事情。除了知道正确的地址和打开正确的端口之外,还有安全问题。 对于 Linux,SSH 是一种流行的默认方式,虽然你可以使用 SSH 做很多事情,但它仍然“只是”一个安全外壳(实际上,这就是 SSH 的含义)。用于加密流量的更广泛的协议是“虚拟专用网络”,它创建了一个独特的两点之间的虚拟的专用网络。有了它,你可以登录到另一个网络上的计算机并使用它的所有服务(文件共享、打印机等等),就像你坐在同一个房间里一样,并且全部的数据都是从点到点加密的。 + +通常,为了使虚拟专用网络连接成为可能,进入每个网络的网关必须接受虚拟专用网络流量,并且必须侦听目标网络上的某些计算机的虚拟专用网络流量。然而,你可以运行自己的带有虚拟专用网络服务器的路由器固件,使你能够连接到目标网络,而无需担心转发端口或考虑内部拓扑。我最喜欢的固件是 OpenWrt,在本文中我将演示如何设置它,以及如何启用虚拟专用网络。 + +### 什么是 OpenWrt? + +[OpenWrt][2] 是一个使用 Linux 面向嵌入式设备的开源项目。它已经存在超过 15 年,拥有庞大而活跃的社区。 + +使用 OpenWrt 的方法有很多种,但它的主要用途是在路由器中。它提供了一个具有包管理功能的完全可写的文件系统,并且由于它是开源的,你可以查看和修改代码并为生态系统做出贡献。如果你想对路由器进行更多控制,这就是你想要使用的系统。 + +OpenWrt 支持很多路由器,包括 [思科][3]、[华硕][4]、[MikroTik][5]、[Teltonika Networks][6]、[D-Link][7]、[TP-link][8]、[Buffalo][9]、[Ubiquiti][10] 等知名品牌和 [许多其他品牌][11]。 + +### Wireguard 是什么? + +[Wireguard][12] 是开源的虚拟专用网络软件,它比 OpenVPN 等其他选项更快、更简单且更安全。它使用最先进的密码学:用于对称加密的 ChaCha20;用于密钥协商的 Curve 25519(使用椭圆曲线),和用于散列的 BLAKE2。这些算法的设计方式在嵌入式系统上是高效的。Wireguard 也可用于各种操作系统 [平台][13]。 + +### 先决条件 + +对于这个项目,你需要: + + * [Teltonika RUT955][14] 或支持 OpenWrt 的其他路由器 + * 一个公网 IP 地址,用于从外部网络连接到虚拟专用网络 + * 一部安卓手机 + +### 安装 OpenWrt + +首先,下载路由器的 OpenWrt 镜像。使用 [固件选择器][15] 检查 OpenWrt 是否支持你的路由器并下载固件。输入你的路由器型号,将显示选项: + +![OpenWRT 固件选择器][16] + +使用搜索框右侧的下拉输入选择要下载的固件版本。 + +下载出厂镜像。 + +![下载出厂镜像][18] + +许多路由器允许你从 Web 界面刷入未经授权的固件,但 Teltonika Networks 不允许。要将 OpenWrt 固件刷入这样的路由器,你需要使用引导加载器。为此,请按照下列步骤操作: + + 1. 拔掉路由器的电源线。 + 2. 按住重置按钮。 + 3. 插入路由器的电源线。 + 4. 插入电源线后,继续按住重置按钮 5 到 8 秒。 + 5. 将计算机的 IP 地址设置为 `192.168.1.15`,将网络掩码设置为 `255.255.255.0`。 + 6. 使用以太网电缆通过 LAN 端口连接路由器和计算机。 + 7. 打开网页浏览器并输入 `192.168.1.1:/index.html`。 + 8. 上传并刷写固件。 + +刷机过程可能占用三分钟。之后,你应该可以通过在浏览器中输入 `192.168.1.1` 来访问路由器的 Web 界面。 默认情况下没有设置密码 + +![OpenWrt 授权][19] + +### 配置网络连接 + +网络连接是必要条件。如果你的 Internet 服务提供商(ISP) 使用 DHCP 自动分配你的 IP 地址,你只需将以太网电缆插入路由器的 WAN 端口。 + +如果你需要手动分配 IP 地址,导航至 “Network → Interfaces”。选择 “Edit” 编辑你的 WAN 接口。从 “Protocol” 字段中,选择 “Static address”,然后选择 “Switch protocol”。 + +![手动分配 IP 地址][20] + +在 “IPv4 address” 字段中,输入你的路由器地址。设置 “IPv4 netmask” 以匹配你的网络子网;输入你将用于连接到网络的 “IPv4 gateway” 地址; 并在 “Use custom DNS servers” 字段中输入 DNS 服务器的地址。保存配置。 + +就是这样!你已成功配置 WAN 接口以获得网络连接。 + +### 安装必要的包 + +默认情况下,该固件不包含很多包,但 OpenWrt 有一个包管理器和可选安装的软件包。导航到 “System → Software” 并通过选择 “Update list...” 更新你的包管理器。 + +![OpenWrt 包管理器][21] + +在“Filter”输入中,键入 “Wireguard”,等待系统找到所有包含该关键字的包。找到并安装名为 “luci-app-wireguard” 的包。 + +![luci-app-wireguard 包][22] + +该软件包包括一个用于配置 Wireguard 的 Web 界面,并安装 Wireguard 所必需的所有依赖项。 + +如果你在安装 Wireguard 软件包之前收到一个软件包丢失的警告并且在存储库中找不到,请忽略它并继续。 + +接下来,找到并安装名为 “luci-app-ttyd” 的包。这将用于稍后访问终端。 + +安装这些软件包后,重新启动路由器以使更改生效。 + +### 配置 Wireguard 接口 + +接下来,创建 Wireguard 接口。导航到 “Network → Interfaces” 并选择左下角的 “Add new interface...”。在弹出窗口中,输入你想要的接口名称,从下拉列表中选择 “WireguardVPN”,然后选择右下角的 “Create interface”。 + +![创建 Wireguard 接口][23] + +在新弹出的窗口中,选择 “Generate Key” 为 Wireguard 接口生成私钥。在 “Listen Port” 字段中,输入所需的端口。我将使用默认的 Wireguard 端口,“51820”。在 “IP Addresses” 字段中,分配将用于 Wireguard 接口的 IP 地址。在这个例子中,我使用了 `10.0.0.1/24`。数字 “24” 表明我的子网的大小。 + +![创建 Wireguard 接口][24] + +保存配置并重启接口。 + +导航到 “Services → Terminal”,登录到 shell,然后输入命令 `wg show`。你将看到有关 Wiregaurd 接口的一些信息,包括其公钥。复制公钥——稍后你将需要它来创建对等点。 + +![Wireguard 公钥][25] + +### 配置防火墙 + +导航到 “Network → Firewall” 并选择 “Traffic Rules” 选项卡。在页面底部,选择 “Add”。在弹出窗口的 “Name” 字段中,为你的规则命名,例如 “Allow-wg”。接下来,将 “Destination zone” 从 “Lan” 更改为 “Device”,并将 “Destination port” 设置为 “51820”。 + +![Wireguard 防火墙设置][26] + +保存配置。 + +### 手机上配置 Wireguard + +从 Google Play 在你的手机上安装 [Wireguard 应用程序][27]。安装后,打开应用程序并从头开始创建一个新接口。在 “Name” 字段中,输入要用于接口的名称。在 “Private key” 字段中,按右侧的双向箭头图标生成密钥对。你将需要上面的公钥来在你的手机和路由器之间创建一个对等点。在 “Addresses” 字段中,分配你将用于通过虚拟专用网络访问电话的 IP 地址。我将使用 `10.0.0.2/24`。在 “Listen port” 中,输入端口;我将再次使用默认端口。 + +![在 Android 上设置虚拟专用网络接口][28] + +保存配置。 + +要向配置中添加对等点,请选择 “Add peer”。在 “Public key” 字段中,输入路由器的 Wireguard 公钥。在 “Endpoint” 字段中,输入路由器的公共 IP 地址和端口,以冒号分隔,例如 `12.34.56.78:51820`。在 “Allowed IP” 字段中,输入要通过 Wireguard 接口访问的 IP 地址。 (你可以输入路由器的虚拟专用网络接口 IP 地址和 LAN 接口地址。)IP 地址必须用逗号分隔。你还可以定义子网的大小。 + +![在 Android 上添加虚拟专用网络对等点][29] + +保存配置。 + +配置中还剩下最后一步:在路由器上添加一个对等点。 + +### 在路由器上添加一个对等点 + +导航到 “Network → Interfaces” 并选择你的 Wireguard 接口。转到 “Peers” 选项卡并选择 “Add peer”。在 “Description” 字段中,输入对等方的名称。在 “Public Key” 字段中输入手机的 Wireguard 接口公钥,在 “Allowed IPs” 字段中输入手机的 Wireguard 接口 IP 地址。选中 “Route Allowed IPs” 复选框。 + +![在路由器上添加一个对等点][30] + +保存配置并重启接口。 + +### 测试配置 + +在手机上打开 Web 浏览器。在 URL 栏中,输入 IP 地址 `10.0.0.1` 或 `192.168.1.1`。你应该能够访问路由器的网站。 + +![从 Android 登录 虚拟专用网络][31] + +### 你自己的虚拟专用网络 + +这些天有很多虚拟专用网络服务商在做广告,但是拥有和控制自己的基础设施还有很多话要说,尤其是当该基础设施仅用于提高安全性时。无需依赖其他人为你提供安全的数据连接。使用 OpenWrt 和 Wireguard,你可以拥有自己的开源虚拟专用网络解决方案。 + +-------------------------------------------------------------------------------- + +via: https://opensource.com/article/21/5/open-source-private-vpn + +作者:[Lukas Janėnas][a] +选题:[lujun9972][b] +译者:[stevenzdg988](https://github.com/stevenzdg988) +校对:[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/vpn_scrabble_networking.jpg?itok=pdsUHw5N (scrabble letters used to spell "V") +[2]: https://openwrt.org/ +[3]: https://www.cisco.com/c/en/us/products/routers/index.html +[4]: https://www.asus.com/Networking-IoT-Servers/WiFi-Routers/All-series/ +[5]: https://mikrotik.com/ +[6]: https://teltonika-networks.com/ +[7]: https://www.dlink.com/en/consumer +[8]: https://www.tp-link.com/us/ +[9]: https://www.buffalotech.com/products/category/wireless-networking +[10]: https://www.ui.com/ +[11]: https://openwrt.org/toh/views/toh_fwdownload +[12]: https://www.wireguard.com/ +[13]: https://www.wireguard.com/install/ +[14]: https://teltonika-networks.com/product/rut955/ +[15]: https://firmware-selector.openwrt.org/ +[16]: https://opensource.com/sites/default/files/uploads/openwrt_firmware-selector.png (OpenWRT firmware selector) +[17]: https://creativecommons.org/licenses/by-sa/4.0/ +[18]: https://opensource.com/sites/default/files/uploads/downloadfactoryimage.png (Downloading the Factory Image) +[19]: https://opensource.com/sites/default/files/uploads/openwrt_authorization.png (OpenWrt authorization) +[20]: https://opensource.com/sites/default/files/uploads/openwrt_staticaddress.png (Assigning IP address manually) +[21]: https://opensource.com/sites/default/files/uploads/openwrt_update-lists.png (OpenWrt package manager) +[22]: https://opensource.com/sites/default/files/uploads/wireguard-package.png (luci-app-wireguard package) +[23]: https://opensource.com/sites/default/files/uploads/wireguard_createinterface.png (Creating Wireguard interface) +[24]: https://opensource.com/sites/default/files/uploads/wireguard_createinterface2.png (Creating Wireguard interface) +[25]: https://opensource.com/sites/default/files/uploads/wireguard_publickey.png (Wireguard public key) +[26]: https://opensource.com/sites/default/files/uploads/wireguard-firewallsetup.png (Wireguard firewall setup) +[27]: https://play.google.com/store/apps/details?id=com.wireguard.android&hl=lt&gl=US +[28]: https://opensource.com/sites/default/files/uploads/vpn_inferfacesetup.png (Setting up V interface on Android) +[29]: https://opensource.com/sites/default/files/uploads/addpeeronphone.png (Adding a V peer on an Android) +[30]: https://opensource.com/sites/default/files/uploads/addpeeronrouter.png (Adding a peer on the router) +[31]: https://opensource.com/sites/default/files/uploads/android-vpn-login.png (Logging into the V from Android) diff --git a/published/202106/20210518 4 essential characteristics of successful APIs.md b/published/202106/20210518 4 essential characteristics of successful APIs.md new file mode 100644 index 0000000000..63d514f348 --- /dev/null +++ b/published/202106/20210518 4 essential characteristics of successful APIs.md @@ -0,0 +1,206 @@ +[#]: subject: (4 essential characteristics of successful APIs) +[#]: via: (https://opensource.com/article/21/5/successful-apis) +[#]: author: (Tom Wilson https://opensource.com/users/tomwillson4014) +[#]: collector: (lujun9972) +[#]: translator: (ywxgod) +[#]: reviewer: (wxy) +[#]: publisher: (wxy) +[#]: url: (https://linux.cn/article-13483-1.html) + +完善的 API 的 4 个基本特征 +====== + +> 创建一个 API(应用程序接口),我们所要做的远远不止是让它能“正常工作”。 + +![](https://img.linux.net.cn/data/attachment/album/202106/14/155547zs3mffismifqqi59.jpg) + +如果你正在构建基于 C/S 模型的应用程序,那么你需要一个应用程序接口(API)。API 就是一种非常清晰而又明确的定义,它是一个进程process与另一个进程之间明确定义的边界。Web 应用中我们常见的边界定义就是 REST/JSON API。 + +虽然很多开发者可能主要关注在如何让 API 正常工作(或功能正常),但却还有一些“非功能性”的要求也是需要他们注意的。所有的 API *必须具备* 的 4 个非功能性的要求是: + + * 安全 + * 文档 + * 验证 + * 测试 + +### 安全 + +在软件开发中,安全是最基本的要求。对于 API 开发者来说,API 的安全性主要包含以下 4 个方面: + + 1. HTTPS/SSL 证书 + 2. 跨域资源共享 + 3. 身份认证与 JSON Web 令牌 + 4. 授权与作用域 + +#### 1、HTTPS/SSL 证书 + +Web 应用的黄金标准是使用 SSL 证书的 HTTPS 协议。[Let's Encrypt][2] 可以帮你达到这一目的。Let's Encrypt 来自于非营利性的互联网安全研究小组(ISRG),它是一个免费的、自动化的、开放的证书颁发机构。 + +Let's Encrypt 的软件会为你的域(LCTT 译注:包含域名、IP 等信息)生成中央授权证书。而正是这些证书确保了从你的 API 到客户端的数据载荷是点对点加密的。 + +Let's Encrypt 支持证书管理的多种部署方案。我们可以通过查看 [文档][3] 来找出最适合自己需要的方案。 + +#### 2、跨域资源共享 + +跨域资源共享Cross-origin resource sharing(CORS)是一个针对浏览器的安全策略预检。如果你的 API 服务器与发出请求的客户端不在同一个域中,那么你就要处理 CORS。例如,如果你的服务器运行在 `api.domain-a.com` 并且接到一个来自 `domain-b.com` 的客户端的请求,那么 CORS 就会(让浏览器)发送一个 HTTP 预检请求,以便查看你的 API 服务是否会接受来自此客户域的客户端请求。 + +[来自 MDN 的定义][4]: + +> “跨域资源共享(CORS)是一种基于 HTTP 头的机制,这种机制允许服务器标记除自身源外的其他任何来源(域、方案或端口)。而对于这些被服务器标识的源,浏览器应该允许我们从它们加载资源。” + +![CORS 原理][5] + +*([MDN文档][4], [CC-BY-SA 2.5][6])* + +另外,有很多用于 [Node.js][7] 的辅助库来 [帮助 API 开发者处理 CORS][8]。 + +#### 3、身份认证与 JSON Web 令牌 + +有多种方法可以验证你的 API 中的认证用户,但最好的方法之一是使用 JSON Web 令牌(JWT),而这些令牌使用各种知名的加密库进行签名。 + +当客户端登录时,身份管理服务会向客户端提供一个 JWT。然后,客户端可以使用这个令牌向 API 发出请求,API 收到请求后,从服务器读取公钥或私密信息来验证这个令牌。 + +有一些现有的库,可以帮助我们对令牌进行验证,包括 [jsonwebtoken][9]。关于 JWT 的更多信息,以及各种语言中对其的支持库,请查看 [JWT.io][10]。  + +``` +import jwt from 'jsonwebtoken' + +export default function (req, res, next) { + // req.headers.authorization Bearer token + const token = extractToken(req) + jwt.verify(token, SECRET, { algorithms: ['HS256'] }, (err, decoded) => { + if (err) { next(err) } + req.session = decoded + next() + }) +} +``` + +#### 4、授权与作用域 + +认证(或身份验证)很重要,但授权同样很重要。也就是说,经过验证的客户端是否有权限让服务器执行某个请求呢?这就是作用域的价值所在。当身份管理服务器对客户端进行身份认证,且创建 JWT 令牌时,身份管理服务会给当前客户提供一个作用域,这个作用域将会决定当前经过验证的客户的 API 请求能否被服务器执行。这样也就免去了服务器对访问控制列表的一些不必要的查询。 + +作用域是一个文本块(通常以空格分隔),用于描述一个 API 端点的访问能力。一般来说,作用域被分为资源与动作。这种模式对 REST/JSON API 很有效,因为它们有相似的 `RESOURCE:ACTION` 结构。(例如,`ARTICLE:WRITE` 或 `ARTICLE:READ`,其中 `ARTICLE` 是资源,`READ` 和 `WRITE` 是动作)。 + +作用域的划分让我们的 API 能够专注于功能的实现,而不是去考虑各种角色和用户。身份访问管理服务可以将不同的角色和用户分配不同的权限范围,然后再将这些不同的作用域提供给不同的 JWT 验证中的客户。 + +#### 总结 + +当我们开发和部署 API 时,安全应该一直是最重要的要求之一。虽然安全性是一个比较宽泛的话题,但如果能解决上面四个方面的问题,这对于你的 API 来说,在生产环境中将会表现得更好。 + +### 文档 + +_有什么能比没有文档更糟糕?过期的文档。_ + +开发者对文档真的是又爱又恨。尽管如此,文档仍然是 API 定义是否完善的一个关键部分。开发者需要从文档中知道如何使用这些 API,且你创建的文档对于开发者如何更好地使用 API 也有着非常巨大的作用。 + +创建 API 文档,我们需要关注下面三个方面: + + 1. 开发者入门文档(自述文件/基本介绍) + 2. 技术参考(规范/说明书) + 3. 使用方法(入门和其他指南) + +#### 1、入门文档 + +在构建 API 服务的时候,你需要明确一些事情,比如:这个 API 是做什么的?如何建立开发者环境?如何测试该服务?如何提交问题?如何部署它? + +通常我们可以通过自述(`README`)文件来回答上面的这些问题,自述文件一般放在你的代码库中,用于为开发者提供使用你项目的最基本的起点和说明。 + +自述文件应该包含: + + * API 的描述 + * 技术参考与指南的链接 + * 如何以开发者的身份设置你的项目 + * 如何测试这个项目 + * 如何部署这个项目 + * 依赖管理 + * 代码贡献指南 + * 行为准则 + * 许可证 + * 致谢 + +你的自述文件应该简明扼要;你不必解释每一个方面,但要提供足够的信息,以便开发者在熟悉你的项目后可以进一步深入研究。 + +#### 2、技术参考 + +在 REST/JSON API 中, 每一个具体的端点endpoint都对应一个特定的功能,都需要一个具体的说明文档,这非常重要。文档中会定义 API 的描述,输入和可能的输出,并为各种客户端提供使用示例。 + +[OpenAPI][13] 是一个创建 REST/JSON 文档的标准, 它可以指导你完成编写 API 文档所需的各种细节。OpenAPI 还可以为你的 API 生成演示文档。 + +#### 3、使用方法 + +对于 API 的用户来说,仅仅只有技术说明是不够的。他们还需要知道如何在一些特定的情况和场景下来使用这些 API,而大多数的潜在用户可能希望通过你的 API 来解决他们所遇到的问题。 + +向用户介绍 API 的一个好的方法是利用一个“开始”页面。“开始”页面可以通过一个简单的用例引导用户,让他们迅速了解你的 API 能给他们能带来的益处。 + +#### 总结 + +对于任何完善的 API,文档都是一个很关键的组成部分。当你在创建文档时,你需要关注 API 文档中的如何入门、技术参考以及如何快速开始等三个方面,这样你的 API 才算是一个完善的 API。 + +### 验证 + +API 开发过程中经常被忽视的一个点就是验证。它是一个验证来自外部来源的输入的过程。这些来源可以是客户端发送过来的 JSON 数据,或者是你请求别人的服务收到的响应数据。我们不仅仅要检查这些数据的类型,还要确保这些数据确实是我们要的数据,这样可以消除很多潜在的问题。了解你的边界以及你能控制的和不能控制的东西,对于 API 的数据验证来说是一个很重要的方面。 + +最好的策略是在进入数据逻辑处理之前,在你能控制的边界的边缘处进行数据的验证。当客户端向你的 API 发送数据时,你需要对该数据做出任何处理之前应用你的验证,比如:确保 Email 是真实的邮件地址、日期数据有正确的格式、字符串符合长度要求。 + +这种简单的检查可以为你的应用增加安全性和一致性。还有,当你从某个服务接收数据时,比如数据库或缓存,你需要重新验证这些数据,以确保返回的结果符合你的数据检查。 + +你可以自己手写这些校验逻辑,当然也可以用像 [Lodash][14] 或 [Ramda][15] 这样的函数库,它们对于一些小的数据对象非常有用。像 [Joi][16]、[Yup][17] 或 [Zod][18] 这样的验证库效果会更好,因为它们包含了一些常见的验证方法,可以节省你的时间和精力。除此,它们还能创建一个可读性强的模式。如果你需要看看与语言无关的东西,请看 [JSON Schema][19]。 + +#### 总结 + +数据验证虽然并不显眼和突出(LCTT 译注:跟 API 的功能实现以及其他几个方面比),但它可以帮你节省大量的时间。如果不做验证,这些时间将可能被用于故障排除和编写数据迁移脚本。真的不要相信你的客户端会发送干净的数据给你,也不要让验证不通过的数据渗入到你的业务逻辑或持久数据存储中去。花点时间验证你的 API 收到的数据和请求到的响应数据,虽然在前期你可能会感到一些挫折和不适,但这总比你在后期花大量时间去做各种数据收紧管制、故障排除等要容易得多。 + +### 测试 + +测试是软件开发中的最佳实践,它应该是最主要的非功能性的要求。对于包括 API 在内的任何项目,确定测试策略都是一个挑战,因为你自始至终都要掌握各种约束,以便相应的来制定你的测试策略。 + +集成测试Integration testing是测试 API 的最有效的方法之一。在集成测试模式中,开发团队会创建一个测试集用来覆盖应用流程中的某些部分,从一个点到另一个点。一个好的集成测试流程包括测试 API 的入口点以及模拟请求到服务端的响应。搞定这两点,你就覆盖了整个逻辑,包括从 API 请求的开始到模拟服务器的响应,并返回数据给 API。 + +虽然使用的是模拟,但这种方法让能我们专注于代码逻辑层,而不需要去依赖后端服务和展示逻辑来进行测试。没有依赖的测试会更加可靠、更容易实现自动化,且更容易被接入持续集成管道流。 + +集成测试的实施中,我会用 [Tape][20]、[Test-server][21] 和 [Fetch-mock][22]。这些库让我们能够从 API 的请求到数据的响应进行隔离测试,使用 Fetch-mock 还可以将出站请求捕获到持久层。 + +#### 总结 + +虽然其他的各种测试和类型检查对 API 也都有很好的益处,但集成测试在流程效率、构建和管理时间方面却有着更大的优势。使用 Fetch-mock 这样的工具,可以在服务边界提供一个干净的模拟场景。 + +### 专注于基础 + +不管是设计和构建应用程序还是 API,都要确保包含上面的四个基本要素。它们并不是我们唯一需要考虑的非功能性需求,其他的还包括应用监控、日志和 API 管理等。即便如此,安全、文档、验证和测试这四个基本点,对于构建任何使用场景下的完善 API 都是至关重要的关注点。 + +-------------------------------------------------------------------------------- + +via: https://opensource.com/article/21/5/successful-apis + +作者:[Tom Wilson][a] +选题:[lujun9972][b] +译者:[ywxgod](https://github.com/ywxgod) +校对:[wxy](https://github.com/wxy) + +本文由 [LCTT](https://github.com/LCTT/TranslateProject) 原创编译,[Linux中国](https://linux.cn/) 荣誉推出 + +[a]: https://opensource.com/users/tomwillson4014 +[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://letsencrypt.org/ +[3]: https://letsencrypt.org/docs/ +[4]: https://developer.mozilla.org/en-US/docs/Web/HTTP/CORS +[5]: https://opensource.com/sites/default/files/uploads/cors_principle_1.png (CORS principles) +[6]: https://creativecommons.org/licenses/by-sa/2.5/ +[7]: https://nodejs.org +[8]: https://www.npmjs.com/search?q=CORS +[9]: https://github.com/auth0/node-jsonwebtoken +[10]: https://jwt.io +[11]: https://opensource.com/sites/default/files/uploads/jwt-verify-example.png (JWT verification example) +[12]: https://blog.hyper63.com/content/images/2021/03/jwt-verify-example.png +[13]: https://spec.openapis.org/oas/v3.1.0 +[14]: https://lodash.com +[15]: https://ramdajs.com/ +[16]: https://joi.dev/ +[17]: https://github.com/jquense/yup +[18]: https://github.com/colinhacks/zod/tree/v3 +[19]: https://json-schema.org/ +[20]: https://github.com/substack/tape +[21]: https://github.com/twilson63/test-server +[22]: http://www.wheresrhys.co.uk/fetch-mock/ diff --git a/published/202106/20210518 Are you using this magic method for filesystems from Python 3.6.md b/published/202106/20210518 Are you using this magic method for filesystems from Python 3.6.md new file mode 100644 index 0000000000..1f8cef3c27 --- /dev/null +++ b/published/202106/20210518 Are you using this magic method for filesystems from Python 3.6.md @@ -0,0 +1,131 @@ +[#]: subject: (Are you using this magic method for filesystems from Python 3.6?) +[#]: via: (https://opensource.com/article/21/5/python-36-features) +[#]: author: (Moshe Zadka https://opensource.com/users/moshez) +[#]: collector: (lujun9972) +[#]: translator: (geekpi) +[#]: reviewer: (wxy) +[#]: publisher: (wxy) +[#]: url: (https://linux.cn/article-13454-1.html) + +你使用过 Python 3.6 中针对文件系统的这个神奇方法吗? +====== + +> 探索 os.fspath 和其他两个未被充分利用但仍然有用的 Python 特性。 + +![](https://img.linux.net.cn/data/attachment/album/202106/03/164403a6m2c989hh963lm6.jpg) + +这是 Python 3.x 首发特性系列文章中的第七篇。Python 3.6 首次发布于 2016 年,尽管它已经发布了一段时间,但它引入的许多特性都没有得到充分利用,而且相当酷。下面是其中的三个。 + +### 分隔数字常数 + +快回答哪个更大,`10000000` 还是 `200000`?你在看代码时能正确回答吗?根据当地的习惯,在写作中,你会用 10,000,000 或 10.000.000 来表示第一个数字。问题是,Python 使用逗号和句号是用于其他地方。 + +幸运的是,从 Python 3.6 开始,你可以使用下划线来分隔数字。这在代码中和使用字符串的 `int()` 转换器时都可以使用: + +``` +import math +math.log(10_000_000) / math.log(10) +``` + +``` + 7.0 +``` + +``` +math.log(int("10_000_000")) / math.log(10) +``` + +``` + 7.0 +``` + +### Tau 是对的 + +45 度角用弧度表示是多少?一个正确的答案是 `π/4`,但这有点难记。记住 45 度角是一个八分之一的转角要容易得多。正如 [Tau Manifesto][2] 所解释的,`2π`,称为 `Τ`,是一个更自然的常数。 + +在 Python 3.6 及以后的版本中,你的数学代码可以使用更直观的常数: + +``` +print("Tan of an eighth turn should be 1, got", round(math.tan(math.tau/8), 2)) +print("Cos of an sixth turn should be 1/2, got", round(math.cos(math.tau/6), 2)) +print("Sin of a quarter turn should be 1, go", round(math.sin(math.tau/4), 2)) +``` + +``` + Tan of an eighth turn should be 1, got 1.0 + Cos of an sixth turn should be 1/2, got 0.5 + Sin of a quarter turn should be 1, go 1.0 +``` + +### os.fspath + +从 Python 3.6 开始,有一个神奇的方法表示“转换为文件系统路径”。当给定一个 `str` 或 `bytes` 时,它返回输入。 + +对于所有类型的对象,它寻找 `__fspath__` 方法并调用它。这允许传递的对象是“带有元数据的文件名”。 + +像 `open()` 或 `stat` 这样的普通函数仍然能够使用它们,只要 `__fspath__` 返回正确的东西。 + +例如,这里有一个函数将一些数据写入一个文件,然后检查其大小。它还将文件名记录到标准输出,以便追踪: + +``` +def write_and_test(filename): +    print("writing into", filename) +    with open(filename, "w") as fpout: +        fpout.write("hello") +    print("size of", filename, "is", os.path.getsize(filename)) +``` + +你可以用你期望的方式来调用它,用一个字符串作为文件名: + +``` +write_and_test("plain.txt") +``` + +``` +    writing into plain.txt +    size of plain.txt is 5 +``` + +然而,可以定义一个新的类,为文件名的字符串表示法添加信息。这样可以使日志记录更加详细,而不改变原来的功能: + +``` +class DocumentedFileName: +    def __init__(self, fname, why): +        self.fname = fname +        self.why = why +    def __fspath__(self): +        return self.fname +    def __repr__(self): +        return f"DocumentedFileName(fname={self.fname!r}, why={self.why!r})" +``` + +用 `DocumentedFileName` 实例作为输入运行该函数,允许 `open` 和 `os.getsize` 函数继续工作,同时增强日志: + +``` +write_and_test(DocumentedFileName("documented.txt", "because it's fun")) +``` + +``` +    writing into DocumentedFileName(fname='documented.txt', why="because it's fun") +    size of DocumentedFileName(fname='documented.txt', why="because it's fun") is 5 +``` + +### 欢迎来到 2016 年 + +Python 3.6 是在五年前发布的,但是在这个版本中首次出现的一些特性非常酷,而且没有得到充分利用。如果你还没使用,那么将他们添加到你的工具箱中。 + +-------------------------------------------------------------------------------- + +via: https://opensource.com/article/21/5/python-36-features + +作者:[Moshe Zadka][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/moshez +[b]: https://github.com/lujun9972 +[1]: https://opensource.com/sites/default/files/styles/image-full-size/public/lead-images/browser_screen_windows_files.png?itok=kLTeQUbY (Computer screen with files or windows open) +[2]: https://tauday.com/tau-manifesto diff --git a/published/202106/20210518 Manage your Raspberry Pi with Cockpit.md b/published/202106/20210518 Manage your Raspberry Pi with Cockpit.md new file mode 100644 index 0000000000..d64b731d9a --- /dev/null +++ b/published/202106/20210518 Manage your Raspberry Pi with Cockpit.md @@ -0,0 +1,152 @@ +[#]: subject: (Manage your Raspberry Pi with Cockpit) +[#]: via: (https://opensource.com/article/21/5/raspberry-pi-cockpit) +[#]: author: (Alan Formy-Duval https://opensource.com/users/alanfdoss) +[#]: collector: (lujun9972) +[#]: translator: (ShuyRoy) +[#]: reviewer: (wxy) +[#]: publisher: (wxy) +[#]: url: (https://linux.cn/article-13487-1.html) + +使用 Cockpit 管理你的树莓派 +====== + +> 用 Cockpit 建立你的树莓派的控制中心。 + +![](https://img.linux.net.cn/data/attachment/album/202106/15/144053hmswm01w6qus011n.jpg) + +去年,我写了关于使用 [Cockpit 管理我的 Linux 服务器的文章][2]。它是一个基于 Web 的工具,为管理多个服务器及其相关的服务和应用提供了一个简洁、强大的界面。它还简化了日常的管理任务。 + +在这篇文章中,我将会介绍如何在树莓派基金会提供的标准操作系统树莓派 OS 上安装用于 Linux 服务器的 Cockpit Web 控制台。我还会简要介绍它的特性。 + +### 在树莓派 OS 上安装 Cockpit + +在 `sudo` 权限下使用一个账户通过 SSH 登录你的树莓派系统。如果你还没有建立一个账户: + +``` +$ ssh pibox +alan@pibox's password: +Linux pibox.someplace.org 5.10.17-v7+ #1403 SMP Mon Feb 22 11:29:51 GMT 2021 armv7l + +The programs included with the Debian GNU/Linux system are free software; +the exact distribution terms for each program are described in the +individual files in /usr/share/doc/*/copyright. + +Debian GNU/Linux comes with ABSOLUTELY NO WARRANTY, to the extent +permitted by applicable law. +Last login: Tue May  4 09:55:57 2021 from 172.1.4.5 +alan@pibox:~ $ +``` + +在树莓派 OS 上安装 Cockpit Web 控制台和在 Linux 服务器上一样简单: + +``` +$ sudo apt install cockpit +``` + +Cockpit 只需要 60.4 KB 的磁盘空间。加上它的几个包依赖项,总使用量是 115MB。 + +安装过程将负责设置和启动服务。你可以使用 `systemctl` 命令来验证状态: + +``` +$ systemctl status cockpit.socket +● cockpit.socket - Cockpit Web Service Socket +   Loaded: loaded (/lib/systemd/system/cockpit.socket; enabled; vendor preset: enabled) +   Active: active (listening) since Tue 2021-05-04 10:24:43 EDT; 35s ago +     Docs: man:cockpit-ws(8) +   Listen: 0.0.0.0:9090 (Stream) +  Process: 6563 ExecStartPost=/usr/share/cockpit/motd/update-motd  localhost (code=exited, status=0/SUCCESS) +  Process: 6570 ExecStartPost=/bin/ln -snf active.motd /run/cockpit/motd (code=exited, status=0/SUCCESS) +    Tasks: 0 (limit: 2181) +   CGroup: /system.slice/cockpit.socket +``` + +### 使用 Cockpit + +#### 连接 + +默认的监听端口号是 9090。打开你最喜欢的 Web 浏览器并输入地址,例如: `https://pibox:9090`。 + +![Cockpit home page][3] + +你现在可以使用你的普通账户登录。同样,这个账户上需要有使用 `sudo` 的权限 —— 很可能就是你用来 SSH 和运行 Apt 的那个账户。一定要勾选“为特权任务重用我的密码”。 + +#### 管理你的树莓派 + +Cockpit 的初始屏幕以 “System” 页开始,提供当前 CPU 和内存使用的详细信息和图表。 + +![Initial Cockpit screen][5] + +你可以从这个屏幕看到硬件细节。 + +![Cockpit hardware details][6] + +通过点击每一项来展开左边的列(例如,日志、存储、服务等)。这些是标准的 Cockpit 部分,不言自明。让我快速描述一下每个部分。 + +#### 日志 + +这部分展示了日志。它们可以根据日期和严重程度来过滤。 + +#### 存储 + +存储部分展示了已经安装的物理驱动器和 RAID 设备。例如大小、序列号等细节都被展示了出来。还展示了读/写活动和实际空间使用的图表。存储的具体日志显示在底部。 + +#### 网络 + +这部分展示了发送和接收活动、IP 地址以及网络特定的日志。你还可以使用相应的按钮添加更多的网络设备,如绑定、网桥和 VLAN。 + +#### 账户 + +这里展示了已有的账户。点击每个账户来管理,或使用创建新账户按钮来添加用户。账户也可以被删除。 + +#### 服务 + +这部分可以让管理员查看系统所有服务的状态。点击任何服务都会转到一个包含启动、重启和禁用的标准任务的屏幕。 + +#### 应用程序 + +通常,这个屏幕提供了各种用于管理功能的应用程序,例如 389 目录服务器或创建 Podman 容器。但在我的树莓派 OS 上,这个屏幕只显示“没有安装或可用的应用程序”。在写这篇文章的时候,这个或许还没有实现。虽然,你可能会怀疑这类型的程序对于树莓派硬件来说是否太过沉重。 + +#### 软件更新 + +对任何系统管理员来说,保持软件最新是最重要的任务之一。Cockpit 的软件更新部分可以检查并进行更新。 + +![Software updates in Cockpit][7] + +#### 终端 + +Cockpit 最方便的特点之一是终端。你可以使用它,而不是打开一个单独的终端模拟器并使用 SSH。我使用终端来安装 [ScreenFetch][8]: + +``` +$ sudo apt install screenfetch +``` + +使用 ScreenFetch 生成了这张截图: + +![Terminal in Cockpit][9] + +### 使用 Cockpit 的中心控制 + +Cockpit 在树莓派上的表现就像它在其他 Linux 系统上一样。你可以将它添加到仪表盘上进行集中控制。它允许企业在 Cockpit 作为管理仪表盘解决方案的任何地方,将基于树莓派的服务和系统整合到他们的整体 Linux 基础设施中。因为树莓派经常在高密度机架数据中心以无外接控制headless方式运行,而这些数据中心通常会缺乏 KVM 访问方式,这是非常方便的。 + +-------------------------------------------------------------------------------- + +via: https://opensource.com/article/21/5/raspberry-pi-cockpit + +作者:[Alan Formy-Duval][a] +选题:[lujun9972][b] +译者:[RiaXu](https://github.com/ShuyRoy) +校对:[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_kuberenetes_cluster_lead2_0.jpeg?itok=kx0Zc0NK (Neon colorized Raspberry Pi cluster with LEGOs) +[2]: https://opensource.com/article/20/11/cockpit-server-management +[3]: https://opensource.com/sites/default/files/uploads/cockpit_homepage.png (Cockpit home page) +[4]: https://creativecommons.org/licenses/by-sa/4.0/ +[5]: https://opensource.com/sites/default/files/uploads/cockpit_initialscreen.png (Initial Cockpit screen) +[6]: https://opensource.com/sites/default/files/uploads/hardware_details.png (Cockpit hardware details) +[7]: https://opensource.com/sites/default/files/uploads/software_updates.png (Software updates in Cockpit) +[8]: https://opensource.com/article/20/1/screenfetch-neofetch +[9]: https://opensource.com/sites/default/files/uploads/pi_cockpit_terminal.png (Terminal in Cockpit) diff --git a/published/202106/20210519 Slice infinite generators with this Python 3.7 feature.md b/published/202106/20210519 Slice infinite generators with this Python 3.7 feature.md new file mode 100644 index 0000000000..82480a7e1c --- /dev/null +++ b/published/202106/20210519 Slice infinite generators with this Python 3.7 feature.md @@ -0,0 +1,137 @@ +[#]: subject: (Slice infinite generators with this Python 3.7 feature) +[#]: via: (https://opensource.com/article/21/5/python-37-features) +[#]: author: (Moshe Zadka https://opensource.com/users/moshez) +[#]: collector: (lujun9972) +[#]: translator: (geekpi) +[#]: reviewer: (wxy) +[#]: publisher: (wxy) +[#]: url: (https://linux.cn/article-13459-1.html) + +用这个 Python 3.7 的特性来切片无限生成器 +====== + +> 了解更多关于这个和其他两个未被充分利用但仍然有用的 Python 特性。 + +![](https://img.linux.net.cn/data/attachment/album/202106/05/230956bgcjacwcyujlndez.jpg) + +这是关于 Python 3.x 首发特性系列文章的第八篇。[Python 3.7][2] 于 2018 年首次发布,尽管它已经发布了几年,但它引入的许多特性都未被充分利用,而且相当酷。下面是其中的三个。 + +### 注解推迟评估 + +在 Python 3.7 中,只要激活了正确的 `__future__` 标志,注解在运行时就不会被评估: + +``` +from __future__ import annotations + +def another_brick(wall: List[Brick], brick: Brick) -> Education: + pass +``` + +``` +another_brick.__annotations__ +``` + +``` + {'wall': 'List[Brick]', 'brick': 'Brick', 'return': 'Education'} +``` + +它使递归类型(指向自己的类)和其他有趣的事情成为了可能。然而,这意味着如果你想做自己的类型分析,你需要明确地使用 `ast`。 + +``` +import ast +raw_type = another_brick.__annotations__['wall'] +[parsed_type] = ast.parse(raw_type).body +``` + +``` +subscript = parsed_type.value +f"{subscript.value.id}[{subscript.slice.id}]" +``` + +``` +    'List[Brick]' +``` + +### itertools.islice 支持 __index__ + +Python 中的序列切片长期以来一直接受各种 _类 int 对象_(具有 `__index__()` 的对象)作为有效的切片部分。然而,直到 Python 3.7,`itertools.islice`,即核心 Python 中对无限生成器进行切片的唯一方法,才获得了这种支持。 + +例如,现在可以用 `numpy.short` 大小的整数来切片无限生成器: + +``` +import numpy +short_1 = numpy.short(1) +short_3 = numpy.short(3) +short_1, type(short_1) +``` + +``` +    (1, numpy.int16) +``` + +``` +import itertools +list(itertools.islice(itertools.count(), short_1, short_3)) +``` + +``` +    [1, 2] +``` + +### functools.singledispatch() 注解注册 + +如果你认为 [singledispatch][3] 已经很酷了,你错了。现在可以根据注解来注册了: + +``` +import attr +import math +from functools import singledispatch + +@attr.s(auto_attribs=True, frozen=True) +class Circle: +    radius: float +        +@attr.s(auto_attribs=True, frozen=True) +class Square: +    side: float + +@singledispatch +def get_area(shape): +    raise NotImplementedError("cannot calculate area for unknown shape", +                              shape) + +@get_area.register +def _get_area_square(shape: Square): +    return shape.side ** 2 + +@get_area.register +def _get_area_circle(shape: Circle): +    return math.pi * (shape.radius ** 2) + +get_area(Circle(1)), get_area(Square(1)) +``` + +``` +    (3.141592653589793, 1) +``` + +### 欢迎来到 2017 年 + +Python 3.7 大约是四年前发布的,但是在这个版本中首次出现的一些特性非常酷,而且没有得到充分利用。如果你还没使用,那么将它们添加到你的工具箱中。 + +-------------------------------------------------------------------------------- + +via: https://opensource.com/article/21/5/python-37-features + +作者:[Moshe Zadka][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/moshez +[b]: https://github.com/lujun9972 +[1]: https://opensource.com/sites/default/files/styles/image-full-size/public/lead-images/python-programming-code-keyboard.png?itok=fxiSpmnd (Hands on a keyboard with a Python book ) +[2]: https://opensource.com/downloads/cheat-sheet-python-37-beginners +[3]: https://opensource.com/article/19/5/python-singledispatch diff --git a/published/202106/20210520 Make your API better with this positional trick from Python 3.8.md b/published/202106/20210520 Make your API better with this positional trick from Python 3.8.md new file mode 100644 index 0000000000..3cc383ade7 --- /dev/null +++ b/published/202106/20210520 Make your API better with this positional trick from Python 3.8.md @@ -0,0 +1,126 @@ +[#]: subject: (Make your API better with this positional trick from Python 3.8) +[#]: via: (https://opensource.com/article/21/5/python-38-features) +[#]: author: (Moshe Zadka https://opensource.com/users/moshez) +[#]: collector: (lujun9972) +[#]: translator: (geekpi) +[#]: reviewer: (wxy) +[#]: publisher: (wxy) +[#]: url: (https://linux.cn/article-13466-1.html) + +用 Python 3.8 中的这个位置技巧让你的 API 变得更好 +====== + +> 探索只接受位置参数和其他两个未被充分利用但仍然有用的 Python 特性。 + +![](https://img.linux.net.cn/data/attachment/album/202106/07/164929k51eccocxkx4xf11.jpg) + +这是 Python 3.x 首发特性系列文章的第九篇。Python 3.8 于 2019 年首次发布,两年后,它的许多很酷的新特性仍然没有被使用。下面是其中的三个。 + +### importlib.metadata + +[入口点][2] 在 Python 包中被用来做各种事情。大多数人熟悉的是 [console_scripts][3] 入口点,不过 Python 中的许多插件系统都使用它们。 + +在 Python 3.8 之前,从 Python 中读取入口点的最好方法是使用 `pkg_resources`,这是一个有点笨重的模块,它是 `setuptools` 的一部分。 + +新的 `importlib.metadata` 是一个内置模块,它允许访问同样的东西: + +``` +from importlib import metadata as importlib_metadata + +distribution = importlib_metadata.distribution("numpy") +distribution.entry_points +``` + +``` +    [EntryPoint(name='f2py', value='numpy.f2py.f2py2e:main', group='console_scripts'), +     EntryPoint(name='f2py3', value='numpy.f2py.f2py2e:main', group='console_scripts'), +     EntryPoint(name='f2py3.9', value='numpy.f2py.f2py2e:main', group='console_scripts')] +``` + +入口点并不是 `importlib.metadata` 允许访问的唯一东西。可以调试、报告,或者(在极端情况下)触发兼容模式,你也可以在运行时检查依赖的版本! + + +``` +f"{distribution.metadata['name']}=={distribution.version}"`[/code] [code]`    'numpy==1.20.1' +``` + +### 只接受位置参数 + +强制关键字的参数在传达 API 作者的意图方面取得巨大成功之后,另一个空白被填补了:只接受位置参数。 + +特别是对于那些允许使用任意关键字的函数(例如,生成数据结构),这意味着对允许的参数名称的限制更少: + +``` +def some_func(prefix, /, **kwargs): +    print(prefix, kwargs) +``` + +``` +some_func("a_prefix", prefix="prefix keyword value") +``` + +``` +   a_prefix {'prefix': 'prefix keyword value'}` +``` + +注意,令人困惑的是,_变量_ `prefix` 的值与 `kwargs["prefix"]` 的值不同。就像在很多地方一样,要注意小心使用这个功能。 + +### 自我调试表达式 + +50 多年来,`print()` 语句(及其在其他语言中的对应语句)一直是快速调试输出的最爱。 + +但是我们在打印语句方面取得了很大的进展,比如: + +``` +special_number = 5 +print("special_number = %s" % special_number) +``` + +``` +    special_number = 5 +``` + +然而,自我记录的 f-strings 使它更容易明确: + + +``` +print(f"{special_number=}") +``` + +``` +    special_number=5` +``` + +在 f-string 插值部分的末尾添加一个 `=`,可以保留字面部分,同时添加数值。 + +当更复杂的表达式在该部分内时,这就更有用了: + +``` +values = {} +print(f"{values.get('something', 'default')=}") +``` + +``` +    values.get('something', 'default')='default' +``` + +### 欢迎来到 2019 年 + +Python 3.8 大约在两年前发布,它的一些新特性非常酷,而且没有得到充分利用。如果你还没使用,那么将他们添加到你的工具箱中。 + +-------------------------------------------------------------------------------- + +via: https://opensource.com/article/21/5/python-38-features + +作者:[Moshe Zadka][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/moshez +[b]: https://github.com/lujun9972 +[1]: https://opensource.com/sites/default/files/styles/image-full-size/public/lead-images/OSDC_women_computing_5.png?itok=YHpNs_ss (Women in computing and open source v5) +[2]: https://packaging.python.org/specifications/entry-points/ +[3]: https://python-packaging.readthedocs.io/en/latest/command-line-scripts.html diff --git a/published/202106/20210521 How Python 3.9 fixed decorators and improved dictionaries.md b/published/202106/20210521 How Python 3.9 fixed decorators and improved dictionaries.md new file mode 100644 index 0000000000..6f4a929d87 --- /dev/null +++ b/published/202106/20210521 How Python 3.9 fixed decorators and improved dictionaries.md @@ -0,0 +1,129 @@ +[#]: subject: (How Python 3.9 fixed decorators and improved dictionaries) +[#]: via: (https://opensource.com/article/21/5/python-39-features) +[#]: author: (Moshe Zadka https://opensource.com/users/moshez) +[#]: collector: (lujun9972) +[#]: translator: (geekpi) +[#]: reviewer: (wxy) +[#]: publisher: (wxy) +[#]: url: (https://linux.cn/article-13477-1.html) + +Python 3.9 如何修复装饰器并改进字典 +====== + +> 探索最近版本的 Python 的一些有用的特性。 + +![](https://img.linux.net.cn/data/attachment/album/202106/12/115315xrnd4evse8uzpi8i.jpg) + +这是 Python 3.x 首发特性系列文章中的第十篇,其中一些版本已经发布了一段时间。Python 3.9 在 2020 年首次发布,具有很酷的新特性,但仍未被充分利用。下面是其中的三个。 + +### 添加字典 + +假设你有一个 `defaults` 字典,而你想更新它的参数。在 Python 3.9 之前,最好的办法是复制 `defaults` 字典,然后使用 `.update()` 方法。 + +Python 3.9 为字典引入了联合运算符: + +``` +defaults = dict(who="someone", where="somewhere") +params = dict(where="our town", when="today") +defaults | params +``` + +``` + {'who': 'someone', 'where': 'our town', 'when': 'today'} +``` + +注意,顺序很重要。在这种情况下,正如预期,来自 `params` 的 `where` 值覆盖了默认值。 + +### 删除前缀 + +如果你用 Python 做临时的文本解析或清理,你会写出这样的代码: + +``` +def process_pricing_line(line): + if line.startswith("pricing:"): + return line[len("pricing:"):] + return line +process_pricing_line("pricing:20") +``` + +``` + '20' +``` + +这样的代码很容易出错。例如,如果字符串被错误地复制到下一行,价格就会变成 `0` 而不是 `20`,而且会悄悄地发生。 + +从 Python 3.9 开始,字符串有了一个 `.lstrip()` 方法: + +``` +"pricing:20".lstrip("pricing:") +``` + +``` + '20' +``` + +### 任意的装饰器表达式 + +以前,关于装饰器中允许哪些表达式的规则没有得到充分的说明,而且很难理解。例如:虽然 + +``` +@item.thing +def foo(): + pass +``` + +是有效的,而且: + +``` +@item.thing() +def foo(): + pass +``` + +是有效的,相似地: + +``` +@item().thing +def foo(): + pass +``` + +产生一个语法错误。 + +从 Python 3.9 开始,任何表达式作为装饰器都是有效的: + +``` +from unittest import mock + +item = mock.MagicMock() + +@item().thing +def foo(): + pass +print(item.return_value.thing.call_args[0][0]) +``` + +``` + +``` + +虽然在装饰器中保持简单的表达式仍然是一个好主意,但现在是人类的决定,而不是 Python 分析器的选择。 + +### 欢迎来到 2020 年 + +Python 3.9 大约在一年前发布,但在这个版本中首次出现的一些特性非常酷,而且没有得到充分利用。如果你还没使用,那么将它们添加到你的工具箱中。 + +-------------------------------------------------------------------------------- + +via: https://opensource.com/article/21/5/python-39-features + +作者:[Moshe Zadka][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/moshez +[b]: https://github.com/lujun9972 +[1]: https://opensource.com/sites/default/files/styles/image-full-size/public/lead-images/coffee_python.jpg?itok=G04cSvp_ (Python in a coffee cup.) \ No newline at end of file diff --git a/published/202106/20210523 3 reasons to learn Java in 2021.md b/published/202106/20210523 3 reasons to learn Java in 2021.md new file mode 100644 index 0000000000..fbbf2c5e53 --- /dev/null +++ b/published/202106/20210523 3 reasons to learn Java in 2021.md @@ -0,0 +1,89 @@ +[#]: subject: (3 reasons to learn Java in 2021) +[#]: via: (https://opensource.com/article/21/5/java) +[#]: author: (Seth Kenlon https://opensource.com/users/seth) +[#]: collector: (lujun9972) +[#]: translator: (PearFL) +[#]: reviewer: (wxy) +[#]: publisher: (wxy) +[#]: url: (https://linux.cn/article-13491-1.html) + +2021 年学习 Java 的三个理由 +====== + +> Java 具有功能强大、多样化、可拓展、有趣的特点。这就是 Java 为什么被我们广泛使用,也是我们如何正确使用它的方式。 + +![](https://img.linux.net.cn/data/attachment/album/202106/16/122019wdrbtby3dlf9uu49.jpg) + +Java 是在 1995 年发布的,当我写这篇文章的时候,它已经 26 岁了。起初它是专有的,但在 2007 年,Java 基于 GPL 协议被开源发布了。如果想要理解是什么使得 Java 变得非常重要,你就必须理解它声称要解决的是什么样的问题,从而你就能理解它让开发者和用户受益的原因和方式。 + +理解 Java 解决了什么问题的最好方式就是进行软件开发,当然啦,如果不做开发,仅仅只是使用软件也会是一个很好的开始。作为一名开发人员,当你将在自己的本地计算机上运行良好的软件部署到其他计算机上运行时,一些稀奇古怪的麻烦可能就出现了,从而导致软件可能无妨正常运行。软件本应正常工作,但每个程序员都明白,一些问题总是会被忽视。当你在另一个操作系统上尝试运行该软件时,情况就变得更加复杂了。这也是为什么在每一个软件的获取页面上都会有针对不同的操作系统有对应下载按钮的原因:Windows 的、macOS 的、Linux 的、移动端的、甚至许多其他操作系统环境的下载选项。 + +作为一名用户,一个典型的场景是你想下载一些优秀的软件,但它却不适用于你的平台。遗憾的是这样的情况仍然发生在当下非常先进的计算机上,它们可以在计算机中运行虚拟机,通过仿真使老式视频游戏保持活力,甚至可以放在你的口袋里,但软件交付实际上相当困难。 + +有没有更好的办法?可能会有吧。 + +### 1、一次编码,任意环境都能跑通 + +令人惊讶甚至是失望的是,代码是特定于操作系统和环境的。代码需要从对人友好的高级程序设计语言编译成机器语言,即被设计可以用于让 CPU 响应的一系列二进制指令。在先进的计算机世界中,我们很难理解为什么不能仅仅只要编写代码,就能将它发送给任何一个想要运行它的平台,无需担忧它们正处在什么样的平台中。 + +Java 可以解决这种不协调的问题。它的代码是可以跨平台进行工作的,在任何运行它的系统上都执行相同的工作。Java 实现这一壮举的方法起初是有悖常理的。在某种程度上,Java 只与一台计算机兼容。奇怪的是,这台电脑实际上并不存在。Java 代码的目标计算机是Java 虚拟机(JVM)。这是一个由 Java 的创建者编写的程序,可用于你能想到的任何计算机设备。只要你安装了它,你运行的任何 Java 代码都会由你计算机中的这台“虚拟”计算机进行处理。Java 代码会由 JVM 执行,JVM 向你的计算机发送适当的特定于平台的指令,因此所有工作在每个操作系统和架构上都是一样的。 + +当然,Java 使用的方法并不是这里的真正的卖点。大多数用户和许多开发人员并不关心软件兼容性是如何实现的,只关心它是否具备兼容性。许多语言都承诺提供跨平台的功能,通常情况下,这个承诺最终都是真的,但是这个过程并不总是容易实现的。编程语言必须针对其目标平台进行编译,脚本语言需要特定于平台的解释器,而且两者都很难确保对底层系统资源的一致访问。跨平台支持变得越来越好,库可以帮助转换路径、环境变量和设置,并且一些框架(特别是 [Qt][2])在弥补外设访问的差距方面做了很多工作。但是,Java 始终可靠地提供它的兼容性。 + +### 2、明智的代码 + +Java 的语法即使是在最好的方面也很无聊。如果你把所有流行的编程语言都放在一个摇滚杯中,那么你会得到 Java。通过观察 Java 编写的源代码,你或多或少会均匀地看到所有特定的编程表达方式。括号表示函数和流程控制的范围、变量在使用前被明确地声明和实例化,并且表达式具有清晰一致的结构。 + +我发现 Java 学习过程中通常会鼓励自学成才的程序员使用结构化程度较少的语言编写更精炼的代码。从网上学习的源代码中收集到的技术中,有许多“基本”编程经验是你无法学到的,比如以 Java 公开字段的风格进行全局变量声明、正确地预测和处理异常、使用类和函数、和许多其他的技术。从 Java 借鉴的一点小改动可以产生很大的不同。 + +### 3、脚手架和支持 + +流行的编程语言都有很好的支持系统,这也是使得其变成流行语言的原因。它们都有很多文档资料,有针对它们的集成开发环境或 IDE 扩展、示例代码、免费和付费培训和开发者社区。在另一方面,当你在尝试做某事遇到困难时,似乎没有任何编程语言有足够的支持。 + +我不能说 Java 可以摆脱这两个普遍但又相互矛盾的事实。尽管如此,我发现当我需要一个 Java 库时,我必然能为给定的任务找到多个选项。通常我不想使用一个库的原因是我不喜欢它的开发人员如何实现我需要的功能,它的许可证与我喜欢的有所不同,或者有其他琐碎的争议点。当一门语言得到大量支持时,我就会很多的选择性。我可以从许多合适的解决方案中选择一个最能满足我需求的,不论我的需求多么微不足道都能被最好得满足。 + +更好的是,围绕 Java 有一个健康的基础设施。像 [Apache Ant][3]、[Gradle][4] 和 [Maven][5] 等工具可以帮助管理构建和交付的过程。像 [Sonatype Nexus][6] 等服务帮助实现监控的安全性。[Spring][7] 和 [Grails][8] 使 Web 开发变得更加容易,而 [Quarkus][9] 和 [Eclipse Che][10] 有助于云上的开发。 + +在接触 Java 语言本身时,你甚至可以选择使用什么样的版本。[OpenJDK][11] 提供经典的、官方的 Java,而 [Groovy][12] 是一种类似于脚本语言的简化方法(你可以把它比作 Python),而 [Quarkus][13] 提供了一个容器优先开发的框架。 + +还有很多,但现在已经足以说明 Java 是一个完整的生态了,无论你想在其中寻找什么。 + +### 此外,简单易学 + +事实证明,Java 对我和各行各业的许多开发人员来说是一个明智的解决方案。以下是我喜欢使用 Java 的一些原因。 + +你可能听说过或推断出 Java 是一种“专业”语言,只适用于笨重的政府网站,专供“真正的”开发人员使用。千万不要被 Java 25 年以来的各种名声所迷惑!它的可怕程度只有它名声的一半,这意思是,并不比其他任何语言更可怕。 + +编程很困难的这件事是无法回避的,它要求你基于逻辑进行思考,学习一种比母语表达方式更少的新语言,要你弄清楚如何解决困难的问题,使它们可以使用你的程序完成自动化的执行,没有语言可以避免这些问题。 + +然而,编程语言的学习曲线的差异令人惊讶。有些一开始很容易,但当你开始探索细节时就会变得复杂。换句话说,打印“hello world”可能只需要一行代码,但当你学习到了类和函数, 你相当于开始重新学习这门语言(或者至少是它的数据模型)。Java 从一开始就是 Java,一旦你学会了它,就可以使用它的许多技巧和便利。 + +简而言之: 去学习 Java 吧!它具有功能强大、多样化、可拓展、有趣的特点。为了给你提供帮助, [下载我们的 Java 备忘单][14], 它包含你在开发前十个项目时需要的所有基本语法。在那之后,你就不再需要它了,因为 Java 具有完美的一致性和可预测性。来享受它吧! + +-------------------------------------------------------------------------------- + +via: https://opensource.com/article/21/5/java + +作者:[Seth Kenlon][a] +选题:[lujun9972][b] +译者:[PearFL](https://github.com/PearFL) +校对:[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/studying-books-java-couch-education.png?itok=C9gasCXr (Learning and studying technology is the key to success) +[2]: http://qt.io +[3]: https://ant.apache.org/ +[4]: https://gradle.org +[5]: https://spring.io/guides/gs/maven +[6]: https://www.sonatype.com/products/repository-pro +[7]: http://spring.io +[8]: https://grails.org +[9]: https://opensource.com/article/21/4/quarkus-tutorial +[10]: https://opensource.com/article/19/10/cloud-ide-che +[11]: http://adoptopenjdk.net +[12]: https://opensource.com/article/20/12/groovy +[13]: https://developers.redhat.com/products/quarkus/getting-started +[14]: https://opensource.com/downloads/java-cheat-sheet diff --git a/published/202106/20210524 How to Install and Use XRDP on Ubuntu for Remote Desktop Connection.md b/published/202106/20210524 How to Install and Use XRDP on Ubuntu for Remote Desktop Connection.md new file mode 100644 index 0000000000..ccd33e8e01 --- /dev/null +++ b/published/202106/20210524 How to Install and Use XRDP on Ubuntu for Remote Desktop Connection.md @@ -0,0 +1,180 @@ +[#]: subject: (How to Install and Use XRDP on Ubuntu for Remote Desktop Connection) +[#]: via: (https://itsfoss.com/xrdp-ubuntu/) +[#]: author: (Hunter Wittenborn https://itsfoss.com/author/hunter/) +[#]: collector: (lujun9972) +[#]: translator: (geekpi) +[#]: reviewer: (wxy) +[#]: publisher: (wxy) +[#]: url: (https://linux.cn/article-13463-1.html) + +如何在 Ubuntu 上安装和使用 XRDP 进行远程桌面连接 +====== + +![](https://img.linux.net.cn/data/attachment/album/202106/07/093752qs3feworsvyoflvl.jpg) + +> 这是一份初学者指南,展示了在基于 Ubuntu 的 Linux 发行版上设置 XRDP 所需要遵循的步骤。有了它,你就可以从不同的电脑上访问你的 Ubuntu 系统,并以图形方式使用它。 + +微软的 [远程桌面协议][1](RDP) 是一个允许从一台计算机到另一台计算机进行图形化远程桌面连接的协议。RDP 的工作原理是让一台主机运行软件,允许其他几台计算机连接到它。 + +[XRDP][2] 是 RDP 的一个开源实现,不需要运行任何专有程序。XRDP 不仅试图遵循 RDP,而且还与常规的 RDP 客户端兼容,如 [Remmina][3] 和 [GNOME Boxes][4]。 + +下面是 XRDP 连接屏幕的样子。 + +![][5] + +### 使用 XRDP 需要注意的事项 + +虽然 XRDP 对于机器的远程访问非常好用,但重要的是要知道 XRDP **不** 适合什么。 + +#### 如果你需要一个安全的连接,请不要使用 XRDP + +通过 XRDP 建立的连接可以被攻击者查看和修改,因此应避免任何敏感信息。这一点可以通过使用 SSH 连接或证书来缓解,但这两者都需要更复杂的设置,这里就不一一介绍了。 + +#### XRDP 在默认情况下不能很好地应用主题 + +在我的测试中,XRDP 默认似乎从未应用过 [Ubuntu][6] 主题。在文章的结尾处有关于解决这个问题的说明。 + +#### 如果你只想/需要一个 CLI 环境,就不要使用 XRDP + +XRDP 是为在 GUI 环境中使用而设计和制造的。如果你打算在 CLI 环境中使用它,比如在服务器上,你应该看看其他工具,比如 SSH。 + +### 在 Ubuntu 上安装和使用 XRDP + +下面是这个远程连接设置正常工作所需的设置: + +* 一个安装了 XRDP 服务器的 Linux 系统。这是一个将被远程访问的系统。 +* 远程系统应该和你的系统在同一个网络上,或者它应该有一个 [公共 IP 地址][15]。 +* 远程 Linux 系统的用户名和密码。 +* 安装有 RDP 客户端的另一个系统(无论是 Linux、macOS 还是 Windows)。 + +![][8] + +#### 第 1 步:在远程计算机上安装 XRDP + +安装 XRDP 只需几个步骤,而且是相当直接的操作。 + +> 备注:在访问任何地方之前,请注意,这里说的 “远程机器” 是其他人连接到的机器。 + +XRDP 包含在大多数发行版的软件库中。在 Ubuntu 上,你可以在 universe 库中找到它。 + +你可以用下面的命令来安装它: + +``` +sudo apt install xrdp +``` + +#### 第 2 步:连接到远程机器 + +好消息是,XRDP 开箱就能使用! + +要连接到你安装了 XRDP 的机器上,你首先需要在本地机器上安装一个 RDP 客户端。 + +我将使用 GNOME Boxes,它可以通过以下方式安装: + +``` +sudo apt install gnome-boxes +``` + +GNOME Boxes 更多的是以虚拟机使用而闻名,但它也支持其他各种协议,包括 XRDP。 + +如果由于某种原因你不想使用 Boxes,你也可以使用一个叫做 Remmina 的客户端。 + +``` +sudo apt install remmina +``` + +不过,请注意,在本教程的其余部分,我将使用 Boxes。 + +首先,启动 GNOME Boxes,并点击 “+” 号,选择 “连接到远程计算机…”。 + +![][10] + +接下来,输入你要连接的机器的 IP 地址,前缀为 `rdp://`,然后按下图连接: + +> **不确定你的 IP 地址是什么?** +> +> 你可以用 `ip address` 命令找到你的 IP 地址。你需要寻找一个看起来像分成四组的数字的东西: +> ``` +> abhishek@its-foss:~$ ip address +> 1: lo: mtu 65536 qdisc noqueue state UNKNOWN group default qlen 1000 +> link/loopback 00:00:00:00:00:00 brd 00:00:00:00:00:00 +> inet 127.0.0.1/8 scope host lo +> valid_lft forever preferred_lft forever +> 2: wlp0s20f3: mtu 1500 qdisc noqueue state UP group default qlen 1000 +> link/ether dc:46:b9:fb:7a:c5 brd ff:ff:ff:ff:ff:ff +> inet 192.168.0.107/24 brd 192.168.0.255 scope global dynamic noprefixroute wlp0s20f3 +> valid_lft 6183sec preferred_lft 6183sec +> ``` + +避免任何名为 `127.0.0.1` 的 IP 地址,因为那个地址指向你运行命令的机器。输出中应该有更多的 IP 地址,如上图所示。 + +![][11] + +然后,你应该会看到一个登录页面。将“会话”设置为 “Xorg”,只需输入你的用户名和密码,然后点击 “OK”。 + +![][5] + +之后,你应该看到远程主机的桌面: + +![][12] + +至此,一切都会像机器在你面前时一样表现。 + +### 故障排除:修复 XRDP 连接的主题问题 + +在我对 Ubuntu 20.04 的测试中,默认的 Yaru 主题似乎在连接时没有应用。这可以通过一些努力来解决。 + +首先,在远程计算机上运行这个命令: + +``` +sudo apt install gnome-tweaks gnome-shell-extensions dconf-editor -y +``` + +接下来,打开 “扩展” 应用,并打开如下开关: + +![][13] + +接下来,关闭你的远程桌面会话并重新登录。现在,打开 Tweaks,按照下面的截图配置: + +![][14] + +最后,打开 dconf 编辑器,并进入 `/org/gnome/shell/extensions/dash-toock/`。设置如下所示的值: + +* `custom-theme-shrink`:`On` +* `dock-fixed`:`On` +* `transparency-mode`:`FIXED` + +### 总结 + +至此,一切都准备好了,可以做你需要做的事了。 + +如果有什么地方做得不太对,或者你有什么问题或意见,请在下面留言。我会尽力帮助你的。 + +-------------------------------------------------------------------------------- + +via: https://itsfoss.com/xrdp-ubuntu/ + +作者:[Hunter Wittenborn][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/hunter/ +[b]: https://github.com/lujun9972 +[1]: https://en.wikipedia.org/wiki/Remote_Desktop_Protocol +[2]: https://en.wikipedia.org/wiki/Xrdp +[3]: https://remmina.org/ +[4]: https://wiki.gnome.org/Apps/Boxes +[5]: https://i2.wp.com/itsfoss.com/wp-content/uploads/2021/05/xrdp_connected_login.png?resize=716%2C582&ssl=1 +[6]: https://ubuntu.com/ +[7]: https://itsfoss.com/install-gui-ubuntu-server/ +[8]: https://i2.wp.com/itsfoss.com/wp-content/uploads/2021/05/xrdp-ubuntu.png?resize=800%2C450&ssl=1 +[9]: https://itsfoss.com/check-ip-address-ubuntu/ +[10]: https://i0.wp.com/itsfoss.com/wp-content/uploads/2021/05/xrdp_gnome-boxes_connect-begin.png?resize=744%2C580&ssl=1 +[11]: https://i1.wp.com/itsfoss.com/wp-content/uploads/2021/05/xrdp_gnome-boxes_rdp-connect.png?resize=757%2C514&ssl=1 +[12]: https://i1.wp.com/itsfoss.com/wp-content/uploads/2021/05/xrdp_connected_homescreen.png?resize=711%2C595&ssl=1 +[13]: https://i1.wp.com/itsfoss.com/wp-content/uploads/2021/05/xrdp_extensions.png?resize=800%2C557&ssl=1 +[14]: https://i2.wp.com/itsfoss.com/wp-content/uploads/2021/05/xrdp_tweaks.png?resize=800%2C550&ssl=1 +[15]: https://itsfoss.com/check-ip-address-ubuntu/ \ No newline at end of file diff --git a/published/202106/20210526 How I monitor my greenhouse with CircuitPython and open source tools.md b/published/202106/20210526 How I monitor my greenhouse with CircuitPython and open source tools.md new file mode 100644 index 0000000000..1248ca1e70 --- /dev/null +++ b/published/202106/20210526 How I monitor my greenhouse with CircuitPython and open source tools.md @@ -0,0 +1,276 @@ +[#]: subject: (How I monitor my greenhouse with CircuitPython and open source tools) +[#]: via: (https://opensource.com/article/21/5/monitor-greenhouse-open-source) +[#]: author: (Darin London https://opensource.com/users/dmlond) +[#]: collector: (lujun9972) +[#]: translator: (alim0x) +[#]: reviewer: (wxy) +[#]: publisher: (wxy) +[#]: url: (https://linux.cn/article-13504-1.html) + +我如何用 CircuitPython 和开源工具监控温室 +====== + +> 使用微控制器、传感器、Python 以及 MQTT 持续追踪温室的温度、湿度以及环境光。 + +![种有西红柿的温室花园][1] + +CircuitPython 提供了一种和微控制器板进行交互的革命性方式。这篇文章介绍了如何使用 CircuitPython 来监测温室的温度、湿度以及环境光,并且使用 CircuitPython MQTT 客户端将结果发布到一个 [MQTT][2] 中介broker。你可以在若干个程序中订阅 MQTT 队列并进一步处理信息。 + +这个项目使用一个简单的 Python 程序来运行 Web 服务器,它发布一个 Prometheus 格式的采集端点,拉取监控指标到 [Prometheus][3] 进行不间断的监控。 + +### 关于 CircuitPython + +[CircuitPython][4] 是一个由 [Adafruit][5] 创建的开源 Python 发行版,用于运行在低成本微控制器开发板上。CircuitPython 为与 [兼容的开发板][6] 的交互提供了简单的开发体验。你可以在连接你的开发板时挂载的 `CIRCUITPYTHON` 根驱动器上创建一个 `code.py` 文件来启动你的程序。CircuitPython 还为开发板提供了一个串行连接,包含一个交互式解释器(REPL)会话,你可以使用 Python 代码实时和开发板进行交互。 + +Adafruit 的网站提供了大量的文档,可以帮助你开始使用 CircuitPython。首先,参考下《[欢迎来到 CircuitPython][7]》指南。这份指南能够帮助你开始使用 CircuitPython 在开发板上运行代码以及和 REPL 交互。它还记录了如何安装 Adafruit 的 CircuitPython 库合集和范例,可以用在它出售的许多开发板和传感器上。接下来,阅读《[CircuitPython 基础][8]》指南来学习更多关于其功能的信息,里面还有链接指向在特定及兼容的开发板上使用 CircuitPython 的相关信息。最后,就如所有开源软件一样,你可以深入 [CircuitPython 的源码][9],发布议题,以及做出贡献。 + +### 微控制器设置 + +微控制器系统非常简单。要完成这个示例项目,你会需要: + + * **树莓派 4**:你需要一台电脑来给微控制器系统编程,我用的是树莓派 4。 + * **CircuitPython 兼容的微控制器**:我用的是 [Adafruit Feather S2][10],带有内置 WiFi,环境光传感器,Qwiic 线缆输入。 + * **微控制器 WiFi**:Feather S2 内置了 WiFi。如果你的微控制器没有,你需要给开发板找个 WiFi 扩展板。 + * **传感器**:Feather S2 有个内置的环境光传感器,所以我还需要一个温湿度传感器。有很多不同厂商的产品可以选择,包括 Adafruit、SparkFun、亚马逊。我用的是一个 [Adafruit 传感器][11],带有 Feather S2 输入兼容的 Qwiic 线缆。尽管多数 SparkFun 传感器可以在 Adafruit 库下工作,但如果你不是从 Adafruit 购买的传感器,你可能还是需要自己去找到它兼容 CircuitPython 的 Python 库。 + * **跳线和线缆**:为了避免使用面包板或焊接,我使用 [Adafruit Qwiic 线缆][12]。SparkFun 销售的包含不同长度的[线缆套装][13]中也有它。 + +在将微控制器连接到你的电脑之前,将传感器连接到微控制器上。 + +![将传感器连接到微控制器上][14] + +现在你可以将微控制器用 USB 数据线连接到你的电脑。 + +### MQTT 中介 + +你可以使用 [这份说明][16] 来在树莓派的系统上安装 [Mosquitto MQTT 中介][17] 和 Mosquitto 客户端。如果你想把树莓派做为长期服务器使用,在你的网络上给树莓派 4 设置一个静态 IP 地址。Mosquitto 中介运行起来之后,创建一份 [用户名/密码文件][18],设置客户端向中介发布和订阅消息时用的认证信息。 + +你可以用树莓派上的 Mosquitto 客户端来测试 MQTT 中介。打开两个终端(如果你是无界面运行的话打开两个 SSH 会话): + +在终端一输入: + +``` +mosquitto_sub -h localhost -u $user -P $pass -t "mqtt/test" +``` + +这条命令会启动一个持续运行的进程,监听发布到 `mqtt/test` 队列的消息。 + +在终端二输入: + +``` +mosquitto_pub -h localhost -u $user -P $pass -t "mqtt/test" -m hello` +``` + +这条命令会向 `mqtt/test` 队列发布一条消息,它应该会显示在终端一的输出里。 + +现在你可以中止终端一运行的 `sub` 命令了。 + +Mosquitto 中介允许客户端发布消息到任何队列,甚至没有任何订阅的队列也可以。这些消息会永久丢失,但这不会阻止客户端继续发布消息。 + +打开第三个终端,订阅下列队列(你的控制器会发布消息到这些队列上): + + * greenhouse/temperature + * greenhouse/light + * greenhouse/humidity + +### 给微控制器编码 + +现在你已经准备好给微控制器编码,发布它的监测指标到树莓派 4 上运行的 MQTT 中介上了。 + +Adafruit 有 [出色的文档][19],指导你使用 [CircuitPython 库合集][20] 的库来将你的微控制器连接到 WiFi 路由器,并发布监测指标到 MQTT 中介上。 + +安装下列库到 `CIRCUITPYTHON/lib` 目录,温室监控会用到它们。这些库在 Adafruit 的 CircuitPython 库合集中都有提供: + + * `adafruit_bus_device`:一个带有多个 .mpy 文件的 Python 包文件夹(.mpy 是经过压缩的 Python 文件,用以节省空间) + * `adafruit_requests`:单个 .mpy 文件 + * `adafruit_register`:一个包文件夹 + * `adafruit_minimqtt`:一个包文件夹 + * `adafruit_si7021`:单个 .mpy 文件,用来支持温湿度传感器 + +库装好了之后,将以下代码写入 `CIRCUITPYTHON` 文件夹的 `code.py` 文件中: + +``` +import time +import ssl +import socketpool +import wifi +import adafruit_minimqtt.adafruit_minimqtt as MQTT +import board +from digitalio import DigitalInOut, Direction, Pull +from analogio import AnalogIn +import adafruit_si7021 +  +# Add a secrets.py to your filesystem that has a dictionary called secrets with "ssid" and +# "password" keys with your WiFi credentials. DO NOT share that file or commit it into Git or other +# source control. +# pylint: disable=no-name-in-module,wrong-import-order +try: +        from secrets import secrets +except ImportError: +        print("WiFi secrets are kept in secrets.py, please add them there!") +        raise +  +print("Connecting to %s" % secrets["ssid"]) +wifi.radio.connect(secrets["ssid"], secrets["password"]) +print("Connected to %s!" % secrets["ssid"]) +### Feeds ### +light_feed = "greenhouse/light" +temp_feed = "greenhouse/temperature" +humidity_feed = "greenhouse/humidity" +  +# Define callback methods which are called when events occur +# pylint: disable=unused-argument, redefined-outer-name +def connected(client, userdata, flags, rc): +        # This function will be called when the client is connected +        # successfully to the broker. +        print("Connected to MQTT!") +  +def disconnected(client, userdata, rc): +        # This method is called when the client is disconnected +        print("Disconnected from MQTT!") +  +  +def get_voltage(pin): +        return (pin.value * 3.3) / 65536 +  +# Create a socket pool +pool = socketpool.SocketPool(wifi.radio) +  +# Set up a MiniMQTT Client +mqtt_client = MQTT.MQTT( +        broker=secrets["broker"], +        port=secrets["port"], +        username=secrets["aio_username"], +        password=secrets["aio_key"], +        socket_pool=pool, +        ssl_context=ssl.create_default_context(), +) +  +# Setup the callback methods above +mqtt_client.on_connect = connected +mqtt_client.on_disconnect = disconnected +  +# Connect the client to the MQTT broker. +print("Connecting to MQTT...") +mqtt_client.connect() +  +# Create library object using our Bus I2C port +sensor = adafruit_si7021.SI7021(board.I2C()) +light_pin = AnalogIn(board.IO4) +  +while True: +        # Poll the message queue +        mqtt_client.loop() +  +        # get the current temperature +        light_val = get_voltage(light_pin) +        temp_val = ((sensor.temperature * 9)/5) + 32 +        humidity_val = sensor.relative_humidity +  +        # Send a new messages +        mqtt_client.publish(light_feed, light_val) +        mqtt_client.publish(temp_feed, temp_val) +        mqtt_client.publish(humidity_feed, humidity_val) +        time.sleep(0.5) +``` + +保存你的代码。然后连接到串行监视器,看程序连接到你的 MQTT 中介。你还可以将树莓派 4 上的终端切换到订阅了它的发布队列的终端来查看输出。 + +### 处理监测指标 + +像 MQTT 这样的发布/订阅工作流给微控制器系统提供了诸多好处。你可以有多个微控制器 + 传感器来回报同一个系统的不同指标或并行回报相同指标的若干读数。你还可以有多个不同进程订阅各个队列,并行地对这些消息进行回应。甚至还可以有多个进程订阅相同的队列,对消息做出不同的动作,比如数值过高时发送通知邮件或将消息发送到另一个 MQTT 队列上去。 + +另一个选项是让一个微控制器订阅一个外部队列,可以发送信号告诉微控制器做出动作,比如关闭或开始一个新会话。最后,发布/订阅工作流对低功耗微控制器系统更佳(比如那些使用电池或太阳能的系统),因为这些设备可以在更长的延迟周期后批量发布监测指标,并在回报的间隔期间关闭大量消耗电量的 WiFi 广播。 + +要处理这些监测指标,我创建了一个 Python 客户端,使用 [Paho Python MQTT 客户端][21] 订阅监测指标队列。我还使用官方的 [Prometheus Python 客户端][22] 创建了一个 Web 服务器,它产生一个符合 Prometheus 标准的采集端点,使用这些监测指标作为面板信息。[Prometheus 服务器][23]和 Mosquitto MQTT 中介我都是运行在同一个树莓派 4 上的。 + +``` +from prometheus_client import start_http_server, Gauge +import random +import time +import paho.mqtt.client as mqtt + +gauge = { +  "greenhouse/light": Gauge('light','light in lumens'), +  "greenhouse/temperature": Gauge('temperature', 'temperature in fahrenheit'), +  "greenhouse/humidity": Gauge('humidity','relative % humidity') +} + +try: +        from mqtt_secrets import mqtt_secrets +except ImportError: +        print("WiFi secrets are kept in secrets.py, please add them there!") +        raise + +def on_connect(client, userdata, flags, rc): +        print("Connected with result code "+str(rc)) +        # Subscribing in on_connect() means that if we lose the connection and +        # reconnect then subscriptions will be renewed. +        client.subscribe("greenhouse/light") +        client.subscribe('greenhouse/temperature') +        client.subscribe('greenhouse/humidity') + +def on_message(client, userdata, msg): +        topic = msg.topic +        payload = msg.payload +        gauge[topic].set(payload) + +client = mqtt.Client() +client.username_pw_set(mqtt_secrets["mqtt_user"],mqtt_secrets['mqtt_password']) +client.on_connect = on_connect +client.on_message = on_message +client.connect('localhost',1883,60) + +if __name__ == '__main__': +        # Start up the server to expose the metrics. + +        client = mqtt.Client() +        client.username_pw_set('london','abc123') +        client.on_connect = on_connect +        client.on_message = on_message +        client.connect('localhost',1883,60) + +        start_http_server(8000) +        client.loop_forever() +``` + +然后我配置 Prometheus 服务器采集端点数据到 `localhost:8000`。 + +你可以在 Github 上访问 [温室 MQTT 微控制器][24] 这个项目的代码,项目采用 MIT 许可证授权。 + +-------------------------------------------------------------------------------- + +via: https://opensource.com/article/21/5/monitor-greenhouse-open-source + +作者:[Darin London][a] +选题:[lujun9972][b] +译者:[alim0x](https://github.com/alim0x) +校对:[wxy](https://github.com/wxy) + +本文由 [LCTT](https://github.com/LCTT/TranslateProject) 原创编译,[Linux中国](https://linux.cn/) 荣誉推出 + +[a]: https://opensource.com/users/dmlond +[b]: https://github.com/lujun9972 +[1]: https://opensource.com/sites/default/files/styles/image-full-size/public/lead-images/zanda-photography-unsplash-greenhouse.jpg?itok=ZMnZyNMM (Greenhouse garden with tomatoes) +[2]: https://mqtt.org/ +[3]: https://prometheus.io/ +[4]: https://circuitpython.io/ +[5]: https://adafruit.com +[6]: https://circuitpython.org/downloads +[7]: https://learn.adafruit.com/welcome-to-circuitpython +[8]: https://learn.adafruit.com/circuitpython-essentials/circuitpython-essentials +[9]: https://github.com/adafruit/circuitpython +[10]: https://www.adafruit.com/product/4769 +[11]: https://www.adafruit.com/product/3251 +[12]: https://www.adafruit.com/product/4399 +[13]: https://www.sparkfun.com/products/15081 +[14]: https://opensource.com/sites/default/files/uploads/connectsensors-microcontroller.jpg (Connecting sensors to microcontroller) +[15]: https://creativecommons.org/licenses/by-sa/4.0/ +[16]: https://pimylifeup.com/raspberry-pi-mosquitto-mqtt-server/ +[17]: https://mosquitto.org/ +[18]: https://mosquitto.org/documentation/authentication-methods/ +[19]: https://learn.adafruit.com/mqtt-in-circuitpython +[20]: https://circuitpython.org/libraries +[21]: https://pypi.org/project/paho-mqtt/ +[22]: https://pypi.org/project/prometheus-client +[23]: https://opensource.com/article/21/3/iot-measure-raspberry-pi +[24]: https://github.com/dmlond/greenhouse_mqtt_microcontroller diff --git a/published/202106/20210526 Make Command Not Found- Here-s How to Fix it.md b/published/202106/20210526 Make Command Not Found- Here-s How to Fix it.md new file mode 100644 index 0000000000..2840dc18ad --- /dev/null +++ b/published/202106/20210526 Make Command Not Found- Here-s How to Fix it.md @@ -0,0 +1,82 @@ +[#]: subject: (Make Command Not Found? Here’s How to Fix it) +[#]: via: (https://itsfoss.com/make-command-not-found-ubuntu/) +[#]: author: (Abhishek Prakash https://itsfoss.com/author/abhishek/) +[#]: collector: (lujun9972) +[#]: translator: (geekpi) +[#]: reviewer: (wxy) +[#]: publisher: (wxy) +[#]: url: (https://linux.cn/article-13451-1.html) + +Make 命令未找到?这是修复它的方法 +====== + +![](https://img.linux.net.cn/data/attachment/album/202106/02/203049l51rbr5v55kivg11.jpg) + +有一天,我试图在一个新的 Ubuntu 系统上编译一个程序,当我试图使用 `make` 命令时,它向我抛出一个错误: + +``` +The program 'make' is currently not installed. You can install it by typing: +sudo apt install make +``` + +这表明 `make` 命令还没有安装。你可以用这些命令在 Ubuntu 上逐步安装 `make`: + +``` +sudo apt update +sudo apt install make +``` + +第一个命令是更新本地的软件包缓存。如果是一个新安装的 Ubuntu 系统,这是很有必要的。有了刷新的软件包缓存,你的系统就会知道应该从哪个仓库下载 `make` 包。 + +并验证 `make` 是否已经正确安装: + +``` +make --version +``` + +![Checking make version][1] + +### 在 Ubuntu 上安装 make 的更好方法 + +安装 `make` 命令的一个更好的方法是使用 `build-essential` 包。这个包包含 `make`、`gcc`、`g++` 和其他一些编译器和开发工具。 + +``` +sudo apt install build-essential +``` + +![Installing Build Essential package][2] + +安装了这个 `build-essential` 包后,你就可以[在 Linux 中轻松地运行 C/C++ 程序][3]。 + +### 如果 make 已经安装了,但它没有工作怎么办? + +在一些罕见的情况下,可能会发生 `make` 已经安装了,但却无法工作的情况。 + +其原因是 `make` 命令不在 `$PATH` 变量中。你可以用这个命令重新安装 `make`: + +``` +sudo apt install --reinstall make +``` + +如果这不起作用,你可以尝试 [手动添加二进制文件到你的 PATH 中][4],但这应该不需要手动。 + +我希望这个快速提示能帮助你。仍然有问题或对相关主题有疑问?请随时在评论区留言。 + +-------------------------------------------------------------------------------- + +via: https://itsfoss.com/make-command-not-found-ubuntu/ + +作者:[Abhishek Prakash][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/abhishek/ +[b]: https://github.com/lujun9972 +[1]: https://i1.wp.com/itsfoss.com/wp-content/uploads/2021/05/check-make-version-linux.png?resize=800%2C293&ssl=1 +[2]: https://i0.wp.com/itsfoss.com/wp-content/uploads/2021/05/install-build-essentials-800x410.png?resize=800%2C410&ssl=1 +[3]: https://itsfoss.com/c-plus-plus-ubuntu/ +[4]: https://itsfoss.com/add-directory-to-path-linux/ +[5]: https://itsfoss.community/ diff --git a/published/202106/20210528 What you need to know about Quarkus in 2021.md b/published/202106/20210528 What you need to know about Quarkus in 2021.md new file mode 100644 index 0000000000..1f3d85a35e --- /dev/null +++ b/published/202106/20210528 What you need to know about Quarkus in 2021.md @@ -0,0 +1,67 @@ +[#]: subject: (What you need to know about Quarkus in 2021) +[#]: via: (https://opensource.com/article/21/5/quarkus) +[#]: author: (Alan Smithee https://opensource.com/users/alansmithee) +[#]: collector: (lujun9972) +[#]: translator: (geekpi) +[#]: reviewer: (wxy) +[#]: publisher: (wxy) +[#]: url: (https://linux.cn/article-13456-1.html) + +在 2021 年你需要知道 Quarkus 些什么? +====== + +> Quarkus 受益于 20 多年的 Java 开发历史,使开发应用变得更快、更容易。 + +![](https://img.linux.net.cn/data/attachment/album/202106/04/221812ja1b5btxpgwapsap.jpg) + +在云上发布服务部分是为了通过简单可靠的方式为用户和开发者提供对这些服务的便捷访问。与在线应用对接的最流行的方法之一是通过应用编程接口(API),这是一个花哨的术语,意味着你允许用户通过代码与你的应用进行互动。 + +API 的概念很重要,因为它可以帮助其他人在你的应用基础上进行开发。假设你设计了一个网站,当用户点击一个按钮时返回一个随机数字。通常情况下,这需要用户打开你的网站并点击一个按钮。网站可能是有用的,但只是在一定程度上。如果你包含一个 API,用户可以直接向你的服务器发送一个信号,要求一个随机数,或者他们可以自己编程,“调用”你的服务器来获取一个数字,而不需要点击或手动交互。开发者可以使用你的随机数作为游戏的数值,或作为密码生成器的一部分,或其他任何开发者需要随机数的地方(总是有的)。一个好的 API 可以解锁你的应用,让其他人使用你的代码结果,本质上,将你在网络上的工作转变为一个软件库。 + +### 什么是 Quarkus? + +[Quarkus][2] 是一个原生 Kubernetes Java 栈,为无服务器应用交付而设计。与有 20 年历史的 Java 相比,[Quarkus][3] 相对年轻,但受益于这 20 年的发展,用该项目的话说,是 “超音速的亚原子 Java”。可能没有人知道这句话的确切含义,但你肯定可以通过一下午使用 Quarkus 来感受到它对你的开发生活的意义。 + +Quarkus 让你用一个有用的 API 开发应用,几乎不需要配置,也不用担心启动一个复杂的环境。你不需要学习关于云计算或边缘计算的所有知识,就可以学习并擅长使用 Quarkus。了解 Quarkus 可以使你的开发更快,它可以帮助你为现代计算机网络制作灵活的应用。 + +下面是我们最近的一些涉及 Quarkus 的文章。 + +### 开始使用 Quarkus + +在 Saumya Singh 的《[如何创建你的第一个 Quarkus 应用][4]》中,你可以了解 Quarkus 和无服务器交付的好处,并在大约 10 分钟内创建了一个简单的演示应用。事实上,_10_ 分钟以内更准确,因为在 Maven 和 Quarkus 之间,几乎没有你想象中的那么多设置。它几乎感觉不到像 Java 一样的坏处,而感觉像 Java 一样好。 + +### 边缘开发 + +Linux 是创建物联网 (IoT) [边缘应用][5] 的一个流行平台。这有很多原因,包括安全性、编程语言和开发模型的广泛选择以及协议支持。不出所料,Quarkus 对物联网的处理非常好。Quarkus 的内存效率高,启动快,并且有快速的运行时,所以它不仅是物联网的可行解决方案,而且是理想的解决方案。你可以通过 Daniel Oh 的《[在 Linux 上使用开源的边缘开发入门][6]》来开始使用 Quarkus 和物联网。 + +### Quarkus 和 VS Code + +当你处理代码时,一个集成开发环境(IDE)会有很大的不同。微软的开源 [VS Code][7](或无品牌标志的 [VSCodium][8])是一个伪装成 IDE 的流行文本编辑器(或者说是伪装成文本编辑器的 IDE?),它有很多扩展,可以使它成为几乎任何编程语言的专门环境。如果你正在使用或考虑使用 VS Code,那么请阅读 Daniel Oh 的《[Quarkus in VS Code][9]》使用指南,了解一些关于 Maven、Quarkus 和 VS Code 如何协同工作的专业技巧。 + +### 获得 Quarkus + +使用 Quarkus 开发,可以像 Python 一样简单地设置环境,但它为你提供了强大的 Java 语言及其众多的库。它是进入云计算、[Knative][10] 和边缘计算的一个重要入口。获取 Quarkus 并开始编码。 + +-------------------------------------------------------------------------------- + +via: https://opensource.com/article/21/5/quarkus + +作者:[Alan Smithee][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/alansmithee +[b]: https://github.com/lujun9972 +[1]: https://opensource.com/sites/default/files/styles/image-full-size/public/lead-images/cloud_tools_hardware.png?itok=PGjJenqT (Tools in a cloud) +[2]: https://quarkus.io +[3]: https://developers.redhat.com/blog/2019/03/07/quarkus-next-generation-kubernetes-native-java-framework/ +[4]: https://opensource.com/article/21/4/quarkus-tutorial +[5]: https://opensource.com/article/17/9/what-edge-computing +[6]: https://opensource.com/article/21/5/edge-quarkus-linux +[7]: https://github.com/microsoft/vscode +[8]: https://opensource.com/article/20/6/open-source-alternatives-vs-code +[9]: https://opensource.com/article/20/4/java-quarkus-vs-code +[10]: https://www.openshift.com/learn/topics/quarkus \ No newline at end of file diff --git a/published/202106/20210601 Get started with FreeDOS.md b/published/202106/20210601 Get started with FreeDOS.md new file mode 100644 index 0000000000..9706804d74 --- /dev/null +++ b/published/202106/20210601 Get started with FreeDOS.md @@ -0,0 +1,104 @@ +[#]: subject: (Get started with FreeDOS) +[#]: via: (https://opensource.com/article/21/6/get-started-freedos) +[#]: author: (Jim Hall https://opensource.com/users/jim-hall) +[#]: collector: (lujun9972) +[#]: translator: (geekpi) +[#]: reviewer: (wxy) +[#]: publisher: (wxy) +[#]: url: (https://linux.cn/article-13492-1.html) + +FreeDOS 入门 +====== + +> 它看起来像复古计算,但它是一个现代的操作系统,你可以用它来完成任务。 + +![](https://img.linux.net.cn/data/attachment/album/202106/16/123557an8ybzgnqg833vz4.jpg) + +在整个 1980 年代和 1990 年代,我主要是一个 DOS 用户。我喜欢 DOS 提供的命令行环境,它随着每一个连续的版本变得更加强大。我甚至学会了如何用 C 语言编写自己的 DOS 程序,这样我就可以扩展 DOS 命令行,并为标准的 DOS 命令编写更强大的替代程序。我曾经试验过微软的 Windows,但如果你记得当时的 Windows 3,你就会知道它很慢,而且容易崩溃。但无论如何我更喜欢命令行,所以我坚持使用 DOS。 + +这一切在 1994 年发生了变化。流行的技术杂志谈到了即将到来的 Windows 版本,它将完全废除 DOS。我不想被迫使用 Windows。在我访问的 Usenet 讨论区中,其他人也有同样的感觉。所以在 [1994 年 6 月 29 日][2],我认为如果我们想保留 DOS,我们需要自己编写。所以在 6 月 29 日,我宣布了一个小项目,这个项目后来成为 [FreeDOS 项目][3]。 + +从那时起,我们已经发布了几个完整的 FreeDOS 发行版。我们从 1994 年到 1997 年的 alpha 系列开始,再到 1998 年到 2005 年的 beta 系列,最后在 2006 年发布了 FreeDOS 1.0 版本。从那时起,进展是缓慢但稳定的。在 1.0 之后,我们并没有真正急于发布每个新版本,因为 DOS 在 1995 年不再是一个变动的目标。 + +从 1.0 开始的每一个 FreeDOS 发行版都是对现代 DOS 的不断重新想象。我们已经包括了很多编译器和汇编器,供开发人员编写软件。我们还提供了许多“强大工具”,以便你可以做真正的工作。我们还提供了各种编辑器,因为每个人都有自己的最爱。 + +我们最近发布了 FreeDOS 1.3 RC4 发行版。从技术上讲,这是我们即将推出的 FreeDOS 1.3 发行版的候选版本,但它是一个全功能的发行版。我对 FreeDOS 1.3 RC4 的所有功能感到非常兴奋。 + +### 无需安装 FreeDOS 即可运行 FreeDOS + +在我们以前所有的 FreeDOS 发行版中,我们把重点放在 _安装_ FreeDOS 到电脑上。但我们认识到,大多数用户实际上已经不在实际硬件上运行 FreeDOS 了。他们在 [像 QEMU 或 VirtualBox 这样的虚拟机][4] 中运行 FreeDOS。所以在 FreeDOS 1.3 RC4 中,我们改进了 “LiveCD” 环境。 + +通过 FreeDOS 1.3 RC4,你可以在你喜欢的虚拟机中启动 LiveCD 镜像,并立即开始使用 FreeDOS。这就是我现在运行 FreeDOS 的方式。我有一个小的虚拟硬盘镜像,我把所有的文件都放在那里,但我从 LiveCD 启动并运行 FreeDOS。 + +![Booting the FreeDOS 1.3 RC4 LiveCD on QEMU][5] + +*启动 FreeDOS 1.3 RC4 LiveCD (Jim Hall, [CC-BY SA 4.0][6])* + +### 安装真的很简单 + +如果你不想从 LiveCD 上运行 FreeDOS,你也可以在你的硬盘上安装它。我们更新了 FreeDOS 的安装程序,所以它本身并不是一个真正的“程序”,而是一个非常聪明的 DOS “批处理”文件,它可以检测到各种情况并采取适当的行动,例如在没有 FreeDOS 分区的情况下为其创建一个新的磁盘分区。 + +旧的 FreeDOS 发行版会提示你各种问题,甚至选择个别程序来安装。新的安装程序非常精简。它只问你几个问题就开始了,然后就自己做其他事情。在一个空的虚拟机上安装 FreeDOS 只需要几分钟时间。 + +![Installing FreeDOS 1.3 RC4][7] + +*安装FreeDOS 1.3 RC4 (Jim Hall, [CC-BY SA 4.0][6])* + +### 你可以从软盘安装它 + +不是每个人都喜欢在虚拟机中运行 FreeDOS。现在有一个复古计算社区,他们收集并精心修复经典的 PC 硬件,如 Pentium 或 486 系统。你甚至可以在那里找到一些 XT(8088)或 AT(80286)系统,它由一个专门的用户社区运营。 + +虽然我们认为 FreeDOS 是一个现代的 DOS,但如果我们不在旧的 PC 硬件上运行,我们就不是 “DOS” 了。因此,在 FreeDOS 1.3 中,我们包含了一个纯软盘版!这个版本可以运行在任何硬件上。这个版本应该可以在任何可以运行 FreeDOS 的硬件上运行,并且有 EGA 或更好的图形。 + +你在运行 286 或其他没有 CD-ROM 驱动器的经典系统吗?从这些软盘安装 FreeDOS。你是否只有一个硬盘而没有 CD 或软盘驱动器?只要把软盘的内容复制到一个临时目录,然后从那里运行安装程序。想执行“无交互外设方式”安装到不同的 DOS 目录吗?用命令行选项就可以了。 + +纯软盘版使用一个完全不同的安装程序,并包含一套有限的 FreeDOS 程序,它们在经典的 PC 硬件上更有用。 + +![Installing the FreeDOS Floppy-Only Edition][8] + +*安装FreeDOS纯软盘版 (Jim Hall, [CC-BY SA 4.0][6])* + +### 充满了开源应用和游戏 + +如果 FreeDOS 是一个闭源的 DOS,它就不是一个 _自由_ 的 DOS。我们希望每个人都能使用和研究 FreeDOS,包括其源代码。当我们计划 FreeDOS 1.3 发行版时,我们仔细检查了每个软件包中的每一个许可证,并专注于只包括 _开源_ 程序。(在以前的 FreeDOS 发行版中,有几个程序并不完全“开源”,还有一两个程序没有包括源码,但是可以“自由使用和发布”。在这个版本中,所有的东西都是开源的,以“开源定义”作为我们的模型。) + +而且,这是一个多么棒的开源应用和游戏的集合。游戏是 FreeDOS 1.3 RC4 中我最喜欢的内容。许多人使用 FreeDOS 来玩经典的 DOS 游戏,但我们想提供我们自己的开源游戏给人们玩。 + +你可以发现 LiveCD 中已经安装了两个游戏:Simple Senet(可以追溯到古埃及的棋盘游戏)和 Floppy Bird(Flappy Bird 游戏的一个版本)。如果你安装了 FreeDOS,你还会发现很多其他游戏可以尝试,包括 Sudoku86(一个数独游戏)、Wing(一个太空射击游戏)和 Bolitaire(单人纸牌游戏)。 + +![Playing the Floppy Bird game][9] + +*玩 Floppy Bird 游戏 (Jim Hall, [CC-BY SA 4.0][6])* + +![The ancient game of Senet][10] + +*古老的 Senet 游戏 (Jim Hall, [CC-BY SA 4.0][6])* + +### 现在就试试 FreeDOS 1.3 RC4 + +你可以在 FreeDOS 的 [下载][11] 页面上找到新的 FreeDOS 1.3 RC4。要安装 FreeDOS,你需要至少 20MB 的可用磁盘空间:20MB 用来安装一个普通的 FreeDOS 系统,或者 250MB 用来安装所有,包括应用和游戏。要安装源码,你将需要高达 450MB 的可用空间。 + +-------------------------------------------------------------------------------- + +via: https://opensource.com/article/21/6/get-started-freedos + +作者:[Jim Hall][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/jim-hall +[b]: https://github.com/lujun9972 +[1]: https://opensource.com/sites/default/files/styles/image-full-size/public/lead-images/retro_old_unix_computer.png?itok=SYAb2xoW (Old UNIX computer) +[2]: https://groups.google.com/g/comp.os.msdos.apps/c/oQmT4ETcSzU/m/O1HR8PE2u-EJ +[3]: https://www.freedos.org/ +[4]: https://opensource.com/article/20/8/virt-tools +[5]: https://opensource.com/sites/default/files/freedos-livecd.png (Booting the FreeDOS 1.3 RC4 LiveCD) +[6]: https://creativecommons.org/licenses/by-sa/4.0/ +[7]: https://opensource.com/sites/default/files/install6.png (Installing FreeDOS 1.3 RC4) +[8]: https://opensource.com/sites/default/files/freedos-floppy.png (Installing the FreeDOS Floppy-Only Edition) +[9]: https://opensource.com/sites/default/files/floppy-bird.png (Playing the Floppy Bird game) +[10]: https://opensource.com/sites/default/files/simple-senet.png (The ancient game of Senet) +[11]: https://www.freedos.org/download/ diff --git a/published/202106/20210601 Nyxt Browser is a Keyboard-oriented Web Browser Inspired by Emacs and Vim.md b/published/202106/20210601 Nyxt Browser is a Keyboard-oriented Web Browser Inspired by Emacs and Vim.md new file mode 100644 index 0000000000..41208fd921 --- /dev/null +++ b/published/202106/20210601 Nyxt Browser is a Keyboard-oriented Web Browser Inspired by Emacs and Vim.md @@ -0,0 +1,104 @@ +[#]: subject: (Nyxt Browser is a Keyboard-oriented Web Browser Inspired by Emacs and Vim) +[#]: via: (https://itsfoss.com/nyxt-browser/) +[#]: author: (Ankush Das https://itsfoss.com/author/ankush/) +[#]: collector: (lujun9972) +[#]: translator: (wxy) +[#]: reviewer: (wxy) +[#]: publisher: (wxy) +[#]: url: (https://linux.cn/article-13449-1.html) + +Nyxt 浏览器:一个受 Emacs 和 Vim 启发的面向键盘的网页浏览器 +====== + +你可以得到很多适用于 Linux 的开源网页浏览器,不只是基于 Chrome 的浏览器,而且还有 [其它的替代品][1]。 + +它们大多数都侧重于提供漂亮的用户体验,并同时兼顾隐私功能。 + +然而,Nyxt 浏览器可能不是为最好的用户体验而建立的,而是为资深用户喜欢的某些东西而打造的。 + +### Nyxt 浏览器:专注于键盘快捷键和命令的开源浏览器 + +![][2] + +[Nyxt][3] 是一个面向键盘的开源网页浏览器,可在 Linux 和 macOS 上使用。 + +当然,不是每个资深用户都会去使用键盘快捷键,但这旨在满足那些喜欢通过键盘导航的用户的需求。 + +它的灵感来自于 Vim 和 Emacs 中的键盘快捷键的工作方式 —— 所以如果你对这些编辑器很熟悉,那么你也会对这些快捷键感到熟悉。 + +与主流的网页浏览器不同,你不必在多个设置和菜单中导航,只需一个快速快捷键或一个命令,你就会获得所有你需要访问的功能。 + +如果你想知道的话,它不特定于某种网页引擎,它目前支持 WebEngine 和 WebKit。 + +因此,如果你是一个喜欢使用键盘导航的人,它可以节省时间并改善你的浏览体验。 + +它提供了相当多的有用功能,我将在下面指出。 + +### Nyxt 浏览器的特点 + +![][4] + +你会发现这里提供了许多非常规的功能。在探索这里提到的每一个关键亮点之前,你可能想先浏览一下官方文档(按 `F1` 找到它),你可以在欢迎屏幕中可以找到链接。 + + * 无损的树形的历史记录(跟踪你的浏览历史的确切层次,并轻松回忆你导航到的内容) + * 剪贴板历史,帮助你快速找到你之前复制的内容 + * 开始输入命令的键盘快捷方式(`CTRL+Space`) + * 使用键盘快捷键在冗长的文件中导航,可以跳到一个特定的标题 + * 缓冲区替代了标签,它将每个标签的行为和设置相互隔离 + * 通过将多个标签映射到一个共同的元素来一同关闭 + * 无鼠标导航 + * 使用搜索快速找到一个缓冲区,而不是在许多标签中寻找它 + * 能够根据你的工作流程运行简短的脚本 + * 可定制的自动填写功能,你也可以在表单中自动填写当前日期 + * 内置的广告拦截器 + +除了上面提到的功能外,你还可以切换**黑暗模式**、**HTTPS 模式**,以及在命令菜单中有大量的选项。 + +此外,它是完全可定制和可编程的。因此,你可以选择为自己量身定做。 + +### 在 Linux 中安装 Nyxt 浏览器 + +![][7] + +对于基于 Ubuntu 的发行版,你可以从 [官方下载页面][8] 找到一个 deb 包。 + +如果你还不会,你可能想读一下 [安装 deb 文件的方法][9]。 + +它也为 Arch Linux 用户提供了 [AUR][10],并为 Alpine Linux、Nix 和 Guix 提供了包。 + +如果你需要编译它,你也可以在 [GitHub 页面][11] 中找到源代码。 + +- [下载 Nyxt 浏览器][8] + +### 总结 + +虽然 Nyxt 浏览器可能不是最友好的浏览体验,但对于能够充分利用键盘快捷键和命令的用户来说,它肯定是一个特殊的选择。 + +如果你想要一个无鼠标的导航体验,这是一个值得尝试的浏览器。我建议你尝试一下 —— 但如果你一般不使用键盘快捷键来导航,这对你来说将是一个复杂的体验。 + +你尝试过 Nyxt 浏览器吗?请在下面的评论中告诉我你的想法。 + +-------------------------------------------------------------------------------- + +via: https://itsfoss.com/nyxt-browser/ + +作者:[Ankush Das][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://itsfoss.com/author/ankush/ +[b]: https://github.com/lujun9972 +[1]: https://itsfoss.com/open-source-browsers-linux/ +[2]: https://i0.wp.com/itsfoss.com/wp-content/uploads/2021/05/nyxt-browser-screenshot.png?resize=1079%2C823&ssl=1 +[3]: https://nyxt.atlas.engineer/ +[4]: https://i2.wp.com/itsfoss.com/wp-content/uploads/2021/05/nyxt-browser.png?resize=1057%2C812&ssl=1 +[5]: https://i2.wp.com/itsfoss.com/wp-content/uploads/2020/10/linux-terminal-based-browsers.png?fit=800%2C450&ssl=1 +[6]: https://itsfoss.com/terminal-web-browsers/ +[7]: https://i1.wp.com/itsfoss.com/wp-content/uploads/2021/05/nyxt-browser-settings.png?resize=800%2C617&ssl=1 +[8]: https://nyxt.atlas.engineer/download +[9]: https://itsfoss.com/install-deb-files-ubuntu/ +[10]: https://itsfoss.com/aur-arch-linux/ +[11]: https://github.com/atlas-engineer/nyxt diff --git a/published/202106/20210602 Convert Images to ASCII Art in Linux Terminal With This Nifty Little Tool.md b/published/202106/20210602 Convert Images to ASCII Art in Linux Terminal With This Nifty Little Tool.md new file mode 100644 index 0000000000..e4f3b70567 --- /dev/null +++ b/published/202106/20210602 Convert Images to ASCII Art in Linux Terminal With This Nifty Little Tool.md @@ -0,0 +1,115 @@ +[#]: subject: (Convert Images to ASCII Art in Linux Terminal With This Nifty Little Tool) +[#]: via: (https://itsfoss.com/ascii-image-converter/) +[#]: author: (Abhishek Prakash https://itsfoss.com/author/abhishek/) +[#]: collector: (lujun9972) +[#]: translator: (geekpi) +[#]: reviewer: (wxy) +[#]: publisher: (wxy) +[#]: url: (https://linux.cn/article-13461-1.html) + +在 Linux 终端将图像转换成 ASCII 艺术 +====== + +![](https://img.linux.net.cn/data/attachment/album/202106/06/210732m5oo91ao9ws33757.png) + +想在 Linux 终端中做一些有趣的事情吗?把一张普通的图片转换成 ASCII 艺术怎么样? + +你知道 [什么是 ASCII][1] 么?它是一个标准,在 8 位码中的 256 个空位上分配字母、数字和其他字符。ASCII 艺术是一个由可打印的 ASCII 字符组成的图形。基本上,它是由一堆字母、数字和特殊字符组成的。 + +你可能见过有人 [以 ASCII 格式显示他们发行版的标志][2],像这样: + +![][3] + +这很酷,对吗?把一张普通的图片转换成 ASCII 艺术怎么样?这就是在这篇文章中要探讨的问题。 + +### Ascii Image Converter + +顾名思义,[Ascii Image Converter][4] 是一个将图片转换为 ASCII 艺术的工具。它是一个用 Go 语言编写的基于命令行的工具,它打印出提供给它的图片的ASCII版本。 + +你可能认不出我,但下面的图片中的 ASCII 版就是我。那是我的 8 位头像。 + +![][5] + +该工具支持以下格式的输入图像: + +* JPEG/JPG +* PNG +* BMP +* WEBP +* TIFF/TIF + +让我们看看如何安装和使用它。 + +### 在 Linux 上安装 Ascii Image Converter + +这个有趣的工具也可以在 Windows 上使用,但我不打算这么做。在本教程中,让我们坚持使用 Linux。 + +如果你的发行版中启用了 [Snap][6],你可以用下面的命令轻松地安装它的 snap 包: + +``` +sudo snap install ascii-image-converter +``` + +你也可以从它的发布页面下载 Linux 的可执行文件,并把可执行文件放在 `/usr/local/bin/` 目录下。这样,你就能像普通的 Linux 命令一样运行它。如果你想知道为什么会这样,请了解一下 [Linux 目录层次结构][7]。 + +### 使用 Ascii Image Converter + +使用很简单。安装后,你只需要提供你想转换的图像的路径。 + +``` +ascii-image-converter path_to_image +``` + +你也可以提供图片的 URL,直接从网上把图片转换成 ASCII。 + +这是我的个人资料照片转换成 ASCII 格式。我把我的原始照片放在这里供大家参考。 + +![][8] + +你也可以转换成彩色的 ASCII。 + +``` +ascii-image-converter -C path_to_image +``` + +![][9] + +你可以通过提供它们的路径将多个图像转换为 ASCII。它将在终端显示器上一个接一个地打印 ASCII 版本。 + +也有一个选项可以保存生成的 ASCII 艺术。在旧版本中,它只会被保存为文本文件,而不是图像。开发者 Zoraiz Hassan 发布了一个新版本,现在该工具默认将生成的 ASCII 图像保存为 PNG 格式。 + +``` +ascii-image-converter path_to_image -s . +``` + +还有一些可用的选项,比如给输出一个特定的尺寸,使用更多的 ASCII 字符,或者使用你自己的字符集来打印 ASCII 艺术。你可以在 [项目的仓库][4] 上阅读相关内容。 + +### 喜欢它吗? + +你喜欢更多的 ASCII 相关的东西吗?那么 [在 Linux 上玩 ASCII 游戏][10] 怎么样?是的,你完全可以这么做。 + +如果你喜欢在终端做实验,你可能会喜欢这个工具。虽然我不知道 ASCII 转换后的图像能有什么好的实际用途。有什么想法吗? + +-------------------------------------------------------------------------------- + +via: https://itsfoss.com/ascii-image-converter/ + +作者:[Abhishek Prakash][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/abhishek/ +[b]: https://github.com/lujun9972 +[1]: https://www.computerhope.com/jargon/a/ascii.htm +[2]: https://itsfoss.com/display-linux-logo-in-ascii/ +[3]: https://i0.wp.com/itsfoss.com/wp-content/uploads/2020/04/ubuntu-mate-focal-neofetch.png?resize=800%2C543&ssl=1 +[4]: https://github.com/TheZoraiz/ascii-image-converter +[5]: https://i1.wp.com/itsfoss.com/wp-content/uploads/2021/05/abhishek-prakash-in-ascii.png?resize=800%2C445&ssl=1 +[6]: https://itsfoss.com/enable-snap-support-linux-mint/ +[7]: https://linuxhandbook.com/linux-directory-structure/ +[8]: https://i0.wp.com/itsfoss.com/wp-content/uploads/2021/05/abhishek-prakash-ascii-converted.png?resize=800%2C437&ssl=1 +[9]: https://i1.wp.com/itsfoss.com/wp-content/uploads/2021/05/abhishek-colored-ascii.png?resize=800%2C429&ssl=1 +[10]: https://itsfoss.com/best-ascii-games/ diff --git a/published/202106/20210602 openSUSE Leap 15.3 Release Finally Closes the Gap With SUSE Linux Enterprise.md b/published/202106/20210602 openSUSE Leap 15.3 Release Finally Closes the Gap With SUSE Linux Enterprise.md new file mode 100644 index 0000000000..001bc83dbd --- /dev/null +++ b/published/202106/20210602 openSUSE Leap 15.3 Release Finally Closes the Gap With SUSE Linux Enterprise.md @@ -0,0 +1,78 @@ +[#]: subject: (openSUSE Leap 15.3 Release Finally Closes the Gap With SUSE Linux Enterprise) +[#]: via: (https://news.itsfoss.com/opensuse-leap-15-3-release/) +[#]: author: (Ankush Das https://news.itsfoss.com/author/ankush/) +[#]: collector: (lujun9972) +[#]: translator: (Chao-zhi) +[#]: reviewer: (wxy) +[#]: publisher: (wxy) +[#]: url: (https://linux.cn/article-13469-1.html) + +openSUSE Leap 15.3 版本缩小了与 SUSE Linux 企业版的差距 +====== + +![](https://img.linux.net.cn/data/attachment/album/202106/08/184921thd7vc8qvxbhzt53.jpg) + +> 随着 openSUSE 15.3 的发布,与 SUSE Linux 企业版的差距终于缩小了。对于开发团队来说,这应该是一个令人兴奋的用于测试的更新。 + +去年,在 [openSUSE Leap 15.2 发行版][1] 中他们希望通过使用与企业版相同二进制软件包来构建 openSUSE Leap,从而缩小 openSUSE Leap 与 SUSE Linux 企业版之间的差距。 + +这样一来的话,如果有人在使用 openSUSE 测试后切换到 SUSE Linux 企业版,部署的迁移过程都将大大简化。此外,openSUSE Leap 将是开发团队进行测试的一个轻松选择。 + +随着 openSUSE Leap 15.3 的发布,这个构想成为了现实。本文我将重点介绍这次发布的主要变化。 + +### openSUSE Leap 15.3: 最新变化 + +最重要的变化是,它使用与 SUSE Linux 企业版相同的二进制软件包构建。 + +并且,[发布公告][2] 中提到了这一巨大变化的好处: + +> 此版本对于迁移项目和用户验收测试非常有益,使用 openSUSE leap 15.3 进行运行调优和测试工作负载的大型开发团队将会获得最大的好处,因为这些工作负载可以轻松提升并转移到 SUSE Linux 企业版 15 SP3 上进行长期维护。 + +除了这个巨大的变化,还有其他几个重要的变化使它成为一个令人激动的版本。 + +![](https://i2.wp.com/news.itsfoss.com/wp-content/uploads/2021/06/Leap_15.3_xfce.png?w=1529&ssl=1) + +对于 Xfce 4.16 桌面,有一些视觉变化,包括新的图标和调色板。设置管理器还增加了一个视觉刷新功能,提供了更清晰的外观。 + +如果有需要,KDE Plasma 5.18 也可以作为 LTS 选项与此版本一起提供。而且,GNOME 3.34 在某些应用程序的外观和感觉上有一些细微的变化。虽然 Cinnamon 没有大的变化,但是你会发现它有了一个新的模式。 + +在这个版本中,你将发现 gnu health 3.8 添加了一些新特性供你探索。 + +DNF 包管理器有一个更新计划,但是当前没有释放出来,你可以通过后续的维护更新获得它。 + +![](https://i0.wp.com/news.itsfoss.com/wp-content/uploads/2021/06/Leap_15.3_xfce4-terminal.png?w=1529&ssl=1) + +IBM Z 和 LinuxONE(s390x)是 Leap 15.3 中新支持的两种架构。 + +所包含的容器技术仍然保持不变,但是它们在本版本中收到了安全更新。当然,你需要去找 Linode 等托管解决方案提供的最新云镜像。 + +几个应用程序升级包括 Ononishare 2.2、Chromium 89 等。你可以在 [官方特性列表][4] 中找到更多详细信息。 + +### 下载 openSUSE Leap 15.3 + +需要注意的是,从今天起,Leap 15.2 将有六个月的寿命(EOL)。 + +在尝试升级到 Leap 15.3 之前,你必须确保运行的是 Leap 15.2。你可以在他们的 [官方发行说明][5] 中找到有关升级过程的更多信息。 + +从下面的按钮链接的官方下载页面获取最新的 ISO。 + +- [下载 openSUSE Leap 15.3][6] + +-------------------------------------------------------------------------------- + +via: https://news.itsfoss.com/opensuse-leap-15-3-release/ + +作者:[Ankush Das][a] +选题:[lujun9972][b] +译者:[Chao-zhi](https://github.com/Chao-zhi) +校对:[wxy](https://github.com/wxy) + +本文由 [LCTT](https://github.com/LCTT/TranslateProject) 原创编译,[Linux中国](https://linux.cn/) 荣誉推出 + +[a]: https://news.itsfoss.com/author/ankush/ +[b]: https://github.com/lujun9972 +[1]: https://itsfoss.com/opensuse-leap-15-2-release/ +[2]: https://news.opensuse.org/2021/06/02/opensuse-leap-bridges-path-to-enterprise/ +[4]: https://en.opensuse.org/Features_15.3 +[5]: https://en.opensuse.org/Release_announcement_15.3 +[6]: https://get.opensuse.org/leap/ diff --git a/published/202106/20210603 Explore the Kubernetes ecosystem in 2021.md b/published/202106/20210603 Explore the Kubernetes ecosystem in 2021.md new file mode 100644 index 0000000000..d7c2ba19d1 --- /dev/null +++ b/published/202106/20210603 Explore the Kubernetes ecosystem in 2021.md @@ -0,0 +1,72 @@ +[#]: subject: (Explore the Kubernetes ecosystem in 2021) +[#]: via: (https://opensource.com/article/21/6/kubernetes-ebook) +[#]: author: (Chris Collins https://opensource.com/users/clcollins) +[#]: collector: (lujun9972) +[#]: translator: (geekpi) +[#]: reviewer: (wxy) +[#]: publisher: (wxy) +[#]: url: (https://linux.cn/article-13506-1.html) + +探索 Kubernetes 生态系统(2021 版) +====== + +> 这份可下载的指南充满了有用的教程,让 SRE 和系统管理员使用 Kubernetes 获得便利。 + +![](https://img.linux.net.cn/data/attachment/album/202106/21/162617ikidrw6q8i6nif2n.jpg) + +Kubernetes 是容器编排的事实标准,在基础设施管理和应用开发方面已经迅速发展成为容器环境的主导。作为一个拥有庞大的爱好者和专业人士社区的开源平台,以及作为云原生计算基金会的一部分,Kubernetes 不仅成为一个强大而令人印象深刻的编排系统本身,而且它还促进了一个庞大的相关工具和服务的生态系统,使其更容易使用,并通过更强大和复杂的组件扩展其功能。 + +在这本新的电子书《[给 SRE 和系统管理员的 Kubernetes 指导][2]》中,[Jess Cherry][3](Ben Finkel 也有贡献)涵盖了一系列用于管理和整合 Kubernetes 的工具和服务。Cherry 和 Finkel 提供了一些有用的 _入门_ 指南,包括 Kubernetes 和一些工具。他们甚至还分享了面试问题,以帮助读者为在这个快速增长的大规模生态系统中工作做好准备。 + +### 了解 Kubernetes + +如果你刚开始接触 Kubernetes 和容器,Ben Finkel 的 《[Kubernetes 入门][4]》文如其题,也是一篇对你需要了解的相关概念的出色介绍。它也是一本轻量级的快速入门指南,用于设置和使用单节点集群进行测试。没有什么比亲身体验技术并直接进入学习更好的方法了。什么是吊舱Pod? 如何在集群上部署一个应用程序? Ben 一一为你做了介绍。 + +与集群交互的主要方式是 [kubectl][5] 命令,这是一种 CLI 工具,它提供了一种与管理集群本身的 API 服务器交互的适合方式。例如,你可以使用 `kubectl get` 来列出上述的吊舱和部署,但正如你对 Kubernetes 这样复杂的东西所期望的那样,它的 CLI 界面有很强的功能和灵活性。Jess Cherry 的《[9 个系统管理员需要知道的 kubectl 命令][6]》速查表是一个很好的介绍,是使用 `kubectl` 的入门好方法。 + +同样,Cherry 的《[给初学者的 Kubernetes 命令空间][7]》也很好地解释了什么是命名空间以及它们在 Kubernetes 中的使用方式。 + +### 简化 Kubernetes 的工作 + +在一个复杂的系统中工作是很困难的,尤其是使用像 `kubectl` 这样强大而极简的 CLI 工具。幸运的是,在围绕 Kubernetes 的生态系统中,有许多工具可用于简化事情,使扩展服务和集群管理更容易。 + +可用于在 Kubernetes 上部署和维护应用和服务的 `kubectl` 命令主要使用的是 YAML 和 JSON。然而,一旦你开始管理更多应用,用 YAML 的大型仓库这样做会变得既重复又乏味。一个好的解决方案是采用一个模板化的系统来处理你的部署。[Helm][8] 就是这样一个工具,被称为 “Kubernetes 的包管理器”,Helm 提供了一种方便的方式来打包和共享应用。Cherry 写了很多关于 Helm 的有用文章:创建有效的 《[Helm 海图][9]》和有用的《[Helm 命令][10]》。 + +`kubectl` 也为你提供了很多关于集群本身的信息:上面运行的是什么,以及正在发生的事件。这些信息可以通过 `kubectl` 来查看和交互,但有时有一个更直观的 GUI 来进行交互是有帮助的。[K9s][11] 符合这两个世界的要求。虽然它仍然是一个终端应用,但它提供了视觉反馈和一种与集群交互的方式,而不需要长长的 `kubectl` 命令。Cherry 也写了一份很好的《[k9s 使用入门][12]》的指南。 + +### 建立在 Kubernetes 的强大和灵活性之上的扩展 + +幸运的是,尽管 Kubernetes 是复杂而强大的,但它惊人的灵活并且开源。它专注于其核心优势:容器编排,并允许围绕它的爱好者和专业人士的社区扩展其能力,以承担不同类型的工作负载。其中一个例子是 [Knative][13],在 Kubernetes 之上提供组件,它为无服务器和事件驱动的服务提供工具,并利用 Kubernetes 的编排能力在容器中运行最小化的微服务。事实证明,这样做非常高效,既能提供在容器中开发小型、易于测试和维护的应用的好处,又能提供仅在需要时运行这些应用的成本优势,可以在特定事件中被触发,但在其他时候处于休眠。 + +在这本电子书中,Cherry 介绍了 Knative 和它的事件系统,以及为什么值得自己研究使用 Knative。 + +### 有一个完整的世界可以探索 + +通过 Jess Cherry 和 Ben Finkel 的这本新的[电子书][2],可以开始了解 Kubernetes 和围绕它的生态系统。除了上述主题外,还有一些关于有用的 Kubernetes 扩展和第三方工具的文章。 + +-------------------------------------------------------------------------------- + +via: https://opensource.com/article/21/6/kubernetes-ebook + +作者:[Chris Collins][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/clcollins +[b]: https://github.com/lujun9972 +[1]: https://opensource.com/sites/default/files/styles/image-full-size/public/lead-images/ship_wheel_gear_devops_kubernetes.png?itok=xm4a74Kv (A ship wheel with someone steering) +[2]: https://opensource.com/downloads/kubernetes-sysadmin +[3]: https://opensource.com/users/cherrybomb +[4]: https://opensource.com/article/17/11/getting-started-kubernetes +[5]: https://kubernetes.io/docs/reference/kubectl/kubectl/ +[6]: https://opensource.com/article/20/5/kubectl-cheat-sheet +[7]: https://opensource.com/article/19/12/kubernetes-namespaces +[8]: https://helm.sh/ +[9]: https://opensource.com/article/20/5/helm-charts +[10]: https://opensource.com/article/20/2/kubectl-helm-commands +[11]: https://k9scli.io/ +[12]: https://opensource.com/article/20/5/kubernetes-administration +[13]: https://cloud.google.com/knative/ diff --git a/published/202106/20210603 How to Install Code Blocks IDE on Ubuntu Linux.md b/published/202106/20210603 How to Install Code Blocks IDE on Ubuntu Linux.md new file mode 100644 index 0000000000..443aaf018c --- /dev/null +++ b/published/202106/20210603 How to Install Code Blocks IDE on Ubuntu Linux.md @@ -0,0 +1,105 @@ +[#]: subject: (How to Install Code Blocks IDE on Ubuntu Linux) +[#]: via: (https://itsfoss.com/install-code-blocks-ubuntu/) +[#]: author: (Abhishek Prakash https://itsfoss.com/author/abhishek/) +[#]: collector: (lujun9972) +[#]: translator: (geekpi) +[#]: reviewer: (wxy) +[#]: publisher: (wxy) +[#]: url: (https://linux.cn/article-13484-1.html) + +如何在 Ubuntu Linux 上安装 Code Blocks IDE +====== + +![](https://img.linux.net.cn/data/attachment/album/202106/14/164807ov99wdi2m7pmgz2j.jpg) + +Code Blocks 是一个用 C++ 编写的开源 IDE,非常适合 C、C++ 和 Fortran 开发。它是跨平台的,可以在 Linux、macOS 和 Windows 上运行。 + +Code Blocks 是轻量级和快速的。它支持工作区、多目标项目、工作区内的项目间依赖关系。 + +你可以得到语法高亮、代码折叠、标签式界面、类浏览器、智能缩进等功能。你还可以通过插件扩展 IDE 的功能。 + +在本教程中,你将学习如何在基于 Ubuntu 的 Linux 发行版上安装 Code Blocks。 + +> 注意 +> +> Code Blocks 也可以在 Ubuntu 软件中心找到。然而,从 Ubuntu 21.04 开始,从 Ubuntu 软件中心以图形方式安装 Code Blocks 会安装一个 codeblocks-common 软件包,而不是图形化 IDE。因而你不能看到安装在你系统上的 Code Blocks 以运行。由于这个原因,我建议采取终端的方式在 Ubuntu 上安装 Code Blocks。 + +### 在基于 Ubuntu 的 Linux 发行版上安装 Code Blocks + +[Code Blocks IDE][1] 在所有 Ubuntu 版本的 universe 库中都有。虽然它通常是默认启用的,但先[启用 universe 仓库][2]也无妨: + +``` +sudo add-apt-repository universe +``` + +更新软件包缓存,这样系统就能知道新添加的仓库中的额外软件包的可用性: + +``` +sudo apt update +``` + +最后,你可以使用 `apt install` 命令在基于 Ubuntu 的发行版上安装 Code Blocks: + +``` +sudo apt install codeblocks +``` + +![][3] + +建议你也安装额外的插件,以便从 Code Blocks IDE 中获得更多。你可以使用 `codeblocks-contrib` 包来安装它们: + +``` +sudo apt install codeblocks-contrib +``` + +### 如何使用 Code Blocks + +在系统菜单中搜索 “Code Blocks”。这是在 Ubuntu 默认的 GNOME 版本中的样子: + +![][4] + +当你第一次启动 Code Blocks 时,它会寻找你系统中所有可用的编译器,并将其添加到路径中,这样你就不用自己去配置它了。 + +在我的例子中,我的 Ubuntu 系统上已经安装了 gcc,Code Blocks 很好地识别了它。 + +![][5] + +Code Blocks 的用户界面绝对不够现代,但请记住,这个 IDE 是轻量级的,它几乎消耗不到 50MB 的内存。 + +如果你曾经使用过像 Eclipse 这样的其他 IDE,你就不会觉得使用 Code Block 有什么困难。你可以写你的代码并把它们组织在项目中。 + +构建、运行并构建和运行按钮一起放在顶部。 + +![][6] + +当你运行代码时,它会打开一个新的终端窗口来显示输出。 + +![][7] + +这就是你需要的关于 Code Blocks 的最少信息。剩下的留给你,你可以通过浏览它的 [维基][8] 和[用户手册][9] 来进一步探索它。 + +拥有一个 IDE 可以使 [在 Linux 上运行 C 或 C++ 程序][10] 更容易。Eclipse 是一个很好的 IDE,但它比 Code Blocks 要消耗更多的系统资源。当然,最后,重要的是你的选择。 + +-------------------------------------------------------------------------------- + +via: https://itsfoss.com/install-code-blocks-ubuntu/ + +作者:[Abhishek Prakash][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/abhishek/ +[b]: https://github.com/lujun9972 +[1]: https://www.codeblocks.org/ +[2]: https://itsfoss.com/ubuntu-repositories/ +[3]: https://i2.wp.com/itsfoss.com/wp-content/uploads/2021/05/install-code-blocks-ubuntu.png?resize=800%2C445&ssl=1 +[4]: https://i0.wp.com/itsfoss.com/wp-content/uploads/2021/06/code-blocks-ubuntu.jpg?resize=800%2C231&ssl=1 +[5]: https://i2.wp.com/itsfoss.com/wp-content/uploads/2021/05/code-blocks-ide-first-run.png?resize=800%2C529&ssl=1 +[6]: https://i1.wp.com/itsfoss.com/wp-content/uploads/2021/06/code-blocks-ide.png?resize=800%2C543&ssl=1 +[7]: https://i1.wp.com/itsfoss.com/wp-content/uploads/2021/06/code-blocks-code-run-terminal.png?resize=504%2C371&ssl=1 +[8]: https://wiki.codeblocks.org/index.php/Main_Page +[9]: https://www.codeblocks.org/user-manual/ +[10]: https://itsfoss.com/c-plus-plus-ubuntu/ diff --git a/published/202106/20210605 15 Useful Visual Studio Code Keyboard Shortcuts to Increase Productivity.md b/published/202106/20210605 15 Useful Visual Studio Code Keyboard Shortcuts to Increase Productivity.md new file mode 100644 index 0000000000..f2d1c5cdf8 --- /dev/null +++ b/published/202106/20210605 15 Useful Visual Studio Code Keyboard Shortcuts to Increase Productivity.md @@ -0,0 +1,240 @@ +[#]: subject: (15 Useful Visual Studio Code Keyboard Shortcuts to Increase Productivity) +[#]: via: (https://itsfoss.com/vs-code-shortcuts/) +[#]: author: (Sarvottam Kumar https://itsfoss.com/author/sarvottam/) +[#]: collector: (lujun9972) +[#]: translator: (ywxgod) +[#]: reviewer: (wxy) +[#]: publisher: (wxy) +[#]: url: (https://linux.cn/article-13481-1.html) + +15 个提高工作效率的 VS Code 键盘快捷键 +====== + +![](https://img.linux.net.cn/data/attachment/album/202106/13/123502pqfi45mgpf8847yf.jpg) + +毫无疑问,微软的 [VS Code是最好的开源代码编辑器之一][1]。它与传说中的 Vim 不同,VS Code 不需要你是一个快捷键大师(LCTT 译注:以下都指键盘快捷键),开发者们对它大部分的功能都及其熟悉,且推崇备至。 + +但这并不意味着你不能成为快捷键大师,或者说你在 VS Code 中不应该使用快捷键。 + +在敲代码的时候,你可能需要用鼠标去执行其他的动作,比如在 VS Code 编辑器中切换终端,而此时你的代码流程会被打断,这是不是很讨厌?如果是的,那么你应该立即熟记下面这些 VS Code 有用的快捷键。 + +它不仅能帮助你摆脱鼠标,还能使你的生产力和工作效率得到提高。 + +那么,让我们来了解一下如何通过使用快捷键快速进行代码导航来进行快速编码。 + +### 有用的 VS Code 快捷键 + +免责声明。下面的这些快捷键是我在 VS Code 的使用中发现的较为有用的,你可以根据你的需要来发现更多有用的快捷键。 + +下面我还给出了 MacOS 用户的键盘快捷键。 + +#### 1、显示所有命令 + +Windows/Linux | macOS +---|--- +`CTRL + SHIFT + P` 或 `F1` | `SHIFT + ⌘ + P` 或 `F1` + +我们从最有用的快捷键开始,这个快捷键能打开命令面板(列表),它提供了对 VS Code 所有功能的访问。 + +![命令面板][2] + +这是一个非常重要的 VS Code 快捷键,因为即使你忘记了或不想记起其他任何快捷键,但你记得这个,那么你仍然可以使用命令面板进行各种操作,如创建新文件、打开设置、改变主题,还可以查看所有快捷键。 + +#### 2、垂直和水平拆分 VS Code 编辑器 + +Windows/Linux | macOS +---|--- +`CTRL + \` | `⌘ + \` + +为了提高效率,但你又没有安装多个显示器,那么你可以通过水平或垂直分割 VS Code 的编辑器来一次查看多个文件的代码。 + +![分割 VS Code 编辑区][3] + +要在多个编辑区间切换焦点,你可以使用数字键或箭头键。 + +Windows/Linux | macOS +---|--- +`CTRL + 1`/`2`/`3` | `⌘ + 1`/`2`/`3` +`CTRL + K` `CTRL + ←`/`→` | `⌘ + K` `⌘ + ←`/`→` + +#### 3、切换集成终端 + +Windows/Linux | macOS +---|--- +CTRL + \` | ⌘ + \` + +VS Code 中的集成终端是一个非常方便的功能,它可以让你在不切换窗口的情况下快速执行任务。要在编辑器中显示/隐藏终端,下面的快捷键会非常方便。 + +![集成终端][4] + +但是,如果你跟我一样觉得 CTRL + \` 在键盘的角落位置而比较难按到,你可以打开命令面板执行`View: Toggle Terminal` 命令来切换终端。 + +![使用命令面板切换终端][5] + +#### 4、转到文件 + +Windows/Linux | macOS +---|--- +`CTRL + P` | `⌘ + P` + +随着项目的壮大,查找文件可能会变得困难。因此,我建议,即使你使用鼠标,这个命令也能为你节省很多搜索和导航到版本库中的文件的时间。 + +![转到文件][6] + +#### 5、转到行 + +Windows/Linux | macOS +---|--- +`CTRL + G` | `^ + G` + +当你找到文件,你可能需要去到文件中指定的行增加或编辑代码,而如果这个文件包含了数千行代码,那么滚动代码将会浪费你大量的时间。而 `CTRL + G` 或 `^ + G` 快捷键能让你快速的去掉指定的行。 + +![转到行][7] + +另外,你也可以使用上面的转到文件的快捷键,在输入框中输入冒号 `:` 加行号,结果就跟转到行是一样的。 + +#### 6、在整个项目中搜索 + +Windows/Linux | macOS +---|--- +`CTRL + SHIFT + F` | `⌘ + SHIFT + F` + +很可能你需要在整个项目中搜索一个文本、变量或函数,在这种情况下,上面的命令就非常方便,它会在侧边栏显示一个搜索输入框。 + +![在项目中搜索][8] + +我们还可以在搜索的时候添加一些过滤器,比如使用 `ALT+C` 来启用大写匹配,`ALT+W` 用于匹配整个单词,`ALT+R` 用于启用正则表达式。 + +#### 7、禅模式 + +Windows/Linux | macOS +---|--- +`CTRL + K Z` | `⌘ + K Z` + +想要在不受干扰的环境中工作以保持更专注? 你可以试试禅模式(先按下 `CTRL + K`,再按下 `Z`),它会隐藏所有 UI(状态栏、活动栏、面板和侧边栏)并仅在全屏上显示编辑器。 + +![禅模式][9] + +要启用禅模式,你可以使用上面的快捷键或者打开命令面板执行 `View: Toggle Zen Mode`,要退出禅模式,你可以按两次 `Esc` 键。 + +#### 8、将选择添加到下一次匹配中 + +Windows/Linux | macOS +---|--- +`CTRL + D` | `⌘ + D` + +这条命令能让你选择所选文本的下一个出现的地方,从而进行编辑。如果下一个匹配出现的位置与第一个相离较远,那这将会很方便处理。 + +![查找下一个匹配][10] + +#### 9、切换行注释 + +Windows/Linux | macOS +---|--- +`CTRL + /` | `⌘ + /` + +将光标移到行的开头,然后添加双斜杠进行注释,这种麻烦的操作我们可以用上面的快捷键来代替了。 + +![注释代码][11] + +甚至,如果你想注释多行代码,你可以先通过 `SHIFT+UP`/`Down` 快捷键来选中多行,然后按 `CTRL+/` 快捷键进行注释。 + +#### 10、转到文件的开头或结尾 + +Windows/Linux | macOS +---|--- +`CTRL + HOME`/`END` | `⌘ + ↑`/`↓` + +如果你迷失在文件的中间位置,该命令可以让你快速达到文件的起点或终点。 + +#### 11、代码折叠或打开 + +Windows/Linux | macOS +---|--- +`CTRL + SHIFT + [`/`]` | `⌥ + ⌘ + [`/`]` + +这也是最有用的快捷键之一,它可以帮助你折叠/取消折叠一个区域的代码。通过这种方式,你可以隐藏不必要的代码,每次只查看所需的部分代码,以便更加专注和快速编码。 + +![折叠一块代码][12] + +#### 12、窥视执行 + +Windows/Linux | macOS +---|--- +`CTRL + SHIFT + F12` | `⌘ + SHIFT + F12` + +这个快捷键最有可能的作用是帮助你进行代码分析,或修复 bug 时了解函数和变量的运行情况。 + +![窥视执行][13] + +#### 13、删除当前行 + +Windows/Linux | macOS +---|--- +`CTRL + SHIFT + K` | `SHIFT + ⌘ + K` + +这是一条可以快速执行,选中当前行并按删除/退格键,这两个任务的简单命令。 + +#### 14、查找与替换 + +Windows/Linux | macOS +---|--- +`CTRL + F` | `⌘ + F` +`CTRL + H` | `⌥ + ⌘ + F` + +用一个新的文本替换文件中所有出现的该文本的最好方法是什么?如果你手动一个一个的通过滚动代码来处理,且如果需要替换的地方又很多,那么你可能会花费大量的时间。 + +![查找与替换][14] + +而使用查找和替换功能我们能在几秒内完成相同的任务。你可以用两个快捷键来打开它,其中一个实际上是打开用于查找文本的输入框,另一个用于输入新的文本。 + +#### 15、VS Code 的全部键盘快捷键 + +Windows/Linux | macOS +---|--- +`CTRL + K CTRL + S` | `⌘ + K ⌘ + S` + +最后,如果你还在为记住上述所有的快捷键而苦恼,你大可不必。因为你可以使用上面的快捷键查看编辑器所有可用的命令。 + +![快捷键][15] + +你还可以根据自己的喜好编辑命令的绑定键。 + +### 想要为 VS Code 添加更多快捷键? + +如果你想对 VS Code 的快捷键有完整的了解,你可以查看 VS Code 的 [文档][16]。 + +或者,如果你想在纸上将所有快捷键打印出来慢慢看,下面这些是各个系统对应的快捷键速查表: [Linux][17]、[macOS][18] 和 [Windows][19]。 + +-------------------------------------------------------------------------------- + +via: https://itsfoss.com/vs-code-shortcuts/ + +作者:[Sarvottam Kumar][a] +选题:[lujun9972][b] +译者:[ywxgod](https://github.com/ywxgod) +校对:[wxy](https://github.com/wxy) + +本文由 [LCTT](https://github.com/LCTT/TranslateProject) 原创编译,[Linux中国](https://linux.cn/) 荣誉推出 + +[a]: https://itsfoss.com/author/sarvottam/ +[b]: https://github.com/lujun9972 +[1]: https://itsfoss.com/best-modern-open-source-code-editors-for-linux/ +[2]: https://i0.wp.com/itsfoss.com/wp-content/uploads/2021/05/Command-Palette.jpg?resize=800%2C418&ssl=1 +[3]: https://i2.wp.com/itsfoss.com/wp-content/uploads/2021/05/Split-VS-Code.png?resize=800%2C405&ssl=1 +[4]: https://i0.wp.com/itsfoss.com/wp-content/uploads/2021/05/Integrated-Terminal.png?resize=800%2C221&ssl=1 +[5]: https://i2.wp.com/itsfoss.com/wp-content/uploads/2021/05/Toggle-Terminal-Using-Command-Palette.png?resize=686%2C118&ssl=1 +[6]: https://i2.wp.com/itsfoss.com/wp-content/uploads/2021/05/Go-to-file.jpg?resize=800%2C388&ssl=1 +[7]: https://i0.wp.com/itsfoss.com/wp-content/uploads/2021/05/Go-to-line.jpg?resize=800%2C99&ssl=1 +[8]: https://i1.wp.com/itsfoss.com/wp-content/uploads/2021/05/Search-project.jpg?resize=381%2C450&ssl=1 +[9]: https://i1.wp.com/itsfoss.com/wp-content/uploads/2021/05/Zen-Mode.png?resize=800%2C450&ssl=1 +[10]: https://i2.wp.com/itsfoss.com/wp-content/uploads/2021/05/Next-find-match.jpg?resize=800%2C313&ssl=1 +[11]: https://i0.wp.com/itsfoss.com/wp-content/uploads/2021/05/Comment-out-code.jpg?resize=800%2C313&ssl=1 +[12]: https://i1.wp.com/itsfoss.com/wp-content/uploads/2021/05/Collapse-a-region-of-code.jpg?resize=800%2C287&ssl=1 +[13]: https://i2.wp.com/itsfoss.com/wp-content/uploads/2021/05/Peek-Implementation.png?resize=800%2C339&ssl=1 +[14]: https://i2.wp.com/itsfoss.com/wp-content/uploads/2021/05/Find-and-replace.png?resize=800%2C223&ssl=1 +[15]: https://i1.wp.com/itsfoss.com/wp-content/uploads/2021/05/Keyboard-Shortcuts.png?resize=800%2C406&ssl=1 +[16]: https://code.visualstudio.com/docs/getstarted/keybindings +[17]: https://code.visualstudio.com/shortcuts/keyboard-shortcuts-linux.pdf +[18]: https://code.visualstudio.com/shortcuts/keyboard-shortcuts-macos.pdf +[19]: https://code.visualstudio.com/shortcuts/keyboard-shortcuts-windows.pdf diff --git a/published/202106/20210608 How FreeDOS boots.md b/published/202106/20210608 How FreeDOS boots.md new file mode 100644 index 0000000000..bbad79b7e3 --- /dev/null +++ b/published/202106/20210608 How FreeDOS boots.md @@ -0,0 +1,71 @@ +[#]: subject: (How FreeDOS boots) +[#]: via: (https://opensource.com/article/21/6/freedos-boots) +[#]: author: (Jim Hall https://opensource.com/users/jim-hall) +[#]: collector: (lujun9972) +[#]: translator: (geekpi) +[#]: reviewer: (wxy) +[#]: publisher: (wxy) +[#]: url: (https://linux.cn/article-13503-1.html) + +FreeDOS 如何启动 +====== + +> 概述你的计算机如何引导和启动一个像 FreeDOS 这样的简单操作系统。 + +![](https://img.linux.net.cn/data/attachment/album/202106/20/140809fpkrcnow8npnow8p.jpg) + +在使用 DOS 计算机的过程中,我很欣赏的一点是,引导过程相对容易理解。在 DOS 中没有太多的变动组件。而今天,我想和大家分享一下电脑是如何引导和启动像 FreeDOS 这样的简单操作系统的概况。 + +### 初始引导 + +当你打开计算机的电源时,系统会进行一些自我检查,如验证内存和其他组件。这被称为开机自检Power On Self Test(POST)。POST 之后,计算机使用一个硬编码指令,告诉它在哪里找到加载操作系统的指令。这就是“引导加载程序boot loader”,通常它将试图找到硬盘上的主引导记录Master Boot Record(MBR)。然后,MBR 加载主操作系统,在这里就是 FreeDOS。 + +这个定位一个信息以便计算机能够加载操作系统的下一个部分的过程被称为“引导bootstrapping”,来自于“通过你自己的努力振作起来picking yourself up by your bootstraps”的古老说法。正是从这个用法中,我们采用了“引导boot”一词来表示启动你的计算机。 + +### 内核 + +当计算机加载 FreeDOS 内核时,内核所做的第一件事就是识别用户所表示要使用的任何参数。它被保存在一个叫做 `FDCONFIG.SYS` 的文件中,与内核保存在同一个根目录下。如果 `FDCONFIG.SYS` 不存在,那么 FreeDOS 的内核就会寻找一个叫做 `CONFIG.SYS` 的替代文件。 + +如果你在 20 世纪 80 年代或 90 年代使用过 DOS,你可能对 `CONFIG.SYS` 文件很熟悉。从 1999 年起,FreeDOS 首先寻找 `FDCONFIG.SYS`,以防你的 DOS 系统与其他 DOS(如 MS-DOS)做了 _双启动_。请注意,MS-DOS 只使用 `CONFIG.SYS` 文件。因此,如果你用同一个硬盘同时启动 FreeDOS 和 MS-DOS,MS-DOS 使用 `CONFIG.SYS` 来配置自己,而 FreeDOS 则使用 `FDCONFIG.SYS`。这样一来,双方都可以使用自己的配置。 + +`FDCONFIG.SYS` 可以包含一些配置设置,其中之一是 `SHELL=` 或 `SHELLHIGH=`。任何一个都会指示内核加载这个程序作为用户的交互式 shell。 + +如果 `FDCONFIG.SYS` 和 `CONFIG.SYS` 都不存在,那么内核就会假定几个默认值,包括在哪里找到 shell。如果你在启动 FreeDOS 系统时看到 “Bad or missing Command Interpreter” 的信息,这意味着 `SHELL=` 或 `SHELLHIGH=` 指向了一个在你系统中不存在的 shell 程序。 + +![Bad or missing Command Interpreter][2] + +你可以通过查看 `SHELL=` 或 `SHELLHIGH=` 行来调试这个问题。如果做不到这一点,请确保你在 FreeDOS 系统的根目录下有一个名为 `COMMAND.COM` 的程序。它就是 _shell_,我接下来会讲到它。 + +### shell + +在 DOS 系统中,“shell” 一词通常是指一个命令行解释器:一个交互式程序,它从用户那里读取指令,然后执行它们。在这里,FreeDOS 的 shell 与 Linux 的 Bash shell 相似。 + +除非你用 `SHELL=` 或 `SHELLHIGH=` 要求内核加载一个不同的 shell,否则 DOS 上的标准命令行 shell 被称为 `COMMAND.COM`。当 `COMMAND.COM` 启动时,它也寻找一个文件来配置自己。默认情况下,`COMMAND.COM` 会在根目录下寻找一个名为 `AUTOEXEC.BAT` 的文件。`AUTOEXEC.BAT` 是一个“批处理文件”,它包含一组启动时运行的指令,大致类似于 Linux 上 Bash 启动时读取的 `~/.bashrc` “资源文件”。 + +你可以在 `FDCONFIG.SYS` 文件中用 `SHELL=` 或 `SHELLHIGH=` 改变 shell 以及 shell 的启动文件。FreeDOS 1.3 RC4 安装程序将系统设置为读取 `FDAUTO.BAT` 而不是 `AUTOEXEC.BAT`。这与内核读取另一个配置文件的原因相同;你可以在硬盘上用另一个 DOS 双启动 FreeDOS。FreeDOS 将使用 `FDAUTO.BAT` 而 MS-DOS 将使用 `AUTOEXEC.BAT`。 + +如果没有像 `AUTOEXEC.BAT` 这样的启动文件,shell 将简单地提示用户输入日期和时间。 + +![Without AUTOEXEC.BAT, the shell will prompt for date and time][3] + +就是这些了。当 FreeDOS 加载了内核,而内核也加载了 shell,FreeDOS 就准备好让用户输入命令了。 + +![FreeDOS is ready for you to enter your first command][4] + +-------------------------------------------------------------------------------- + +via: https://opensource.com/article/21/6/freedos-boots + +作者:[Jim Hall][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/jim-hall +[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 (Code going into a computer.) +[2]: https://opensource.com/sites/default/files/uploads/bad-missing-command.png (Bad or missing Command Interpreter) +[3]: https://opensource.com/sites/default/files/uploads/no-autoexec.png (Without AUTOEXEC.BAT, the shell will prompt for date and time) +[4]: https://opensource.com/sites/default/files/uploads/freedos-boot.png (FreeDOS is ready for you to enter your first command) diff --git a/published/202106/20210608 Subtitld- A Cross-Platform Open-Source Subtitle Editor.md b/published/202106/20210608 Subtitld- A Cross-Platform Open-Source Subtitle Editor.md new file mode 100644 index 0000000000..69832b7d35 --- /dev/null +++ b/published/202106/20210608 Subtitld- A Cross-Platform Open-Source Subtitle Editor.md @@ -0,0 +1,101 @@ +[#]: subject: (Subtitld: A Cross-Platform Open-Source Subtitle Editor) +[#]: via: (https://itsfoss.com/subtitld/) +[#]: author: (Ankush Das https://itsfoss.com/author/ankush/) +[#]: collector: (lujun9972) +[#]: translator: (geekpi) +[#]: reviewer: (wxy) +[#]: publisher: (wxy) +[#]: url: (https://linux.cn/article-13510-1.html) + +Subtitld: 一个跨平台的开源字幕编辑器 +====== + +![](https://img.linux.net.cn/data/attachment/album/202106/22/145800rejjtp9exvd7zvpn.jpg) + +字幕可以使观看视频的体验更加完美。你不需要一定理解视频的语言,字幕可以帮助你用你喜欢的文字来弄清楚正在发生什么。 + +你在流媒体平台上找到的大部分内容都有字幕,你可能需要为一些你在本地收藏的视频添加字幕。 + +虽然你可以通过简单地下载 SRT 文件并使用视频播放器加载它来做到这一点,但你如何编辑它,删除它,或转录一个视频?Subtitld 是一个开源的字幕编辑器,它可以帮助你。 + +### Subtitld: 创建、删除、切分和转录字幕 + +Subtitld 是一个自由开源的项目,可以让你充分利用你的字幕。 + +![][1] + +如果你没有字幕,就创建一个,如果你需要编辑它,就用这个吧。有了这个开源工具,你会有许多选项来处理字幕。 + +换句话说,它是字幕编辑器之一,也是一个成熟的字幕编辑器(就我所遇到的而言)。 + +在你决定试用它之前,让我强调一些关键功能。 + +### Subtitld 的功能 + +![][2] + +它提供了大量的功能,虽然不是每个人都需要所有的功能,但如果你是一个经常需要创建、编辑和处理字幕的人,它应该会很方便。 + +下面是它的功能列表: + +* 创建字幕 +* 编辑字幕 +* 使用时间轴移动字幕,手动同步 +* 放大/缩小功能,帮助处理拥挤的时间线 +* 支持保存为 SRT 文件格式 +* 支持各种其他格式的导入和导出(SSA、TTML、SBV、DFXP、VTT、XML、SCC 和 SAMI) +* 易于调整字幕大小或从时间轴上调整字幕的持续时间 +* 与其他字幕合并,或从项目中切分字幕 +* 能够启用网格,按帧、场景或秒进行可视化 +* 在编辑器中回放以检查字幕情况 +* 在时间轴上捕捉字幕以避免重叠 +* 在字幕中添加/删除 +* 启用安全边界,以确保字幕不会看起来不妥当 +* 调整播放速度 +* 键盘快捷键 +* 自动转录 +* 输出加入了字幕的视频 +* 无限次撤消 + +除了这些功能外,音频波形的视觉提示也有一定的帮助。 + +![][3] + +总的来说,如果你是一个转录视频的人,想一次性地编辑视频,你可以用它做很多事情,也可以专业地使用它。 + +### 在 Linux 中安装 Subtitld + +虽然它也适用于 Windows,但你可以在 Linux 上使用 [snap 包][6] 轻松地安装它。你不会找到二进制包或 Flatpak,但你应该能够在任何 Linux 发行版上 [使用 snap][7] 安装它。 + +- [Subtitld][8] + +如果你想深入探索,你可以在 [GitLab][9] 上找到源代码。 + +### 总结 + +它有视频同步或添加字幕的精细设置,我只是测试了一些导入、导出、添加或删除字幕的基本功能。 + +自动转录功能仍处于测试阶段(截至发布时),但用户界面可以再做一些改进。例如,当我把鼠标悬停在编辑器内的按钮上时,它没有告诉我它是做什么的。 + +总的来说,它是一个在 Linux 上的有用工具。你对它有什么看法?请不要犹豫,在下面的评论中让我知道你的想法。 + +-------------------------------------------------------------------------------- + +via: https://itsfoss.com/subtitld/ + +作者:[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/2021/06/subtitld-editor.png?resize=800%2C546&ssl=1 +[2]: https://i2.wp.com/itsfoss.com/wp-content/uploads/2021/06/subtitld-export.png?resize=800%2C469&ssl=1 +[3]: https://i0.wp.com/itsfoss.com/wp-content/uploads/2021/06/subtitld-screenshot-1.png?resize=800%2C588&ssl=1 +[6]: https://snapcraft.io/subtitld +[7]: https://itsfoss.com/use-snap-packages-ubuntu-16-04/ +[8]: https://subtitld.jonata.org +[9]: https://gitlab.com/jonata/subtitld \ No newline at end of file diff --git a/published/202106/20210609 Helix- A Terminal Based Text Editor for Power Linux Users.md b/published/202106/20210609 Helix- A Terminal Based Text Editor for Power Linux Users.md new file mode 100644 index 0000000000..6e71cd3c0e --- /dev/null +++ b/published/202106/20210609 Helix- A Terminal Based Text Editor for Power Linux Users.md @@ -0,0 +1,102 @@ +[#]: subject: (Helix: A Terminal Based Text Editor for Power Linux Users) +[#]: via: (https://itsfoss.com/helix-editor/) +[#]: author: (Abhishek Prakash https://itsfoss.com/author/abhishek/) +[#]: collector: (lujun9972) +[#]: translator: (geekpi) +[#]: reviewer: (wxy) +[#]: publisher: (wxy) +[#]: url: (https://linux.cn/article-13495-1.html) + +Helix:高级 Linux 用户的终端文本编辑器 +====== + +说到 [基于终端的文本编辑器][1],通常 Vim、Emacs 和 Nano 受到了关注。 + +这并不意味着没有其他这样的文本编辑器。Vim 的现代增强版 [Neovim][2],是许多这样的例子之一。 + +按照同样的思路,我想介绍另一个基于终端的文本编辑器,叫做 Helix Editor。 + +### Helix,一个用 Rust 编写的现代文本编辑器 + +![][3] + +[Helix][4] 是用 Rust 编写的,使用 Tree-sitter 进行语法高亮。开发者声称,它比正则表达式高亮更快,因为 Tree-sitter 像编译器一样将代码解析成语法树,从而给出更多的代码结构信息。 + +你可以跟踪局部变量,计算缩进和操作选择来选择语法节点。它足够强大,即使有语法错误也能产生结果。 + +Helix 的主要亮点是“多重选择”,这是基于 [Kakoune][5] 的。 + +内置的语言服务器支持提供上下文感知补全、诊断和代码操作。 + +### 在 Linux 上安装 Helix + +对于 Arch 和 Manjaro 用户来说,Helix 在 AUR 中有两个包: + + * [helix-bin][6]: 包含来自 GitHub 发布的预构建二进制文件 + * [helix-git][7]: 构建该仓库的主分支 + +作为一个 Arch 用户,我相信你可能已经知道 [如何使用 AUR 安装应用][8]。 + +对于其他 Linux 发行版,你必须使用 Cargo。Cargo 是 Rust 软件包管理器。有了它,你可以安装 Rust 包。可以认为它相当于 Python 的 PIP。 + +你应该能够使用你的发行版的包管理器来安装 Cargo。在基于 Ubuntu 的发行版上,可以这样安装 Cargo: + +``` +sudo apt install cargo +``` + +接下来,你要克隆 Helix 仓库: + +``` +git clone --recurse-submodules --shallow-submodules -j8 https://github.com/helix-editor/helix +``` + +进入克隆的目录中: + +``` +cd helix +``` + +现在用 `cargo` 来安装 Helix: + +``` +cargo install --path helix-term --features "embed_runtime" +``` + +最后一步是将 `hx` 二进制文件添加到 `PATH` 变量中,这样你就可以从任何地方运行它。这应该被添加到你的 `bashrc` 或 bash 配置文件中。 + +``` +export PATH=”$HOME/.cargo/bin:$PATH” +``` + +现在都设置好了,你应该可以通过在终端输入 `hx` 来使用编辑器。 + +你可以在 Helix 的[文档页][9]上找到使用 Helix 的键盘快捷键: + +- [Helix 键盘快捷键][10] + +它与 Vim 或 Neovim 相比如何?我无法说。我可以用 Vim 进行基本的编辑,但我不是 Vim 忍者。如果你是一个信奉 Vim(或 Emacs)的人,请你试试 Helix 并自己判断。 + +-------------------------------------------------------------------------------- + +via: https://itsfoss.com/helix-editor/ + +作者:[Abhishek Prakash][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/abhishek/ +[b]: https://github.com/lujun9972 +[1]: https://itsfoss.com/command-line-text-editors-linux/ +[2]: https://neovim.io/ +[3]: https://i1.wp.com/itsfoss.com/wp-content/uploads/2021/06/helix-editor-screenshot.png?resize=800%2C515&ssl=1 +[4]: https://helix-editor.com/ +[5]: http://kakoune.org/ +[6]: https://aur.archlinux.org/packages/helix-bin/ +[7]: https://aur.archlinux.org/packages/helix-git/ +[8]: https://itsfoss.com/aur-arch-linux/ +[9]: https://docs.helix-editor.com/ +[10]: https://docs.helix-editor.com/keymap.html diff --git a/published/202106/20210610 Use cpulimit to free up your CPU.md b/published/202106/20210610 Use cpulimit to free up your CPU.md new file mode 100644 index 0000000000..9276c0dd58 --- /dev/null +++ b/published/202106/20210610 Use cpulimit to free up your CPU.md @@ -0,0 +1,91 @@ +[#]: subject: (Use cpulimit to free up your CPU) +[#]: via: (https://fedoramagazine.org/use-cpulimit-to-free-up-your-cpu/) +[#]: author: (Gregory Bartholomew https://fedoramagazine.org/author/glb/) +[#]: collector: (lujun9972) +[#]: translator: (geekpi) +[#]: reviewer: (wxy) +[#]: publisher: (wxy) +[#]: url: (https://linux.cn/article-13501-1.html) + +使用 cpulimit 来释放你的 CPU +====== + +![](https://img.linux.net.cn/data/attachment/album/202106/19/084002xuwuuqfww8xvfem7.jpg) + +在 Linux 系统上管理系统资源的推荐工具是 [cgroups][4]。虽然在可以调整的限制方面(CPU、内存、磁盘 I/O、网络等)非常强大,但配置 cgroups 并不简单。[nice][5] 命令从 1973 年起就可以使用了。但它只是调整在一个处理器上竞争时间的进程之间的调度优先级。`nice` 命令不会限制一个进程在单位时间内所能消耗的 CPU 周期的百分比。[cpulimit][6] 命令提供了两个世界的最佳方案。它限制了一个进程在每单位时间内可以分配的 CPU 周期的百分比,而且相对容易调用。 + +`cpulimit` 命令主要对长期运行的和 CPU 密集型的进程有用。编译软件和转换视频是长期运行的进程的常见例子,它们可以使计算机的 CPU 使用率达到最大。限制这类进程的 CPU 使用率将释放出处理器时间,供计算机上可能运行的其他任务使用。限制 CPU 密集型进程也将减少功耗及热输出,并可能减少系统的风扇噪音。限制一个进程的 CPU 使用率的代价是,它需要更多的时间来完成运行。 + +### 安装 cpulimit + +`cpulimit` 命令在默认的 Fedora Linux 仓库中可用。运行下面的命令,在 Fedora Linux 系统上安装 `cpulimit`: + +``` +$ sudo dnf install cpulimit +``` + +### 查看 cpulimit 的文档 + +`cpulimit` 软件包并没有附带的手册页。使用下面的命令来查看 `cpulimit` 的内置文档。输出结果在下面提供。但你可能需要在你自己的系统上运行该命令,以防止自本文编写以来选项发生变化。 + +``` +$ cpulimit --help +Usage: cpulimit [OPTIONS…] TARGET + OPTIONS + -l, --limit=N percentage of cpu allowed from 0 to 800 (required) + -v, --verbose show control statistics + -z, --lazy exit if there is no target process, or if it dies + -i, --include-children limit also the children processes + -h, --help display this help and exit + TARGET must be exactly one of these: + -p, --pid=N pid of the process (implies -z) + -e, --exe=FILE name of the executable program file or path name + COMMAND [ARGS] run this command and limit it (implies -z) +``` + +### 演示 + +为了演示 `cpulimit` 命令的使用方式,下面提供了一个精心设计的、计算量很大的 Python 脚本。该脚本首先在没有限制的情况下运行,然后在限制为 50% 的情况下运行。它计算的是第 42 个 [斐波那契数][7] 的值。该脚本在这两种情况下都作为 `time` 命令的子进程运行,以显示计算答案所需的总时间。 + +``` +$ /bin/time -f '(computed in %e seconds)' /bin/python -c 'f = lambda n: n if n<2 else f(n-1)+f(n-2); print(f(42), end=" ")' +267914296 (computed in 51.80 seconds) +$ /bin/cpulimit -i -l 50 /bin/time -f '(computed in %e seconds)' /bin/python -c 'f = lambda n: n if n<2 else f(n-1)+f(n-2); print(f(42), end=" ")' +267914296 (computed in 127.38 seconds) +``` + +当运行第一个版本的命令时,你可能会听到电脑上的 CPU 风扇转动起来。但在运行第二个版本时,你应该不会。第一个版本的命令不受 CPU 的限制,但它不应该导致你的电脑陷入瘫痪。它是以这样一种方式编写的:它最多只能使用一个 CPU 核心。大多数现代 PC 都有多个 CPU 核心,当其中一个 CPU 100% 繁忙时,可以毫无困难地同时运行其他任务。为了验证第一条命令是否使你的一个处理器达到最大,在一个单独的终端窗口中运行 `top` 命令并按下 `1` 键。要退出 `top` 命令可以按 `Q` 键。 + +设置高于 100% 的限制只对能够进行 [任务并行化][8] 的程序有意义。对于这样的程序,高于 100% 的增量代表一个 CPU 的全部利用率(200%=2 个CPU,300%=3 个CPU,等等)。 + +注意,在上面的例子中,`-i` 选项已经传递给 `cpulimit` 命令。这是必要的,因为要限制的命令不是 `cpulimit` 命令的直接子进程。相反,它是 `time` 命令的一个子进程,而后者又是 `cpulimit` 命令的一个子进程。如果没有 `-i` 选项,`cpulimit` 将只限制 `time` 命令。 + +### 最后说明 + +如果你想限制一个从桌面图标启动的图形程序,请将该程序的 `.desktop` 文件(通常位于 `/usr/share/applications` 目录下)复制到你的 `~/.local/share/applications` 目录下,并相应修改 `Exec` 行。然后运行下面的命令来应用这些变化: + +``` +$ update-desktop-database ~/.local/share/applications +``` + +-------------------------------------------------------------------------------- + +via: https://fedoramagazine.org/use-cpulimit-to-free-up-your-cpu/ + +作者:[Gregory Bartholomew][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/glb/ +[b]: https://github.com/lujun9972 +[1]: https://fedoramagazine.org/wp-content/uploads/2021/06/cpulimit-816x345.jpg +[2]: https://unsplash.com/@henning?utm_source=unsplash&utm_medium=referral&utm_content=creditCopyText +[3]: https://unsplash.com/s/photos/speed-limit?utm_source=unsplash&utm_medium=referral&utm_content=creditCopyText +[4]: https://en.wikipedia.org/wiki/Cgroups +[5]: https://en.wikipedia.org/wiki/Nice_(Unix) +[6]: https://github.com/opsengine/cpulimit +[7]: https://en.wikipedia.org/wiki/Fibonacci_number +[8]: https://en.wikipedia.org/wiki/Task_parallelism diff --git a/published/202106/20210610 Why choose open source for your home automation project.md b/published/202106/20210610 Why choose open source for your home automation project.md new file mode 100644 index 0000000000..ef10c47064 --- /dev/null +++ b/published/202106/20210610 Why choose open source for your home automation project.md @@ -0,0 +1,45 @@ +[#]: subject: "Why choose open source for your home automation project" +[#]: via: "https://opensource.com/article/21/6/home-automation-ebook" +[#]: author: "Alan Smithee https://opensource.com/users/alansmithee" +[#]: collector: "lujun9972" +[#]: translator: "zepoch" +[#]: reviewer: "wxy" +[#]: publisher: "wxy" +[#]: url: "https://linux.cn/article-13535-1.html" + +为什么要为你的家庭自动化项目选择开源 +====== + +> 家庭自动化是一个令人兴奋的技术分支。现在开始用开源工具为你的家庭自动化设计一套解决方案吧。 + +![](https://img.linux.net.cn/data/attachment/album/202106/29/215353tk85i7m1myggvu8g.jpg) + +行动起来吧。科技的关键是让生活更加美好。 + +当然,“更好”的标准因人而异,取决于他们在特定时刻的需求。尽管如此,技术具有影响许多不同阶段生活的独特能力。对一些人来说,科技提供了一个轻松的下午娱乐,而对另一些人来说,它提供导航帮助、改善医疗保健或更精确的科学研究。 + +有趣的是,为一个目的开发的技术很少与用于另一个目的的技术完全无关。例如,运动相机的进步使得一个人可以记录她们在滑雪场上的滑雪过程,也可以使得人体摄像头来帮助防止警察侵犯人权。3D 打印的进步可以让一个人可以制作超级英雄的动作手办,也使得志愿者可以为体弱者制造氧气呼吸机成为可能。技术很重要,它影响着我们所有人。 + +开源的工作之一是确保每个人都能获得技术进步,无论种族、性别、国籍、身体能力、宗教信仰或财富如何。可悲的是,有些公司将技术视为一种工具来获取有关其客户(即你和我!)的数据,即使这些客户为该技术的研究和开发提供资金。不过,这不是开源的目标,开源项目保护其用户。 + +是的,家庭自动化是一种现代便利,它正在变得一天比一天好。但这是你的家。开源家庭自动化可以让生活变得更轻松,更像是所有科幻书籍和电影中承诺的未来。但它也可以改善那些身体能力与电器制造商计划不同的人的生活。一个简单的 Python 脚本对一个用户来说可能只是带来了一些便利,而对其他人来说却可能会改变生活。 + +家庭自动化是一个令人兴奋和有趣的技术分支。 借助这本 **[电子书][2]**,立即开始设计你的家庭自动化解决方案,然后与他人分享你的创新,让每个人都能受益。 + +这就是开源的真正意义所在:可以帮助世界上的所有人。 + +-------------------------------------------------------------------------------- + +via: https://opensource.com/article/21/6/home-automation-ebook + +作者:[Alan Smithee][a] +选题:[lujun9972][b] +译者:[zepoch](https://github.com/zepoch) +校对:[wxy](https://github.com/wxy) + +本文由 [LCTT](https://github.com/LCTT/TranslateProject) 原创编译,[Linux中国](https://linux.cn/) 荣誉推出 + +[a]: https://opensource.com/users/alansmithee +[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://opensource.com/downloads/home-automation-ebook diff --git a/published/202106/20210611 RTFM- How to Read (and Understand) the Fantastic Man Pages in Linux.md b/published/202106/20210611 RTFM- How to Read (and Understand) the Fantastic Man Pages in Linux.md new file mode 100644 index 0000000000..aa785206b5 --- /dev/null +++ b/published/202106/20210611 RTFM- How to Read (and Understand) the Fantastic Man Pages in Linux.md @@ -0,0 +1,349 @@ +[#]: subject: (RTFM! How to Read \(and Understand\) the Fantastic Man Pages in Linux) +[#]: via: (https://itsfoss.com/linux-man-page-guide/) +[#]: author: (Bill Dyer https://itsfoss.com/author/bill/) +[#]: collector: (lujun9972) +[#]: translator: (wxy) +[#]: reviewer: (wxy) +[#]: publisher: (wxy) +[#]: url: (https://linux.cn/article-13478-1.html) + +RTFM!如何阅读(和理解)Linux 中神奇的手册页 +====== + +![](https://img.linux.net.cn/data/attachment/album/202106/12/161749re6iiuhzn9ni2in4.jpg) + +手册页man pages,即参考手册页reference manual pages的简称,是你进入 Linux 的钥匙。你想知道的一切都在那里,包罗万象。这套文档永远不会赢得普利策奖,但这套文档是相当准确和完整的。手册页是主要信源,其权威性是众所周知的。 + +虽然它们是源头,但阅读起来并不是最令人愉快的。有一次,在很久以前的哲学课上,有人告诉我,阅读 [亚里士多德][1] 是最无聊的阅读。我不同意:说到枯燥的阅读,亚里士多德远远地排在第二位,仅次于手册页。 + +乍一看,这些页面可能看起来并不完整,但是,不管你信不信,手册页并不是为了隐藏信息 —— 只是因为信息量太大,这些页面必须要有结构,而且信息是以尽可能简短的形式给出的。这些解释相当简略,需要一些时间来适应,但一旦你掌握了使用它们的技巧,你就会发现它们实际上是多么有用。 + +### Linux 中的手册页入门 + +这些页面是通过一个叫做 `man` 的工具查看的,使用它的命令相当简单。在最简单的情况下,要使用 `man`,你要在命令行上输入 `man`,后面加一个空格和你想查询的命令,比如 `ls` 或 `cp`,像这样: + +``` +man ls +``` + +`man` 会打开 `ls` 命令的手册页。 + +![][2] + +你可以用方向键上下移动,按 `q` 退出查看手册页。通常情况下,手册页是用 `less` 打开的,所以 `less` 命令的键盘快捷键在 `man` 中也可以使用。 + +例如,你可以用 `/search_term` 来搜索一个特定的文本,等等。 + +有一个关于手册页的介绍,这是一篇值得阅读介绍。它非常详细地说明了手册页是如何布局和组织的。 + +要看这个页面,请打开一个终端,然后输入: + +``` +man man +``` + +![man page of man][3] + +### 节 + +在你开始更深入地研究手册页之前,知道手册页有一个固定的页面布局和一个归档方案会有帮助。这可能会让新手感到困惑,因为我可以说:“看手册页中关于 `ls` 的 NAME section”,我也可以说:“看第 5 section中的 `passwd` 的手册页。” + +我把 “section” 这个词用斜体字表示,是为了显示混淆的来源。这个词,“节” 被用于两种不同的方式,但并不总是向新人解释其中的区别。 + +我不确定为什么会出现这种混淆,但我在培训新用户和初级系统管理员时看到过几次这种混淆。我认为这可能是隧道视野,专注于一件事会使一个人忘记另一件事。一叶障目,不见泰山。 + +对于那些已经知道其中的区别的人,你可以跳过这一小节。这一部分是针对那些刚接触到手册页的人。 + +这就是区别: + +#### 对于手册页 + +单独的手册页是用来显示信息块的。例如,每个手册页都有一个“NAME”节,显示命令的名称和简短的描述。还会有另一个信息块,称为“SYNOPSIS”,显示该命令是如何使用的,以此类推。 + +![][4] + +每个手册页都会有这些,以及其他的标题。这些在各个手册页上的节,或者说标题,有助于保持事情的一致性和信息的分工。 + +#### 对于手册 + +使用“节”,如 “查看第 5 节中的 `passwd` 的手册页”,是指整个手册的内容。当我们只看一页时,很容易忽略这一点,但是 `passwd` 手册页是同一本手册的一部分,该手册还有 `ls`、`rm`、`date`、`cal` 等的手册页。 + +整个 Linux 手册是巨大的;它有成千上万的手册页。其中一些手册页有专门的信息。有些手册页有程序员需要的信息,有些手册页有网络方面的独特信息,还有一些是系统管理员会感兴趣的。 + +这些手册页根据其独特的目的被分组。想想看,把整个手册分成几个章节 —— 每章有一个特定的主题。有 9 个左右的章节(非常大的章节)。碰巧的是,这些章节被称为“节”。 + +总结一下: + + * 手册中单页(我们称之为“手册页”)的节是由标题定义的信息块。 + * 这个大的手册(所有页面的集合)中的章节,刚好被称为“节”。 + +现在你知道区别了,希望本文的其余部分会更容易理解。 + +### 手册页的节 + +你将会看到不同的手册页,所以让我们先研究一下各个页面的布局。 + +手册页被分成几个标题,它们可能因提供者不同而不同,但会有相似之处。一般的分类如下: + + * `NAME`(名称) + * `SYNOPSIS`(概要) + * `DESCRIPTION`(描述) + * `EXAMPLES`(例子) + * `DIAGNOSTICS`(诊断) + * `FILES`(文件) + * `LIMITS`(限制) + * `PORTABILITY`(可移植性) + * `SEE ALSO`(另见) + * `HISTORY`(历史) + *  WARNING`(警告)或 `BUGS`(错误) + * `NOTES`(注意事项) + +`NAME` - 在这个标题下是命令的名称和命令的简要描述。 + +`SYNOPSIS` - 显示该命令的使用方法。例如,这里是 `cal` 命令的概要: + +``` +cal [Month] [Year] +``` + +概要以命令的名称开始,后面是选项列表。概要采用命令行的一般形式;它显示了你可以输入的内容和参数的顺序。方括号中的参数(`[]`)是可选的;你可以不输入这些参数,命令仍然可以正常工作。不在括号内的项目必须使用。 + +请注意,方括号只是为了便于阅读。当你输入命令时,不应该输入它们。 + +`DESCRIPTION` - 描述该命令或工具的作用以及如何使用它。这一节通常以对概要的解释开始,并说明如果你省略任何一个可选参数会发生什么。对于长的或复杂的命令,这一节可能会被细分。 + +`EXAMPLES ` - 一些手册页提供了如何使用命令或工具的例子。如果有这一节,手册页会尝试给出一些简单的使用例子,以及更复杂的例子来说明如何完成复杂的任务。 + +`DIAGNOSTICS` - 本节列出了由命令或工具返回的状态或错误信息。通常不显示不言自明的错误和状态信息。通常会列出可能难以理解的信息。 + +`FILES` - 本节包含了 UNIX 用来运行这个特定命令的补充文件的列表。这里,“补充文件”是指没有在命令行中指定的文件。例如,如果你在看 `passwd` 命令的手册,你可能会发现 `/etc/passwd` 列在这一节中,因为 UNIX 是在这里存储密码信息。 + +`LIMITS` - 本节描述了一个工具的限制。操作系统和硬件的限制通常不会被列出,因为它们不在工具的控制范围内。 + +`PORTABILITY` - 列出其他可以使用该工具的系统,以及该工具的其他版本可能有什么不同。 + +`SEE ALSO` - 列出包含相关信息的相关手册页。 + +`HISTORY` - 提供命令的简要历史,如它第一次出现的时间。 + +`WARNING` - 如果有这个部分,它包含了对用户的重要建议。 + +`NOTES` - 不像警告那样严重,但也是重要的信息。 + +同样,并不是所有的手册都使用上面列出的确切标题,但它们足够接近,可以遵循。 + +### 手册的节 + +整个 Linux 手册集合的手册页传统上被划分为有编号的节: + + **第 1 节**:Shell 命令和应用程序 + **第 2 节**:基本内核服务 - 系统调用和错误代码 + **第 3 节**:为程序员提供的库信息 + **第 4 节**:网络服务 - 如果安装了 TCP/IP 或 NFS 设备驱动和网络协议 + **第 5 节**:文件格式 - 例如:显示 `tar` 存档的样子 + **第 6 节**:游戏 + **第 7 节**:杂项文件和文档 + **第 8 节**:系统管理和维护命令 + **第 9 节**:不知名的内核规格和接口 + +将手册页分成这些组,可以使搜索更有效率。在我工作的地方,我有时会做一些编程工作,所以我花了一点时间看第 3 节的手册页。我也做一些网络方面的工作,所以我也知道要涉足网络部分。作为几个实验性机器的系统管理员,我在第 8 节花了很多时间。 + +将手册网归入特定的节(章节),使搜索信息更加容易 —— 无论是对需要搜索的人,还是对进行搜索的机器。 + +你可以通过名称旁边的数字来判断哪个手册页属于哪个部分。例如,如果你正在看 `ls` 的手册页,而页面的最上面写着。 `LS(1)`,那么你正在浏览第 1 节中的 `ls` 页面,该节包含关于 shell 命令和应用程序的页面。 + +下面是另一个例子。如果你在看 `passwd` 的手册页,页面的顶部显示: `PASSWD(1)`,说明你正在阅读第 1 节中描述 `passwd` 命令如何更改用户账户密码的手册页。如果你看到 `PASSWD(5)`,那么你正在阅读关于密码文件和它是如何组成的的手册页。 + +![][5] + +`passwd` 恰好是两个不同的东西:一个是命令的名称,一个是文件的名称。同样,第 1 节描述了命令,而第 5 节涉及文件格式。 + +括号中的数字是重要的线索 —— 这个数字告诉你正在阅读的页面来自哪一节。 + +### 搜索一个特定的节 + +基本命令: + +``` +man -a name +``` + +将在每一节中搜索由 `name` 标识的手册页,按数字顺序逐一显示。要把搜索限制在一个特定的部分,请在 `man` 命令中使用一个参数,像这样: + +``` +man 1 name +``` + +这个命令将只在手册页的第 1 节中搜索 `name`。使用我们前面的 `passwd` 例子,这意味着我们可以保持搜索的针对性。如果我想阅读 `passwd` 命令的手册页,我可以在终端输入以下内容: + +``` +man 1 passwd +``` + +`man` 工具将只在第 1 节中搜索 `passwd` 并显示它。它不会在任何其他节中寻找 `passwd`。 + +这个命令的另一种方法是输入: `man passwd.1`。 + +### 使用 man -k 来搜索包含某个关键词的所有手册页 + +如果你想获得包含某个关键词的手册页的列表,`man` 命令中的 `-k` 选项(通常称为标志或开关)可以派上用场。例如,如果你想看一个关于 `ftp` 的手册列表,你可以通过输入以下内容得到这个列表: + +``` +man -k ftp +``` + +在接下来的列表中,你可以选择一个特定的手册页来阅读: + +![man k example][6] + +在某些系统上,在 `man -k` 工作之前,系统管理员需要运行一个叫做 `catman` 的工具。 + +### 使用 whatis 和 whereis 命令来了解手册的各个节 + +有两个有趣的工具可以帮助你搜索信息:`whatis`和 `whereis`。 + +#### whatis + +有的时候,我们完全可以得到我们需要的信息。我们需要的信息有很大的机会是可以找到的 —— 找到它可能是一个小问题。 + +例如,如果我想看关于 `passwd` 文件的手册页,我在终端上输入: + +``` +man passwd +``` + +我就会看到关于 `passwd` 命令所有信息的手册页,但没有关于 `passwd` 文件的内容。我知道 `passwd` 是一个命令,也有一个 `passwd` 文件,但有时,我可能会忘记这一点。这时我才意识到,文件结构在手册页中的不同节,所以我输入了: + +``` +man 4 passwd +``` + +我得到这样的答复: + +``` +No manual entry for passwd in section 4 +See 'man 7 undocumented' for help when manual pages are not available. +``` + +又是一次健忘的失误。文件结构在 System V UNIX 页面的第 4 节中。几年前,当我建立文件时,我经常使用 `man 4 ...`;这仍然是我的一个习惯。那么它在 Linux 手册中的什么地方呢? + +现在是时候调用 `whatis` 来纠正我了。为了做到这一点,我在我的终端中输入以下内容: + +``` +whatis passwd +``` + +然后我看到以下内容: + +``` +passwd (1) - change user password +passwd (1ssl) - compute password hashes +passwd (5) - the password file +``` + +啊!`passwd` 文件的页面在第 5 节。现在没问题了,可以访问我想要的信息了: + +``` +man 5 passwd +``` + +然后我被带到了有我需要的信息的手册页。 + +`whatis` 是一个方便的工具,可以用简短的一句话告诉你一个命令的作用。想象一下,你想知道 `cal` 是做什么的,而不想查看手册页。只要在命令提示符下键入以下内容。 + +``` +whatis cal +``` + +你会看到这样的回应: + +``` +cal (1) - displays a calendar and the date of Easter +``` + +现在你知道了 `whatis` 命令,我可以告诉你一个秘密 —— 有一个 `man` 命令的等价物。为了得到这个,我们使用 `-f` 开关:`man -f ...`。 + +试试吧。在终端提示下输入 `whatis cal`。执行后就输入:`man -f cal`。两个命令的输出将是相同的: + +![whatis cal and man f cal outputs are the same][7] + +#### whereis + +`whereis` 命令的名字就说明了这一点 —— 它告诉你一个程序在文件系统中的位置。它也会告诉你手册页的存放位置。再以 `cal` 为例,我在提示符下输入以下内容: + +``` +whereis cal +``` + +我将看到这个: + +![whereis cal output][8] + +仔细看一下这个回答。答案只在一行里,但它告诉我两件事: + +- `/usr/bin/cal` 是 `cal` 程序所在的地方,以及 +- `/usr/share/man/man1/cal.1.gz` 是手册页所在的地方(我也知道手册页是被压缩的,但不用担心 —— `man` 命令知道如何即时解压)。 + +`whereis` 依赖于 `PATH` 环境变量;它只能告诉你文件在哪里,如果它们在你的 `PATH` 环境变量中。 + +你可能想知道是否有一个与 `whereis` 相当的 `man` 命令。没有一个命令可以告诉你可执行文件的位置,但有一个开关可以告诉你手册页的位置。在这个例子中使用 `date` 命令,如果我们输入: + +``` +whereis date +``` + +在终端提示符下,我们会看到: + +![whereis date output][9] + +我们看到 `date` 程序在 `/usr/bin/` 目录下,其手册页的名称和位置是:`/usr/share/man/man1/date.1.gz`。 + +我们可以让 `man` 像 `whereis` 一样行事,最接近的方法是使用 `-w` 开关。我们不会得到程序的位置,但我们至少可以得到手册页的位置,像这样: + +``` +man -w date +``` + +我们将看到这样的返回: + +![][10] + +你知道了 `whatis` 和 `whereis`,以及让 `man` 命令做同样(或接近)事情的方法。我展示了这两种方法,有几个不同的原因。 + +多年来,我使用 `whatis` 和 `whereis`,因为它们在我的培训手册中。直到最近我才了解到 `man -f ...` 和 `man -w ...`。我确信我看了几百次 `man` 的手册页,但我从未注意到 `-f` 和 `-w` 开关。我总是在看手册页的其他东西(例如:`man -k ...`)。我只专注于我需要找到的东西,而忽略了其他的东西。一旦我找到了我需要的信息,我就会离开这个页面,去完成工作,而不去注意这个命令所提供的其他一些宝贝。 + +这没关系,因为这部分就是手册页的作用:帮助你完成工作。 + +直到最近我向别人展示如何使用手册页时,我才花时间去阅读 —— “看看还有什么可能” —— 我们才真正注意到关于 `man` 命令的 `-f` 和 `-w` 标记可以做什么的信息。 + +不管你使用 Linux 多久了,或者多么有经验,总有一些新东西需要学习。 + +手册页会告诉你在完成某项任务时可能需要知道的东西 —— 但它们也有很多内容 —— 足以让你看起来像个魔术师,但前提是你要花时间去读。 + +### 结论 + +如果你花一些时间和精力在手册页上,你将会取得胜利。你对手册页的熟练程度,将在你掌握 Linux 的过程中发挥巨大作用。 + +-------------------------------------------------------------------------------- + +via: https://itsfoss.com/linux-man-page-guide/ + +作者:[Bill Dyer][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://itsfoss.com/author/bill/ +[b]: https://github.com/lujun9972 +[1]: https://www.britannica.com/biography/Aristotle +[2]: https://i1.wp.com/itsfoss.com/wp-content/uploads/2021/06/man-page-example-800x527.png?resize=800%2C527&ssl=1 +[3]: https://i0.wp.com/itsfoss.com/wp-content/uploads/2021/05/man_man.png?resize=800%2C455&ssl=1 +[4]: https://i1.wp.com/itsfoss.com/wp-content/uploads/2021/06/man-page-example-1.png?resize=800%2C527&ssl=1 +[5]: https://i1.wp.com/itsfoss.com/wp-content/uploads/2021/06/man-page-passwd-command.png?resize=1026%2C676&ssl=1 +[6]: https://i0.wp.com/itsfoss.com/wp-content/uploads/2021/05/man-k_example.png?resize=800%2C200&ssl=1 +[7]: https://i1.wp.com/itsfoss.com/wp-content/uploads/2021/05/whatis_cal_man-f_cal.png?resize=800%2C135&ssl=1 +[8]: https://i0.wp.com/itsfoss.com/wp-content/uploads/2021/05/whereis_cal.png?resize=800%2C100&ssl=1 +[9]: https://i0.wp.com/itsfoss.com/wp-content/uploads/2021/05/whereis_date.png?resize=800%2C100&ssl=1 +[10]: https://i2.wp.com/itsfoss.com/wp-content/uploads/2021/05/man-w_date-1.png?resize=800%2C100&ssl=1 diff --git a/published/202106/20210613 How Free - Open Source Software Can Save Online Privacy.md b/published/202106/20210613 How Free - Open Source Software Can Save Online Privacy.md new file mode 100644 index 0000000000..b1334ad866 --- /dev/null +++ b/published/202106/20210613 How Free - Open Source Software Can Save Online Privacy.md @@ -0,0 +1,147 @@ +[#]: subject: (How Free & Open Source Software Can Save Online Privacy) +[#]: via: (https://news.itsfoss.com/save-privacy-with-foss/) +[#]: author: (Team It's FOSS https://news.itsfoss.com/author/team/) +[#]: collector: (lujun9972) +[#]: translator: (zz-air) +[#]: reviewer: (wxy) +[#]: publisher: (wxy) +[#]: url: (https://linux.cn/article-13512-1.html) + +自由/开源软件如何保护在线隐私 +====== + +![](https://i2.wp.com/news.itsfoss.com/wp-content/uploads/2021/06/online-privacy.png?w=1200&ssl=1) + +_多年来,我一直使用科技巨头提供的服务。大部分都是免费的,但是是以牺牲我的隐私为代价的。但那些日子已经过去了,现在我浏览、聊天、工作,没有任何人能跟踪、变现和审查我的数据。多亏了自由/开源软件。_ + +### 我开始担心大型科技公司了 + +![][1] + +我一直觉得机器应该按照我的意愿行事,而不是反过来。这就是为什么谷歌的 Android 操作系统在 2008 年首次上市时就立刻吸引了我。在当时,谷歌的开源方式确实令人耳目一新。我花了几个小时定制了我的 HTC Hero 手机。我对它是不是比我朋友的 iPhone 或塞班设备更丑并不在意。我的新玩意具有无限的通用性。 + +一跃十年,谷歌已经成为了科技巨头,使 iOS 相形见绌并且淘汰了塞班操作系统。如今,这个公司占据了 90% 以上的搜索流量,并主导着浏览器市场。这种惊人的增长是有代价的,谷歌删除了“不作恶”条款就说明了这一点。这家搜索巨头目前正陷入官司之中,比如关于 [数据收集和追踪不当行为][2] 的案件。研究人员还在谷歌的联系人追踪应用程序中发现了 [隐私缺陷][3]。更重要的是,这家科技巨头宣布了一个颇具争议的 [可以追踪用户浏览行为][4] 的新算法,从而更好地提供广告服务。 + +现在,我不想把责任推给谷歌。亚马逊刚刚建立了美国历史上最大的民用 [监控网络][5] 。它让警方可以在未经许可的情况下使用数百万个家庭监控摄像头。于此同时,欧洲对亚马逊遵守 [隐私规定][6] 的情况进行了调查。微软也是如此。它也为顺带着促进 [工作场所监控][7] 功能而道歉。 + +有人可能认为,人们至少可以指望苹果来保护他们的隐私。这家科技巨头最近让他们选择知道应用程序是否会追踪他们的行为。事实证明,[只有 5%][8] 的美国用户选择接受这种新的应用追踪透明度。与此同时,该公司从谷歌这样的数据经纪商的业务中获得了 [巨大的利益][9]。更别提《堡垒之夜》开发商 Epic Games 和苹果之间的 [反垄断审判][10] ,后者声称要保护其应用商店的隐私。当然,还有 Facebook。该公司的隐私不当行为在参议院就 [剑桥分析公司][11] 丑闻举行的听证会上达到了高潮,失去了用户仅存的信任。 + +尽管如此 —— 或者因为 —— 这些有问题的做法,这些公司的总价值在 2021 年 3 月超过了 [7.5 万亿美元][12]。“科技巨头”们 现在超过了德国和英国国内生产总值的总和! + +### 为什么隐私很重要 + +![][13] + +我们都在使用大科技公司的服务。我们是 [监控资本主义][14]Surveillance Capitalism 的一部分,这是哈佛大学教授 Shoshana Zuboff 创造的一个术语,在 Cory Doctorow 的 [新书][15]《监控资本主义》里也讨论了它。这是一个以技术垄断为中心的经济体系,通过收集个人数据来获取利润最大化。这一制度威胁到民主的核心,因为它导致了大规模监视,扰乱了选举程序,推动了思想的一致性和审查制度。 + +监视资本主义的基础是对我们生活的侵犯,令人深感不安。我们往往忘记隐私是一项基本权利。它被联合国人权理事会UN Human Rights Council、《公民权利与政治权利国际公约International Covenant on Civil and Political Rights》和一些条约所规定。我认为我们都能体会到:在我们的生活中有很多方面我们想要保持隐私,即使没有错误的行为。无论是为了自由地表达自己,探索自己的个性,而不被他人评判。还是为了保护我们不受监视、审查和操纵。这就是窗帘被发明的原因。还有银行保密、律师-客户特权,通信保密,投票保密,告解室保密或医疗保密。 + +解决网络隐私问题是一个广泛问题,它需要对我们的法律体系和社会习俗的全面改变。对技术垄断的监管是这个十年的主要挑战之一。最近科技巨头和政府之间的对峙就说明了这一点:[澳大利亚 vs. Facebook][16]、 [中国 vs. 腾讯][17]、 [印度 vs. WhatsApp][18]、[欧盟 vs. Facebook][19] 或者是 [美国 vs. 科技巨头][20]。多年来,数字权利组织和软件基金会一直在倡导更好的隐私法律、用户权利和创新自由,如:电子前沿基金会Electronic Frontier Foundation自由软件基金会Free Software Foundation新闻自由基金会Freedom of the Press Foundation隐私国际Privacy International开放权利组织Open Rights Group欧洲数字权利European Digital Rights。 + +### 这和自由/开源软件有什么关系? + +![][21] + +自 1983 年成立以来,[自由软件运动][22]Free Software movement 已经成为一个相当多样化的社区。自由和开源软件通常被称为 FOSS、FLOSS、Libre Software 或 Free Software。 它包括一系列许可证,授权给用户 [使用、学习、分享并提高][23] 这个软件的权力。以及 [维修][24] 的权利。 自由软件Free Software的“自由Free”是指 “[言论自由][25]”的“自由”,有时也指 “免费啤酒”的“免费”。因此,自由/开源软件(FOSS)不仅仅是技术。它是关于社会、政治和经济解放的。 + +几年前,一场隐私争议震动了自由软件社区。Ubuntu 12.10(各种不同的 GHU/Linux 风格之一)开始在人们的电脑上建立互联网连接进行本地搜索。它为亚马逊提供广告服务,并与 Facebook 或 Twitter 共享私人数据。遭到了 [剧烈反弹][26]。几年后, Canonical(Ubuntu 背后的公司)最终取消了在线搜索和亚马逊 Web 应用。最近 [Audacity 闹剧][27] 是自由/开源软件如何保护隐私的另一个例子。新的项目管理层决定将谷歌的 Analytics 和 Yandex 添加到音频软件中,但由于公众的强烈抗议,最终放弃了这一计划。 + +尽管自由软件有很多优点,但它也不能免于批评。一种说法是自由/开源软件项目经常被放弃。然而最近在 [实证软件工程和测量会议][28] 上提出的一项研究表明,情况并非如此:在 1932 个流行的开源项目中,有 7%(128 个项目)在被忽视后由新的开发人员接管,使烂尾率降低到不到 10%(187 个项目)。 + +另一个常见的批评是自由/开源软件通过公布代码暴露了潜在的安全漏洞。另一方面,将源代码保密 [不一定会提高安全性][29]。认为封闭源代码要比自由/开源软件安全得多的观点,却忽略了一个事实,即专有堆栈越来越多地构建在 [开放源代码之上][30]。自由软件也倾向于去中心化,这有助于增强抵御监视、单点故障或大规模数据泄露。所以可以肯定的是,自由/开源软件并不能避免安全漏洞。但专有的解决方案也是如此,正如来自 Facebook、Linkedin 和 Clubhouse 的最新 [10 亿人的数据泄露][31] 或者对 SolarWind 和 Colonial 管道公司的大规模 [安全攻击][32] 所说明的那样。 + +总之,自由软件在促进网上隐私方面发挥了重要作用。近四十年来,自由/开源软件一直鼓励开发人员审计代码、修复问题并确保幕后没有任何可疑的事情发生。 + +### 使用自由/开源软件实现在线隐私的七个步骤 + +![][33] + +在等待更好的隐私法律出台的同时,还有很多事情可以让你的设备更隐私。以下是用尊重隐私、自由/开源软件取代大型科技公司的七个步骤。 根据你的 [威胁模型][34],你可能想首先考虑步骤 1 到步骤 4,因为它们已经提供了一个合理的隐私水平。如果你有一些技术技能,想要更进一步,看看步骤 5 到步骤 7。 + + 1. **[参与到隐私保护中来][35]**。关于在线隐私、数据利用、过滤泡沫、监控和审查,还有很多值得我们讨论和学习的地方。参与进来,传播信息。 + 2. **[选择一个安全和隐私的浏览器][36]**。切换到 Firefox。阻止追踪器、cookie 和广告。使用尊重隐私的搜索引擎。可能要用 Tor 或 VPN 加密你的通信。 + 3. **[保持交流的私密性][37]**。使用端到端加密保护你的电子邮件、消息和电话。抛弃传统的社交媒体,探索 fediversity ,这是一个由各种在线服务组成的联合家庭。 + 4. **[保护你的数据][38]**。使用长且独特的密码。为你的每个账户和设备选择一个不同的密码。将它们安全地保存在加密的密码管理器中。考虑使用双因素身份验证。创建一个常规备份例程。并对敏感数据进行加密。 + 5. **[解绑你的电脑][39]**。切换到 GNU/Linux ,并首选自由和开源的应用程序。根据你的需要,选择一个对初学者友好的发行版,如 Linux Mint 或 Ubuntu;对于更有经验的用户,选择 Debian、Manjaro、openSUSE、Fedora 或 Gentoo Linux。对于隐私爱好者,可以看看 Qubes OS、Whonix 或 Tails。 + 6. **[解绑你的手机][40]**。切换到一个定制的移动操作系统,如 LineageOS、CalyxOS、GrapheneOS 或 /e/。首选社区维护的应用商店提供的自由及开源应用。 + 7. **[解绑你的云][41]**。选择尊重隐私的云服务商。或设置你自己的安全服务器和自托管服务,例如云存储、图库、任务和联系人管理,或媒体流。 + +### 结束 + +![][42] + +面对在线隐私没有一键式解决方案。用自由及开源软件取代大型科技公司是一个过程。有些改动很简单,比如安装 Firefox 或 Signal。其他方法需要更多的时间和技能。但它们绝对值得。你并不孤单,你可以依靠一个很棒的社区的支持。所以,请允许我引用《华盛顿邮报》在线专栏的 [Geoffrey A. Fowler][43] 的话作为总结: “_隐私没有消亡,但你必须足够愤怒才能要求它_”。 + +* * * + +### 关于作者 + +![][48] + +_Georg Jerska 是一个对保护公民隐私特别感兴趣的开源爱好者。他和他的小团队运营着 [GoFOSS][44],这是一个关于如何用尊重隐私的自由和开源软件取代大型科技公司的全面指南。_ + +_[开源][46] 插图 [Katerina Limpitsouni][47]。_ + +_所表达的观点只是作者的观点,并不一定反应我们的官方政策或立场。_ + +-------------------------------------------------------------------------------- + +via: https://news.itsfoss.com/save-privacy-with-foss/ + +作者:[Team It's FOSS][a] +选题:[lujun9972][b] +译者:[zz-air](https://github.com/zz-air) +校对:[wxy](https://github.com/wxy) + +本文由 [LCTT](https://github.com/LCTT/TranslateProject) 原创编译,[Linux中国](https://linux.cn/) 荣誉推出 + +[a]: https://news.itsfoss.com/author/team/ +[b]: https://github.com/lujun9972 +[1]: https://i2.wp.com/news.itsfoss.com/wp-content/uploads/2021/06/big_tech.png?resize=706%2C636&ssl=1 +[2]: https://www.gizmodo.com.au/2021/05/google-location-services-lawsuit +[3]: https://blog.appcensus.io/2021/04/27/why-google-should-stop-logging-contact-tracing-data +[4]: https://news.itsfoss.com/google-floc +[5]: https://www.theguardian.com/commentisfree/2021/may/18/amazon-ring-largest-civilian-surveillance-network-us +[6]: https://edps.europa.eu/press-publications/press-news/press-releases/2021/edps-opens-two-investigations-following-schrems_en +[7]: https://www.theguardian.com/technology/2020/dec/02/microsoft-apologises-productivity-score-critics-derided-workplace-surveillance +[8]: https://www.flurry.com/blog/ios-14-5-opt-in-rate-att-restricted-app-tracking-transparency-worldwide-us-daily-latest-update +[9]: https://www.nytimes.com/2020/10/25/technology/apple-google-search-antitrust.html +[10]: https://www.nytimes.com/2021/05/25/business/dealbook/apple-epic-case.html +[11]: https://en.wikipedia.org/wiki/Cambridge_Analytica +[12]: https://en.wikipedia.org/wiki/List_of_public_corporations_by_market_capitalization#2021 +[13]: https://i1.wp.com/news.itsfoss.com/wp-content/uploads/2021/06/privacy.png?resize=706%2C584&ssl=1 +[14]: https://en.wikipedia.org/wiki/Surveillance_capitalism +[15]: https://www.goodreads.com/book/show/55134785-how-to-destroy-surveillance-capitalism +[16]: https://www.bbc.com/news/world-australia-56163550 +[17]: https://www.nytimes.com/2021/06/02/technology/china-tencent-monopoly.html +[18]: https://www.theguardian.com/world/2021/may/26/whatsapp-sues-indian-government-over-mass-surveillance-internet-laws +[19]: https://nypost.com/2021/05/26/eu-reportedly-set-to-open-formal-antitrust-probe-into-facebook +[20]: https://www.nytimes.com/interactive/2020/10/06/technology/house-antitrust-report-big-tech.html +[21]: https://i1.wp.com/news.itsfoss.com/wp-content/uploads/2021/06/foss.png?resize=706%2C631&ssl=1 +[22]: https://itsfoss.com/what-is-foss +[23]: https://fsfe.org/freesoftware/freesoftware.en.html +[24]: https://framatube.org/videos/watch/99069c5c-5a00-489e-97cb-fd5cc76de77c +[25]: https://www.eff.org/deeplinks/2015/04/remembering-case-established-code-speech +[26]: https://itsfoss.com/canonical-targets-website-crictical-ubuntu-privacy +[27]: https://github.com/audacity/audacity/pull/835 +[28]: https://arxiv.org/abs/1906.08058 +[29]: https://www.schneier.com/crypto-gram/archives/2002/0515.html#1 +[30]: https://www.bcg.com/publications/2021/open-source-software-strategy-benefits +[31]: https://www.politico.eu/article/how-to-leak-data-and-get-away-with-it +[32]: https://theconversation.com/the-colonial-pipeline-ransomware-attack-and-the-solarwinds-hack-were-all-but-inevitable-why-national-cyber-defense-is-a-wicked-problem-160661 +[33]: https://i1.wp.com/news.itsfoss.com/wp-content/uploads/2021/06/steps.png?w=1054&ssl=1 +[34]: https://www.eff.org/files/2015/11/24/3mod_threat-modeling-ssd_9-3-15.pdf +[35]: https://www.gofoss.today/nothing-to-hide +[36]: https://www.gofoss.today/intro-browse-freely +[37]: https://www.gofoss.today/intro-speak-freely +[38]: https://www.gofoss.today/intro-store-safely +[39]: https://www.gofoss.today/intro-free-your-computer +[40]: https://www.gofoss.today/intro-free-your-phone +[41]: https://www.gofoss.today/intro-free-your-cloud +[42]: https://i2.wp.com/news.itsfoss.com/wp-content/uploads/2021/06/gofoss.png?resize=300%2C300&ssl=1 +[43]: https://www.washingtonpost.com/technology/2019/12/31/how-we-survive-surveillance-apocalypse +[44]: https://gofoss.today/ +[45]: https://gofoss.today +[46]: https://undraw.co/license +[47]: https://undraw.co +[48]: https://i1.wp.com/news.itsfoss.com/wp-content/uploads/2021/06/georg.png?resize=300%2C300&ssl=1 \ No newline at end of file diff --git a/published/202106/20210615 Build a static website with Eleventy.md b/published/202106/20210615 Build a static website with Eleventy.md new file mode 100644 index 0000000000..2a78a7b3cb --- /dev/null +++ b/published/202106/20210615 Build a static website with Eleventy.md @@ -0,0 +1,135 @@ +[#]: subject: (Build a static website with Eleventy) +[#]: via: (https://opensource.com/article/21/6/static-site-builder) +[#]: author: (Nwokocha Wisdom https://opensource.com/users/wise4rmgod) +[#]: collector: (lujun9972) +[#]: translator: (geekpi) +[#]: reviewer: (wxy) +[#]: publisher: (wxy) +[#]: url: (https://linux.cn/article-13513-1.html) + +用 Eleventy 建立一个静态网站 +====== + +> Eleventy 是一个基于 JavaScript 的 Jekyll 和 Hugo 的替代品,用于构建静态网站。 + +![](https://img.linux.net.cn/data/attachment/album/202106/23/160000epjn313s1t5ja8wj.jpg) + +静态网站生成器是一种基于原始数据和一组模板生成完整的静态 HTML 网站的工具。它可以自动完成单个 HTML 页面的编码任务,并让这些页面准备好为用户服务。由于 HTML 页面是预先建立的,它们在用户的浏览器中加载得非常快。 + +静态网站对文档也很友好,因为静态网站很容易扩展,而且它们是生成、维护和部署项目文档的一种简单方法。由于这些原因,企业经常使用它们来记录应用编程接口 (API)、数据库模式和其他信息。文档是软件开发、设计和其他方面技术的一个重要组成部分。所有的代码库都需要某种形式的文档,选择范围从简单的 README 到完整的文档。 + +### Eleventy: 一个静态网站生成器 + +[Eleventy][2](11ty)是一个简单的静态网站生成器,是 [Jekyll][3] 和 [Hugo][4] 的替代品。它是用 JavaScript 编写的,它将一个(不同类型的)模板目录转化为 HTML。它也是开源的,在 MIT 许可下发布。 + +Eleventy 可以与 HTML、Markdown、Liquid、Nunjucks、Handlebars、Mustache、EJS、Haml、Pug 和 JavaScript Template Literals 协同工作。 + +它的特点包括: + + * 易于设置 + * 支持多种模板语言(如 Nunjucks、HTML、JavaScript、Markdown、Liquid) + * 可定制 + * 基于 JavaScript,这是许多网络开发者所熟悉的,新用户也容易学习 + +### 安装 Eleventy + +Eleventy 需要 Node.js。在 Linux 上,你可以使用你的包管理器安装 Node.js: + +``` +$ sudo dnf install nodejs +``` + +如果你的包管理器没有 Node.js,或者你不在 Linux 上,你可以从 Node.js 网站[安装它][5]。 + +Node.js 安装完毕后,就用它来安装 Eleventy: + +``` +$ npm install -g @11ty/eleventy +``` + +这就完成了! + +### 为你的文档建立一个静态网站 + +现在你可以开始使用 Eleventy 来建立你的静态文档网站。以下是需要遵循的步骤。 + +#### 1、创建一个 package.json 文件 + +要将 Eleventy 安装到你的项目中,你需要一个 `package.json` 文件: + +``` +$ npm init -y +``` + +#### 2、将 Eleventy 安装到 package.json 中 + +安装 Eleventy 并保存到你的项目的 `package.json` 中。运行: + +``` +$ npm install-save-dev @11ty/eleventy +``` + +#### 3、运行 Eleventy + +使用 `npx` 命令来运行你本地项目的 Eleventy 版本。在你确认安装完成后,尝试运行 Eleventy: + +``` +$ npx @11ty/eleventy +``` + +#### 4、创建一些模板 + +现在运行两个命令来创建两个新的模板文件(一个 HTML 和一个 Markdown 文件): + +``` +$ cat << EOF >> index.html + + +Page title + +

Hello world

+ +EOF +$ echo '# Page header' > index.md +``` + +这就把当前目录或子目录中的任何内容模板编译到输出文件夹中(默认为 `_site`)。 + +运行 `eleventy --serve` 来启动一个开发网络服务器。 + +``` +$ npx @11ty/eleventy-serve +``` + +在你的网络浏览器中打开 `http://localhost:8080/README/`,看你的 Eleventy 输出。 + +然后把 `_site` 中的文件上传到你的 Web 服务器,发布你的网站给世界看。 + +### 尝试 Eleventy + +Eleventy 是一个静态网站生成器,它易于使用,有模板和主题。如果你已经在你的开发流程中使用 Node.js,Eleventy 可能比 Jekyll 或 Hugo 更自然。它能快速提供很好的结果,并使你免于复杂的网站设计和维护。要了解更多关于使用 Eleventy 的信息,请仔细阅读它的[文档][6]。 + +* * * + +_本文基于 [为开源项目建立技术文档静态网站][7],首次发布在 Nwokocha Wisdom Maduabuchi 的 Medium 上,经授权转载。_ + +-------------------------------------------------------------------------------- + +via: https://opensource.com/article/21/6/static-site-builder + +作者:[Nwokocha Wisdom][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/wise4rmgod +[b]: https://github.com/lujun9972 +[1]: https://opensource.com/sites/default/files/styles/image-full-size/public/lead-images/computer_desk_home_laptop_browser.png?itok=Y3UVpY0l (Digital images of a computer desktop) +[2]: https://www.11ty.dev/ +[3]: https://opensource.com/article/17/4/getting-started-jekyll +[4]: https://opensource.com/article/18/3/start-blog-30-minutes-hugo +[5]: https://nodejs.org/en/ +[6]: https://www.11ty.dev/docs/getting-started/ +[7]: https://wise4rmgodadmob.medium.com/building-a-technical-documentation-static-site-for-open-source-projects-7af4e73d77f0 diff --git a/published/202106/20210615 Try this new open source tool for data analytics.md b/published/202106/20210615 Try this new open source tool for data analytics.md new file mode 100644 index 0000000000..dbc5fc37b3 --- /dev/null +++ b/published/202106/20210615 Try this new open source tool for data analytics.md @@ -0,0 +1,77 @@ +[#]: subject: (Try this new open source tool for data analytics) +[#]: via: (https://opensource.com/article/21/6/cubejs) +[#]: author: (Ray Paik https://opensource.com/users/rpaik) +[#]: collector: (lujun9972) +[#]: translator: (geekpi) +[#]: reviewer: (wxy) +[#]: publisher: (wxy) +[#]: url: (https://linux.cn/article-13517-1.html) + +Cube.js:试试这个新的数据分析开源工具 +====== + +> Cube.js 是一个开源的分析平台,可以作为数据源和应用之间的中间层。 + +![](https://img.linux.net.cn/data/attachment/album/202106/24/114907z53fpzv6szv936vj.jpg) + +数据分析是一个时髦的领域,有许多解决方案可供选择。其中之一是 [Cube.js][2],这是一个开源的分析平台。你可以把 Cube.js 看作是你的数据源和应用之间的一个中间层。 + +如下图所示,Cube.js 支持无服务器数据仓库和大多数现代关系型数据库管理系统 (RDBMS)。你可以使用任何用于数据可视化的 JavaScript 前端库,而 Cube.js 将负责其他工作,包括访问控制、性能、并发性等。 + +![Cube.js architecture][3] + +### 主要优点 + +当我向我们的社区成员询问 Cube.js 的主要优点时,他们经常提到: + + * **它的抽象层**:配置 Cube.js 后,人们说他们不再需要担心性能优化、资源管理、SQL 专业知识等问题。许多人把 Cube.js 称为 “黑盒”,因为它的抽象层帮助他们专注于理解数据,而不是实施细节。 + * **易于定制**:由于 Cube.js 是可视化的,它很容易与前端框架集成,建立看起来像用户自己平台的解决方案。大多数商业平台(如 Looker、Tableau 等)需要更多的定制工作来与他们的基础设施整合。许多用户说,定制的便利性与抽象层相结合,使他们能够减少数据分析平台的开发时间。 + * **社区支持**:在开始使用 Cube.js 时,人们通常会从社区成员那里得到帮助(特别是在我们的 [Slack][4]),许多人提到社区支持是一个关键的入门资源。 + +访问 [用户故事页面][5],阅读更多关于人们使用 Cube.js 的经验以及他们如何使用它。 + +### 开始使用 + +如果你想了解 Cube.js: + + * 进入我们的 [文档页面][6],点击**开始**,并按照指示在你的笔记本电脑或工作站上启动和运行 Cube.js。 + * 当你进入 [Developer Playground][7],你将能够生成数据模式,执行查询,并建立仪表盘,以看到 Cube.js 的运行。 + +在你启动和运行 Cube.js 之后,这里有一些有用的资源: + + * [文档][6]:我们把大量的精力放在我们的文档上,因为它是开源社区的重要资源。我们还在我们的文档页面和 YouTube 频道的 [入门播放列表][8] 中添加了视频剪辑。 + * [Discourse][9]:Cube.js 论坛是最近增加的,社区成员可以在这里分享他们的使用案例、技巧和窍门等,这样我们就可以建立一个社区知识库。 + * [GitHub][10]: 你可以在这里找到 Cube.js 的代码,社区成员可以通过 [问题页面][11] 提交错误或功能请求。我们还在 GitHub 上发布了我们的 [季度路线图][12],以便每个人都能看到我们正在进行的工作。 + * [每月社区电话会议][13]:我们在每个月的第二个星期三举行电话会议,讨论社区更新,展示功能演示,并邀请社区成员分享他们的使用案例。你可以在 [社区电话会议页面][13] 上找到电话会议的日程,你也可以在我们 YouTube 频道的 [社区电话会议播放列表][14] 上找到过去的电话会议录音。 + +就像任何好的开源项目一样,Cube.js 有许多软件贡献者。如果你想查看社区的拉取请求(PR),请搜索带有 `pr:community` 标签的 PR。如果你想寻找你可以回答的问题,请搜索带有 `good first issue` 或者 `help wanted` 标签的问题。 + +我希望你试试 Cube.js。如果你有任何问题,请随时在下面留言或在 [Cube.js Slack][4] 上找我! + +-------------------------------------------------------------------------------- + +via: https://opensource.com/article/21/6/cubejs + +作者:[Ray Paik][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/rpaik +[b]: https://github.com/lujun9972 +[1]: https://opensource.com/sites/default/files/styles/image-full-size/public/lead-images/metrics_data_dashboard_system_computer_analytics.png?itok=oxAeIEI- (metrics and data shown on a computer screen) +[2]: https://cube.dev/ +[3]: https://opensource.com/sites/default/files/uploads/cubejs-architecture.png (Cube.js architecture) +[4]: https://slack.cube.dev/ +[5]: https://cube.dev/blog/category/user-stories/ +[6]: https://cube.dev/docs/ +[7]: https://cube.dev/docs/dev-tools/dev-playground +[8]: https://www.youtube.com/playlist?list=PLtdXl_QTQjpaXhVEefh7JCIdtYURoyWo9 +[9]: https://forum.cube.dev/ +[10]: https://github.com/cube-js/cube.js +[11]: https://github.com/cube-js/cube.js/issues +[12]: https://github.com/cube-js/cube.js/projects +[13]: https://cube.dev/community-call/ +[14]: https://www.youtube.com/playlist?list=PLtdXl_QTQjpb1dHZCM09qKTsgvgqjSvc9 diff --git a/published/202106/20210615 With Deskreen, You Can Mirror or Stream Your Linux Computer Screen to Any Device.md b/published/202106/20210615 With Deskreen, You Can Mirror or Stream Your Linux Computer Screen to Any Device.md new file mode 100644 index 0000000000..27c26b9203 --- /dev/null +++ b/published/202106/20210615 With Deskreen, You Can Mirror or Stream Your Linux Computer Screen to Any Device.md @@ -0,0 +1,119 @@ +[#]: subject: (With Deskreen, You Can Mirror or Stream Your Linux Computer Screen to Any Device) +[#]: via: (https://itsfoss.com/deskreen/) +[#]: author: (Ankush Das https://itsfoss.com/author/ankush/) +[#]: collector: (lujun9972) +[#]: translator: (geekpi) +[#]: reviewer: (wxy) +[#]: publisher: (wxy) +[#]: url: (https://linux.cn/article-13507-1.html) + +用 Deskreen 将你的 Linux 屏幕镜像或串流到任何设备上 +====== + +其它平台上的屏幕共享或屏幕镜像应用并不那么好。尽管大多数选项仅适用于 Windows/Mac,而你可能很难找到一个适用于 Linux 的开源解决方案。 + +有了这个应用,你可以与连接到网络的任何设备共享你的屏幕。 + +如果你有多显示器设置,你会意识到拥有多个屏幕的好处。而且,有了 Deskreen,你可以把任何设备变成你的副屏,多么令人激动啊! + +### Deskreen:将任何设备变成你的 Linux 系统的副屏 + +![我把我的 Linux Mint 桌面镜像到我的 Android 手机上][1] + +[Deskreen][2] 是一个自由开源的应用,可以让你使用任何带有 Web 浏览器的设备来作为电脑的副屏。 + +如果你愿意,它还支持多个设备连接。 + +Deskreen 很容易使用,当你的所有设备都连接到同一个 Wi-Fi 网络时,它可以正常工作。 + +让我们来看看它的功能和工作原理。 + +### Deskreen 的功能 + +Deskreen 的功能包括以下要点: + + * 分享整个屏幕的能力 + * 选择一个特定的应用窗口进行串流 + * 翻转模式,将你的屏幕作为提词器使用 + * 支持多种设备 + * 高级视频质量设置 + * 提供端对端加密 + * 最小的系统要求 + * 黑暗模式 + +没有一个冗长的功能列表,但对大多数用户来说应该是足够的。 + +### 如何使用 Deskreen 应用? + +Deskreen 使用分为三个简单的步骤,让我为你强调一下,以便你开始使用: + +首先,当你启动该应用时,它会显示一个二维码和一个 IP 地址,以帮助你用 Web 浏览器连接其他设备,以串流你的屏幕。 + +![][4] + +你可以按你喜欢的方式,在你的辅助设备上的 Web 浏览器的帮助下建立连接。 + +当你扫描二维码或在浏览器的地址栏中输入 IP 地址,你会在 Deskreen 应用上得到一个提示,允许或拒绝连接。除非是你不认识它,否则就允许吧。 + +![][5] + +接下来,你将被要求选择你想要串流的内容(你的整个屏幕或特定的应用窗口): + +![][6] + +你可以选择串流整个屏幕或选择你想串流的窗口。然而,并不是每个应用窗口都能被检测到。 + +在我的快速测试中,我没有检测到 Rocket.Chat 应用窗口,但它似乎能检测到 Slack 窗口、Deskscreen 窗口和终端。 + +![][7] + +你只需要选择源并确认,就可以了。你应该注意到它在你的副屏(手机/桌面)上开始串流。 + +![][8] + +这是它完成后的样子: + +![][9] + +Deskreen 还为你提供了管理连接设备的能力。因此,如果你需要断开任何会话或所有会话的连接,你可以从设置中进行操作。 + +### 在 Linux 中安装 Deskreen + +你会找到一个用于 Linux 机器的 DEB 包和 AppImage 文件。如果你不知道,可以通过我们的 [安装 DEB 包][10] 和 [使用 AppImage 文件][11] 指南来安装它。 + +你可以从 [官方网站][2] 下载它,或者从它的 [GitHub 页面][12]探索更多的信息。 + +- [Deskreen][2] + +### 结束语 + +考虑到它使用 Wi-Fi 网络工作,在串流方面绝对没有问题。这是一种奇妙的方式,可以与别人分享你的屏幕,或者出于任何目的将其串流到第二个设备上。 + +当然,它不能取代你的电脑的第二个显示器的优势,但在一些使用情况下,你可能不需要第二个屏幕。 + +现在,我想问你,你能想到哪些实际应用可以用到 Deskreen? + +-------------------------------------------------------------------------------- + +via: https://itsfoss.com/deskreen/ + +作者:[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://i1.wp.com/itsfoss.com/wp-content/uploads/2021/06/deskreen-app.jpg?resize=800%2C450&ssl=1 +[2]: https://deskreen.com/lang-en +[4]: https://i1.wp.com/itsfoss.com/wp-content/uploads/2021/06/deskreen-connect.png?resize=800%2C559&ssl=1 +[5]: https://i2.wp.com/itsfoss.com/wp-content/uploads/2021/06/deskscreen-connect.png?resize=800%2C553&ssl=1 +[6]: https://i0.wp.com/itsfoss.com/wp-content/uploads/2021/06/deskreen-select.png?resize=800%2C549&ssl=1 +[7]: https://i2.wp.com/itsfoss.com/wp-content/uploads/2021/06/deskreen-app-window.png?resize=800%2C551&ssl=1 +[8]: https://i1.wp.com/itsfoss.com/wp-content/uploads/2021/06/deskreen-confirm-1.png?resize=800%2C554&ssl=1 +[9]: https://i0.wp.com/itsfoss.com/wp-content/uploads/2021/06/deskscreen-done.png?resize=873%2C599&ssl=1 +[10]: https://itsfoss.com/install-deb-files-ubuntu/ +[11]: https://itsfoss.com/use-appimage-linux/ +[12]: https://github.com/pavlobu/deskreen diff --git a/published/202106/20210616 Migrate virtual machines to Kubernetes with this new tool.md b/published/202106/20210616 Migrate virtual machines to Kubernetes with this new tool.md new file mode 100644 index 0000000000..97814b89e0 --- /dev/null +++ b/published/202106/20210616 Migrate virtual machines to Kubernetes with this new tool.md @@ -0,0 +1,95 @@ +[#]: subject: (Migrate virtual machines to Kubernetes with this new tool) +[#]: via: (https://opensource.com/article/21/6/migrate-vms-kubernetes-forklift) +[#]: author: (Miguel Perez Colino https://opensource.com/users/mperezco) +[#]: collector: (lujun9972) +[#]: translator: (geekpi) +[#]: reviewer: (wxy) +[#]: publisher: (wxy) +[#]: url: (https://linux.cn/article-13520-1.html) + +用 Forklift 将虚拟机迁移到 Kubernetes 上 +====== + +> 用 Forklift 将你的虚拟化工作负载过渡到 Kubernetes。 + +![](https://img.linux.net.cn/data/attachment/album/202106/25/113010mxhtznxjhxf1glz7.jpg) + +2017 年,[KubeVirt][2] 团队 [发起][3] 了一个在 [Kubernetes][4] 中管理容器及相关的虚拟机(VM)的项目。这个开源项目的意图是让虚拟机成为这个环境中的一等公民。 + +自从在 [2018 年开源峰会][5] 上推出以来,KubeVirt 一直在不断成熟和发展。它在 GitHub 上已经达到了 200 多颗星,甚至在 2021 年 2 月推出了自己的活动:[KubeVirt 峰会][6]。 + +![KubeVirt architecture][7] + +*KubeVirt 架构(© 2020,[Red Hat OpenShift][8])* + +KubeVirt 是 [OpenShift 虚拟化][9] 的基础,它帮助开发者将虚拟机带入容器化工作流程。 + +### 在 Kubernetes 中使用虚拟机 + +KubeVirt 使你能够在虚拟机上原生使用 Kubernetes。这意味着它们可以连接到使用标准 Kubernetes 方法(如服务、路由、管道等)访问的吊舱Pod网络。应用于虚拟机吊舱的网络策略与应用于应用吊舱的方式相同,它提供一个一致的模型来管理虚拟机到吊舱(或反之)的通信。 + +这方面的一个真实例子是一家航空公司利用旧的模拟器软件的方式。它注入了人工智能和机器学习 (AI/ML) 的模型,然后在基于虚拟机的模拟器上自动部署和测试它们。这使得它能够使用 Kubernetes 和 [Kubeflow][10] 完全自动化地获得测试结果和新的遥测训练数据。 + +![VM-creation workflow][11] + +*(Konveyor, [CC BY-SA 4.0][12])* + +[Konveyor.io][13] 是一个开源项目,帮助现有工作负载(开发、测试和生产)过渡到 Kubernetes。其工具包括将容器从一个 Kubernetes 平台转移到另一个平台的 [Crane][14];将工作负载从 Cloud Foundry 带到 Kubernetes的 [Move2Kube][15];以及分析 Java 应用,使其对 Kubernetes 等容器化平台中的运行时更加标准和可移植,从而使其现代化的 [Tackle][16]。 + +这些工具在转化模式中很有用,但许多项目希望在早期阶段利用 Kubernetes,以变得更加敏捷和富有成效。在基础设施方面,这些好处可能包括蓝/绿负载均衡、路由管理、声明式部署,或(取决于你的部署方式)由于不可变的基础设施而更容易升级。在开发方面,它们可能包括将持续集成/持续开发 (CI/CD) 管道与平台整合,使应用更快地投入生产,自我提供资源,或整合健康检查和监控。 + +KubeVirt 可以通过在 Kubernetes 环境中以虚拟机来运行工作负载帮助你。它能让你的工作负载迅速使用 Kubernetes,享受它的好处,并随着时间的推移稳步实现工作负载的现代化。但是,仍然有一个问题,就是把你的虚拟机从传统的虚拟化平台带到现代的 Kubernetes 平台。这就是 Konveyor 的 [Forklift][17] 项目的意义所在。 + +### 关于 Forklift + +Forklift 使用 KubeVirt 将不同来源的虚拟化工作负载迁移到 Kubernetes。它的设计目标是使任务变得简单,以便你可以从一两台机器到数百台机器迁移任何东西。 + +迁移是一个简单的、三阶段的过程: + + 1. 连接到一个现有的虚拟化平台(称为“源提供者”)和一个 Kubernetes 环境(“目标提供者”)。 + 2. 将网络和存储资源从源提供者映射到目标提供者,在两者中寻找等价的资源。 + 3. 选择要迁移的虚拟机,分配网络和存储映射,制定迁移计划。然后运行它。 + +### 如何开始 + +要开始使用 Forklift,首先,你需要一个兼容的源提供商。你还需要一个带有 KubeVirt 0.40 或更新版本的 Kubernetes 环境和裸机节点(尽管为了测试,你可以使用嵌套虚拟化)。用读-写-执行 (RWX) 功能配置你的存储类,并使用 [Multus][18] 配置你的网络,以匹配你的虚拟机在源提供者中使用的网络。(如果你不能这样做,也不用担心。你也可以选择重新分配 IP 地址。) + +最后,使用提供的操作器在你的 Kubernetes 上[安装 Forklift][19],并进入用户界面,开始运行你的第一次测试迁移。 + +Forklift 是 Red Hat 的 [虚拟化迁移工具套件][20] 的上游版本。因此,如果你想在生产环境中使用它,你可以考虑使用该工具的支持版本。 + +迁移愉快! + +-------------------------------------------------------------------------------- + +via: https://opensource.com/article/21/6/migrate-vms-kubernetes-forklift + +作者:[Miguel Perez Colino][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/mperezco +[b]: https://github.com/lujun9972 +[1]: https://opensource.com/sites/default/files/styles/image-full-size/public/lead-images/containers_2015-1-osdc-lead.png?itok=VEB4zwza (Containers on a ship on the ocean) +[2]: http://kubevirt.io/ +[3]: https://kubevirt.io/2017/This-Week-in-Kube-Virt-1.html +[4]: https://opensource.com/resources/what-is-kubernetes +[5]: https://ossna18.sched.com/event/FAOR/kubevirt-cats-and-dogs-living-together-stephen-gordon-red-hat +[6]: https://kubevirt.io/summit/ +[7]: https://opensource.com/sites/default/files/uploads/image1_1.png (KubeVirt architecture) +[8]: https://www.openshift.com/learn/topics/virtualization/ +[9]: https://openshift.com/virtualization/ +[10]: https://www.kubeflow.org/ +[11]: https://opensource.com/sites/default/files/uploads/image2_0_6.png (VM-creation workflow) +[12]: https://creativecommons.org/licenses/by-sa/4.0/ +[13]: https://www.konveyor.io/ +[14]: https://www.konveyor.io/crane +[15]: https://move2kube.konveyor.io/ +[16]: https://www.konveyor.io/tackle +[17]: https://www.konveyor.io/forklift +[18]: https://github.com/k8snetworkplumbingwg/multus-cni +[19]: https://www.youtube.com/watch?v=RnoIP3QjHww&t=1693s +[20]: https://access.redhat.com/documentation/en-us/migration_toolkit_for_virtualization/2.0/ diff --git a/published/202106/20210618 How to Set Up Razer Devices on Linux for Lighting Effects and Other Configurations.md b/published/202106/20210618 How to Set Up Razer Devices on Linux for Lighting Effects and Other Configurations.md new file mode 100644 index 0000000000..bdad8451e8 --- /dev/null +++ b/published/202106/20210618 How to Set Up Razer Devices on Linux for Lighting Effects and Other Configurations.md @@ -0,0 +1,129 @@ +[#]: subject: (How to Set Up Razer Devices on Linux for Lighting Effects and Other Configurations) +[#]: via: (https://itsfoss.com/set-up-razer-devices-linux/) +[#]: author: (Ankush Das https://itsfoss.com/author/ankush/) +[#]: collector: (lujun9972) +[#]: translator: (geekpi) +[#]: reviewer: (wxy) +[#]: publisher: (wxy) +[#]: url: (https://linux.cn/article-13538-1.html) + +如何在 Linux 上设置雷蛇设备的灯光效果和其他配置 +====== + +你有了一个闪亮的新雷蛇硬件,但你找不到 Linux 的 Razer Synapse 软件。而你最终没有正确 RGB 同步,也没有办法定制它。你会怎么做呢? + +好吧,对于某些功能,比如给你的鼠标添加宏,你仍然需要(在 Windows 或 MacOS 上)访问 Razer Synapse。 + +但是,要调整其他一些选项,如键盘的宏,改变鼠标的 DPI,或灯光效果,你可以在 Linux 上轻松设置你的雷蛇外设。 + +![My Razer Basilisk V2 with lighting effect][1] + +这里有一些鼠标和鼠标垫的照片。这是同样的设置,但有不同的照明方案。点击图片可以看到更大的图片。 + +![][2] + +![][3] + +![][4] + +雷蛇 Basilisk 是一款不错的游戏鼠标。如果你想,你可以从亚马逊订购或从当地商店获得。 + +如果你已经拥有一个雷蛇设备,让我展示一下配置它的步骤,就像我在这里做的那样。 + +### 步骤 1:安装 OpenRazer + +**OpenRazer** 是一个开源的驱动程序,使雷蛇硬件在 Linux 上工作。它支持几种功能来定制和控制你的设备,包括 RGB 鼠标垫。 + +虽然这不是官方 Linux 驱动,但它在各种设备上工作良好。 + +它为各种 Linux 发行版提供支持,包括 Solus、openSUSE、Fedora、Debian、Arch Linux、Ubuntu 和其他一些发行版。 + +在这里,我将重点介绍在任何基于 Ubuntu 的发行版上安装它的步骤,对于其他发行版,你可能想参考 [官方说明][8]。 + +你需要在 Ubuntu 上 [使用 PPA][9] 安装 OpenRazer,下面是如何做的: + +``` +sudo apt install software-properties-gtk +sudo add-apt-repository ppa:openrazer/stable +sudo apt update +sudo apt install openrazer-meta +``` + +它也提供了一个 [守护进程][10],你可以选择让它工作,你要把你的用户加入到 `plugdev` 组,它给了设备的特权访问: + +``` +sudo gpasswd -a $USER plugdev +``` + +我不需要用上述命令中配置/添加一个守护程序,但我仍然可以很好地使用这些设备。守护进程主要是确保驱动保持活跃。 + +- [下载 OpenRazer][11] + +### 步骤 2:安装一个 GUI 来管理和调整选项 + +现在驱动已经安装完毕,你所需要的是一个图形用户界面 (GUI) 来帮助你定制你的雷蛇硬件。 + +你可以找到一些可用的选择,但我将推荐安装 [Polychromatic][12],它提供了一个有吸引力的用户界面,而且运行良好。 + +![][13] + +Polychromatic 是我能推荐的最接近 Razer Synapse 的应用,而且效果不错。 + +对于基于 Ubuntu 的发行版,你需要做的就是使用 PPA 安装它: + +``` +sudo add-apt-repository ppa:polychromatic/stable +sudo apt update +sudo apt install polychromatic +``` + +对于 Arch Linux 用户,你可以在 [AUR][14] 中找到它。关于更多的安装说明,你可以参考[官方下载页面][15]。 + +- [下载 Polychromatic][16] + +你会得到不同设备的不同选项。在这里,我试着改变 DPI,自定义颜色周期,以及我的雷蛇 Basilisk v2 鼠标的轮询率,它完全正常。 + +![Customization options for a mouse][17] + +如果你知道你想做什么,它还为你提供了轻松重启或停止 [守护进程][10]、改变小程序图标和执行高级配置选项的能力。 + +另外,你可以试试 [RazerGenie][18]、[Snake][19] 或 [OpenRGB][20] (用于改变颜色)来调整鼠标的颜色或任何其他设置。 + +### 总结 + +现在你可以轻松地定制你的雷蛇硬件了,希望你能玩得开心! + +虽然你可能会找到一些其他的选择来配置你的雷蛇设备,但我没有找到任何其他效果这么好的选择。 + +如果你遇到了一些有用的东西,值得在这里为所有的雷蛇用户提一下,请在下面的评论中告诉我。 + +-------------------------------------------------------------------------------- + +via: https://itsfoss.com/set-up-razer-devices-linux/ + +作者:[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://i2.wp.com/itsfoss.com/wp-content/uploads/2021/06/Razer-Basilisk-V2.jpg?resize=800%2C600&ssl=1 +[2]: https://i1.wp.com/itsfoss.com/wp-content/uploads/2021/06/razer-mouse-pad-lighting-effect-3-com.jpg?resize=800%2C600&ssl=1 +[3]: https://i0.wp.com/itsfoss.com/wp-content/uploads/2021/06/razer-mouse-pad-lighting-effect-2-com.jpg?resize=800%2C600&ssl=1 +[4]: https://i0.wp.com/itsfoss.com/wp-content/uploads/2021/06/razer-mouse-pad-lighting-effect-1-com.jpg?resize=800%2C600&ssl=1 +[8]: https://openrazer.github.io/#download +[9]: https://itsfoss.com/ppa-guide/ +[10]: https://itsfoss.com/linux-daemons/ +[11]: https://openrazer.github.io/ +[12]: https://polychromatic.app +[13]: https://i2.wp.com/itsfoss.com/wp-content/uploads/2021/06/polychromatic-app-1.png?resize=800%2C500&ssl=1 +[14]: https://itsfoss.com/aur-arch-linux/ +[15]: https://polychromatic.app/download/ +[16]: https://polychromatic.app/ +[17]: https://i1.wp.com/itsfoss.com/wp-content/uploads/2021/06/razer-basilisk-polychromatic.png?resize=800%2C505&ssl=1 +[18]: https://github.com/z3ntu/RazerGenie +[19]: https://github.com/bithatch/snake +[20]: https://itsfoss.com/openrgb/ diff --git a/published/202106/20210618 Systemd Timers for Scheduling Tasks.md b/published/202106/20210618 Systemd Timers for Scheduling Tasks.md new file mode 100644 index 0000000000..6ce42556f9 --- /dev/null +++ b/published/202106/20210618 Systemd Timers for Scheduling Tasks.md @@ -0,0 +1,220 @@ +[#]: subject: (Systemd Timers for Scheduling Tasks) +[#]: via: (https://fedoramagazine.org/systemd-timers-for-scheduling-tasks/) +[#]: author: (Richard England https://fedoramagazine.org/author/rlengland/) +[#]: collector: (lujun9972) +[#]: translator: (dcoliversun) +[#]: reviewer: (wxy) +[#]: publisher: (wxy) +[#]: url: (https://linux.cn/article-13522-1.html) + +用于调度任务的 systemd 定时器 +====== + +![](https://img.linux.net.cn/data/attachment/album/202106/25/175650j4wrdw0z884iod80.jpg ) + +systemd 提供定时器有一段时间了,定时器替代了 cron 功能,这一特性值得看看。本文将向你介绍在系统启动后如何使用 systemd 中的定时器来运行任务,并在此后重复运行。这不是对 systemd 的全面讨论,只是对此特性的一个介绍。 + +### 快速回顾:cron、anacron 与 systemd + +cron 可以以几分钟到几个月或更长时间的粒度调度运行一个任务。设置起来相对简单,它只需要一个配置文件。虽然配置过程有些深奥,但一般用户也可以使用。 + +然而,如果你的系统在需要执行的时间没有运行,那么 cron 会失败。 + +anacron 克服了“系统没有运行”的问题。它确保任务将在你的系统再次启动时执行。虽然它旨在给管理员使用,但有些系统允许普通用户访问 anacron。 + +但是,anacron 的执行频率不能低于每天一次。 + +cron 和 anacron 都存在执行上下文一致性的问题。必须注意任务运行时有效的环境与测试时使用的环境完全相同。必须提供相同的 shell、环境变量和路径。这意味着测试和调试有时会很困难。 + +systemd 定时器提供了 cron 和 anacron 二者的优点,允许调度到分钟粒度。确保在系统再次运行时执行任务,即使在预期的执行时间内系统处于关闭状态。它对所有用户都可用。你可以在它将要运行的环境中测试和调试执行。 + +但是,它的配置更加复杂,至少需要两个配置文件。 + +如果你的 cron 和 anacron 配置可以很好地为你服务,那么可能没有理由改变。但是 systemd 至少值得研究,因为它可以简化任何当前的 cron/anacron 工作方式。 + +### 配置 + +systemd 定时器执行功能至少需要两个文件。这两个是“定时器单元timer unit”和“服务单元service unit”。(其执行的)“动作”不仅仅是简单的命令,你还需要一个“作业”文件或脚本来执行必要的功能。 + +定时器单元文件定义调度表,而服务单元文件定义执行的任务。有关的更多详细信息请参考 `man systemd.timer` 中提供的 .timer 单元。服务单元的详细信息可在 `man systemd.service` 中找到。 + +单元文件存放在几个位置(在手册页中有列出)。然而,对于普通用户来说,最容易找到的位置可能是 `~/.config/systemd/user`。请注意,这里的 `user` 是字符串 `user`。 + +### 示例 + +此示例是一个创建用户调度作业而不是(以 root 用户身份运行的)系统调度作业的简单示例。它将消息、日期和时间打印到文件中。 + +1、首先创建一个执行任务的 shell 脚本。在你的本地 `bin` 目录中创建它,例如在 `~/bin/schedule-test.sh` 中。 + +创建文件: + +``` +touch ~/bin/schedule-test.sh +``` + +然后将以下内容添加到你刚刚创建的文件中: + +``` +#!/bin/sh +echo "This is only a test: $(date)" >> "$HOME/schedule-test-output.txt" +``` + +记住赋予你的 shell 脚本执行权限。 + +2、创建 .service 单元调用上面的脚本。在以下位置创建目录与文件:`~/.config/systemd/user/schedule-test.service`: + +``` +[Unit] +Description=A job to test the systemd scheduler + +[Service] +Type=simple +ExecStart=/home//bin/schedule-test.sh + +[Install] +WantedBy=default.target +``` + +请注意 `` 应该是你的家目录地址,但是单元文件路径名中的 `user` 实际上是字符串 `user`。 + +`ExecStart` 应该提供一个没有变量的绝对地址。例外情况是,对于用户单元文件,你可以用 `%h` 替换 `$HOME`。换句话说,你可以使用: + +``` +ExecStart=%h/bin/schedule-test.sh +``` + +这仅用于用户单元文件,而不适用于系统服务,因为在系统环境中运行时 `%h` 总是返回 `/root`。其他特殊符号可在 `man systemd.unit` 的 `SPECIFIERS` 中找到。因为它超出了本文的范围,所以这就是我们目前需要了解的关于特殊符号的全部内容。 + +3、创建一个 .timer 单元文件,该文件实际上调度你创建的 .service 单元文件。在 .service 单元文件相同位置创建它:`~/.config/systemd/user/schedule-test.timer`。请注意,文件名仅在扩展名上有所不同,例如一个是 `.service`,一个是 `.timer`。 + +``` +[Unit] +Description=Schedule a message every 1 minute +RefuseManualStart=no # Allow manual starts +RefuseManualStop=no # Allow manual stops + +[Timer] +#Execute job if it missed a run due to machine being off +Persistent=true +#Run 120 seconds after boot for the first time +OnBootSec=120 +#Run every 1 minute thereafter +OnUnitActiveSec=60 +#File describing job to execute +Unit=schedule-test.service + +[Install] +WantedBy=timers.target +``` + +请注意,这个 .timer 单元文件使用了 `OnUnitActiveSec` 来指定调度表。`OnCalendar` 选项更加灵活。例如: + +``` +# run on the minute of every minute every hour of every day + OnCalendar=*-*-* *:*:00 +# run on the hour of every hour of every day + OnCalendar=*-*-* *:00:00 +# run every day + OnCalendar=*-*-* 00:00:00 +# run 11:12:13 of the first or fifth day of any month of the year +# 2012, but only if that day is a Thursday or Friday + OnCalendar=Thu,Fri 2012-*-1,5 11:12:13 +``` + +有关 `OnCalendar` 的更多信息参见 [这里][2]。 + +4、所有的部件都已就位,但你应该进行测试,以确保一切正常。首先,启用该用户服务: + +``` +$ systemctl --user enable schedule-test.service +``` + +这将导致类似如下的输出: + +``` +Created symlink /home//.config/systemd/user/default.target.wants/schedule-test.service → /home//.config/systemd/user/schedule-test.service. +``` + +现在执行测试工作: + +``` +$ systemctl --user start schedule-test.service +``` + +检查你的输出文件(`$HOME/schedule-test-output.txt`),确保你的脚本运行正常。应该只有一个条目,因为我们还没有启动定时器。必要时进行调试。如果你需要更改 .service 单元文件,而不是更改它调用的 shell 脚本,请不要忘记再次启用该服务。 + +5、一旦作业正常运行,通过为服务启用、启动用户定时器来实时调度作业: + +``` +$ systemctl --user enable schedule-test.timer +$ systemctl --user start schedule-test.timer +``` + +请注意,你已经在上面的步骤 4 中启动、启用了服务,因此只需要为它启用、启动定时器。 + +`enable` 命令会产生如下输出: + +``` +Created symlink /home//.config/systemd/user/timers.target.wants/schedule-test.timer → /home//.config/systemd/user/schedule-test.timer. +``` + +`start` 命令将只是返回命令行界面提示符。 + +### 其他操作 + +你可以检查和监控服务。如果你从系统服务收到错误,下面的第一个命令特别有用: + +``` +$ systemctl --user status schedule-test +$ systemctl --user list-unit-files +``` + +手动停止服务: + +``` +$ systemctl --user stop schedule-test.service +``` + +永久停止并禁用定时器和服务,重新加载守护程序配置并重置任何失败通知: + +``` +$ systemctl --user stop schedule-test.timer +$ systemctl --user disable schedule-test.timer +$ systemctl --user stop schedule-test.service +$ systemctl --user disable schedule-test.service +$ systemctl --user daemon-reload +$ systemctl --user reset-failed +``` + +### 总结 + +本文以 systemd 定时器为出发点,但是 systemd 的内容远不止于此。这篇文章应该为你提供一个基础。你可以从 [Fedora Magazine systemd 系列][3] 开始探索更多。 + +### 参考 + +更多阅读: + + * `man systemd.timer` + * `man systemd.service` + * [Use systemd timers instead of cronjobs][4] + * [Understanding and administering systemd][5] + * 内有 systemd 速查表 + +-------------------------------------------------------------------------------- + +via: https://fedoramagazine.org/systemd-timers-for-scheduling-tasks/ + +作者:[Richard England][a] +选题:[lujun9972][b] +译者:[dcoliversun](https://github.com/dcoliversun) +校对:[wxy](https://github.com/wxy) + +本文由 [LCTT](https://github.com/LCTT/TranslateProject) 原创编译,[Linux中国](https://linux.cn/) 荣誉推出 + +[a]: https://fedoramagazine.org/author/rlengland/ +[b]: https://github.com/lujun9972 +[1]: https://fedoramagazine.org/wp-content/uploads/2021/06/schedule_withsystemdtimer-816x345.jpg +[2]: https://www.freedesktop.org/software/systemd/man/systemd.time.html#Calendar%20Events +[3]: https://fedoramagazine.org/what-is-an-init-system/ +[4]: https://opensource.com/article/20/7/systemd-timers +[5]: https://docs.fedoraproject.org/en-US/quick-docs/understanding-and-administering-systemd/ diff --git a/published/202106/20210619 Here-s Why Switching to Linux Makes Sense in 2021.md b/published/202106/20210619 Here-s Why Switching to Linux Makes Sense in 2021.md new file mode 100644 index 0000000000..f018eca6e7 --- /dev/null +++ b/published/202106/20210619 Here-s Why Switching to Linux Makes Sense in 2021.md @@ -0,0 +1,128 @@ +[#]: subject: "Here’s Why Switching to Linux Makes Sense in 2021" +[#]: via: "https://news.itsfoss.com/switch-to-linux-in-2021/" +[#]: author: "Ankush Das https://news.itsfoss.com/author/ankush/" +[#]: collector: "lujun9972" +[#]: translator: "zepoch" +[#]: reviewer: "wxy" +[#]: publisher: "wxy" +[#]: url: "https://linux.cn/article-13519-1.html" + +为什么在 2021 年我仍然推荐你使用 Linux +====== + +![](https://i1.wp.com/news.itsfoss.com/wp-content/uploads/2021/05/linux-2021.png?w=1200&ssl=1) + +在某些领域,Linux 确实要比 Windows 和 macOS 更加优秀。人们正在意识到这一点,而且 Linux 也在桌面操作系统市场上变得愈发流行。 + +当然,目前大多数桌面操作系统用户仍然对 Windows 或者 macOS 推崇备至,但是也有着越来越多的用户开始尝试新的 Linux 发行版,看看他们是否可以从原来的系统切换到 Linux 系统。 + +他们可能已经听过 [用 Linux 作为桌面操作系统](https://news.itsfoss.com/linux-foundation-linux-desktop/) 的一些优秀案例,又或者是仅仅想要去尝试一些与原先不同的事物,谁知道呢? + +在这里,我将为你解释为什么在 2021 年我仍然推荐你使用 Linux。 + +### Linux 真棒,但是究竟是什么让其在 2021 年值得推荐呢? + +如果已经知道了 [使用 Linux 的优点](https://itsfoss.com/reasons-switch-linux-windows-xp/),你可能就知道接下来我会说些什么。 + +#### 1、你不需要购买许可证 + +![][3] + +你必须付费才能获得 Windows 10 许可证。 + +虽然有更便宜的选择,如获得 OEM 密钥。但是,如果你不愿意通过一些地下网站,而是从官方网站获得许可证,那么仅授权使用 1 台 PC 的**家庭版**就至少需要花费 **140 美元**。 + +当然,macOS 是一个完全不同的模式(你需要购买先进的硬件才能使用 macOS)——所以我们才会一直使用微软的 Windows。 + +关键是,在失业的浪潮中,配置一台新电脑是一个挑战。此外,你还需要花钱购买操作系统的许可证,但是你却可以在多台计算机上免费使用 Linux。 + +是的,你不需要为 Linux 获取许可证密钥。你可以轻松下载 [Linux 发行版][4],并根据需要将其安装在尽可能多的设备上。 + +不要担心,如果你不了解 Linux 发行版,你可以看看我们的 [最好的 Linux 发行版](https://itsfoss.com/best-linux-distributions/) 列表。 + +#### 2、重新唤醒你的 PC 并节省资金 + +[全球芯片短缺](https://www.cnbc.com/2021/05/12/the-global-chip-shortage-could-last-until-2023-.html) 已经严重影响了电脑组件的价格,特别是**显卡**。并不是简单的价格上升,而是你不得不支付 **2 到 5 倍**的零售价来购得显卡。 + +当然,如果你没有电脑,现在配置一个新的电脑可能是难以置信的挑战,但如果你有一个旧电脑的话,选择在上面运行 Windows 10 将会是十分卡顿的。 + +如果你不想要 Windows 系统,那 macOS 呢?入门级 Mac 系统将会花费至少 **1100** 美金,甚至更多,这取决于你住在哪里。对许多人来说,这会是一笔昂贵的开销。 + +你肯定需要升级你的系统 —— 但是如果我说 Linux 可以让你的旧电脑重新派上用场,能为你省钱呢? + +你将能够在你认为无法运行最新版本的微软 Windows 的电脑上运行 Linux。是的,就是这样的。 + +Linux 是一个资源高效型的操作系统,可在各种较旧的系统配置上运行。 + +所有你需要做的只是参考我们的列表 [轻量级 Linux 发行版][7],并选择一个你喜欢的。 + +#### 3、通过再次利用系统来减少电子浪费 + +![][8] + +考虑到电子废物正在全球不断产生,尤其是由加密矿工产生的,我们可以尽量减少浪费。除非你真正需要新的硬件,否则最好将现有硬件设备重新用于新任务。 + +而且,多亏了 Linux,你可以将旧电脑或单片机转变成媒体服务器或个人 [Nextcloud][9] 服务器。 + +你可以在现有硬件上使用 Linux 做更多工作。 + +因此,这将显著降低对新硬件的需求,并让你高效地重复使用现有的设备。 + +#### 4、远离病毒和恶意软件 + +![][10] + +在远程工作无处不在的时代,病毒和恶意软件显著增加。因此,即使你想平静地工作,你最终也可能受到恶意软件的影响。 + +Windows 和 macOS 比以往任何时候都更容易受到恶意软件的影响。但是,对于 Linux?这是不太可能的。 + +Linux 发行版会定期修补,以确保最佳安全性。 + +此外,正因为用户群体小,攻击者就不会花太多时间制作欺骗 Linux 用户的病毒或软件。因此,在使用 Linux 时遇到某种形式的恶意软件的机会较小。 + +#### 5、没有强制更新 + +![][11] + +在一个人们压力倍增的时代,强制更新然后发现计算机无法启动可能是一大烦恼。 + +至少,Windows 用户的情况就是这样。 + +但是,使用 Linux,你可以继续使用你的系统,而无需在后台强制下载任何更新。 + +你的操作系统只有你能决定。 + +当你想要更新你的 Linux 发行版本时,你可以选择更新,也可以不更新,它可以一直保持不更新的状态并且不会打扰你,除非你有很长一段时间没有更新。 + +### 总结 + +这些只是我能想到的几个原因之一,Linux 作为操作系统的选择在 2021 年比以往任何时候都更值得被推荐。 + +当然,这也取决于你的要求,这些好处可能不会体现在在你的用例中。但是,如果你确实不了解 Linux,至少,现在你可以评估你的需求,重新作出选择。 + +除了上述几点之外,你还能想到什么?请在下面的评论中告诉我。 + +-------------------------------------------------------------------------------- + +via: https://news.itsfoss.com/switch-to-linux-in-2021/ + +作者:[Ankush Das][a] +选题:[lujun9972][b] +译者:[zepoch](https://github.com/zepoch) +校对:[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://news.itsfoss.com/linux-foundation-linux-desktop/ +[2]: https://itsfoss.com/reasons-switch-linux-windows-xp/ +[3]: https://i0.wp.com/news.itsfoss.com/wp-content/uploads/2021/06/license-agreement.jpg?w=1000&ssl=1 +[4]: https://itsfoss.com/what-is-linux-distribution/ +[5]: https://itsfoss.com/best-linux-distributions/ +[6]: https://www.cnbc.com/2021/05/12/the-global-chip-shortage-could-last-until-2023-.html +[7]: https://itsfoss.com/lightweight-linux-beginners/ +[8]: https://i2.wp.com/news.itsfoss.com/wp-content/uploads/2021/05/e-waste-illustration.jpg?w=800&ssl=1 +[9]: https://itsfoss.com/nextcloud/ +[10]: https://i2.wp.com/news.itsfoss.com/wp-content/uploads/2021/05/system-malware.jpg?w=800&ssl=1 +[11]: https://i0.wp.com/news.itsfoss.com/wp-content/uploads/2021/05/linux-system-update.jpg?w=800&ssl=1 \ No newline at end of file diff --git a/published/202106/20210622 KTorrent- An Incredibly Useful BitTorrent Application by KDE.md b/published/202106/20210622 KTorrent- An Incredibly Useful BitTorrent Application by KDE.md new file mode 100644 index 0000000000..fba3c69a7e --- /dev/null +++ b/published/202106/20210622 KTorrent- An Incredibly Useful BitTorrent Application by KDE.md @@ -0,0 +1,110 @@ +[#]: subject: (KTorrent: An Incredibly Useful BitTorrent Application by KDE) +[#]: via: (https://itsfoss.com/ktorrent/) +[#]: author: (Ankush Das https://itsfoss.com/author/ankush/) +[#]: collector: (lujun9972) +[#]: translator: (geekpi) +[#]: reviewer: (wxy) +[#]: publisher: (wxy) +[#]: url: (https://linux.cn/article-13530-1.html) + +KTorrent:KDE 上的一个非常有用的 BitTorrent 应用 +====== + +![](https://img.linux.net.cn/data/attachment/album/202106/28/120031cml79jimcs99ybpy.jpg) + +Linux 中有各种各样的 BitTorrent 应用。但是,找到一个好的、提供许多功能的应用将可以为你节省一些时间。 + +KDE 的 KTorrent 就是这样一个为 Linux 打造的 BitTorrent 应用。 + +虽然 [Linux 有好几个 torrent 客户端][1],但我最近发现 KTorrent 对我而言很合适。 + +### KTorrent: 适用于 Linux 的开源 BitTorrent 客户端 + +![][2] + +KTorrent 是一个成熟的 torrent 客户端,主要为 KDE 桌面定制。无论你使用什么桌面环境,它都能很好地工作。 + +当然,使用 KDE 桌面,你可以得到一个无缝的用户体验。 + +让我们来看看它的所有功能。 + +### KTorrent 的功能 + +![][3] + +对于普通的 torrent 用户来说,拥有一套全面的功能使事情变得简单。而 KTorrent 也不例外。在这里,我将列出 KTorrent 的主要亮点: + + * 在一个队列中添加 torrent 下载 + * 能够控制每次下载(或整体)的速度限制 + * 视频和音频文件预览选项 + * 支持导入下载的文件(部分/全部) + * 在下载多个文件时,能够对 torrent 下载进行优先排序 + * 为多文件 torrent 选择要下载的特定文件 + * IP 过滤器,可选择踢走/禁止对端。 + * 支持 UDP 跟踪器 + * 支持 µTorrent 对端 + * 支持协议加密 + * 能够创建无跟踪器的 torrent + * 脚本支持 + * 系统托盘集成 + * 通过代理连接 + * 增加了插件支持 + * 支持 IPv6 + +KTorrent 看起来可以作为一个日常使用的 torrent 客户端,在一个地方管理所有的 torrent 下载。 + +![][4] + +除了上面提到的功能外,它还对客户端的行为提供了很大的控制。例如,调整下载/暂停/跟踪器的指示颜色。 + +如果你想禁用完成 torrent 下载时的声音或得到活动通知,你还可以设置通知。 + +![][5] + +虽然像协议加密支持这样的功能可能无法取代一些 [最好的私有专用网络][6] 服务,但它对桌面客户端来说是一个重要的补充。 + +### 在 Linux 中安装 KTorrent + +KTorrent 应该可以通过包管理器(如 [Synaptic][7])或默认的仓库获得。你也可以在你的软件中心找到它并轻松安装。 + +除此之外,它还在 [Flathub][9] 上提供了一个适用于任何 Linux 发行版的 [Flatpak][8] 官方包。如果你需要帮助,我们有一个 [Flatpak 指南][10] 供参考。 + +如果你喜欢的话,你也可以尝试可用的 [snap包][11]。 + +要探索更多关于它和源码的信息,请前往它的 [官方 KDE 应用页面][12]。 + +- [KTorrent][12] + +### 结束语 + +KTorrent 是 Linux 中一个出色的 torrent 客户端。我在我的 Linux Mint 系统的 Cinnamon 桌面上试用了它,它运行得很好。 + +我喜欢它的简单和可配置性。尽管我不是每天都在使用 torrent 客户端,但在我短暂的测试中,我没有发现 KTorrent 有什么奇怪的地方。 + +你认为 KTorrent 作为 Linux 的 torrent 客户端怎么样?你喜欢用什么呢? + +-------------------------------------------------------------------------------- + +via: https://itsfoss.com/ktorrent/ + +作者:[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/best-torrent-ubuntu/ +[2]: https://i0.wp.com/itsfoss.com/wp-content/uploads/2021/06/ktorrent-download.png?resize=850%2C582&ssl=1 +[3]: https://i2.wp.com/itsfoss.com/wp-content/uploads/2021/06/ktorrent-configure.png?resize=850%2C656&ssl=1 +[4]: https://i1.wp.com/itsfoss.com/wp-content/uploads/2021/06/ktorrent-speed-limit.png?resize=850%2C585&ssl=1 +[5]: https://i0.wp.com/itsfoss.com/wp-content/uploads/2021/06/ktorrent-plugins.png?resize=850%2C643&ssl=1 +[6]: https://itsfoss.com/best-vpn-linux/ +[7]: https://itsfoss.com/synaptic-package-manager/ +[8]: https://itsfoss.com/what-is-flatpak/ +[9]: https://flathub.org/apps/details/org.kde.ktorrent +[10]: https://itsfoss.com/flatpak-guide/ +[11]: https://snapcraft.io/ktorrent +[12]: https://apps.kde.org/ktorrent/ diff --git a/published/202106/20210622 Replace du with dust on Linux.md b/published/202106/20210622 Replace du with dust on Linux.md new file mode 100644 index 0000000000..ba59483df1 --- /dev/null +++ b/published/202106/20210622 Replace du with dust on Linux.md @@ -0,0 +1,145 @@ +[#]: subject: (Replace du with dust on Linux) +[#]: via: (https://opensource.com/article/21/6/dust-linux) +[#]: author: (Sudeshna Sur https://opensource.com/users/sudeshna-sur) +[#]: collector: (lujun9972) +[#]: translator: (geekpi) +[#]: reviewer: (wxy) +[#]: publisher: (wxy) +[#]: url: (https://linux.cn/article-13532-1.html) + +在 Linux 上用 dust 代替 du +====== + +> dust 命令是用 Rust 编写的对 du 命令的一个更直观实现。 + +![](https://img.linux.net.cn/data/attachment/album/202106/29/033403l8x83x7a4tt4fq84.jpg) + +如果你在 Linux 命令行上工作,你会熟悉 `du` 命令。了解像 `du` 这样的命令,可以快速返回磁盘使用情况,是命令行使程序员更有效率的方法之一。然而,如果你正在寻找一种方法来节省更多的时间,使你的生活更加容易,看看 [dust][2],它是用 Rust 重写的 `du`,具有更多的直观性。 + +简而言之,`dust` 是一个提供文件类型和元数据的工具。如果你在一个目录中运行了 `dust`,它将以几种方式报告该目录的磁盘利用率。它提供了一个信息量很大的图表,告诉你哪个文件夹使用的磁盘空间最大。如果有嵌套的文件夹,你可以看到每个文件夹使用的空间百分比。 + +### 安装 dust + +你可以使用 Rust 的 Cargo 包管理器安装 `dust`: + +``` +$ cargo install du-dust +``` + +另外,你可以在 Linux 上的软件库中找到它,在 macOS 上,可以使用 [MacPorts][3] 或 [Homebrew][4]。 + +### 探索 dust + +在一个目录中执行 `dust` 命令,会返回一个图表,以树状格式显示其内容和每个项目所占的百分比。 + + +``` +$ dust + 5.7M ┌── exa │ ██ │ 2% + 5.9M ├── tokei │ ██ │ 2% + 6.1M ├── dust │ ██ │ 2% + 6.2M ├── tldr │ ██ │ 2% + 9.4M ├── fd │ ██ │ 4% + 2.9M │ ┌── exa │ ░░░█ │ 1% + 15M │ ├── rustdoc │ ░███ │ 6% + 18M ├─┴ bin │ ████ │ 7% + 27M ├── rg │ ██████ │ 11% + 1.3M │ ┌── libz-sys-1.1.3.crate │ ░░░░░░░░░░░░░░░░░░░░░░░░░░░░░░░░░░█ │ 0% + 1.4M │ ├── libgit2-sys-0.12.19+1.1.0.crate │ ░░░░░░░░░░░░░░░░░░░░░░░░░░░░░░░░░░█ │ 1% + 4.5M │ ┌─┴ github.com-1ecc6299db9ec823 │ ░░░░░░░░░░░░░░░░░░░░░░░░░░░░░░░░░░█ │ 2% + 4.5M │ ┌─┴ cache │ ░░░░░░░░░░░░░░░░░░░░░░░░░░░░░░░░░░█ │ 2% + 1.0M │ │ ┌── git2-0.13.18 │ ░░░░░░░░░░░░░░░░░░░░░░░░░░░░░▓▓▓▓▓█ │ 0% + 1.4M │ │ ├── exa-0.10.1 │ ░░░░░░░░░░░░░░░░░░░░░░░░░░░░░▓▓▓▓▓█ │ 1% + 1.5M │ │ │ ┌── src │ ░░░░░░░░░░░░░░░░░░░░░░░░░░░░░▓▓▓▓▓█ │ 1% + 2.2M │ │ ├─┴ idna-0.2.3 │ ░░░░░░░░░░░░░░░░░░░░░░░░░░░░░▓▓▓▓▓█ │ 1% + 1.2M │ │ │ ┌── linux │ ░░░░░░░░░░░░░░░░░░░░░░░░░░░░░▓▓▓▓▓█ │ 0% + 1.6M │ │ │ ┌─┴ linux_like │ ░░░░░░░░░░░░░░░░░░░░░░░░░░░░░▓▓▓▓▓█ │ 1% + 2.6M │ │ │ ┌─┴ unix │ ░░░░░░░░░░░░░░░░░░░░░░░░░░░░░▓▓▓▓▓█ │ 1% + 3.1M │ │ │ ┌─┴ src │ ░░░░░░░░░░░░░░░░░░░░░░░░░░░░░▓▓▓▓▓█ │ 1% + 3.1M │ │ ├─┴ libc-0.2.94 │ ░░░░░░░░░░░░░░░░░░░░░░░░░░░░░▓▓▓▓▓█ │ 1% + 1.2M │ │ │ ┌── test │ ░░░░░░░░░░░░░░░░░░░░░░░░░░░░░▓▓▓▓▓█ │ 0% + 2.6M │ │ │ ┌─┴ zlib-ng │ ░░░░░░░░░░░░░░░░░░░░░░░░░░░░░▓▓▓▓▓█ │ 1% + 904K │ │ │ │ ┌── vstudio │ ░░░░░░░░░░░░░░░░░░░░░░░░░░░░░▓▓▓▓▓█ │ 0% + 2.0M │ │ │ │ ┌─┴ contrib │ ░░░░░░░░░░░░░░░░░░░░░░░░░░░░░▓▓▓▓▓█ │ 1% + 3.4M │ │ │ ├─┴ zlib │ ░░░░░░░░░░░░░░░░░░░░░░░░░░░░░▓▓▓▓▓█ │ 1% + 6.1M │ │ │ ┌─┴ src │ ░░░░░░░░░░░░░░░░░░░░░░░░░░░░░▓▓▓▓██ │ 2% + 6.1M │ │ ├─┴ libz-sys-1.1.3 │ ░░░░░░░░░░░░░░░░░░░░░░░░░░░░░▓▓▓▓██ │ 2% + 1.6M │ │ │ ┌── pcre │ ░░░░░░░░░░░░░░░░░░░░░░░░░░░░░▓▓▓▓▓█ │ 1% + 2.5M │ │ │ ┌─┴ deps │ ░░░░░░░░░░░░░░░░░░░░░░░░░░░░░▓▓▓▓▓█ │ 1% + 3.8M │ │ │ ├── src │ ░░░░░░░░░░░░░░░░░░░░░░░░░░░░░▓▓▓▓▓█ │ 1% + 7.4M │ │ │ ┌─┴ libgit2 │ ░░░░░░░░░░░░░░░░░░░░░░░░░░░░░▓▓▓▓██ │ 3% + 7.6M │ │ ├─┴ libgit2-sys-0.12.19+1.1.0 │ ░░░░░░░░░░░░░░░░░░░░░░░░░░░░░▓▓▓▓██ │ 3% + 26M │ │ ┌─┴ github.com-1ecc6299db9ec823 │ ░░░░░░░░░░░░░░░░░░░░░░░░░░░░░██████ │ 10% + 26M │ ├─┴ src │ ░░░░░░░░░░░░░░░░░░░░░░░░░░░░░██████ │ 10% + 932K │ │ ┌── .cache │ ░░░░░░▓▓▓▓▓▓▓▓▓▓▓▓▓▓▓▓▓▓▓▓▓▓▓▓▓▓▓▓█ │ 0% + 11M │ │ │ ┌── pack-c3e3a51a17096a3078196f3f014e02e5da6285aa.idx │ ░░░░░░▓▓▓▓▓▓▓▓▓▓▓▓▓▓▓▓▓▓▓▓▓▓▓▓▓▓███ │ 4% + 135M │ │ │ ├── pack-c3e3a51a17096a3078196f3f014e02e5da6285aa.pack│ ░░░░░░▓▓███████████████████████████ │ 53% + 147M │ │ │ ┌─┴ pack │ ░░░░░░█████████████████████████████ │ 57% + 147M │ │ │ ┌─┴ objects │ ░░░░░░█████████████████████████████ │ 57% + 147M │ │ ├─┴ .git │ ░░░░░░█████████████████████████████ │ 57% + 147M │ │ ┌─┴ github.com-1ecc6299db9ec823 │ ░░░░░░█████████████████████████████ │ 57% + 147M │ ├─┴ index │ ░░░░░░█████████████████████████████ │ 57% + 178M ├─┴ registry │ ███████████████████████████████████ │ 69% + 257M ┌─┴ . │██████████████████████████████████████████████████ │ 100% +$ +``` + +将 `dust` 应用于一个特定的目录: + +``` +$ dust ~/Work/ +``` + +![Dust output from a specific directory][5] + +`-r` 选项以相反的顺序显示输出,“根”在底部: + +``` +$ dust -r ~/Work/ +``` + +使用 `dust -d 3` 会返回三层的子目录和它们的磁盘利用率: + +``` +$ dust -d 3 ~/Work/wildfly/jaxrs/target/classes + 4.0K ┌── jaxrs.xml │ █ │ 1% + 4.0K ┌─┴ subsystem-templates │ █ │ 1% + 4.0K │ ┌── org.jboss.as.controller.transform.ExtensionTransformerRegistration│ █ │ 1% + 4.0K │ ├── org.jboss.as.controller.Extension │ █ │ 1% + 8.0K │ ┌─┴ services │ █ │ 2% + 8.0K ├─┴ META-INF │ █ │ 2% + 4.0K │ ┌── jboss-as-jaxrs_1_0.xsd │ ░█ │ 1% + 8.0K │ ├── jboss-as-jaxrs_2_0.xsd │ ░█ │ 2% + 12K ├─┴ schema │ ██ │ 3% + 408K │ ┌── as │ ████████████████████████████████████████ │ 94% + 408K │ ┌─┴ jboss │ ████████████████████████████████████████ │ 94% + 408K ├─┴ org │ ████████████████████████████████████████ │ 94% + 432K ┌─┴ classes │██████████████████████████████████████████ │ 100% +$ +``` + +### 总结 + +`dust` 的魅力在于它是一个小而简单的、易于理解的命令。它使用颜色方案来表示最大的子目录,使你的目录易于可视化。这是一个受欢迎的项目,欢迎大家来贡献。 + +你是否使用或考虑使用 `dust`?如果是,请在下面的评论中告诉我们你的想法。 + +-------------------------------------------------------------------------------- + +via: https://opensource.com/article/21/6/dust-linux + +作者:[Sudeshna Sur][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/sudeshna-sur +[b]: https://github.com/lujun9972 +[1]: https://opensource.com/sites/default/files/styles/image-full-size/public/lead-images/sand_dunes_desert_hills_landscape_nature.jpg?itok=wUByylBb +[2]: https://github.com/bootandy/dust +[3]: https://opensource.com/article/20/11/macports +[4]: https://opensource.com/article/20/6/homebrew-mac +[5]: https://opensource.com/sites/default/files/uploads/dust-work.png (Dust output from a specific directory) +[6]: https://creativecommons.org/licenses/by-sa/4.0/ diff --git a/published/202106/20210623 Python 3.10 beta in Fedora Linux.md b/published/202106/20210623 Python 3.10 beta in Fedora Linux.md new file mode 100644 index 0000000000..8d900cd460 --- /dev/null +++ b/published/202106/20210623 Python 3.10 beta in Fedora Linux.md @@ -0,0 +1,115 @@ +[#]: subject: (Python 3.10 beta in Fedora Linux) +[#]: via: (https://fedoramagazine.org/python-3-10-beta-in-fedora-linux/) +[#]: author: (Miro Hrončok https://fedoramagazine.org/author/churchyard/) +[#]: collector: (lujun9972) +[#]: translator: (geekpi) +[#]: reviewer: (wxy) +[#]: publisher: (wxy) +[#]: url: (https://linux.cn/article-13536-1.html) + +Fedora Linux 中的 Python 3.10 测试版 +====== + +![][1] + +Python 开发者已经发布了 Python 3.10.0 的三个测试版本。现在,你可以在 Fedora Linux 中试用最新的版本尽早用 3.10 测试你的 Python 代码,为 10 月份的 3.10.0 最终版本做好准备。 + +### 在 Fedora Linux 上安装 Python 3.10 + +如果你运行 Fedora Linux,你可以用 `dnf` 从官方仓库安装 Python 3.10: + +``` +$ sudo dnf install python3.10 +``` + +你可能需要启用 `updates-testing` 仓库来获得最新的预发布版本: + +``` +$ sudo dnf install --enablerepo=updates-testing python3.10 +``` + +随着更多的测试版和候选版 [发布][2],Fedora 包将得到更新。不需要编译你自己的 Python 开发版本,只要安装它就可以获得最新。从第一个测试版开始,Python 开发者不会再增加新的功能了。你已经可以享受所有的新东西了。 + +### 用 Python 3.10 测试你的项目 + +运行 `python3.10` 命令来使用 Python 3.10,或者用 [内置的 venv 模块 tox][3] 或用 [pipenv][4] 和 [poetry][5] 创建虚拟环境。下面是一个使用 `tox` 的例子: + +``` +$ git clone https://github.com/benjaminp/six.git +Cloning into 'six'... +$ cd six/ +$ tox -e py310 +py310 run-test: commands[0] | python -m pytest -rfsxX +================== test session starts =================== +platform linux -- Python 3.10.0b3, pytest-6.2.4, py-1.10.0, pluggy-0.13.1 +collected 200 items + +test_six.py ...................................... [ 19%] +.................................................. [ 44%] +.................................................. [ 69%] +.................................................. [ 94%] +............ [100%] + +================== 200 passed in 0.43s =================== +________________________ summary _________________________ + py310: commands succeeded + congratulations :) +``` + +如果你在 Fedora Linux 上发现了 Python 3.10 的问题,请 [在 Fedora 的 bugzilla 上提交 bug 报告][6] 或在 [Python 的问题追踪][7] 上提交。如果你不确定这是否是 Python 的问题,你可以 [通过电子邮件或 IRC 直接联系 Fedora 的 Python 维护者][8] 。 + +### Python 3.10 中的新内容 + +参见 [Python 3.10 的全部新闻列表][9]。例如,你可以尝试一下 [结构模式匹配][10]: + +``` +$ python3.10 +Python 3.10.0b3 (default, Jun 17 2021, 00:00:00) +[GCC 10.3.1 20210422 (Red Hat 10.3.1-1)] on linux +Type "help", "copyright", "credits" or "license" for more information. +>>> point = (3, 10) +>>> match point: +... case (0, 0): +... print("Origin") +... case (0, y): +... print(f"Y={y}") +... case (x, 0): +... print(f"X={x}") +... case (x, y): +... print(f"X={x}, Y={y}") +... case _: +... raise ValueError("Not a point") +... +X=3, Y=10 +>>> x +3 +>>> y +10 +``` + +敬请期待 [Fedora Linux 35 中的 python3 —— Python 3.10][11]! + +-------------------------------------------------------------------------------- + +via: https://fedoramagazine.org/python-3-10-beta-in-fedora-linux/ + +作者:[Miro Hrončok][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/churchyard/ +[b]: https://github.com/lujun9972 +[1]: https://fedoramagazine.org/wp-content/uploads/2021/06/python310-beta-816x345.jpg +[2]: https://www.python.org/dev/peps/pep-0619/ +[3]: https://developer.fedoraproject.org/tech/languages/python/multiple-pythons.html +[4]: https://fedoramagazine.org/install-pipenv-fedora/ +[5]: https://python-poetry.org/ +[6]: https://bugzilla.redhat.com/buglist.cgi?component=python3.10&product=Fedora +[7]: https://bugs.python.org/ +[8]: https://fedoraproject.org/wiki/SIGs/Python#Communicate +[9]: https://docs.python.org/3.10/whatsnew/3.10.html +[10]: https://www.python.org/dev/peps/pep-0634/ +[11]: https://fedoraproject.org/wiki/Changes/Python3.10 diff --git a/published/202106/20210623 Replace find with fd on Linux.md b/published/202106/20210623 Replace find with fd on Linux.md new file mode 100644 index 0000000000..c20a9713ad --- /dev/null +++ b/published/202106/20210623 Replace find with fd on Linux.md @@ -0,0 +1,137 @@ +[#]: subject: (Replace find with fd on Linux) +[#]: via: (https://opensource.com/article/21/6/fd-linux) +[#]: author: (Sudeshna Sur https://opensource.com/users/sudeshna-sur) +[#]: collector: (lujun9972) +[#]: translator: (wxy) +[#]: reviewer: (wxy) +[#]: publisher: (wxy) +[#]: url: (https://linux.cn/article-13516-1.html) + +在 Linux 上用 fd 代替 find +====== + +> fd 命令是一个流行的、用户友好的 find 命令的替代品。 + +![](https://img.linux.net.cn/data/attachment/album/202106/24/110546npqmttwobtqpo4qk.jpg) + +许多 Linux 程序员在其工作中每天都在使用 `find` 命令。但是 `find` 给出的文件系统条目是有限的,如果你要进行大量的 `find` 操作,它甚至不是很快速。因此,我更喜欢使用 Rust 编写的 `fd` 命令,因为它提供了合理的默认值,适用于大多数使用情况。 + +正如它的 [README][2] 所说,“`fd` 是一个在文件系统中寻找条目的程序。它是一个简单、快速和用户友好的 `find` 的替代品。”它的特点是目录的并行遍历,可以一次搜索多个目录。它支持正则表达式(regex)和基于通配符的模式。 + +### 安装 fd + +在 Linux 上,你可以从你的软件库中安装 `fd`(可用的软件包列表可以在 [Repology 上的 fd 页面][3] 找到)。 例如,在 Fedora 上: + +``` +$ sudo dnf install fd-find +``` + +在 macOS 上,可以使用 [MacPorts][4] 或 [Homebrew][5]。 + +另外,你也可以使用 Rust 的 Cargo 软件包管理器: + +``` +$ cargo install fd-find +``` + +### 使用 fd + +要做一个简单的搜索,运行 `fd` 并在后面跟上要搜索的名字,例如: + +``` +$ fd sh +registry/src/github.com-1ecc6299db9ec823/cc-1.0.67/src/bin/gcc-shim.rs +registry/src/github.com-1ecc6299db9ec823/exa-0.10.1/completions/completions.bash +registry/src/github.com-1ecc6299db9ec823/exa-0.10.1/completions/completions.fish +registry/src/github.com-1ecc6299db9ec823/exa-0.10.1/completions/completions.zsh +registry/src/github.com-1ecc6299db9ec823/exa-0.10.1/xtests/run.sh +registry/src/github.com-1ecc6299db9ec823/git2-0.13.18/src/stash.rs +registry/src/github.com-1ecc6299db9ec823/libc-0.2.94/src/unix/solarish +registry/src/github.com-1ecc6299db9ec823/libgit2-sys-0.12.19+1.1.0/libgit2/cmake/SelectHashes.cmake +registry/src/github.com-1ecc6299db9ec823/libgit2-sys-0.12.19+1.1.0/libgit2/include/git2/stash.h +registry/src/github.com-1ecc6299db9ec823/libgit2-sys-0.12.19+1.1.0/libgit2/include/git2/sys/hashsig.h +registry/src/github.com-1ecc6299db9ec823/libgit2-sys-0.12.19+1.1.0/libgit2/script/backport.sh +registry/src/github.com-1ecc6299db9ec823/libgit2-sys-0.12.19+1.1.0/libgit2/script/leaks.sh +registry/src/github.com-1ecc6299db9ec823/libgit2-sys-0.12.19+1.1.0/libgit2/script/valgrind.sh +registry/src/github.com-1ecc6299db9ec823/libgit2-sys-0.12.19+1.1.0/libgit2/src/config_snapshot.c +[...] +``` + +如果你想搜索一个特定的目录,可以将目录路径作为 `fd` 的第二个参数,例如: + +``` +$ fd passwd /etc +/etc/pam.d/passwd +/etc/passwd +/etc/passwd- +/etc/security/opasswd +``` + +要搜索一个特定的文件扩展名,使用 `-e` 作为选项。例如: + +``` +$ fd . '/home/ssur/exa' -e md +/home/ssur/exa/README.md +/home/ssur/exa/devtools/README.md +/home/ssur/exa/man/exa.1.md +/home/ssur/exa/man/exa_colors.5.md +/home/ssur/exa/xtests/README.md +$ +``` + +你也可以通过提供 `-x` 或 `-X` 来执行一个命令。 + + * `-x`/`--exec`:选项为每个搜索结果(并行)运行一个外部命令。 + * `-X`/`--exec-batch`:选项将所有搜索结果作为参数启动一次外部命令。 + +例如,要递归地找到所有的 ZIP 档案并解压: + +``` +$ fd -e zip -x unzip +``` + +或者,要列出某个特定目录下在过去 _n_ 天内改变的所有文件,使用`--changed-within` 选项: + +``` +$ fd . '/home/ssur/Work/' --changed-within 10d +/home/ssur/Work/wildfly/connector/src/main/java/org/jboss/as/connector/subsystems/data_sources/JdbcDriverAdd.java +/home/ssur/Work/wildfly/connector/src/main/java/org/jboss/as/connector/subsystems/data_sources/JdbcExample.java +[...] +``` + +而要搜索所有在特定天数之前被修改的文件,请使用 `--changed-before` _n_ 选项: + +``` +$ fd . '/home/ssur/Work/' --changed-before 365d +``` + +这里,`.` 作为一个(正则)通配符,指示 `fd` 返回所有文件。 + +要了解更多关于 `fd` 的功能,请查阅 GitHub 上的 [文档][2]。 + +### 总结 + +我特别喜欢 `fd` 的一点是,搜索模式默认是不区分大小写的,这使得它更容易找到东西,即使你对你要找的东西没有精确的认识。更好的是,如果模式包含一个大写的字符,它就会*自动*切换到大小写敏感。 + +另一个好处是,它使用颜色编码来突出不同的文件类型。 + +如果你已经在使用这个神奇的 Rust 工具,请在评论中告诉我们你的想法。 + +-------------------------------------------------------------------------------- + +via: https://opensource.com/article/21/6/fd-linux + +作者:[Sudeshna Sur][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/sudeshna-sur +[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://github.com/sharkdp/fd +[3]: https://repology.org/project/fd-find/versions +[4]: https://opensource.com/article/20/11/macports +[5]: https://opensource.com/article/20/6/homebrew-mac diff --git a/published/20210615 Listen to music on FreeDOS.md b/published/20210615 Listen to music on FreeDOS.md new file mode 100644 index 0000000000..cf546b1181 --- /dev/null +++ b/published/20210615 Listen to music on FreeDOS.md @@ -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] 的神秘博士:闪点行动Doctor Who: Flashpoint,并在我的 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 是一个单任务single-tasking操作系统),所以我不能将 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 没有花哨的用户界面,但你可以使用方向键将 文件选择器File Selector 导航到包含要播放的媒体文件的目录。 + +![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) diff --git a/published/20210617 Linux package management with dnf.md b/published/20210617 Linux package management with dnf.md new file mode 100644 index 0000000000..a2cb4a8853 --- /dev/null +++ b/published/20210617 Linux package management with dnf.md @@ -0,0 +1,177 @@ +[#]: subject: (Linux package management with dnf) +[#]: via: (https://opensource.com/article/21/6/dnf-linux) +[#]: author: (Seth Kenlon https://opensource.com/users/seth) +[#]: collector: (lujun9972) +[#]: translator: (hanszhao80) +[#]: reviewer: (wxy) +[#]: publisher: (wxy) +[#]: url: (https://linux.cn/article-14542-1.html) + +使用 dnf 进行 Linux 包管理 +====== + +> 了解如何在 Linux 上使用 `dnf` 命令安装软件包,然后下载我们的速查表,让正确的命令触手可及。 + +![](https://img.linux.net.cn/data/attachment/album/202205/04/101526nlsnpu34ppgscsch.jpg) + +在计算机系统上安装应用程序非常简单:就是将档案(如 `.zip` 文件)中的文件复制到目标计算机上,放在操作系统预期放应用程序的位置。因为我们中的许多人习惯于使用花哨的安装“向导”来帮助我们在计算机上安装软件,所以这个过程似乎在技术上应该比实际更复杂。 + +然而,复杂的是,是什么构成了一个程序?用户认为的单个应用程序实际上包含了分散在操作系统中的软件库的各种依赖代码(例如:Linux 上的 .so 文件、Windows 上的 .dll 文件和 macOS 上的 .dylib 文件)。 + +为了让用户不必担心这些程序代码之间的复杂的互相依赖关系, Linux 使用 包管理系统package management system 来跟踪哪些应用程序需要哪些库,哪些库或应用程序有安全或功能更新,以及每个软件会附带安装哪些额外的数据文件。包管理器本质上是一个安装向导。它们易于使用,提供了图形界面和基于终端的界面,让你的生活更轻松。你越了解你的发行版的包管理器,你的生活就会越轻松。 + +### 在 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`。有时,我已经确认我的系统上安装了一个应用程序;我只是不知道我是怎么得到它的。还有一些时候,我知道我安装了一个特定的软件包,但我不清楚这个软件包到底在我的系统上安装了什么。 + +如果你需要对包的有效负载payload进行 “逆向工程reverse engineer”,可以使用 `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` 命令。虽然我不喜欢它的所有子命令,但我发现它是目前最健壮的 包管理系统package management system 之一。 [下载我们的 dnf 速查表][5] 习惯该命令,不要害怕尝试一些新技巧。一旦熟悉了它,你可能会发现很难使用其他任何东西替代它。 + +> **[dnf 速查表][5]** + +-------------------------------------------------------------------------------- + +via: https://opensource.com/article/21/6/dnf-linux + +作者:[Seth Kenlon][a] +选题:[lujun9972][b] +译者:[hanszhao80](https://github.com/hanszhao80) +校对:[wxy](https://github.com/wxy) + +本文由 [LCTT](https://github.com/LCTT/TranslateProject) 原创编译,[Linux中国](https://linux.cn/) 荣誉推出 + +[a]: https://opensource.com/users/seth +[b]: https://github.com/lujun9972 +[1]: https://opensource.com/sites/default/files/styles/image-full-size/public/lead-images/brown-package-red-bow.jpg?itok=oxZYQzH- (Package wrapped with brown paper and red bow) +[2]: https://wiki.gnome.org/Apps/Software +[3]: https://opensource.com/sites/default/files/gnome-software.png (The GNOME Software app) +[4]: https://opensource.com/article/20/11/cockpit-server-management +[5]: https://opensource.com/downloads/dnf-cheat-sheet diff --git a/published/20210624 Linux package management with apt.md b/published/20210624 Linux package management with apt.md new file mode 100644 index 0000000000..719f02d766 --- /dev/null +++ b/published/20210624 Linux package management with apt.md @@ -0,0 +1,184 @@ +[#]: subject: (Linux package management with apt) +[#]: via: (https://opensource.com/article/21/6/apt-linux) +[#]: author: (Chris Hermansen https://opensource.com/users/clhermansen) +[#]: collector: (lujun9972) +[#]: translator: (hanszhao80) +[#]: reviewer: (wxy) +[#]: publisher: (wxy) +[#]: url: (https://linux.cn/article-14558-1.html) + +使用 apt 进行 Linux 包管理 +====== + +> 学习如何使用 apt 命令在基于 Debian 的 Linux 发行版上安装软件包,然后下载我们的速查表,让正确的命令触手可及。 + +![](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 +Original-Maintainer: Utopia Maintenance Team +Bugs: https://bugs.launchpad.net/ubuntu/+filebug +Installed-Size: 88.1 kB +Depends: cockpit-bridge (>= 238-1), cockpit-ws (>= 238-1), cockpit-system (>= 238-1) +Recommends: cockpit-storaged (>= 238-1), cockpit-networkmanager (>= 238-1), cockpit-packagekit (>= 238-1) +Suggests: cockpit-doc (>= 238-1), cockpit-pcp (>= 238-1), cockpit-machines (>= 238-1), xdg-utils +Homepage: https://cockpit-project.org/ +Download-Size: 21.3 kB +APT-Sources: http://ca.archive.ubuntu.com/ubuntu hirsute/universe amd64 Packages +Description: Web Console for Linux servers + The Cockpit Web Console enables users to administer GNU/Linux servers using a + web browser. + . + It offers network configuration, log inspection, diagnostic reports, SELinux + troubleshooting, interactive command-line sessions, and more. + +$ +``` + +特别要注意的是 `Description` 字段,它会告诉你更多关于应用程序的信息。`Depends` 字段说明还必须安装什么,而 `Recommends` 则显示建议安装的其他(如果有的话)合作组件。`Homepage` 字段会提供一个网址,通过它你可以了解更多。 + +### 哪个包提供的这个文件? + +有时你并不知道包名,但你知道包里一定包含着的某个文件。Seth 以 `qmake-qt5` 程序作为示例。使用 `apt search` 找不到它: + +``` +$ apt search qmake-qt5 +Sorting... Done +Full Text Search... Done +$ +``` + +但是,另一个有关联的命令 `apt-file` 可以用来探索包内部: + +``` +$ apt-file search qmake-qt5 +qt5-qmake-bin: /usr/share/man/man1/qmake-qt5.1.gz +$ +``` + +这时会显示一个 `qmake-qt5` 的手册页。它是一个名为 `qt5-qmake-bin` 的包的一部分。注意,此包名称颠倒了字符串 `qmake` 和 `qt5` 的顺序。 + +### 包里包含哪些文件? + +方便的 `apt-file` 命令会列出给定的包中包含哪些文件。例如: + +``` +$ apt-file list cockpit +cockpit: /usr/share/doc/cockpit/TODO.Debian +cockpit: /usr/share/doc/cockpit/changelog.Debian.gz +cockpit: /usr/share/doc/cockpit/copyright +cockpit: /usr/share/man/man1/cockpit.1.gz +cockpit: /usr/share/metainfo/cockpit.appdata.xml +cockpit: /usr/share/pixmaps/cockpit.png +$ +``` + +注意,这与 `apt show` 命令提供的信息不同,后者列出了包的依赖(其他必须安装的包)。 + +### 移除一个应用程序 + +你还可以使用 `apt` 移除软件包。例如,要移除`apt-file` 应用程序: + +``` +$ sudo apt purge apt-file +``` + +注意必须由超级用户运行 `apt` 才能安装或移除应用程序。 + +移除一个包并不会自动移除 `apt` 在此过程中安装的所有依赖项。不过,一点点的工作就很容易去除这些残留: + +``` +$ sudo apt autoremove +``` + +### 认识一下 apt + +正如 Seth 所写的,“你对包管理器的工作方式了解得越多,在需要安装和查询应用程序时就会越容易。” + +即便你不是 `apt` 的重度使用者,当你需要在命令行中安装或删除软件包时(例如,在一台远程服务器上或遵循某些热心肠发布的操作指南时),掌握一些 `apt` 的知识也会很有用。在某些软件创作者仅提供了一个裸 `.pkg` 文件的情况下,可能还需要了解一些关于 dpkg 的知识(如上所述)。 + +我发现 Synaptic 包管理器在我的桌面上是一个非常有用的工具,但出于各种目的,我也在少数维护的服务器上使用着 `apt`。 + +[下载我们的 apt 速查表][15] 习惯该命令并尝试一些新技巧。一旦你这样做了,你可能会发现很难再使用其他任何东西。 + +> **[apt 速查表][15]** + +-------------------------------------------------------------------------------- + +via: https://opensource.com/article/21/6/apt-linux + +作者:[Chris Hermansen][a] +选题:[lujun9972][b] +译者:[hanszhao80](https://github.com/hanszhao80) +校对:[wxy](https://github.com/wxy) + +本文由 [LCTT](https://github.com/LCTT/TranslateProject) 原创编译,[Linux中国](https://linux.cn/) 荣誉推出 + +[a]: https://opensource.com/users/clhermansen +[b]: https://github.com/lujun9972 +[1]: https://opensource.com/sites/default/files/styles/image-full-size/public/lead-images/bash_command_line.png?itok=k4z94W2U (bash logo on green background) +[2]: https://opensource.com/article/21/2/linux-package-management +[3]: https://linux.cn/article-14542-1.html +[4]: https://www.nongnu.org/synaptic/ +[5]: https://wiki.debian.org/Aptitude +[6]: https://wiki.debian.org/Teams/Dpkg +[7]: https://flatpak.org/ +[8]: https://snapcraft.io/ +[9]: https://wiki.gnome.org/Apps/Software +[10]: https://archlinux.org/ +[11]: https://www.gentoo.org/ +[12]: https://opensource.com/article/20/11/cockpit-server-management +[13]: mailto:ubuntu-devel-discuss@lists.ubuntu.com +[14]: mailto:pkg-utopia-maintainers@lists.alioth.debian.org +[15]: https://opensource.com/downloads/apt-cheat-sheet diff --git a/published/202107/20180416 Cgo and Python.md b/published/202107/20180416 Cgo and Python.md new file mode 100644 index 0000000000..dea1e2c230 --- /dev/null +++ b/published/202107/20180416 Cgo and Python.md @@ -0,0 +1,334 @@ +如何在 Go 中嵌入 Python +================== + +![](https://datadog-prod.imgix.net/img/blog/engineering/cgo-and-python/cgo_python_hero.png?auto=format&w=1900&dpr=1) + +如果你看一下 [新的 Datadog Agent][8],你可能会注意到大部分代码库是用 Go 编写的,尽管我们用来收集指标的检查仍然是用 Python 编写的。这大概是因为 Datadog Agent 是一个 [嵌入了][9] CPython 解释器的普通 Go 二进制文件,可以在任何时候按需执行 Python 代码。这个过程通过抽象层来透明化,使得你可以编写惯用的 Go 代码而底层运行的是 Python。 + +[视频](https://youtu.be/yrEi5ezq2-c) + +在 Go 应用程序中嵌入 Python 的原因有很多: + +* 它在过渡期间很有用;可以逐步将现有 Python 项目的部分迁移到新语言,而不会在此过程中丢失任何功能。 +* 你可以复用现有的 Python 软件或库,而无需用新语言重新实现。 +* 你可以通过加载去执行常规 Python 脚本来动态扩展你软件,甚至在运行时也可以。 + +理由还可以列很多,但对于 Datadog Agent 来说,最后一点至关重要:我们希望做到无需重新编译 Agent,或者说编译任何内容就能够执行自定义检查或更改现有检查。 + +嵌入 CPython 非常简单,而且文档齐全。解释器本身是用 C 编写的,并且提供了一个 C API 以编程方式来执行底层操作,例如创建对象、导入模块和调用函数。 + +在本文中,我们将展示一些代码示例,我们将会在与 Python 交互的同时继续保持 Go 代码的惯用语,但在我们继续之前,我们需要解决一个间隙:嵌入 API 是 C 语言,但我们的主要应用程序是 Go,这怎么可能工作? + +![](https://datadog-prod.imgix.net/img/blog/engineering/cgo-and-python/cgo_python_divider_1.png?auto=format&fit=max&w=847) + +### 介绍 cgo + +有 [很多好的理由][10] 说服你为什么不要在堆栈中引入 cgo,但嵌入 CPython 是你必须这样做的原因。[cgo][11] 不是语言,也不是编译器。它是 [外部函数接口][12]Foreign Function Interface(FFI),一种让我们可以在 Go 中使用来调用不同语言(特别是 C)编写的函数和服务的机制。 + +当我们提起 “cgo” 时,我们实际上指的是 Go 工具链在底层使用的一组工具、库、函数和类型,因此我们可以通过执行 `go build` 来获取我们的 Go 二进制文件。下面是使用 cgo 的示例程序: + +``` +package main + +// #include +import "C" +import "fmt" + +func main() { + fmt.Println("Max float value of float is", C.FLT_MAX) +} + +``` + +在这种包含头文件情况下,`import "C"` 指令上方的注释块称为“序言preamble”,可以包含实际的 C 代码。导入后,我们可以通过“C”伪包来“跳转”到外部代码,访问常量 `FLT_MAX`。你可以通过调用 `go build` 来构建,它就像普通的 Go 一样。 + +如果你想查看 cgo 在这背后到底做了什么,可以运行 `go build -x`。你将看到 “cgo” 工具将被调用以生成一些 C 和 Go 模块,然后将调用 C 和 Go 编译器来构建目标模块,最后链接器将所有内容放在一起。 + +你可以在 [Go 博客][13] 上阅读更多有关 cgo 的信息,该文章包含更多的例子以及一些有用的链接来做进一步了解细节。 + +现在我们已经了解了 cgo 可以为我们做什么,让我们看看如何使用这种机制运行一些 Python 代码。 + +![](https://datadog-prod.imgix.net/img/blog/engineering/cgo-and-python/cgo_python_divider_2.png?auto=format&fit=max&w=847) + +### 嵌入 CPython:一个入门指南 + +从技术上讲,嵌入 CPython 的 Go 程序并没有你想象的那么复杂。事实上,我们只需在运行 Python 代码之前初始化解释器,并在完成后关闭它。请注意,我们在所有示例中使用 Python 2.x,但我们只需做很少的调整就可以应用于 Python 3.x。让我们看一个例子: + +``` +package main + +// #cgo pkg-config: python-2.7 +// #include +import "C" +import "fmt" + +func main() { + C.Py_Initialize() + fmt.Println(C.GoString(C.Py_GetVersion())) + C.Py_Finalize() +} + +``` + +上面的例子做的正是下面 Python 代码要做的事: + +``` +import sys +print(sys.version) +``` + +你可以看到我们在序言加入了一个 `#cgo` 指令;这些指令被会被传递到工具链,让你改变构建工作流程。在这种情况下,我们告诉 cgo 调用 `pkg-config` 来收集构建和链接名为 `python-2.7` 的库所需的标志,并将这些标志传递给 C 编译器。如果你的系统中安装了 CPython 开发库和 pkg-config,你只需要运行 `go build` 来编译上面的示例。 + +回到代码,我们使用 `Py_Initialize()` 和 `Py_Finalize()` 来初始化和关闭解释器,并使用 `Py_GetVersion` C 函数来获取嵌入式解释器版本信息的字符串。 + +如果你想知道,所有我们需要放在一起调用 C 语言 Python API的 cgo 代码都是模板代码。这就是为什么 Datadog Agent 依赖 [go-python][14] 来完成所有的嵌入操作;该库为 C API 提供了一个 Go 友好的轻量级包,并隐藏了 cgo 细节。这是另一个基本的嵌入式示例,这次使用 go-python: + +``` +package main + +import ( + python "github.com/sbinet/go-python" +) + +func main() { + python.Initialize() + python.PyRun_SimpleString("print 'hello, world!'") + python.Finalize() +} + +``` + +这看起来更接近普通 Go 代码,不再暴露 cgo,我们可以在访问 Python API 时来回使用 Go 字符串。嵌入式看起来功能强大且对开发人员友好,是时候充分利用解释器了:让我们尝试从磁盘加载 Python 模块。 + +在 Python 方面我们不需要任何复杂的东西,无处不在的“hello world” 就可以达到目的: + +``` +# foo.py +def hello(): + """ + Print hello world for fun and profit. + """ + print "hello, world!" +``` + +Go 代码稍微复杂一些,但仍然可读: + +``` +// main.go +package main + +import "github.com/sbinet/go-python" + +func main() { + python.Initialize() + defer python.Finalize() + + fooModule := python.PyImport_ImportModule("foo") + if fooModule == nil { + panic("Error importing module") + } + + helloFunc := fooModule.GetAttrString("hello") + if helloFunc == nil { + panic("Error importing function") + } + + // The Python function takes no params but when using the C api + // we're required to send (empty) *args and **kwargs anyways. + helloFunc.Call(python.PyTuple_New(0), python.PyDict_New()) +} + +``` + +构建时,我们需要将 `PYTHONPATH` 环境变量设置为当前工作目录,以便导入语句能够找到 `foo.py` 模块。在 shell 中,该命令如下所示: + +``` +$ go build main.go && PYTHONPATH=. ./main +hello, world! +``` + +![](https://datadog-prod.imgix.net/img/blog/engineering/cgo-and-python/cgo_python_divider_3.png?auto=format&fit=max&w=847) + +### 可怕的全局解释器锁 + +为了嵌入 Python 必须引入 cgo ,这是一种权衡:构建速度会变慢,垃圾收集器不会帮助我们管理外部系统使用的内存,交叉编译也很难。对于一个特定的项目来说,这些问题是否是可以争论的,但我认为有一些不容商量的问题:Go 并发模型。如果我们不能从 goroutine 中运行 Python,那么使用 Go 就没有意义了。 + +在处理并发、Python 和 cgo 之前,我们还需要知道一些事情:它就是全局解释器锁Global Interpreter Lock,即 GIL。GIL 是语言解释器(CPython 就是其中之一)中广泛采用的一种机制,可防止多个线程同时运行。这意味着 CPython 执行的任何 Python 程序都无法在同一进程中并行运行。并发仍然是可能的,锁是速度、安全性和实现简易性之间的一个很好的权衡,那么,当涉及到嵌入时,为什么这会造成问题呢? + +当一个常规的、非嵌入式的 Python 程序启动时,不涉及 GIL 以避免锁定操作中的无用开销;在某些 Python 代码首次请求生成线程时 GIL 就启动了。对于每个线程,解释器创建一个数据结构来存储当前的相关状态信息并锁定 GIL。当线程完成时,状态被恢复,GIL 被解锁,准备被其他线程使用。 + +当我们从 Go 程序运行 Python 时,上述情况都不会自动发生。如果没有 GIL,我们的 Go 程序可以创建多个 Python 线程,这可能会导致竞争条件,从而导致致命的运行时错误,并且很可能出现分段错误导致整个 Go 应用程序崩溃。 + +解决方案是在我们从 Go 运行多线程代码时显式调用 GIL;代码并不复杂,因为 C API 提供了我们需要的所有工具。为了更好地暴露这个问题,我们需要写一些受 CPU 限制的 Python 代码。让我们将这些函数添加到前面示例中的 `foo.py` 模块中: + +``` +# foo.py +import sys + +def print_odds(limit=10): + """ + Print odds numbers < limit + """ + for i in range(limit): + if i%2: + sys.stderr.write("{}\n".format(i)) + +def print_even(limit=10): + """ + Print even numbers < limit + """ + for i in range(limit): + if i%2 == 0: + sys.stderr.write("{}\n".format(i)) + +``` + +我们将尝试从 Go 并发打印奇数和偶数,使用两个不同的 goroutine(因此涉及线程): + +``` +package main + +import ( + "sync" + + "github.com/sbinet/go-python" +) + +func main() { + // The following will also create the GIL explicitly + // by calling PyEval_InitThreads(), without waiting + // for the interpreter to do that + python.Initialize() + + var wg sync.WaitGroup + wg.Add(2) + + fooModule := python.PyImport_ImportModule("foo") + odds := fooModule.GetAttrString("print_odds") + even := fooModule.GetAttrString("print_even") + + // Initialize() has locked the the GIL but at this point we don't need it + // anymore. We save the current state and release the lock + // so that goroutines can acquire it + state := python.PyEval_SaveThread() + + go func() { + _gstate := python.PyGILState_Ensure() + odds.Call(python.PyTuple_New(0), python.PyDict_New()) + python.PyGILState_Release(_gstate) + + wg.Done() + }() + + go func() { + _gstate := python.PyGILState_Ensure() + even.Call(python.PyTuple_New(0), python.PyDict_New()) + python.PyGILState_Release(_gstate) + + wg.Done() + }() + + wg.Wait() + + // At this point we know we won't need Python anymore in this + // program, we can restore the state and lock the GIL to perform + // the final operations before exiting. + python.PyEval_RestoreThread(state) + python.Finalize() +} + +``` + +在阅读示例时,你可能会注意到一个模式,该模式将成为我们运行嵌入式 Python 代码的习惯写法: + +1. 保存状态并锁定 GIL。 +2. 执行 Python。 +3. 恢复状态并解锁 GIL。 + +代码应该很简单,但我们想指出一个微妙的细节:请注意,尽管借用了 GIL 执行,有时我们通过调用 `PyEval_SaveThread()` 和 `PyEval_RestoreThread()` 来操作 GIL,有时(查看 goroutines 里面)我们对 `PyGILState_Ensure()` 和 `PyGILState_Release()` 来做同样的事情。 + +我们说过当从 Python 操作多线程时,解释器负责创建存储当前状态所需的数据结构,但是当同样的事情发生在 C API 时,我们来负责处理。 + +当我们用 go-python 初始化解释器时,我们是在 Python 上下文中操作的。因此,当调用 `PyEval_InitThreads()` 时,它会初始化数据结构并锁定 GIL。我们可以使用 `PyEval_SaveThread()` 和 `PyEval_RestoreThread()` 对已经存在的状态进行操作。 + +在 goroutines 中,我们从 Go 上下文操作,我们需要显式创建状态并在完成后将其删除,这就是 `PyGILState_Ensure()` 和 `PyGILState_Release()` 为我们所做的。 + +![](https://datadog-prod.imgix.net/img/blog/engineering/cgo-and-python/cgo_python_divider_4.png?auto=format&fit=max&w=847) + +### 释放 Gopher + +在这一点上,我们知道如何处理在嵌入式解释器中执行 Python 的多线程 Go 代码,但在 GIL 之后,另一个挑战即将来临:Go 调度程序。 + +当一个 goroutine 启动时,它被安排在可用的 `GOMAXPROCS` 线程之一上执行,[参见此处][15] 可了解有关该主题的更多详细信息。如果一个 goroutine 碰巧执行了系统调用或调用 C 代码,当前线程会将线程队列中等待运行的其他 goroutine 移交给另一个线程,以便它们有更好的机会运行; 当前 goroutine 被暂停,等待系统调用或 C 函数返回。当这种情况发生时,线程会尝试恢复暂停的 goroutine,但如果这不可能,它会要求 Go 运行时找到另一个线程来完成 goroutine 并进入睡眠状态。 goroutine 最后被安排给另一个线程,它就完成了。 + +考虑到这一点,让我们看看当一个 goroutine 被移动到一个新线程时,运行一些 Python 代码的 goroutine 会发生什么: + +1. 我们的 goroutine 启动,执行 C 调用并暂停。GIL 被锁定。 +2. 当 C 调用返回时,当前线程尝试恢复 goroutine,但失败了。 +3. 当前线程告诉 Go 运行时寻找另一个线程来恢复我们的 goroutine。 +4. Go 调度器找到一个可用线程并恢复 goroutine。 +5. goroutine 快完成了,并在返回之前尝试解锁 GIL。 +6. 当前状态中存储的线程 ID 来自原线程,与当前线程的 ID 不同。 +7. 崩溃! + +所幸,我们可以通过从 goroutine 中调用运行时包中的 `LockOSThread` 函数来强制 Go runtime 始终保持我们的 goroutine 在同一线程上运行: + +``` +go func() { + runtime.LockOSThread() + + _gstate := python.PyGILState_Ensure() + odds.Call(python.PyTuple_New(0), python.PyDict_New()) + python.PyGILState_Release(_gstate) + wg.Done() +}() +``` + +这会干扰调度器并可能引入一些开销,但这是我们愿意付出的代价。 + +### 结论 + +为了嵌入 Python,Datadog Agent 必须接受一些权衡: + +* cgo 引入的开销。 +* 手动处理 GIL 的任务。 +* 在执行期间将 goroutine 绑定到同一线程的限制。 + +为了能方便在 Go 中运行 Python 检查,我们很乐意接受其中的每一项。但通过意识到这些权衡,我们能够最大限度地减少它们的影响,除了为支持 Python 而引入的其他限制,我们没有对策来控制潜在问题: + +* 构建是自动化和可配置的,因此开发人员仍然需要拥有与 `go build` 非常相似的东西。 +* Agent 的轻量级版本,可以使用 Go 构建标签,完全剥离 Python 支持。 +* 这样的版本仅依赖于在 Agent 本身硬编码的核心检查(主要是系统和网络检查),但没有 cgo 并且可以交叉编译。 + +我们将在未来重新评估我们的选择,并决定是否仍然值得保留 cgo;我们甚至可以重新考虑整个 Python 是否仍然值得,等待 [Go 插件包][16] 成熟到足以支持我们的用例。但就目前而言,嵌入式 Python 运行良好,从旧代理过渡到新代理再简单不过了。 + +你是一个喜欢混合不同编程语言的多语言者吗?你喜欢了解语言的内部工作原理以提高你的代码性能吗? + +-------------------------------------------------------------------------------- + +via: https://www.datadoghq.com/blog/engineering/cgo-and-python/ + +作者:[Massimiliano Pippi][a] +译者:[Zioyi](https://github.com/Zioyi) +校对:[wxy](https://github.com/wxy) + +本文由 [LCTT](https://github.com/LCTT/TranslateProject) 原创编译,[Linux中国](https://linux.cn/) 荣誉推出 + +[a]:https://github.com/masci +[1]:http://twitter.com/share?url=https://www.datadoghq.com/blog/engineering/cgo-and-python/ +[2]:http://www.reddit.com/submit?url=https://www.datadoghq.com/blog/engineering/cgo-and-python/ +[3]:https://www.linkedin.com/shareArticle?mini=true&url=https://www.datadoghq.com/blog/engineering/cgo-and-python/ +[4]:https://www.datadoghq.com/blog/category/under-the-hood +[5]:https://www.datadoghq.com/blog/tag/agent +[6]:https://www.datadoghq.com/blog/tag/golang +[7]:https://www.datadoghq.com/blog/tag/python +[8]:https://github.com/DataDog/datadog-agent/ +[9]:https://docs.python.org/2/extending/embedding.html +[10]:https://dave.cheney.net/2016/01/18/cgo-is-not-go +[11]:https://golang.org/cmd/cgo/ +[12]:https://en.wikipedia.org/wiki/Foreign_function_interface +[13]:https://blog.golang.org/c-go-cgo +[14]:https://github.com/sbinet/go-python +[15]:https://morsmachine.dk/go-scheduler +[16]:https://golang.org/pkg/plugin/ +[17]:https://www.datadoghq.com/careers/ diff --git a/published/202107/20180713 What-s the difference between a fork and a distribution.md b/published/202107/20180713 What-s the difference between a fork and a distribution.md new file mode 100644 index 0000000000..3cb7d0bd95 --- /dev/null +++ b/published/202107/20180713 What-s the difference between a fork and a distribution.md @@ -0,0 +1,77 @@ +分支与发行版有什么不同? +====== + +> 开源软件的发行版和分支是不一样的。了解其中的区别和潜在的风险。 + +![](https://img.linux.net.cn/data/attachment/album/202107/22/205518spblrgcpxrlnbibe.jpg) + +如果你们对开源软件有过一段时间的了解,一定曾在许多相关方面中听说过分支fork发行版distribution两个词。许多人对这两个词的区别不太清楚,因此我将试着通过这篇文章为大家解答这一疑惑。 + +(LCTT 译注:fork 一词,按我们之前的倡议,在版本控制工作流中,为了避免和同一个仓库的 branch 一词混淆,我们建议翻译为“复刻”。但是在项目和发行版这个语境下,没有这个混淆,惯例上还是称之为“分支”。) + +### 首先,一些定义 + +在解释分支与发行版两者的细微区别与相似之处之前,让我们先给一些相关的重要概念下定义。 + +**[开源软件][1]** 是指具有以下特点的软件: + + * 在特定的 [许可证][2] 限制下,软件供所有人免费分发 + * 在特定的许可证限制下,软件源代码可以供所有人查看与修改 + +开源软件可以按以下方式 **使用**: + + * 以二进制或者源代码的方式下载,通常是免费的。(例如,[Eclipse 开发者环境][3]) + * 作为一个商业公司的产品,有时向用户提供一些服务并以此收费。(例如,[红帽产品][4]) + * 嵌入在专有的软件解决方案中。(例如一些智能手机和浏览器用于显示字体的 [Freetype 软件][5]) + +自由开源软件free and open source software(FOSS)不一定是“零成本”的“免费free”。自由开源软件仅仅意味着这个软件在遵守软件许可证的前提下可以自由地分发、修改、研究和使用。软件分发者也可能为该软件定价。例如,Linux 可以是 Fedora、Centos、Gentoo 等免费发行版,也可以是付费的发行版,如红帽企业版 Linux(RHEL)、SUSE Linux 企业版(SLES)等。 + +社区community指的是在一个开源项目上协作的团体或个人。任何人或者团体都可以在遵守协议的前提下,通过编写或审查代码/文档/测试套件、管理会议、更新网站等方式为开源项目作出贡献。例如,在 [Openhub.net][6] 网站上,我们可以看见政府、非营利性机构、商业公司和教育团队等组织都在 [为一些开源项目作出贡献][7]。 + +一个开源项目project是集协作开发、文档和测试的结果。大多数项目都搭建了一个中央仓库用来存储代码、文档、测试文件和目前正在开发的文件。 + +发行版distribution是指开源项目的一份的二进制或源代码的副本。例如,CentOS、Fedora、红帽企业版 Linux(RHEL)、SUSE Linux、Ubuntu 等都是 Linux 项目的发行版。Tectonic、谷歌的 Kubernetes 引擎(GKE)、亚马逊的容器服务和红帽的 OpenShift 都是 Kubernetes 项目的发行版。 + +开源项目的商业发行版经常被称作产品products,因此,红帽 OpenStack 平台是红帽 OpenStack 的产品,它是 OpenStack 上游项目的一个发行版,并且是百分百开源的。 + +主干trunk是开发开源项目的社区的主要工作流。 + +开源分支fork
是开源项目主干的一个版本,它是分离自主干的独立工作流。 + +因此,**发行版并不等同于分支**。发行版是上游项目的一种包装,由厂商提供,经常作为产品进行销售。然而,发行版的核心代码和文档与上游项目的版本保持一致。分支,以及任何基于分支的的发行版,导致代码和文档的版本与上游项目不同。对上游项目进行了分支的用户必须自己来维护分支项目,这意味着他们失去了上游社区协同工作带来的好处。 + +为了进一步解释软件分支,让我来用动物迁徙作比喻。鲸鱼和海狮从北极迁徙到加利福尼亚和墨西哥;帝王斑蝶从阿拉斯加迁徙到墨西哥;并且北半球的燕子和许多其他鸟类飞翔南方去过冬。成功迁徙的关键因素在于,团队中的所有动物团结一致,紧跟领导者,找到食物和庇护所,并且不会迷路。 + +### 独立前行带来的风险 + +一只鸟、帝王蝶或者鲸鱼一旦掉队就失去了许多优势,例如团队带来的保护,以及知道哪儿有食物、庇护所和目的地。 + +相似地,从上游版本获取分支并且独立维护的用户和组织也存在以下风险: + + 1. **由于代码不同,分支用户不能够基于上游版本更新代码。** 这就是大家熟知的技术债,对分支的代码修改的越多,将这一分支重新归入上游项目需要花费的时间和金钱成本就越高。 + 2. **分支用户有可能运行不太安全的代码。** 由于代码不同的原因,当开源代码的漏洞被找到,并且被上游社区修复时,分支版本的代码可能无法从这次修复中受益。 + 3. **分支用户可能不会从新特性中获益。** 拥有众多组织和个人支持的上游版本,将会创建许多符合所有上游项目用户利益的新特性。如果一个组织从上游分支,由于代码不同,它们可能无法纳入新的功能。 + 4. **它们可能无法和其他软件包整合在一起。** 开源项目很少是作为单一实体开发的;相反地,它们经常被与其他项目打包在一起构成一套解决方案。分支代码可能无法与其他项目整合,因为分支代码的开发者没有与上游的其他参与者们合作。 + 5. **它们可能不会得到硬件平台认证。** 软件包通常被搭载在硬件平台上进行认证,如果有问题发生,硬件与软件工作人员可以合作找出并解决问题发生的根源。 + +总之,开源发行版只是一个来自上游的、多组织协同开发的、由供应商销售与支持的打包集合。分支是一个开源项目的独立开发工作流,有可能无法从上游社区协同工作的结果中受益。 + +-------------------------------------------------------------------------------- + +via: https://opensource.com/article/18/7/forks-vs-distributions + +作者:[Jonathan Gershater][a] +选题:[lujun9972](https://github.com/lujun9972) +译者:[Wlzzzz-del](https://github.com/Wlzzzz-del) +校对:[wxy](https://github.com/wxy) + +本文由 [LCTT](https://github.com/LCTT/TranslateProject) 原创编译,[Linux中国](https://linux.cn/) 荣誉推出 + +[a]:https://opensource.com/users/jgershat +[1]:https://opensource.com/resources/what-open-source +[2]:https://opensource.com/tags/licensing +[3]:https://www.eclipse.org/che/getting-started/download/ +[4]:https://access.redhat.com/downloads +[5]:https://www.freetype.org/ +[6]:http://openhub.net +[7]:https://www.openhub.net/explore/orgs diff --git a/published/202107/20190807 Trace code in Fedora with bpftrace.md b/published/202107/20190807 Trace code in Fedora with bpftrace.md new file mode 100644 index 0000000000..8a1c67ba8b --- /dev/null +++ b/published/202107/20190807 Trace code in Fedora with bpftrace.md @@ -0,0 +1,200 @@ +[#]: collector: (lujun9972) +[#]: translator: (YungeG) +[#]: reviewer: (wxy) +[#]: publisher: (wxy) +[#]: url: (https://linux.cn/article-13632-1.html) +[#]: subject: (Trace code in Fedora with bpftrace) +[#]: via: (https://fedoramagazine.org/trace-code-in-fedora-with-bpftrace/) +[#]: author: (Augusto Caringi https://fedoramagazine.org/author/acaringi/) + +在 Fedora 中用 bpftrace 追踪代码 +====== + +![](https://img.linux.net.cn/data/attachment/album/202107/29/222633wjln78my68exj7x9.jpg) + +bpftrace 是一个 [基于 eBPF 的新型追踪工具][2],在 Fedora 28 第一次引入。Brendan Gregg、Alastair Robertson 和 Matheus Marchini 在网上的一个松散的黑客团队的帮助下开发了 bpftrace。它是一个允许你分析系统在幕后正在执行的操作的追踪工具,可以告诉你代码中正在被调用的函数、传递给函数的参数、函数的调用次数等。 + +这篇文章的内容涉及了 bpftrace 的一些基础,以及它是如何工作的,请继续阅读获取更多的信息和一些有用的实例。 + +### eBPF(扩展的伯克利数据包过滤器extended Berkeley Packet Filter) + +[eBPF][3] 是一个微型虚拟机,更确切的说是一个位于 Linux 内核中的虚拟 CPU。eBPF 可以在内核空间以一种安全可控的方式加载和运行小型程序,使得 eBPF 的使用更加安全,即使在生产环境系统中。eBPF 虚拟机有自己的指令集架构([ISA][4]),类似于现代处理器架构的一个子集。通过这个 ISA,可以很容易将 eBPF 程序转化为真实硬件上的代码。内核即时将程序转化为主流处理器架构上的本地代码,从而提升性能。 + +eBPF 虚拟机允许通过编程扩展内核,目前已经有一些内核子系统使用这一新型强大的 Linux 内核功能,比如网络、安全计算、追踪等。这些子系统的主要思想是添加 eBPF 程序到特定的代码点,从而扩展原生的内核行为。 + +虽然 eBPF 机器语言功能强大,由于是一种底层语言,直接用于编写代码很费力,bpftrace 就是为了解决这个问题而生的。eBPF 提供了一种编写 eBPF 追踪脚本的高级语言,然后在 clang / LLVM 库的帮助下将这些脚本转化为 eBPF,最终添加到特定的代码点。 + +### 安装和快速入门 + +在终端 [使用][5] [sudo][5] 执行下面的命令安装 bpftrace: + +``` +$ sudo dnf install bpftrace +``` + +使用“hello world”进行实验: + +``` +$ sudo bpftrace -e 'BEGIN { printf("hello world\n"); }' +``` + +注意,出于特权级的需要,你必须使用 root 运行 `bpftrace`,使用 `-e` 选项指明一个程序,构建一个所谓的“单行程序”。这个例子只会打印 “hello world”,接着等待你按下 `Ctrl+C`。 + +`BEGIN` 是一个特殊的探针名,只在执行一开始生效一次;每次探针命中时,大括号 `{}` 内的操作(这个例子中只是一个 `printf`)都会执行。 + +现在让我们转向一个更有用的例子: + +``` +$ sudo bpftrace -e 't:syscalls:sys_enter_execve { printf("%s called %s\n", comm, str(args->filename)); }' +``` + +这个例子打印了父进程的名字(`comm`)和系统中正在创建的每个新进程的名称。`t:syscalls:sys_enter_execve` 是一个内核追踪点,是 `tracepoint:syscalls:sys_enter_execve` 的简写,两种形式都可以使用。下一部分会向你展示如何列出所有可用的追踪点。 + +`comm` 是一个 bpftrace 内建指令,代表进程名;`filename` 是 `t:syscalls:sys_enter_execve` 追踪点的一个字段,这些字段可以通过 `args` 内建指令访问。 + +追踪点的所有可用字段可以通过这个命令列出: + +``` +bpftrace -lv "t:syscalls:sys_enter_execve" +``` + +### 示例用法 + +#### 列出探针 + +`bpftrace` 的一个核心概念是探针点probe point,即 eBPF 程序可以连接到的(内核或用户空间的)代码中的测量点,可以分成以下几大类: + + * `kprobe`——内核函数的开始处 + * `kretprobe`——内核函数的返回处 + * `uprobe`——用户级函数的开始处 + * `uretprobe`——用户级函数的返回处 + * `tracepoint`——内核静态追踪点 + * `usdt`——用户级静态追踪点 + * `profile`——基于时间的采样 + * `interval`——基于时间的输出 + * `software`——内核软件事件 + * `hardware`——处理器级事件 + +所有可用的 `kprobe` / `kretprobe`、`tracepoints`、`software` 和 `hardware` 探针可以通过这个命令列出: + +``` +$ sudo bpftrace -l +``` + +`uprobe` / `uretprobe` 和 `usdt` 是用户空间探针,专用于某个可执行文件。要使用这些探针,通过下文中的特殊语法。 + +`profile` 和 `interval` 探针以固定的时间间隔触发;固定的时间间隔不在本文的范畴内。 + +#### 统计系统调用数 + +**映射** 是保存计数、统计数据和柱状图的特殊 BPF 数据类型,你可以使用映射统计每个系统调用正在被调用的次数: + +``` +$ sudo bpftrace -e 't:syscalls:sys_enter_* { @[probe] = count(); }' +``` + +一些探针类型允许使用通配符匹配多个探针,你也可以使用一个逗号隔开的列表为一个操作块指明多个连接点。上面的例子中,操作块连接到了所有名称以 `t:syscalls:sysenter_` 开头的追踪点,即所有可用的系统调用。 + +`bpftrace` 的内建函数 `count()` 统计系统调用被调用的次数;`@[]` 代表一个映射(一个关联数组)。该映射的键 `probe` 是另一个内建指令,代表完整的探针名。 + +这个例子中,相同的操作块连接到了每个系统调用,之后每次有系统调用被调用时,映射就会被更新,映射中和系统调用对应的项就会增加。程序终止时,自动打印出所有声明的映射。 + +下面的例子统计所有的系统调用,然后通过 `bpftrace` 过滤语法使用 PID 过滤出某个特定进程调用的系统调用: + +``` +$ sudo bpftrace -e 't:syscalls:sys_enter_* / pid == 1234 / { @[probe] = count(); }' +``` + +#### 进程写的字节数 + +让我们使用上面的概念分析每个进程正在写的字节数: + +``` +$ sudo bpftrace -e 't:syscalls:sys_exit_write /args->ret > 0/ { @[comm] = sum(args->ret); }' +``` + +`bpftrace` 连接操作块到写系统调用的返回探针(`t:syscalls:sys_exit_write`),然后使用过滤器丢掉代表错误代码的负值(`/arg->ret > 0/`)。 + +映射的键 `comm` 代表调用系统调用的进程名;内建函数 `sum()` 累计每个映射项或进程写的字节数;`args` 是一个 `bpftrace` 内建指令,用于访问追踪点的参数和返回值。如果执行成功,`write` 系统调用返回写的字节数,`arg->ret` 用于访问这个字节数。 + +#### 进程的读取大小分布(柱状图): + +`bpftrace` 支持创建柱状图。让我们分析一个创建进程的 `read` 大小分布的柱状图的例子: + +``` +$ sudo bpftrace -e 't:syscalls:sys_exit_read { @[comm] = hist(args->ret); }' +``` + +柱状图是 BPF 映射,因此必须保存为一个映射(`@`),这个例子中映射键是 `comm`。 + +这个例子使 `bpftrace` 给每个调用 `read` 系统调用的进程生成一个柱状图。要生成一个全局柱状图,直接保存 `hist()` 函数到 `@`(不使用任何键)。 + +程序终止时,`bpftrace` 自动打印出声明的柱状图。创建柱状图的基准值是通过 _args->ret_ 获取到的读取的字节数。 + +#### 追踪用户空间程序 + +你也可以通过 `uprobes` / `uretprobes` 和 USDT(用户级静态定义的追踪)追踪用户空间程序。下一个例子使用探测用户级函数结尾处的 `uretprobe` ,获取系统中运行的每个 `bash` 发出的命令行: + +``` +$ sudo bpftrace -e 'uretprobe:/bin/bash:readline { printf("readline: \"%s\"\n", str(retval)); }' +``` + +要列出可执行文件 `bash` 的所有可用 `uprobes` / `uretprobes`, 执行这个命令: + +``` +$ sudo bpftrace -l "uprobe:/bin/bash" +``` + +`uprobe` 指向用户级函数执行的开始,`uretprobe` 指向执行的结束(返回处);`readline()` 是 `/bin/bash` 的一个函数,返回键入的命令行;`retval` 是被探测的指令的返回值,只能在 `uretprobe` 访问。 + +使用 `uprobes` 时,你可以用 `arg0..argN` 访问参数。需要调用 `str()` 将 `char *` 指针转化成一个字符串。 + +### 自带脚本 + +`bpftrace` 软件包附带了许多有用的脚本,可以在 `/usr/share/bpftrace/tools/` 目录找到。 + +这些脚本中,你可以找到: + + * `killsnoop.bt`——追踪 `kill()` 系统调用发出的信号 + * `tcpconnect.bt`——追踪所有的 TCP 网络连接 + * `pidpersec.bt`——统计每秒钟(通过 `fork`)创建的新进程 + * `opensnoop.bt`——追踪 `open()` 系统调用 + * `bfsstat.bt`——追踪一些 VFS 调用,按秒统计 + +你可以直接使用这些脚本,比如: + +``` +$ sudo /usr/share/bpftrace/tools/killsnoop.bt +``` + +你也可以在创建新的工具时参考这些脚本。 + +### 链接 + + * bpftrace 参考指南—— + * Linux 2018 `bpftrace`(DTrace 2.0)—— + * BPF:通用的内核虚拟机—— + * Linux Extended BPF(eBPF)Tracing Tools—— + * 深入 BPF:一个阅读材料列表—— [https://qmonnet.github.io/whirl-offload/2016/09/01/dive-into-bpf][6] + +-------------------------------------------------------------------------------- + +via: https://fedoramagazine.org/trace-code-in-fedora-with-bpftrace/ + +作者:[Augusto Caringi][a] +选题:[lujun9972][b] +译者:[YungeG](https://github.com/YungeG) +校对:[wxy](https://github.com/wxy) + +本文由 [LCTT](https://github.com/LCTT/TranslateProject) 原创编译,[Linux中国](https://linux.cn/) 荣誉推出 + +[a]: https://fedoramagazine.org/author/acaringi/ +[b]: https://github.com/lujun9972 +[1]: https://fedoramagazine.org/wp-content/uploads/2019/08/bpftrace-816x345.jpg +[2]: https://github.com/iovisor/bpftrace +[3]: https://lwn.net/Articles/740157/ +[4]: https://github.com/iovisor/bpf-docs/blob/master/eBPF.md +[5]: https://fedoramagazine.org/howto-use-sudo/ +[6]: https://qmonnet.github.io/whirl-offload/2016/09/01/dive-into-bpf/ +[7]: https://unsplash.com/@wehavemegapixels?utm_source=unsplash&utm_medium=referral&utm_content=creditCopyText +[8]: https://unsplash.com/search/photos/trace?utm_source=unsplash&utm_medium=referral&utm_content=creditCopyText diff --git a/published/202107/20200210 Music composition with Python and Linux.md b/published/202107/20200210 Music composition with Python and Linux.md new file mode 100644 index 0000000000..ca457a139a --- /dev/null +++ b/published/202107/20200210 Music composition with Python and Linux.md @@ -0,0 +1,107 @@ +[#]: collector: (lujun9972) +[#]: translator: (stevenzdg988) +[#]: reviewer: (wxy) +[#]: publisher: (wxy) +[#]: url: (https://linux.cn/article-13547-1.html) +[#]: subject: (Music composition with Python and Linux) +[#]: via: (https://opensource.com/article/20/2/linux-open-source-music) +[#]: author: (Alan Formy-Duval https://opensource.com/users/alanfdoss) + +“MAGFest 先生”专访:用 Python 和 Linux 进行音乐创作 +====== + +> 与 “MAGFest 先生” Brendan Becker 的对话。 + +![](https://img.linux.net.cn/data/attachment/album/202107/04/174833k7uvo4l5vov7umv4.jpg) + +1999 年,我在一家计算机商店工作时遇到了 Brendan Becker。我们都喜欢构建定制计算机并在其上安装 Linux。Brendan 一直在同时参与着从游戏编程到音乐创作的多个技术项目。从那之后快进几年,他继续编写 [pyDance][2],这是一个多舞种游戏的开源实现,然后成为了音乐和游戏项目 [MAGFest][3] 的 CEO。他有时被称为 “MAGFest 先生”,因为他是该项目的负责人,Brendan 现在使用的音乐笔名是 “[Inverse Phase][4]”,是一位电子合音chiptune(主要在 8 位计算机和游戏机上创作的音乐)作曲家。 + +我认为采访并询问他在整个职业生涯中如何从 Linux 和开源软件中受益的一些细节会很有趣。 + +![Inverse Phase 表演照片][5] + +### 你是如何开始接触计算机和软件的? + +Brendan Becker:从我记事起,我家就有一台电脑。我父亲热衷于技术;在康柏便携式电脑刚刚上市时,他就带了一台回家,当他不在上面工作时,我就可以使用它。由于我两岁时就开始阅读,使用电脑就成了我的第二天性——只要阅读磁盘上的内容,按照说明进行操作,我就可以玩游戏了!有时我会玩一些学习和教育软件,我们有几张装满游戏的磁盘,我可以在其他时间玩。我记得有一张磁盘,里面有一些流行游戏的免费副本。后来,我父亲向我展示了我们可以呼叫其他计算机(我 5 岁时就上了 BBS!),我看到了一些游戏来自那儿。我喜欢玩的一款游戏是用 BASIC 编写的,当我意识到我可以简单地修改游戏,只需阅读一些内容并重新输入它们游戏就会更轻松,玩游戏就没意思了。 + +### 这是上世纪 80 年代? + +Becker:康柏便携式电脑于 1983 年推出,这可以给你一些参考。我爸爸有一个那个型号的初代产品。 + +### 你是如何进入 Linux 和开源软件的? + +Becker:在上世纪 90 年代初,我酷爱 MOD 和演示场景demoscene之类的东西,我注意到 Walnut Creek(即 [cdrom.com][6];现已解散)在 FreeBSD 上开设了商店。总的来说,我对 Unix 和其他操作系统非常好奇,但没有太多的第一手资料,我认为是时候尝试一些东西了。当时 DOOM 刚刚发布,有人告诉我,我可以试着在计算机上运行它。在这与能够运行很酷的互联网服务器之间,我开始陷入两难取舍。有人看到我在阅读有关 FreeBSD 的文章,并建议我了解一下 Linux,这是一个为 x86 重新编写的新操作系统,与 BSD 不同,(他们说)后者存在一些兼容性问题。因此,我加入了 undernet IRC 上的 #linuxhelp 频道,询问如何开始使用 Linux,并表明我已经做了一些研究(我已经能问出 “Red Hat 和 Slackware 之间有什么区别?”这样的问题),想知道什么是最容易使用的。频道里唯一说话的人说他已经 13 岁了,他都能弄明白 Slackware,所以我应该不会有问题。学校的一个数学老师给了我一个硬盘,我下载了 “A” 盘组和一个启动盘,写入到软盘,安装了它,回头看也并没有花太多时间。 + +### 你是如何被称为 “MAGFest 先生”的? + +Becker:嗯,这个很简单。在第一个活动后,我几乎立即成为了 MAGFest 的代理负责人。前任主席都各奔东西,我向负责人要求不要取消活动。解决方案就是自己运营它,当我慢慢地将项目塑造成我自己的时,这个昵称就成了我的。 + +### 我记得我在早期参加过,MAGFest 最终变得有多大? + +Becker:第一届 MAGFest 是 265 人。现在它超大,有两万多名不同的参与者。 + +### 太棒了!你能简要描述一下 MAGFest 大会吗? + +Becker:我的一个朋友 Hex 描述得非常好。他说:“就像是和你所有的朋友一起举办这个以电子游戏为主题的生日派对,那里恰好有几千人,如果你愿意,他们都可以成为你的朋友,然后还有摇滚音乐会。” 这很快被采用并缩短为 “这是一个为期四天的电子游戏派对,有多场电子游戏摇滚音乐会”。通常 “音乐和游戏节” 这句话就能让人们明白这个意思。 + +### 你是如何利用开源软件来运行 MAGFest 的? + +Becker:当我成为 MAGFest 的负责人时,我已经用 Python 编写了一个游戏,所以我觉得用 Python 编写我们的注册系统最舒服。这是一个非常轻松的决定,因为不涉及任何费用,而且我已经有了经验。后来,我们的在线注册系统和拼车界面都是用 PHP/MySQL 编写的,我们的论坛使用了 Kboard。最终,这发展到我们用 Python 从头开始编写了自己的注册系统,我们也在活动中使用它,并在主网站上运行 Drupal。有一次,我还用 Python 编写了一个系统来管理视频室和邀请比赛站。哦,我们有一些游戏音乐收听站,你可以翻阅标志性的游戏 OST(原始音轨)的曲目和简介,和演奏 MAGFest 的乐队。 + +### 我知道几年前你减少了你在 MAGFest 的职责,去追求新的项目。你接下来的努力是什么? + +Becker:我一直非常投入游戏音乐领域,并试图将尽可能多的音乐带到 MAGFest 中。随着我越来越多地成为这些社区的一部分,我想参与其中。我使用以前用过的自由开源版本的 DOS 和 Windows 演示场景工具编写了一些视频游戏曲调的混合曲、封面和编曲,我以前使用过的这种工具也是免费的,但不一定是开源的。我在运行 MAGFest 的最初几年发布了一些曲目,然后在 Jake Kaufman(也被称为 `virt`;在他的简历之外也叫 Shovel Knight 和 Shantae)的一些严厉的关爱和建议之后,我改变主题到我更擅长的电子和音。尽管我小时候就用我的康柏便携式电脑编写了 PC 扬声器发出的哔哔啵啵声,并在 90 年代的演示场景中写过 MOD 文件,但我在 2006 年发布了第一首 NES 规格的曲目,我真的能很自豪地称之为我自己的作品。随后还有几张流行音乐的作品和专辑。 + +2010 年,有很多人找我做游戏配乐工作。尽管配乐工作对它没有太大影响,但我开始更认真地缩减我在 MAGFest 的一些职责,并且在 2011 年,我决定更多地进入幕后。我会留在董事会担任顾问,帮助人们了解他们需要什么来管理他们的部门,但我不再掌舵了。与此同时,我的兼职工作,即给我支付账单的工作,解雇了他们所有的工人,我突然发现自己有了很多空闲时间。我开始写《 Pretty Eight Machine》,这是一首向《Nine Inch Nails》致敬的作品,我在这个事情和游戏配乐工作之间花了一年多,我向自己证明了我可以用音乐来(即便只是勉强)维持生计,这就是我接下来想做的。 + +![Inverse Phase CTM Tracker][7] + +*版权所有 Inverse Phase,经许可使用。* + +### 就硬件和软件而言,你的工作空间是什么样的? + +Becker:在我的 DOS/Windows 时代,我主要使用 FastTracker 2。在 Linux 中,我将其替换为 SoundTracker(不是 Karsten Obarski 的原始版本,而是 GTK 重写版本;参见 [soundtracker.org][8])。近来,SoundTracker 处于不断变化的状态——虽然我仍然需要尝试新的 GTK3 版本——但是当我无法使用 SoundTracker 时,[MilkyTracker][9] 是一个很好的替代品。如果我真的需要原版 FastTracker 2,虽然老旧但它也可以在 DOSBox 中运行起来。然而,那是我开始使用 Linux 的时候,所以这是我在 20-25 年前发现的东西。 + +在过去的十年里,我已经从基于采样的音乐转向了电子和音,这是由来自 8 位和 16 位游戏系统和计算机的旧声音芯片合成的音乐。有一个非常好的跨平台工具叫 [Deflemask][10],可以为许多这些系统编写音乐。不过,我想为其创作音乐的一些系统不受支持,而且 Deflemask 是闭源的,因此我已经开始使用 Python 和 [Pygame][11] 从头开始构建自己的音乐创作环境。我使用 Git 维护我的代码树,并将使用开源的 [KiCad][12] 控制硬件合成器板。 + +### 你目前专注于哪些项目? + +Becker:我断断续续地从事于游戏配乐和音乐委托工作。在此期间,我还一直致力于创办一个名为 [Bloop][13] 的电子娱乐博物馆。我们在档案和库存方面做了很多很酷的事情,但也许最令人兴奋的是我们一直在用树莓派构建展览。它们的用途非常广泛,而且我觉得很奇怪,如果我在十年前尝试这样做,我就不会有可以驱动我的展品的小型单板计算机;我可能会用把一个平板固定在笔记本电脑的背面! + +### 现在有更多游戏平台进入 Linux,例如 Steam、Lutris 和 Play-on-Linux。你认为这种趋势会持续下去吗?这些会一直存在吗? + +Becker:作为一个在 Linux 上玩了 25 年游戏的人——事实上,我 _是因为_ 游戏才接触 Linux 的——我想我认为这个问题比大多数人认为的更艰难。我已经玩了 Linux 原生游戏几十年了,我甚至不得不对收回我当年说的“要么存在 Linux 解决方案,要么编写出来”这样的话,但最终,我做到了,我编写了一个 Linux 游戏。 + +说实话:Android 问世于 2008 年。如果你在 Android 上玩过游戏,那么你就在 Linux 上玩过游戏。Steam 在 Linux 已经八年了。Steambox/SteamOS 发布在 Steam 发布一年后。我没有听到太多 Lutris 或 Play-on-Linux 的消息,但我知道它们并希望它们成功。我确实看到 GOG 的追随者非常多,我认为这非常好。我看到很多来自 Ryan Gordon(icculus)和 Ethan Lee(flibitijibibo)等人的高质量游戏移植,甚至有些公司在内部移植。Unity 和 Unreal 等游戏引擎已经支持 Linux。Valve 已经将 Proton 纳入 Linux 版本的 Steam 已有两年左右的时间了,所以现在 Linux 用户甚至不必搜索他们游戏的 Linux 原生版本。 + +我可以说,我认为大多数游戏玩家期待并将继续期待他们已经从零售游戏市场获得的支持水平。就我个人而言,我希望这个水平是增长而不是下降! + +_详细了解 Brendan 的 [Inverse Phase][14] 工作。_ + +-------------------------------------------------------------------------------- + +via: https://opensource.com/article/20/2/linux-open-source-music + +作者:[Alan Formy-Duval][a] +选题:[lujun9972][b] +译者:[stevenzdg988](https://github.com/stevenzdg988) +校对:[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/rh_003499_01_other21x_cc.png?itok=JJJ5z6aB (Wires plugged into a network switch) +[2]: http://icculus.org/pyddr/ +[3]: http://magfest.org/ +[4]: http://www.inversephase.com/ +[5]: https://opensource.com/sites/default/files/uploads/inverse_phase_performance_bw.png (Inverse Phase performance photo) +[6]: https://en.wikipedia.org/wiki/Walnut_Creek_CDROM +[7]: https://opensource.com/sites/default/files/uploads/inversephase_ctm_tracker_screenshot.png (Inverse Phase CTM Tracker) +[8]: http://soundtracker.org +[9]: http://www.milkytracker.org +[10]: http://www.deflemask.com +[11]: http://www.pygame.org +[12]: http://www.kicad-pcb.org +[13]: http://bloopmuseum.com +[14]: https://www.inversephase.com diff --git a/published/202107/20200428 Learn Bash with this book of puzzles.md b/published/202107/20200428 Learn Bash with this book of puzzles.md new file mode 100644 index 0000000000..532a58dc4a --- /dev/null +++ b/published/202107/20200428 Learn Bash with this book of puzzles.md @@ -0,0 +1,61 @@ +[#]: collector: (lujun9972) +[#]: translator: (baddate) +[#]: reviewer: (wxy) +[#]: publisher: (wxy) +[#]: url: (https://linux.cn/article-13544-1.html) +[#]: subject: (Learn Bash with this book of puzzles) +[#]: via: (https://opensource.com/article/20/4/bash-it-out-book) +[#]: author: (Carlos Aguayo https://opensource.com/users/hwmaster1) + +《Bash it out》书评:用这本谜题书学习 Bash +====== + +> 《Bash it out》使用 16 个谜题,涵盖了基本、中级和高级 Bash 脚本。 + +![](https://img.linux.net.cn/data/attachment/album/202107/03/154134jgm2m82o76mrm2o7.jpg) + +计算机既是我的爱好,也是我的职业。我的公寓里散布着大约 10 台计算机,它们都运行 Linux(包括我的 Mac)。由于我喜欢升级我的电脑和提升我的电脑技能,当我遇到 Sylvain Leroux 的《[Bash it out][2]》时,我抓住了购买它的机会。我在 Debian Linux 上经常使用命令行,这似乎是扩展我的 Bash 知识的好机会。当作者在前言中解释他使用 Debian Linux 时,我笑了,这是我最喜欢的两个发行版之一。 + +Bash 可让你自动执行任务,因此它是一种省力、有趣且有用的工具。在阅读本书之前,我已经有相当多的 Unix 和 Linux 上的 Bash 经验。我不是专家,部分原因是脚本语言非常广泛和强大。当我在基于 Arch 的 Linux 发行版 [EndeavourOS][3] 的欢迎屏幕上看到 Bash 时,我第一次对 Bash 产生了兴趣。 + +以下屏幕截图显示了 EndeavourOS 的一些选项。你可能不相信,这些面板只指向 Bash 脚本,每个脚本都完成一些相对复杂的任务。而且因为它都是开源的,所以我可以根据需要修改这些脚本中的任何一个。 + +![EndeavourOS after install][4] + +![EndeavourOS install apps][5] + +### 总有东西要学 + +我对这本书的印象非常好。虽然不长,但经过了深思熟虑。作者对 Bash 有非常广泛的了解,并且具有解释如何使用它的不可思议的能力。这本书使用 16 个谜题涵盖了基本、中级和高级 Bash 脚本,他称之为“挑战”。这教会了我将 Bash 脚本视为需要解决的编程难题,这让我玩起来更有趣。 + +Bash 的一个令人兴奋的方面是它与 Linux 系统深度集成。虽然它的部分能力在于它的语法,但它也很强大,因为它可以访问很多系统资源。你可以编写重复性任务或简单但厌倦了手动执行的任务的脚本。不管是大事还是小事,《Bash it out》可以帮助你了解可以做什么以及如何实现它。 + +如果我不提及 David Both 的发布在 Opensource.com 的免费资源《[A sysadmin's guide to Bash scripting_][6]》,这篇书评就不会完整。这个 17 页的 PDF 指南与《Bash it out》不同,但它们共同构成了任何想要了解它的人的成功组合。 + +我不是计算机程序员,但《Bash it out》增加了我进入更高级 Bash 脚本水平的欲望——虽然没有这个打算,但我可能最终无意中成为一名计算机程序员。 + +我喜欢 Linux 的原因之一是因为它的操作系统功能强大且用途广泛。无论我对 Linux 了解多少,总有一些新东西需要学习,这让我更加欣赏 Linux。 + +在竞争激烈且不断变化的就业市场中,我们所有人都应该不断更新我们的技能。这本书帮助我以非常实际的方式学习了 Bash。几乎感觉作者和我在同一个房间里,耐心地指导我学习。 + +作者 Leroux 具有不可思议的能力去吸引读者。这是一份难得的天赋,我认为比他的技术专长更有价值。事实上,我写这篇书评是为了感谢作者预见了我自己的学习需求;虽然我们从未见过面,但我从他的天赋中受益匪浅。 + +-------------------------------------------------------------------------------- + +via: https://opensource.com/article/20/4/bash-it-out-book + +作者:[Carlos Aguayo][a] +选题:[lujun9972][b] +译者:[baddates](https://github.com/baddates) +校对:[wxy](https://github.com/wxy) + +本文由 [LCTT](https://github.com/LCTT/TranslateProject) 原创编译,[Linux中国](https://linux.cn/) 荣誉推出 + +[a]: https://opensource.com/users/hwmaster1 +[b]: https://github.com/lujun9972 +[1]: https://opensource.com/sites/default/files/styles/image-full-size/public/lead-images/puzzle_computer_solve_fix_tool.png?itok=U0pH1uwj (Puzzle pieces coming together to form a computer screen) +[2]: https://www.amazon.com/Bash-Out-Strengthen-challenges-difficulties/dp/1521773262/ +[3]: https://endeavouros.com/ +[4]: https://opensource.com/sites/default/files/uploads/endeavouros-welcome.png (EndeavourOS after install) +[5]: https://opensource.com/sites/default/files/uploads/endeavouros-install-apps.png (EndeavourOS install apps) +[6]: https://opensource.com/downloads/bash-scripting-ebook diff --git a/published/202107/20200528 9 open source JavaScript frameworks for front-end web development.md b/published/202107/20200528 9 open source JavaScript frameworks for front-end web development.md new file mode 100644 index 0000000000..8b2dab76c6 --- /dev/null +++ b/published/202107/20200528 9 open source JavaScript frameworks for front-end web development.md @@ -0,0 +1,275 @@ +[#]: collector: (lujun9972) +[#]: translator: (stevending1st) +[#]: reviewer: (wxy) +[#]: publisher: (wxy) +[#]: url: (https://linux.cn/article-13594-1.html) +[#]: subject: (9 open source JavaScript frameworks for front-end web development) +[#]: via: (https://opensource.com/article/20/5/open-source-javascript-frameworks) +[#]: author: (Bryant Son https://opensource.com/users/brson) + +用于 Web 前端开发的 9 个 JavaScript 开源框架 +====== + +> 根据 JavaScript 框架的优点和主要特点对许多 JavaScript 框架进行细分。 + +![](https://img.linux.net.cn/data/attachment/album/202107/18/205233kz0sqwdwwvrwp2ss.jpg) + +大约十年前,JavaScript 社区开始见证一场 JavaScript 框架的激战。在本文中,我将介绍其中最著名的一些框架。值得注意的是,这些都是开源的 JavaScript 项目,这意味着你可以在 [开源许可证][2] 下自由地使用它们,甚至为它们的源代码和社区做出贡献。 + +不过,在开始之前,了解一些 JavaScript 开发者谈论框架时常用的术语,将对后续的内容大有裨益。 + +术语 | 释义 +---|--- +[文档对象模型(DOM)][3] | 网站的树形结构表示,每一个节点都是代表网页一部分的对象。万维网联盟(W3C),是万维网的国际标准组织,维护着 DOM 的定义。 +[虚拟 DOM][4] | 用户界面(UI)以“虚拟”或“理想”的方式保存在内存中,并通过 [ReactDOM][5] 等一些库与“真实” DOM 同步。要进一步探索,请阅读 ReactJS 的虚拟 DOM 和内部文档。 +[数据绑定][6] | 一个编程概念,为访问网站上的数据提供一致的接口。Web 元素与 DOM 维护的元素的属性property特性attribute 相关联(LCTT 译注:根据 MDN 的解释,Javascript 的属性property是对象的特征,通常描述与数据结构相关的特征;特性attribute 是指元素所有属性节点的一个实时集合)。例如,当需要在网页表单中填写密码时,数据绑定机制可以用密码验证逻辑检验,确保密码格式有效。 + +我们已经清楚了常用的术语,下面我们来探索一下开源的 JavaScript 框架有哪些。 + +框架 | 简介 | 许可证 | 发布日期 +---|---|---|--- +[ReactJS][7] | 目前最流行的 JavaScript 框架,由 Facebook 创建 | MIT 许可证 | 2013-5-24 +[Angular][8] | Google 创建的流行的 JavaScript 框架 | MIT 许可证 | 2010-1-5 +[VueJS][9] | 快速增长的 JavaScript 框架 | MIT 许可证 | 2013-7-28 +[MeteorJS][10] | 超乎于 JavaScript 框架的强大框架 | MIT 许可证 | 2012-1-18 +[KnockoutJS][11] | 开源的 MVVM(模型-视图-视图模型Model-View-ViewModel) 框架 | MIT 许可证 | 2010-7-5 +[EmberJS][12] | 另一个开源的 MVVM 框架 | MIT 许可证 | 2011-12-8 +[BackboneJS][13] | 带有 RESTful JSON 和模型-视图-主持人Model-View-Presenter模式的 JavaScript 框架 | MIT 许可证 | 2010-9-30 +[Svelte][14] | 不使用虚拟 DOM 的 JavaScript 开源框架 | MIT 许可证 | 2016-11-20 +[AureliaJS][15] | 现代 JavaScript 模块的集合 | MIT 许可证 | 2018-2-14 + +为了说明情况,下面是每个框架的 NPM 包下载量的公开数据,感谢 [npm trends][16]。 + +![Framework downloads graph][17] + +### ReactJS + +![React page][18] + +[ReactJS][19] 是由 Facebook 研发的,它虽然在 Angular 之后发布,但明显是当今 JavaScript 框架的领导者。React 引入了一个虚拟 DOM 的概念,这是一个抽象副本,开发者能在框架内仅使用他们想要的 ReactJS 功能,而无需重写整个项目。此外,React 项目活跃的开源社区无疑成为增长背后的主力军。下面是一些 React 的主要优势: + + * 合理的学习曲线 —— React 开发者可以轻松地创建 React 组件,而不需要重写整个 JavaScript 的代码。在 ReactJS 的 [首页][20] 查看它的优点以及它如何使编程更容易。 + * 高度优化的性能 —— React 的虚拟 DOM 的实现和其他功能提升了应用程序的渲染性能。请查看 ReactJS 的关于如何对其性能进行基准测试,并对应用性能进行衡量的相关 [描述][21]。 + * 优秀的支持工具 —— [Redux][22]、[Thunk][23] 和 [Reselect][24] 是构建良好、可调式代码的最佳工具。 + * 单向数据绑定 —— 模型使用 Reach 流,只从所有者流向子模块,这使得在代码中追踪因果关系更加简单。请在 ReactJS 的 [数据绑定页][25] 阅读更多相关资料。 + +谁在使用 ReactJS?Facebook 自从发明它,就大量使用 React 构建公司首页,据说 [Instagram][26] 完全基于 ReactJS 库。你可能会惊讶地发现,其他知名公司如 [纽约时报][27]、[Netflix][28] 和 [可汗学院][29] 也在他们的技术栈中使用了 ReactJS。 + +更令人惊讶的是 ReactJS 开发者的工作机会,正如在下面 Stackoverflow 所做的研究中看到的,嘿,你可以从事开源项目并获得报酬。这很酷! + +![React jobs page][30] + +*Stackoverflow 的研究显示了对 ReactJS 开发者的巨大需求——[来源:2017 年开发者招聘趋势——Stackoverflow 博客][31]* + +[ReactJS 的 GitHub][7] 目前显示超过 13,000 次提交和 1,377 位贡献者。它是一个在 MIT 许可证下的开源项目。 + +![React GitHub page][32] + +### Angular + +![Angular homepage][33] + +就开发者数量来说,也许 React 是现在最领先的 JavaScript 框架,但是 [Angular][34] 紧随其后。事实上,开源开发者和初创公司更乐于选择 React,而较大的公司往往更喜欢 Angular(下面列出了一些例子)。主要原因是,虽然 Angular 可能更复杂,但它的统一性和一致性适用于大型项目。例如,在我整个职业生涯中一直研究 Angular 和 React,我观察到大公司通常认为 Angular 严格的结构是一种优势。下面是 Angular 的另外一些关键优势: + + * 精心设计的命令行工具 —— Angular 有一个优秀的命令行工具(CLI),可以轻松起步和使用 Angular 进行开发。ReactJS 提供命令行工具和其他工具,同时 Angular 有广泛的支持和出色的文档,你可以参见 [这个页面][35]。 + * 单向数据绑定 —— 和 React 类似,单向数据绑定模型使框架受更少的不必要的副作用的影响。 + * 更好的 TypeScript 支持 —— Angular 与 [TypeScript][36] 有很好的一致性,它其实是 JavaScript 强制类型的拓展。它还可以转译为 JavaScript,强制类型是减少错误代码的绝佳选择。 + +像 YouTube、[Netflix][37]、[IBM][38] 和 [Walmart][39] 等知名网站,都已在其应用程序中采用了 Angular。我通过自学使用 Angular 来开始学习前端 JavaScript 开发。我参与了许多涉及 Angular 的个人和专业项目,但那是当时被称为 AngularJS 的 Angular 1.x。当 Google 决定将版本升级到 2.0 时,他们对框架进行了彻底的改造,然后变成了 Angular。新的 Angular 是对之前的 AngularJS 的彻底改造,这一举动带来了一部分新开发者也驱逐了一部分原有的开发者。 + +截止到撰写本文,[Angular 的 GitHub][8] 页面显示 17,781 次提交和 1,133 位贡献者。它也是一个遵循 MIT 许可证的开源项目,因此你可以自由地在你的项目或贡献中使用。 + +![Angular GitHub page][40] + +### VueJS + +![Vue JS page][41] + +[VueJS][42] 是一个非常有趣的框架。它是 JavaScript 框架领域的新来者,但是在过去几年里它的受欢迎程度显著增加。VueJS 由 [尤雨溪][43] 创建,他是曾参与过 Angular 项目的谷歌工程师。该框架现在变得如此受欢迎,以至于许多前端工程师更喜欢 VueJS 而不是其他 JavaScript 框架。下图描述了该框架随着时间的推移获得关注的速度。 + +![Vue JS popularity graph][44] + +这里有一些 VueJS 的主要优点: + + * 更容易地学习曲线 —— 与 Angular 或 React 相比,许多前端开发者都认为 VueJS 有更平滑的学习曲线。 + * 小体积 —— 与 Angular 或 React 相比,VueJS 相对轻巧。在 [官方文档][45] 中,它的大小据说只有约 30 KB;而 Angular 生成的项目超过 65 KB。 + * 简明的文档 —— VueJS 有全面清晰的文档。请自行查看它的 [官方文档][46]。 + +[VueJS 的 GitHub][9] 显示该项目有 3,099 次提交和 239 位贡献者。 + +![Vue JS GitHub page][47] + +### MeteorJS + +![Meteor page][48] + +[MeteorJS][49] 是一个自由开源的 [同构框架][50],这意味着它和 NodeJS 一样,同时运行客户端和服务器的 JavaScript。Meteor 能够和任何其他流行的前端框架一起使用,如 Angular、React、Vue、Svelte 等。 + +Meteor 被高通、马自达和宜家等多家公司以及如 Dispatch 和 Rocket.Chat 等多个应用程序使用。[您可以其在官方网站上查看更多案例][51]。 + +![Meteor case study][52] + +Meteor 的一些主要功能包括: + + * 在线数据 —— 服务器发送数据而不是 HTML,并由客户端渲染。在线数据主要是指 Meteor 在页面加载时通过一个 WebSocket 连接服务器,然后通过该链接传输所需要的数据。 + * 用 JavaScript 开发一切 —— 客户端、应用服务、网页和移动界面都可以用 JavaScript 设计。 + * 支持大多数主流框架 —— Angular、React 和 Vue 都可以与 Meteor 结合。因此,你仍然可以使用最喜欢的框架如 React 或 Angular,这并不防碍 Meteor 为你提供一些优秀的功能。 + +截止到目前,[Meteor 的 GitHub][10] 显示 22,804 次提交和 428 位贡献者。这对于开源项目来说相当多了。 + +![Meteor GitHub page][53] + +### EmberJS + +![EmberJS page][54] + +[EmberJS][55] 是一个基于 [模型-视图-视图模型(MVVM)][56] 模式的开源 JavaScript 框架。如果你从来没有听说过 EmberJS,你肯定会惊讶于有多少公司在使用它。Apple Music、Square、Discourse、Groupon、LinkedIn、Twitch、Nordstorm 和 Chipotle 都将 EmberJS 作为公司的技术栈之一。你可以通过查询 [EmberJS 的官方页面][57] 来发掘所有使用 EmberJS 的应用和客户。 + +Ember 虽然和我们讨论过的其他框架有类似的好处,但这里有些独特的区别: + + * 约定优于配置 —— Ember 将命名约定标准化并自动生成结果代码。这种方法学习曲线有些陡峭,但可以确保程序员遵循最佳实践。 + * 成熟的模板机制 —— Ember 依赖于直接文本操作,直接构建 HTML 文档,而并不关心 DOM。 + +正如所期待的那样,作为一个被许多应用程序使用的框架,[Ember 的 GitHub][58] 页面显示该项目拥有 19,808 次提交和 785 位贡献者。这是一个巨大的数字! + +![EmberJS GitHub page][59] + +### KnockoutJS + +![KnockoutJS page][60] + +[KnockoutJS][61] 是一个独立开源的 JavaScript 框架,采用 [模板-视图-视图模型(MVVM)][56] 模式与模板。尽管与 Angular、React 或 Vue 相比,听说过这个框架的人可能比较少,这个项目在开发者社区仍然相当活跃,并且有以下功能: + + * 声明式绑定 —— Knockout 的声明式绑定系统提供了一种简洁而强大的方式来将数据链接到 UI。绑定简单的数据属性或使用单向绑定很简单。请在 [KnockoutJS 的官方文档页面][62] 阅读更多相关信息。 + * 自动 UI 刷新。 + * 依赖跟踪模板。 + +[Knockout 的 GitHub][11] 页面显示约有 1,766 次提交和 81 位贡献者。与其他框架相比,这些数据并不重要,但是该项目仍然在积极维护中。 + +![Knockout GitHub page][63] + +### BackboneJS + +![BackboneJS page][64] + +[BackboneJS][65] 是一个具有 RESTful JSON 接口,基于模型-视图-主持人Model-View-Presenter(MVP)设计范式的轻量级 JavaScript 框架。 + +这个框架据说已经被 [Airbnb][66]、Hulu、SoundCloud 和 Trello 使用。你可以在 [Backbone 的页面][67] 找到上面所有这些案例来研究。 + +[BackboneJS 的 GitHub][13] 页面显示有 3,386 次提交和 289 位贡献者。 + +![BackboneJS GitHub page][68] + +### Svelte + +![Svelte page][69] + +[Svelte][70] 是一个开源的 JavaScript 框架,它生成操作 DOM 的代码,而不是包含框架引用。在构建时而非运行时将应用程序转换为 JavaScript 的过程,在某些情况下可能会带来轻微的性能提升。 + +[Svelte 的 GitHub][14] 页面显示,截止到本文撰写为止,该项目有 5,729 次提交和 296 位贡献者。 + +![Svelte GitHub page][71] + +### AureliaJS + +![Aurelia page][72] + +最后我们介绍一下 [Aurelia][73]。Aurelia 是一个前端 JavaScript 框架,是一个现代 JavaScript 模块的集合。Aurelia 有以下有趣的功能: + + * 快速渲染 —— Aurelia 宣称比当今其他任何框架的渲染速度都快。 + * 单向数据流 —— Aurelia 使用一个基于观察的绑定系统,将数据从模型推送到视图。 + * 使用原生 JavaScript 架构 —— 可以用原生 JavaScript 构建网站的所有组件。 + +[Aurelia 的 GitHub][15] 页面显示,截止到撰写本文为止该项目有 788 次提交和 96 位贡献者。 + +![Aurelia GitHub page][74] + +这就是我在查看 JavaScript 框架世界时发现的新内容。我错过了其他有趣的框架吗?欢迎在评论区分享你的想法。 + +-------------------------------------------------------------------------------- + +via: https://opensource.com/article/20/5/open-source-javascript-frameworks + +作者:[Bryant Son][a] +选题:[lujun9972][b] +译者:[stevending1st](https://github.com/stevending1st) +校对:[wxy](https://github.com/wxy) + +本文由 [LCTT](https://github.com/LCTT/TranslateProject) 原创编译,[Linux中国](https://linux.cn/) 荣誉推出 + +[a]: https://opensource.com/users/brson +[b]: https://github.com/lujun9972 +[1]: https://opensource.com/sites/default/files/styles/image-full-size/public/lead-images/browser_screen_windows_files.png?itok=kLTeQUbY (Computer screen with files or windows open) +[2]: https://opensource.com/article/17/9/open-source-licensing +[3]: https://www.w3schools.com/js/js_htmldom.asp +[4]: https://reactjs.org/docs/faq-internals.html +[5]: https://reactjs.org/docs/react-dom.html +[6]: https://en.wikipedia.org/wiki/Data_binding +[7]: https://github.com/facebook/react +[8]: https://github.com/angular/angular +[9]: https://github.com/vuejs/vue +[10]: https://github.com/meteor/meteor +[11]: https://github.com/knockout/knockout +[12]: https://github.com/emberjs/ember.js +[13]: https://github.com/jashkenas/backbone +[14]: https://github.com/sveltejs/svelte +[15]: https://github.com/aurelia/framework +[16]: https://www.npmtrends.com/angular-vs-react-vs-vue-vs-meteor-vs-backbone +[17]: https://opensource.com/sites/default/files/uploads/open-source-javascript-framework-downloads-opensourcedotcom_0.png (Framework downloads graph) +[18]: https://opensource.com/sites/default/files/uploads/3_react.jpg (React page) +[19]: https://reactjs.org +[20]: https://reactjs.org/ +[21]: https://reactjs.org/docs/perf.html +[22]: https://redux.js.org/ +[23]: https://github.com/reduxjs/redux-thunk +[24]: https://github.com/reduxjs/reselect +[25]: https://reactjs.org/docs/two-way-binding-helpers.html +[26]: https://instagram-engineering.com/react-native-at-instagram-dd828a9a90c7 +[27]: https://open.nytimes.com/introducing-react-tracking-declarative-tracking-for-react-apps-2c76706bb79a +[28]: https://medium.com/dev-channel/a-netflix-web-performance-case-study-c0bcde26a9d9 +[29]: https://khan.github.io/react-components/ +[30]: https://opensource.com/sites/default/files/uploads/4_reactjobs_0.jpg (React jobs page) +[31]: https://stackoverflow.blog/2017/03/09/developer-hiring-trends-2017 +[32]: https://opensource.com/sites/default/files/uploads/5_reactgithub.jpg (React GitHub page) +[33]: https://opensource.com/sites/default/files/uploads/6_angular.jpg (Angular homepage) +[34]: https://angular.io +[35]: https://cli.angular.io/ +[36]: https://www.typescriptlang.org/ +[37]: https://netflixtechblog.com/netflix-likes-react-509675426db +[38]: https://developer.ibm.com/technologies/javascript/tutorials/wa-react-intro/ +[39]: https://medium.com/walmartlabs/tagged/react +[40]: https://opensource.com/sites/default/files/uploads/7_angulargithub.jpg (Angular GitHub page) +[41]: https://opensource.com/sites/default/files/uploads/8_vuejs.jpg (Vue JS page) +[42]: https://vuejs.org +[43]: https://www.freecodecamp.org/news/between-the-wires-an-interview-with-vue-js-creator-evan-you-e383cbf57cc4/ +[44]: https://opensource.com/sites/default/files/uploads/9_vuejspopularity.jpg (Vue JS popularity graph) +[45]: https://vuejs.org/v2/guide/comparison.html#Size +[46]: https://vuejs.org/v2/guide/ +[47]: https://opensource.com/sites/default/files/uploads/10_vuejsgithub.jpg (Vue JS GitHub page) +[48]: https://opensource.com/sites/default/files/uploads/11_meteor_0.jpg (Meteor Page) +[49]: https://www.meteor.com +[50]: https://en.wikipedia.org/wiki/Isomorphic_JavaScript +[51]: https://www.meteor.com/showcase +[52]: https://opensource.com/sites/default/files/uploads/casestudy1_meteor.jpg (Meteor case study) +[53]: https://opensource.com/sites/default/files/uploads/12_meteorgithub.jpg (Meteor GitHub page) +[54]: https://opensource.com/sites/default/files/uploads/13_emberjs.jpg (EmberJS page) +[55]: https://emberjs.com +[56]: https://en.wikipedia.org/wiki/Model%E2%80%93view%E2%80%93viewmodel +[57]: https://emberjs.com/ember-users +[58]: https://github.com/emberjs +[59]: https://opensource.com/sites/default/files/uploads/14_embergithub.jpg (EmberJS GitHub page) +[60]: https://opensource.com/sites/default/files/uploads/15_knockoutjs.jpg (KnockoutJS page) +[61]: https://knockoutjs.com +[62]: https://knockoutjs.com/documentation/binding-syntax.html +[63]: https://opensource.com/sites/default/files/uploads/16_knockoutgithub.jpg (Knockout GitHub page) +[64]: https://opensource.com/sites/default/files/uploads/17_backbonejs.jpg (BackboneJS page) +[65]: https://backbonejs.org +[66]: https://medium.com/airbnb-engineering/our-first-node-js-app-backbone-on-the-client-and-server-c659abb0e2b4 +[67]: https://sites.google.com/site/backbonejsja/examples +[68]: https://opensource.com/sites/default/files/uploads/18_backbonejsgithub.jpg (BackboneJS GitHub page) +[69]: https://opensource.com/sites/default/files/uploads/19_svelte.jpg (Svelte page) +[70]: https://svelte.dev +[71]: https://opensource.com/sites/default/files/uploads/20_svletegithub.jpg (Svelte GitHub page) +[72]: https://opensource.com/sites/default/files/uploads/21_aurelia.jpg (Aurelia page) +[73]: https://aurelia.io +[74]: https://opensource.com/sites/default/files/uploads/22_aureliagithub.jpg (Aurelia GitHub page) diff --git a/published/202107/20200807 An advanced guide to NLP analysis with Python and NLTK.md b/published/202107/20200807 An advanced guide to NLP analysis with Python and NLTK.md new file mode 100644 index 0000000000..65fc9c9f76 --- /dev/null +++ b/published/202107/20200807 An advanced guide to NLP analysis with Python and NLTK.md @@ -0,0 +1,517 @@ +[#]: collector: (lujun9972) +[#]: translator: (tanloong) +[#]: reviewer: (wxy) +[#]: publisher: (wxy) +[#]: url: (https://linux.cn/article-13602-1.html) +[#]: subject: (An advanced guide to NLP analysis with Python and NLTK) +[#]: via: (https://opensource.com/article/20/8/nlp-python-nltk) +[#]: author: (Girish Managoli https://opensource.com/users/gammay) + +进阶教程:用 Python 和 NLTK 进行 NLP 分析 +====== + +> 进一步学习自然语言处理的基本概念 + +![](https://img.linux.net.cn/data/attachment/album/202107/21/115633k8l9nkqowqkowpwm.jpg) + +在 [之前的文章][2] 里,我介绍了自然语言处理natural language processing(NLP)和宾夕法尼亚大学研发的自然语言处理工具包Natural Language Toolkit ([NLTK][3])。我演示了用 Python 解析文本和定义停顿词stopword的方法,并介绍了语料库corpus的概念。语料库是由文本构成的数据集,通过提供现成的文本数据来辅助文本处理。在这篇文章里,我将继续用各种语料库对文本进行对比和分析。 + +这篇文章主要包括以下部分: + + * 词网WordNet同义词集synset + * 相似度比较Similarity comparison + * Tree树库treebank + * 命名实体识别Named entity recognition + +### 词网和同义词集 + +[词网][4]WordNet 是 NLTK 里的一个大型词汇数据库语料库。词网包含各单词的诸多认知同义词cognitive synonyms(认知同义词常被称作“同义词集synset”)。在词网里,名词、动词、形容词和副词,各自被组织成一个同义词的网络。 + +词网是一个很有用的文本分析工具。它有面向多种语言的版本(汉语、英语、日语、俄语和西班牙语等),也使用多种许可证(从开源许可证到商业许可证都有)。初代版本的词网由普林斯顿大学研发,面向英语,使用类 MIT 许可证MIT-like license。 + +因为一个词可能有多个意义或多个词性,所以可能与多个同义词集相关联。每个同义词集通常提供下列属性: + +|**属性** | **定义** | **例子**| +|---|---|---| +|名称Name| 此同义词集的名称 | 单词 `code` 有 5 个同义词集,名称分别是 `code.n.01`、 `code.n.02`、 `code.n.03`、`code.v.01` 和 `code.v.02`| +|词性POS| 此同义词集的词性 | 单词 `code` 有 3 个名词词性的同义词集和 2 个动词词性的同义词集| +|定义Definition| 该词作对应词性时的定义 | 动词 `code` 的一个定义是:(计算机科学)数据或计算机程序指令的象征性排列symbolic arrangement| +|例子Example| 使用该词的例子 | `code` 一词的例子:We should encode the message for security reasons| +|词元Lemma| 与该词相关联的其他同义词集(包括那些不一定严格地是该词的同义词,但可以大体看作同义词的);词元直接与其他词元相关联,而不是直接与单词word相关联|`code.v.02` 的词元是 `code.v.02.encipher`、`code.v.02.cipher`、`code.v.02.cypher`、`code.v.02.encrypt`、`code.v.02.inscribe` 和 `code.v.02.write_in_code`| +|反义词Antonym| 意思相反的词 | 词元 `encode.v.01.encode` 的反义词是 `decode.v.01.decode`| +|上义词Hypernym|该词所属的一个范畴更大的词 | `code.v.01` 的一个上义词是 `tag.v.01`| +|分项词Meronym| 属于该词组成部分的词 | `computer` 的一个分项词是 `chip` | +|总项词Holonym| 该词作为组成部分所属的词 | `window` 的一个总项词是 `computer screen`| + +同义词集还有一些其他属性,在 `<你的 Python 安装路径>/Lib/site-packages` 下的 `nltk/corpus/reader/wordnet.py`,你可以找到它们。 + +下面的代码或许可以帮助理解。 + +这个函数: + +``` +from nltk.corpus import wordnet + +def synset_info(synset): + print("Name", synset.name()) + print("POS:", synset.pos()) + print("Definition:", synset.definition()) + print("Examples:", synset.examples()) + print("Lemmas:", synset.lemmas()) + print("Antonyms:", [lemma.antonyms() for lemma in synset.lemmas() if len(lemma.antonyms()) > 0]) + print("Hypernyms:", synset.hypernyms()) + print("Instance Hypernyms:", synset.instance_hypernyms()) + print("Part Holonyms:", synset.part_holonyms()) + print("Part Meronyms:", synset.part_meronyms()) + print() + + +synsets = wordnet.synsets('code') +print(len(synsets), "synsets:") +for synset in synsets: + synset_info(synset) +``` + +将会显示: + +``` +5 synsets: +Name code.n.01 +POS: n +Definition: a set of rules or principles or laws (especially written ones) +Examples: [] +Lemmas: [Lemma('code.n.01.code'), Lemma('code.n.01.codification')] +Antonyms: [] +Hypernyms: [Synset('written_communication.n.01')] +Instance Hpernyms: [] +Part Holonyms: [] +Part Meronyms: [] + +... + +Name code.n.03 +POS: n +Definition: (computer science) the symbolic arrangement of data or instructions in a computer program or the set of such instructions +Examples: [] +Lemmas: [Lemma('code.n.03.code'), Lemma('code.n.03.computer_code')] +Antonyms: [] +Hypernyms: [Synset('coding_system.n.01')] +Instance Hpernyms: [] +Part Holonyms: [] +Part Meronyms: [] + +... + +Name code.v.02 +POS: v +Definition: convert ordinary language into code +Examples: ['We should encode the message for security reasons'] +Lemmas: [Lemma('code.v.02.code'), Lemma('code.v.02.encipher'), Lemma('code.v.02.cipher'), Lemma('code.v.02.cypher'), Lemma('code.v.02.encrypt'), Lemma('code.v.02.inscribe'), Lemma('code.v.02.write_in_code')] +Antonyms: [] +Hypernyms: [Synset('encode.v.01')] +Instance Hpernyms: [] +Part Holonyms: [] +Part Meronyms: [] +``` + +同义词集synset词元lemma在词网里是按照树状结构组织起来的,下面的代码会给出直观的展现: + +``` +def hypernyms(synset): +    return synset.hypernyms() + +synsets = wordnet.synsets('soccer') +for synset in synsets: +    print(synset.name() + " tree:") +    pprint(synset.tree(rel=hypernyms)) +    print() +``` + +``` +code.n.01 tree: +[Synset('code.n.01'), + [Synset('written_communication.n.01'), +   ... + +code.n.02 tree: +[Synset('code.n.02'), + [Synset('coding_system.n.01'), +   ... + +code.n.03 tree: +[Synset('code.n.03'), +   ... + +code.v.01 tree: +[Synset('code.v.01'), + [Synset('tag.v.01'), +   ... + +code.v.02 tree: +[Synset('code.v.02'), + [Synset('encode.v.01'), +   ... +``` + +词网并没有涵盖所有的单词和其信息(现今英语有约 17,0000 个单词,最新版的 词网 涵盖了约 15,5000 个),但它开了个好头。掌握了“词网”的各个概念后,如果你觉得它词汇少,不能满足你的需要,可以转而使用其他工具。或者,你也可以打造自己的“词网”! + +#### 自主尝试 + +使用 Python 库,下载维基百科的 “[open source][5]” 页面,并列出该页面所有单词的同义词集synset词元lemma。 + +### 相似度比较 + +相似度比较的目的是识别出两篇文本的相似度,在搜索引擎、聊天机器人等方面有很多应用。 + +比如,相似度比较可以识别 `football` 和 `soccer` 是否有相似性。 + +``` +syn1 = wordnet.synsets('football') +syn2 = wordnet.synsets('soccer') + +# 一个单词可能有多个 同义词集,需要把 word1 的每个同义词集和 word2 的每个同义词集分别比较 +for s1 in syn1: +    for s2 in syn2: +        print("Path similarity of: ") +        print(s1, '(', s1.pos(), ')', '[', s1.definition(), ']') +        print(s2, '(', s2.pos(), ')', '[', s2.definition(), ']') +        print("   is", s1.path_similarity(s2)) +        print() +``` + +``` +Path similarity of: +Synset('football.n.01') ( n ) [ any of various games played with a ball (round or oval) in which two teams try to kick or carry or propel the ball into each other's goal ] +Synset('soccer.n.01') ( n ) [ a football game in which two teams of 11 players try to kick or head a ball into the opponents' goal ] +   is 0.5 + +Path similarity of: +Synset('football.n.02') ( n ) [ the inflated oblong ball used in playing American football ] +Synset('soccer.n.01') ( n ) [ a football game in which two teams of 11 players try to kick or head a ball into the opponents' goal ] +   is 0.05 +``` + +两个词各个同义词集之间路径相似度path similarity最大的是 0.5,表明它们关联性很大([路径相似度path similarity][6]指两个词的意义在上下义关系的词汇分类结构hypernym/hypnoym taxonomy中的最短距离)。 + +那么 `code` 和 `bug` 呢?这两个计算机领域的词的相似度是: + +``` +Path similarity of: +Synset('code.n.01') ( n ) [ a set of rules or principles or laws (especially written ones) ] +Synset('bug.n.02') ( n ) [ a fault or defect in a computer program, system, or machine ] +   is 0.1111111111111111 +... +Path similarity of: +Synset('code.n.02') ( n ) [ a coding system used for transmitting messages requiring brevity or secrecy ] +Synset('bug.n.02') ( n ) [ a fault or defect in a computer program, system, or machine ] +   is 0.09090909090909091 +... +Path similarity of: +Synset('code.n.03') ( n ) [ (computer science) the symbolic arrangement of data or instructions in a computer program or the set of such instructions ] +Synset('bug.n.02') ( n ) [ a fault or defect in a computer program, system, or machine ] +   is 0.09090909090909091 +``` + +这些是这两个词各同义词集之间路径相似度path similarity的最大值,这些值表明两个词是有关联性的。 + +NLTK 提供多种相似度计分器similarity scorers,比如: + + * path_similarity + * lch_similarity + * wup_similarity + * res_similarity + * jcn_similarity + * lin_similarity + +要进一步了解这些相似度计分器similarity scorers,请查看 [WordNet Interface][6] 的 Similarity 部分。 + +#### 自主尝试 + +使用 Python 库,从维基百科的 [Category: Lists of computer terms][7] 生成一个术语列表,然后计算各术语之间的相似度。 + +### 树和树库 + +使用 NLTK,你可以把文本表示成树状结构以便进行分析。 + +这里有一个例子: + +这是一份简短的文本,对其做预处理和词性标注: + +``` +import nltk + +text = "I love open source" +# Tokenize to words +words = nltk.tokenize.word_tokenize(text) +# POS tag the words +words_tagged = nltk.pos_tag(words) +``` + +要把文本转换成树状结构,你必须定义一个语法grammar。这个例子里用的是一个基于 [Penn Treebank tags][8] 的简单语法。 + +``` +# A simple grammar to create tree +grammar = "NP: {<JJ><NN>}" +``` + +然后用这个语法grammar创建一颗tree: + +``` +# Create tree +parser = nltk.RegexpParser(grammar) +tree = parser.parse(words_tagged) +pprint(tree) +``` + +运行上面的代码,将得到: + +``` +Tree('S', [('I', 'PRP'), ('love', 'VBP'), Tree('NP', [('open', 'JJ'), ('source', 'NN')])]) +``` + +你也可以图形化地显示结果。 + +``` +tree.draw() +``` + +![NLTK Tree][9] + +这个树状结构有助于准确解读文本的意思。比如,用它可以找到文本的 [主语][11]: + +``` +subject_tags = ["NN", "NNS", "NP", "NNP", "NNPS", "PRP", "PRP$"] +def subject(sentence_tree): +    for tagged_word in sentence_tree: +        # A crude logic for this case -  first word with these tags is considered subject +        if tagged_word[1] in subject_tags: +            return tagged_word[0] + +print("Subject:", subject(tree)) +``` + +结果显示主语是 `I`: + +``` +Subject: I +``` + +这是一个比较基础的文本分析步骤,可以用到更广泛的应用场景中。 比如,在聊天机器人方面,如果用户告诉机器人:“给我妈妈 Jane 预订一张机票,1 月 1 号伦敦飞纽约的”,机器人可以用这种分析方法解读这个指令: + +**动作**: 预订 +**动作的对象**: 机票 +**乘客**: Jane +**出发地**: 伦敦 +**目的地**: 纽约 +**日期**: (明年)1 月 1 号 + +树库treebank指由许多预先标注好的tree构成的语料库。现在已经有面向多种语言的树库,既有开源的,也有限定条件下才能免费使用的,以及商用的。其中使用最广泛的是面向英语的宾州树库。宾州树库取材于华尔街日报Wall Street Journal。NLTK 也包含了宾州树库作为一个子语料库。下面是一些使用树库treebank的方法: + +``` +words = nltk.corpus.treebank.words() +print(len(words), "words:") +print(words) + +tagged_sents = nltk.corpus.treebank.tagged_sents() +print(len(tagged_sents), "sentences:") +print(tagged_sents) + +``` + +``` +100676 words: +['Pierre', 'Vinken', ',', '61', 'years', 'old', ',', ...] +3914 sentences: +[[('Pierre', 'NNP'), ('Vinken', 'NNP'), (',', ','), ('61', 'CD'), ('years', 'NNS'), ('old', 'JJ'), (',', ','), ('will', 'MD'), ('join', 'VB'), ('the', 'DT'), ('board', 'NN'), ('as', 'IN'), ('a', 'DT'), ('nonexecutive', 'JJ'), ('director', 'NN'), ...] +``` + +查看一个句子里的各个标签tags: + +``` +sent0 = tagged_sents[0] +pprint(sent0) +``` + +``` +[('Pierre', 'NNP'), + ('Vinken', 'NNP'), + (',', ','), + ('61', 'CD'), + ('years', 'NNS'), +... +``` + +定义一个语法grammar来把这个句子转换成树状结构: + +``` +grammar = ''' + Subject: {} + SubjectInfo: {} + Action: {} + Object: {
} + Stopwords: {
} + ObjectInfo: {} + When: {} +''' +parser = nltk.RegexpParser(grammar) +tree = parser.parse(sent0) +print(tree) +``` + +``` +(S +  (Subject Pierre/NNP Vinken/NNP) +  ,/, +  (SubjectInfo 61/CD years/NNS old/JJ) +  ,/, +  (Action will/MD join/VB) +  (Object the/DT board/NN) +  as/IN +  a/DT +  (ObjectInfo nonexecutive/JJ director/NN) +  (Subject Nov./NNP) +  29/CD +  ./.) +``` + +图形化地显示: + +``` +tree.draw() +``` + +![NLP Treebank image][12] + +trees树库treebanks的概念是文本分析的一个强大的组成部分。 + +#### 自主尝试 + +使用 Python 库,下载维基百科的 “[open source][5]” 页面,将得到的文本以图形化的树状结构展现出来。 + +### 命名实体识别 + +无论口语还是书面语都包含着重要数据。文本处理的主要目标之一,就是提取出关键数据。几乎所有应用场景所需要提取关键数据,比如航空公司的订票机器人或者问答机器人。 NLTK 为此提供了一个命名实体识别named entity recognition的功能。 + +这里有一个代码示例: + +``` +sentence = 'Peterson first suggested the name "open source" at Palo Alto, California' +``` + +验证这个句子里的人名name地名place有没有被识别出来。照例先预处理: + +``` +import nltk + +words = nltk.word_tokenize(sentence) +pos_tagged = nltk.pos_tag(words) +``` + +运行命名实体标注器named-entity tagger: + +``` +ne_tagged = nltk.ne_chunk(pos_tagged) +print("NE tagged text:") +print(ne_tagged) +print() +``` + +``` +NE tagged text: +(S +  (PERSON Peterson/NNP) +  first/RB +  suggested/VBD +  the/DT +  name/NN +  ``/`` +  open/JJ +  source/NN +  ''/'' +  at/IN +  (FACILITY Palo/NNP Alto/NNP) +  ,/, +  (GPE California/NNP)) +``` + +上面的结果里,命名实体被识别出来并做了标注;只提取这个tree里的命名实体: + +``` +print("Recognized named entities:") +for ne in ne_tagged: +    if hasattr(ne, "label"): +        print(ne.label(), ne[0:]) +``` + +``` +Recognized named entities: +PERSON [('Peterson', 'NNP')] +FACILITY [('Palo', 'NNP'), ('Alto', 'NNP')] +GPE [('California', 'NNP')] +``` + +图形化地显示: + +``` +ne_tagged.draw() +``` + +![NLTK Treebank tree][13] + +NLTK 内置的命名实体标注器named-entity tagger,使用的是宾州法尼亚大学的 [Automatic Content Extraction][14](ACE)程序。该标注器能够识别组织机构ORGANIZATION、人名PERSON、地名LOCATION、设施FACILITY地缘政治实体geopolitical entity等常见实体entites。 + +NLTK 也可以使用其他标注器tagger,比如 [Stanford Named Entity Recognizer][15]. 这个经过训练的标注器用 Java 写成,但 NLTK 提供了一个使用它的接口(详情请查看 [nltk.parse.stanford][16] 或 [nltk.tag.stanford][17])。 + +#### 自主尝试 + +使用 Python 库,下载维基百科的 “[open source][5]” 页面,并识别出对开源open source有影响力的人的名字,以及他们为开源open source做贡献的时间和地点。 + +### 高级实践 + +如果你准备好了,尝试用这篇文章以及此前的文章介绍的知识构建一个超级结构superstructure。 + +使用 Python 库,下载维基百科的 “[Category: Computer science page][18]”,然后: + + * 找出其中频率最高的单词unigrams、二元搭配bigrams三元搭配trigrams,将它们作为一个关键词列表或者技术列表。相关领域的学生或者工程师需要了解这样一份列表里的内容。 + * 图形化地显示这个领域里重要的人名、技术、日期和地点。这会是一份很棒的信息图。 + * 构建一个搜索引擎。你的搜索引擎性能能够超过维基百科吗? + +### 下一步? + +自然语言处理是应用构建application building的典型支柱。NLTK 是经典、丰富且强大的工具集,提供了为现实世界构建有吸引力、目标明确的应用的工作坊。 + +在这个系列的文章里,我用 NLTK 作为例子,展示了自然语言处理可以做什么。自然语言处理和 NLTK 还有太多东西值得探索,这个系列的文章只是帮助你探索它们的切入点。 + +如果你的需求增长到 NLTK 已经满足不了了,你可以训练新的模型或者向 NLTK 添加新的功能。基于 NLTK 构建的新的自然语言处理库正在不断涌现,机器学习也正被深度用于自然语言处理。 + +-------------------------------------------------------------------------------- + +via: https://opensource.com/article/20/8/nlp-python-nltk + +作者:[Girish Managoli][a] +选题:[lujun9972][b] +译者:[tanloong](https://github.com/tanloong) +校对:[wxy](https://github.com/wxy) + +本文由 [LCTT](https://github.com/LCTT/TranslateProject) 原创编译,[Linux中国](https://linux.cn/) 荣誉推出 + +[a]: https://opensource.com/users/gammay +[b]: https://github.com/lujun9972 +[1]: https://opensource.com/sites/default/files/styles/image-full-size/public/lead-images/brain_computer_solve_fix_tool.png?itok=okq8joti (Brain on a computer screen) +[2]: https://opensource.com/article/20/8/intro-python-nltk +[3]: http://www.nltk.org/ +[4]: https://en.wikipedia.org/wiki/WordNet +[5]: https://en.wikipedia.org/wiki/Open_source +[6]: https://www.nltk.org/howto/wordnet.html +[7]: https://en.wikipedia.org/wiki/Category:Lists_of_computer_terms +[8]: https://www.ling.upenn.edu/courses/Fall_2003/ling001/penn_treebank_pos.html +[9]: https://opensource.com/sites/default/files/uploads/nltk-tree.jpg (NLTK Tree) +[10]: https://creativecommons.org/licenses/by-sa/4.0/ +[11]: https://en.wikipedia.org/wiki/Subject_(grammar) +[12]: https://opensource.com/sites/default/files/uploads/nltk-treebank.jpg (NLP Treebank image) +[13]: https://opensource.com/sites/default/files/uploads/nltk-treebank-2a.jpg (NLTK Treebank tree) +[14]: https://www.ldc.upenn.edu/collaborations/past-projects/ace +[15]: https://nlp.stanford.edu/software/CRF-NER.html +[16]: https://www.nltk.org/_modules/nltk/parse/stanford.html +[17]: https://www.nltk.org/_modules/nltk/tag/stanford.html +[18]: https://en.wikipedia.org/wiki/Category:Computer_science diff --git a/published/202107/20200914 Use Python to solve a charity-s business problem.md b/published/202107/20200914 Use Python to solve a charity-s business problem.md new file mode 100644 index 0000000000..b2a6f4379c --- /dev/null +++ b/published/202107/20200914 Use Python to solve a charity-s business problem.md @@ -0,0 +1,190 @@ +[#]: collector: "lujun9972" +[#]: translator: "zepoch" +[#]: reviewer: "wxy" +[#]: publisher: "wxy" +[#]: url: "https://linux.cn/article-13542-1.html" +[#]: subject: "Use Python to solve a charity's business problem" +[#]: via: "https://opensource.com/article/20/9/solve-problem-python" +[#]: author: "Chris Hermansen https://opensource.com/users/clhermansen" + +使用 Python 来解决慈善机构的业务问题 +====== + +> 比较不同的编程语言如何解决同一个问题是一个很有趣的事情,也很有指导意义。接下来,我们就来讲一讲如何用 Python 来解决。 + +![](https://img.linux.net.cn/data/attachment/album/202107/02/124241fzuzo7kflrf7g77v.jpg) + +在我这一系列的 [第一篇文章][2] 里,我描述了这样子的一个问题,如何将一大批的救助物资分为具有相同价值的物品,并将其分发给社区中的困难住户。我也曾写过用不同的编程语言写一些小程序来解决这样子的小问题以及比较这些程序时如何工作的。 + +在第一篇文章中,我是使用了 [Groovy][3] 语言来解决问题的。Groovy 在很多方面都与 [Python][4] 很相似,但是在语法上她更像 C 语言和 Java。因此,使用 Python 来创造一个相同的解决方案应该会很有趣且更有意义。 + +### 使用 Python 的解决方案 + +使用 Java 时,我会声明一个工具类来保存元组数据(新的记录功能将会很好地用于这个需求)。使用 Groovy 时,我就是用了该语言的映射功能,我也将在 Python 使用相同的机制。 + +使用一个字典列表来保存从批发商处批发来的货物: + +``` +packs = [ + {'item':'Rice','brand':'Best Family','units':10,'price':5650,'quantity':1}, + {'item':'Spaghetti','brand':'Best Family','units':1,'price':327,'quantity':10}, + {'item':'Sardines','brand':'Fresh Caught','units':3,'price':2727,'quantity':3}, + {'item':'Chickpeas','brand':'Southern Style','units':2,'price':2600,'quantity':5}, + {'item':'Lentils','brand':'Southern Style','units':2,'price':2378,'quantity':5}, + {'item':'Vegetable oil','brand':'Crafco','units':12,'price':10020,'quantity':1}, + {'item':'UHT milk','brand':'Atlantic','units':6,'price':4560,'quantity':2}, + {'item':'Flour','brand':'Neighbor Mills','units':10,'price':5200,'quantity':1}, + {'item':'Tomato sauce','brand':'Best Family','units':1,'price':190,'quantity':10}, + {'item':'Sugar','brand':'Good Price','units':1,'price':565,'quantity':10}, + {'item':'Tea','brand':'Superior','units':5,'price':2720,'quantity':2}, + {'item':'Coffee','brand':'Colombia Select','units':2,'price':4180,'quantity':5}, + {'item':'Tofu','brand':'Gourmet Choice','units':1,'price':1580,'quantity':10}, + {'item':'Bleach','brand':'Blanchite','units':5,'price':3550,'quantity':2}, + {'item':'Soap','brand':'Sunny Day','units':6,'price':1794,'quantity':2}] +``` + +大米有一包,每包中有 10 袋大米,意大利面条有十包,每包中有一袋意大利面条。上述代码中,变量 `packs` 被设置为 Python 字典列表。这与 Groovy 的方法非常相似。关于 Groovy 和 Python 之间的区别,有几点需要注意: + + 1. 在 Python 中,无需关键字来定义变量 `packs`,Python 变量初始化时需要设置一个值。 + 2. Python 字典中的词键(例如,`item`、`brand`、`units`、`price`、 `quantity`)需要引号来表明它们是字符串;Groovy 假定这些是字符串,但也接受引号。 + 3. 在 Python 中,符号 `{ ... }` 表明一个字典声明; Groovy 使用与列表相同的方括号,但两种情况下的结构都必须具有键值对。 + +当然,表中的价格不是以美元计算的。 + +接下来,打开散装包。例如,打开大米的单个散装包装,将产出 10 单元大米; 也就是说,产出的单元总数是 `units * quantity`。 Groovy 脚本使用一个名为 `collectMany` 的方便的函数,该函数可用于展平列表列表。 据我所知,Python 没有类似的东西,所以使用两个列表推导式来产生相同的结果: + +``` +units = [[{'item':pack['item'],'brand':pack['brand'], + 'price':(pack['price'] / pack['units'])}] * + (pack['units'] * pack['quantity']) for pack in packs] +units = [x for sublist in units for x in sublist] +``` + +第一个列表可理解为(分配给单元)构建字典列表列表。 第二个将其“扁平化”为字典列表。 请注意,Python 和 Groovy 都提供了一个 `*` 运算符,它接受左侧的列表和右侧的数字 `N`,并复制列表 `N` 次。 + +最后一步是将这些单元的大米之类的重新包装到篮子(`hamper`)中以进行分发。 就像在 Groovy 版本中一样,你需要更具体地了解理想的篮子数,当你只剩下几个单元时,你最好不要过度限制,即可以做一些随机分配: + +``` +valueIdeal = 5000 +valueMax = valueIdeal * 1.1 +``` + +很好! 重新打包篮子。 + +``` +import random +hamperNumber = 0 # 导入 Python 的随机数生成器工具并初始化篮子数 +while len(units) > 0: # 只要有更多可用的单元,这个 `while` 循环就会将单元重新分配到篮子中: + hamperNumber += 1 + hamper = [] + value = 0 + canAdd = True # 增加篮子编号,得到一个新的空篮子(单元的列表),并将其值设为 0; 开始假设你可以向篮子中添加更多物品。 + while canAdd: # 这个 `while` 循环将尽可能多地向篮子添加单元(Groovy 代码使用了 `for` 循环,但 Python 的 `for` 循环期望迭代某些东西,而 Groovy 则是为更传统的 C 形式的 `for` 循环形式): + u = random.randint(0,len(units)-1) # 获取一个介于 0 和剩余单元数减 1 之间的随机数。 + canAdd = False # 假设你找不到更多要添加的单元。 + o = 0 # 创建一个变量,用于从你正在寻找要放入篮子中的物品的起点的偏移量。 + while o < len(units): # 从随机选择的索引开始,这个 `while` 循环将尝试找到一个可以添加到篮子的单元(再次注意,Python `for` 循环可能不适合这里,因为列表的长度将在迭代中中发生变化)。 + uo = (u + o) % len(units) + unit = units[uo] + unitPrice = unit['price'] # 找出要查看的单元(随机起点+偏移量)并获得其价格。 + if len(units) < 3 or not (unit in hamper) and (value + unitPrice) < valueMax: + # 如果只剩下几个,或者添加单元后篮子的价值不太高,你可以将此单元添加到篮子中。 + hamper.append(unit) + value += unitPrice + units.pop(u) # 将单元添加到篮子中,按单价增加 篮子数,从可用单元列表中删除该单元。 + canAdd = len(units) > 0 + break # 只要还有剩余单元,你就可以添加更多单元,因此可以跳出此循环继续寻找。 + o += 1 # 增加偏移量。 + # 在退出这个 `while` 循环时,如果你检查了所有剩余的单元并且找不到单元可以添加到篮子中,那么篮子就完成了搜索; 否则,你找到了一个,可以继续寻找更多。 + print('') + print('Hamper',hamperNumber,'value',value) + for item in hamper: + print('%-25s%-25s%7.2f' % (item['item'],item['brand'],item['price'])) # 打印出篮子的内容。 + print('Remaining units',len(units)) # 打印出剩余的单元信息。 +``` + +一些澄清如上面的注释。 + +运行此代码时,输出看起来与 Groovy 程序的输出非常相似: + +``` +Hamper 1 value 5304.0 +UHT milk Atlantic 760.00 +Tomato sauce Best Family 190.00 +Rice Best Family 565.00 +Coffee Colombia Select 2090.00 +Sugar Good Price 565.00 +Vegetable oil Crafco 835.00 +Soap Sunny Day 299.00 +Remaining units 148 + +Hamper 2 value 5428.0 +Tea Superior 544.00 +Lentils Southern Style 1189.00 +Flour Neighbor Mills 520.00 +Tofu Gourmet Choice 1580.00 +Vegetable oil Crafco 835.00 +UHT milk Atlantic 760.00 +Remaining units 142 + +Hamper 3 value 5424.0 +Soap Sunny Day 299.00 +Chickpeas Southern Style 1300.00 +Sardines Fresh Caught 909.00 +Rice Best Family 565.00 +Vegetable oil Crafco 835.00 +Spaghetti Best Family 327.00 +Lentils Southern Style 1189.00 +Remaining units 135 + +... + +Hamper 21 value 5145.0 +Tomato sauce Best Family 190.00 +Tea Superior 544.00 +Chickpeas Southern Style 1300.00 +Spaghetti Best Family 327.00 +UHT milk Atlantic 760.00 +Vegetable oil Crafco 835.00 +Lentils Southern Style 1189.00 +Remaining units 4 + +Hamper 22 value 2874.0 +Sardines Fresh Caught 909.00 +Vegetable oil Crafco 835.00 +Rice Best Family 565.00 +Rice Best Family 565.00 +Remaining units 0 +``` + +最后一个篮子在内容和价值上有所简化。 + +### 结论 + +乍一看,这个程序的 Python 和 Groovy 版本之间没有太大区别。 两者都有一组相似的结构,这使得处理列表和字典非常简单。 两者都不需要很多“样板代码”或其他“繁杂”操作。 + +此外,使用 Groovy 时,向篮子中添加单元还是一件比较繁琐的事情。 你需要在单元列表中随机选择一个位置,然后从该位置开始,遍历列表,直到找到一个价格允许的且包含它的单元,或者直到你用完列表为止。 当只剩下几件物品时,你需要将它们扔到最后一个篮子里。 + +另一个值得一提的问题是:这不是一种特别有效的方法。 从列表中删除元素、极其多的重复表达式还有一些其它的问题使得这不太适合解决这种大数据重新分配问题。 尽管如此,它仍然在我的老机器上运行。 + +如果你觉得我在这段代码中使用 `while` 循环并改变其中的数据感到不舒服,你可能希望我让它更有用一些。 我想不出一种方法不使用 Python 中的 map 和 reduce 函数,并结合随机选择的单元进行重新打包。 你可以吗? + +在下一篇文章中,我将使用 Java 重新执行此操作,以了解 Groovy 和 Python 的工作量减少了多少,未来的文章将介绍 Julia 和 Go。 + +-------------------------------------------------------------------------------- + +via: https://opensource.com/article/20/9/solve-problem-python + +作者:[Chris Hermansen][a] +选题:[lujun9972][b] +译者:[zepoch](https://github.com/zepoch) +校对:[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/python_programming_question.png?itok=cOeJW-8r "Python programming language logo with question marks" +[2]: https://opensource.com/article/20/8/solving-problem-groovy +[3]: https://groovy-lang.org/ +[4]: https://www.python.org/ diff --git a/published/202107/20201012 My top 7 keywords in Rust.md b/published/202107/20201012 My top 7 keywords in Rust.md new file mode 100644 index 0000000000..2f770e9532 --- /dev/null +++ b/published/202107/20201012 My top 7 keywords in Rust.md @@ -0,0 +1,55 @@ +[#]: collector: "lujun9972" +[#]: translator: "mcfd" +[#]: reviewer: "wxy" +[#]: publisher: "wxy" +[#]: url: "https://linux.cn/article-13589-1.html" +[#]: subject: "My top 7 keywords in Rust" +[#]: via: "https://opensource.com/article/20/10/keywords-rust" +[#]: author: "Mike Bursell https://opensource.com/users/mikecamel" + +我的 7 大 Rust 关键字 +====== + +> 从 Rust 标准库学习一些有用的关键字。 + +![Rustacean t-shirt][1] + +我使用 [Rust][2] 已经有几个月了,写的东西比我预期的要多——尽管随着我的学习,我改进了所写的代码,并完成了一些超出我最初意图的更复杂的任务,相当多的东西已经被扔掉了。 + +我仍然喜欢它,并认为谈论一些在 Rust 中反复出现的重要关键字可能会有好处。我会提供我个人对它们的作用的总结:为什么你需要考虑如何使用它们,以及任何其他有用的东西,特别是对于刚接触 Rust 的新手或来自另一种语言的人(如 Java;请阅读我的文章 [为什么作为一个 Java 程序员的我喜欢学习 Rust][3])。 + +事不宜迟,让我们开始吧。获取更多信息的好地方总是 Rust 官方文档 —— 你可能想从 [std 标准库][4]开始。 + + 1. `const` – 你可以用 `const` 来声明常量,而且你应该这样做。虽然这不是造火箭,但请一定要用 `const` ,如果你要在不同的模块中使用常量,那请创建一个 `lib.rs` 文件(Rust 默认的),你可以把所有的常量放在一个命名良好的模块中。我曾经在不同模块的不同文件中发生过 `const` 变量名(和值)的冲突,仅仅是因为我太懒了,除了在不同文件中剪切和粘贴之外,我本可以通过创建一个共享模块来节省大量的工作。 + 2. `let` – 你并不 _总是_ 需要用 `let` 语句声明一个变量,但当你这样做时你的代码会更加清晰。此外,如果可以,请一定要添加变量类型。Rust 会尽最大努力猜测它应该是什么类型的变量,但它不一定总能在运行时做到这一点(在这种情况下,编译器 [Cargo][5] 会提示你),它甚至可能做不到你期望的那样。在后一种情况下,对于 Cargo 来说,抱怨你所赋值的函数(例如)与声明不一致,总比 Rust 试图帮助你做错事,而你却不得不在其他地方花费大量时间来进行调试要简单。 + 3. `match` – `match` 对我来说是新鲜事物,我喜欢使用它。它与其他编程语言中的 `switch` 没有什么不同,但在 Rust 中被广泛使用。它使代码更清晰易读,如果你做了一些愚蠢的事情(例如错过一些可能的情况),Cargo 会很好地提示你。我一般的经验法则是,在管理不同的选项或进行分支时,如果可以使用 `match`,那就请一定要使用它。 + 4. `mut` – 在声明一个变量时,如果它的值在声明后会发生变化,那么你需要声明它是可变的(LCTT 译注:Rust 中变量默认是不可变的)。常见的错误是在某个变量 _没有_ 变化的情况下声明它是可变的,这时编译器会警告你。如果你收到了 Cargo 的警告,说一个可变的变量没有被改变,而你认为它被 _改变_ 了,那么你可能要检查该变量的范围,并确保你使用的是正确的那个。 + 5. `return` – 实际上我很少使用 `return`,它用于从函数中返回一个值,但是如果你只是在函数的最后一行提供值(或提供返回值的函数),通常会变得更简单,能更清晰地阅读。警告:在很多情况下,你 _会_ 忘记省略这一行末尾的分号(`;`),如果你这样做,编译器会不高兴的。 + 6. `unsafe` – 如其意:如果你想做一些不能保证 Rust 内存安全的事情,那么你就需要使用这个关键字。我绝对无意在现在或将来的任何时候宣布我的任何 Rust 代码不安全;Rust 如此友好的原因之一是它阻止了这种黑客行为。如果你真的需要这样做,再想想,再想想,然后重新设计代码。除非你是一个非常低级的系统程序员,否则要 _避免_ 使用 `unsafe`。 + 7. `use` – 当你想使用另一个 crate 中的东西时,例如结构体、变量、函数等,那么你需要在你要使用它的代码的代码块的开头声明它。另一个常见的错误是,你这样做了,但没有在 `Cargo.toml` 文件中添加该 crate (最好有一个最小版本号)。 + +我知道,这不是我写过的最复杂的文章,但这是我在开始学习 Rust 时会欣赏的那种文章。我计划在关键函数和其他 Rust 必知知识方面编写类似的文章:如果你有任何要求,请告诉我! + +* * * + +_本文最初发表于 [Alice, Eve, and Bob][6] 经作者许可转载。_ + +-------------------------------------------------------------------------------- + +via: https://opensource.com/article/20/10/keywords-rust + +作者:[Mike Bursell][a] +选题:[lujun9972][b] +译者:[mcfd](https://github.com/mcfd) +校对:[wxy](https://github.com/wxy) + +本文由 [LCTT](https://github.com/LCTT/TranslateProject) 原创编译,[Linux中国](https://linux.cn/) 荣誉推出 + +[a]: https://opensource.com/users/mikecamel +[b]: https://github.com/lujun9972 +[1]: https://opensource.com/sites/default/files/styles/image-full-size/public/lead-images/rustacean-tshirt.jpg?itok=u7LBmyaj "Rustacean t-shirt" +[2]: https://www.rust-lang.org/ +[3]: https://opensource.com/article/20/5/rust-java +[4]: https://doc.rust-lang.org/std/ +[5]: https://doc.rust-lang.org/cargo/ +[6]: https://aliceevebob.com/2020/09/01/rust-my-top-7-keywords/ diff --git a/published/202107/20201105 6 evening rituals for working in tech.md b/published/202107/20201105 6 evening rituals for working in tech.md new file mode 100644 index 0000000000..76726f4d1e --- /dev/null +++ b/published/202107/20201105 6 evening rituals for working in tech.md @@ -0,0 +1,50 @@ +[#]: collector: "lujun9972" +[#]: translator: "Arzelan" +[#]: reviewer: "wxy" +[#]: publisher: "wxy" +[#]: url: "https://linux.cn/article-13610-1.html" +[#]: subject: "6 evening rituals for working in tech" +[#]: via: "https://opensource.com/article/20/11/evening-rituals-working-tech" +[#]: author: "Jen Wike Huger https://opensource.com/users/jen-wike" + +IT 人的 6 个晚上放松方式 +====== + +> 在结束了一天的远程会议、邮件往来、写代码和其他协作工作后,你在晚上如何放松自己呢? + +![](https://img.linux.net.cn/data/attachment/album/202107/24/100720afeq20kf2wfp4qwi.jpg) + +这个奇怪的时代一方面给我们放慢脚步的机会,但另一方面来说,却比以前更忙了,尤其是当你除了照顾自己还要照顾家人的时候。俗话说,空杯子倒不出酒。所以,让我们看看在关上电脑或者完成最后一件工作之后,能为自己做些什么? + +1、走出家门,做几次深呼吸,不要在乎是不是下雪天,让新鲜的空气从肺部充满全身。如果可以的话,在院子里走走,或者去街上逛逛。 + +2、如果有时间的话,给自己沏杯茶,红茶含有咖啡因,最好不要晚上喝,可以喝绿茶或者花果茶,然后在你穿上鞋(或许还有外套)时让它稍微凉一下。把茶倒在保温杯里,在小区周围散散步。不用设置目标或者目的地,就随便走走。如果你时间不充裕的话,可以定一个 15 分钟的闹钟。 + +3、放一首突然想到的歌,或者听之前想听但是一直没机会听的歌。 + +4、如果你有时间的话,别在椅子上继续坐着,可以站起来跳一段舞活动活动,或者到床上平躺着,躺着的时候什么也不要想,放空自己,让大脑休息休息。研究表明,给大脑一段空白时间后可以更好的思考。 + +5、打开你的 [电子书应用][2] 或者拿起一本纸质书,看纸质书相对来说对眼睛好点。享受轻松的阅读,如果不能长时间阅读的话,起码给自己留出能阅读一个章节的时间。 + +6、制做一些美食。享受把从杂货店买到的基本的食材按照菜谱做成一份美味佳肴的成就感和兴奋感。 + +你也可以在晚上把其中一些综合起来做,好好放松。如果你是 IT 人,那么无论是在 [早上][3]、中午、晚上用这些方式放松都很有效,因为现在我们都是在家工作,远程办公,没有和同事面对面交流时的闲暇。 + +那么,你的晚上放松方式是什么? + +-------------------------------------------------------------------------------- + +via: https://opensource.com/article/20/11/evening-rituals-working-tech + +作者:[Jen Wike Huger][a] +选题:[lujun9972][b] +译者:[Arzelan](https://github.com/Arzelan) +校对:[wxy](https://github.com/wxy) + +本文由 [LCTT](https://github.com/LCTT/TranslateProject) 原创编译,[Linux中国](https://linux.cn/) 荣誉推出 + +[a]: https://opensource.com/users/jen-wike +[b]: https://github.com/lujun9972 +[1]: https://opensource.com/sites/default/files/styles/image-full-size/public/lead-images/EDUCATION_jadud_farm-road.png?itok=of8IuSM5 "A farm road" +[2]: https://opensource.com/article/20/2/linux-ebook-readers +[3]: https://opensource.com/article/20/10/tech-morning-rituals \ No newline at end of file diff --git a/published/202107/20210129 Machine learning made easy with Python.md b/published/202107/20210129 Machine learning made easy with Python.md new file mode 100644 index 0000000000..ac7e31389f --- /dev/null +++ b/published/202107/20210129 Machine learning made easy with Python.md @@ -0,0 +1,216 @@ +[#]: collector: (lujun9972) +[#]: translator: (tanloong) +[#]: reviewer: (wxy) +[#]: publisher: (wxy) +[#]: url: (https://linux.cn/article-13628-1.html) +[#]: subject: (Machine learning made easy with Python) +[#]: via: (https://opensource.com/article/21/1/machine-learning-python) +[#]: author: (Girish Managoli https://opensource.com/users/gammay) + +用 Python 轻松实现机器学习 +====== + +> 用朴素贝叶斯分类器解决现实世界里的机器学习问题。 + +![](https://img.linux.net.cn/data/attachment/album/202107/29/105035ocxdhdob78wmmtzd.jpg) + +朴素贝叶斯Naïve Bayes是一种分类技术,它是许多分类器建模算法的基础。基于朴素贝叶斯的分类器是简单、快速和易用的机器学习技术之一,而且在现实世界的应用中很有效。 + +朴素贝叶斯是从 [贝叶斯定理][2]Bayes' theorem 发展来的。贝叶斯定理由 18 世纪的统计学家 [托马斯·贝叶斯][3] 提出,它根据与一个事件相关联的其他条件来计算该事件发生的概率。比如,[帕金森氏病][4] 患者通常嗓音会发生变化,因此嗓音变化就是与预测帕金森氏病相关联的症状。贝叶斯定理提供了计算目标事件发生概率的方法,而朴素贝叶斯是对该方法的推广和简化。 + +### 解决一个现实世界里的问题 + +这篇文章展示了朴素贝叶斯分类器解决现实世界问题(相对于完整的商业级应用)的能力。我会假设你对机器学习有基本的了解,所以文章里会跳过一些与机器学习预测不大相关的步骤,比如 数据打乱date shuffling数据切片data splitting。如果你是机器学习方面的新手或者需要一个进修课程,请查看 《[An introduction to machine learning today][5]》 和 《[Getting started with open source machine learning][6]》。 + +朴素贝叶斯分类器是 [有监督的][7]supervised、属于 [生成模型][8]generative 的、非线性的、属于 [参数模型][9]parametric 的和 [基于概率的][10]probabilistic。 + +在这篇文章里,我会演示如何用朴素贝叶斯预测帕金森氏病。需要用到的数据集来自 [UCI 机器学习库][11]。这个数据集包含许多语音信号的指标,用于计算患帕金森氏病的可能性;在这个例子里我们将使用这些指标中的前 8 个: + + * **MDVP:Fo(Hz)**:平均声带基频 + * **MDVP:Fhi(Hz)**:最高声带基频 + * **MDVP:Flo(Hz)**:最低声带基频 + * **MDVP:Jitter(%)**、**MDVP:Jitter(Abs)**、**MDVP:RAP**、**MDVP:PPQ** 和 **Jitter:DDP**:5 个衡量声带基频变化的指标 + +这个例子里用到的数据集,可以在我的 [GitHub 仓库][12] 里找到。数据集已经事先做了打乱和切片。 + +### 用 Python 实现机器学习 + +接下来我会用 Python 来解决这个问题。我用的软件是: + + * Python 3.8.2 + * Pandas 1.1.1 + * scikit-learn 0.22.2.post1 + +Python 有多个朴素贝叶斯分类器的实现,都是开源的,包括: + + * **NLTK Naïve Bayes**:基于标准的朴素贝叶斯算法,用于文本分类 + * **NLTK Positive Naïve Bayes**:NLTK Naïve Bayes 的变体,用于对只标注了一部分的训练集进行二分类 + * **Scikit-learn Gaussian Naïve Bayes**:提供了部分拟合方法来支持数据流或很大的数据集(LCTT 译注:它们可能无法一次性导入内存,用部分拟合可以动态地增加数据) + * **Scikit-learn Multinomial Naïve Bayes**:针对离散型特征、实例计数、频率等作了优化 + * **Scikit-learn Bernoulli Naïve Bayes**:用于各个特征都是二元变量/布尔特征的情况 + +在这个例子里我将使用 [sklearn Gaussian Naive Bayes][13]。 + +我的 Python 实现在 `naive_bayes_parkinsons.py` 里,如下所示: + +``` +import pandas as pd + +# x_rows 是我们所使用的 8 个特征的列名 +x_rows=['MDVP:Fo(Hz)','MDVP:Fhi(Hz)','MDVP:Flo(Hz)', + 'MDVP:Jitter(%)','MDVP:Jitter(Abs)','MDVP:RAP','MDVP:PPQ','Jitter:DDP'] +y_rows=['status'] # y_rows 是类别的列名,若患病,值为 1,若不患病,值为 0 + +# 训练 + +# 读取训练数据 +train_data = pd.read_csv('parkinsons/Data_Parkinsons_TRAIN.csv') +train_x = train_data[x_rows] +train_y = train_data[y_rows] +print("train_x:\n", train_x) +print("train_y:\n", train_y) + +# 导入 sklearn Gaussian Naive Bayes,然后进行对训练数据进行拟合 +from sklearn.naive_bayes import GaussianNB + +gnb = GaussianNB() +gnb.fit(train_x, train_y) + +# 对训练数据进行预测 +predict_train = gnb.predict(train_x) +print('Prediction on train data:', predict_train) + +# 在训练数据上的准确率 +from sklearn.metrics import accuracy_score +accuracy_train = accuracy_score(train_y, predict_train) +print('Accuray score on train data:', accuracy_train) + +# 测试 + +# 读取测试数据 +test_data = pd.read_csv('parkinsons/Data_Parkinsons_TEST.csv') +test_x = test_data[x_rows] +test_y = test_data[y_rows] + +# 对测试数据进行预测 +predict_test = gnb.predict(test_x) +print('Prediction on test data:', predict_test) + +# 在测试数据上的准确率 +accuracy_test = accuracy_score(test_y, predict_test) +print('Accuray score on test data:', accuracy_train) +``` + +运行这个 Python 脚本: + +``` +$ python naive_bayes_parkinsons.py + +train_x: +      MDVP:Fo(Hz)  MDVP:Fhi(Hz) ...  MDVP:RAP  MDVP:PPQ  Jitter:DDP +0        152.125       161.469  ...   0.00191   0.00226     0.00574 +1        120.080       139.710  ...   0.00180   0.00220     0.00540 +2        122.400       148.650  ...   0.00465   0.00696     0.01394 +3        237.323       243.709  ...   0.00173   0.00159     0.00519 +..           ...           ...           ...  ...       ...       ...         +155      138.190       203.522  ...   0.00406   0.00398     0.01218 + +[156 rows x 8 columns] + +train_y: +      status +0         1 +1         1 +2         1 +3         0 +..      ... +155       1 + +[156 rows x 1 columns] + +Prediction on train data: [1 1 1 0 ... 1] +Accuracy score on train data: 0.6666666666666666 + +Prediction on test data: [1 1 1 1 ... 1 + 1 1] +Accuracy score on test data: 0.6666666666666666 +``` + +在训练集和测试集上的准确率都是 67%。它的性能还可以进一步优化。你想尝试一下吗?你可以在下面的评论区给出你的方法。 + +### 背后原理 + +朴素贝叶斯分类器从贝叶斯定理发展来的。贝叶斯定理用于计算条件概率,或者说贝叶斯定理用于计算当与一个事件相关联的其他事件发生时,该事件发生的概率。简而言之,它解决了这个问题:_如果我们已经知道事件 x 发生在事件 y 之前的概率,那么当事件 x 再次发生时,事件 y 发生的概率是多少?_ 贝叶斯定理用一个先验的预测值来逐渐逼近一个最终的 [后验概率][14]。贝叶斯定理有一个基本假设,就是所有的参数重要性相同(LCTT 译注:即相互独立)。 + +贝叶斯计算主要包括以下步骤: + + 1. 计算总的先验概率: + $P(患病)$ 和 $P(不患病)$ + 2. 计算 8 种指标各自是某个值时的后验概率 (value1,...,value8 分别是 MDVP:Fo(Hz),...,Jitter:DDP 的取值): + $P(value1,\ldots,value8\ |\ 患病)$ + $P(value1,\ldots,value8\ |\ 不患病)$ + 3. 将第 1 步和第 2 步的结果相乘,最终得到患病和不患病的后验概率: + $P(患病\ |\ value1,\ldots,value8) \propto P(患病) \times P(value1,\ldots,value8\ |\ 患病)$ + $P(不患病\ |\ value1,\ldots,value8) \propto P(不患病) \times P(value1,\ldots,value8\ |\ 不患病)$ + +上面第 2 步的计算非常复杂,朴素贝叶斯将它作了简化: + + 1. 计算总的先验概率: + $P(患病)$ 和 $P(不患病)$ + 2. 对 8 种指标里的每个指标,计算其取某个值时的后验概率: + $P(value1\ |\ 患病),\ldots,P(value8\ |\ 患病)$ + $P(value1\ |\ 不患病),\ldots,P(value8\ |\ 不患病)$ + 3. 将第 1 步和第 2 步的结果相乘,最终得到患病和不患病的后验概率: + $P(患病\ |\ value1,\ldots,value8) \propto P(患病) \times P(value1\ |\ 患病) \times \ldots \times P(value8\ |\ 患病)$ + $P(不患病\ |\ value1,\ldots,value8) \propto P(不患病) \times P(value1\ |\ 不患病) \times \ldots \times P(value8\ |\ 不患病)$ + +这只是一个很初步的解释,还有很多其他因素需要考虑,比如数据类型的差异,稀疏数据,数据可能有缺失值等。 + +### 超参数 + +朴素贝叶斯作为一个简单直接的算法,不需要超参数。然而,有的版本的朴素贝叶斯实现可能提供一些高级特性(比如超参数)。比如,[GaussianNB][13] 就有 2 个超参数: + + * **priors**:先验概率,可以事先指定,这样就不必让算法从数据中计算才能得出。 + * **var_smoothing**:考虑数据的分布情况,当数据不满足标准的高斯分布时,这个超参数会发挥作用。 + +### 损失函数 + +为了坚持简单的原则,朴素贝叶斯使用 [0-1 损失函数][15]。如果预测结果与期望的输出相匹配,损失值为 0,否则为 1。 + +### 优缺点 + +**优点**:朴素贝叶斯是最简单、最快速的算法之一。 +**优点**:在数据量较少时,用朴素贝叶斯仍可作出可靠的预测。 +**缺点**:朴素贝叶斯的预测只是估计值,并不准确。它胜在速度而不是准确度。 +**缺点**:朴素贝叶斯有一个基本假设,就是所有特征相互独立,但现实情况并不总是如此。 + +从本质上说,朴素贝叶斯是贝叶斯定理的推广。它是最简单最快速的机器学习算法之一,用来进行简单和快速的训练和预测。朴素贝叶斯提供了足够好、比较准确的预测。朴素贝叶斯假设预测特征之间是相互独立的。已经有许多朴素贝叶斯的开源的实现,它们的特性甚至超过了贝叶斯算法的实现。 + +-------------------------------------------------------------------------------- + +via: https://opensource.com/article/21/1/machine-learning-python + +作者:[Girish Managoli][a] +选题:[lujun9972][b] +译者:[tanloong](https://github.com/tanloong) +校对:[wxy](https://github.com/wxy) + +本文由 [LCTT](https://github.com/LCTT/TranslateProject) 原创编译,[Linux中国](https://linux.cn/) 荣誉推出 + +[a]: https://opensource.com/users/gammay +[b]: https://github.com/lujun9972 +[1]: https://opensource.com/sites/default/files/styles/image-full-size/public/lead-images/fail_progress_cycle_momentum_arrow.png?itok=q-ZFa_Eh (arrows cycle symbol for failing faster) +[2]: https://en.wikipedia.org/wiki/Bayes%27_theorem +[3]: https://en.wikipedia.org/wiki/Thomas_Bayes +[4]: https://en.wikipedia.org/wiki/Parkinson%27s_disease +[5]: https://opensource.com/article/17/9/introduction-machine-learning +[6]: https://opensource.com/business/15/9/getting-started-open-source-machine-learning +[7]: https://en.wikipedia.org/wiki/Supervised_learning +[8]: https://en.wikipedia.org/wiki/Generative_model +[9]: https://en.wikipedia.org/wiki/Parametric_model +[10]: https://en.wikipedia.org/wiki/Probabilistic_classification +[11]: https://archive.ics.uci.edu/ml/datasets/parkinsons +[12]: https://github.com/gammay/Machine-learning-made-easy-Naive-Bayes/tree/main/parkinsons +[13]: https://scikit-learn.org/stable/modules/generated/sklearn.naive_bayes.GaussianNB.html +[14]: https://en.wikipedia.org/wiki/Posterior_probability +[15]: https://en.wikipedia.org/wiki/Loss_function#0-1_loss_function diff --git a/published/202107/20210317 Programming 101- Input and output with Java.md b/published/202107/20210317 Programming 101- Input and output with Java.md new file mode 100644 index 0000000000..f512ef9a8b --- /dev/null +++ b/published/202107/20210317 Programming 101- Input and output with Java.md @@ -0,0 +1,159 @@ +[#]: subject: (Programming 101: Input and output with Java) +[#]: via: (https://opensource.com/article/21/3/io-java) +[#]: author: (Seth Kenlon https://opensource.com/users/seth) +[#]: collector: (lujun9972) +[#]: translator: (piaoshi) +[#]: reviewer: (wxy) +[#]: publisher: (wxy) +[#]: url: (https://linux.cn/article-13622-1.html) + +编程基础:Java 中的输入和输出 +====== + +> 学习 Java 如何外理数据的读与写。 + +![](https://img.linux.net.cn/data/attachment/album/202107/27/101854by7yizpokqyo77kk.jpg) + +当你写一个程序时,你的应用程序可能需要读取和写入存储在用户计算机上的文件。这在你想加载或存储配置选项,你需要创建日志文件,或你的用户想要保存工作以待后用的情况下是很常见的。每种语言处理这项任务的方式都有所不同。本文演示了如何用 Java 处理数据文件。 + +### 安装 Java + +不管你的计算机是什么平台,你都可以从 [AdoptOpenJDK][2] 安装 Java。这个网站提供安全和开源的 Java 构建。在 Linux 上,你的软件库中也可能找到 AdoptOpenJDK 的构建。 + +我建议你使用最新的长期支持(LTS)版本。最新的非 LTS 版本对希望尝试最新 Java 功能的开发者来说是最好的,但它很可能超过大多数用户所安装的版本 —— 要么是系统上默认安装的,要么是以前为其他 Java 应用安装的。使用 LTS 版本可以确保你与大多数用户所安装的版本保持一致。 + +一旦你安装好了 Java,就可以打开你最喜欢的文本编辑器并准备开始写代码了。你可能还想要研究一下 [Java 集成开发环境][3]。BlueJ 是新程序员的理想选择,而 Eclipse 和 Netbeans 对中级和有经验的编码者更友好。 + +### 利用 Java 读取文件 + +Java 使用 `File` 类来加载文件。 + +这个例子创建了一个叫 `Ingest` 的类来读取文件中数据。当你要在 Java 中打开一个文件时,你创建了一个 `Scanner` 对象,它可以逐行扫描你提供的文件。事实上,`Scanner` 与文本编辑器中的光标是相同的概念,这样你可以用 `Scanner` 的一些方法(如 `nextLine`)来控制这个“光标”以进行读写。 + +``` +import java.io.File; +import java.util.Scanner; +import java.io.FileNotFoundException; + +public class Ingest { + public static void main(String[] args) { + + try { + File myFile = new File("example.txt"); + Scanner myScanner = new Scanner(myFile); + while (myScanner.hasNextLine()) { + String line = myScanner.nextLine(); + System.out.println(line); + } + myScanner.close(); + } catch (FileNotFoundException ex) { + ex.printStackTrace(); + } //try + } //main +} //class +``` + +这段代码首先在假设存在一个名为 `example.txt` 的文件的情况下创建了变量 `myfile`。如果该文件不存在,Java 就会“抛出一个异常”(如它所说的,这意味着它在你试图做的事情中发现了一个错误),这个异常是被非常特定的 `FileNotFoundException` 类所“捕获”。事实上,有一个专门的类来处理这个明确的错误,这说明这个错误是多么常见。 + +接下来,它创建了一个 `Scanner` 并将文件加载到其中。我把它叫做 `myScanner`,以区别于它的通用类模板。接着,一个 `while` 循环将 `myScanner` 逐行送入文件中,只要 _存在_ 下一行。这就是 `hasNextLine` 方法的作用:它检测“光标”之后是否还有数据。你可以通过在文本编辑器中打开一个文件来模拟这个过程:你的光标从文件的第一行开始,你可以用键盘控制光标来向下扫描文件,直到你走完了所有的行。 + +`while` 循环创建了一个变量 `line`,并将文件当前行的数据分配给它。然后将 `line` 的内容打印出来以提供反馈。一个更有用的程序可能会解析每一行的内容,从而提取它所包含的任何重要数据。 + +在这个过程结束时,关闭 `myScanner` 对象。 + +### 运行代码 + +将你的代码保存到 `Ingest.java` 文件(这是一个 Java 惯例,将类名的首字母大写,并以类名来命名相应的文件)。如果你试图运行这个简单的应用程序,你可能会接收到一个错误信息,这是因为还没有 `example.txt` 文件供应用程序加载: + +``` +$ java ./Ingest.java +java.io.FileNotFoundException: +example.txt (No such file or directory) +``` + +正好可以编写一个将数据写入文件的 Java 应用程序,多么完美的时机! + +### 利用 Java 将数据写入文件 + +无论你是存储用户使用你的应用程序创建的数据,还是仅仅存储关于用户在应用程序中做了什么的元数据(例如,游戏保存或最近播放的歌曲),有很多很好的理由来存储数据供以后使用。在 Java 中,这是通过 `FileWriter` 类实现的,这次先打开一个文件,向其中写入数据,然后关闭该文件。 + +``` +import java.io.FileWriter; +import java.io.IOException; + +public class Exgest { + public static void main(String[] args) { + try { + FileWriter myFileWriter = new FileWriter("example.txt", true); + myFileWriter.write("Hello world\n"); + myFileWriter.close(); + } catch (IOException ex) { + System.out.println(ex); + } // try + } // main +} +``` + +这个类的逻辑和流程与读取文件类似。但它不是一个 `Scanner`,而是以一个文件的名字为参数创建的一个 `FileWriter` 对象。`FileWriter` 语句末尾的 `true` 标志告诉 `FileWriter` 将文本 _追加_ 到文件的末尾。要覆盖一个文件的内容,请移除 `true` 标志。 + +``` +`FileWriter myFileWriter = new FileWriter("example.txt", true);` +``` + +因为我在向文件中写入纯文本,所以我在写入文件的数据(`Hello world`)的结尾处手动添加了换行符(`\n`)。 + +### 试试代码 + +将这段代码保存到 `Exgest.java` 文件,遵循 Java 的惯例,使文件名为与类名相匹配。 + +既然你已经掌握了用 Java 创建和读取数据的方法,你可以按相反的顺序尝试运行你的新应用程序。 + +``` +$ java ./Exgest.java +$ java ./Ingest.java +Hello world +$ +``` + +因为程序是把数据追加到文件末尾,所以你可以重复执行你的应用程序以多次写入数据,只要你想把更多的数据添加到你的文件中。 + +``` +$ java ./Exgest.java +$ java ./Exgest.java +$ java ./Exgest.java +$ java ./Ingest.java +Hello world +Hello world +Hello world +$ +``` + +### Java 和数据 + +你不会经常向文件中写入原始文本;事实上,你可能会使用一个其它的类库以写入特定的格式。例如,你可能使用 XML 类库来写复杂的数据,使用 INI 或 YAML 类库来写配置文件,或者使用各种专门类库来写二进制格式,如图像或音频。 + +更完整的信息,请参阅 [OpenJDK 文档][10]。 + +-------------------------------------------------------------------------------- + +via: https://opensource.com/article/21/3/io-java + +作者:[Seth Kenlon][a] +选题:[lujun9972][b] +译者:[piaoshi](https://github.com/piaoshi) +校对:[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/java-coffee-mug.jpg?itok=Bj6rQo8r (Coffee beans and a cup of coffee) +[2]: https://adoptopenjdk.net +[3]: https://opensource.com/article/20/7/ide-java +[4]: http://www.google.com/search?hl=en&q=allinurl%3Adocs.oracle.com+javase+docs+api+string +[5]: http://www.google.com/search?hl=en&q=allinurl%3Adocs.oracle.com+javase+docs+api+file +[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+filenotfoundexception +[8]: http://www.google.com/search?hl=en&q=allinurl%3Adocs.oracle.com+javase+docs+api+filewriter +[9]: http://www.google.com/search?hl=en&q=allinurl%3Adocs.oracle.com+javase+docs+api+ioexception +[10]: https://access.redhat.com/documentation/en-us/openjdk/11/ diff --git a/published/202107/20210418 F(r)iction- Or How I Learnt to Stop Worrying and Start Loving Vim.md b/published/202107/20210418 F(r)iction- Or How I Learnt to Stop Worrying and Start Loving Vim.md new file mode 100644 index 0000000000..f90216e9ea --- /dev/null +++ b/published/202107/20210418 F(r)iction- Or How I Learnt to Stop Worrying and Start Loving Vim.md @@ -0,0 +1,157 @@ +[#]: subject: (F\(r\)iction: Or How I Learnt to Stop Worrying and Start Loving Vim) +[#]: via: (https://news.itsfoss.com/how-i-started-loving-vim/) +[#]: author: (Theena https://news.itsfoss.com/author/theena/) +[#]: collector: (lujun9972) +[#]: translator: (piaoshi) +[#]: reviewer: (wxy) +[#]: publisher: (wxy) +[#]: url: (https://linux.cn/article-13634-1.html) + +小说还是折磨:我如何学会克服焦虑并开始爱上 Vim +====== + +> 非技术人员也可以使用 Linux 和开源软件进行非技术工作。这是我的故事。 + +![](https://i2.wp.com/news.itsfoss.com/wp-content/uploads/2021/04/vim-writer.png?w=1200&ssl=1) + +(LCTT 译注:本文原文标题用 “F(r)iction” 一语双关的表示了小说fiction写作过程中的摩擦friction苦恼。) + +时间:2009 年 12 月。我准备辞去工作。 + +我希望专心写我的第一本书;我的工作职责和技术环境都没办法让我完成这本书的写作。 + +写作是件苦差事。 + +在现代世界中,很少有工作像写作这样奇特或者说艰巨的追求 —— 面对一张白纸,坐下来,迫使你的大脑吐出文字,向读者传达一个想法。当然,我并不是说写作不能与他人合作完成,而只是想说明,对于作家来说,自己着手写一部新作品是多么令人生畏。小说还是非小说写作都是如此。但由于我是一名小说家,我在这篇文章中主要想关注是小说的写作。 + +![][1] + +还记得 2009 年是什么样子吗? + +智能手机已经诞生 3 年了 —— 而我还在使用功能机。笔记本电脑又大又笨重。同时,基于云的生产力 Web 应用还处于起步阶段,并不那么好用。从技术上讲,像我这样的作家们正在以 Gmail 账户(和一个非常年轻的基于云的存储服务 Dropbox)作为一个始终可用的选项来处理自己的草稿,即使我的个人电脑不在身边。虽然这与作家们必须要使用打字机(或,上帝保佑,使用笔和纸)工作时相比已经是一个很好的变化了,但并没有好多少。 + +首先,对手稿的版本控制是一场噩梦。此外,我为简化工作流程而在工具包中添加的工具越多,我转换写作环境(无论是用户界面还是用户体验)的次数就越多。 + +我是在 Windows 记事本上开始写草稿的,然后把它保存在家里电脑上的 MS Word 文档中,用电子邮件发给自己一份副本,同时在 Dropbox 上保留另一份副本(因为在上班时无法访问 Dropbox),在公司时对该文件的副本进行处理,在一天结束时用电子邮件发给自己,在家里的电脑上下载它,用一个新的名字和相应的日期保存它,这样我就能认出该文件是在公司(而不是家里)进行修改的……好吧,你知道这是怎样一个画面。如果你能感受到这种涉及 Windows 记事本、MS Word、Gmail 和 Dropbox 的工作流程有多么疯狂,那么现在你就知道我为什么辞职了。 + +让我更清醒的是,我仍然知道一些作家,其中竟然有些还是好作家,依然在使用我 2009 年遵循的工作流程的各种变体。 + +在接下来的三年里,我一直在写手稿,在 2012 年完成了初稿。在这三年里,技术环境发生了很大变化。智能手机确实相当给力,我在 2009 年遇到的一些复杂情况已经消失了。我仍然可以用手机处理我在家里外理的文件(不一定是新的写作,但由于手机上的 Dropbox,编辑变得相当容易)。我的主要写作工具仍然是微软的 Windows 记事本和 Word,我就是这样完成初稿的。 + +小说 [《第一声》][2] 于 2016 年出版,获得了评论界和商业界的好评。 + +结束了。 + +或许我是这么想的。 + +我一完成手稿发给了编辑,就已经开始着手第二部小说的写作。我不再为写作而辞职,而是采取了一种更务实的方法:我会在每年年底请两个星期的假,这样我就可以到山上的一个小木屋里去写作。 + +花了半天时间我才意识到,那些让我讨厌的 [写作工具][3] 和工作流程并没有消失,而是演变成了一个更复杂的野兽。作为一个作家,我并不像我想像的那样高产或高效。 + +### 新冠期间的 Linux + +![][4] + +时间:2020 年。世界正处于集体疯狂的边缘。 + +起初在中国分离出的一种新型病毒正在演变成 1911 年以来的第一次全球大流行疾病。3 月 20 日,斯里兰卡,跟随世界上大多数国家的脚步,封城了。 + +四月是斯里兰卡旱季的高峰。在像科伦坡这样的混凝土丛林中,温度可以达到三十多度,湿度高达九十多度。在最好的情况下,它也可以使大多数人精神错乱,更别说在全球大流行病正在进行的时候,被困在没有一直开着空调的家里?真是一个让人疯狂的好温床。 + +让我的疯狂是 Linux,或者说是“发行版跳跃”,像我们在开源社区中所说的。 + +我越在各种 *nix 发行版间蹿来蹿,我就对控制的想法越迷恋。当任何事情似乎都不在我们的控制之中时 —— 即使是与另一个人握手这样的简单行为 —— 我们自然会倾向于做那些我们感觉更有控制力的事。 + +在我的生活中,还有什么比计算机更容易被控制的呢?自然,这也延伸到我的写作工具和工作流程。 + +### 通往 Vim 之路 + +有一个关于 [Vim][5] 的笑话完美地描述了我对它的第一次体验:人们对 Vim 难以割舍是因为他们不知道怎么关掉它。 + +我试图编辑一个配置文件,而 [新安装的 Ubuntu 服务器][6] 只预装了 Vim 文本编辑器。第一次是恐慌 —— 以至于我重新启动了机器,以为操作系统没有识别出我的键盘。然而当它再次发生时,不可避免地,我谷歌搜索:“[我该如何关闭 Vim?][7]” + +_哦。这真有趣_,我想。 + +_但为什么呢?_ + +要理解我为什么会对一个复杂到无法关闭的文本编辑器有点兴趣,你必须了解我是多么崇拜 Windows 记事本。 + +作为一个作家,我喜欢在它的没有废话、没有按钮、白纸一样的画布上写作。它没有拼写检查。它没有格式。但这些我并不关心。 + +对于我这个作家来说,记事本是有史以来最好的草稿写作板。不幸的是,它并不强大 —— 所以即使我会先用记事本写草稿,一旦超过 1000 字,我就会把它移到 MS Word 上 —— 记事本不是为散文而生的,当超过这个字数限制时,这些局限就会凸显出来。 + +因此,当我把我所有的计算机工作从 Windows 上迁移走时,我第一个要安装的就是一个好的文本编辑器。 + +[Kate][8] 是第一个让我感到比用 Windows 记事本更舒服的替代品 —— 它更强大(它有拼写检查功能!),而且,我可以在同一个环境中搞一些业余爱好式的编程。 + +当时它是我的爱。 + +但后来 Vim 出现了。 + +我对 Vim 了解得越多,看开发者在 Vim 上现场进行编码的次数越多,我就越发现自己在编辑文本时更想打开 Vim。我使用 Unix 传统意义上“文本编辑”这一短语:编辑配置文件中的文本块,或者有时编写基本的 Bash 脚本。 + +我仍然没有用 Vim 来满足我的散文写作需求。 + +在这方面我有 Libre Office。 + +算是吧。 + +虽然它是一个适当的 [MS Office 替代品][9],但我发现自己没有被它打动。它的用户界面可能比 MS Word 更让人分心,而且每个发行版都有不同的 Libre Office 软件包,我发现自己使用的是一个非常零散的工具包和工作流程,更不用说用户界面在不同的发行版和桌面环境中差异是多么大。 + +事情变得更加复杂了,因为我也开始读我的硕士学位了。这时,我要在 Kate 上做笔记,把它们转移到 Libre Office 上,然后保存到我的 Dropbox 上。 + +我每天都面临着情境转换。 + +生产力下降,因为我不得不打开和关闭一些不相关的应用程序。我需要一个写作工具来满足我所有的需求,无论是作为一个小说家,还是一个学生、亦或是一个业余的程序员。 + +这时我意识到,解决我场景切换噩梦的方法也同样摆在我的面前。 + +这时,我已经经常使用 Vim —— 甚至在我的安卓手机上利用 Termux 使用它。这使我对要把所有东西都搬到 Vim 上的想法感到相当舒服。由于它支持 Markdown 语法,记笔记也会变得更加容易。 + +这仅仅是大约两个月前的事。 + +现在怎么样了? + +时间:2021 年 4 月。 + +坐在出租车上,我通过 Termux(借助蓝牙键盘)[用 Vim][10] 在手机上开始写这个草稿。我把文件推送到 GitHub 上我的用于写作使用的私人仓库,我从那里把文件拉到我的电脑上,又写了几行,然后再次出门。我把新版本的文件从 GitHub 拉到我的手机上,修改、推送,如此往复,直到我把最后的草稿用电子邮件发给编辑。 + +现在,场景切换的情景已经不复存在。 + +在文字处理器中写作所带来的分心问题也没有了。 + +编辑工作变得无比简单,而且更快了。 + +我的手腕不再疼痛,因为我不再需要鼠标了。 + +现在是 2021 年 4 月。 + +我是一名小说家。 + +而我在 Vim 上写作。 + +怎么做的?我将在本专栏系列的第二部分讨论这个工作流程的具体内容,即非技术人员如何使用免费和开源技术。敬请关注。 + +-------------------------------------------------------------------------------- + +via: https://news.itsfoss.com/how-i-started-loving-vim/ + +作者:[Theena][a] +选题:[lujun9972][b] +译者:[piaoshi](https://github.com/piaoshi) +校对:[wxy](https://github.com/wxy) + +本文由 [LCTT](https://github.com/LCTT/TranslateProject) 原创编译,[Linux中国](https://linux.cn/) 荣誉推出 + +[a]: https://news.itsfoss.com/author/theena/ +[b]: https://github.com/lujun9972 +[1]: https://i1.wp.com/news.itsfoss.com/wp-content/uploads/2021/04/Cellphones-different-generations-set.png?w=800&ssl=1 +[2]: https://www.goodreads.com/book/show/29616237-first-utterance +[3]: https://itsfoss.com/open-source-tools-writers/ +[4]: https://i2.wp.com/news.itsfoss.com/wp-content/uploads/2021/04/quarantine.jpg?w=800&ssl=1 +[5]: https://www.vim.org/ +[6]: https://itsfoss.com/install-ubuntu-server-raspberry-pi/ +[7]: https://itsfoss.com/how-to-exit-vim/ +[8]: https://kate-editor.org/ +[9]: https://itsfoss.com/best-free-open-source-alternatives-microsoft-office/ +[10]: https://linuxhandbook.com/basic-vim-commands/ diff --git a/published/202107/20210508 My weird jobs before tech.md b/published/202107/20210508 My weird jobs before tech.md new file mode 100644 index 0000000000..33c1d30cb9 --- /dev/null +++ b/published/202107/20210508 My weird jobs before tech.md @@ -0,0 +1,49 @@ +[#]: subject: (My weird jobs before tech) +[#]: via: (https://opensource.com/article/21/5/weird-jobs-tech) +[#]: author: (Chris Hermansen https://opensource.com/users/clhermansen) +[#]: collector: (lujun9972) +[#]: translator: (MM-BCY) +[#]: reviewer: (wxy) +[#]: publisher: (wxy) +[#]: url: (https://linux.cn/article-13553-1.html) + +我在进入技术行业之前的奇怪工作 +====== + +> 你永远不会知道从你的第一份工作会走到哪里! + +![Yellow plane flying in the air, Beechcraft D17S][1] + +在我从事技术工作之前,我做过一些奇怪的工作。 + +我是一家飞机修理厂的初级助理,这意味着我的工作要在溶剂中清洗肮脏的金属零件(哇,70 年代的事情可和现在不一样)。我在那里最有趣的工作是熨烫涤纶飞机的布料,放到一架正在修理中的漂亮的老式比奇交错式双翼机Beechcraft Staggerwing的木制副翼和水平稳定器上。 + +在大学期间的一个夏天,我在同一个机场的一个团队工作,混合阻燃剂,然后把它注入灭火飞机(“[水轰炸机][2]water bomber”)。那可能是我做过的最脏的工作了,但是给飞机装载还是挺酷的。有一个离地面约两米的小挡板,你可以在把填充软管连接到接头后把手指伸进去。然后泵上的人启动泵。当你觉得你的手指湿了,就挥手让管理泵的人停止泵。与此同时,在你前方几米处运行的右侧径向引擎噪音极大,螺旋桨吹掉了你身上因混合阻燃剂而积聚的红色粉尘。如果你搞砸了,让飞机装得太满,他们就得滑到一块地方,把货卸在那里,否则他们会太重而无法起飞。 + +另外两个夏天,我在当地的百事可乐、七喜、Orange Crush 经销商那里工作,给商店和餐馆送一箱箱的软饮料。这绝对是我做过的最重的体力活了。想想看,在一辆手推车上堆放着五层高的木箱,每个木箱里装着一打 750 毫升的软饮料玻璃瓶。想想把它搬到二楼的餐厅,想想那家餐厅每周要运 120 箱……爬 24 次楼,然后又带着所有的空瓶子下来。一辆小卡车上通常会有 300 箱左右的软饮料。我们的工资是按载重计算的,而不是按小时计算的,所以我们的目标是早点完工,然后去海滩。 + +### 我的技术工作 + +送苏打水是我大学期间最后一份暑期工作。第二年我毕业了,获得了数学学位,还修了很多计算机课程,尤其是数值分析。我在技术领域的第一份工作,是为一家小型电脑服务咨询公司工作。我用 SPSS 对一些运动钓鱼调查做了一些分析,写了几百行 PL/1,在我们按时间租来的服务部门的 IBM 3800 激光打印机上打印演唱会门票,并开始研究一些程序来分析森林统计数据。我最终为需要林业统计的客户工作,在 20 世纪 80 年代中期成为合伙人。那时我们已经不仅仅是测量树木,也不再使用分时服务部门timesharing bureau来进行计算了。我们买了一台 UNIX 小型计算机,我们在 80 年代后期升级到 SUN 工作站网络。 + +我在一个大型开发项目上工作了一段时间,它的总部设在马来西亚吉隆坡。然后我们买了第一个地理信息系统,在 80 年代末和 90 年代,我的大部分时间都在和我们的客户一起工作,他们需要定制软件来满足他们的业务需求。到了 21 世纪初,我的三个老合伙人都准备退休了,我试图弄明白,我是如何融入我们这个不再是小公司的,大约 200 名员工的长期图景。我们新的员工老板也不明白这一点,2002 年,我来到智利,想看看智利-加拿大自由贸易协定,是否提供了一个合理的机会,把我们的部分业务转移到拉丁美洲。 + +该业务在 2004 年正式成立。与此同时,加拿大的母公司由于一些投资组合受到严重影响,在 2007-2009 年的经济衰退的情况下,这些投资似乎不再那么明智,它在 2011 年被迫倒闭。然而,那时候,智利子公司还在经营,所以我们原来的雇员和我成了合伙人,通过资产出售买下了它。直到今天,它仍在运行,在社会环境领域做了很多很酷的事情,我经常参与其中,特别是当我可靠的数学和计算背景有用的时候。 + +作为一个副业,我为一个在印度以买卖赛马为业的人开发和支持一个赛马信息系统。 + +-------------------------------------------------------------------------------- + +via: https://opensource.com/article/21/5/weird-jobs-tech + +作者:[Chris Hermansen][a] +选题:[lujun9972][b] +译者:[MM-BCY](https://github.com/MM-BCY) +校对:[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/yellow_plane_fly_air.jpg?itok=pEcrCVJT (Yellow plane flying in the air, Beechcraft D17S) +[2]: https://worldairphotography.wordpress.com/2016/08/22/air-tanker-history-in-canada-part-one/amp/ diff --git a/published/202107/20210517 How to look at the stack with gdb.md b/published/202107/20210517 How to look at the stack with gdb.md new file mode 100644 index 0000000000..5c2f5ced83 --- /dev/null +++ b/published/202107/20210517 How to look at the stack with gdb.md @@ -0,0 +1,385 @@ +[#]: subject: "How to look at the stack with gdb" +[#]: via: "https://jvns.ca/blog/2021/05/17/how-to-look-at-the-stack-in-gdb/" +[#]: author: "Julia Evans https://jvns.ca/" +[#]: collector: "lujun9972" +[#]: translator: "amwps290" +[#]: reviewer: "wxy" +[#]: publisher: "wxy" +[#]: url: "https://linux.cn/article-13550-1.html" + +使用 GDB 查看程序的栈空间 +====== + +![](https://img.linux.net.cn/data/attachment/album/202107/05/103738f00boylephggpeyh.jpg) + +昨天我和一些人在闲聊的时候,他们说他们并不真正了解栈是如何工作的,而且也不知道如何去查看栈空间。 + +这是一个快速教程,介绍如何使用 GDB 查看 C 程序的栈空间。我认为这对于 Rust 程序来说也是相似的。但我这里仍然使用 C 语言,因为我发现用它更简单,而且用 C 语言也更容易写出错误的程序。 + +### 我们的测试程序 + +这里是一个简单的 C 程序,声明了一些变量,从标准输入读取两个字符串。一个字符串在堆上,另一个字符串在栈上。 + +``` +#include +#include + +int main() { + char stack_string[10] = "stack"; + int x = 10; + char *heap_string; + + heap_string = malloc(50); + + printf("Enter a string for the stack: "); + gets(stack_string); + printf("Enter a string for the heap: "); + gets(heap_string); + printf("Stack string is: %s\n", stack_string); + printf("Heap string is: %s\n", heap_string); + printf("x is: %d\n", x); +} +``` + +这个程序使用了一个你可能从来不会使用的极为不安全的函数 `gets` 。但我是故意这样写的。当出现错误的时候,你就知道是为什么了。 + +### 第 0 步:编译这个程序 + +我们使用 `gcc -g -O0 test.c -o test` 命令来编译这个程序。 + +`-g` 选项会在编译程序中将调式信息也编译进去。这将会使我们查看我们的变量更加容易。 + +`-O0` 选项告诉 gcc 不要进行优化,我要确保我们的 `x` 变量不会被优化掉。 + +### 第一步:启动 GDB + +像这样启动 GDB: + +``` +$ gdb ./test +``` + +它打印出一些 GPL 信息,然后给出一个提示符。让我们在 `main` 函数这里设置一个断点: + +``` +(gdb) b main +``` + +然后我们就可以运行程序: + +``` +(gdb) b main +Starting program: /home/bork/work/homepage/test +Breakpoint 1, 0x000055555555516d in main () + +(gdb) run +Starting program: /home/bork/work/homepage/test + +Breakpoint 1, main () at test.c:4 +4 int main() { +``` + +好了,现在程序已经运行起来了。我们就可以开始查看栈空间了。 + +### 第二步:查看我们变量的地址 + +让我们从了解我们的变量开始。它们每个都在内存中有一个地址,我们可以像这样打印出来: + +``` +(gdb) p &x +$3 = (int *) 0x7fffffffe27c +(gdb) p &heap_string +$2 = (char **) 0x7fffffffe280 +(gdb) p &stack_string +$4 = (char (*)[10]) 0x7fffffffe28e +``` + +因此,如果我们查看那些地址的堆栈,那我们应该能够看到所有的这些变量! + +### 概念:栈指针 + +我们将需要使用栈指针,因此我将尽力对其进行快速解释。 + +有一个名为 ESP 的 x86 寄存器,称为“栈指针stack pointer”。 基本上,它是当前函数的栈起始地址。 在 GDB 中,你可以使用 `$sp` 来访问它。 当你调用新函数或从函数返回时,栈指针的值会更改。 + +### 第三步:在 `main` 函数开始的时候,我们查看一下在栈上的变量 + +首先,让我们看一下 main 函数开始时的栈。 现在是我们的堆栈指针的值: + +``` +(gdb) p $sp +$7 = (void *) 0x7fffffffe270 +``` + +因此,我们当前函数的栈起始地址是 `0x7fffffffe270`,酷极了。 + +现在,让我们使用 GDB 打印出当前函数堆栈开始后的前 40 个字(即 160 个字节)。 某些内存可能不是栈的一部分,因为我不太确定这里的堆栈有多大。 但是至少开始的地方是栈的一部分。 + +``` +(gdb) x/40x $sp +0x7fffffffe270: 0x00000000 0x00000000 0x55555250 0x00005555 +0x7fffffffe280: 0x00000000 0x00000000 0x55555070 0x00005555 +0x7fffffffe290: 0xffffe390 0x00007fff 0x00000000 0x00000000 +0x7fffffffe2a0: 0x00000000 0x00000000 0xf7df4b25 0x00007fff +0x7fffffffe2b0: 0xffffe398 0x00007fff 0xf7fca000 0x00000001 +0x7fffffffe2c0: 0x55555169 0x00005555 0xffffe6f9 0x00007fff +0x7fffffffe2d0: 0x55555250 0x00005555 0x3cae816d 0x8acc2837 +0x7fffffffe2e0: 0x55555070 0x00005555 0x00000000 0x00000000 +0x7fffffffe2f0: 0x00000000 0x00000000 0x00000000 0x00000000 +0x7fffffffe300: 0xf9ce816d 0x7533d7c8 0xa91a816d 0x7533c789 +``` + +我已粗体显示了 `stack_string`,`heap_string` 和 `x` 变量的位置,并改变了颜色: + + * `x` 是红色字体,并且起始地址是 `0x7fffffffe27c` + * `heap_string` 是蓝色字体,起始地址是 `0x7fffffffe280` + * `stack_string` 是紫色字体,起始地址是 `0x7fffffffe28e` + +你可能会在这里注意到的一件奇怪的事情是 `x` 的值是 0x5555,但是我们将 `x` 设置为 `10`! 那是因为直到我们的 `main` 函数运行之后才真正设置 `x` ,而我们现在才到了 `main` 最开始的地方。 + +### 第三步:运行到第十行代码后,再次查看一下我们的堆栈 + +让我们跳过几行,等待变量实际设置为其初始化值。 到第 10 行时,`x` 应该设置为 `10`。 + +首先我们需要设置另一个断点: + +``` +(gdb) b test.c:10 +Breakpoint 2 at 0x5555555551a9: file test.c, line 11. +``` + +然后继续执行程序: + +``` +(gdb) continue +Continuing. + +Breakpoint 2, main () at test.c:11 +11 printf("Enter a string for the stack: "); +``` + +好的! 让我们再来看看堆栈里的内容! `gdb` 在这里格式化字节的方式略有不同,实际上我也不太关心这些(LCTT 译注:可以查看 GDB 手册中 `x` 命令,可以指定 `c` 来控制输出的格式)。 这里提醒一下你,我们的变量在栈上的位置: + + + * `x` 是红色字体,并且起始地址是 `0x7fffffffe27c` + * `heap_string` 是蓝色字体,起始地址是 `0x7fffffffe280` + * `stack_string` 是紫色字体,起始地址是 `0x7fffffffe28e` + +``` +(gdb) x/80x $sp +0x7fffffffe270: 0x00 0x00 0x00 0x00 0x00 0x00 0x00 0x00 +0x7fffffffe278: 0x50 0x52 0x55 0x55 0x0a 0x00 0x00 0x00 +0x7fffffffe280: 0xa0 0x92 0x55 0x55 0x55 0x55 0x00 0x00 +0x7fffffffe288: 0x70 0x50 0x55 0x55 0x55 0x55 0x73 0x74 +0x7fffffffe290: 0x61 0x63 0x6b 0x00 0x00 0x00 0x00 0x00 +0x7fffffffe298: 0x00 0x80 0xf7 0x8a 0x8a 0xbb 0x58 0xb6 +0x7fffffffe2a0: 0x00 0x00 0x00 0x00 0x00 0x00 0x00 0x00 +0x7fffffffe2a8: 0x25 0x4b 0xdf 0xf7 0xff 0x7f 0x00 0x00 +0x7fffffffe2b0: 0x98 0xe3 0xff 0xff 0xff 0x7f 0x00 0x00 +0x7fffffffe2b8: 0x00 0xa0 0xfc 0xf7 0x01 0x00 0x00 0x00 +``` + +在继续往下看之前,这里有一些有趣的事情要讨论。 + +### `stack_string` 在内存中是如何表示的 + +现在(第 10 行),`stack_string` 被设置为字符串`stack`。 让我们看看它在内存中的表示方式。 + +我们可以像这样打印出字符串中的字节(LCTT 译注:可以通过 `c` 选项直接显示为字符): + +``` +(gdb) x/10x stack_string +0x7fffffffe28e: 0x73 0x74 0x61 0x63 0x6b 0x00 0x00 0x00 +0x7fffffffe296: 0x00 0x00 +``` + +`stack` 是一个长度为 5 的字符串,相对应 5 个 ASCII 码- `0x73`、`0x74`、`0x61`、`0x63` 和 `0x6b`。`0x73` 是字符 `s` 的 ASCII 码。 `0x74` 是 `t` 的 ASCII 码。等等... + +同时我们也使用 `x/1s` 可以让 GDB 以字符串的方式显示: + +``` +(gdb) x/1s stack_string +0x7fffffffe28e: "stack" +``` + +### `heap_string` 与 `stack_string` 有何不同 + +你已经注意到了 `stack_string` 和 `heap_string` 在栈上的表示非常不同: + +* `stack_string` 是一段字符串内容(`stack`) +* `heap_string` 是一个指针,指向内存中的某个位置 + +这里是 `heap_string` 变量在内存中的内容: + +``` +0xa0 0x92 0x55 0x55 0x55 0x55 0x00 0x00 +``` + +这些字节实际上应该是从右向左读:因为 x86 是小端模式,因此,`heap_string` 中所存放的内存地址 `0x5555555592a0` + +另一种方式查看 `heap_string` 中存放的内存地址就是使用 `p` 命令直接打印 : + +``` +(gdb) p heap_string +$6 = 0x5555555592a0 "" +``` + +### 整数 x 的字节表示 + +`x` 是一个 32 位的整数,可由 `0x0a 0x00 0x00 0x00` 来表示。 + +我们还是需要反向来读取这些字节(和我们读取 `heap_string` 需要反过来读是一样的),因此这个数表示的是 `0x000000000a` 或者是 `0x0a`,它是一个数字 `10`; + +这就让我把把 `x` 设置成了 `10`。 + +### 第四步:从标准输入读取 + +好了,现在我们已经初始化我们的变量,我们来看一下当这段程序运行的时候,栈空间会如何变化: + +``` +printf("Enter a string for the stack: "); +gets(stack_string); +printf("Enter a string for the heap: "); +gets(heap_string); +``` + +我们需要设置另外一个断点: + +``` +(gdb) b test.c:16 +Breakpoint 3 at 0x555555555205: file test.c, line 16. +``` + +然后继续执行程序: + +``` +(gdb) continue +Continuing. +``` + +我们输入两个字符串,为栈上存储的变量输入 `123456789012` 并且为在堆上存储的变量输入 `bananas`; + +### 让我们先来看一下 `stack_string`(这里有一个缓存区溢出) + +``` +(gdb) x/1s stack_string +0x7fffffffe28e: "123456789012" +``` + +这看起来相当正常,对吗?我们输入了 `12345679012`,然后现在它也被设置成了 `12345679012`(LCTT 译注:实测 gcc 8.3 环境下,会直接段错误)。 + +但是现在有一些很奇怪的事。这是我们程序的栈空间的内容。有一些紫色高亮的内容。 + +``` +0x7fffffffe270: 0x00 0x00 0x00 0x00 0x00 0x00 0x00 0x00 +0x7fffffffe278: 0x50 0x52 0x55 0x55 0x0a 0x00 0x00 0x00 +0x7fffffffe280: 0xa0 0x92 0x55 0x55 0x55 0x55 0x00 0x00 +0x7fffffffe288: 0x70 0x50 0x55 0x55 0x55 0x55 0x31 0x32 +0x7fffffffe290: 0x33 0x34 0x35 0x36 0x37 0x38 0x39 0x30 +0x7fffffffe298: 0x31 0x32 0x00 0x8a 0x8a 0xbb 0x58 0xb6 +0x7fffffffe2a0: 0x00 0x00 0x00 0x00 0x00 0x00 0x00 0x00 +0x7fffffffe2a8: 0x25 0x4b 0xdf 0xf7 0xff 0x7f 0x00 0x00 +0x7fffffffe2b0: 0x98 0xe3 0xff 0xff 0xff 0x7f 0x00 0x00 +0x7fffffffe2b8: 0x00 0xa0 0xfc 0xf7 0x01 0x00 0x00 0x00 +``` + +令人奇怪的是 **`stack_string` 只支持 10 个字节**。但是现在当我们输入了 13 个字符以后,发生了什么? + +这是一个典型的缓冲区溢出,`stack_string` 将自己的数据写在了程序中的其他地方。在我们的案例中,这还没有造成问题,但它会使你的程序崩溃,或者更糟糕的是,使你面临非常糟糕的安全问题。 + +例如,假设 `stack_string` 在内存里的位置刚好在 `heap_string` 之前。那我们就可能覆盖 `heap_string` 所指向的地址。我并不确定 `stack_string` 之后的内存里有一些什么。但我们也许可以用它来做一些诡异的事情。 + +### 确实检测到了有缓存区溢出 + +当我故意写很多字符的时候: + +``` + ./test +Enter a string for the stack: 01234567891324143 +Enter a string for the heap: adsf +Stack string is: 01234567891324143 +Heap string is: adsf +x is: 10 +*** stack smashing detected ***: terminated +fish: Job 1, './test' terminated by signal SIGABRT (Abort) +``` + +这里我猜是 `stack_string` 已经到达了这个函数栈的底部,因此额外的字符将会被写在另一块内存中。 + +当你故意去使用这个安全漏洞时,它被称为“堆栈粉碎”,而且不知何故有东西在检测这种情况的发生。 + +我也觉得这很有趣,虽然程序被杀死了,但是当缓冲区溢出发生时它不会立即被杀死——在缓冲区溢出之后再运行几行代码,程序才会被杀死。 好奇怪! + +这些就是关于缓存区溢出的所有内容。 + +### 现在我们来看一下 `heap_string` + +我们仍然将 `bananas` 输入到 `heap_string` 变量中。让我们来看一下内存中的样子。 + +这是在我们读取了字符串以后,`heap_string` 在栈空间上的样子: + +``` +(gdb) x/40x $sp +0x7fffffffe270: 0x00 0x00 0x00 0x00 0x00 0x00 0x00 0x00 +0x7fffffffe278: 0x50 0x52 0x55 0x55 0x0a 0x00 0x00 0x00 +0x7fffffffe280: 0xa0 0x92 0x55 0x55 0x55 0x55 0x00 0x00 +0x7fffffffe288: 0x70 0x50 0x55 0x55 0x55 0x55 0x31 0x32 +0x7fffffffe290: 0x33 0x34 0x35 0x36 0x37 0x38 0x39 0x30 +``` + +需要注意的是,这里的值是一个地址。并且这个地址并没有改变,但是我们来看一下指向的内存上的内容。 + +``` +(gdb) x/10x 0x5555555592a0 +0x5555555592a0: 0x62 0x61 0x6e 0x61 0x6e 0x61 0x73 0x00 +0x5555555592a8: 0x00 0x00 +``` + +看到了吗,这就是字符串 `bananas` 的字节表示。这些字节并不在栈空间上。他们存在于内存中的堆上。 + +### 堆和栈到底在哪里? + +我们已经讨论过栈和堆是不同的内存区域,但是你怎么知道它们在内存中的位置呢? + +每个进程都有一个名为 `/proc/$PID/maps` 的文件,它显示了每个进程的内存映射。 在这里你可以看到其中的栈和堆。 + +``` +$ cat /proc/24963/maps +... lots of stuff omitted ... +555555559000-55555557a000 rw-p 00000000 00:00 0 [heap] +... lots of stuff omitted ... +7ffffffde000-7ffffffff000 rw-p 00000000 00:00 0 [stack] +``` + +需要注意的一件事是,这里堆地址以 `0x5555` 开头,栈地址以 `0x7fffff` 开头。 所以很容易区分栈上的地址和堆上的地址之间的区别。 + +### 像这样使用 gdb 真的很有帮助 + +这有点像旋风之旅,虽然我没有解释所有内容,但希望看到数据在内存中的实际情况可以使你更清楚地了解堆栈的实际情况。 + +我真的建议像这样来把玩一下 gdb —— 即使你不理解你在内存中看到的每一件事,我发现实际上像这样看到我程序内存中的数据会使抽象的概念,比如“栈”和“堆”和“指针”更容易理解。 + +### 更多练习 + +一些关于思考栈的后续练习的想法(没有特定的顺序): + + * 尝试将另一个函数添加到 `test.c` 并在该函数的开头创建一个断点,看看是否可以从 `main` 中找到堆栈! 他们说当你调用一个函数时“堆栈会变小”,你能在 gdb 中看到这种情况吗? + * 从函数返回一个指向栈上字符串的指针,看看哪里出了问题。 为什么返回指向栈上字符串的指针是不好的? + * 尝试在 C 中引起堆栈溢出,并尝试通过在 gdb 中查看堆栈溢出来准确理解会发生什么! + * 查看 Rust 程序中的堆栈并尝试找到变量! + * 在 [噩梦课程][1] 中尝试一些缓冲区溢出挑战。每个问题的答案写在 README 文件中,因此如果你不想被宠坏,请避免先去看答案。 所有这些挑战的想法是给你一个二进制文件,你需要弄清楚如何导致缓冲区溢出以使其打印出 `flag` 字符串。 + +-------------------------------------------------------------------------------- + +via: https://jvns.ca/blog/2021/05/17/how-to-look-at-the-stack-in-gdb/ + +作者:[Julia Evans][a] +选题:[lujun9972][b] +译者:[amwps290](https://github.com/amwps290) +校对:[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://github.com/guyinatuxedo/nightmare diff --git a/published/202107/20210529 Configuring Vim as a Writing Tool.md b/published/202107/20210529 Configuring Vim as a Writing Tool.md new file mode 100644 index 0000000000..b56464d14d --- /dev/null +++ b/published/202107/20210529 Configuring Vim as a Writing Tool.md @@ -0,0 +1,197 @@ +[#]: subject: (Configuring Vim as a Writing Tool) +[#]: via: (https://news.itsfoss.com/configuring-vim-writing/) +[#]: author: (Theena https://news.itsfoss.com/author/theena/) +[#]: collector: (lujun9972) +[#]: translator: (piaoshi) +[#]: reviewer: (wxy) +[#]: publisher: (wxy) +[#]: url: (https://linux.cn/article-13607-1.html) + +将 Vim 配置成一个写作工具 +====== + +> 我使用 Vim 来写小说。我是这样配置它的。 + +![](https://i1.wp.com/news.itsfoss.com/wp-content/uploads/2021/05/Setting-Up-Vim-for-Writing.jpg?w=1200&ssl=1) + +在我的第一个专栏中,我谈到了我为什么把 [我的写作工作迁移到了 Vim 上][1] —— 远离了现代写作者们的标准工具,如文字处理器(MS Word 及它的开源替代方案)、文本编辑器(记事本,因为直到去年我一直是 Windows 用户)和云存储技术。如果你是一个写作者,在继续下面的内容前,我建议你先阅读一下 [那篇文章的第一部分][1] 。 + +基本上可以说,你使用的设备越多,你需要的写作工具就越多,最终你的工作流程就越复杂。这一点对我来说是很贴切的,因为我有四台设备,包括一部安卓手机,一台日常用的运行 Linux 的主力笔记本电脑,还有两台旧的笔记本电脑,其中一台是 Mac,我去户外拍摄时会带着它。 + +Vim 对于我和我的工作方式来说是一个完美的解决方案;虽然我不会说我的新的工作流程是现代写作者工作的最佳方式,但我可以说的是,对于写作者来说,拥有一个能在我们所有设备上工作的工具非常重要的,并且这个工具要足够强大以满足我们写作者每天从事的不同类型的写作需求。 + +从这个角度来看,Vim 的主要优势是它是跨平台的 —— 无论在什么设备上,Vim 都能工作。在苹果生态系统中使用 Vim 的情况我就不细说了,但粗略地看一下 [这个应用程序][2] 的评论,我就会知道,总会有人在各种地方使用 Vim,不管他们使用的是什么设备。 + +现在我们假设你是一个想开始使用 Vim 的写作者。当你安装了它,你该从哪里开始呢? + +我在这一部分给你的并不算是教程,而是一系列的建议,包含对一个用于诗歌写作的 `.vimrc` 配置文件的解读。只要有可能,我就会链接到我学习相应内容时用到的 YouTube 上的教程。 + +对于 Linux 用户来说,系统已经预装了 Vim —— 通过你喜欢的终端模拟器就可以启动它。对于 Windows 和 Mac 用户,你可以从 [Vim 官方网站][3] 下载它。 + +### 建议 + +**安装/启用 Vim 后** + + * 通过终端打开 Vim Tutor。(Mac 用户可以用这种方式启动,而 Windows 用户也可以用这种方法启动。[LCTT 译注:原文这里本应该有链接,可能作者忘记添加了。无论如何,在终端中, Linux 中的命令是 `vimtutor`,Windows 在安装目录下找到 `vimtutor.bat` 命令并运行;Mac?应该与 Linux 一样?我没 Mac 呀!])在这个阶段,你不会使用 Vim 进行任何写作 —— 相反,你要每天花 15 分钟做 Vim 教程。不要多花一分钟或少花一分钟;看看在规定的 15 分钟内,你能在教程中取得多大的进展。你会发现,每天你都会在教程中取得更大的进步。在一个月内,你应该能够利用这些 15 分钟完成整个教程。 + * 成为一个更好的打字员对 Vim 的使用来说有极大的好处。这不是必须的,但我正在重新学习打字,它的副作用是使 Vim 变得更加有用了。我每次都以花 15 分钟练习打字开始,作为进入 Vim 教程前的热身。 + +在每一天的开始,我分配了 30 分钟的时间做这两项练习进行热身,而每天晚上睡觉前再分配 30 分钟进行练习以让我安定下来。这样的做法帮我快速从旧的工具包过渡到了 Vim,但你的安排可能有所不同。 + +我再次强调,**除了 Vim Tutor 之外**,上述步骤都是可选的;这完全取决于你个人的动机水平。 + +现在我们来到了这篇文章的重点:如何配置 Vim ,使它对写作者友好? + +### 如何配置用于写作的 .vimrc + +在开始之前,我想在这里提醒各位读者,我不是一个技术人员 —— 我是一个小说家 —— 你在下面看到的任何错误都是我自己的;我希望有经验的 Vim 用户能提供反馈,告诉我如何进一步完善我的配置文件。 + +下面是我的 `.vimrc` 文件。你可以从我的 [GitHub][4] 上下载,并进一步完善它: + +``` +syntax on + +set noerrorbells " 取消 Vim 的错误警告铃声,关闭它以免打扰到我们 +set textwidth=100 " 确保每一行不超过 100 字符 +set tabstop=4 softtabstop=4 +set shiftwidth=4 +set expandtab +set smartindent +set linebreak +set number +set showmatch +set showbreak=+++ +set smartcase +set noswapfile +set undodir=~/.vim/undodir +set undofile +set incsearch +set spell +set showmatch +set confirm +set ruler +set autochdir +set autowriteall +set undolevels=1000 +set backspace=indent,eol,start + +" 下面的设置确保按写作者而不是程序员喜欢的方式折行 + +set wrap +nnoremap :set linebreak +nnoremap :set nolinebreak + + +call plug#begin('~/.vim/plugged') + +" 这是颜色风格插件 + +Plug 'colepeters/spacemacs-theme.vim' +Plug 'sainnhe/gruvbox-material' +Plug 'phanviet/vim-monokai-pro' +Plug 'flazz/vim-colorschemes' +Plug 'chriskempson/base16-vim' +Plug 'gruvbox-community/gruvbox' + +" 这是为了更容易的诗歌写作选择的一些插件 + +Plug 'dpelle/vim-LanguageTool' +Plug 'ron89/thesaurus_query.vim' +Plug 'junegunn/goyo.vim' +Plug 'junegunn/limelight.vim' +Plug 'reedes/vim-pencil' +Plug 'reedes/vim-wordy' + + +" 这一部分是为了更容易地与机器集成,用了 vim-airline 这类插件 + +Plug 'vim-airline/vim-airline' + +" 这一部分外理工作区和会话管理 + +Plug 'thaerkh/vim-workspace' + +" 与上面插件相关, 下面的代码将你的所有的会话文件保存到一个你工作区之外的目录 + +let g:workspace_session_directory = $HOME . '/.vim/sessions/' + + +" 与上面插件相关,这是一个 Vim 活动的跟踪器 + +Plug 'wakatime/vim-wakatime' + +" 一个干扰因素:我在这里使用了一些 Emacs 的功能,特别是 org-mode + +Plug 'jceb/vim-orgmode' + + +" 这是文件格式相关插件 + +Plug 'plasticboy/vim-markdown' + + +call plug#end() + +colorscheme pacific +set background=dark + +if executable('rg') + let g:rg_derive_root='true' +endif +``` + +学习如何安装 Vim 插件时,这个[教程](https://www.youtube.com/watch?v=n9k9scbTuvQ)帮助了我。我使用 Vim Plugged 插件管理器是因为在我看来它是最简单、最优雅的。 + +![][5] + +#### 对于写作者的 .vimrc 选项的整理 + + * `syntax on`:这可以确保 Vim 知道我在使用什么语法。做笔记、写这种文章时我主要使用 Markdown;而在写小说的时候,纯文本是我的首选格式。 + * `set noerrorbells`:为了你的精神状态,我强烈建议打开这个选项。 + * `set textwidth=100`:为了便于阅读,没有人愿意横向滚动一个文本文件。 + * `set spell`:如果有拼写错误的话提醒你。 + * `set wrap`:确保文本以写作者而不是程序员的方式进行折行。 + +你会注意到,我没有花更多时间讨论其他一些基本配置选项,因为我并不觉得那些对写作者来说有多重要。因为我做一些业余的编码工作,所以我的 `.vimrc` 配置反映了这一点。如果你只想在 Vim 上写作,那么上述配置就应该能让你顺利开始。 + +从这点上来说,你的 `.vimrc` 是一个活的文档,它能生动地反映你想用 Vim 做什么,以及你希望 Vim 如何为你做这些事情。 + +#### 关于插件的说明 + +第 43-98 行之间是我对插件的配置。如果你已经学习了关于如何安装 Vim 插件的教程,我强烈推荐你从以下专为写作开发的 Vim 插件开始: + + * `vim-LanguageTool` + * `thesaurus_query.vim` + * `vim-pencil` + * `vim-wordy` + * `vim-goyo` + * `vim-markdown` + +#### 总结 + +在这篇文章中,我们简单地[介绍](https://youtu.be/Pq3JMp3stxQ)了写作者可以怎样开始使用 Vim,以及一个在写作工作中需要的 `.vimrc` 入门配置。除了我的 `.vimrc` 之外,我还将在这里链接到我在 GitHub 上发现的其他写作者的 `.vimrc`,它们是我自己配置时的灵感来源。 + +![][6] + +请劳记,这只是一个写作者的 `.vimrc` 的入门配置。你会发现,随着你的需求的发展,Vim 也可以随之发展。因此,投入一些时间学习配置你的 `.vimrc` 是值得的。 + +在下一篇文章中,我将会检视我在写作时的工作流程的具体细节,这个工作流程中我使用了 Vim 和 Git 及 GitHub。 + +-------------------------------------------------------------------------------- + +via: https://news.itsfoss.com/configuring-vim-writing/ + +作者:[Theena][a] +选题:[lujun9972][b] +译者:[piaoshi](https://github.com/piaoshi) +校对:[wxy](https://github.com/wxy) + +本文由 [LCTT](https://github.com/LCTT/TranslateProject) 原创编译,[Linux中国](https://linux.cn/) 荣誉推出 + +[a]: https://news.itsfoss.com/author/theena/ +[b]: https://github.com/lujun9972 +[1]: https://news.itsfoss.com/how-i-started-loving-vim/ +[2]: https://apps.apple.com/us/app/ivim/id1266544660 +[3]: https://www.vim.org/ +[4]: https://github.com/MiragianCycle/dotfiles +[5]: https://i1.wp.com/i.ytimg.com/vi/n9k9scbTuvQ/hqdefault.jpg?w=780&ssl=1 +[6]: https://i2.wp.com/i.ytimg.com/vi/Pq3JMp3stxQ/hqdefault.jpg?w=780&ssl=1 diff --git a/published/202107/20210529 My family-s Linux story.md b/published/202107/20210529 My family-s Linux story.md new file mode 100644 index 0000000000..fb5ef4b277 --- /dev/null +++ b/published/202107/20210529 My family-s Linux story.md @@ -0,0 +1,40 @@ +[#]: subject: (My family's Linux story) +[#]: via: (https://opensource.com/article/21/5/my-linux-story) +[#]: author: (Chris Hermansen https://opensource.com/users/clhermansen) +[#]: collector: (lujun9972) +[#]: translator: (shiboi77) +[#]: reviewer: (wxy) +[#]: publisher: (wxy) +[#]: url: (https://linux.cn/article-13614-1.html) + +我家的 Linux 故事 +====== + +> 我们在 Linux 的第一次尝试只是一个 apt-get 的距离。 + +![](https://img.linux.net.cn/data/attachment/album/202107/25/065040z2zt9lb9fc99kcho.jpg) + +我在 Linux 的第一次尝试是那种“或许我应该试一试”的情况。 + +那是 1990 年代,我在一些软盘上找到了用某种打包方式打包的红帽发行版,我为家里的笔记本电脑买了第二个硬盘,然后开始安装它。这是一件有趣的实验,但是我记得当时家人还没有准备好在电脑上使用 Linux。转眼到了 2005 年,我最终放弃了这种做法,买了一台可爱的东芝笔记本电脑,来运行 Windows XP。在工作中,我有一台有点年头的 SUN SPARCStation 5,并且我不太喜欢当时整个 Solaris 的发展方向(基于 Motif 的桌面)。我真的想要用 GIMP 来完成一些这样或那样的项目,但是在 Solaris 上安装 GNOME 1.x(也许是 1.4?)的曲折旅程是很有挑战性的。所以,我实际上是在考虑跳槽到 Windows XP。但是在我的家用机上用了几个月之后,我发现我更不喜欢在 Solaris 上运行 GNOME,所以我安装了 Ubuntu Hoary Hedgehog 5.04,随后在我的笔记本电脑上安装了 Breezy Badger 5.10。这太棒了,那台拥有 3.2GHz 奔腾处理器、2GB 内存和 100GB 的硬盘的机器就在我的 SPARCStation 5 旁边运行。 + +突然之间,我不再用拼凑起来的 Solaris 安装包来试图去让东西运行起来,而只是用 apt-get 就可以了。并且这个时机也很好。我家庭和我从 2006 年 8 月到 2007 年 7 月居住在法国格勒诺布尔,当时我的妻子在休假。因为有了运行 Linux 的东芝笔记本,我可以带着我的工作一起走。那个时候我在几个大的项目上做了大量的 GIS 数据处理,我发现我可以在 PostGIS / PostgreSQL 上做同样的事情,比我们在加拿大家中使用的昂贵得多的商业 GIS 软件要快得多。大家都很开心,尤其是我。 + +这一路上发生的有趣的事情是,我们把另外两台电脑带到了法国 —— 我妻子的类似的东芝电脑(运行 XP,对她来说很好用)和我们孩子最近新买的东芝牌笔记本电脑,也运行 XP。也就在圣诞节过后,他们有一些朋友过来,无意中在他们的电脑上安装了一个讨厌的、无法清除的病毒。经过几个小时甚至几天后,我的一个孩子问我:“爸爸,我们就不能安装和你电脑上一样的东西吗?”然后,三个新的 Linux 用户就这样产生了。我的儿子,29 岁了,依然是一个快乐的 Linux 用户,我猜他有第四或第五台 Linux 笔记本电脑了,最后几台都是由 System 76 提供的。我的一个女儿三年前开始读法学院时被迫转换为 Windows,因为她所在的学校有一个强制性的测试框架,只能在 Windows 上运行,而且据称会检测虚拟机之类的东西(请不要让我开始骂人)。而我的另一个女儿被她的公司为她买的 Macbook Air 诱惑了。 + +哦,好吧,不可能全都赢了吧! + +-------------------------------------------------------------------------------- + +via: https://opensource.com/article/21/5/my-linux-story + +作者:[Chris Hermansen][a] +选题:[lujun9972][b] +译者:[shiboi77](https://github.com/shiboi77) +校对:[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/terminal_command_linux_desktop_code.jpg?itok=p5sQ6ODE (Terminal command prompt on orange background) diff --git a/published/202107/20210606 How Real-World Apps Lose Data.md b/published/202107/20210606 How Real-World Apps Lose Data.md new file mode 100644 index 0000000000..9f8406d810 --- /dev/null +++ b/published/202107/20210606 How Real-World Apps Lose Data.md @@ -0,0 +1,59 @@ +[#]: subject: (How Real-World Apps Lose Data) +[#]: via: (https://theartofmachinery.com/2021/06/06/how_apps_lose_data.html) +[#]: author: (Simon Arneaud https://theartofmachinery.com) +[#]: collector: (lujun9972) +[#]: translator: (PearFL) +[#]: reviewer: (wxy) +[#]: publisher: (wxy) +[#]: url: (https://linux.cn/article-13598-1.html) + +现实中的应用程序是如何丢失数据? +====== + +![](https://img.linux.net.cn/data/attachment/album/202107/20/062734awvesw2nqnzrsw5i.jpg) + +现代应用程序开发的一大优点是,像硬件故障或如何设置 RAID 这类问题是由云提供商操心的。优秀的云供应商不太可能丢失你的应用数据,所以有时我会被询问现在为什么还要备份?下面是一些现实世界的故事。 + +### 故事之一 + +第一个故事来自一个数据科学项目:它基本上是一个从正在进行的研究中来收集数据的庞大而复杂的管道,然后用各种不同的方式处理以满足一些尖端模型的需要。这个面向用户的应用程序还没有推出,但是一个由数据科学家和开发人员组成的团队已经为建立这个模型和它的数据集工作了好几个月。 + +在项目中工作的人有他们自己的实验工作的开发环境。他们会在终端中做一些类似 `export ENVIRONMENT=simonsdev` 的事情,然后所有在终端上运行的软件都会在那个环境下运行,而不是在生产环境下。 + +该团队迫切需要推出一个面向用户的应用程序,以便那些花钱的人能够从他们几个月的投资中真正看到一些回报。在一个星期六,一位工程师试图赶工一些工作。他在晚上很晚的时候做完了一个实验,决定收拾东西回家。他启动了一个清理脚本来删除他的开发环境中的所有内容,但奇怪的是,这比平时花费了更长的时间。这时他意识到,他已经忘记了哪个终端被配置为指向哪个环境。(LCTT 译注:意即删除了生产环境。) + +### 故事之二 + +第二个故事来自于一个商业的网页和手机应用。后端有一个由一组工程师负责的微服务体系结构。这意味着部署需要协调,但是使用正式的发布过程和自动化简化了一些。新代码在准备好后会被审查并合并到主干中,并且高层开发人员通常会为每个微服务标记版本,然后自动部署到临时环境。临时环境中的版本会被定期收集到一个元版本中,在自动部署到生产环境之前,该版本会得到各个人的签署(这是一个合规环境)。 + +有一天,一位开发人员正在开发一个复杂的功能,而其他开发该微服务的开发人员都同意将他们正在开发的代码提交到主干,也都知道它还不能被实际发布。长话短说,并不是团队中的每个人都收到了消息,而代码就进入了发布管道。更糟糕的是,那些实验性代码需要一种新的方式来表示用户配置文件数据,因此它有一个临时数据迁移,它在推出到生产环境时运行,损坏了所有的用户配置文件。 + +### 故事之三 + +第三个故事来自另一款网页应用。这个有一个更简单的架构:大部分代码在一个应用程序中,数据在数据库中。然而,这个应用程序也是在很大的截止日期压力下编写的。事实证明,在开发初期,当彻底更改的数据库架构很常见时,添加一项功能来检测此类更改并清理旧数据,这实际上对发布前的早期开发很有用,并且始终只是作为开发环境的临时功能。不幸的是,在匆忙构建应用的其余部分并推出时,我们忘记了这些代码。当然,直到有一天它在生产环境中被触发了。 + +### 事后分析 + +对于任何故障的事后分析,很容易忽视大局,最终将一切归咎于一些小细节。一个特例是发现某人犯了一些错误,然后责怪那个人。这些故事中的所有工程师实际上都是优秀的工程师(雇佣 SRE 顾问的公司不是那些在长期雇佣中偷工减料的公司),所以解雇他们,换掉他们并不能解决任何问题。即使你拥有 100 倍的开发人员,它仍然是有限的,所以在足够的复杂性和压力下,错误也会发生。最重要的解决方案是备份,无论你如何丢失数据(包括来自恶意软件,这是最近新闻中的一个热门话题),它都能帮助你。如果你无法容忍没有副本,就不要只有一个副本。 + +故事之一的结局很糟糕:没有备份。该项目的六个月的数据收集白干了。顺便说一句,有些地方只保留一个每日快照作为备份,这个故事也是一个很好的例子,说明了这也会出错:如果数据丢失发生在星期六,并且你准备在星期一尝试恢复,那么一日备份就只能得到星期日的一个空数据备份。 + +故事之二并不算好,但结果要好得多。备份是可用的,但数据迁移也是可逆的。不好的部分是发布是在推出前完成的,并且修复工作必须在生产站点关闭时进行编码。我讲这个故事的主要原因是为了提醒大家,备份并不仅仅是灾难性的数据丢失。部分数据损坏也会发生,而且可能会更加混乱。 + +故事之三还好。尽管少量数据永久丢失,但大部分数据可以从备份中恢复。团队中的每个人都对没有标记极其明显的危险代码感到非常难过。我没有参与早期的开发,但我感觉很糟糕,因为恢复数据所需的时间比正常情况要长得多。如果有一个经过良好测试的恢复过程,我认为该站点应该在总共不到 15 分钟的时间内重新上线。但是第一次恢复没有成功,我不得不调试它为什么不能成功,然后重试。当一个生产站点宕机了,需要你重新启动它,每过 10 秒钟都感觉过了一个世纪。值得庆幸的是,老板们比某些人更能理解我们。他们实际上松了一口气,因为这一场可能使公司沉没的一次性灾难只导致了几分钟的数据丢失和不到一个小时的停机时间。 + +在实践中,备份“成功”但恢复失败的情况极为普遍。很多时候,小型数据集上进行恢复测试是可以正常工作的,但在生产规模的大数据集上就会失败。当每个人都压力过大时,灾难最有可能发生,而生产站点的故障只会增加压力。在时间合适的时候测试和记录完整的恢复过程是一个非常好的主意。 + +-------------------------------------------------------------------------------- + +via: https://theartofmachinery.com/2021/06/06/how_apps_lose_data.html + +作者:[Simon Arneaud][a] +选题:[lujun9972][b] +译者:[PearFL](https://github.com/PearFL) +校对:[wxy](https://github.com/wxy) + +本文由 [LCTT](https://github.com/LCTT/TranslateProject) 原创编译,[Linux中国](https://linux.cn/) 荣誉推出 + +[a]: https://theartofmachinery.com +[b]: https://github.com/lujun9972 diff --git a/published/202107/20210612 How to get KDE Plasma 5.22 in Kubuntu 21.04 Hirsute Hippo.md b/published/202107/20210612 How to get KDE Plasma 5.22 in Kubuntu 21.04 Hirsute Hippo.md new file mode 100644 index 0000000000..9a49de936f --- /dev/null +++ b/published/202107/20210612 How to get KDE Plasma 5.22 in Kubuntu 21.04 Hirsute Hippo.md @@ -0,0 +1,112 @@ +[#]: subject: (How to get KDE Plasma 5.22 in Kubuntu 21.04 Hirsute Hippo) +[#]: via: (https://www.debugpoint.com/2021/06/plasma-5-22-kubuntu-21-04/) +[#]: author: (Arindam https://www.debugpoint.com/author/admin1/) +[#]: collector: (lujun9972) +[#]: translator: (geekpi) +[#]: reviewer: (wxy) +[#]: publisher: (wxy) +[#]: url: (https://linux.cn/article-13621-1.html) + +如何在 Kubuntu 21.04 中安装和升级 KDE Plasma 5.22 +====== + +> KDE 团队启用了向后移植 PPA,你可以使用它在 Kubuntu 21.04 Hirsute Hippo 中安装和升级到 KDE Plasma 5.22。 + +![Kubnutu 21.04 running with KDE Plasma 5.22][1] + +KDE 团队最近发布了 KDE Plasma 5.22,其中有相当多的增强功能、错误修复以及更新的 KDE 框架和应用版本。这个版本带来了一些改进,如面板的自适应透明度,文件操作弹出时的用户友好通知,“发现”中的软件包类型显示,各种 Wayland 的变化等。在 [这里][2] 查看更多关于功能细节。 + +如果你正在运行 Kubuntu 21.04 Hirsute Hippo,或者在 [Ubuntu 21.04 Hirsute Hippo][3] 中安装了自定义的 KDE Plasma,你可以通过以下步骤升级到最新版本。目前的 Hirsute Hippo 系列提供了先前版本 KDE Plasma 5.21.04 与 KDE Framework 5.80。 + +### 在 Kubuntu 21.04 Hirsute Hippo 中安装 KDE Plasma 5.22 的步骤 + +按照下面的步骤进行。 + +如果你想使用图形方法,那么在“发现”中将 `ppa:kubuntu-ppa/backports` 添加到软件源,然后点击“更新”。 + +或者,使用下面的终端方法,以加快安装速度。 + + * **步骤 1**:打开一个终端,添加下面的 KDE Backports PPA。 + + ``` + sudo add-apt-repository ppa:kubuntu-ppa/backports + ``` + + * **步骤 2**:然后运行以下程序来启动系统升级。这将在你的 Hirsute Hippo 系统中安装最新的 KDE Plasma 5.22。 + + ``` + sudo apt update + sudo apt full-upgrade + ``` + + ![Upgrade to Plasma 5.22][8] + + * **步骤 3**:更新后重新启动,你应该会看到一个更新的 KDE Plasma 5.22 桌面。 + +考虑到这是整个桌面环境的完整版本升级,安装可能需要一些时间。 + +### 在 Ubuntu 21.04 中安装 KDE Plasma 5.22 + +如果你正在运行基于 GNOME 的默认 Ubuntu 21.04 Hirsute Hippo 桌面,你可以使用这个 PPA 来安装最新的 KDE Plasma。下面是方法。 + +打开终端,添加 PPA(像上面的步骤那样)。 + +``` +sudo add-apt-repository ppa:kubuntu-ppa/backports +``` + +然后,刷新软件包。 + +``` +sudo apt update +``` + +然后运行下面的程序来安装 Kubuntu 桌面。 + +``` +sudo apt install kubuntu-desktop +``` + +这将在 Ubuntu 21.04 中与 GNOME 一起安装 KDE Plasma 桌面。 + +### Ubuntu 20.04 LTS 中的 KDE Plasma 5.22 + +Ubuntu 20.04 LTS 版拥有早期的 KDE Plasma 5.18、KDE Framework 5.68、KDE Applications 19.12.3。所以,在它的整个生命周期中,它不会收到最新的 KDE 更新。所以,从技术上讲,你可以添加上述 PPA 并安装 KDE Plasma 5.22。但我不建议这样做,因为不兼容的软件包、框架可能会导致系统不稳定。 + +所以,建议你使用 Kubuntu 21.04 和上面的向后移植 PPA 或者使用 KDE neon 来体验最新的 Plasma 桌面。 + +### 卸载 KDE Plasma 5.22 + +如果你改变主意,想回到 KDE Plasma 的原始版本,那么安装 `ppa-purge` 并清除 PPA。这将使软件包降级,并启用仓库版本。 + +``` +sudo apt install ppa-purge +sudo ppa-purge ppa:kubuntu-ppa/backports +sudo apt update +``` + +### 结束语 + +我希望这个快速指南能帮助你在 Kubuntu 21.04 Hirsute Hippo 中安装最新的 KDE Plasma 5.22。这可以让你体验到最新的 KDE 技术以及 KDE 框架和应用。然而,你应该知道,并不是所有的功能都应该在向后移植 PPA 中提供,它只有选定的功能和错误修复,这才能通过回归测试并安全使用。也就是说,你总是可以把 KDE Neon 安装成一个全新的系统来享受 KDE 的最新技术。 + +-------------------------------------------------------------------------------- + +via: https://www.debugpoint.com/2021/06/plasma-5-22-kubuntu-21-04/ + +作者:[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/blog/wp-content/uploads/2021/06/Kubutu-21.04-running-with-KDE-Plasma-5.22-1024x531.jpg +[2]: https://www.debugpoint.com/2021/06/kde-plasma-5-22-release/ +[3]: https://www.debugpoint.com/2021/04/ubuntu-21-04-hirsute-hippo-release/ +[4]: tmp.wazjcS11If#plasma-kubuntu-2104 +[5]: tmp.wazjcS11If#plasma-ubuntu-2104 +[6]: tmp.wazjcS11If#plasma-ubuntu-2004 +[7]: tmp.wazjcS11If#uninstall-stock-version +[8]: https://www.debugpoint.com/blog/wp-content/uploads/2021/06/Upgrade-to-Plasma-5.22.jpg \ No newline at end of file diff --git a/published/202107/20210614 What is a CI-CD pipeline.md b/published/202107/20210614 What is a CI-CD pipeline.md new file mode 100644 index 0000000000..e6bd3657fa --- /dev/null +++ b/published/202107/20210614 What is a CI-CD pipeline.md @@ -0,0 +1,82 @@ +[#]: subject: (What is a CI/CD pipeline?) +[#]: via: (https://opensource.com/article/21/6/what-cicd-pipeline) +[#]: author: (Will Kelly https://opensource.com/users/willkelly) +[#]: collector: (lujun9972) +[#]: translator: (baddate) +[#]: reviewer: (wxy) +[#]: publisher: (wxy) +[#]: url: (https://linux.cn/article-13541-1.html) + +CI/CD 管道是什么? +====== + +> 你如何定义持续集成/持续部署管道取决于你组织的要求。 + +![Plumbing tubes in many directions][1] + +持续集成continuous integration/持续部署continuous deployment(CI/CD)管道是每个 DevOps 计划的基础。 CI/CD 管道打破了传统的开发孤岛,使开发和运营团队能够在整个软件开发生命周期中进行协作。 + +更好的是,转向 DevOps 和 CI/CD 管道可以帮助你的组织以更高的速度更安全地 [交付软件][2]。 + +### 拆解 CI/CD 管道 + +CI/CD 管道有很多定义,所以我总是建议组织定义自己的 CI/CD 管道版本和其他 DevOps 概念,而不是使用其他人的。开源 CI/CD 工具为你提供构建满足组织要求的 CI/CD 管道的自由和选择。 + +形成 CI/CD 管道的阶段是将不同的任务子集分组为 _管道阶段_。典型的管道阶段包括: + + * **构建**:开发人员编译应用程序代码。 + * **测试**:质量保证(QA)团队使用自动化测试工具和策略测试应用程序代码。 + * **发布**:开发团队将应用程序代码交付到代码库。 + * **部署**:DevOps 团队将应用程序代码分阶段投入生产。 + * **安全性和合规性**:QA 团队根据项目要求验证构建。这是组织部署容器扫描工具的阶段,这些工具根据常见漏洞和暴露Common Vulnerabilities and Exposures(CVE)检查容器镜像的质量。 + +这些是 CI/CD 管道的标准阶段,但一些组织调整 CI/CD 管道模型以满足他们的要求。例如,为医疗保健市场构建应用程序的组织,具有严格的合规性标准,可以在整个工具链中分发测试、验证和合规性门槛。 + +其他示例可能是依赖于具有开源软件(OSS)的复杂软件供应链的组织。商业组件可能会设立一个门槛,开发团队成员可以在其中为 OSS 包生成 [软件物料清单][3]software bill of materials(SBOM),或者外部商业软件供应商必须将 SBOM 作为其合同可交付成果的一部分进行交付。 + +### CI/CD 管道的障碍 + +实施 CI/CD 管道会改变团队的流程和文化。尽管许多开发人员愿意接受某些任务和测试的自动化,但人员可能成为采用 CI/CD 的障碍。 + +从瀑布式流程转向 CI/CD 可能会动摇某些组织中基本的和隐含的权力结构。由于 CI/CD 管道提高了软件交付速度,旧手动流程的“守门人”可能会受到这种变化的威胁。 + +### 整合机会 + +随着你在文化、流程和工具中达到更高的 DevOps 成熟度水平,包含 CI/CD 工具链的工具的开源根源为一些激动人心的集成创造了机会。 + +分析公司 Forrester 在 2020 年预测,即时学习just-in-time learning将加入 CI/CD 管道。如果你考虑一下,会发现这是有道理的。在当前远程工作的时代,甚至对于新员工的远程入职,这更有意义。例如,组织可以将文档 wiki 与内部流程文档集成到其管道中。 + +更雄心勃勃的组织可以将学习管理系统(LMS)(例如 [Moodle][4])集成到其 CI/CD 管道中。它可以使用 LMS 发布有关新 DevOps 工具链功能的简短视频,开发人员在加入时或在整个管道中更新工具时需要学习这些功能。 + +一些组织正在将群聊和其他协作工具直接集成到他们的 CI/CD 管道中。聊天平台提供警报并支持团队之间的协作和沟通。将 Mattermost、Rocket.Chat 或其他 [企业聊天][5] 平台集成到你的 CI/CD 管道中需要预先规划和分析,以确保管道用户不会被警报淹没。 + +另一个需要探索的集成机会是将分析和高级报告构建到你的 CI/CD 管道中。这有助于你利用通过管道传输的数据。 + +### 总结 + +CI/CD 管道是 DevOps 的基础。开源使其能够适应并灵活地满足你在 DevOps 之旅中实施的运营变更所产生的新需求。 + +我希望看到对统一 DevOps 平台趋势的开源响应,在这种趋势中,组织寻求端到端的 CI/CD 解决方案。这种解决方案的要素就在那里。毕竟,GitLab 和 GitHub 将他们的平台追溯到开源根源。 + +最后,不要忘记每一个成功的 CI/CD 工具链背后的教育和外展。记录你的工具链和相关流程将改善开发人员入职和持续的 DevOps 团队培训。 + +你和你的组织如何定义你的 CI/CD 工具链?请在评论中分享你的反馈。 + +-------------------------------------------------------------------------------- + +via: https://opensource.com/article/21/6/what-cicd-pipeline + +作者:[Will Kelly][a] +选题:[lujun9972][b] +译者:[baddate](https://github.com/baddate) +校对:[wxy](https://github.com/wxy) + +本文由 [LCTT](https://github.com/LCTT/TranslateProject) 原创编译,[Linux中国](https://linux.cn/) 荣誉推出 + +[a]: https://opensource.com/users/willkelly +[b]: https://github.com/lujun9972 +[1]: https://opensource.com/sites/default/files/styles/image-full-size/public/lead-images/plumbing_pipes_tutorial_how_behind_scenes.png?itok=F2Z8OJV1 (Plumbing tubes in many directions) +[2]: https://techbeacon.com/devops/5-reasons-why-cicd-vital-your-organizations-value-stream +[3]: https://www.ntia.gov/SBOM +[4]: https://moodle.org/ +[5]: https://opensource.com/alternatives/slack \ No newline at end of file diff --git a/published/202107/20210616 Hash Linux- Arch Linux Preconfigured With Xmonad, Awesome, i3, and Bspwm Window Manager.md b/published/202107/20210616 Hash Linux- Arch Linux Preconfigured With Xmonad, Awesome, i3, and Bspwm Window Manager.md new file mode 100644 index 0000000000..61b12247ce --- /dev/null +++ b/published/202107/20210616 Hash Linux- Arch Linux Preconfigured With Xmonad, Awesome, i3, and Bspwm Window Manager.md @@ -0,0 +1,137 @@ +[#]: subject: "Hash Linux: Arch Linux Preconfigured With Xmonad, Awesome, i3, and Bspwm Window Manager" +[#]: via: "https://itsfoss.com/hash-linux-review/" +[#]: author: "Sarvottam Kumar https://itsfoss.com/author/sarvottam/" +[#]: collector: "lujun9972" +[#]: translator: "mcfd" +[#]: reviewer: "wxy" +[#]: publisher: "wxy" +[#]: url: "https://linux.cn/article-13608-1.html" + +Hash Linux:预配置了四种平铺窗口管理器的 Arch Linux 衍生版 +====== + +![](https://img.linux.net.cn/data/attachment/album/202107/23/112405tt57nu7neuddkk7k.jpg) + +通过一些努力,[你能安装上 Arch Linux][1],也可以在你的 Arch 系统上安装一个你选择的桌面环境或窗口管理器。 + +这需要一些时间和精力,但肯定是可以实现的。但是,有一些项目可以减轻你的痛苦,为你提供一个预先配置好的桌面环境或窗口管理器的系统。[ArcoLinux][2] 就是这样一个例子。 + +最近,我发现了另一个项目,它只专注于在出色的 Arch 发行版上提供完善的窗口管理器的选择。 + +[Hash 项目][3] 提供了四种预配置有平铺式窗口管理器的 Arch 变体:Awesome、[Xmonad][4]、 i3 和 Bspwm。 + +如果你是一个刚刚接触窗口管理器的人,Hash 项目绝对是你应该马上尝试的。不用先投入时间去配置它,你就可以深入探索窗口管理器,并习惯由键盘驱动的系统。 + +在本文中,我将讨论我在使用 **Hash Linux Xmonad 版本** 时的部分体验,该版本采用 Linux 5.12 的内核。 + +### 安装 Hash Linux + +Hash Linux 四个版本的 ISO 镜像均可 [下载][5] ,适用于 x86_64 系统架构。 + +为了避免在实体机上安装时出现的各种意外错误,我在 GNOME Boxes 中创建了一个 Hash Linux Xmonad 版本的虚拟机。 + +当我启动到 Hash Linux 时,我注意到两件事。首先是一个面板,提供用于管理窗口和命令的快捷方式。我将在安装后讨论它。其次,是一个漂亮且易于使用的 GUI 安装程序。 + +![Hash Linux GUI Installer][6] + +像其他衍生版一样,图形化的安装程序使安装过程非常顺畅。在几个步骤的配置中,Hash Linux 已安装完毕,并准备重新启动。 + +![Installer Welcome Page][7] + +### 第一印象 + +![Hash Linux][8] + +如果你曾经在你的 Linux 系统上安装过 Xmonad 窗口管理器,那么你重启后首先看到的是什么?空白的屏幕吧。 + +如果你是一个初学者,或者你不知道默认的按键绑定,你会被卡在一个屏幕上。因此,在使用任何窗口管理器之前,你必须先阅读其键盘快捷键。 + +如果你想把所有重要的快捷键提示都放在窗口上呢?一个备忘单可以为你节省很多时间。 + +因此,为了简化和方便初学者,Hash Linux 将重要的快捷键都钉在了桌面上。 + +所以,让我们先尝试其中的一些。从最重要的一个开始 `Super+Enter`,它可以打开默认的 termite 终端模拟器与 Z shell(ZSH)。 + +如果你多次按下它,你会发现默认情况下 Xmonad 遵循一个缩减布局,它首先将一个窗口固定在右边,然后以同样的方式将其余的全部安排在左边。 + +![Xmonad default layout][9] + +按下 `Super+Space`,你也可以将当前的布局改为标签式布局。甚至你可以按下 `Super+leftclick` 将窗口拖动。 + +![Moved to float][10] + +要退出当前的窗口,你可以按下 `Super+Q`。 + +### Hash Linux 中的应用 + +默认情况下,Hash Linux 包含几个有用的命令行工具,如:NeoFetch、Htop、Vim、Pacman、Git 和 Speedtest-cli。 + +![Htop][11] + +它还拥有大量的图形应用程序,如:Firefox 89、Gparted、Nitrogen、Conky、Flameshot、Geany 和 CPU-X。 + +`Super+D` 是 Hash Linux 中打开应用程序搜索菜单的默认快捷键。 + +![Application search menu][12] + +### 主题美化 + +Hash Cyan 是 Hash Linux 的默认主题。除了它之外,Hash Linux 还提供了另外四个主题:Light Orange、Sweet Purple、Night Red 和 Arch Dark。 + +Hash Theme Selector 是一个自制的 Hash Linux 应用程序,你可以用它来配置窗口管理器的主题。 + +![Hash Theme Selector][13] + +### 升级 Hash Linux + +作为一个滚动发行版,你不需要下载一个新的 Hash Linux 的 ISO 来更新现有系统。你唯一需要的是在终端运行 ` upgrade` 命令来升级你的系统。 + +![upgrading hash linux][14] + +### 结束语 + +如果你想使用一个窗口管理器来代替桌面环境,但又不想花很多时间来配置它,Hash 项目可以节省你的时间。 + +首先,它可以节省你大量的配置时间和精力,其次,它可以很轻松地让你适应使用键盘控制的系统。以后,你肯定可以学会根据自己的需要进行配置。 + +由于 Hash Linux 已经提供了 4 个带有不同的窗口管理器的 ISO,你可以开始使用任何一个版本,并找到你最喜欢的一个版本。总的来说,它是一个 [很好的 Arch Linux 衍生版][15]。 + +最后我还要提一下,目前 Hash Linux 的官方 [网站][3] 并没有包含很多关于它的信息。 + +![][16] + +在发布信息中也提到了一个早期的 [网站][17](我现在无法访问),在我上次访问时,其中包含了许多关于它的信息,包括配置细节等。 + +不想入 Arch 的教,只想用平铺式窗口管理器?可以试试 [Regolith Linux][18] 。它是预先配置了 i3wm 的 Ubuntu。棒极了,对吧? + +-------------------------------------------------------------------------------- + +via: https://itsfoss.com/hash-linux-review/ + +作者:[Sarvottam Kumar][a] +选题:[lujun9972][b] +译者:[mcfd](https://github.com/mcfd) +校对:[wxy](https://github.com/wxy) + +本文由 [LCTT](https://github.com/LCTT/TranslateProject) 原创编译,[Linux中国](https://linux.cn/) 荣誉推出 + +[a]: https://itsfoss.com/author/sarvottam/ +[b]: https://github.com/lujun9972 +[1]: https://itsfoss.com/install-arch-linux/ +[2]: https://arcolinux.com/ +[3]: https://hashproject.ga/ +[4]: https://xmonad.org/ +[5]: https://hashproject.ga/index.html#downloads +[6]: https://i0.wp.com/itsfoss.com/wp-content/uploads/2021/06/Hash-Linux-GUI-Installer.jpg?resize=800%2C451&ssl=1 +[7]: https://i2.wp.com/itsfoss.com/wp-content/uploads/2021/06/Installer-Welcome-Page.png?resize=800%2C452&ssl=1 +[8]: https://i0.wp.com/itsfoss.com/wp-content/uploads/2021/06/Hash-Linux.jpg?resize=800%2C451&ssl=1 +[9]: https://i1.wp.com/itsfoss.com/wp-content/uploads/2021/06/Xmonad-default-layout.png?resize=800%2C452&ssl=1 +[10]: https://i0.wp.com/itsfoss.com/wp-content/uploads/2021/06/Moved-to-float.png?resize=800%2C452&ssl=1 +[11]: https://i0.wp.com/itsfoss.com/wp-content/uploads/2021/06/Htop.jpg?resize=800%2C451&ssl=1 +[12]: https://i1.wp.com/itsfoss.com/wp-content/uploads/2021/06/Application-search-menu.jpg?resize=800%2C451&ssl=1 +[13]: https://i0.wp.com/itsfoss.com/wp-content/uploads/2021/06/Hash-Theme-Selector.png?resize=800%2C452&ssl=1 +[14]: https://i2.wp.com/itsfoss.com/wp-content/uploads/2021/06/Upgrading-hash-linux.png?resize=800%2C452&ssl=1 +[15]: https://itsfoss.com/arch-based-linux-distros/ +[16]: https://i1.wp.com/itsfoss.com/wp-content/uploads/2021/06/Hash-Linux-Site-URL.png?resize=575%2C193&ssl=1 +[17]: https://hashproject.org/ +[18]: https://itsfoss.com/regolith-linux-desktop/ diff --git a/published/202107/20210621 Jim Hall- How Do You Fedora.md b/published/202107/20210621 Jim Hall- How Do You Fedora.md new file mode 100644 index 0000000000..75a941404f --- /dev/null +++ b/published/202107/20210621 Jim Hall- How Do You Fedora.md @@ -0,0 +1,79 @@ +[#]: subject: (Jim Hall: How Do You Fedora?) +[#]: via: (https://fedoramagazine.org/jim-hall-how-do-you-fedora/) +[#]: author: (Karimi Hari Priya https://fedoramagazine.org/author/haripriya21/) +[#]: collector: (lujun9972) +[#]: translator: (zz-air) +[#]: reviewer: (wxy) +[#]: publisher: (wxy) +[#]: url: (https://linux.cn/article-13558-1.html) + +Jim Hall,你觉得 Fedora 怎么样? +====== + +![][1] + +我们最近采访了 Jim Hall,了解他是如何使用 Fedora 的。这个 Fedora 杂志 [系列][2] 中的一篇。该系列介绍了 Fedora 用户以及他们如何使用 Fedora 来完成任务。如果你对本系列的后继采访感兴趣,请通过 [反馈表][3] 与我们联系。 + +### Jim Hall 是谁? + +Jim Hall 曾担任高等教育和政府部门的首席信息官超过 8 年,最近创办了咨询公司 [Hallmentum][4]。他的大部分工作包括培训、研讨会和指导,帮助新的 IT 领导者发展领导技能,也帮助当前的 IT 领导者更好地发挥领导力。除了咨询,Jim 还担任大学的兼职教师,目前教授管理信息系统(MIS)和技术与专业写作课程。 + +Jim 是如何成长的? Jim 童年时代的英雄来自电视和电影,包括蝙蝠侠和汉索罗。Jim 长期以来最喜欢看的电影是《星球大战:新希望》。Jim 说:“我是一个星球大战迷。”Jim 最喜欢吃意大利菜,“我喜欢意大利菜!我最喜欢的意大利菜可能是炖鸡”。Jim 的观点是,诚实、创造力、想象力、好奇心和开放性是一个人所能拥有的五个好品质。 + +他喜欢写作,非常好的是他的日常工作主要是写作。他花了很多时间为像 OpenSource.com、 CloudSavvy IT 和 Linux Magazine 等网站撰写“如何”类文章。现在他正在写一本关于 C 编程的书。除了写作,他还玩电子游戏来放松。他有一台 PlayStation 4 游戏机,大多数周六下午他都会坐在电视机前玩游戏。 + +### Fedora 社区 + +Jim 从 1993 年开始使用 Linux。他的第一个 Linux 发行版是 Softlanding Linux System(SLS)1.03,运行 Linux 内核 0.99,补丁级别 11。“从那以后,我一直是家里的全职 Linux 用户”。Jim 在很久以前参加了 Fedora Core 时代的一个 Linux 会议之后,开始更多参与到 Fedora 中。Jim 在这遇见了 Tom “Spot” Callaway,他们开始谈论 Fedora。“Spot 鼓励我用另一种方式来做贡献:找到 bug 并报告它们。这就是我参与测试所有 Beta 版本的原因”。 + +Jim 想在 Fedora 改变什么? 他想在 getfedora.com 上看到一个倒计时,告诉大家新的 Beta 版本或新的完整版本是什么时候发布的,这是 Fedora 项目的一个改变。并且 Jim 想让人们都知道,使用 Fedora 是多么容易。“对开源做出贡献最具挑战性的事情是,弄清楚如何做出他们的第一个贡献。”Jim 补充道,“我不知道我和其他开发人员一样是‘Fedora 项目成员’。我只是个用户。但是作为一个从 1993、1994 年就开始参与开发开源软件的人,我努力成为社区中一个有用的成员。因此,我利用一切机会尝试新的 Fedora 版本,甚至是 Beta 版,如果我发现问题,就会告诉大家。” + +### 你用什么硬件? + +Jim 目前正在运行一台 ThinkCentre M720 Tiny。它配置了第 8 代酷睿 i3-8100T(3.10GHz,6MB 缓存)、32GB(16GB + 16GB)DDR4 2666MHz、英特尔显卡、256GB 固态硬盘 PCIe-NVME Opal M.2、英特尔 8265 802.11AC 和 蓝牙 4.2。他的显示器是华硕 VE248H。 Jim 说:“这一切在Fedora上都很好用!”。 + +他使用 Perixx Periboard-512 人体工程学经典分体式键盘,它从 1998 年开始取代了他最初的微软 Natural Keyboard Elitee PS/2 键盘。Jim 说: “我有时候会把我的 Perixx 键盘换成 Unicomp 的 IBM Model M USB 克隆键盘。我很喜欢这种带有扣动式弹簧动作的点击式键盘。我的是‘灰白色’,所以它有种经典的外观和感觉” + +### 你用什么软件? + +Jim 目前运行的是 Fedora 33,之前是 Fedora 33 Beta 和 Fedora 32。Jim 说:“我使用 GNOME 3 作为我的桌面。我发现默认设置适合我的大多数需求,所以我没有加载任何 GNOME 扩展,但我确实使用‘设置’和 ‘GNOME Tweaks’ 调整了一些东西。所以我没有做什么大的改变。例如,我将默认用户界面字体改为使用 Droid Sans Regular 字体。并且我用‘设置’来改变键盘快捷键,用 `Alt-Tab` 键来切换窗口,而不是切换应用程序。我是在 `Alt-Tab` 工作流程中长大的,所以我已经习惯了。”他使用火狐和谷歌浏览器来作为他的 Web 浏览器。 + +为了经营他的咨询业务,Jim 依赖于一套应用程序: + + * 使用 [LibreOffice][5] 去写他的书。例如,他去年出版了 《[Coaching Buttons][6]》,他完全使用 LibreOffice 来写这本书。最近他写了一本关于 [用 C 语言编写 FreeDOS 程序的书][7] 也用了 LibreOffice 。 + ![Libre Office Writer][15] + * [INKSCAPE][8] 为他创建了矢量格式的公司标志。他的标志可以完美地放大缩小,从文件上的小角落图像到大幅面的海报或横幅。并且 INKSCAPE 允许他导出各种通用格式。Jim 说他的广告合作伙伴很欣赏 INKSCAPE 可以输出到EPS(Encapsulated Postscript),这使得在产品上打印他的标志变得很容易。 + * [GIMP][9] 用于其他图形,例如闪屏图片。“我的闪屏图片是我们公司的标志被放在了背景照片上,在我需要额外装饰的地方,比如印刷材料,我用它来替代普通标志。我也在我的网站上使用了闪屏图片的一个版本”。 + * [QEMU][10] 用来运行虚拟机,在他那里可以启动 [FreeDOS][11]。“我喜欢使用 QEMU,因为我可以在命令行中设置所有需要的选项,这使我在配置虚拟机时有了很大的灵活性。为了更方便,我将所有选项放入到一个脚本中,用它来运行QEMU,每次都是相同的选项”。 + ![QEMU – running as easy as in FreeDOS][14] + * [Scribus][12] 是用来打印产品的。Scribus 很容易用来创建具有“全出血”的印刷品,这意味着任何颜色的背景都会与纸张的边缘重叠。全出血需要一个特殊的打印准备文件,与打印区域重叠。它甚至还提供了切割标记,以便打印机准确地知道要修剪的位置。 + ![Scribus – Postcard][13] + +-------------------------------------------------------------------------------- + +via: https://fedoramagazine.org/jim-hall-how-do-you-fedora/ + +作者:[Karimi Hari Priya][a] +选题:[lujun9972][b] +译者:[zz-air](https://github.com/zz-air) +校对:[wxy](https://github.com/wxy) + +本文由 [LCTT](https://github.com/LCTT/TranslateProject) 原创编译,[Linux中国](https://linux.cn/) 荣誉推出 + +[a]: https://fedoramagazine.org/author/haripriya21/ +[b]: https://github.com/lujun9972 +[1]: https://fedoramagazine.org/wp-content/uploads/2020/12/PXL_20200929_205044670.PORTRAIT-01.COVER_-816x345.jpg +[2]: https://fedoramagazine.org/tag/how-do-you-fedora +[3]: https://fedoramagazine.org/submit-an-idea-or-tip +[4]: https://hallmentum.com/ +[5]: https://www.libreoffice.org/ +[6]: https://www.amazon.com/Coaching-Buttons-Jim-Hall/dp/0359834930 +[7]: https://www.freedos.org/books/ +[8]: https://inkscape.org/ +[9]: https://www.gimp.org/ +[10]: https://www.qemu.org/ +[11]: https://www.freedos.org/ +[12]: https://www.scribus.net/ +[13]: https://fedoramagazine.org/wp-content/uploads/2021/03/Scribus-postcard-1024x576.png +[14]: https://fedoramagazine.org/wp-content/uploads/2021/03/QEMU-running-AsEasyAs-in-FreeDOS.png +[15]: https://fedoramagazine.org/wp-content/uploads/2021/03/LibreOffice-Writer-book-1-1024x576.png diff --git a/published/202107/20210621 Replace man pages with Tealdeer on Linux.md b/published/202107/20210621 Replace man pages with Tealdeer on Linux.md new file mode 100644 index 0000000000..38fdafe103 --- /dev/null +++ b/published/202107/20210621 Replace man pages with Tealdeer on Linux.md @@ -0,0 +1,131 @@ +[#]: subject: (Replace man pages with Tealdeer on Linux) +[#]: via: (https://opensource.com/article/21/6/tealdeer-linux) +[#]: author: (Sudeshna Sur https://opensource.com/users/sudeshna-sur) +[#]: collector: (lujun9972) +[#]: translator: (ddl-hust) +[#]: reviewer: (wxy) +[#]: publisher: (wxy) +[#]: url: (https://linux.cn/article-13570-1.html) + +在 Linux 上使用 Tealdeer 替代手册页 +====== + +> Tealder 是 Rust 版本的 tldr,对常用的命令提供了易于理解的说明信息。 + +![](https://img.linux.net.cn/data/attachment/album/202107/11/204638catii1ro21jmjzmi.jpg) + +手册页是我开始探索 Linux 时最常用的资源。当然,对于初学者熟悉命令行指令而言,`man` 是最频繁使用的指令。但是手册页中有大量的选项和参数列表,很难被解读,这使得你很难理解你想知道的东西。如果你想要一个更简单的解决方案,有基于例子的输出,我认为 [tldr][2] (太长不读too long dnot's read)是最好的选择。 + +### Tealdeer 是什么? + +[Tealdeer][3] 是 tldr 的一个基于 Rust 的实现。它是一个社区驱动的手册页,给出了非常简单的命令工作原理的例子。Tealdeer 最棒的地方在于它几乎包含了所有你通常会用到的命令。 + +### 安装 Tealdeer + +在 Linux 系统,你可以从软件仓库安装 Tealdeer,比如在 [Fedora][4] 上: + +``` +$ sudo dnf install tealdeer +``` + +在 macOS 可以使用 [MacPorts][5] 或者 [Homebrew][6]。 +同样,你可以使用 Rust 的 Cargo 包管理器来编译和安装此工具: + +``` +$ cargo install tealdeer +``` + +### 使用 Tealdeer + +输入 `tldr-list` 返回 tldr 所支持的手册页,比如 `touch`、`tar`、`dnf`、`docker`、`zcat`、`zgrep` 等: + +``` +$ tldr --list +2to3 +7z +7za +7zr +[ +a2disconf +a2dismod +a2dissite +a2enconf +a2enmod +a2ensite +a2query +[...] +``` + +使用 `tldr` 跟上具体的命令(比如 `tar` )能够显示基于示例的手册页,描述了你可以用该命令做的所有选项。 + +``` +$ tldr tar + + Archiving utility. + Often combined with a compression method, such as gzip or bzip2. + More information: . + + [c]reate an archive and write it to a [f]ile: + + tar cf target.tar file1 file2 file3 + + [c]reate a g[z]ipped archive and write it to a [f]ile: + + tar czf target.tar.gz file1 file2 file3 + + [c]reate a g[z]ipped archive from a directory using relative paths: + + tar czf target.tar.gz --directory=path/to/directory . + + E[x]tract a (compressed) archive [f]ile into the current directory [v]erbosely: + + tar xvf source.tar[.gz|.bz2|.xz] + + E[x]tract a (compressed) archive [f]ile into the target directory: + + tar xf source.tar[.gz|.bz2|.xz] --directory=directory + + [c]reate a compressed archive and write it to a [f]ile, using [a]rchive suffix to determine the compression program: + + tar caf target.tar.xz file1 file2 file3 +``` + +如需控制缓存: + +``` +$ tldr --update +$ tldr --clear-cache +``` + +你能够控制 Tealdeer 输出的颜色选项,有三种模式选择:一直、自动、从不。默认选项是自动,但我喜欢颜色提供的额外信息,所以我在我的 `~/.bashrc `文件中增加了这个别名: + +``` +alias tldr='tldr --color always' +``` +### 结论 + +Tealdeer 的美妙之处在于不需要网络连接就可以使用,只有更新缓存的时候才需要联网。因此,即使你处于离线状态,依然能够查找和学习你新学到的命令。更多信息,请查看该工具的 [说明文档][8]。 + +你会使用 Tealdeer 么?或者你已经在使用了?欢迎留言让我们知道。 + +-------------------------------------------------------------------------------- + +via: https://opensource.com/article/21/6/tealdeer-linux + +作者:[Sudeshna Sur][a] +选题:[lujun9972][b] +译者:[ddl-hust](https://github.com/ddl-hust) +校对:[wxy](https://github.com/wxy) + +本文由 [LCTT](https://github.com/LCTT/TranslateProject) 原创编译,[Linux中国](https://linux.cn/) 荣誉推出 + +[a]: https://opensource.com/users/sudeshna-sur +[b]: https://github.com/lujun9972 +[1]: https://opensource.com/sites/default/files/styles/image-full-size/public/lead-images/features_solutions_command_data.png?itok=4_VQN3RK (computer screen ) +[2]: https://github.com/tldr-pages/tldr +[3]: https://github.com/dbrgn/tealdeer +[4]: https://src.fedoraproject.org/rpms/rust-tealdeer +[5]: https://opensource.com/article/20/11/macports +[6]: https://opensource.com/article/20/6/homebrew-mac +[7]: https://www.gnu.org/software/tar\> +[8]: https://dbrgn.github.io/tealdeer/intro.html diff --git a/published/202107/20210624 Copy files between Linux and FreeDOS.md b/published/202107/20210624 Copy files between Linux and FreeDOS.md new file mode 100644 index 0000000000..55fe83b30b --- /dev/null +++ b/published/202107/20210624 Copy files between Linux and FreeDOS.md @@ -0,0 +1,122 @@ +[#]: subject: (Copy files between Linux and FreeDOS) +[#]: via: (https://opensource.com/article/21/6/copy-files-linux-freedos) +[#]: author: (Jim Hall https://opensource.com/users/jim-hall) +[#]: collector: (lujun9972) +[#]: translator: (geekpi) +[#]: reviewer: (wxy) +[#]: publisher: (wxy) +[#]: url: (https://linux.cn/article-13548-1.html) + +在 Linux 和 FreeDOS 之间复制文件 +====== + +> 下面是我如何在我的 FreeDOS 虚拟机和 Linux 桌面系统之间传输文件。 + +![](https://img.linux.net.cn/data/attachment/album/202107/04/181327bfvv3mmzby9z2dpr.jpg) + +我运行 Linux 作为我的主要操作系统,我在一个虚拟机中启动 FreeDOS。大多数时候,我使用 QEMU 作为我的 PC 模拟器,但有时我会用 GNOME Boxes(它使用 QEMU 作为后端虚拟机)或用 VirtualBox 运行其他实验。 + +我喜欢玩经典的 DOS 游戏,有时我也会调出一个最喜欢的 DOS 应用。我在管理信息系统(MIS)课上讲计算机的历史,有时我会用 FreeDOS 和一个传统的 DOS 应用录制一个演示,比如 As-Easy-As(我最喜欢的 DOS 电子表格,曾经作为“共享软件”发布,但现在可以 [从 TRIUS 公司免费获得][2])。 + +但是以这种方式使用 FreeDOS 意味着我需要在我的 FreeDOS 虚拟机和我的 Linux桌 面系统之间传输文件。让我来展示是如何做到这一点的。 + +### 用 guestmount 访问镜像 + +我曾经通过计算第一个 DOS 分区的偏移量来访问我的虚拟磁盘镜像,然后用正确的选项组合来调用 Linux 的 `mount` 命令来匹配这个偏移量。这总是很容易出错,而且不是很灵活。幸运的是,有一个更简单的方法可以做到这一点。来自 [libguestfs-tools][3] 包的 `guestmount` 程序可以让你从 Linux 中访问或 _挂载_ 虚拟磁盘镜像。你可以在 Fedora 上用这个命令安装 `libguestfs-tools`: + +``` +$ yum install libguestfs-tools libguestfs +``` + +使用 `guestmount` 并不像从 GNOME 文件管理器中双击文件那么简单,但命令行的使用并不难。`guestmount` 的基本用法是: + +``` +$ guestmount -a image -m device mountpoint +``` + +在这个用法中,`image` 是要使用的虚拟磁盘镜像。在我的系统中,我用 `qemu-img` 命令创建了 QEMU 虚拟磁盘镜像。`guestmount` 程序可以读取这种磁盘镜像格式,以及 GNOME Boxes 使用的 QCOW2 镜像格式,或者 VirtualBox 使用的 VDI 镜像格式。 + +`device` 选项表示虚拟磁盘上的分区。想象一下,把这个虚拟磁盘当作一个真正的硬盘使用。你可以用 `/dev/sda1` 访问第一个分区,用 `/dev/sda2` 访问第二个分区,以此类推。这就是 `guestmount` 的语法。默认情况下,FreeDOS 1.3 RC4 在一个空的驱动器上创建了一个分区,所以访问这个分区的时候要用 `/dev/sda1`。 + +而 `mountpoint` 是在你的本地 Linux 系统上“挂载” DOS 文件系统的位置。我通常会创建一个临时目录来工作。你只在访问虚拟磁盘时需要挂载点。 + +综上所述,我使用这组命令从 Linux 访问我的 FreeDOS 虚拟磁盘镜像: + +``` +$ mkdir /tmp/freedos +$ guestmount -a freedos.img -m /dev/sda1 /tmp/freedos +``` + +之后,我可以通过 `/tmp/freedos` 目录访问我的 FreeDOS 文件,使用 Linux 上的普通工具。我可以在命令行中使用 `ls /tmp/freedos`,或者使用桌面文件管理器打开 `/tmp/freedos` 挂载点。 + +``` +$ ls -l /tmp/freedos +total 216 +drwxr-xr-x. 5 root root 8192 May 10 15:53 APPS +-rwxr-xr-x. 1 root root 85048 Apr 30 07:54 COMMAND.COM +-rwxr-xr-x. 1 root root 103 May 13 15:48 CONFIG.SYS +drwxr-xr-x. 5 root root 8192 May 15 16:52 DEVEL +drwxr-xr-x. 2 root root 8192 May 15 13:36 EDLIN +-rwxr-xr-x. 1 root root 1821 May 10 15:57 FDAUTO.BAT +-rwxr-xr-x. 1 root root 740 May 13 15:47 FDCONFIG.SYS +drwxr-xr-x. 10 root root 8192 May 10 15:49 FDOS +-rwxr-xr-x. 1 root root 46685 Apr 30 07:54 KERNEL.SYS +drwxr-xr-x. 2 root root 8192 May 10 15:57 SRC +-rwxr-xr-x. 1 root root 3190 May 16 08:34 SRC.ZIP +drwxr-xr-x. 3 root root 8192 May 11 18:33 TEMP +``` + +![GNOME file manager][4] + +*使用 GNOME 文件管理器来访问虚拟磁盘* + +例如,要从我的 Linux `projects` 目录中复制几个 C 源文件到虚拟磁盘镜像上的 `C:\SRC`,以便我以后能在 FreeDOS 下使用这些文件,我可以使用 Linux `cp` 命令: + +``` +$ cp /home/jhall/projects/*.c /tmp/freedos/SRC +``` + +虚拟驱动器上的文件和目录在技术上是不分大小写的,所以你可以用大写或小写字母来引用它们。然而,我发现使用所有大写字母来输入 DOS 文件和目录更为自然。 + +``` +$ ls /tmp/freedos +APPS CONFIG.SYS EDLIN FDCONFIG.SYS KERNEL.SYS SRC.ZIP +COMMAND.COM DEVEL FDAUTO.BAT FDOS SRC TEMP + +$ ls /tmp/freedos/EDLIN +EDLIN.EXE MAKEFILE.OW + +$ ls /tmp/freedos/edlin +EDLIN.EXE MAKEFILE.OW +``` + +### 用 guestmount 卸载 + +在你再次在虚拟机中使用虚拟磁盘镜像之前,你应该总是先 _卸载_。如果你在运行 QEMU 或 VirtualBox 时让镜像挂载,你有可能弄乱你的文件。 + +与 `guestmount` 配套的命令是 `guestunmount`,用来卸载磁盘镜像。只要给出你想卸载的挂载点就可以了: + +``` +$ guestunmount /tmp/freedos +``` + +请注意命令拼写与 Linux 的 `umount` 稍有不同。 + +-------------------------------------------------------------------------------- + +via: https://opensource.com/article/21/6/copy-files-linux-freedos + +作者:[Jim Hall][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/jim-hall +[b]: https://github.com/lujun9972 +[1]: https://opensource.com/sites/default/files/styles/image-full-size/public/lead-images/files_documents_paper_folder.png?itok=eIJWac15 (Files in a folder) +[2]: http://www.triusinc.com/forums/viewtopic.php?t=10 +[3]: https://libguestfs.org/ +[4]: https://opensource.com/sites/default/files/uploads/gnome-file-manager.png (Using GNOME file manager to access the virtual disk) +[5]: https://creativecommons.org/licenses/by-sa/4.0/ diff --git a/published/202107/20210624 View statistics about your code with Tokei.md b/published/202107/20210624 View statistics about your code with Tokei.md new file mode 100644 index 0000000000..290dddf1b4 --- /dev/null +++ b/published/202107/20210624 View statistics about your code with Tokei.md @@ -0,0 +1,195 @@ +[#]: subject: "View statistics about your code with Tokei" +[#]: via: "https://opensource.com/article/21/6/tokei" +[#]: author: "Sudeshna Sur https://opensource.com/users/sudeshna-sur" +[#]: collector: "lujun9972" +[#]: translator: "zepoch" +[#]: reviewer: "wxy" +[#]: publisher: "wxy" +[#]: url: "https://linux.cn/article-13554-1.html" + +使用 Tokei 查看有关代码的统计信息 +====== + +> 了解有关项目编程语言的详细信息。 + +![](https://img.linux.net.cn/data/attachment/album/202107/06/114306ar6zjnrr92rn2vnz.jpg) + +近来,GitHub 添加了一个小指标来展示项目的细节,包括项目使用的编程语言。在这之前,对一个新的贡献者来说,了解他们感兴趣的项目的信息是较为困难的。 + +这个补充很有帮助,但是如果您想知道有关本地存储库中项目的相同信息该怎么办呢? 这正是 [Tokei][2] 派上用场的地方。这是一个当你想和精通不同语言的人想要构建一个项目时可以告诉你项目的代码数据的特别有用的工具。 + +### 探索 Tokei + +据其 [README][3],“Tokei 是一个可以展示你的代码数据的程序。Tokei 将会展示文件的数量,和这些文件中不同语言的代码、注释、空白的行数。”它的 v.12.1.0 版本 [elaborates][4] 是这样子介绍的,“Tokei 是一个快速准确的代码分析 CLI 工具和库,可以使你轻松快速地在你的代码库中看到有多少空白、评论和代码行”。它能够识别超过 150 种编程语言。 + +``` +$ ./tokei ~/exa/src ~/Work/wildfly/jaxrs +================== +Language Files Lines Code Comments Blank +Java 46 6135 4324 945 632 +XML 23 5211 4839 473 224 +--------------------------------- +Rust +Markdown +----------------------------------- +Total +``` + +### 安装 Tokei + +在 Fedora 上安装 Tokei: + +``` +$ sudo dnf install tokei +``` + +用 Rust's Cargo 包管理器安装: + +``` +$ cargo install tokei +``` + +### 使用 Tokei + +要列出当前目录中的代码统计: + +``` +$ tokei +=============================================================================== + Language Files Lines Code Comments Blanks +=============================================================================== + Ada 10 2840 1681 560 599 + Assembly 4 2508 1509 458 541 + GNU Style Assembly 4 2751 1528 748 475 + Autoconf 16 2294 1153 756 385 + Automake 1 45 34 0 11 + BASH 4 1895 1602 133 160 + Batch 2 4 4 0 0 + C 330 206433 150241 23402 32790 + C Header 342 60941 24682 29143 7116 + CMake 48 4572 3459 548 565 + C# 9 1615 879 506 230 + C++ 5 907 599 136 172 + Dockerfile 2 16 10 0 6 + Fish 1 87 77 5 5 + HTML 1 545 544 1 0 + JSON 5 8995 8995 0 0 + Makefile 10 504 293 72 139 + Module-Definition 12 1183 1046 65 72 + MSBuild 1 141 140 0 1 + Pascal 4 1443 1016 216 211 + Perl 2 189 137 16 36 + Python 4 1257 949 112 196 + Ruby 1 23 18 1 4 + Shell 15 1860 1411 222 227 + Plain Text 35 29425 0 26369 3056 + TOML 64 3180 2302 453 425 + Visual Studio Pro| 30 14597 14597 0 0 + Visual Studio Sol| 6 655 650 0 5 + XML 1 116 95 17 4 + YAML 2 81 56 12 13 + Zsh 1 59 48 8 3 +------------------------------------------------------------------------------- + Markdown 55 4677 0 3214 1463 + |- C 1 2 2 0 0 + |- Rust 19 336 268 20 48 + |- TOML 23 61 60 0 1 + (Total) 5076 330 3234 1512 +------------------------------------------------------------------------------- + Rust 496 210966 188958 5348 16660 + |- Markdown 249 17676 1551 12502 3623 + (Total) 228642 190509 17850 20283 +=============================================================================== + Total 1523 566804 408713 92521 65570 +=============================================================================== +$ +``` + +下面的命令打印出了支持的语言和拓展: + +``` +$ tokei -l +ABNF +ABAP +ActionScript +Ada +Agda +Alex +Alloy +Arduino C++ +AsciiDoc +ASN.1 +ASP +ASP.NET +Assembly +GNU Style Assembly +``` + +如果你在两个文件夹上运行 `tokei` 并指定其位置作为参数,它将以先入先出的规则打印单个文件的统计数据: + +![Running Tokei on two files][5] + +默认情况下,`tokei` 仅仅输出有关语言的数据,但是使用 `--files` 标记可提供单个文件统计信息: + +``` +$ tokei ~/exa/src --files +=========================================================================================== + Language Files Lines Code Comments Blanks +=========================================================================================== + Rust 54 9339 7070 400 1869 + |- Markdown 33 1306 0 1165 141 + (Total) 10645 7070 1565 2010 +------------------------------------------------------------------------------------------- + /home/ssur/exa/src/theme/default_theme.rs 130 107 0 23 + /home/ssur/exa/src/output/render/times.rs 30 24 0 6 + /home/ssur/exa/src/output/render/users.rs 98 76 0 22 + /home/ssur/exa/src/output/render/size.rs 182 141 3 38 + /home/ssur/exa/src/output/render/octal.rs 116 88 0 28 + /home/ssur/exa/src/output/render/mod.rs 33 20 3 10 + /home/ssur/exa/src/output/render/inode.rs 28 20 0 8 + /home/ssur/exa/src/output/render/links.rs 87 65 0 22 + /home/ssur/exa/src/output/render/groups.rs 123 93 0 30 + |ome/ssur/exa/src/output/render/filetype.rs 31 26 0 5 + /home/ssur/exa/src/output/render/blocks.rs 57 40 0 17 + /home/ssur/exa/src/output/render/git.rs 108 87 0 21 + |/ssur/exa/src/output/render/permissions.rs 204 160 3 41 + /home/ssur/exa/src/output/grid.rs 67 51 3 13 + /home/ssur/exa/src/output/escape.rs 26 18 4 4 + /home/ssur/exa/src/theme/lsc.rs 235 158 39 38 + /home/ssur/exa/src/options/theme.rs 159 124 6 29 + /home/ssur/exa/src/options/file_name.rs 46 39 0 7 + /home/ssur/exa/src/options/flags.rs 84 63 6 15 + /home/ssur/exa/src/fs/mod.rs 10 8 0 2 + /home/ssur/exa/src/fs/feature/mod.rs 33 25 0 8 +-- /home/ssur/exa/src/output/time.rs --------------------------------------------------------------- + |- Rust 215 170 5 40 + |- Markdown 28 0 25 3 +``` + +### 总结 + +我发现使用 `tokei` 来了解我的代码统计数据十分容易。另一个使用 `tokei` 的好处就是它可以用作为一个很容易集成到其他项目的库。访问 Tokei 的 [Crate.io page][7] 和 [Docs.rs][8] 网站来了解其更多用法。如果你想参与其中,你也可以通过它的 [GitHub 仓库][2] 来为 Tokei 作贡献。 + +你是否觉得 Tokei 很有用呢?可以在下方的评论区告诉我们。 + +-------------------------------------------------------------------------------- + +via: https://opensource.com/article/21/6/tokei + +作者:[Sudeshna Sur][a] +选题:[lujun9972][b] +译者:[zepoch](https://github.com/zepoch) +校对:[wxy](https://github.com/wxy) + +本文由 [LCTT](https://github.com/LCTT/TranslateProject) 原创编译,[Linux中国](https://linux.cn/) 荣誉推出 + +[a]: https://opensource.com/users/sudeshna-sur +[b]: https://github.com/lujun9972 +[1]: https://opensource.com/sites/default/files/styles/image-full-size/public/lead-images/code_development_programming_screen.png?itok=BgcSm5Pl "A screen of code." +[2]: https://github.com/XAMPPRocky/tokei +[3]: https://github.com/XAMPPRocky/tokei/blob/master/README.md +[4]: https://github.com/XAMPPRocky/tokei/releases/tag/v12.1.0 +[5]: https://opensource.com/sites/default/files/uploads/tokei-two-files_0.png "Running Tokei on two files" +[6]: https://creativecommons.org/licenses/by-sa/4.0/ +[7]: https://crates.io/crates/tokei +[8]: https://docs.rs/tokei/12.1.2/tokei/ diff --git a/published/202107/20210625 How to Setup Internet in CentOS, RHEL, Rocky Linux Minimal Install.md b/published/202107/20210625 How to Setup Internet in CentOS, RHEL, Rocky Linux Minimal Install.md new file mode 100644 index 0000000000..7beff5677d --- /dev/null +++ b/published/202107/20210625 How to Setup Internet in CentOS, RHEL, Rocky Linux Minimal Install.md @@ -0,0 +1,121 @@ +[#]: subject: (How to Setup Internet in CentOS, RHEL, Rocky Linux Minimal Install) +[#]: via: (https://www.debugpoint.com/2021/06/setup-internet-minimal-install-server/) +[#]: author: (Arindam https://www.debugpoint.com/author/admin1/) +[#]: collector: (lujun9972) +[#]: translator: (geekpi) +[#]: reviewer: (turbokernel) +[#]: publisher: (wxy) +[#]: url: (https://linux.cn/article-13585-1.html) + +如何在 CentOS、RHEL、Rocky Linux 最小化安装中设置互联网 +====== + +![](https://img.linux.net.cn/data/attachment/album/202107/16/104745wne0x111onmafxj9.jpg) + +在最小化服务器安装中,设置互联网或网络是非常容易的。在本指南中,我们将解释如何在 CentOS、RHEL、Rocky Linux 最小安装中设置互联网或网络。 + +当你刚刚完成任何服务器发行版的最小化安装时,你没有任何图形界面或桌面环境可以用于设置你的网络或互联网。因此,当你只能使用终端时,了解如何设置联网是很重要的。NetworkManager 以及 systemd 服务为完成这项工作提供了必要的工具。以下是具体使用方法。 + +### 在 CentOS、RHEL、Rocky Linux 最小化安装中设置互联网 + +完成安装后,启动服务器终端。理想情况下,你应该会看到提示符。使用 root 或 admin 账户登录。 + +然后,首先尝试使用 `nmcli` 检查网络接口的状态和细节。`nmcli` 是一个控制 NetworkManager 服务的命令行工具。使用以下命令进行检查。 + +``` +nmcli device status +``` + +这将显示设备名称、状态等。 + +![nmcli device status][1] + +运行工具 `nmtui` 来配置网络接口。[nmtui][2] 是 NetworkManager 工具的一部分,它为你提供了一个漂亮的用户界面来配置网络。这是 NetworkManager-tui 包的一部分,当你完成最小服务器的安装时它应该默认安装。 + +``` +nmtui +``` + +在 `nmtui` 窗口中点击编辑一个连接。 + +![nmtui – Select options][3] + +选择网口名称: + +![Select Interface to Edit][4] + +在编辑连接窗口,为 IPv4 和 IPv6 选择自动。并选择自动连接。完成后按 “OK”。 + +![nmtui – Edit Connection][5] + +通过使用如下 [systemd systemctl][6] 命令,重新启动 NetworkManager 服务。 + +``` +systemctl restart NetworkManager +``` + +如果一切顺利,在 CentOS、RHEL、Rocky Linux 服务器的最小化安装中你应该可以连接到网络和互联网了,前提是你的网络有互联网连接。你可以用 `ping` 来验证它是否正常。 + +![setup internet minimal server – CentOS Rocky Linux RHEL][7] + +### 额外技巧:在最小化服务器中设置静态 IP + +当你把网络配置设置为自动,当你连接到互联网时,网口会动态地分配 IP。在某些情况下,当你建立一个局域网 (LAN) 时,你可能想给你的网口分配静态 IP。这超级简单。 + +打开你的网络的网络配置脚本。根据你的设备修改高亮部分: + +``` +vi /etc/sysconfig/network-scripts/ifcfg-ens3 +``` + +在上面的文件中,用 `IPADDR` 属性添加你想要的 IP 地址。保存该文件。 + +``` +IPADDR=192.168.0.55 +``` + +在 `/etc/sysconfig/network` 中为你的网络添加网关: + +``` +NETWORKING=yes +HOSTNAME=debugpoint +GATEWAY=10.1.1.1 +``` + +在 `/etc/resolv.conf` 的 `resolv.conf` 中添加任意公共 DNS 服务器: + +``` +nameserver 8.8.8.8 +nameserver 8.8.4.4 +``` + +并重新启动网络服务: + +``` +systemctl restart NetworkManager +``` + +这样就完成了静态 IP 的设置。你也可以使用 `ip addr` 命令检查详细的 IP 信息。 + +我希望这个指南能帮助你在你的最小化服务器中设置网络、互联网和静态 IP。如果你有任何问题,请在评论区告诉我。 + +-------------------------------------------------------------------------------- + +via: https://www.debugpoint.com/2021/06/setup-internet-minimal-install-server/ + +作者:[Arindam][a] +选题:[lujun9972][b] +译者:[geekpi](https://github.com/geekpi) +校对:[turbokernel](https://github.com/turbokernel) + +本文由 [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/blog/wp-content/uploads/2021/06/nmcli-device-status.jpg +[2]: https://access.redhat.com/documentation/en-us/red_hat_enterprise_linux/7/html/networking_guide/sec-configuring_ip_networking_with_nmtui +[3]: https://www.debugpoint.com/blog/wp-content/uploads/2021/06/nmtui-Select-options.jpg +[4]: https://www.debugpoint.com/blog/wp-content/uploads/2021/06/Select-Interface-to-Edit.jpg +[5]: https://www.debugpoint.com/blog/wp-content/uploads/2021/06/nmtui-Edit-Connection.jpg +[6]: https://www.debugpoint.com/2020/12/systemd-systemctl-service/ +[7]: https://www.debugpoint.com/blog/wp-content/uploads/2021/06/setup-internet-minimal-server-CentOS-Rocky-Linux-RHEL.jpg diff --git a/published/202107/20210625 Use Python to parse configuration files.md b/published/202107/20210625 Use Python to parse configuration files.md new file mode 100644 index 0000000000..b021b100af --- /dev/null +++ b/published/202107/20210625 Use Python to parse configuration files.md @@ -0,0 +1,198 @@ +[#]: subject: "Use Python to parse configuration files" +[#]: via: "https://opensource.com/article/21/6/parse-configuration-files-python" +[#]: author: "Moshe Zadka https://opensource.com/users/moshez" +[#]: collector: "lujun9972" +[#]: translator: "zepoch" +[#]: reviewer: "wxy" +[#]: publisher: "wxy" +[#]: url: "https://linux.cn/article-13551-1.html" + +使用 Python 解析配置文件 +====== + +> 第一步是选择配置文件的格式:INI、JSON、YAML 或 TOML。 + +![](https://img.linux.net.cn/data/attachment/album/202107/05/113551tm0d0yp0px0xzp0n.jpg) + +有时,程序需要足够的参数,将它们全部作为命令行参数或环境变量既不让人愉快也不可行。 在这些情况下,你将需要使用配置文件。 + +有几种流行的配置文件格式。其中包括古老的(虽然有时定义不明确)INI 格式,虽然流行但有时难以手写的 JSON 格式,使用广泛但有时在细节方面令人意外的 YAML 格式,以及很多人还没有听说过的最新出现的 TOML。 + +你的首要任务是选择一种格式,然后记录该选择。解决了这个简单的部分之后就是时候解析配置了。 + +有时,在配置中拥有一个与“抽象“数据相对应的类是一个不错的想法。因为这段代码不会对配置做任何事情,所以这是展示解析逻辑最简单的方式。 + +想象一下文件处理器的配置:它包括一个输入目录、一个输出目录和要提取的文件。 + +配置类的抽象定义可能类似于: + +``` +from __future__ import annotations +``` + +``` +import attr + +@attr.frozen +class Configuration: + @attr.frozen + class Files: + input_dir: str + output_dir: str + files: Files + @attr.frozen + class Parameters: + patterns: List[str] + parameters: Parameters +``` + +为了使特定于格式的代码更简单,你还需要编写一个函数来从字典中解析此类。请注意,这假设配置将使用破折号,而不是下划线。 这种差异并不少见。 + +``` +def configuration_from_dict(details): + files = Configuration.Files( + input_dir=details["files"]["input-dir"], + output_dir=details["files"]["output-dir"], + ) + parameters = Configuration.Paraneters( + patterns=details["parameters"]["patterns"] + ) + return Configuration( + files=files, + parameters=parameters, + ) +``` + +### JSON + +JSON(JavaScript Object Notation)是一种类似于 JavaScript 的格式。 + +以下是 JSON 格式的示例配置: + +``` +json_config = """ +{ + "files": { + "input-dir": "inputs", + "output-dir": "outputs" + }, + "parameters": { + "patterns": [ + "*.txt", + "*.md" + ] + } +} +""" +``` + +解析逻辑使用 `json` 模块将 JSON 解析为 Python 的内置数据结构(字典、列表、字符串),然后从字典中创建类: + +``` +import json +def configuration_from_json(data): + parsed = json.loads(data) + return configuration_from_dict(parsed) +``` + +### INI + +INI 格式,最初只在 Windows 上流行,之后成为配置标准格式。 + +这是与 INI 相同的配置: + +``` +ini_config=""" +[files] +input-dir = inputs +output-dir = outputs + +[parameters] +patterns = ['*.txt', '*.md'] +""" +``` + +Python 可以使用内置的 `configparser` 模块解析它。解析器充当类似 `dict` 的对象,因此可以直接传递给 `configuration_from_dict`: + +``` +import configparser + +def configuration_from_ini(data): + parser = configparser.ConfigParser() + parser.read_string(data) + return configuration_from_dict(parser) +``` + +### YAML + +YAML(Yet Another Markup Language)是 JSON 的扩展,旨在更易于手动编写。为了实现了这一点,部分原因是有一个很长的规范。 + +以下是 YAML 中的相同配置: + +``` +yaml_config = """ +files: + input-dir: inputs + output-dir: outputs +parameters: + patterns: + - '*.txt' + - '*.md' +""" +``` + +要让 Python 解析它,你需要安装第三方模块。最受欢迎的是`PyYAML`(`pip install pyyaml`)。 YAML 解析器还返回可以传递给 `configuration_from_dict` 的内置 Python 数据类型。但是,YAML 解析器需要一个字节流,因此你需要将字符串转换为字节流。 + +``` +import io +import yaml +def configuration_from_yaml(data): + fp = io.StringIO(data) + parsed = yaml.safe_load(fp) + return configuration_from_dict(parsed) +``` + +### TOML + +TOML(Tom's Own Markup Language)旨在成为 YAML 的轻量级替代品。其规范比较短,已经在一些地方流行了(比如 Rust 的包管理器 Cargo 就用它来进行包配置)。 + +这是与 TOML 相同的配置: + +``` +toml_config = """ +[files] +input-dir = "inputs" +output-dir = "outputs" + +[parameters] +patterns = [ "*.txt", "*.md",] +""" +``` + +为了解析 TOML,你需要安装第三方包。最流行的一种被简单地称为 `toml`。 与 YAML 和 JSON 一样,它返回基本的 Python 数据类型。 + +``` +import toml +def configuration_from_toml(data): + parsed = toml.loads(data) + return configuration_from_dict(parsed) +``` + +### 总结 + +选择配置格式是一种微妙的权衡。但是,一旦你做出决定,Python 就可以使用少量代码来解析大多数流行的格式。 + +-------------------------------------------------------------------------------- + +via: https://opensource.com/article/21/6/parse-configuration-files-python + +作者:[Moshe Zadka][a] +选题:[lujun9972][b] +译者:[zepoch](https://github.com/zepoch) +校对:[wxy](https://github.com/wxy) + +本文由 [LCTT](https://github.com/LCTT/TranslateProject) 原创编译,[Linux中国](https://linux.cn/) 荣誉推出 + +[a]: https://opensource.com/users/moshez +[b]: https://github.com/lujun9972 +[1]: https://opensource.com/sites/default/files/styles/image-full-size/public/lead-images/python_programming_question.png?itok=cOeJW-8r "Python programming language logo with question marks" diff --git a/published/202107/20210627 Using Git Version Control as a Writer.md b/published/202107/20210627 Using Git Version Control as a Writer.md new file mode 100644 index 0000000000..9c62e93ebd --- /dev/null +++ b/published/202107/20210627 Using Git Version Control as a Writer.md @@ -0,0 +1,109 @@ +[#]: subject: (Using Git Version Control as a Writer) +[#]: via: (https://news.itsfoss.com/version-control-writers/) +[#]: author: (Theena https://news.itsfoss.com/author/theena/) +[#]: collector: (lujun9972) +[#]: translator: (piaoshi) +[#]: reviewer: (wxy) +[#]: publisher: (wxy) +[#]: url: (https://linux.cn/article-13604-1.html) + +作为一个写作者如何使用 Git 版本控制 +====== + +> 我使用 Vim 和 Git 来写小说。是的,你也可以用 Git 来完成非编码任务。 + +![](https://i1.wp.com/news.itsfoss.com/wp-content/uploads/2021/06/Using-Git-for-Writing.jpg?w=1200&ssl=1) + +我相信当代的写作者们应该开始思考他们的工作流程了。 + +在一个注意力高度分散的世界里,作为写作者,我们必须对每天执行的任务链拥有控制权。传统上,作家们会把他们的写作放在分散注意力的事较少、注意力高度集中的时间段。不幸的是,海明威、阿特伍德们的这些建议不再真正适用于我们了。我们所生活的世界联系得更紧密了,因此对作家来说就有了更多的陷阱。这首先要求我们要有足够的自制力,不要让社交媒体或小狗和小猫的可爱视频在我们写作的时候分散我们的注意力。 + +但是,如果你的写作需要快速地检查事实、拼写不常见和技术性的词汇等,断开与互联网连接并不是一个现实的选项 —— 这正是我写作时的场景。另一个问题是你用于写作的应用程序本身的干扰;作为一个长期使用 MS Word 的人,我发现它越来越漂亮,但速度越来越慢,也越来越让人分心。作为当初我 [迁移到 Vim 的主要原因][1] 之一,我曾详细地谈到了这一点,所以我不打算再在这个问题上大谈特谈。重点是,在现代世界中,在现代设备上进行写作,可能远非理想状态。 + +因为我已经详细介绍过了 [我为什么转向 Vim][2] 和开源版本控制,在这篇文章中,我更想谈谈该 **怎么做**,特别是如何使用开源的版本控制技术,比如 Git(和 GitHub)。 + +### 什么是版本控制?再来一次? + +![Source: https://git-scm.com/][3] + +上图是我们如何进行传统版本控制的一个说明。这个图中假设你有一台设备,而且你只在那台设备上写作。但对我而言,我在许多机器上写作,包括我的安卓手机和一些不同年代的笔记本电脑,我会在特定的任务、特定的位置使用到它们。我在所有这些设备上进行的一个共同任务就是写作 —— 因此,我的设备必须以合理的方式捕捉变化并控制文件的版本。不要再让我将 `file1V1_device1_date.doc` 作为文件名了。 + +上图也没有考虑到我们用来写作的工具。像 LibreOffice Write 这样的文字处理器可以在 Linux、Mac 和 Windows 系统上使用,但在手机上使用文字处理器将会是一段不愉快的经历。我们中的一些写作者还使用其他文本工具(包括 Gmail 或我们的电子邮件客户端)来为我们的写作打草稿。但按逻辑顺序跟踪所有这些文件和电子邮件是相当折磨人的,我就用这样的流程写过一本书,相信我:我花在弄清文件名、版本变化、评论、给自己的注释以及带有附加注释的电子邮件上的时间,足以让我精神错乱。 + +读到这里,你们中的一些人可能会正确地指出,有云备份技术呀。虽然云存储的好处是巨大的,而且我也在继续使用它们,但其版本控制几乎不存在,或者说并不强大。 + +### 一个更好的工作流程 + +就像地球上的其它地方一样,大流行病的开始引发了一些焦虑和一些反思。我利用这段时间在 [The Odin Project][4](强烈推荐给那些想学习 html、CSS、JavaScript/Ruby 的人)上自学了网络开发。 + +在课程的第一个模块中,有一个关于 Git 的介绍:什么是版本控制,以及它试图解决什么问题。读了这一章后,我豁然开朗。我立即意识到,这个 _Git_ 正是我作为一个写作者所要寻找的东西。 + +是的,更好的方法不是本地化的版本控制,而是 _分布式_ 的版本控制。“分布式”描述的是设备的分布,而我在这些设备上访问文件,以及之后进行编辑修改。下图是分布式版本控制的一个直观说明。 + +![Source: https://git-scm.com/][5] + +### 我的方法 + +我为写作建立一个版本控制系统的目标如下: + + * 使我的稿件库可以从任何地方、任何设备上访问 + * 易于使用 + * 减少或消除因在写作、学习和编码各工作流程之间的场景切换而产生的摩擦 —— 尽可能使用同一工具(即 Vim)。 + * 可扩展性 + * 易于维护 + +基于以上需求,下图是我进行写作的分布式版本控制系统。 + +![][6] + +如你所见,我的版本控制系统是分布式版本控制的一个简单的适配。在我的例子中,通过将 Git 版本控制应用到云存储([pCloud][7])的一个文件夹上,我可以同时利用这两种技术的优点。因此,我的工作流程可以用下图描述: + +![][8] + +#### 优势 + + 1. 我用一个写作(和编码)工具 + 2. 我可以对我的手稿进行版本控制,无论我是从什么设备上访问文件的 + 3. [超级简单,几乎没有任何不便之处][9] + 4. 易于维护 + +#### 缺点 + +你们中的写作者一定想知道这个系统存在什么缺点。以下是我在持续使用和完善这一工作流程时预计到的几个问题。 + + * 对草稿的评论:文字处理器的一个更有用的功能是具有评论的功能。当我希望以后再回到文本的某一部分时,我经常在这部分为自己留下一个评论。我仍然没有想出一个解决这个问题的办法。 + * 协作:文字处理程序允许写作者之间进行协作。在我以前做广告相关工作的时候,我会用 Google Docs 来写文案,然后分享链接给我的设计师,从而他可以为广告和网站对文案进行摘录。现在,我的解决方法是用 Markdown 写文案,并通过 Pandoc 将 Markdown 文件导出为 .doc 文件。更关键的是,当我的手稿完成后,我仍然需要将文件以 .doc 格式发送给我的编辑。一旦我的编辑做了一些修改并把它发回来,我再尝试用 Vim 打开它就没有意义了。在这一点上,该系统的局限性变得更加明显。 + +我并不是说这是最好的方法,但在我职业生涯的这个阶段,这是对我来说最好的方法。我想,随着我对我的新的 [用于写作的开源工具][10] 和版本控制越来越熟悉和适应,我将进一步完善这个方法。 + +我希望这篇文章能为那些想使用 Git 进行文档版本控制的写作者提供一个很好的介绍。这肯定不是一篇详尽的文章,但我将分享一些有用的链接,使你的旅程更容易。 + + 1. [The Odin Project 介绍的 Git 基础知识][11] + 2. [开始使用 Git][12] + 3. GitHub 的 Git 基础知识教程 + +-------------------------------------------------------------------------------- + +via: https://news.itsfoss.com/version-control-writers/ + +作者:[Theena][a] +选题:[lujun9972][b] +译者:[piaoshi](https://github.com/piaoshi) +校对:[wxy](https://github.com/wxy) + +本文由 [LCTT](https://github.com/LCTT/TranslateProject) 原创编译,[Linux中国](https://linux.cn/) 荣誉推出 + +[a]: https://news.itsfoss.com/author/theena/ +[b]: https://github.com/lujun9972 +[1]: https://news.itsfoss.com/how-i-started-loving-vim/ +[2]: https://news.itsfoss.com/configuring-vim-writing/ +[3]: https://i0.wp.com/news.itsfoss.com/wp-content/uploads/2021/06/local.png?w=800&ssl=1 +[4]: https://www.theodinproject.com/ +[5]: https://i0.wp.com/news.itsfoss.com/wp-content/uploads/2021/06/distributed.png?w=668&ssl=1 +[6]: https://i2.wp.com/news.itsfoss.com/wp-content/uploads/2021/06/Version_Control.png?w=617&ssl=1 +[7]: https://itsfoss.com/recommends/pcloud/ +[8]: https://i2.wp.com/news.itsfoss.com/wp-content/uploads/2021/06/Version_Control_2.png?w=886&ssl=1 +[9]: https://www.youtube.com/watch?v=NtH-HhaLw-Q +[10]: https://itsfoss.com/open-source-tools-writers/ +[11]: https://www.theodinproject.com/paths/foundations/courses/foundations/lessons/introduction-to-git +[12]: https://git-scm.com/book/en/v2/Getting-Started-About-Version-Control diff --git a/published/202107/20210628 Forgot Linux Password on WSL- Here-s How to Reset it Easily.md b/published/202107/20210628 Forgot Linux Password on WSL- Here-s How to Reset it Easily.md new file mode 100644 index 0000000000..b92b147787 --- /dev/null +++ b/published/202107/20210628 Forgot Linux Password on WSL- Here-s How to Reset it Easily.md @@ -0,0 +1,137 @@ +[#]: subject: (Forgot Linux Password on WSL? Here’s How to Reset it Easily) +[#]: via: (https://itsfoss.com/reset-linux-password-wsl/) +[#]: author: (Abhishek Prakash https://itsfoss.com/author/abhishek/) +[#]: collector: (lujun9972) +[#]: translator: (geekpi) +[#]: reviewer: (wxy) +[#]: publisher: (wxy) +[#]: url: (https://linux.cn/article-13545-1.html) + +在 WSL 上忘记了 Linux 密码?下面是如何轻松重设的方法 +====== + +对于那些想从舒适的 Windows 中享受 Linux 命令行的人来说,WSL(Windows Subsystem for Linux) 是一个方便的工具。 + +当你 [在 Windows 上使用 WSL 安装 Linux][1] 时,会要求你创建一个用户名和密码。当你在 WSL 上启动 Linux 时,这个用户会自动登录。 + +现在的问题是,如果你有一段时间没有使用它,你可能会忘记 WSL 的账户密码。而如果你要使用 `sudo` 的命令,这将成为一个问题,因为这里你需要输入密码。 + +![][2] + +不要担心。你可以很容易地重置它。 + +### 在 Ubuntu 或任何其他 Linux 发行版上重置遗忘的 WSL 密码 + +要在 WSL 中重设 Linux 密码,你需要: + + * 将默认用户切换为 `root` + * 重置普通用户的密码 + * 将默认用户切换回普通用户 + +让我向你展示详细的步骤和截图。 + +#### 步骤 1:将默认用户切换为 root + +记下你的普通/常规用户名将是明智之举。如你所见,我的普通帐户的用户名是 `abhishek`。 + +![Note down the account username][3] + +WSL 中的 `root` 用户是无锁的,没有设置密码。这意味着你可以切换到 `root` 用户,然后利用 `root` 的能力来重置密码。 + +由于你不记得帐户密码,切换到 `root` 用户是通过改变你的 Linux WSL 应用的配置,使其默认使用 `root` 用户来完成。 + +这是通过 Windows 命令提示符完成的,你需要知道你的 Linux 发行版需要运行哪个命令。 + +这个信息通常在 [Windows 商店][4] 中的发行版应用的描述中提供。这是你首次下载发行版的地方。 + +![Know the command to run for your distribution app][5] + +从 Windows 菜单中,启动命令提示符: + +![Start Command Prompt][6] + +在这里,以这种方式使用你的发行版的命令。如果你使用的是 Windows 商店中的 Ubuntu 应用,那么该命令将是: + +``` +ubuntu config --default-user root +``` + +截图中,我正在使用 Windows 商店中的 Ubuntu 20.04 应用。所以,我使用了 ubuntu2004 命令。 + +![Set root as default user in Linux app’s configuration][7] + +为了减少你的麻烦,我在这个表格中列出了一些发行版和它们各自的命令: + +发行版应用 | Windows 命令 +---|--- +Ubuntu | `ubuntu config –default-user root` +Ubuntu 20.04 | `ubuntu2004 config –default-user root` +Ubuntu 18.04 | `ubuntu1804 config –default-user root` +Debian | `debian config –default-user root` +Kali Linux | `kali config –default-user root` + +#### 步骤 2:重设帐户密码 + +现在,如果你启动 Linux 发行程序,你应该以 `root` 身份登录。你可以重新设置普通用户帐户的密码。 + +你还记得 WSL 中的用户名吗?(LCTT 译注:请使用你的“用户名”替换下列命令中的 `username`)如果没有,你可以随时检查 `/home` 目录的内容。当你有了用户名后,使用这个命令: + +``` +passwd username +``` + +它将要求你输入一个新的密码。**当你输入时,屏幕上将不会显示任何内容。这很正常。只要输入新的密码,然后点击回车就可以了。**你必须重新输入新的密码来确认,当你输入密码时,屏幕上也不会显示任何东西。 + +![Reset the password for the regular user][8] + +恭喜你。用户账户的密码已经被重置。但你还没有完成。默认用户仍然是 `root`。你应该把它改回你的普通用户帐户,否则它将一直以 `root` 用户的身份登录。 + +#### 步骤 3:再次将普通用户设置为默认用户 + +你需要你在上一步中用 [passwd 命令][9] 使用的普通帐户用户名。 + +再次启动 Windows 命令提示符。**使用你的发行版命令**,方式与第 1 步中类似。然而,这一次,用普通用户代替 `root`。 + +``` +ubuntu config --default-user username +``` + +![Set regular user as default user][10] + +现在,当你在 WSL 中启动你的 Linux 发行版时,你将以普通用户的身份登录。你已经重新设置了密码,可以用它来运行 `sudo` 命令。 + +如果你将来再次忘记了密码,你知道重置密码的步骤。 + +### 如果重设 WSL 密码如此简单,这难道不是一种安全风险吗? + +并非如此。你需要有对计算机的物理访问权以及对 Windows 帐户的访问权。如果有人已经有这么多的访问权,他/她可以做很多事情,而不仅仅是改变 WSL 中的 Linux 密码。 + +### 你是否能够重新设置 WSL 密码? + +我给了你命令并解释了步骤。我希望这对你有帮助,并能够在 WSL 中重置你的 Linux 发行版的密码。 + +如果你仍然遇到问题,或者你对这个话题有疑问,请随时在评论区提问。 + +-------------------------------------------------------------------------------- + +via: https://itsfoss.com/reset-linux-password-wsl/ + +作者:[Abhishek Prakash][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/abhishek/ +[b]: https://github.com/lujun9972 +[1]: https://itsfoss.com/install-bash-on-windows/ +[2]: https://i0.wp.com/itsfoss.com/wp-content/uploads/2021/06/reset-wsl-password.png?resize=800%2C450&ssl=1 +[3]: https://i0.wp.com/itsfoss.com/wp-content/uploads/2021/06/username-wsl.png?resize=800%2C296&ssl=1 +[4]: https://www.microsoft.com/en-us/store/apps/windows +[5]: https://i1.wp.com/itsfoss.com/wp-content/uploads/2021/06/wsl-distro-command.png?resize=800%2C602&ssl=1 +[6]: https://i1.wp.com/itsfoss.com/wp-content/uploads/2021/06/start-cmd-windows.jpg?resize=800%2C500&ssl=1 +[7]: https://i0.wp.com/itsfoss.com/wp-content/uploads/2021/06/wsl-set-root-as-default.png?resize=800%2C288&ssl=1 +[8]: https://i0.wp.com/itsfoss.com/wp-content/uploads/2021/06/resetting-wsl-password.png?resize=800%2C366&ssl=1 +[9]: https://linuxhandbook.com/passwd-command/ +[10]: https://i1.wp.com/itsfoss.com/wp-content/uploads/2021/06/set-regular-user-as-default-wsl.png?resize=800%2C288&ssl=1 diff --git a/published/202107/20210628 How to archive files on FreeDOS.md b/published/202107/20210628 How to archive files on FreeDOS.md new file mode 100644 index 0000000000..b2acc5fec0 --- /dev/null +++ b/published/202107/20210628 How to archive files on FreeDOS.md @@ -0,0 +1,87 @@ +[#]: subject: (How to archive files on FreeDOS) +[#]: via: (https://opensource.com/article/21/6/archive-files-freedos) +[#]: author: (Jim Hall https://opensource.com/users/jim-hall) +[#]: collector: (lujun9972) +[#]: translator: (geekpi) +[#]: reviewer: (wxy) +[#]: publisher: (wxy) +[#]: url: (https://linux.cn/article-13567-1.html) + +如何在 FreeDOS 上归档文件 +====== + +> 虽然有一个 FreeDOS 版的 tar,但 DOS 上事实上的标准归档工具是 Zip 和 Unzip。 + +![](https://img.linux.net.cn/data/attachment/album/202107/10/063340wp088ozz1fo9f1e1.jpg) + +在 Linux 上,你可能熟悉标准的 Unix 归档命令:`tar`。FreeDOS 上也有 `tar` 的版本(还有其他一些流行的归档程序),但 DOS 上事实上的标准归档程序是 Zip 和 Unzip。Zip 和 Unzip 都默认安装在 FreeDOS 1.3 RC4 中。 + +Zip 文件格式最初是由 PKWARE 的 Phil Katz 在 1989 年为 PKZIP 和 PKUNZIP 这对 DOS 归档工具构思的。Katz 将 Zip 文件的规范作为一个开放标准发布,因此任何人都可以创建 Zip 档案。作为开放规范的结果,Zip 成为 DOS 上的一个标准归档格式。[Info-ZIP][2] 项目实现了一套开源的 `ZIP` 和 `UNZIP` 程序。 + +### 对文件和目录进行压缩 + +你可以在 DOS 命令行中使用 `ZIP` 来创建文件和目录的归档。这是一个方便的方法,可以为你的工作做一个备份,或者发布一个“包”,在未来的 FreeDOS 发布中使用。例如,假设我想为我的项目源码做一个备份,其中包含这些源文件: + +![dir][3] + +*我想把这些文件归档* + +`ZIP` 有大量的命令行选项来做不同的事情,但我最常使用的命令行选项是 `-r` 来处理目录和子目录 _递归_,以及使用 `-9` 来提供可能的最大压缩。`ZIP` 和 `UNZIP` 使用类似 Unix 的命令行,所以你可以在破折号后面组合选项:`-9r` 将提供最大压缩并在 Zip 文件中包括子目录。 + +![zip][5] + +*压缩一个目录树* + +在我的例子中,`ZIP` 能够将我的源文件从大约 33KB 压缩到大约 22KB,为我节省了 11KB 的宝贵磁盘空间。你可能会得到不同的压缩率,这取决于你给 `ZIP` 的选项,或者你想在 Zip 文件中存储什么文件(以及有多少)。一般来说,非常长的文本文件(如源码)会产生良好的压缩效果,而非常小的文本文件(如只有几行的 DOS “批处理”文件)通常太短,无法很好地压缩。 + +### 解压文件和目录 + +将文件保存到 Zip 文件中是很好的,但你最终会需要将这些文件解压到某个地方。让我们首先检查一下我们刚刚创建的 Zip 文件里有什么。为此,使用 `UNZIP `命令。你可以在 `UNZIP`中使用一堆不同的选项,但我发现我只使用几个常用的选项。 + +要列出一个 Zip 文件的内容,使用 `-l` (“list”) 选项。 + +![unzip -l][6] + +*用 unzip 列出归档文件的内容* + +该输出允让我看到 Zip 文件中的 14 个条目:13 个文件加上 `SRC` 目录。 + +如果我想提取整个 Zip 文件,我可以直接使用 `UNZIP` 命令并提供 Zip 文件作为命令行选项。这样就可以从我当前的工作目录开始提取 Zip 文件了。除非我正在恢复某个东西的先前版本,否则我通常不想覆盖我当前的文件。在这种情况下,我希望将 Zip 文件解压到一个新的目录。你可以用 `-d` (“destination”) 命令行选项指定目标路径。 + +![unzip -d temp][7] + +*你可以用 -d 来解压到目标路径* + +有时我想从一个 Zip 文件中提取一个文件。在这个例子中,假设我想提取一个 DOS 可执行程序 `TEST.EXE`。要提取单个文件,你要指定你想提取的 Zip 文件的完整路径。默认情况下,`UNZIP` 将使用 Zip 文件中提供的路径解压该文件。要省略路径信息,你可以添加 `-j`(“junk the path”) 选项。 + +你也可以组合选项。让我们从 Zip 文件中提取 `SRC\TEST.EXE` 程序,但省略完整路径并将其保存在 `TEMP` 目录下: + +![unzip -j][8] + +*unzip 组合选项* + +因为 Zip 文件是一个开放的标准,所以我们会今天继续看到 Zip 文件。每个 Linux 发行版都可以通过 Info-ZIP 程序支持 Zip 文件。你的 Linux 文件管理器可能也支持 Zip 文件。在 GNOME 文件管理器中,你应该可以右击一个文件夹并从下拉菜单中选择“压缩”。你可以选择创建一个包括 Zip 文件在内的新的归档文件。 + +创建和管理 Zip 文件是任何 DOS 用户的一项关键技能。你可以在 Info-ZIP 网站上了解更多关于 `ZIP` 和 `UNZIP` 的信息,或者在命令行上使用 `h`(“帮助”)选项来打印选项列表。 + +-------------------------------------------------------------------------------- + +via: https://opensource.com/article/21/6/archive-files-freedos + +作者:[Jim Hall][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/jim-hall +[b]: https://github.com/lujun9972 +[1]: https://opensource.com/sites/default/files/styles/image-full-size/public/lead-images/files_documents_organize_letter.png?itok=GTtiiabr (Filing cabinet for organization) +[2]: http://infozip.sourceforge.net/ +[3]: https://opensource.com/sites/default/files/uploads/dir.png (I'd like to archive these files) +[4]: https://creativecommons.org/licenses/by-sa/4.0/ +[5]: https://opensource.com/sites/default/files/uploads/zip-9r.png (Zipping a directory tree) +[6]: https://opensource.com/sites/default/files/uploads/unzip-l.png (Listing the archive file contents with unzip) +[7]: https://opensource.com/sites/default/files/uploads/unzip-d.png (You can unzip into a destination path with -d) +[8]: https://opensource.com/sites/default/files/uploads/unzip-j.png (Combining options with unzip) diff --git a/published/202107/20210628 How to parse Bash program configuration files.md b/published/202107/20210628 How to parse Bash program configuration files.md new file mode 100644 index 0000000000..64e4569d0f --- /dev/null +++ b/published/202107/20210628 How to parse Bash program configuration files.md @@ -0,0 +1,148 @@ +[#]: subject: (How to parse Bash program configuration files) +[#]: via: (https://opensource.com/article/21/6/bash-config) +[#]: author: (David Both https://opensource.com/users/dboth) +[#]: collector: (lujun9972) +[#]: translator: (geekpi) +[#]: reviewer: (wxy) +[#]: publisher: (wxy) +[#]: url: (https://linux.cn/article-13561-1.html) + +如何解析 Bash 程序的配置文件 +====== + +> 将配置文件与代码分离,使任何人都可以改变他们的配置,而不需要任何特殊的编程技巧。 + +![](https://img.linux.net.cn/data/attachment/album/202107/08/163606y3287i6c7dqq0223.jpg) + +将程序配置与代码分离是很重要的。它使非程序员能够改变配置而不需要修改程序的代码。如果是编译好的二进制可执行文件,这对非程序员来说是不可能的,因为它不仅需要访问源文件(我们在开源程序中会这样),而且还需要程序员的技能组合。很少有人有这种能力,而且大多数人都不想学习它。 + +对于像 Bash 这样的 shell 语言,由于 shell 脚本没有被编译成二进制格式,所以从定义上讲,源码是可以访问的。尽管有这种开放性,但对于非程序员来说,在 shell 脚本中钻研和修改它们并不是一个特别好的主意。即使是经验丰富的开发人员和系统管理员,也会意外地做出一些导致错误或更糟的改变。 + +因此,将配置项放在容易维护的文本文件中,提供了分离,并允许非程序员编辑配置,而不会有对代码进行意外修改的危险。许多开发者对用编译语言编写的程序都是这样做的,因为他们并不期望用户是开发者。由于许多相同的原因,对解释型 shell 语言这样做也是有意义的。 + +### 通常的方式 + +和其他许多语言一样, 你可以为 Bash 程序编写代码,来读取并解析 ASCII 文本的配置文件、读取变量名称并在程序代码执行时设置值。例如,一个配置文件可能看起来像这样: + +``` +var1=LinuxGeek46 +var2=Opensource.com +``` + +程序将读取文件,解析每一行,并将值设置到每个变量中。 + +### 源引 + +Bash 使用一种更简单的方法来解析和设置变量, 叫做源引sourcing。从一个可执行的 shell 程序中获取一个外部文件是一种简单的方法,可以将该文件的内容完整地引入 shell 程序中。在某种意义上,这很像编译语言的 `include` 语句,在运行时包括库文件。这样的文件可以包括任何类型的 Bash 代码,包括变量赋值。 + +(LCTT 译注:对于使用 `source` 或 `.` 命令引入另外一个文件的行为,我们首倡翻译为“源引”。) + +像往常一样,演示比解释更容易。 + +首先,创建一个 `~/bin` 目录(如果它还不存在的话),并将其作为当前工作目录(PWD)。[Linux 文件系统分层标准][2] 将 `~/bin` 定义为用户存储可执行文件的适当位置。 + +在这个目录下创建一个新文件。将其命名为 `main`,并使其可执行: + +``` +[dboth@david bin]$ touch main +[dboth@david bin]$ chmod +x main +[dboth@david bin]$ +``` + +在这个可执行文件中添加以下内容: + +``` +#!/bin/bash +Name="LinuxGeek" +echo $Name +``` + +并执行这个 Bash 程序: + +``` +[dboth@david bin]$ ./main +LinuxGeek +[dboth@david bin]$ +``` + +创建一个新的文件并命名为 `~/bin/data`。这个文件不需要是可执行的。在其中添加以下信息: + +``` +# Sourced code and variables +echo "This is the sourced code from the data file." +FirstName="David" +LastName="Both" +``` + +在 `main` 程序中增加三行,看起来像这样: + +``` +#!/bin/bash +Name="LinuxGeek" +echo $Name +source ~/bin/data +echo "First name: $FirstName" +echo "LastName: $LastName" +``` + +重新运行该程序: + +``` +[dboth@david bin]$ ./main +LinuxGeek +This is the sourced code from the data file. +First name: David +LastName: Both +[dboth@david bin]$ +``` + +关于源引还有一件非常酷的事情要知道。你可以使用一个单点(`.`)作为 `source` 命令的快捷方式。改变 `main` 文件,用 `.` 代替 `source`。 + +``` +#!/bin/bash +Name="LinuxGeek" +echo $Name +. ~/bin/data +echo "First name: $FirstName" +echo "LastName: $LastName" +``` + +并再次运行该程序。其结果应该与之前的运行完全相同。 + +### 运行 Bash + +每一台使用 Bash 的 Linux 主机(几乎所有主机都是,因为 Bash 是所有发行版的默认 shell),都包括一些优秀的、内置的源引示例。 + +每当 Bash shell 运行时,它的环境必须被配置成可以使用的样子。有五个主要文件和一个目录用于配置 Bash 环境。它们和它们的主要功能如下: + + * `/etc/profile`: 系统级的环境和启动程序 + * `/etc/bashrc`: 系统级的函数和别名 + * `/etc/profile.d/`: 包含系统级的脚本的目录,用于配置各种命令行工具,如 `vim` 和 `mc` 以及系统管理员创建的任何自定义配置脚本 + * `~/.bash_profile`: 用户特定的环境和启动程序 + * `~/.bashrc`: 用户特定的别名和函数 + * `~/.bash_logout`: 用户特定的命令,在用户注销时执行 + +试着通过这些文件追踪执行顺序,确定它在非登录 Bash 初始化和登录 Bash 初始化中使用的顺序。我在我的 Linux 培训系列《[使用和管理 Linux:从零到系统管理员][3]》的第一卷第 17 章中这样做过。 + +给你一个提示。这一切都从 `~/.bashrc` 脚本开始。 + +### 总结 + +这篇文章探讨了在 Bash 程序中引用代码和变量的方法。这种从配置文件中解析变量的方法是快速、简单和灵活的。它提供了一种将 Bash 代码与变量赋值分开的方法,以使非程序员能够设置这些变量的值。 + +-------------------------------------------------------------------------------- + +via: https://opensource.com/article/21/6/bash-config + +作者:[David Both][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/dboth +[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]: http://refspecs.linuxfoundation.org/fhs.shtml +[3]: http://www.both.org/?page_id=1183 diff --git a/published/202107/20210628 Query your Linux operating system like a database.md b/published/202107/20210628 Query your Linux operating system like a database.md new file mode 100644 index 0000000000..d587e4f86c --- /dev/null +++ b/published/202107/20210628 Query your Linux operating system like a database.md @@ -0,0 +1,321 @@ +[#]: subject: (Query your Linux operating system like a database) +[#]: via: (https://opensource.com/article/21/6/osquery-linux) +[#]: author: (Gaurav Kamathe https://opensource.com/users/gkamathe) +[#]: collector: (lujun9972) +[#]: translator: (YungeG) +[#]: reviewer: (wxy) +[#]: publisher: (wxy) +[#]: url: (https://linux.cn/article-13578-1.html) + +像查询数据库一样查询你的 Linux 操作系统信息 +====== + +> 使用数据库查询操作轻松获取系统信息。 + +![](https://img.linux.net.cn/data/attachment/album/202107/14/095820zywm2m2tzz5otfh5.jpg) + +Linux 提供了很多帮助用户收集主机操作系统信息的命令:列出文件或者目录的属性信息;查询安装的软件包、正在执行的命令、开机时启动的服务;或者了解系统的硬件。 + +每个命令使用自己的输出格式列出系统的信息。你需要使用 `grep`、`sed`、`awk` 这样的工具过滤命令输出的结果,以便找到特定的信息。此外,很多这样的信息会频繁变动,导致系统状态的改变。 + +将所有的信息格式化为一个数据库的 SQL 查询的输出进行查看将会十分有益。想象一下,你能够像查询具有类似名称的 SQL 数据库表一样查询 `ps` 和 `rpm` 命令的输出。 + +幸运的是,有一个工具刚好实现了这个功能,而且功能更多:[Osquery][2] 是一个 [开源的][3] “由 SQL 驱动的操作系统仪表、监控和分析框架”。 + +许多处理安全、DevOps、合规性的应用,以及仓储管理管理(仅举几例)在内部依赖 Osquery 提供的核心功能。 + +### 安装 Osquery + +Osquery 适用于 Linux、macOS、Windows、FreeBSD。请按照 [指南][4] 为你的操作系统安装最新版本。(我会在下面的例子中使用 4.7.0 版本。) + +安装完成后,确保 Osquery 可以工作: + +``` +$ rpm -qa | grep osquery +osquery-4.7.0-1.linux.x86_64 +$ +$ osqueryi --version +osqueryi version 4.7.0 +$ +``` + +### Osquery 组件 + +Osquery 有两个主要组件: + +* `osqueri` 是一个交互式的 SQL 查询控制台,可以独立运行,不需要超级用户权限(除非要查询的表格需要访问权限)。 +* `osqueryd` 像一个安装在主机的监控守护进程,可以定期调度查询操作执行,从底层架构收集信息。 + +可以在不运行 `osqueryd` 的情况下执行 `osqueri`。另一个工具,`osqueryctl`,控制守护进程的启动、停止,并检查其状态。 + +``` +$ rpm -ql osquery-4.8.0-1.linux.x86_64 | grep bin +/usr/bin/osqueryctl +/usr/bin/osqueryd +/usr/bin/osqueryi +$ +``` + +### 使用 osqueryi 交互式命令提示符 + +你和 Osquery 的交互与使用 SQL 数据库十分相似。事实上,`osqueryi` 是 SQList shell 的一个修改版。执行 `osqueryi` 命令进入交互式命令提示符 ,就可以执行 Osquery 的命令,通常以 `.` 开始: + +``` +$ osqueryi +Using a virtual database. Need help, type '.help' +osquery> +``` + +要退出交互式命令提示符,执行 `.quit` 命令回到操作系统的命令提示符: + +``` +osquery> +osquery> .quit +$ +``` + +### 找出可用的表 + +如前所述,Osquery 像 SQL 查询一样输出数据,数据库中的信息通常保存在表中。但是如何在不知道表名的情况下查询这些表呢?你可以运行 `.tables` 命令列出所有可以查询的表。如果你是一个 Linux 长期用户或者一个系统管理员 ,就会对表名十分熟悉,因为你一直在使用操作系统命令获取同样的信息: + +``` +osquery> .tables + => acpi_tables + => apparmor_events + => apparmor_profiles + => apt_sources + +<<裁剪>> + + => arp_cache + => user_ssh_keys + => users + => yara + => yara_events + => ycloud_instance_metadata + => yum_sources +osquery> +``` + +### 检查各个表的模式 + +知道表名后,可以查看每个表提供的信息。既然 `ps` 命令经常用于获取进程信息,就以 `processes` 为例。执行 `.schema` 命令加上表名查看表中保存的信息。如果要验证命令返回的结果,可以快速执行 `ps -ef` 或 `ps aux`,对比命令的输出和表中的内容: + +``` +osquery> .schema processes +CREATE TABLE processes(`pid` BIGINT, `name` TEXT, `path` TEXT, `cmdline` TEXT, `state` TEXT, `cwd` TEXT, `root` TEXT, `uid` BIGINT, `gid` BIGINT, `euid` BIGINT, `egid` BIGINT, `suid` BIGINT, `sgid` BIGINT, `on_disk` INTEGER, `wired_size` BIGINT, `resident_size` BIGINT, `total_size` BIGINT, `user_time` BIGINT, `system_time` BIGINT, `disk_bytes_read` BIGINT, `disk_bytes_written` BIGINT, `start_time` BIGINT, `parent` BIGINT, `pgroup` BIGINT, `threads` INTEGER, `nice` INTEGER, `is_elevated_token` INTEGER HIDDEN, `elapsed_time` BIGINT HIDDEN, `handle_count` BIGINT HIDDEN, `percent_processor_time` BIGINT HIDDEN, `upid` BIGINT HIDDEN, `uppid` BIGINT HIDDEN, `cpu_type` INTEGER HIDDEN, `cpu_subtype` INTEGER HIDDEN, `phys_footprint` BIGINT HIDDEN, PRIMARY KEY (`pid`)) WITHOUT ROWID; +osquery> +``` + +要进一步确认,可以使用下面的命令查看 RPM 包的结构信息,然后与操作系统命令 `rpm -qa` 和 `rpm -qi` 的输出比较: + +``` +osquery> +osquery> .schema rpm_packages +CREATE TABLE rpm_packages(`name` TEXT, `version` TEXT, `release` TEXT, `source` TEXT, `size` BIGINT, `sha1` TEXT, `arch` TEXT, `epoch` INTEGER, `install_time` INTEGER, `vendor` TEXT, `package_group` TEXT, `pid_with_namespace` INTEGER HIDDEN, `mount_namespace_id` TEXT HIDDEN, PRIMARY KEY (`name`, `version`, `release`, `arch`, `epoch`, `pid_with_namespace`)) WITHOUT ROWID; +osquery> +``` + +从 Osquery 的 [表格文档][5] 获取更多信息。 + +### 使用 PRAGMA 命令 + +或许模式信息对你来说太难看懂,还有另一种途径能够以详细的表格格式打印表中的信息:`PRAGMA` 命令。例如,我想通过 `PRAGMA` 用一种易于理解的格式查看 `rpm_packages` 表的信息: + +``` +osquery> PRAGMA table_info(rpm_packages); +``` + +这种表格式信息的一个好处是你可以关注想要查询的字段,查看命令提供的类型信息: + +``` +osquery> PRAGMA table_info(users); ++-----+-------------+--------+---------+------------+----+ +| cid | name | type | notnull | dflt_value | pk | ++-----+-------------+--------+---------+------------+----+ +| 0 | uid | BIGINT | 1 | | 1 | +| 1 | gid | BIGINT | 0 | | 0 | +| 2 | uid_signed | BIGINT | 0 | | 0 | +| 3 | gid_signed | BIGINT | 0 | | 0 | +| 4 | username | TEXT | 1 | | 2 | +| 5 | description | TEXT | 0 | | 0 | +| 6 | directory | TEXT | 0 | | 0 | +| 7 | shell | TEXT | 0 | | 0 | +| 8 | uuid | TEXT | 1 | | 3 | ++-----+-------------+--------+---------+------------+----+ +osquery> +``` + +### 进行你的第一次查询 + +在你从表、模式、条目中获取到所有进行查询所需要的信息后,进行你的第一次 SQL 查询查看其中的信息。下面的查询返回系统中的用户和每个用户的用户 ID、组 ID、主目录和默认的命令行解释器。Linux 用户通过查看 `/etc/passwd` 文件的内容并执行 `grep`、`sed`、`awk` 命令获取同样的信息。 + +``` +osquery> +osquery> select uid,gid,directory,shell,uuid FROM users LIMIT 7; ++-----+-----+----------------+----------------+------+ +| uid | gid | directory | shell | uuid | ++-----+-----+----------------+----------------+------+ +| 0 | 0 | /root | /bin/bash | | +| 1 | 1 | /bin | /sbin/nologin | | +| 2 | 2 | /sbin | /sbin/nologin | | +| 3 | 4 | /var/adm | /sbin/nologin | | +| 4 | 7 | /var/spool/lpd | /sbin/nologin | | +| 5 | 0 | /sbin | /bin/sync | | +| 6 | 0 | /sbin | /sbin/shutdown | | ++-----+-----+----------------+----------------+------+ +osquery> +``` + +### 不进入交互模式的查询 + +如果你想要在不进入 `osqueri` 交互模式的情况下进行查询,该怎么办?要用查询操作写命令行解释器脚本,这种方式可能十分有用。这种情况下,可以直接从 Bash 解释器 `echo` SQL 查询,通过管道输出到 `osqueri` : + +``` +$ echo "select uid,gid,directory,shell,uuid FROM users LIMIT 7;" | osqueryi ++-----+-----+----------------+----------------+------+ +| uid | gid | directory | shell | uuid | ++-----+-----+----------------+----------------+------+ +| 0 | 0 | /root | /bin/bash | | +| 1 | 1 | /bin | /sbin/nologin | | +| 2 | 2 | /sbin | /sbin/nologin | | +| 3 | 4 | /var/adm | /sbin/nologin | | +| 4 | 7 | /var/spool/lpd | /sbin/nologin | | +| 5 | 0 | /sbin | /bin/sync | | +| 6 | 0 | /sbin | /sbin/shutdown | | ++-----+-----+----------------+----------------+------+ +$ +``` + +### 获悉系统启动时开始的服务 + +Osquery 还可以列出系统启动时开始的所有服务。例如,可以查询 `startup_items` 表获取启动时开始的前五项服务的名称、状态和路径: + +``` +osquery> SELECT name,type,status,path FROM startup_items LIMIT 5; + name = README + type = Startup Item +status = enabled + path = /etc/rc.d/init.d/README + + name = anamon + type = Startup Item +status = enabled + path = /etc/rc.d/init.d/anamon + + name = functions + type = Startup Item +status = enabled + path = /etc/rc.d/init.d/functions + + name = osqueryd + type = Startup Item +status = enabled + path = /etc/rc.d/init.d/osqueryd + + name = AT-SPI D-Bus Bus + type = Startup Item +status = enabled + path = /usr/libexec/at-spi-bus-launcher --launch-immediately +osquery> +``` + +### 查阅二进制文件的 ELF 信息 + +假如你想要弄清 `ls` 二进制文件的更多细节,通常会通过 `readelf -h` 命令,加上 `ls` 命令的路径。查询 Osquery 的 `elf_info` 表你可以得到同样的信息: + +``` +osquery> SELECT * FROM elf_info WHERE path="/bin/ls"; + class = 64 + abi = sysv +abi_version = 0 + type = dyn + machine = 62 + version = 1 + entry = 24064 + flags = 0 + path = /bin/ls +osquery> +``` + +现在你应该初步了解如何使用 `osqueri` 查询自己想要的信息。然而,这些信息保存在数量巨大的表中;我查询过的一个系统中,有 156 个不同的表,这个数字可能是十分惊人的: + +``` +$ echo ".tables" | osqueryi | wc -l +156 +$ +``` + +要让事情变得更容易,可以从这些表开始获取你的 Linux 系统的信息: + +**系统信息表:** + +``` +osquery> select * from system_info; +``` + +**系统限制信息:** + +``` +osquery> select * from ulimit_info; +``` + +**由各种进程打开的文件:** + +``` +osquery> select * from process_open_files; +``` + +**系统上开放的端口:** + +``` +osquery> select * from listening_ports; +``` + +**运行中的进程信息:** + +``` +osquery> select * from processes; +``` + +**已安装的包信息:** + +``` +osquery> select * from rpm_packages; +``` + +**用户登录信息:** + +``` +osquery> select * from last; +``` + +**系统日志信息:** + +``` +osquery> select * from syslog_events; +``` + +### 了解更多 + +Osquery 是一个强大的工具,提供了许多可以用于解决各种使用案例的主机信息。你可以阅读 [文档][6] 了解更多 Osquery 的信息。 + +-------------------------------------------------------------------------------- + +via: https://opensource.com/article/21/6/osquery-linux + +作者:[Gaurav Kamathe][a] +选题:[lujun9972][b] +译者:[YungeG](https://github.com/YungeG) +校对:[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/find-file-linux-code_magnifying_glass_zero.png?itok=E2HoPDg0 (Magnifying glass on code) +[2]: https://osquery.io/ +[3]: https://github.com/osquery/osquery +[4]: https://osquery.io/downloads/official +[5]: https://osquery.io/schema/4.8.0/ +[6]: https://osquery.readthedocs.io/en/latest/ diff --git a/published/202107/20210629 A brief history of FreeDOS.md b/published/202107/20210629 A brief history of FreeDOS.md new file mode 100644 index 0000000000..5601e5c66c --- /dev/null +++ b/published/202107/20210629 A brief history of FreeDOS.md @@ -0,0 +1,108 @@ +[#]: subject: (A brief history of FreeDOS) +[#]: via: (https://opensource.com/article/21/6/history-freedos) +[#]: author: (Jim Hall https://opensource.com/users/jim-hall) +[#]: collector: (lujun9972) +[#]: translator: (zxy-wyx) +[#]: reviewer: (wxy) +[#]: publisher: (wxy) +[#]: url: (https://linux.cn/article-13601-1.html) + +FreeDOS 简史 +====== + +> 经历了近 30 年的发展, FreeDOS 已经成为了世界先进的 DOS。 + +![](https://img.linux.net.cn/data/attachment/album/202107/21/104903zzxiyc4i4gkpxiph.jpg) + +> 一个大师正在给他的一个弟子讲 [编程之道][2]。 “编程之道包含在所有的软件中 —— 不管它多么微不足道,” 大师说道。 +> +> “编程之道在手持计算器里面吗?” 弟子问道。 +> +> “是的,” 大师回答道。 +> +> “编程之道在电子游戏里面吗?” 弟子继续问道。 +> +> “即便是电子游戏中,” 大师说。 +> +> “那编程之道在个人电脑的 DOS 里面吗?” +> +> 大师咳嗽了一下,稍稍改变了一下姿势,说道,“今天的课就到这里吧。” +> +> ——《编程之道》,Geoffrey James,InfoBooks,1987 + +过去,计算仅限于昂贵的大型机和“大铁疙瘩”计算机系统,如 PDP 11。但是微处理器的出现在 20 世纪 70 年代带来了一场计算革命。你终于可以在家里有一台电脑了——“个人电脑”时代已经到了! + +我记得看到的最早的个人电脑包括 Commodore、TRS-80 和 Apple。个人电脑成了一个热门话题,所以 IBM 决定进入这个市场。在经历了一个快速开发周期之后,IBM 于 1981 年 8 月发布了 IBM 5150 个人电脑(最初的“IBM PC”)。 + +从零开始创建一台计算机并非易事,因此 IBM 以用“现成”的硬件来构建 PC 而闻名,并从外部开发商那里获得了其他组件的授权。其中之一是微软授权的操作系统。反过来,微软从西雅图计算机产品公司获得了 86-DOS ,进行了各种更新,并将新版本作为 IBM PC-DOS 与 IBM PC 一起首次亮相。 + +### 早期的 DOS + +运行在最多只有 640 千字节内存中的 DOS,除了管理硬件和允许用户启动应用程序之外,真的做不了什么。因此,PC-DOS 1.0 命令行非常贫乏,只包含了一些设置日期和时间、管理文件、控制终端和格式化软盘的命令。DOS 还包括一个 BASIC 语言解释器,这是那个时代所有个人计算机的一个标准功能。 + +直到 PC-DOS 2.0,DOS 才变得更加有趣,为命令行添加了新的命令,并包含了其他有用的工具。但对我来说,直到 1991 年的 MS-DOS 5.0 才有了“现代感”。微软在这个版本中对 DOS 进行了大修,更新了许多命令,并用一个新的全屏编辑器取代了老旧的 Edlin 编辑器,使之更方便用户使用。DOS 5 还包括我喜欢的其他特性,比如基于微软 QuickBASIC 编译器的新 BASIC 解释器,简称 QBASIC. 如果你曾经在 DOS 上玩过 Gorillas 游戏,那可能就是在 MS-DOS 5.0 中运行的。 + +尽管进行了这些升级,但我对 DOS 命令行并不完全满意。DOS 从来没有偏离原来的设计,有其局限性。DOS 为用户提供了一些工具,可以从命令行执行一些事情 —— 否则,你就得使用 DOS 命令行来启动应用程序。微软认为用户大部分时间都会花在几个关键的应用程序上,比如文字处理器或电子表格。 + +但是开发人员想要一个功能更强的 DOS,此时一个细分行业正在萌芽,以提供小巧优雅的工具和程序。有些是全屏应用程序,但也有许多是增强 DOS 命令环境的命令行实用程序。当我学会一点 C 语言编程时,我开始编写自己的实用程序,扩展或替换 DOS 命令行。尽管 MS-DOS 的基础相当有限,但我发现第三方实用程序加上我自己的工具创建了一个功能强大的 DOS 命令行。 + +### FreeDOS + +1994 年初,我开始在科技杂志上看到很多对微软高管的采访,他们说下一个版本的 Windows 将完全取代 DOS。我以前使用过 Windows,但如果你还记得那个时代,你就知道 Windows 3.1 并不是一个很好的平台。Windows 3.1 很笨重,有很多毛病,如果一个应用程序崩溃,它可能会使整个 Windows 系统瘫痪。我也不喜欢 Windows 的图形用户界面。我更喜欢在命令行做我的工作,而不是用鼠标。 + +我考虑过 Windows,并决定,“如果 Windows 3.2 或 Windows 4.0 会像 Windows 3.1 一样,我就不会去使用它。” 但我有什么选择?此时,我已经尝试过 Linux,并认为 [Linux 很棒][3],但是 Linux 没有任何应用程序。我的文字处理器、电子表格和其他程序都在 DOS 上。我需要 DOS。 + +然后我有了个主意!我想,“如果开发人员能够在互联网上共同编写一个完整的 Unix 操作系统,那么我们当然可以对 DOS 做同样的事情。”毕竟,与 Unix 相比,DOS 是一个相当简单的操作系统。DOS 一次运行一个任务(单任务),并且有一个更简单的内存模型。编写我们自己的 DOS 应该不难。 + +因此,在 1994 年 6 月 29 日,我在一个名为 Usenet 的留言板网络上向 “comp.os.msdos.apps” [发布了一个公告][4]: + +> PD-DOS 项目公告: +> +> 几个月前,我发表了关于启动公共领域版本的 DOS 的文章。 当时大家对此的普遍支持,许多人都同意这样的说法:“开始编写吧!”所以,我就…… +> +> 宣布首次生产 PD-DOS 的努力。我已经写了一个“清单”,描述了这样一个项目的目标和工作大纲,以及一个“任务列表”,它准确地显示了需要编写什么。我会把这些贴在这里,供大家讨论。 + +\* 关于这个名字的说明 —— 我希望这个新的 DOS 成为每个人都可以使用的东西,我天真地认为,当每个人都可以使用它时,它就是“公共领域”。我很快就意识到了这种差别,所以我们把 “PD-DOS” 改名为 “Free-DOS”,然后去掉连字符变成 “FreeDOS”。 + +一些开发人员联系我,提供他们为替换或增强 DOS 命令行而创建的实用程序,类似于我自己的努力。就在项目宣布几个月后,我们汇集了我们的实用程序,并创建了一个实用的系统,我们在 1994 年 9 月发布了一个 “Alpha 1” 版本。在那些日子里,发展是相当迅速的,我们在 1994 年 12 月发布了 “Alpha 2”,1995 年 1 月发布了 “Alpha 3”,1995 年 6 月发布了“Alpha 4”。 + +### 一个现代的 DOS + +从那以后,我们一直致力于使 FreeDOS 成为 “现代” DOS。而这种现代化大部分都集中在创建一个丰富的命令行环境上。是的,DOS 仍然需要支持应用程序,但是我们相信 FreeDOS 也需要一个强大的命令行环境。这就是为什么 FreeDOS 包含了许多有用的工具,包括浏览目录、管理文件、播放音乐、连接网络的命令,……以及类似 Unix 的实用程序集合,如 `less`、`du`、`head`、`tail`、`sed` 和 `tr`。 + +虽然 FreeDOS 的开发已经放缓,但它并没有停止。开发人员继续为 FreeDOS 编写新程序,并向 FreeDOS 添加新功能。我对 FreeDOS 1.3 RC4 的几个重要补充感到特别兴奋,FreeDOS 1.3 RC4 是即将发布的 FreeDOS 1.3 的最新候选版本。最近的一些更新如下: + + * Mateusz Viste 创建了一个新的电子书阅读器,名为 Ancient Machine Book(AMB),我们利用它作为 FreeDOS 1.3 RC4 中的新帮助系统。 + * Rask Ingemann Lambertsen、Andrew Jenner、TK Chia 和其他人正在更新 GCC 的 IA-16 版本,包括一个新的libi86 库,它提供了与 Borland TurboC++ 编译器的 C 库的某种程度的兼容性。 + * Jason Hood 更新了一个可卸载的 CD-ROM 重定向器,以替代微软的 MSCDEX,最多支持 10 个驱动器。 + * SuperIlu 创建了 DOjS,这是一个 Javascript 开发画布,具有集成的编辑器、图形和声音输出,以及鼠标、键盘和操纵杆输入。 + * Japheth 创建了一个 DOS32PAE 扩展程序,它能够通过 PAE 分页使用大量的内存。 + +尽管 FreeDOS 有了新的发展,我们仍然忠于我们的 DOS 根基。在我们继续朝着 FreeDOS 1.3 “最终”版本努力时,我们带着几个核心假设,包括: + + * **兼容性是关键** —— 如果 FreeDOS 不能运行经典 DOS 应用程序,它就不是真正的 “DOS”。虽然我们提供了许多优秀的开源工具、应用程序和游戏,但你也可以运行你的传统的 DOS 应用程序。 + * **继续在旧 PC 上运行(XT、286、386 等)** —— FreeDOS 1.3 将保持 16 位英特尔架构,但在可能的情况下将支持扩展驱动程序支持的新硬件。为此,我们继续专注于单用户命令行环境。 + * **FreeDOS 是开源软件** —— 我一直说,如果人们不能访问、学习和修改源代码,FreeDOS 就不是“自由的 DOS”。FreeDOS 1.3 将包括尽可能多地包括使用公认的开源许可证的软件。但 DOS 实际上早于 GNU 通用公共许可证(1989)和开放源码定义(1998),因此一些 DOS 软件可能会使用它自己的“免费源代码”许可证,而不是标准的“开源”许可。当我们考虑将软件包纳入 FreeDOS 时,我们将继续评估任何许可证,以确保它们是合适的“开放源码”,即使它们没有得到正式承认。 + +我们欢迎你的帮助,使 FreeDOS 强大!请加入我们的电子邮件列表,我们欢迎所有新来者和贡献者。我们通过电子邮件列表进行交流,不过这个列表的信件量非常小,所以不太可能撑爆你的收件箱。 + +访问 FreeDOS 网站 [www.freedos.org][5]。 + +-------------------------------------------------------------------------------- + +via: https://opensource.com/article/21/6/history-freedos + +作者:[Jim Hall][a] +选题:[lujun9972][b] +译者:[zxy-wyx](https://github.com/zxy-wyx) +校对:[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/1980s-computer-yearbook.png?itok=eGOYEKK- (Person typing on a 1980's computer) +[2]: https://www.mit.edu/~xela/tao.html +[3]: https://opensource.com/article/17/5/how-i-got-started-linux-jim-hall-freedos +[4]: https://groups.google.com/g/comp.os.msdos.apps/c/oQmT4ETcSzU/m/O1HR8PE2u-EJ +[5]: https://www.freedos.org/ diff --git a/published/202107/20210629 Fotoxx- An Open Source App for Managing and Editing Large Photo Collection.md b/published/202107/20210629 Fotoxx- An Open Source App for Managing and Editing Large Photo Collection.md new file mode 100644 index 0000000000..c9cc852a72 --- /dev/null +++ b/published/202107/20210629 Fotoxx- An Open Source App for Managing and Editing Large Photo Collection.md @@ -0,0 +1,84 @@ +[#]: subject: (Fotoxx: An Open Source App for Managing and Editing Large Photo Collection) +[#]: via: (https://itsfoss.com/fotoxx/) +[#]: author: (Abhishek Prakash https://itsfoss.com/author/abhishek/) +[#]: collector: (lujun9972) +[#]: translator: (geekpi) +[#]: reviewer: (wxy) +[#]: publisher: (wxy) +[#]: url: (https://linux.cn/article-13559-1.html) + +Fotoxx:用于管理和编辑大型照片集合的开源应用 +====== + +![](https://img.linux.net.cn/data/attachment/album/202107/07/131024ej2kzv824zqb4zz8.jpg) + +说到 [Linux 中的照片管理软件][1],Shotwell 可能是其中最有名的。难怪它在许多发行版中都预装了。 + +但是,如果你正在寻找一个类似 Shotwell 而速度更快的应用,Fotoxx 可能是一个不错的选择。 + +它可能没有一个现代的用户界面,但它在处理大量照片集合时速度很快。这一点很重要,因为索引和显示成千上万张照片的缩略图可能需要相当多的时间和计算资源。 + +### 用 Fotoxx 在 Linux 中管理照片并编辑它们 + +![Fotoxx interface][2] + +正如你在上面的截图中看到的,它没有漂亮的界面。看起来更像是一个 2010 年左右的应用。它在视觉上的不足,在功能和性能上得到了弥补。 + +你可以导入大量的照片,包括 RAW 图像。这些图片保持原样。它们不会被复制或移动。它们只是在应用中被索引。 + +你可以编辑图像元数据,如标签、地理标签、日期、评级、标题等。你可以根据这些元数据来搜索图片。 + +它还有一个地图功能,可以分组并显示属于某个地点的图片(基于图片上的地理标签数据)。 + +![Map view][3] + +由于它专注于管理大型照片集合,有几个批处理功能,可以重命名、调整大小、复制/移动、转换图像格式和编辑元数据。 + +你可以选择图片来创建相册和幻灯片,所有这些都是在去重图片的情况下进行的。照片可以组合成 360 度的全景图。 + +Fotoxx 还有几个编辑功能,可以用来修饰图片,添加效果(如素描、绘画)、修剪、旋转等。 + +还有一些选项可以去除旧的、扫描照片打印件上的红眼和尘斑。 + +我可以继续列举功能清单,但这太长了。它的网站描述了它的[全部功能][4],你应该去看看。 + +### 在 Linux 上安装 Fotoxx + +请记住,**Fotoxx 的开发者建议使用一台强大的计算机**,有 4 个以上的 CPU 核心,16GB 以上的内存,以便正常运行。较小的计算机可能会很慢,或可能无法编辑大型图像。 + +Fotoxx 在大多数 Linux 发行版中都有,如 Debian、Ubuntu、Fedora 和 Arch Linux。只需使用你的发行版的包管理器或软件中心来搜索 Fotoxx 并安装它。 + +在基于 Ubuntu 和 Debian 的发行版上,你可以使用 apt 命令来安装它,像这样: + +``` +sudo apt install fotoxx +``` + +当你第一次运行它时,它会要求搜索主目录中的图像。你可以继续使用它,或者将搜索位置限制在选定的文件夹。 + +![][6] + +我注意到,尽管在一分钟左右的时间内索引了 4700 多张,但它并没有立即开始显示图片。我不得不**点击 Gallery->All Folders,然后选择文件夹,然后它就显示了图片**。所以,这一点要记住。 + +Fotoxx 是一个功能广泛的工具,你需要一些时间来适应它并探索它的[所有功能][4]。它的网站列出了几个例子,你应该看看。 + +正如我前面所说,它不是最漂亮的应用,但它大量的功能列表可以完成任务。如果你是一个摄影师或有大量的图片收藏,你可以试试 Fotoxx,看看它是否符合你的需要。当你试过后,请在评论区分享你的经验。 + +-------------------------------------------------------------------------------- + +via: https://itsfoss.com/fotoxx/ + +作者:[Abhishek Prakash][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/abhishek/ +[b]: https://github.com/lujun9972 +[1]: https://itsfoss.com/linux-photo-management-software/ +[2]: https://i2.wp.com/itsfoss.com/wp-content/uploads/2021/06/fotoxx-interface.jpg?resize=800%2C561&ssl=1 +[3]: https://i1.wp.com/itsfoss.com/wp-content/uploads/2021/06/fotoxx-geotag-map-view.jpg?resize=800%2C466&ssl=1 +[4]: https://kornelix.net/fotoxx/fotoxx.html +[6]: https://i0.wp.com/itsfoss.com/wp-content/uploads/2021/06/fotoxx-indexing.png?resize=800%2C617&ssl=1 diff --git a/published/202107/20210630 Parse JSON configuration files with Groovy.md b/published/202107/20210630 Parse JSON configuration files with Groovy.md new file mode 100644 index 0000000000..8ba9dc0556 --- /dev/null +++ b/published/202107/20210630 Parse JSON configuration files with Groovy.md @@ -0,0 +1,292 @@ +[#]: subject: (Parse JSON configuration files with Groovy) +[#]: via: (https://opensource.com/article/21/6/groovy-parse-json) +[#]: author: (Chris Hermansen https://opensource.com/users/clhermansen) +[#]: collector: (lujun9972) +[#]: translator: (geekpi) +[#]: reviewer: (wxy) +[#]: publisher: (wxy) +[#]: url: (https://linux.cn/article-13576-1.html) + +用 Groovy 解析 JSON 配置文件 +====== + +> 抛开关于是否使用 JSON 作为配置格式的争论,只需学习如何用 Groovy 来解析它。 + +![](https://img.linux.net.cn/data/attachment/album/202107/12/232406vpp4qrv6ee5a3erz.jpg) + +应用程序通常包括某种类型的默认或“开箱即用”的状态或配置,以及某种让用户根据自己的需要定制配置的方式。 + +例如,[LibreOffice Writer][2] 通过其菜单栏上的**工具 > 选项**,可以访问诸如用户数据、字体、语言设置等(以及更多的)设置。一些应用程序(如 LibreOffice)提供了一个点选式的用户界面来管理这些设置。有些,像 [Tracker][3](GNOME 的“任务”,用于索引文件)使用 XML 文件。还有一些,特别是基于 JavaScript 的应用,使用 JSON,尽管它有许多人抗议(例如,[这位作者][4] 和 [这位其他作者][5])。 + +在这篇文章中,我将回避关于是否使用 JSON 作为配置文件格式的争论,并解释如何使用 [Groovy 编程语言][6] 来解析这类信息。Groovy 以 Java 为基础,但有一套不同的设计重点,使 Groovy 感觉更像 Python。 + +### 安装 Groovy + +由于 Groovy 是基于 Java 的,它也需要安装 Java。你可能会在你的 Linux 发行版的软件库中找到最近的、合适的 Java 和 Groovy 版本。或者,你可以按照其网站上的 [说明][7] 安装 Groovy。 Linux 用户的一个不错的选择是 [SDKMan][8],你可以使用它来获取 Java、Groovy 和许多其他相关工具的多个版本。 对于本文,我将使用我的发行版的 OpenJDK11 和 SDKMan 的 Groovy 3.0.7。 + +### 演示的 JSON 配置文件 + +在这个演示中,我从 [Drupal][9] 中截取了这个 JSON 文件,它是 Drupal CMS 使用的主要配置文件,并将其保存在文件 `config.json` 中: + +``` +{ + "vm": { + "ip": "192.168.44.44", + "memory": "1024", + "synced_folders": [ + { + "host_path": "data/", + "guest_path": "/var/www", + "type": "default" + } + ], + "forwarded_ports": [] + }, + "vdd": { + "sites": { + "drupal8": { + "account_name": "root", + "account_pass": "root", + "account_mail": "box@example.com", + "site_name": "Drupal 8", + "site_mail": "box@example.com", + "vhost": { + "document_root": "drupal8", + "url": "drupal8.dev", + "alias": ["www.drupal8.dev"] + } + }, + "drupal7": { + "account_name": "root", + "account_pass": "root", + "account_mail": "box@example.com", + "site_name": "Drupal 7", + "site_mail": "box@example.com", + "vhost": { + "document_root": "drupal7", + "url": "drupal7.dev", + "alias": ["www.drupal7.dev"] + } + } + } + } +} +``` + +这是一个漂亮的、复杂的 JSON 文件,有几层结构,如: + +``` +<>.vdd.sites.drupal8.account_name +``` + +和一些列表,如: + +``` +<>.vm.synced_folders +``` + +这里,`<>` 代表未命名的顶层。让我们看看 Groovy 是如何处理的。 + +### 用 Groovy 解析 JSON + +Groovy 自带的 `groovy.json` 包,里面有各种很酷的东西。其中最好的部分是 `JsonSlurper` 类,它包括几个 `parse()` 方法,可以将 JSON 转换为 Groovy 的 `Map`,一种根据键值存储的数据结构。 + +下面是一个简短的 Groovy 程序,名为 `config1.groovy`,它创建了一个 `JsonSlurper` 实例,然后调用其中的 `parse()` 方法来解析文件中的 JSON,并将其转换名为 `config` 的 `Map` 实例,最后将该 map 输出: + + +``` +import groovy.json.JsonSlurper + +def jsonSlurper = new JsonSlurper() + +def config = jsonSlurper.parse(new File('config.json')) + +println "config = $config" +``` + +在终端的命令行上运行这个程序: + +``` +$ groovy config1.groovy +config = [vm:[ip:192.168.44.44, memory:1024, synced_folders:[[host_path:data/, guest_path:/var/www, type:default]], forwarded_ports:[]], vdd:[sites:[drupal8:[account_name:root, account_pass:root, account_mail:box@example.com, site_name:Drupal 8, site_mail:box@example.com, vhost:[document_root:drupal8, url:drupal8.dev, alias:[www.drupal8.dev]]], drupal7:[account_name:root, account_pass:root, account_mail:box@example.com, site_name:Drupal 7, site_mail:box@example.com, vhost:[document_root:drupal7, url:drupal7.dev, alias:[www.drupal7.dev]]]]]] +$ +``` + +输出显示了一个有两个键的顶层映射:`vm` 和 `vdd`。每个键都引用了它自己的值的映射。注意 `forwarded_ports` 键所引用的空列表。 + +这很容易,但它所做的只是把东西打印出来。你是如何获得各种组件的呢?下面是另一个程序,显示如何访问存储在 `config.vm.ip` 的值: + +``` +import groovy.json.JsonSlurper + +def jsonSlurper = new JsonSlurper() + +def config = jsonSlurper.parse(new File('config.json')) + +println "config.vm.ip = ${config.vm.ip}" +``` + +运行它: + +``` +$ groovy config2.groovy +config.vm.ip = 192.168.44.44 +$ +``` + +是的,这也很容易。 这利用了 Groovy 速记,这意味着: + +``` +config.vm.ip +``` + +在 Groovy 中等同于: + +``` +config['vm']['ip'] +``` + +当 `config` 和 `config.vm` 都是 `Map` 的实例,并且都等同于在 Java 中的: + +``` +config.get("vm").get("ip") +``` + +仅仅是处理 JSON 就这么多了。如果你想有一个标准的配置并让用户覆盖它呢?在这种情况下,你可能想在程序中硬编码一个 JSON 配置,然后读取用户配置并覆盖任何标准配置的设置。 + +假设上面的配置是标准的,而用户只想覆盖其中的一点,只想覆盖 `vm` 结构中的 `ip` 和 `memory` 值,并把它放在 `userConfig.json` 文件中: + +``` +{ + "vm": { + "ip": "201.201.201.201", + "memory": "4096", + } +} +``` + +你可以用这个程序来做: + +``` +import groovy.json.JsonSlurper + +def jsonSlurper = new JsonSlurper() + +// 使用 parseText() 来解析一个字符串,而不是从文件中读取。 +// 这给了我们一个“标准配置” +def standardConfig = jsonSlurper.parseText(""" +{ + "vm": { + "ip": "192.168.44.44", + "memory": "1024", + "synced_folders": [ + { + "host_path": "data/", + "guest_path": "/var/www", + "type": "default" + } + ], + "forwarded_ports": [] + }, + "vdd": { + "sites": { + "drupal8": { + "account_name": "root", + "account_pass": "root", + "account_mail": "box@example.com", + "site_name": "Drupal 8", + "site_mail": "box@example.com", + "vhost": { + "document_root": "drupal8", + "url": "drupal8.dev", + "alias": ["www.drupal8.dev"] + } + }, + "drupal7": { + "account_name": "root", + "account_pass": "root", + "account_mail": "box@example.com", + "site_name": "Drupal 7", + "site_mail": "box@example.com", + "vhost": { + "document_root": "drupal7", + "url": "drupal7.dev", + "alias": ["www.drupal7.dev"] + } + } + } + } +} +""") + +// 打印标准配置 +println "standardConfig = $standardConfig" + +//读入并解析用户配置信息 +def userConfig = jsonSlurper.parse(new File('userConfig.json')) + +// 打印出用户配置信息 +println "userConfig = $userConfig" + +// 一个将用户配置与标准配置合并的函数 +def mergeMaps(Map input, Map merge) { + merge.each { k, v -> + if (v instanceof Map) + mergeMaps(input[k], v) + else + input[k] = v + } +} + +// 合并配置并打印出修改后的标准配置 +mergeMaps(standardConfig, userConfig) + +println "modified standardConfig $standardConfig" +``` + +以下列方式运行: + +``` +$ groovy config3.groovy +standardConfig = [vm:[ip:192.168.44.44, memory:1024, synced_folders:[[host_path:data/, guest_path:/var/www, type:default]], forwarded_ports:[]], vdd:[sites:[drupal8:[account_name:root, account_pass:root, account_mail:box@example.com, site_name:Drupal 8, site_mail:box@example.com, vhost:[document_root:drupal8, url:drupal8.dev, alias:[www.drupal8.dev]]], drupal7:[account_name:root, account_pass:root, account_mail:box@example.com, site_name:Drupal 7, site_mail:box@example.com, vhost:[document_root:drupal7, url:drupal7.dev, alias:[www.drupal7.dev]]]]]] +userConfig = [vm:[ip:201.201.201.201, memory:4096]] +modified standardConfig [vm:[ip:201.201.201.201, memory:4096, synced_folders:[[host_path:data/, guest_path:/var/www, type:default]], forwarded_ports:[]], vdd:[sites:[drupal8:[account_name:root, account_pass:root, account_mail:box@example.com, site_name:Drupal 8, site_mail:box@example.com, vhost:[document_root:drupal8, url:drupal8.dev, alias:[www.drupal8.dev]]], drupal7:[account_name:root, account_pass:root, account_mail:box@example.com, site_name:Drupal 7, site_mail:box@example.com, vhost:[document_root:drupal7, url:drupal7.dev, alias:[www.drupal7.dev]]]]]] +$ +``` + +以 `modified standardConfig` 开头的一行显示,`vm.ip` and `vm.memory` 的值被覆盖了。 + +眼尖的读者会注意到,我没有检查畸形的 JSON,也没有仔细确保用户的配置是有意义的(不创建新字段,提供合理的值,等等)。所以用这个递归方法来合并两个映射在现实中可能并不那么实用。 + +好吧,我必须为家庭作业留下 _一些_ 东西,不是吗? + +### Groovy 资源 + +Apache Groovy 网站有很多很棒的 [文档][11]。另一个很棒的 Groovy 资源是 [Mr. Haki][12]。学习 Groovy 的一个非常好的理由是继续学习 [Grails][13],它是一个非常高效的全栈 Web 框架,建立在 Hibernate、Spring Boot 和 Micronaut 等优秀组件之上。 + +-------------------------------------------------------------------------------- + +via: https://opensource.com/article/21/6/groovy-parse-json + +作者:[Chris Hermansen][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/clhermansen +[b]: https://github.com/lujun9972 +[1]: https://opensource.com/sites/default/files/styles/image-full-size/public/lead-images/look-binoculars-sight-see-review.png?itok=NOw2cm39 (Looking back with binoculars) +[2]: https://www.libreoffice.org/discover/writer/ +[3]: https://gitlab.gnome.org/GNOME/tracker +[4]: https://www.lucidchart.com/techblog/2018/07/16/why-json-isnt-a-good-configuration-language/ +[5]: https://medium.com/trabe/stop-using-json-config-files-ab9bc55d82fa +[6]: https://groovy-lang.org/ +[7]: https://groovy.apache.org/download.html +[8]: https://sdkman.io/ +[9]: https://www.drupal.org/node/2008800 +[10]: mailto:box@example.com +[11]: http://groovy-lang.org/documentation.html +[12]: https://blog.mrhaki.com/ +[13]: https://grails.org/ diff --git a/published/202107/20210703 Can Windows 11 Influence Linux Distributions.md b/published/202107/20210703 Can Windows 11 Influence Linux Distributions.md new file mode 100644 index 0000000000..23c32ec7a1 --- /dev/null +++ b/published/202107/20210703 Can Windows 11 Influence Linux Distributions.md @@ -0,0 +1,115 @@ +[#]: subject: (Can Windows 11 Influence Linux Distributions?) +[#]: via: (https://news.itsfoss.com/can-windows-11-influence-linux/) +[#]: author: (Ankush Das https://news.itsfoss.com/author/ankush/) +[#]: collector: (lujun9972) +[#]: translator: (zz-air) +[#]: reviewer: (wxy) +[#]: publisher: (wxy) +[#]: url: (https://linux.cn/article-13588-1.html) + +Windows 11 能影响 Linux 发行版吗? +====== + +> Windows 11 正在为全球的桌面用户制造新闻。它会影响 Linux 发行版走向桌面用户吗? + +![](https://i1.wp.com/news.itsfoss.com/wp-content/uploads/2021/07/windows-linux-desktop-influence.png?w=1200&ssl=1) + +微软的 Windows11 终于发布了。有些人将其与 macOS 进行比较,另一些人则比较其细枝末节发现与 GNOME 和 KDE 的相似之处(这没有多大意义)。 + +但是,在所有的热议当中,我对另一件事很好奇—— **微软的 Windows 11 能影响桌面 Linux 发行版未来的决策吗?** + +在这里,我将提到一些我的想法,即如果它以前发生过,为什么会发生?以及 Linux 发行版未来会怎样。 + +### 一些 Linux 发行版已经关注类似 Windows 的体验:但是,为什么呢? + +微软的 Windows 是最受欢迎的桌面操作系统,因其易操作、软件支持和硬件兼容占据了 88% 的市场分额。 + +相反, Linux 占有 **大约 2% 的市场分额,** [即使 Linux 比 Windows 有更多的优势][1]。 + +那么 Linux 能做什么来说服更多的用户将 Linux 作为他们的桌面操作系统呢? + +每个桌面操作系统的主要关注点应该是用户体验。当微软和苹果设法为大众提供舒适的用户体验时,Linux 发行版并没有设法在这方面取得巨大的胜利。 + +然而,你将会发现有几个 [Linux 发行版打算取代 Windows 10][2]。这些 Linux 发行版试图提供一个熟悉的用户界面,鼓励 Windows 用户考虑切换到 Linux 。 + +而且,由于这些发行版的存在,[在 2021 年切换到 Linux][3] 比以往任何时候都更有意义。 + +因此,为了让更多的用户跳转到 Linux ,微软 Window 多年来已经影响了许多发行版。 + +### Windows 11 在某些方面比 Linux 好? + +用户界面随着 Windows 的发展而不断的发展。即使这是主观的,它似乎是大多数桌面用户的选择。 + +所以我要说 Windows 11 在这方面做了一些有吸引力的改进。 + +![][4] + +不仅仅局限于 UI/UX ,比如在任务栏中集成微软团队的聊天功能,可以方便用户与任何人即时联系。 + +**虽然 Linux 发行版没有自己成熟的服务,但是像这样定制的更多开箱即用的集成,应该会使新用户更容易上手。** + +并且这让我想起了 Windows 11 的另一个方面——个性化的新闻和信息提要。 + +当然,微软会为此收集数据,你可能需要使用微软账号登录。但这也减少了用户寻找独立应用程序来跟踪天气、新闻和其他日常信息的摩擦。 + +Linux 不会强迫用户做出这些选择,但是像这样的特性/集成可以作为额外的选项添加,可以以选择的形式呈现给用户。 + +**换句话说,在与操作系统集成的同时,使事物更容易访问,应该可以摆脱陡峭的学习曲线。** + +而且,可怕的微软商店也在 Windows 11 上进行了重大升级。 + +![][5] + +不幸的是,对于 Linux 发行版,我没有看到对应用中心进行多少有意义的升级,来使其在视觉上更吸引人,更有趣。 + +elementaryOS 可能正努力专注于 UX/UI ,并不断发展应用中心的体验,但对于大多数其他发行版,没有重大的升级。 + +![Linux Mint 20.1 中的软件管理器][6] + +虽然我很欣赏深度 Linux 在这方面所做的,但它并不是许多用户第一次尝试 Linux 时的热门选择。 + +### Windows 11 引入了更多的竞争:Linux 必须跟上 + +随着 Windows 11 的推出,作为桌面选择的 Linux 将面临更多的竞争。 + +虽然在 Linux 世界中,我们确实有一些 Windows 10 经验的替代品,但还没有针对 Windows 11 的。 + +但这让我们看到了来自 Linux 社区的明显反击—— **一个针对 Windows 11 的 Linux 发行版**。 + +不管是讨厌还是喜欢微软最新的 Windows 11 设计方案,在接下来的几年里,大众将会接受它。 + +并且,为了使 Linux 成为一个引人注目的桌面替代品,Linux 发行版的设计语言也必须发展。 + +不仅仅是桌面市场,还有笔记本专用的设计选择也需要对 Linux 发行版进行重大改进。 + +像 [Pop!_OS_System 76][7] 这些选择一直试图为 Linux 提供这种体验,这是一个良好的开端。 + +我认为 Zorin OS 可以作为一个引入 “**Windows 11**” 布局的发行版,作为让更多用户尝试 Linux 的一个选择。 + +别忘了,在 Windows 11 将 Android 应用程序支持作为一项功能推向市场之后,[深度 Linux 就引入了 Android 应用程序支持。][8] + +所以,你看,当微软的 Windows 采取行动时,对 Linux 也会产生连锁反应。而深度 Linux 的 Android 应用支持只是一个开始……让我们看看接下来还会出现什么。 + +_你对 Windows 11 影响 Linux 桌面的未来有什么看法?我们也需要进化吗?或者我们应该继续与众不同,不受大众选择的影响?_ + +-------------------------------------------------------------------------------- + +via: https://news.itsfoss.com/can-windows-11-influence-linux/ + +作者:[Ankush Das][a] +选题:[lujun9972][b] +译者:[zz-air](https://github.com/zz-air) +校对:[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/linux-better-than-windows/ +[2]: https://itsfoss.com/windows-like-linux-distributions/ +[3]: https://news.itsfoss.com/switch-to-linux-in-2021/ +[4]: https://i1.wp.com/news.itsfoss.com/wp-content/uploads/2021/07/windows-11-home.png?w=1024&ssl=1 +[5]: https://i0.wp.com/news.itsfoss.com/wp-content/uploads/2021/07/windows-10-app-store.png?w=1024&ssl=1 +[6]: https://i0.wp.com/news.itsfoss.com/wp-content/uploads/2021/07/software-manager-linux-mint.png?w=862&ssl=1 +[7]: https://pop.system76.com +[8]: https://news.itsfoss.com/deepin-linux-20-2-2-release/ diff --git a/published/202107/20210703 Identify flowers and trees with this open source mobile app.md b/published/202107/20210703 Identify flowers and trees with this open source mobile app.md new file mode 100644 index 0000000000..6dd54f9769 --- /dev/null +++ b/published/202107/20210703 Identify flowers and trees with this open source mobile app.md @@ -0,0 +1,90 @@ +[#]: subject: (Identify flowers and trees with this open source mobile app) +[#]: via: (https://opensource.com/article/21/7/open-source-plantnet) +[#]: author: (Don Watkins https://opensource.com/users/don-watkins) +[#]: collector: (lujun9972) +[#]: translator: (geekpi) +[#]: reviewer: (wxy) +[#]: publisher: (wxy) +[#]: url: (https://linux.cn/article-13568-1.html) + +用开源移动应用 PlantNet 来识别花草和树木 +====== + +> PlantNet 将开源技术与众包知识结合起来,帮助你成为业余植物学家。 + +![Fire pink flower in Maggie Valley, NC][1] + +在我居住的地方很多小路和道路两旁都有花草树木。我所在的社区因其每年的枫树节而闻名,枫树对我来说很容易识别。然而,还有许多其他的树我无法识别名字。花也是如此:蒲公英很容易发现,但我不知道在我的步行道上的野花的名字。 + +最近,我的妻子告诉我了 PlantNet,一个可以识别这些花草和树木的移动应用。它可以在 iOS 和 Android 上使用,而且是免费的,所以我决定试试。 + +### 以开源的方式识别植物 + +我在手机上下载了这个应用程序,开始用它来识别我在村子周围散步时的一些花草和树木。随着我对这个应用的熟悉,我注意到我拍摄的图片(以及其他用户拍摄的图片)是以知识共享署名-相同方式共享(CC-BY-SA)的许可方式共享的。进一步的调查显示,PlantNet 是 [开源][2] 的。如果你喜欢,你可以匿名使用该应用,或者成为社区的注册成员。 + +根据 [Cos4Cloud][3] 公民科学项目,“PlantNet 是一个参与性的公民科学平台,用于收集、分享和审查基于自动识别的植物观察结果。它的目标是监测植物的生物多样性,促进公众对植物知识的获取”。它使用图像识别技术来清点生物多样性。 + +该项目的开发始于 2009 年,由法国的植物学家和计算机科学家进行。它最初是一个 [Web 应用][4],而智能手机应用程序于 2013 年推出。该项目是 [Floris'Tic][5] 倡议的一部分,这是法国的另一个项目,旨在促进植物科学的科学、技术和工业文化。 + +PlantNet 允许用户利用智能手机的摄像头来收集视觉标本,并由软件和社区进行识别。然后,这些照片将与全世界数百万加入 PlantNet 网络的人分享。 + +该项目说:“PlantNet 系统的工作原理是,比较用户通过他们寻求鉴定的植物器官(花、果实、叶……)的照片传送的视觉模式。这些图像被分析,并与每天协作制作和充实的图像库进行比较。然后,该系统提供一个可能的物种清单及其插图”。 + +### 使用 PlantNet + +该应用很容易使用。从你的智能手机上的应用图标启动它。 + +![PlantNet smartphone icon][6] + +当应用打开时,你会看到你已经在资料库中收集的标本。显示屏底部的相机图标允许你使用你的相机将图片添加到你的照片库。 + +![Pl@ntnet homescreen][8] + +选择“相机”选项,将手机的摄像头对准你想识别的树木或花草。拍完照后,点击与你想识别的标本相匹配的选项(叶、花、树皮、果实等)。 + +![Selecting plant type to identify][9] + +例如,如果你想通过叶子的特征来识别一个标本,请选择**叶子**。PlantNet 对其识别的确定程度进行了分配,从高到低的百分比不等。你还可以使用你的智能手机的 GPS 功能,将位置信息自动添加到你的数据收集中,你还可以添加注释。 + +![Identified plant][10] + +你可以在你的智能手机上或通过你的用户 ID(如果你创建了一个账户)登录网站,访问你上传的所有观测数据,并跟踪社区是否批准了它们。从网站界面上,你也可以下载 CSV 或电子表格格式的观察记录。 + +![Pl@ntnet provides user stats][11] + +### 很好的户外活动 + +我特别喜欢 PlantNet 与维基百科的链接,这样我就可以阅读更多关于我收集的植物数据的信息。 + +目前全球大约有 1200 万 PlantNet 用户,所以数据集一直在增长。该应用是免费使用的,每天最多可以有 500 个请求。它还有一个 API,以 JSON 格式提供数据,所以你甚至可以把 Pl antNet 的视觉识别引擎作为一个 Web 服务使用。 + +PlantNet 的一个非常好的地方是,它结合了众包知识和开源技术,将用户相互联系起来,并与很好的户外活动联系起来。没有比这更好的理由来支持开源软件了。 + +关于该应用及其开发者的完整描述可在 [YouTube][12] 上找到(有法语、英文字幕)。你也可以在 [PlantNet][13] 的网站上了解更多该项目。 + +-------------------------------------------------------------------------------- + +via: https://opensource.com/article/21/7/open-source-plantnet + +作者:[Don Watkins][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/don-watkins +[b]: https://github.com/lujun9972 +[1]: https://opensource.com/sites/default/files/styles/image-full-size/public/lead-images/fire-pink-flower-maggie-valley.jpg?itok=q6Ev7TSr (Fire pink flower in Maggie Valley, NC) +[2]: https://github.com/plantnet +[3]: https://cos4cloud-eosc.eu/citizen-science-innovation/cos4cloud-citizen-observatories/plntnet/ +[4]: https://identify.plantnet.org/ +[5]: http://floristic.org/ +[6]: https://opensource.com/sites/default/files/uploads/plantnet-icon.jpg (PlantNet smartphone icon) +[7]: https://creativecommons.org/licenses/by-sa/4.0/ +[8]: https://opensource.com/sites/default/files/uploads/plantnet_camera.jpg (Pl@ntnet homescreen) +[9]: https://opensource.com/sites/default/files/uploads/plantnet_plant-type.jpg (Selecting plant type to identify) +[10]: https://opensource.com/sites/default/files/uploads/plantnet-identification.jpg (Identified plant) +[11]: https://opensource.com/sites/default/files/uploads/plantnet_user-stats.jpg (Pl@ntnet provides user stats) +[12]: https://www.youtube.com/watch?v=W_cBqaPfRFE +[13]: https://plantnet.org/ diff --git a/published/202107/20210704 7 guides about open source to keep your brain busy this summer.md b/published/202107/20210704 7 guides about open source to keep your brain busy this summer.md new file mode 100644 index 0000000000..16cf08fc77 --- /dev/null +++ b/published/202107/20210704 7 guides about open source to keep your brain busy this summer.md @@ -0,0 +1,111 @@ +[#]: subject: "7 guides about open source to keep your brain busy this summer" +[#]: via: "https://opensource.com/article/21/7/open-source-guides" +[#]: author: "Seth Kenlon https://opensource.com/users/seth" +[#]: collector: "lujun9972" +[#]: translator: "zepoch" +[#]: reviewer: "wxy" +[#]: publisher: "wxy" +[#]: url: "https://linux.cn/article-13575-1.html" + +让你的大脑在这个夏天保持忙碌的 7 本开源指南 +====== + +> 下载我们的免费指南之一:开发一个基于 Python 的电子游戏;使用开源工具来让你的生活井井有条;完成家庭自动化项目;或尝试你的树莓派家用实验室。 + +![](https://img.linux.net.cn/data/attachment/album/202107/12/225953hynu3qud32s1jn1z.jpg) + +(LCTT 译注:opensource.com 的免费电子书需要免费注册一个用户才能下载。) + +### 开启一个新的树莓派项目 + +近十年来,树莓派一直俘获着开源爱好者的心和手。你可以用树莓派做无数的项目,无论是 [监控你的花园][2]、[设置家长监控][3](尤其是在那些漫长的夏天),甚至从你自己的后院 [跟踪飞机][4]。如果这些很酷的项目激起了你的兴趣,但你的树莓派仍在吃灰,那么你需要下载我们的指南来促使你开始行动。在你知道它之前,你需要学习 [如何管理它们][5],因为你将与很多树莓派一起工作! + +**下载:《[如何开始使用你的树莓派][6]》** + +### 设计你的开源智能家庭 + +一个聪明且有用的方式去使用树莓派的方式是去设计你的智能家庭。使用家庭助手或其他的开源工具,你的家可以按你自己的设置进行自动化而无需借助第三方平台。作者 [Steve Ovens][7] 用这本家庭自动化集锦的手写电子书来指导你的每一步工作。 + +**下载:《[使用开源工具实现家庭自动化的实用指南][7]》** + +### 将事情梳理地井井有条 + +可能你并没做好准备使得你的家庭完全自动化,但是你可能会对梳理你的思维有兴趣。为什么不从你的 to-do 列表开始呢?在贡献者 [Kevin Sonney][8] 的生产力指导下,你将会熟悉六个开源工具的使用,从而帮你把事情安排得井井有条。一旦你完成了他的教程,你就会感到事情井井有条,在这个夏天终于有时间放松了。 + +**下载:《[六个可以将事情梳理地井井有条的开源工具][9]》** + +### 学习如何写代码 + +电脑无处不在。能吐槽一下很多编程语言对初学者不是很友好吗? + +有许多为初学者设计的编程语言。Bash 是 Linux 和 macOS 终端中使用的相同的脚本语言,如果你新开始写代码,Bash 将会是一个伟大的开始。你可以以 [互动的方式学习它][10],之后下载我们的电子书以了解更多。 + +**下载:《[Bash 编程指南][11]》** + +### 用 Python 写一个游戏 + +另一个初学者喜欢的编程语言是 Python。它不仅受到仅仅学习编码的中小学生的欢迎,还被专业程序员用来做 [网站开发][12]、[视频编辑][13] 以及 [云端自动化][14]。无论你最终的目标是什么,开始学习 Python 的一个有趣的方式是编写一个自己的游戏。 + +**下载:《[Python 游戏开发指南][15]》** + +### 发现使用 Jpuyter 的巧妙方法 + +为了让 Python 具有交互性且易于分享,Jupyter 项目提供了基于 Web 的发展环境。你可以在“笔记本”文件中写代码,然后将其发送给其他用户,以便他们轻松复制和可视化你所做的。它是代码、文档和演示文稿的完美组合,而且非常灵活。下载 Moshe Zadka 的多方面指南了解更多关于 Jupyter。 + +**下载:《[使用 Jupyer 的六种惊艳方式][16]》** + +### 在你的家庭实验室里尝试 Kubernetes + +现在,你已经在你的树莓派上安装了 Linux,已经登录,已设置新用户并 [配置了 sudo][17] 使得能够进入管理员模式,你正在 [运行所有你需要的服务][18] 。之后呢? + +如果你对 Linux 和服务器管理感到满意,你的下一步可能是云服务。可以读一下 Chris Collins 的电子书,从你的家庭实验室的舒适中了解所有关于容器,吊舱和集群的信息。 + +**下载: 《[在你的树莓派家庭实验室上运行 Kubernetes][19]》** + +### 福利:书籍列表 + +只工作不休息是不健康的。夏天(或任何季节,它是在你的世界的一部分)假期是为了休息,没有什么比坐在门廊或海滩上读一本好书更休闲人心的。下面是一些最近列出的书,以激发一些想法: + + * [8 本供开源技术专家读的书(2021)][20] + * [十几本适合所有年龄段的书][21] + * [8 本提升领导力的书籍][22] + * [6 本必读的云架构书籍][23] + * 我们的第一份 [2010 年的书籍列表][24] + +-------------------------------------------------------------------------------- + +via: https://opensource.com/article/21/7/open-source-guides + +作者:[Seth Kenlon][a] +选题:[lujun9972][b] +译者:[zepoch](https://github.com/zepoch) +校对:[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/chen-mizrach-unsplash.jpg?itok=S_wIO5e8 "One chair on a sandy beach" +[2]: https://opensource.com/article/21/5/monitor-greenhouse-open-source +[3]: https://opensource.com/article/21/3/raspberry-pi-parental-control +[4]: https://opensource.com/article/21/3/tracking-flights-raspberry-pi +[5]: https://opensource.com/article/21/5/raspberry-pi-cockpit +[6]: https://opensource.com/downloads/raspberry-pi-guide +[7]: https://opensource.com/downloads/home-automation-ebook +[8]: https://opensource.com/users/ksonney +[9]: https://opensource.com/downloads/organization-tools +[10]: https://opensource.com/article/19/10/learn-bash-command-line-games#bashcrawl +[11]: https://opensource.com/downloads/bash-programming-guide +[12]: https://opensource.com/article/18/4/flask +[13]: https://opensource.com/article/21/2/linux-python-video +[14]: https://opensource.com/article/19/2/quickstart-guide-ansible +[15]: https://opensource.com/downloads/python-gaming-ebook +[16]: https://opensource.com/downloads/jupyter-guide +[17]: https://opensource.com/article/19/10/know-about-sudo +[18]: https://opensource.com/article/20/5/systemd-units +[19]: https://opensource.com/downloads/kubernetes-raspberry-pi +[20]: https://opensource.com/article/21/6/2021-opensourcecom-summer-reading-list +[21]: https://opensource.com/article/20/6/summer-reading-list +[22]: https://enterprisersproject.com/article/2021/5/8-leadership-books-self-improvement +[23]: https://www.redhat.com/architect/books-cloud-architects +[24]: https://opensource.com/life/10/8/open-books-opensourcecom-summer-reading-list diff --git a/published/202107/20210705 Enter invisible passwords using this Python module.md b/published/202107/20210705 Enter invisible passwords using this Python module.md new file mode 100644 index 0000000000..530a0ac62f --- /dev/null +++ b/published/202107/20210705 Enter invisible passwords using this Python module.md @@ -0,0 +1,150 @@ +[#]: subject: (Enter invisible passwords using this Python module) +[#]: via: (https://opensource.com/article/21/7/invisible-passwords-python) +[#]: author: (Seth Kenlon https://opensource.com/users/seth) +[#]: collector: (lujun9972) +[#]: translator: (geekpi) +[#]: reviewer: (wxy) +[#]: publisher: (wxy) +[#]: url: (https://linux.cn/article-13579-1.html) + +使用这个 Python 模块输入不可见的密码 +====== + +> 用 GPG 和 Python 的 getpass 模块给你的密码多一层安全保障。 + +![](https://img.linux.net.cn/data/attachment/album/202107/14/101543fy6up6imco65mi68.jpg) + +密码对程序员来说尤其重要。你不应该在不加密的情况下存储它们,而且你也不应该在用户输入密码的时候显示出输入的内容。当我决定要提高我的笔记本电脑的安全性时,这对我来说变得特别重要。我对我的家目录进行了加密,但当我登录后,任何以纯文本形式存储在配置文件中的密码都有可能暴露在偷窥者面前。 + +具体来说,我使用一个名为 [Mutt][2] 的应用作为我的电子邮件客户端。它可以让我在我的 Linux 终端中阅读和撰写电子邮件,但通常它希望在其配置文件中有一个密码。我限制了我的 Mutt 配置文件的权限,以便只有我可以看到它,我是我的笔记本电脑的唯一用户,所以我并不真的担心经过认证的用户会无意中看到我的配置文件。相反,我想保护自己,无论是为了吹嘘还是为了版本控制,不至于心不在焉地把我的配置发布到网上,把我的密码暴露了。此外,虽然我不希望我的系统上有不受欢迎的客人,但我确实想确保入侵者不能通过对我的配置上运行 `cat` 就获得我的密码。 + +### Python GnuPG + +Python 模块 `python-gnupg` 是 `gpg` 应用的一个 Python 封装。该模块的名字是 `python-gnupg`,你不要把它和一个叫做 `gnupg` 的模块混淆。 + +[GnuPG][3](GPG) 是 Linux 的默认加密系统,我从 2009 年左右开始使用它。我对它很熟悉,对它的安全性有很高的信任。 + +我决定将我的密码输入 Mutt 的最好方法是将我的密码存储在一个加密的 GPG 文件中,创建一个提示我的 GPG 密码来解锁这个加密文件,然后将密码交给 Mutt(实际上是交给 `offlineimap` 命令,我用它来同步我的笔记本和电子邮件服务器)。 + +[用 Python 获取用户输入][4] 是非常容易的。对 `input` 进行调用,无论用户输入什么,都会被存储为一个变量: + +``` +print("Enter password: ") +myinput = input() + +print("You entered: ", myinput) +``` + +我的问题是,当我根据密码提示在终端上输入密码时,我所输入的所有内容对任何从我肩膀上看过去或滚动我的终端历史的人来说都是可见的: + +``` +$ ./test.py +Enter password: my-Complex-Passphrase +``` + +### 用 getpass 输入不可见密码 + +正如通常的情况一样,有一个 Python 模块已经解决了我的问题。这个模块是 `getpass4`,从用户的角度来看,它的行为和 `input` 完全一样,只是不显示用户输入的内容。 + +你可以用 [pip][5] 安装这两个模块: + +``` +$ python -m pip install --user python-gnupg getpass4 +``` + +下面是我的 Python 脚本,用于创建密码提示: + +``` +#!/usr/bin/env python +# by Seth Kenlon +# GPLv3 + +# install deps: +# python3 -m pip install --user python-gnupg getpass4 + +import gnupg +import getpass +from pathlib import Path + +def get_api_pass(): + homedir = str(Path.home()) + gpg = gnupg.GPG(gnupghome=os.path.join(homedir,".gnupg"), use_agent=True) + passwd = getpass.getpass(prompt="Enter your GnuPG password: ", stream=None) + + with open(os.path.join(homedir,'.mutt','pass.gpg'), 'rb') as f: + apipass = (gpg.decrypt_file(f, passphrase=passwd)) + + f.close() + + return str(apipass) + +if __name__ == "__main__": + apipass = get_api_pass() + print(apipass) +``` + +如果你想试试,把文件保存为 `password_prompt.py`。如果你使用 `offlineimap` 并想在你自己的密码输入中使用这个方案,那么把它保存到某个你可以在 `.offlineimaprc` 文件中指向 `offlineimap` 的位置(我使用 `~/.mutt/password_prompt.py`)。 + +### 测试密码提示 + +要查看脚本的运行情况,你首先必须创建一个加密文件(我假设你已经设置了 GPG): + +``` +$ echo "hello world" > pass +$ gpg --encrypt pass +$ mv pass.gpg ~/.mutt/pass.gpg +$ rm pass +``` + +现在运行 Python 脚本: + +``` +$ python ~/.mutt/password_prompt.py +Enter your GPG password: +hello world +``` + +当你输入时没有任何显示,但只要你正确输入 GPG 口令,你就会看到该测试信息。 + +### 将密码提示符与 offlineimap 整合起来 + +我需要将我的新提示与 `offlineimap` 命令结合起来。我为这个脚本选择了 Python,因为我知道 `offlineimap` 可以对 Python 程序进行调用。如果你是一个 `offlineimap` 用户,你会明白唯一需要的“整合”是在你的 `.offlineimaprc` 文件中改变两行。 + +首先,添加一行引用 Python 文件的内容: + +``` +pythonfile = ~/.mutt/password_prompt.py +``` + +然后将 `.offlineimaprc`中的 `remotepasseval` 行改为调用 `password_prompt.py`中的 `get_api_pass()` 函数: + +``` +remotepasseval = get_api_pass() +``` + +配置文件中不再有密码! + +### 安全问题 + +在你的个人电脑上考虑安全问题有时会让人觉得很偏执。你的 SSH 配置是否真的需要限制为 600?隐藏在名为 `.mutt` 的无关紧要的电子邮件密码真的重要吗?也许不重要。 + +然而,知道我没有把敏感数据悄悄地藏在我的配置文件里,使我更容易把文件提交到公共 Git 仓库,把片段复制和粘贴到支持论坛,并以真实好用的配置文件的形式分享我的知识。仅就这一点而言,安全性的提高使我的生活更加轻松。而且有这么多好的 Python 模块可以提供帮助,这很容易实现。 + +-------------------------------------------------------------------------------- + +via: https://opensource.com/article/21/7/invisible-passwords-python + +作者:[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/password.jpg?itok=ec6z6YgZ (Password lock) +[2]: http://www.mutt.org/ +[3]: https://gnupg.org/ +[4]: https://opensource.com/article/20/12/learn-python +[5]: https://opensource.com/article/19/11/python-pip-cheat-sheet diff --git a/published/202107/20210706 Edit PDFs on the Linux command line.md b/published/202107/20210706 Edit PDFs on the Linux command line.md new file mode 100644 index 0000000000..d0b985bf79 --- /dev/null +++ b/published/202107/20210706 Edit PDFs on the Linux command line.md @@ -0,0 +1,96 @@ +[#]: subject: (Edit PDFs on the Linux command line) +[#]: via: (https://opensource.com/article/21/7/qpdf-command-line) +[#]: author: (Moshe Zadka https://opensource.com/users/moshez) +[#]: collector: (lujun9972) +[#]: translator: (geekpi) +[#]: reviewer: (wxy) +[#]: publisher: (wxy) +[#]: url: (https://linux.cn/article-13581-1.html) + +在 Linux 命令行上编辑 PDF +====== + +> 使用 qpdf 和 poppler-utils 来分割、修改和合并 PDF 文件。 + +![](https://img.linux.net.cn/data/attachment/album/202107/15/093249xh6dmg846py8bgbc.jpg) + +你收到的许多文件都是 PDF 格式的。有时这些 PDF 需要进行处理。例如,可能需要删除或添加页面,或者你可能需要签署或修改一个特定的页面。 + +不管是好是坏,这就是我们所处的现实。 + +有一些花哨的图形用户界面工具可以让你编辑 PDF,但我一直对命令行感到最舒服。在这个任务的许多命令行工具中,当我想修改一个 PDF 时,我使用的是 `qpdf` 和 `poppler-utils`。 + +### 安装 + +在 Linux 上,你可以用你的包管理器(如 `apt` 或 `dnf`)来安装 `qpdf` 和 `poppler-utils`。比如在 Fedora 上: + +``` +$ sudo dnf install qpdf poppler-utils +``` + +在 macOS 上,使用 [MacPorts][2] 或 [Homebrew][3]。在 Windows 上,使用 [Chocolatey][4]。 + +### qpdf + +`qpdf` 命令可以做很多事情,但我主要用它来: + + 1. 将一个 PDF 分割成不同的页面 + 2. 将多个 PDF 文件合并成一个文件 + +要将一个 PDF 分割成不同的页面: + +``` +qpdf --split-pages original.pdf split.pdf +``` + +这就会生成像 `split-01.pdf`、`split-02.pdf` 这样的文件。每个文件都是一个单页的 PDF 文件。 + +合并文件比较微妙: + +``` +qpdf --empty concatenated.pdf --pages split-*.pdf -- +``` + +这就是 `qpdf` 默认的做法。`--empty` 选项告诉 qpdf 从一个空文件开始。结尾处的两个破折号(`--`)表示没有更多的文件需要处理。这是一个参数反映内部模型的例子,而不是人们使用它的目的,但至少它能运行并产生有效的 PDF! + +### poppler-utils + +这个软件包包含几个工具,但我用得最多的是 [pdftoppm][5],它把 PDF 文件转换为可移植的像素图(`ppm`)文件。我通常在用 `qpdf` 分割页面后使用它,并需要将特定页面转换为我可以修改的图像。`ppm` 格式并不为人所知,但重要的是大多数图像处理方法,包括 [ImageMagick][6]、[Pillow][7] 等,都可以使用它。这些工具中的大多数也可以将文件保存为 PDF。 + +### 工作流程 + +我通常的工作流程是: + + * 使用 `qpdf` 将 PDF 分割成若干页。 + * 使用 `poppler-utils` 将需要修改的页面转换为图像。 + * 根据需要修改图像,并将其保存为 PDF。 + * 使用 `qpdf` 将各页合并成一个 PDF。 + +### 其他工具 + +有许多很好的开源命令来处理 PDF,无论你是 [缩小它们][8]、[从文本文件创建它们][9]、[转换文档][10],还是尽量 [完全避免它们][11]。你最喜欢的开源 PDF 工具是什么?请在评论中分享它们。 + +-------------------------------------------------------------------------------- + +via: https://opensource.com/article/21/7/qpdf-command-line + +作者:[Moshe Zadka][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/moshez +[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://opensource.com/article/20/11/macports +[3]: https://opensource.com/article/20/6/homebrew-mac +[4]: https://opensource.com/article/20/3/chocolatey +[5]: https://www.xpdfreader.com/pdftoppm-man.html +[6]: https://opensource.com/article/17/8/imagemagick +[7]: https://opensource.com/article/20/8/edit-images-python +[8]: https://opensource.com/article/20/8/reduce-pdf +[9]: https://opensource.com/article/20/5/pandoc-cheat-sheet +[10]: https://opensource.com/article/21/3/libreoffice-command-line +[11]: https://opensource.com/article/19/3/comic-book-archive-djvu diff --git a/published/202107/20210706 Send and receive Gmail from the Linux command line.md b/published/202107/20210706 Send and receive Gmail from the Linux command line.md new file mode 100644 index 0000000000..13d2d546eb --- /dev/null +++ b/published/202107/20210706 Send and receive Gmail from the Linux command line.md @@ -0,0 +1,258 @@ +[#]: subject: (Send and receive Gmail from the Linux command line) +[#]: via: (https://opensource.com/article/21/7/gmail-linux-terminal) +[#]: author: (Seth Kenlon https://opensource.com/users/seth) +[#]: collector: (lujun9972) +[#]: translator: (HankChow) +[#]: reviewer: (wxy) +[#]: publisher: (wxy) +[#]: url: (https://linux.cn/article-13573-1.html) + +在 Linux 命令行中收发 Gmail 邮件 +====== + +> 即使你用的是诸如 Gmail 的托管邮件服务,你也可以通过 Mutt 在终端里收发电子邮件。 + +![](https://img.linux.net.cn/data/attachment/album/202107/12/104952frwgx4oz4xrinbxl.jpg) + +我喜欢在 Linux 终端上读写电子邮件的便捷,因此我是 [Mutt][2] 这个轻量简洁的电子邮件客户端的忠实用户。对于电子邮件服务来说,不同的系统配置和网络接入并不会造成什么影响。这个客户端通常隐藏在我 Linux 终端的 [某个标签页或者某个终端复用器的面板][3] 上,需要用的时候随时可以调出来,不需要使用的时候放到后台,就不需要在桌面上一直放置一个电子邮件客户端的应用程序。 + +当今我们大多数人使用的都是托管电子邮件账号,在这种使用场景中并不会与电子邮件协议发生过多的直接交互。而 Mutt(以及更早的 ELM)是在更简单的时代创建的,那时候检查邮件只是对 `uucp` 的调用,以及对 `/var/mail` 的读取。当然 Mutt 也很与时俱进,随着各种流行的协议(如 POP、IMAP、LDAP)出现,它都实现了良好的支持。因此,即使我们使用的是 Gmail 这种邮件服务,也可以与 Mutt 无缝衔接。 + +如今在大多数情况下,用户都不会拥有自己的电子邮件服务器,大部分用户都会选择 Gmail,因此下文会以 Mutt + Gmail 为例作介绍。如果你比较注重电子邮件隐私,不妨考虑 [ProtonMail][4] 或者 [Tutanota][5],它们都提供完全加密的电子邮件服务。其中 Tutanota 包含很多 [开源组件][6],而 ProtonMail 则为付费用户提供 [IMAP 桥接][7],简化了在非浏览器环境下的邮件访问。不过,很多公司、学校和组织都没有自己的电子邮件服务,而是使用 Gmail 提供的邮件服务,这样一来,大部分用户都会有一个 Gmail 邮箱。 + +当然,如果你自己就 [拥有电子邮件服务器][8],那么使用 Mutt 就更简单了。下面我们开始介绍。 + +### 安装 Mutt + +在 Linux 系统上,一般可以直接从发行版提供的软件库中安装 Mutt,另外需要在家目录中创建一个 `.mutt` 目录以存放配置文件: + +``` +$ sudo dnf install mutt +$ mkdir ~/.mutt +``` + +在 MacOS 上,可以通过 [MacPorts][9] 或者 [Homebrew][10] 安装;在 Windows 上则可以使用 [Chocolatey][11] 安装。 + +Mutt 是一个邮件用户代理Mail User Agent(MUA),因此它的作用是读取、编写以及向外部邮件池发送邮件。向邮件服务器实际传输邮件是其它应用或邮件服务的工作,尽管它们可以和 Mutt 进行协作,让我们看起来是 Mutt 完成了所有功能,但实际上并非如此。在弄懂了两者之间的区别之后,我们会对 Mutt 的配置更加清楚。 + +这也是为什么除了 Mutt 之外,我们还需要视乎进行通信的服务种类选择一些辅助应用程序。在本文中我使用的是 IMAP 服务,这可以让我本地的电子邮件副本与电子邮件服务提供商的远程邮件副本保持同步。如果你选择 POP 服务,配置的难度就更下一个台阶了,也无需依赖其它外部工具。我们需要 OfflineIMAP 这个 Python 应用程序来实现 IMAP 的集成,这个应用程序可以在 [它的 GitHub 存储库][12] 获取。 + +OfflineIMAP 目前仍然在从 Python 2 移植到 Python 3,目前需要手动安装,但以后你也可以通过 `python3 -m pip` 命令进行安装。 + +OfflineIMAP 依赖于 `imaplib2` 库,这个库也在努力开发当中,所以我更喜欢手动安装。同样地,也是通过 Git 将代码库克隆到本地,进入目录后使用 `pip` 安装。 + +首先安装 `rfc6555` 依赖: + +``` +$ python3 -m pip install --user rfc6555 +``` + +然后从源码安装 `imaplib2`: + +``` +$ git clone git@github.com:jazzband/imaplib2.git +$ pushd imaplib2.git +$ python3 -m pip install --upgrade --user . +$ popd +``` + +最后从源码安装 OfflineIMAP: + +``` +$ git clone git@github.com:OfflineIMAP/offlineimap3.git +$ pushd offlineimap3.git +$ python3 -m pip install --upgrade --user . +$ popd +``` + +如果你使用的是 Windows 上的 Cygwin,那么你还需要安装 [Portlocker][14]。 + +### 配置 OfflineIMAP + +OfflineIMAP 默认使用 `~/.offlineimaprc` 这个配置文件,在它的代码库中会有一个名为 `offlineimap.conf` 的配置模板,可以直接将其移动到家目录下: + +``` +$ mv offlineimap3.git/offlineimap.conf ~/.offlineimaprc` +``` + +你可以使用任何文本编辑器打开浏览这个配置文件,它的注释很完善,便于了解各个可用的配置项。 + +以下是我的 `.offlineimaprc` 配置文件,为了清晰起见,我把其中的注释去掉了。对于你来说其中有些配置项的值可能会略有不同,但或许会为你的配置带来一些启发: + +``` +[general] +ui = ttyui +accounts = %your-gmail-username% +pythonfile = ~/.mutt/password_prompt.py +fsync = False + +[Account %your-gmail-username%] +localrepository = %your-gmail-username%-Local +remoterepository = %your-gmail-username%-Remote +status_backend = sqlite +postsynchook = notmuch new + +[Repository %your-gmail-username%-Local] +type = Maildir +localfolders = ~/.mail/%your-gmail-username%-gmail.com +nametrans = lambda folder: {'drafts': '[Gmail]/Drafts', + 'sent': '[Gmail]/Sent Mail', + 'flagged': '[Gmail]/Starred', + 'trash': '[Gmail]/Trash', + 'archive': '[Gmail]/All Mail', + }.get(folder, folder) + +[Repository %your-gmail-username%-Remote] +maxconnections = 1 +type = Gmail +remoteuser = %your-gmail-username%@gmail.com +remotepasseval = '%your-gmail-API-password%' +## remotepasseval = get_api_pass() +sslcacertfile = /etc/ssl/certs/ca-bundle.crt +realdelete = no +nametrans = lambda folder: {'[Gmail]/Drafts': 'drafts', + '[Gmail]/Sent Mail': 'sent', + '[Gmail]/Starred': 'flagged', + '[Gmail]/Trash': 'trash', + '[Gmail]/All Mail': 'archive', + }.get(folder, folder) +folderfilter = lambda folder: folder not in ['[Gmail]/Trash', + '[Gmail]/Important', + '[Gmail]/Spam', + ] +``` + +配置文件里有两个可以替换的值,分别是 `%your-gmail-username%` 和 `%your-gmail-API-password%`。其中第一个值需要替换为 Gmail 用户名,也就是邮件地址中 `@gmail.com` 左边的部分。而第二个值则需要通过双因素身份验证(2FA)后从 Google 获取(即使你在查收邮件时不需要使用 2FA)。 + +### 为 Gmail 设置双因素身份验证(2FA) + +Google 希望用户通过 Gmail 网站收发电子邮件,因此当你在 Gmail 网站以外操作电子邮件时,实际上是被 Google 作为“开发者”看待(尽管你没有进行任何开发工作)。也就是说,Google 会认为你正在创建一个应用程序。要获得开发者层面的应用程序密码,就必须设置双因素身份验证。完成了这个过程以后,就可以获得一个应用程序密码,Mutt 可以通过这个密码在浏览器以外的环境登录到你的电子邮箱中。 + +为了安全起见,你还可以在 Google 的 [账号安全][15] 页面中添加一个用于找回的电子邮件地址。 + +在账号安全页面中,点击“两步验证2-step Verification”开始设置 2FA,设置过程中需要用到一部手机。 + +激活 2FA 之后,账号安全页面中会出现“应用程序密码App Passwords”选项,点击就可以为 Mutt 创建一个新的应用程序密码。在 Google 生成密码之后,将其替换 `.offlineimaprc` 配置文件中的 `%your-gmail-API-password%` 值。 + +直接将应用程序密码记录在 `.offlineimaprc` 文件中,这种以纯文本形式存储的做法有一定的风险。长期以来我都是这样做的,而且感觉良好,因为我的家目录是加密的。但出于安全考虑,我现在已经改为使用 GnuPG 加密应用程序密码,这部分内容不在本文的讨论范围,关于如何设置 GPG 密码集成,可以参考我的 [另一篇文章][16]。 + +### 在 Gmail 启用 IMAP + +在你永远告别 Gmail 网页界面之前,还有最后一件事:你必须启用 Gmail 账户的 IMAP 访问。 + +在 Gmail 网站页面中,点击右上角的“cog”图标,选择“查看所有设置See all settings”。在 Gmail 设置页面中,点击“POP/IMAP”标签页,并选中“启用 IMAPenable IMAP”,然后保存设置。 + +现在就可以在浏览器以外访问你的 Gmail 电子邮件了。 + +### 配置 Mutt + +Mutt 的配置过程相对简单。和 [.bashrc][17]、[.zshrc][18]、`.emacs` 这些配置文件一样,网络上有很多优秀的 .muttrc 配置文件可供参照。我自己的 `.muttrc` 配置文件则借鉴了 [Kyle Rankin][19]、[Paul Frields][20] 等人的配置项和想法。下面列出我的配置文件的一些要点: + +``` +set ssl_starttls=yes +set ssl_force_tls=yes + +set from='tux@example.com' +set realname='Tux Example' + +set folder = imaps://imap.gmail.com/ +set spoolfile = imaps://imap.gmail.com/INBOX +set postponed="imaps://imap.gmail.com/[Gmail]/Drafts" +set smtp_url="smtp://smtp.gmail.com:25" +set move = no +set imap_keepalive = 900 +set record="imaps://imap.gmail.com/[Gmail]/Sent Mail" + +# Paths +set folder = ~/.mail +set alias_file = ~/.mutt/alias +set header_cache = "~/.mutt/cache/headers" +set message_cachedir = "~/.mutt/cache/bodies" +set certificate_file = ~/.mutt/certificates +set mailcap_path = ~/.mutt/mailcap +set tmpdir = ~/.mutt/temp +set signature = ~/.mutt/sig +set sig_on_top = yes + +# Basic Options +set wait_key = no +set mbox_type = Maildir +unset move # gmail does that + +# Sidebar Patch +set sidebar_visible = yes +set sidebar_width = 16 +color sidebar_new color221 color233 + +## Account Settings +# Default inbox +set spoolfile = "+example.com/INBOX" + +# Mailboxes to show in the sidebar. +mailboxes +INBOX \ + +sent \ + +drafts + +# Other special folder +set postponed = "+example.com/drafts" + +# navigation +macro index gi "=example.com/INBOX" "Go to inbox" +macro index gt "=example.com/sent" "View sent" +``` + +整个配置文件基本是开箱即用的,只需要将其中的 `Tux Example`和 `example.com` 替换为你的实际值,并将其保存为 `~/.mutt/muttrc` 就可以使用了。 + +### 启动 Mutt + +在启动 Mutt 之前,需要先启动 `offlineimap` 将远程邮件服务器上的邮件同步到本地。在首次启动的时候耗时可能会比较长,只需要让它整晚运行直到同步完成就可以了。 + +在同步完成后,启动 Mutt: + +``` +$ mutt +``` + +Mutt 会提示你打开用于管理电子邮件的目录权限,并展示收件箱的视图。 + +![Mutt email client][22] + +### 学习使用 Mutt + +在学习使用 Mutt 的过程中,你可以找到最符合你使用习惯的 `.muttrc` 配置。例如我的 `.muttrc` 配置文件集成了使用 Emacs 编写邮件、使用 LDAP 搜索联系人、使用 GnuPG 对邮件进行加解密、链接获取、HTML 视图等等一系列功能。你可以让 Mutt 做到任何你想让它做到的事情,你越探索,就能发现越多。 + +-------------------------------------------------------------------------------- + +via: https://opensource.com/article/21/7/gmail-linux-terminal + +作者:[Seth Kenlon][a] +选题:[lujun9972][b] +译者:[HankChow](https://github.com/HankChow) +校对:[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-window-focus.png?itok=g0xPm2kD (young woman working on a laptop) +[2]: http://www.mutt.org/ +[3]: https://opensource.com/article/21/5/linux-terminal-multiplexer +[4]: https://protonmail.com +[5]: https://tutanota.com +[6]: https://github.com/tutao/tutanota +[7]: https://protonmail.com/bridge/ +[8]: https://www.redhat.com/sysadmin/configuring-email-server +[9]: https://opensource.com/article/20/11/macports +[10]: https://opensource.com/article/20/6/homebrew-mac +[11]: https://opensource.com/article/20/3/chocolatey +[12]: https://github.com/OfflineIMAP/offlineimap3 +[13]: mailto:git@github.com +[14]: https://pypi.org/project/portalocker +[15]: https://myaccount.google.com/security +[16]: https://opensource.com/article/21/6/enter-invisible-passwords-using-python-module +[17]: https://opensource.com/article/18/9/handy-bash-aliases +[18]: https://opensource.com/article/19/9/adding-plugins-zsh +[19]: https://twitter.com/kylerankin +[20]: https://twitter.com/stickster +[21]: mailto:tux@example.com +[22]: https://opensource.com/sites/default/files/mutt.png (Mutt email client) diff --git a/published/202107/20210707 Generate passwords on the Linux command line.md b/published/202107/20210707 Generate passwords on the Linux command line.md new file mode 100644 index 0000000000..492c39b954 --- /dev/null +++ b/published/202107/20210707 Generate passwords on the Linux command line.md @@ -0,0 +1,114 @@ +[#]: subject: (Generate passwords on the Linux command line) +[#]: via: (https://opensource.com/article/21/7/generate-passwords-pwgen) +[#]: author: (Sumantro Mukherjee https://opensource.com/users/sumantro) +[#]: collector: (lujun9972) +[#]: translator: (geekpi) +[#]: reviewer: (turbokernel) +[#]: publisher: (wxy) +[#]: url: (https://linux.cn/article-13582-1.html) + +在 Linux 命令行中生成密码 +====== + +> 在命令行上创建符合特定规范的密码。 + +![](https://img.linux.net.cn/data/attachment/album/202107/15/094657l4l494c0080u2ca4.jpg) + +大多数网站或应用都要求用户创建带有安全密码的账户,以便他们能够迎合用户体验。虽然这有利于网站开发者,但肯定不会让用户的生活更轻松。 + +有时,创建密码的规则是如此严格,以至于难以生成一个强壮且合规的组合。如果有一个工具可以生成符合网站或应用程序要求的任何规则的安全密码,那就容易多了。 + +这就是 `pwgen` 的用武之地。根据它的 [手册页][2]:“pwgen 生成的密码是为了让人容易记住,同时又尽可能的安全。” 它返回符合你所提供的规则的多个密码选项,这样你就可以选择一个你喜欢的(而且可能更容易记住)。 + +### 安装 pwgen + +在 Linux 上,你可以通过包管理器安装 `pwgen`。例如,在 Fedora 上: + +``` +$ sudo dnf install pwgen +``` + +在 macOS 上,可以使用 [MacPorts][3] 或 [Homebrew][4]。在 Windows 上,可以使用 [Chocolatey][5]。 + +### 使用 pwgen 生成密码 + +有几种方式可以通过向 `pwgen` 传递参数来生成密码,这取决于你所需的参数。这里有一些例子。更多的参数选项请查阅手册页。 + +如果你需要一个安全的、难以记忆的特定长度的密码,请运行 `pwgen --secure`(或简写 `-s`),后面跟上你所需的密码长度: + +``` +$ pwgen -s 25 +pnFBg9jB8AlKL3feOuS2ZwMGb xlmDRoaLssduXTdGV6jkQhUGY O3IUB3CH7ry2kD4ZrSoODzWez +dENuvhkF3mmeb4FfXd4VPU2dE EMCi1sHFKHUVmbVajXWleFBzD 4UXJIu3JztVzYz6qJktBB3KCv +AF9WM7hmG89cpTlg8PksI7jsL LSSaT7DD4IT8DUgRAgY8Zt06m Nths10uT0bIMGsPuE0XEHDxsj +6YjLRbg3VnGnrzkoQCmrneLmm Tam1Mftac5RxrZPoXJtXx1Qdy BPqePJW4LdTtFnuZOepKEj0o0 +Ss8veqqf95zusqYPsfE7mLb93 4KuZdReO5lhKff7Xv1en1Hefs is7hjLnDrVCUJ7Hh6zYUzfppn +UXOfENPRJYWiroIWEt5IgAwdJ t8i4hM4cDuL8pN1rpFKHnx7yw Wr7gyuyU2br7aCbiH5M5ogvc6 +evk90lUmK2rOUWGgnqmznn0a9 Lflyc9svJfaBRRMin24j0P9ec hIzyJIwCpklDjgOb5PrMkyPCI +bhYcaV7GXfUiCMZ1kvMnlmKLx v4EJew54u6s4ZCirOTAWjfPQ2 IdemhbOHOm4Qo70WGibaNTOpO +j6XkmdB3LBfqZf5mbL3GndliG PpZbeXfWOFCpNARyXt1FWPAb8 OLQS2HFuqkiSg56sdxNsg5vaJ +1g666HxJPQ6l2L0RlaDEMoi50 1t6au7VuTN9HVPpiVmd1Gurli 46OAWypvwtZZUdBEfaHSunjpw +0LiRj9dbtMuI4cbDES8O4gYRq 2HPiaq5AANvVT32fWqNIruu3R 3lT5B107WoUbHsELkKUjnEEih +gLmYUTp0XZJWvIVbA5rFvBT54 LEm6QVeTMinc056DC9c4V55cV ipV45Ewj704365byKhY8zn766 +``` + +运行 `pwgen -symbols`(或简写 `-y`),再加上所需的密码长度,生成包含特殊字符的密码: + +``` +$ pwgen -y 25 +Osh0chahxe0won9aech4ese?v pemoh2ohm9aim;iu4Eiy"ah0y Taiqu;o2aeSh+o4aedoagait3 +Vei;phoh5owai5jui+t|ei3ot teu!w7mahxoh0Po7ohph8Iez6 quie#phooCeu2lohm5shaPaer +eTh5AechaexieToh9ez5eeZ;e nuloh1ico0Nool:eGaig@ae9No OVahh2OhNgahtu8iethaR@i7o ouFai8ahP@eil4Ieh5le5ipu5 +eeT4tahW0ieng9fe?i5auM3ie seet0ohc4aiJei]koiGha2zu% iuh@oh4eix0Vuphi?o,hei9me +loh0Aeph=eix(ohghe6chee3z ahgh2eifiew8dahG_aeph8woo oe!B4iasaeHo`ungie3taekoh +cei!c age 是一个简单的、易于使用的工具,允许你用一个密码来加密和解密文件。 + +![](https://img.linux.net.cn/data/attachment/album/202107/18/102604m808ppq4ddd8w910.jpg) + +文件的保护和敏感文档的安全加密是用户长期以来关心的问题。即使越来越多的数据被存放在网站和云服务上,并由具有越来越安全和高强度密码的用户账户来保护,但我们能够在自己的文件系统中存储敏感数据仍有很大的价值,特别是我们能够快速和容易地加密这些数据时。 + +[age][2] 能帮你这样做。它是一个小型且易于使用的工具,允许你用一个密码加密一个文件,并根据需要解密。 + +### 安装 age + +`age` 可以从众多 Linux 软件库中 [安装][3]。 + +在 Fedora 上安装它: + +``` +$ sudo dnf install age -y +``` + +在 macOS 上,使用 [MacPorts][4] 或 [Homebrew][5] 来安装。在 Windows 上,使用 [Chocolatey][6] 来安装。 + +### 用 age 加密和解密文件 + +`age` 可以用公钥或用户自定义密码来加密和解密文件。 + +#### 在 age 中使用公钥 + +首先,生成一个公钥并写入 `key.txt` 文件: + +``` +$ age-keygen -o key.txt +Public key: age16frc22wz6z206hslrjzuv2tnsuw32rk80pnrku07fh7hrmxhudawase896m9 +``` + +### 使用公钥加密 + +要用你的公钥加密一个文件: + +``` +$ touch mypasswds.txt | age -r \ + ageage16frc22wz6z206hslrjzuv2tnsuw32rk80pnrku07fh7hrmxhudawase896m9 \ + > mypass.tar.gz.age +``` + +在这个例子中,我使用生成的公钥加密文件 `mypasswds.txt`,保存在名为 `mypass.tar.gz.age` 的加密文件中。 + +### 用公钥解密 + +如需解密加密文件,使用 `age` 命令和 `--decrypt` 选项: + +``` +$ age --decrypt -i key.txt -o mypass.tar.gz mypass.tar.gz.age +``` + +在这个例子中,`age` 使用存储在 `key.text` 中的密钥,并解密了我在上一步创建的加密文件。 + +### 使用密码加密 + +不使用公钥的情况下对文件进行加密被称为对称加密。它允许用户设置密码来加密和解密一个文件。要做到这一点: + +``` +$ age --passphrase --output mypasswd-encrypted.txt mypasswd.txt +Enter passphrase (leave empty to autogenerate a secure one): +Confirm passphrase: +``` + +在这个例子中,`age` 提示你输入一个密码,它将通过这个密码对输入文件 `mypasswd.txt` 进行加密,并生成加密文件 `mypasswd-encrypted.txt`。 + +### 使用密码解密 + +如需将用密码加密的文件解密,可以使用 `age` 命令和 `--decrypt` 选项: + +``` +$ age --decrypt --output passwd-decrypt.txt mypasswd-encrypted.txt +``` + +在这个例子中,`age` 提示你输入密码,只要你提供的密码与加密时设置的密码一致,`age` 随后将 `mypasswd-encrypted.txt` 加密文件的内容解密为 `passwd-decrypt.txt`。 + +### 不要丢失你的密钥 + +无论你是使用密码加密还是公钥加密,你都_不能_丢失加密数据的凭证。根据设计,如果没有用于加密的密钥,通过 `age` 加密的文件是不能被解密的。所以,请备份你的公钥,并记住这些密码! + +### 轻松实现加密 + +`age` 是一个真正强大的工具。我喜欢把我的敏感文件,特别是税务记录和其他档案数据,加密到 `.tz` 文件中,以便以后访问。`age` 是用户友好的,使其非常容易随时加密。 + +-------------------------------------------------------------------------------- + +via: https://opensource.com/article/21/7/linux-age + +作者:[Sumantro Mukherjee][a] +选题:[lujun9972][b] +译者:[geekpi](https://github.com/geekpi) +校对:[turbokernel](https://github.com/turbokernel) + +本文由 [LCTT](https://github.com/LCTT/TranslateProject) 原创编译,[Linux中国](https://linux.cn/) 荣誉推出 + +[a]: https://opensource.com/users/sumantro +[b]: https://github.com/lujun9972 +[1]: https://opensource.com/sites/default/files/styles/image-full-size/public/lead-images/document_free_access_cut_security.png?itok=ocvCv8G2 (Scissors cutting open access to files) +[2]: https://github.com/FiloSottile/age +[3]: https://github.com/FiloSottile/age#installation +[4]: https://opensource.com/article/20/11/macports +[5]: https://opensource.com/article/20/6/homebrew-mac +[6]: https://opensource.com/article/20/3/chocolatey diff --git a/published/202107/20210708 Linux Mint 20.2 is Now Available With New Features and Tools.md b/published/202107/20210708 Linux Mint 20.2 is Now Available With New Features and Tools.md new file mode 100644 index 0000000000..2c4933f98f --- /dev/null +++ b/published/202107/20210708 Linux Mint 20.2 is Now Available With New Features and Tools.md @@ -0,0 +1,95 @@ +[#]: subject: (Linux Mint 20.2 is Now Available With New Features and Tools) +[#]: via: (https://news.itsfoss.com/linux-mint-20-2-release/) +[#]: author: (Ankush Das https://news.itsfoss.com/author/ankush/) +[#]: collector: (lujun9972) +[#]: translator: (lcf33) +[#]: reviewer: (wxy) +[#]: publisher: (wxy) +[#]: url: (https://linux.cn/article-13584-1.html) + +包含新功能和工具的 Linux Mint 20.2 已经发布 +====== + +>Linux Mint 20.2 是一次令人兴奋的升级,它有新的应用程序、更新提醒和桌面环境的升级。是时候升级了? + +![](https://i0.wp.com/news.itsfoss.com/wp-content/uploads/2021/07/linux-mint-20-2.jpg?w=1200&ssl=1) + +几周前,Linux Mint 20.2 beta 版 [发布][1]了。现在,Linux Mint 20.2 最终稳定版也发布了。 + +这个版本是基于 Ubuntu 20.04 的 LTS(长期支持版本),支持 2025 年截止。 + +来看下这个版本有什么新特性,以及如何获取它。 + +### Linux Mint 20.2: 有什么新特性? + +这个版本主要两点是增加了更新通知。该功能鼓励用户更新系统,以确保安全性。 + +该功能不像 [Windows 系统那样强制更新][2],但它会留意你多久没有更新系统,检查系统运行时间,然后提醒你更新。 +![][3] + +更棒的是,你可以配置更新通知。 + +其他主要升级还有:桌面环境 **Cinnamon 5**,新的**批量改名工具** Bulky,**用 Sticky Notes 取代 GNote** 作为默认笔记应用。 + +![][4] + +批量文件改名工具可以在所有桌面版本中使用,但不包括 Xfce。因为 Xfce 默认的文件管理器(Thunar)已经有该功能。 + +Cinnamon 5 不是很让人激动,不过有一些内在性能改进,并增加了限制内存使用的选项。 + +![][5] + +Sticky Notes 是用 GTK 3 开发的,支持 HiDPI,并提供了更多的功能。同时,与系统托盘整合得更好。 + +![][6] + +### 其他改进 + +在网络上共享文件的 [Warpinator 应用程序][7] 得到了一些升级,变得更有用。 + +其他桌面环境的升级包括 Xfce 4.16 和 MATE 1.24。除此之外,你还会发现一些细微的 UI 改进和错误修复。 + +特别是解决了 NVIDIA 显卡**对混合图形的支持**的问题,这对笔记本电脑用户来说是个好消息。 + +要了解更多变更详情,你可以参考任一桌面版本的 [官方公告][8]。 + +### 下载或升级至 Linux Mint 20.2 + +你可以直接在官方网站 [下载页面][9] 找到稳定版本。 + +- [下载 Linux Mint 20.2][9] + +如果已经安装了 Linux Mint 20 或者 20.1。你可以先检查所有可用更新,然后更新管理器会收到更新。 + +接下来,确保你做了备份(如果你想的话,可以使用 timeshift 工具),然后从**编辑**菜单种静茹更新管理器的系统升级选项,如下所示。 + +![][10] + +当你单击后,屏幕上会出现升级的提示。你也可以通过 [官方升级说明][11] 获得进一步帮助。 + +_你完成升级了吗?你对最新版本有什么看法?欢迎在下面的评论中分享你的想法。_ + +-------------------------------------------------------------------------------- + +via: https://news.itsfoss.com/linux-mint-20-2-release/ + +作者:[Ankush Das][a] +选题:[lujun9972][b] +译者:[lcf33](https://github.com/lcf33) +校对:[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://news.itsfoss.com/linux-mint-20-2-beta-release/ +[2]: https://news.itsfoss.com/linux-mint-updates-notice/ +[3]: https://i2.wp.com/news.itsfoss.com/wp-content/uploads/2021/06/linux-mint-update-reminder.png?w=494&ssl=1 +[4]: https://i0.wp.com/news.itsfoss.com/wp-content/uploads/2021/07/bulky-mint.png?w=570&ssl=1 +[5]: https://i2.wp.com/news.itsfoss.com/wp-content/uploads/2021/06/cinnamon-memory.png?w=800&ssl=1 +[6]: https://i2.wp.com/news.itsfoss.com/wp-content/uploads/2021/07/mint-sticky-notes-ui.png?resize=1568%2C937&ssl=1 +[7]: https://news.itsfoss.com/warpinator-android-app/ +[8]: https://blog.linuxmint.com/?p=4102 +[9]: https://linuxmint.com/download.php +[10]: https://i2.wp.com/news.itsfoss.com/wp-content/uploads/2021/07/mint-upgrade.png?w=533&ssl=1 +[11]: https://blog.linuxmint.com/?p=4111 diff --git a/published/202107/20210708 Write good examples by starting with real code.md b/published/202107/20210708 Write good examples by starting with real code.md new file mode 100644 index 0000000000..0815d4e4d4 --- /dev/null +++ b/published/202107/20210708 Write good examples by starting with real code.md @@ -0,0 +1,93 @@ +[#]: subject: "Write good examples by starting with real code" +[#]: via: "https://jvns.ca/blog/2021/07/08/writing-great-examples/" +[#]: author: "Julia Evans https://jvns.ca/" +[#]: collector: "lujun9972" +[#]: translator: "zepoch" +[#]: reviewer: "turbokernel" +[#]: publisher: "wxy" +[#]: url: "https://linux.cn/article-13595-1.html" + +从实际代码开始编写好的示例 +====== + +![](https://img.linux.net.cn/data/attachment/album/202107/18/231616z1hhcerhrk3wzwkr.jpg) + +当编写程序时,我花费了大量时间在编写好的示例上。我从未见过有人写过关于如何写出好的示例,所以我就写了一下如何写出一份好的示例。 + +基础思路就是从你写的真实代码开始,然后删除不相关的细节,使其成为一个独立的例子,而不是无中生有地想出一些例子。 + +我将会谈论两种示例:基于真实案例的示例和奇怪的示例 + +### 好的示例是真实的 + +为了说明为什么好的案例应该是真实的,我们就先讨论一个不真实的案例。假设我们在试图解释 Python 的 lambda 函数(这只是我想到的第一个概念)。你可以举一个例子,使用 `map` 和 lambda 来让一组数字变为原先的两倍。 + +``` +numbers = [1, 2, 3, 4] +squares = map(lambda x: x * x, numbers) +``` + +我觉得这个示例不是真实的,有如下两方面的原因: + + * 将一组数字作平方运算不是在真实的程序中完成的事,除非是欧拉项目或某种东西(更多的可能是针对列表的操作) + * `map` 在 Python 中并不常用,即便是做这个我也更愿意写 `[x*x for x in numbers]` + +一个更加真实的 Python lambdas 的示例是使用 `sort` 函数,就像这样: + +``` +children = [{"name": "ashwin", "age": 12}, {"name": "radhika", "age": 3}] +sorted_children = sorted(children, key=lambda x: x['age']) +``` + +但是这个示例是被精心设计的(为什么我们需要对这些孩子按照年龄进行排序呢?)。所以我们如何来做一个真实的示例呢? + +### 如何让你的示例真实起来:看你所写实际代码 + +我认为最简单的来生成一个例子的方法就是,不是凭空出现一个例子(就像我用那个`儿童`的例子),而只是从真正的代码开始! + +举一个例子吧,如果我要用 `sort.+key` 来编写一串 Python 代码,我会发现很多我按某个标准对列表进行排序的真实例子,例如: + + * `tasks.sort(key=lambda task: task['completed_time'])` + * `emails = reversed(sorted(emails, key=lambda x:x['receivedAt']))` + * `sorted_keysizes = sorted(scores.keys(), key=scores.get)` + * `shows = sorted(dates[date], key=lambda x: x['time']['performanceTime'])` + +在这里很容易看到一个规律——这些基本是按时间排序的!因此,你可以明白如何将按时间排序的某些对象(电子邮件、事件等)的简单实例轻松地放在一起。 + +### 现实的例子有助于“布道”你试图解释的概念 + +当我试图去解释一个想法(就好比 Python Lambdas)的时候,我通常也会试图说服读者,说这是值得学习的想法。Python lambdas 是如此的有用!当我去试图说服某个人 lambdas 是很好用的时候,让他想象一下 lambdas 如何帮助他们完成一项他们将要去做的任务或是以及一项他们以前做过的任务,对说服他会很有帮助。 + +### 从真实代码中提炼出示例可能需要很长时间 + +我给出如何使用 `lambda` 和 `sort` 函数的解释例子是十分简单的,它并不需要花费我很长时间来想出来,但是将真实的代码提炼出为一个独立的示例则是会需要花费很长的时间! + +举个例子,我想在这篇文章中融入一些奇怪的 CSS 行为的例子来说明创造一个奇怪的案例是十分有趣的。我花费了两个小时来解决我这周遇到的一个实际的问题,确保我理解 CSS 的实际情况,并将其变成一个小示例。 + +最后,它“仅仅”用了 [五行 HTML 和一点点的 CSS][1] 来说明了这个问题,看起来并不想是我花费了好多小时写出来的。但是最初它却是几百行的 JS/CSS/JavaScript,它需要花费很长时间来将所有的代码化为核心的很少的代码。 + +但我认为花点时间把示例讲得非常简单明了是值得的——如果有成百上千的人在读你的示例,你就节省了他们这么多时间! + +### 就这么多了! + +我觉得还有更多关于示例可以去讲的——几种不同类型的有用示例,例如: + + * 可以更多的改变人的思维而不是直接提供使用的惊喜读者的示例代码 + * 易于复制粘贴以用作初始化的示例 + +也许有一天我还会再写一些呢? :) + +-------------------------------------------------------------------------------- + +via: https://jvns.ca/blog/2021/07/08/writing-great-examples/ + +作者:[Julia Evans][a] +选题:[lujun9972][b] +译者:[zepoch](https://github.com/zepoch) +校对:[turbokernel](https://github.com/turbokernel) + +本文由 [LCTT](https://github.com/LCTT/TranslateProject) 原创编译,[Linux中国](https://linux.cn/) 荣誉推出 + +[a]: https://jvns.ca/ +[b]: https://github.com/lujun9972 +[1]: https://codepen.io/wizardzines/pen/0eda7725a46c919dcfdd3fa80aff3d41 diff --git a/published/202107/20210709 How to Install Zlib on Ubuntu Linux.md b/published/202107/20210709 How to Install Zlib on Ubuntu Linux.md new file mode 100644 index 0000000000..504121d831 --- /dev/null +++ b/published/202107/20210709 How to Install Zlib on Ubuntu Linux.md @@ -0,0 +1,70 @@ +[#]: subject: "How to Install Zlib on Ubuntu Linux" +[#]: via: "https://itsfoss.com/install-zlib-ubuntu/" +[#]: author: "Abhishek Prakash https://itsfoss.com/author/abhishek/" +[#]: collector: "lujun9972" +[#]: translator: "MjSeven" +[#]: reviewer: "wxy" +[#]: publisher: "wxy" +[#]: url: "https://linux.cn/article-13572-1.html" + +如何在 Ubuntu Linux 上安装 Zlib +====== + +![](https://img.linux.net.cn/data/attachment/album/202107/12/095552ndjee050i099j0j6.jpg) + +[Zlib][1] 是一个用于数据压缩的开源库。 + +作为使用者,你可能会遇到需要安装 zlib(或 zlib-devel 包)作为另一个应用程序的依赖项的情况。 + +但问题来了,如果你尝试在 Ubuntu 上安装 zlib,它会抛出 “unable to locate package zlib” 错误。 + +``` +sudo apt install zlib +Reading package lists... Done +Building dependency tree +Reading state information... Done +E: Unable to locate package zlib +``` + +为什么会看到这个 [Ubable to locate package 错误][2]呢?因为没有名为 zlib 的包。 + +如果你 [使用 apt search 命令][3],你会发现有几个包可以让你安装:zlib 1g 和 zlib 1g-dev。当你知道这些后,只需一个 `apt` 命令就可以安装它们。 + +### 在基于 Ubuntu 的 Linux 发行版上安装 Zlib + +打开终端,使用以下命令: + +``` +sudo apt install zlib1g +``` + +请记住 `g` 前面的字母是数字 `1`,而不是小写的字母 `L`。很多人在输入命令时都会犯这个错误。 + +另一个包,zlib 1g-dev 是开发包。只有在你需要时才安装它,否则你应该使用 zlib 1g 包。 + +``` +sudo apt install zlib1g-dev +``` + +你也可以 [Zlib 网站][1] 下载源代码并安装它。但是,除非你有充分的理由,否则我不推荐使用源代码方式来安装 zlib。例如,如果你需要最新或特定版本的 zlib,但该版本在发行版的仓库中不可用。 + +有趣的是,像安装 zlib 这样看似很小的东西可能会变得很麻烦,有两个原因:一个是不同的包名;另一个是包含“隐藏”数字 1,它与小写 L 混淆了。 + +我希望这个快速提示能帮助到你。随意在评论部分留下你的问题、建议或简单的一句 “thank you”。 + +-------------------------------------------------------------------------------- + +via: https://itsfoss.com/install-zlib-ubuntu/ + +作者:[Abhishek Prakash][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://itsfoss.com/author/abhishek/ +[b]: https://github.com/lujun9972 +[1]: https://zlib.net/ +[2]: https://itsfoss.com/unable-to-locate-package-error-ubuntu/ +[3]: https://itsfoss.com/apt-search-command/ \ No newline at end of file diff --git a/published/202107/20210712 Box64 Emulator Released for Arm64 Linux.md b/published/202107/20210712 Box64 Emulator Released for Arm64 Linux.md new file mode 100644 index 0000000000..6e7ba13f93 --- /dev/null +++ b/published/202107/20210712 Box64 Emulator Released for Arm64 Linux.md @@ -0,0 +1,64 @@ +[#]: subject: (Box64 Emulator Released for Arm64 Linux) +[#]: via: (https://news.itsfoss.com/box64-emulator-released/) +[#]: author: (Jacob Crume https://news.itsfoss.com/author/jacob/) +[#]: collector: (lujun9972) +[#]: translator: (zd200572) +[#]: reviewer: (wxy) +[#]: publisher: (wxy) +[#]: url: (https://linux.cn/article-13591-1.html) + +Box64 模拟器发布 Arm64 Linux 版本 +====== + +> 在 Box64 模拟器的帮助下,在 ARM 设备上运行 x64 Linux 程序。想试试吗? + +![](https://i2.wp.com/news.itsfoss.com/wp-content/uploads/2021/07/box64-arm.jpg?w=1200&ssl=1) + +[Box86][1] 是一个流行的 X86 模拟器,刚进行了一次巨大的升级。发布了 [Box64][2],也就是对应的 ARM64 版本。 + +可能你还不了解这个模拟器,Box64_86 允许你在 ARM 系统上运行 32 或 64 位的 X86/64 Linux 程序。换句话说,它能让你在树莓派或者 [树莓派替代品][3] 上运行 Linux 桌面程序。 + +幸运的是,现在我们有 Box86 和 Box64 的支持,无论你的 ARM 系统是什么类型。 + +### Box64 是什么? + +![][4] + +你可能听说过苹果的 Rosetta 2,它是一个翻译层,允许为老款 Mac(Intel X86 处理器)设计的应用程序在新的 M1(ARM 处理器)驱动的 Mac 上运行。Box64 与之类似,允许为 X86 设计的应用程序运行在 ARM Linux 设备上。 + +由于它的 Dynarec 模块,它能够做到这一点,同时又是 100% 开源的、免费的,而且速度惊人。它通过重新编译 ARM 程序来提升速度,这意味着和其他 ARM 原生应用一样快。 + +但是,即使 Box64 无法重新编译应用,它仍然可以使用即时模拟,也有令人印象深刻的结果。 + +许多树莓派用户很熟悉 Box86,这是一个大约一年前发布的类似程序。二者最大的区别是 Box86 只兼容 Arm32,而 Box64 只兼容 Arm64。 + +这就是 Box64,一个非常棒的兼容层,允许你在 ARM 电脑上运行 x86_64 应用。 + +### 总结 + +如果你问我认为 Box64 怎么样,我会说这是一个绝对的游戏规则改变者。在难以置信的性能和巨大的潜力之间,这个兼容层肯定会在未来的 ARM 电脑中扮演一个重要角色。 + +如果你想知道它的工作原理,以及如何开始使用它,请查看其 [GitHub 页面][5]。 + +就这样吧,现在你自己去潜入其中并测试吧。 + +你觉得 Box64 怎样?写下你的评论让我知道。 + +-------------------------------------------------------------------------------- + +via: https://news.itsfoss.com/box64-emulator-released/ + +作者:[Jacob Crume][a] +选题:[lujun9972][b] +译者:[zde200572](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/jacob/ +[b]: https://github.com/lujun9972 +[1]: http://github.com/ptitseb/box86 +[2]: http://github.com/ptitseb/box64 +[3]: https://itsfoss.com/raspberry-pi-alternatives/ +[4]: https://i2.wp.com/news.itsfoss.com/wp-content/uploads/2021/07/Box64Logo-1024x287-1.png?w=1024&ssl=1 +[5]: https://github.com/ptitseb/box64 diff --git a/published/202107/20210712 Converseen for Batch Processing Images on Linux.md b/published/202107/20210712 Converseen for Batch Processing Images on Linux.md new file mode 100644 index 0000000000..e06a5318db --- /dev/null +++ b/published/202107/20210712 Converseen for Batch Processing Images on Linux.md @@ -0,0 +1,101 @@ +[#]: subject: (Converseen for Batch Processing Images on Linux) +[#]: via: (https://itsfoss.com/converseen/) +[#]: author: (Abhishek Prakash https://itsfoss.com/author/abhishek/) +[#]: collector: (lujun9972) +[#]: translator: (geekpi) +[#]: reviewer: (wxy) +[#]: publisher: (wxy) +[#]: url: (https://linux.cn/article-13617-1.html) + +在 Linux 上批量处理图像的 Converseen +====== + +![](https://img.linux.net.cn/data/attachment/album/202107/25/215958jd5jl9q2jlzqvvg6.jpg) + +Converseen 是一个用于批量图像转换的自由开源软件。有了这个工具,你可以一次将多张图片转换成另一种格式、调整大小、改变它们的长宽比、旋转或翻转它们。 + +对于像我这样的人来说,这是一个很方便的工具,我必须处理多个不同大小的截图,但在上传到网站之前必须调整它们的大小。 + +批量转换工具在这种情况下有很大的帮助。这可以在 Linux 命令行中用不错的 [ImageMagick][1] 来完成,但在这里使用 GUI 工具要容易得多。实际上,Converseen 在基于 Qt 的图形用户界面下使用 ImageMagick。 + +### 用 Converseen 批量处理图像 + +你可以用 [Converseen][2] 通过鼠标点击来转换、调整大小、旋转和翻转多个图像。 + +你有很多支持批量转换的选项。你可以在你的选择中添加更多的图片,或者删除其中的一些。你可以选择只转换你选择的几张图片。 + +在调整图像大小时,你可以选择保持长宽比。请记住,在宽度和高度中,你最后改变/输入的那个是控制长宽比的那个。所以,如果你想在保持长宽比的情况下调整大小,但要根据宽度来调整,不要修改高度栏。 + +![][3] + +你也可以选择将转换后的图像以不同的名称保存在同一目录或其他位置,也可以覆盖现有的图像。 + +你不能添加文件夹,但你可以一次选择并添加多个图像。 + +你可以将图像转换为多种格式,如 JPEG、JPG、TIFF、SVG 等。 + +在改变格式的同时,还有一个选项可以给透明背景以某种颜色。你还可以设置压缩级别的质量。 + +![][4] + +Converseen 还可以导入 PDF 文件,并将整个 PDF 或其中的一部分转换为图像。然而,在 Ubuntu 21.04 中,每次我试图转换一个 PDF 文件时,它就会崩溃。 + +### 在 Linux 上安装 Converseen + +Converseen 是一个流行的应用。它在大多数 Linux 发行版仓库中都有。 + +你可以在你的发行版的软件中心搜索到它: + +![][5] + +当然,你也可以使用你的发行版的包管理器通过命令行来安装它。 + +在基于 Debian 和 Ubuntu 的发行版上,使用: + +``` +sudo apt install converseen +``` + +在 Fedora 上,使用: + +``` +sudo dnf install converseen +``` + +在 Arch 和 Manjaro 上,使用: + +``` +sudo pacman -Sy converseen +``` + +Converseen 也可在 Windows 和 FreeBSD 下使用。你可以在项目网站的下载页面获得相关说明。 + +- [下载 Converseen][6] + +它的源码可在 GitHub 仓库 [获取][7]。 + +如果你正在寻找一个更简单的方法来调整一张图片的大小,你可以使用这个巧妙的技巧,[在 Nautilus 文件管理器中用右键菜单调整图片大小和旋转图片][8]。 + +总的来说,Converseen 是一个有用的用于批量图像转换的 GUI 工具。它并不完美,但在大多数情况下是有用的。你曾经使用过 Converseen 或者你使用类似的工具吗?你对它的体验如何? + +-------------------------------------------------------------------------------- + +via: https://itsfoss.com/converseen/ + +作者:[Abhishek Prakash][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/abhishek/ +[b]: https://github.com/lujun9972 +[1]: https://imagemagick.org/index.php +[2]: https://converseen.fasterland.net/ +[3]: https://i1.wp.com/itsfoss.com/wp-content/uploads/2021/07/converseen-interface.png?resize=800%2C400&ssl=1 +[4]: https://i1.wp.com/itsfoss.com/wp-content/uploads/2021/07/converseen-features-overview_copy.png?resize=800%2C497&ssl=1 +[5]: https://i2.wp.com/itsfoss.com/wp-content/uploads/2021/07/install-converseen-linux.jpeg?resize=800%2C527&ssl=1 +[6]: https://converseen.fasterland.net/download/ +[7]: https://github.com/Faster3ck/Converseen +[8]: https://itsfoss.com/resize-images-with-right-click/ diff --git a/published/202107/20210712 What is XML.md b/published/202107/20210712 What is XML.md new file mode 100644 index 0000000000..1841c743ea --- /dev/null +++ b/published/202107/20210712 What is XML.md @@ -0,0 +1,132 @@ +[#]: subject: "What is XML?" +[#]: via: "https://opensource.com/article/21/7/what-xml" +[#]: author: "Seth Kenlon https://opensource.com/users/seth" +[#]: collector: "lujun9972" +[#]: translator: "amwps290" +[#]: reviewer: "wxy" +[#]: publisher: "wxy" +[#]: url: "https://linux.cn/article-13624-1.html" + +什么是 XML? +====== + +> 了解一下 XML 吧,它是一种严格但灵活的标记语言,无论是在文档还是图像方面应用都十分广泛。 + +![](https://img.linux.net.cn/data/attachment/album/202107/28/082605rhju4ckqez0zvcwc.jpg) + +XML 是一种分层的标记语言。它使用打开和关闭标签来定义数据,它常用来存储和交换数据,而且由于它极大的灵活性,不论是在 [文档][2] 还是 [图像][3] 中都用的非常多。 + +这里是一个 XML 文档的例子: + +``` + +    +    +      Fedora +      8 +      Werewolf +    + +    +      Slackware +      12.1 +      +        Tux +        Bob Dobbs +      +    +        + +``` + +阅读这个示例 XML,你可能会发现这个 XML 的格式具有直观的特性。 无论你是否熟悉这个文档的主题,你都可能理解本文档中的数据。 这部分原因是因为 XML 被认为是冗长的。 它使用了很多标签,标签可以有很长的描述性名称,并且数据以分层的方式排序,这有助于解释数据之间的关系。 你可能从这个示例中了解到 Fedora 发行版和 Slackware 发行版是两个不同且不相关的 Linux 发行版,因为每个实例都“包含”在自己独立的 `` 标签中。 + +XML 也非常灵活。 与 HTML 不同,它没有预定义的标签列表。 你可以自由创建你需要表示任何数据结构的标签。 + +### XML 的组成 + +数据的存在为了读取,当计算机“读取”数据时,该过程称为 _解析_。 再次使用示例 XML 数据,以下是大多数 XML 解析器认为重要的术语。 + + * **文档**:`` 标签标记文档的开始, `` 标签标记文档的结束。 + * **节点**:``、``、`` 这些都是节点,在解析术语中,节点是包含其他标签的标签。 + * **元素**:像 `Fedora` 和 `Tux` 这些都是元素。从第一个`<`开始,到最后一个 `>` 结束是一个元素。 + * **内容**:在两个元素标签之间的数据被称之为内容,在第一个 `` 标签中,`Fedora` 字符串就是一个内容。 + +### XML 模式 + +XML 文档中的标签和标签继承性称为 _模式_。 + +一些模式是随意组成的(例如,本文中的示例 XML 代码纯粹是即兴创作的),而其他模式则由标准组织严格定义。 例如,可缩放矢量图形(SVG)模式 [由 W3C 定义][4],而 [DocBook 模式][5] 由 Norman Walsh 定义。 + +模式强制执行一致性。 最基本的模式通常也是最严格的。 在我的示例 XML 代码中,将发行版名称放在 `` 节点中是没有意义的,因为文档的隐含模式清楚地表明 `mascot` 必须是发行版的“子”元素。 + +### 数据对象模型(DOM) + +如果你必须不断地描述标签和位置(例如,“系统部分中的 Linux 部分中第二个发行版标签的名称标签”),那么谈论 XML 会让人感到困惑,因此解析器使用文档对象模型(DOM)的概念来表示 XML 数据。 DOM 将 XML 数据放入一种“家谱”结构中,从根元素(在我的示例 XML 中,即 `os` 标记)开始并包括路径上的每个标记。 + +![Document Object Model][6] + +这种相同的 XML 数据结构可以表示为路径,就像 Linux 系统中的文件或互联网上网页的位置一样。 例如,`` 标签的路径可以表示为 `//os/linux/distribution/slackware/mascot`。 + +两个 `` 标签可以被表示为 `//os/linux/distribution` ,因为这里有两个发行版的节点,因此一个解析器可以直接将两个节点的内容载入到一个数组中,可以进行查询。 + +### 严格的 XML + +XML 也以严格而著称。 这意味着大多数应用程序被设计为在遇到 XML 错误时就会故意失败。 这听起来可能有问题,但这是开发人员最欣赏 XML 的事情之一,因为当应用程序试图猜测如何解决错误时,可能会发生不可预测的事情。 例如,在 HTML 定义明确之前,大多数 Web 浏览器都包含“怪癖模式”,因此当人们试图查看糟糕的 HTML 代码时,Web 浏览器却可以加载作者可能想要的内容。 结果非常难以预测,尤其是当一个浏览器的猜测与另一个浏览器不同时。 + +XML 通过在出现故意错误时失败而不允许这样做。 这让作者可以修复错误,直到它们生成有效的 XML。 因为 XML 是良好定义的,所以有许多应用程序的验证器插件以及像 `xmllint` 和 `xmlstarlet` 这样的独立命令来帮助你及早定位错误。 + +### 转换 XML + +因为 XML 通常用作数据交换,所以将 XML 转换为其他数据格式或其他 XML 模式是很常见的。 经典示例包括 XSLTProc、xmlto 和 [pandoc][8],但从技术上讲,还有许多其他应用程序或者至少程序的一部分就是在转换 XML。 + +事实上,LibreOffice 使用 XML 来布局其文字处理器和电子表格文档,因此无论何时你导出或 [从 LibreOffice 转换文件][9],你都在转换 XML。 + +[开源 EPUB 格式的电子书][10] 使用 XML,因此无论何时你 [将文档转换为 EPUB][11] 或从 EPUB 转换,你都在转换 XML。 + +Inkscape 是基于矢量的插图应用程序,它将其文件保存在 SVG 中,这是一种专为图形设计的 XML 模式。 任何时候你将 Inkscape 中的图像导出为 PNG 文件时,你都在转换 XML。 + +名单还可以一直继续下去。 XML 是一种数据存储格式,旨在确保你的数据,无论是画布上的点和线、图表上的节点,还是文档中的文字,都可以轻松准确地提取、更新和转换。 + +### 学习 XML + +编写 XML 很像编写 HTML。 感谢 Jay Nick 的辛勤工作,[在线提供免费且有趣的 XML 课程][3] 可以教你如何使用 XML 创建图形。 + +通常,探索 XML 所需的特殊工具很少。 由于 HTML 和 XML 之间的密切关系,你可以 [使用 Web 浏览器查看 XML][12]。 此外,[QXmlEdit][13]、[NetBeans][14] 和 [Kate][15] 等开源文本编辑器通过有用的提示、自动完成、语法验证等,使键入和阅读 XML 变得容易。 + +### 选择 XML + +XML 起初可能看起来有很多数据,但它与 HTML 并没有太大的不同(实际上,HTML 已经 [以 XHTML 的形式重新实现为 XML][16])。 XML 有一个独特的好处,即构成其结构的标签也恰好是元数据,提供有关其存储内容的信息。 精心设计的 XML 模式包含并描述你的数据,使用户能够一目了然并快速解析它,并使开发人员能够使用一些库 [快速解析][17]。 + +-------------------------------------------------------------------------------- + +via: https://opensource.com/article/21/7/what-xml + +作者:[Seth Kenlon][a] +选题:[lujun9972][b] +译者:[amwps290](https://github.com/amwps290) +校对:[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/browser_screen_windows_files.png?itok=kLTeQUbY "Computer screen with files or windows open" +[2]: https://opensource.com/article/17/9/docbook +[3]: https://opensource.com/article/17/5/coding-scalable-vector-graphics-make-steam +[4]: https://www.w3.org/TR/SVG11/ +[5]: http://docbook.org +[6]: https://opensource.com/sites/default/files/uploads/dom.jpg "Document Object Model" +[7]: https://creativecommons.org/licenses/by-sa/4.0/ +[8]: https://opensource.com/article/20/5/pandoc-cheat-sheet +[9]: https://opensource.com/article/21/3/libreoffice-command-line +[10]: https://opensource.com/education/15/11/ebook-open-formats +[11]: https://opensource.com/life/13/8/how-create-ebook-open-source-way +[12]: https://opensource.com/article/18/12/xml-browser +[13]: https://opensource.com/article/17/7/7-ways-handle-xml-qxmledit +[14]: https://opensource.com/article/20/12/netbeans +[15]: https://opensource.com/article/20/12/kate-text-editor +[16]: https://www.w3.org/TR/xhtml1/ +[17]: https://opensource.com/article/21/6/parsing-config-files-java diff --git a/published/202107/20210713 Use XMLStarlet to parse XML in your the Linux terminal.md b/published/202107/20210713 Use XMLStarlet to parse XML in your the Linux terminal.md new file mode 100644 index 0000000000..57c03d985a --- /dev/null +++ b/published/202107/20210713 Use XMLStarlet to parse XML in your the Linux terminal.md @@ -0,0 +1,232 @@ +[#]: subject: "Use XMLStarlet to parse XML in your the Linux terminal" +[#]: via: "https://opensource.com/article/21/7/parse-xml-linux" +[#]: author: "Seth Kenlon https://opensource.com/users/seth" +[#]: collector: "lujun9972" +[#]: translator: "zepoch" +[#]: reviewer: "wxy" +[#]: publisher: "wxy" +[#]: url: "https://linux.cn/article-13627-1.html" + +在命令行中使用 XMLStarlet 来解析 XML +====== + +> 借助终端上的 XML 工具包 XMLStarlet,你就是 XML 之星。 + +![](https://img.linux.net.cn/data/attachment/album/202107/29/091327pgssat1oglrzs73z.jpg) + +学习解析 XML 通常被认为是一件复杂的事情,但它不一定是这样。[XML 是高度严格结构化的][2],所以也是相对来说可预测的。也有许多其他工具可以帮助你使这项工作易于管理。 + +我最喜欢的 XML 实用程序之一是 [XMLStarlet][3],这是一个用于终端的 XML 工具包,借助这个 XML 工具包,你可以验证、解析、编辑、格式化和转换 XML 数据。XMLStarLet 是个相对较小的命令,但浏览 XML 却充满潜力,因此本文演示了如何使用它来查询 XML 数据。 + +### 安装 + +XMLStarLet 默认安装在 CentOS、Fedora,和许多其他现代 Linux 发行版上,所以你可以打开终端,输入 `xmlstarlet` 来访问它。如果 XMLStarLet 还没有被安装,你的操作系统则会为你安装它。 + +或者,你可以用包管理器安装 `xmlstarlet`: + +``` +$ sudo dnf install xmlstarlet +``` + +在 macOS 上,可以使用 [MacPorts][4] 或 [Homebrew][5]。在 Windows 上,可以使用 [Chocolatey][6]。 + +如果都失败了,你可以从 [Sourceforge 上的源代码][7] 手动安装它。 + +### 用 XMLStarlet 解析 XML + +有许多工具可以帮助解析和转换 XML 数据,包括允许你 [编写自己的解析器][8] 的软件库,和复杂的命令,如 `fop` 和 `xsltproc`。不过有时你不需要处理 XML 数据;你只需要一个方便的方法从 XML 数据中来提取、更新或验证重要数据。对于随手的 XML 交互,我使用 `xmlstarlet`,这是常见的处理 XML任务的一个典型的“瑞士军刀”式应用。通过运行 `--help` 命令,你可以看到它提供哪些选项: + +``` +$ xmlstarlet --help +Usage: xmlstarlet [] [] +where is one of: + ed (or edit) - Edit/Update XML document(s) + sel (or select) - Select data or query XML document(s) (XPATH, etc) + tr (or transform) - Transform XML document(s) using XSLT + val (or validate) - Validate XML document(s) (well-formed/DTD/XSD/RelaxNG) + fo (or format) - Format XML document(s) + el (or elements) - Display element structure of XML document + c14n (or canonic) - XML canonicalization + ls (or list) - List directory as XML +[...] +``` + +你可以通过在这些子命令的末尾附加 `-help` 来获得进一步的帮助: + + +``` +$ xmlstarlet sel --help + -Q or --quiet - do not write anything to standard output. + -C or --comp - display generated XSLT + -R or --root - print root element <xsl-select> + -T or --text - output is text (default is XML) + -I or --indent - indent output +[...] +``` + +#### 用 sel 命令选择数据 + +可以使用 `xmlstarlet select`(简称 `sel`)命令查看 XML 格式的数据。下面是一个简单的 XML 文档: + +``` + + + + + + Fedora + 7 + Moonshine + + Live + Fedora + Everything + + + + + Fedora Core + 6 + Zod + + + + + +``` + +在 XML 文件中查找数据时,你的第一个任务是关注要探索的节点。如果知道节点的路径,请使用 `-value of` 选项指定完整路径。你越早浏览 [文档对象模型][9](DOM)树,就可以看到更多信息: + +``` +$ xmlstarlet select --template \ + --value-of /xml/os/linux/distribution \ + --nl myfile.xml + Fedora + 7 + Moonshine + + Live + Fedora + Everything + + Fedora Core + 6 + Zod +``` + +`--nl` 代表“新的一行”,它插入大量的空白,以确保在输入结果后,终端在新的一行显示。我已经删除了样本输出中的一些多余空间。 + +通过进一步深入 DOM 树来凝聚关注点: + +``` +$ xmlstarlet select --template \ + --value-of /xml/os/linux/distribution/name \ + --nl myfile.xml +Fedora +Fedora Core +``` + +#### 条件选择 + +用于导航和解析 XML 的最强大工具之一被称为 XPath。它规范了 XML 搜索中使用的语法,并从 XML 库调用函数。XMLStarlet 能够解析 XPath 表达式,因此可以使用 XPath 函数来有条件的进行选择。XPath 具有丰富的函数,[由 W3C 提供了详细文档][10],但我觉得 [Mozilla 的 XPath 文档][11] 更简洁。 + +可以使用方括号作为测试函数,将元素的内容与某个值进行比较。下面是对 `` 元素的值的测试,它仅返回与特定匹配相关联的版本号。 + +想象一下,示例 XML 文件包含以 1 开头的所有 Fedora 版本。要查看与旧名称 “Fedora Core” 关联的所有版本号(该项目从版本 7 开始删除了名称中的 “Core”),请执行以下操作: + +``` +$ xmlstarlet sel --template \ + --value-of '/xml/os/linux/distribution[name = "Fedora Core"]/release' \ + --nl myfile.xml +6 +5 +4 +3 +2 +1 +``` + +通过将路径的 `--value-of` 更改为 `/xml/os/linux/distribution[name=“Fedora Core”]/codename`,你便可以查看这些版本的所有代号。 + +### 匹配路径和获取目标值 + +将 XML 标记视为节点的一个好处是,一旦找到节点,就可以将其视为当前的数据的“目录”。它不是一个真正的目录,至少不是文件系统意义上的目录,但它是一个可以查询的数据集合。为了帮助你将目标和“里面”的数据分开,XMLStarlet 把你试图用 `--match` 选项匹配的内容和用 `--value-of` 选项匹配的数据值进行了区分。 + +假设你知道 `` 节点包含几个元素。这就是你的目标节点。一旦到了这里,就可以使用 `--value-of` 指定想要哪个元素的值。要查看所有元素,可以使用点(`.`)来代表当前位置: + +``` +$ xmlstarlet sel --template \ + --match '/xml/os/linux/distribution/spin' \ + --value-of '.' --nl myfile.xml \ +Live +Fedora +Everything +``` + +与浏览 DOM 一样,可以使用 XPath 表达式来限制返回数据的范围。在本例中,我使用 `last()` 函数来检索 `spin` 节点中的最后一个元素: + +``` +$ xmlstarlet select --template \ + --match '/xml/os/linux/distribution/spin' \ + --value-of '*[last()]' --nl myfile.xml +Everything +``` + +在本例中,我使用 `position()` 函数选择 `spin` 节点中的特定元素: + +``` +$ xmlstarlet select --template \ + --match '/xml/os/linux/distribution/spin' \ + --value-of '*[position() = 2]' --nl myfile.xml +Fedora +``` + +`--match` 和 `--value` 选项可以重叠,因此如何将它们一起使用取决于你自己。对于示例 XML,这两个表达式执行的是相同的操作: + +``` +$ xmlstarlet select --template \ + --match '/xml/os/linux/distribution/spin' \ + --value-of '.' \ + --nl myfile.xml +Live +Fedora +Everything + +$ xmlstarlet select --template \ + --match '/xml/os/linux/distribution' \ + --value-of 'spin' \ + --nl myfile.xml +Live +Fedora +Everything +``` + +### 熟悉 XML + +XML 有时看起来过于冗长和笨拙,但为与之交互和构建的工具却总是让我吃惊。如果你想要好好使用 XML,那么 XMLStarlet 可能是一个很好的切入点。下次要打开 XML 文件查看其结构化数据时,请尝试使用 XMLStarlet,看看是否可以查询这些数据。当你对 XML 越熟悉时,它就越能作为一种健壮灵活的数据格式而为你服务。 + +-------------------------------------------------------------------------------- + +via: https://opensource.com/article/21/7/parse-xml-linux + +作者:[Seth Kenlon][a] +选题:[lujun9972][b] +译者:[zepoch](https://github.com/zepoch) +校对:[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/linux_penguin_green.png?itok=ENdVzW22 "Penguin with green background" +[2]: https://opensource.com/article/21/6/what-xml +[3]: https://en.wikipedia.org/wiki/XMLStarlet +[4]: https://opensource.com/article/20/11/macports +[5]: https://opensource.com/article/20/6/homebrew-mac +[6]: https://opensource.com/article/20/3/chocolatey +[7]: http://xmlstar.sourceforge.net +[8]: https://opensource.com/article/21/6/parsing-config-files-java +[9]: https://opensource.com/article/21/6/what-xml#dom +[10]: https://www.w3.org/TR/1999/REC-xpath-19991116 +[11]: https://developer.mozilla.org/en-US/docs/Web/XPath/Functions + diff --git a/published/202107/20210714 Getting Started with Podman on Fedora.md b/published/202107/20210714 Getting Started with Podman on Fedora.md new file mode 100644 index 0000000000..cef3a1fcb2 --- /dev/null +++ b/published/202107/20210714 Getting Started with Podman on Fedora.md @@ -0,0 +1,158 @@ +[#]: subject: (Getting Started with Podman on Fedora) +[#]: via: (https://fedoramagazine.org/getting-started-with-podman-in-fedora/) +[#]: author: (Yazan Monshed https://fedoramagazine.org/author/yazanalmonshed/) +[#]: collector: (lujun9972) +[#]: translator: (geekpi) +[#]: reviewer: (wxy) +[#]: publisher: (wxy) +[#]: url: (https://linux.cn/article-13615-1.html) + +如何在 Fedora 上使用 Podman +====== + +![][1] + +[Podman][2] 是一个无守护程序的容器引擎,用于在你的 Linux 系统上开发、管理和运行 OCI 容器。在这篇文章中,我们将介绍 Podman 以及如何用 nodejs 构建一个小型应用来使用它。该应用将是非常简单和干净的。 + +### 安装 Podman + +Podman 的命令就与 [docker][3] 相同,如果你已经安装了 Docker,只需在终端输入 `alias docker=podman`。 + +在 Fedora 中,Podman 是默认安装的。但是如果你因为任何原因没有安装,你可以用下面的命令安装它: + +``` +sudo dnf install podman +``` + +对于 Fedora [silverblue][4] 用户,Podman 已经安装在你的操作系统中了。 + +安装后,运行 “hello world” 镜像,以确保一切正常: + +``` +podman pull hello-world +podman run hello-world +``` + +如果一切运行良好,你将在终端看到以下输出: + +``` +Hello from Docker! +This message shows that your installation appears to be working correctly. + To generate this message, Docker took the following steps: + 1.The Docker client contacted the Docker daemon. + 2.The Docker daemon pulled the "hello-world" image from the Docker Hub. (amd64) + 3.The Docker daemon created a new container from that image which runs the executable that produces the output you are currently reading. + 4.The Docker daemon streamed that output to the Docker client, which sent it to your terminal. + To try something more ambitious, you can run an Ubuntu container with: + $ docker run -it ubuntu bash + Share images, automate workflows, and more with a free Docker ID: + https://hub.docker.com/ + For more examples and ideas, visit: + https://docs.docker.com/get-started/ +``` + +### 简单的 Nodejs 应用 + +首先,我们将创建一个文件夹 `webapp`,在终端输入以下命令: + +``` +mkdir webapp && cd webapp +``` + +现在创建文件 `package.json`,该文件包括项目运行所需的所有依赖项。在文件 `package.json` 中复制以下代码: + +``` +{ + "dependencies": { + "express": "*" + }, + "scripts": { + "start": "node index.js" + } +} +``` + +创建文件 `index.js`,并在其中添加以下代码: + +``` +const express = require('express') + +const app = express(); + +app.get('/', (req, res)=> { + res.send("Hello World!") +}); +app.listen(8081, () => { + console.log("Listing on port 8080"); +}); +``` + +你可以从 [这里][5] 下载源代码。 + +### 创建 Dockerfile + +首先,创建一个名为 `Dockerfile` 的文件,并确保第一个字符是大写,而不是小写,然后在那里添加以下代码: + +``` +FROM node:alpine +WORKDIR usr/app +COPY ./ ./ +RUN npm install +CMD ["npm", "start"] +``` + +确保你在 `webapp` 文件夹内,然后显示镜像,然后输入以下命令: + +``` +podman build . +``` + +确保加了 `.`。镜像将在你的机器上创建,你可以用以下命令显示它: + +``` +podman images +``` + +最后一步是输入以下命令在容器中运行该镜像: + +``` +podman run -p 8080:8080 +``` + +现在在你的浏览器中打开 `localhost:8080`,你会看到你的应用已经工作。 + +### 停止和删除容器 + +使用 `CTRL-C` 退出容器,你可以使用容器 ID 来删除容器。获取 ID 并使用这些命令停止容器: + +``` +podman ps -a +podman stop +``` + +你可以使用以下命令从你的机器上删除镜像: + +``` +podman rmi +``` + +在 [官方网站][2] 上阅读更多关于 Podman 和它如何工作的信息。 + +-------------------------------------------------------------------------------- + +via: https://fedoramagazine.org/getting-started-with-podman-in-fedora/ + +作者:[Yazan Monshed][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/yazanalmonshed/ +[b]: https://github.com/lujun9972 +[1]: https://fedoramagazine.org/wp-content/uploads/2020/06/Get_Started_w_Podman_on_Fedora-816x345.jpg +[2]: https://podman.io/ +[3]: https://www.docker.com/ +[4]: https://silverblue.fedoraproject.org/ +[5]: https://github.com/YazanALMonshed/webapp diff --git a/published/202107/20210714 How different programming languages read and write data.md b/published/202107/20210714 How different programming languages read and write data.md new file mode 100644 index 0000000000..544a76741a --- /dev/null +++ b/published/202107/20210714 How different programming languages read and write data.md @@ -0,0 +1,269 @@ +[#]: subject: "How different programming languages read and write data" +[#]: via: "https://opensource.com/article/21/7/programming-read-write" +[#]: author: "Alan Smithee https://opensource.com/users/alansmithee" +[#]: collector: "lujun9972" +[#]: translator: "MjSeven" +[#]: reviewer: "wxy" +[#]: publisher: "wxy" +[#]: url: "https://linux.cn/article-13599-1.html" + +不同的编程语言是如何读写数据的 +====== + +> 每种编程语言都有其独特的完成任务的方式,这也说明了为什么有这么多语言可供选择。 + +![](https://img.linux.net.cn/data/attachment/album/202107/20/065355dfr3f1zmf7fpzmw7.jpg) + +在 Jim Hall 的《[不同的编程语言如何完成相同的事情][2]》文章中,他演示了 13 种不同的语言如何使用不同的语法来完成同一个任务。经验是,编程语言往往有很多相似之处。一旦你了解了一种编程语言,你就可以通过理解它的语法和结构来学习另一种。 + +本着同样的精神,Jim 的文章比较了不同编程语言如何读写数据。无论数据来自配置文件还是用户创建的文件,在存储设备上处理数据都是程序员的常见任务。以这种方式涵盖所有编程语言是不切实际的,但最近的 Opensource.com 系列文章提供了对这些编程语言采用的不同方法的深入了解: + + * [C][3] + * [C++][4] + * [Java][5] + * [Groovy][6] + * [Lua][7] + * [Bash][8] + * [Python][9] + +### 读写数据 + +用计算机读写数据的过程和你在现实生活中读写数据的过程类似。要访问书中的数据,你首先要打开它,然后阅读单词或将生词写入书中,然后合上书。 + +当程序需要从文件中读取数据时,你向程序传入一个文件位置,然后计算机将该数据读入内存中并解析它。同样,当程序需要将数据写入文件时,计算机会将新数据放入系统的内存写入缓冲区,然后将其同步到存储设备上的文件中。 + +下面是这些操作的一些伪代码: + + 1. 在内存中加载文件。 + 2. 读取文件内容,或将数据写入文件。 + 3. 关闭文件。 + +### 从文件中读取数据 + +从 Opensource.com 系列文章的语言中,你可以看到读取文件的三种趋势。 + +#### C + +在 C 语言中,打开文件可能涉及检索单个字符(直到 `EOF` 指示符,表示文件结束)或一个数据块,具体取决于你的需求和方法。根据你的目标,它可能感觉像一个主要是手工的过程,但这正是其他语言所模仿的。 + +``` +FILE *infile; +int ch; + +infile = fopen(argv[1], "r"); + +do { + ch = fgetc(infile); + if (ch != EOF) { + printf("%c", ch); + } + } while (ch != EOF); + +fclose(infile); +``` + +你还可以选择将文件的某些部分加载到系统缓冲区中,然后在缓冲区外工作。 + + +``` +FILE *infile; +char buffer[300]; + +infile = fopen(argv[1], "r"); + +while (!feof(infile)) { + size_t buffer_length; + buffer_length = fread(buffer, sizeof(char), 300, infile); +} + +printf("%s", buffer); +fclose(infile); +``` + +#### C++ + +C++ 简化了一些步骤,允许你将数据解析为字符串。 + +``` +std::string sFilename = "example.txt"; + +std::ifstream fileSource(sFilename); +std::string buffer; + +while (fileSource >> buffer) { + std::cout << buffer << std::endl; +} +``` + +#### Java + +Java 和 Groovy 类似于 C++。它们使用名为 `Scanner` 的类来设置数据流或对象,这样就会包含你选择的文件内容。你可以通过标记(字节、行、整数等)扫描文件。 + +``` +File myFile = new File("example.txt"); + +Scanner myScanner = new Scanner(myFile); + while (myScanner.hasNextLine()) { + String line = myScanner.nextLine(); + System.out.println(line); + } + +myScanner.close(); +``` + +#### Groovy + + +``` +def myFile = new File('example.txt') + +def myScanner = new Scanner(myFile) + while (myScanner.hasNextLine()) { + def line = myScanner.nextLine() + println(line) + } + +myScanner.close() +``` + +#### Lua + +Lua 和 Python 进一步抽象了整个过程。你不必有意识地创建数据流,你只需给一个变量赋值为 `open` 函数的返回值,然后解析该变量的内容。这种方式快速,最简且容易。 + +``` +myFile = io.open('example.txt', 'r') + +lines = myFile:read("*all") +print(lines) + +myFile:close() +``` + +#### Python + + +``` +f = open('example.tmp', 'r') + +for line in f: + print(line) + +f.close() +``` + +### 向文件中写入数据 + +就写代码来说,写入是读取的逆过程。因此,将数据写入文件的过程与从文件中读取数据基本相同,只是使用了不同的函数。 + +#### C + +在 C 语言中,你可以使用 `fputc` 函数将字符写入文件: + +``` +fputc(ch, outfile); +``` + +或者,你可以使用 `fwrite` 将数据写入缓冲区。 + +```c +fwrite(buffer, sizeof(char), buffer_length, outfile); +``` + +#### C++ + +因为 C++ 使用 `ifstream` 库为数据打开缓冲区,所以你可以像 C 语言那样将数据写入缓冲区(C++ 库除外)。 + +``` +std::cout << buffer << std::endl; +``` + +#### Java + +在 Java 中,你可以使用 `FileWriter` 类来创建一个可以写入数据的对象。它的工作方式与 `Scanner` 类非常相似,只是方向相反。 + +``` +FileWriter myFileWriter = new FileWriter("example.txt", true); +myFileWriter.write("Hello world\n"); +myFileWriter.close(); +``` + +#### Groovy + +类似地,Groovy 使用 `FileWriter`,但使用了稍微 “groovy” 的语法。 + +``` +new FileWriter("example.txt", true).with { + write("Hello world\n") + flush() +} +``` + +#### Lua + +Lua 和 Python 很相似,都使用名为 `open` 的函数来加载文件,`writer` 函数来写入数据,`close` 函数用于关闭文件。 + + +``` +myFile = io.open('example.txt', 'a') +io.output(myFile) +io.write("hello world\n") +io.close(myFile) +``` + +#### Python + +``` +myFile = open('example.txt', 'w') +myFile.write('hello world') +myFile.close() +``` + +### File 模式 + +许多语言在打开文件时会指定一个“模式”。模式有很多,但这是常见的定义: + + * **w** 表示写入 + * **r** 表示读取 + * **r+** 表示可读可写 + * **a** 表示追加 + +某些语言,例如 Java 和 Groovy,允许你根据用于加载文件的类来确定模式。 + +无论编程语言以何种方式来确定文件模式,你都需要确保你是在 _追加_ 数据,除非你打算用新数据覆盖文件。编程语言不像文件选择器那样,没有内置的提示来警告你防止数据丢失。 + +### 新语言和旧把戏 + +每种编程语言都有其独特完成任务的方式,这就是为什么有这么多语言可供选择。你可以而且应该选择最合适你的语言。但是,你一旦了解了编程的基本结构,你可以随意尝试其他语言,而不必担心不知道如何完成基本任务。通常情况下,实现目标的途径是相似的,所以只要你牢记基本概念,它们就很容易学习。 + +-------------------------------------------------------------------------------- + +via: https://opensource.com/article/21/7/programming-read-write + +作者:[Alan Smithee][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/alansmithee +[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 "Code going into a computer." +[2]: https://opensource.com/article/21/4/compare-programming-languages +[3]: https://opensource.com/article/21/3/file-io-c +[4]: https://opensource.com/article/21/3/ccc-input-output +[5]: https://opensource.com/article/21/3/io-java +[6]: https://opensource.com/article/21/4/groovy-io +[7]: https://opensource.com/article/21/3/lua-files +[8]: https://opensource.com/article/21/3/input-output-bash +[9]: https://opensource.com/article/21/6/reading-and-writing-files-python +[10]: http://www.opengroup.org/onlinepubs/009695399/functions/fopen.html +[11]: http://www.opengroup.org/onlinepubs/009695399/functions/fgetc.html +[12]: http://www.opengroup.org/onlinepubs/009695399/functions/printf.html +[13]: http://www.opengroup.org/onlinepubs/009695399/functions/fclose.html +[14]: http://www.opengroup.org/onlinepubs/009695399/functions/feof.html +[15]: http://www.opengroup.org/onlinepubs/009695399/functions/fread.html +[16]: http://www.google.com/search?hl=en&q=allinurl%3Adocs.oracle.com+javase+docs+api+file +[17]: http://www.google.com/search?hl=en&q=allinurl%3Adocs.oracle.com+javase+docs+api+string +[18]: http://www.google.com/search?hl=en&q=allinurl%3Adocs.oracle.com+javase+docs+api+system +[19]: http://www.google.com/search?hl=en&q=allinurl%3Adocs.oracle.com+javase+docs+api+filewriter \ No newline at end of file diff --git a/published/202107/20210716 Apps for daily needs part 1- web browsers.md b/published/202107/20210716 Apps for daily needs part 1- web browsers.md new file mode 100644 index 0000000000..6e1f9c7adf --- /dev/null +++ b/published/202107/20210716 Apps for daily needs part 1- web browsers.md @@ -0,0 +1,102 @@ +[#]: subject: (Apps for daily needs part 1: web browsers) +[#]: via: (https://fedoramagazine.org/apps-for-daily-needs-part-1-web-browsers/) +[#]: author: (Arman Arisman https://fedoramagazine.org/author/armanwu/) +[#]: collector: (lujun9972) +[#]: translator: (geekpi) +[#]: reviewer: (wxy) +[#]: publisher: (wxy) +[#]: url: (https://linux.cn/article-13625-1.html) + +满足日常需求的应用(一):Web 浏览器 +====== + +![][1] + +满足日常需求的重要应用之一是 Web 浏览器。这是因为上网是大多数人在电脑前进行的一项活动。本文将介绍一些你可以在 Fedora Linux 上使用的开源 Web 浏览器。你需要安装上述软件。本文提到的所有浏览器都已经在官方的 Fedora 软件库中提供。如果你不熟悉如何在 Fedora Linux 中添加软件包,请参阅我之前的文章 [安装 Fedora 34 工作站后要做的事情][4]。 + +### Firefox + +火狐Firefox是一个快速且注重隐私的浏览器,可以在许多设备上使用。它是由 [Mozilla][5] 创建的,是一个具有完整功能的浏览器,提供许多扩展。你可以为你的火狐浏览器添加许多强大的功能和有用的特性。它只使用适量的内存来创造一个流畅的体验,使你的电脑保持对其他任务的响应。你可以创建一个账户,让你在多个设备上共享配置,所以你不需要在每个设备上设置火狐浏览器。 + +![][6] + +火狐浏览器提供以下功能: + + * 隐私浏览模式 + * 阻止广告跟踪器 + * 密码管理器 + * 设备之间的同步 + * 画中画 + +关于火狐浏览器的更多信息可在此链接中找到:[https://www.mozilla.org/en-US/firefox][7] + +### GNOME Web + +GNOME Web 是 GNOME 桌面(Fedora 工作站的默认桌面环境)的一个浏览器。如果你使用 GNOME 作为默认桌面环境的 Fedora 工作站,它可能非常适合作为你的主浏览器。这个浏览器有一个简单、干净、漂亮的外观。GNOME Web 的功能比 Firefox 少,但对于普通用途来说已经足够了。 + +![][8] + +GNOME Web 提供了以下功能: + + * 隐身模式 + * GNOME 桌面集成 + * 内置广告拦截器 + * 智能跟踪预防 + +关于 GNOME Web 的更多信息可以在这个链接中找到: + +### Chromium + +Chromium 是一个来自 Chromium 项目的开源 Web 浏览器,它有一个极简的用户界面。它的外观与 Chrome 相似,因为它实际上是作为 Chrome 和其他几个浏览器的基础。许多人使用 Chromium 是因为他们已经习惯了 Chrome。 + +![][9] + +Chromium 提供以下功能: + + * 隐身模式 + * 扩展程序 + * 密码的自动填写 + +关于 Chromium 浏览器的更多信息可在此链接中找到: + +### qutebrowser + +这个浏览与上面提到的稍有不同,qutebrowser 是一个以键盘为中心的浏览器,具有精简的 GUI。因此,你不会发现通常在其他浏览器中的按钮,如返回、主页、重新加载等。相反,你可以用键盘输入命令来运行 qutebrowser 中的功能。它使用 Vim 风格的键绑定,所以它适合 Vim 用户。如果你有兴趣在上网时获得不同的体验,你应该试试这个浏览器。 + +![][10] + +qutebrowser 提供以下功能: + + * 广告屏蔽 + * 隐私浏览模式 + * 快速书签 + +关于 qutebrowser 浏览器的更多信息可在此链接中找到: + +### 总结 + +每个人在使用互联网时都有不同的需求,特别是在浏览方面。本文中提到的每个浏览器都有不同的功能。因此,请选择适合你日常需求和喜好的浏览器。如果你使用的是本文中提到的浏览器,请在评论中分享你的故事。如果你使用的是其他的浏览器,请说一下。希望这篇文章能帮助你选择在 Fedora 上满足你日常需求的浏览器。 + +-------------------------------------------------------------------------------- + +via: https://fedoramagazine.org/apps-for-daily-needs-part-1-web-browsers/ + +作者:[Arman Arisman][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/armanwu/ +[b]: https://github.com/lujun9972 +[1]: https://fedoramagazine.org/wp-content/uploads/2021/07/FedoraMagz-Apps-1-Browsers-2-816x345.jpg +[2]: https://unsplash.com/@brookecagle?utm_source=unsplash&utm_medium=referral&utm_content=creditCopyText +[3]: https://unsplash.com/s/photos/meeting-on-cafe-computer?utm_source=unsplash&utm_medium=referral&utm_content=creditCopyText +[4]: https://fedoramagazine.org/things-to-do-after-installing-fedora-34-workstation/ +[5]: https://www.mozilla.org/en-US/ +[6]: https://fedoramagazine.org/wp-content/uploads/2021/07/Browsers-Firefox-1-1024x707.png +[7]: https://www.mozilla.org/en-US/firefox/ +[8]: https://fedoramagazine.org/wp-content/uploads/2021/07/Browsers-Web-1024x658.png +[9]: https://fedoramagazine.org/wp-content/uploads/2021/07/Browsers-Chromium-1-1024x690.png +[10]: https://fedoramagazine.org/wp-content/uploads/2021/07/Browsers-qb-1024x687.png diff --git a/published/202107/20210719 Linux package managers- dnf vs apt.md b/published/202107/20210719 Linux package managers- dnf vs apt.md new file mode 100644 index 0000000000..30cee09b9e --- /dev/null +++ b/published/202107/20210719 Linux package managers- dnf vs apt.md @@ -0,0 +1,216 @@ +[#]: subject: (Linux package managers: dnf vs apt) +[#]: via: (https://opensource.com/article/21/7/dnf-vs-apt) +[#]: author: (Seth Kenlon https://opensource.com/users/seth) +[#]: collector: (lujun9972) +[#]: translator: (perfiffer) +[#]: reviewer: (wxy) +[#]: publisher: (wxy) +[#]: url: (https://linux.cn/article-13620-1.html) + +Linux 包管理器比较:dnf 和 apt +====== + +> 包管理器提供大致相同的功能:安装、管理和移除应用,但是它们还是有一些不一样的地方。 + +![](https://img.linux.net.cn/data/attachment/album/202107/27/083002sd5zzxu37yhiz6yc.jpg) + +[在 Linux 系统上获取一个应用][2] 有多种方式。例如,有新的 Flatpak 和容器方式,也有 DEB 和 RPM 这样一直以来经过考验的方式。 + +并没有一种通用的可以用于所有的操作系统的应用安装程序。如今,因为有无数的开发者发布软件,这导致了大部分的操作系统使用了应用商店(包括第一方和第三方)、拖放式安装,还有安装向导。不同的开发者对于他们发布的代码有不同的需求,这直接导致了他们所选择的安装方式的不同。 + +Linux 开创了一种通过命令行安装、管理、移除应用的包管理器的概念。`apt` 和 `dnf` 就是两种较为常见的包管理器。`apt` 命令是用来管理 DEB 格式的包,`dnf` 命令是用来管理 RPM 格式的包。这两种包管理器在理论上并不是完全互斥的,尽管在实际的实践中,Linux 发行版通常只会使用到其中的一种。理论上,这两种命令可以运行在同一个系统上,但是会造成安装包的重叠,版本控制也会更加困难,命令也会是冗余的。然而,如果你是在一个混合的 Linux 环境下工作,比如你的工作站运行的是一个发行版,同时需要与运行另外一种发行版的服务器进行交互,那么你最好同时掌握这两种包管理器。 + +### 搜索应用 + +当你通过包管理器安装一个应用时,你需要先知道包的名称。通常,应用的名称和包的名称是一样的。`dnf` 和 `apt` 验证要安装的包名的过程是完全相同的。 + +``` +$ sudo dnf search zsh +====== Name Exactly Matched: zsh ====== +zsh.x86_64 : Powerful interactive shell +[...] +``` + +使用 `apt`: + +``` +$ sudo apt search zsh +Sorting... Done +Full Text Search... Done +csh/stable 20110502-4+deb10u1 amd64 + Shell with C-like syntax + +ddgr/stable 1.6-1 all + DuckDuckGo from the terminal + +direnv/stable 2.18.2-2 amd64 + Utility to set directory specific environment variables + +draai/stable 20180521-1 all + Command-line music player for MPD +[...] +``` + +如果想通过 `apt` 更快的获取相关的搜索结果,你可以使用 [正则表达式][3]: + +``` +apt search ^zsh +Sorting... Done +Full Text Search... Done +zsh/stable 5.7.1-1 amd64 + shell with lots of features +[...] +``` + +### 查找应用程序包 + +有一些命令是与其它命令捆绑在一起的,都在一个包中。在这种情况下,你可以通过包管理器去了解哪个包提供了你需要的命令。`dnf` 和 `apt` 命令在如何搜索这类元数据上是有区别的。 + +使用 `dnf`: + +``` +$ sudo dnf provides pgrep +procps-ng-3.3.15-6.el8.x86_64 : System and process monitoring utilities +Repo : baseos +Matched from: +Filename : /usr/bin/pgrep +``` + +`apt` 命令使用子命令 `apt-file`。要使用 `apt-file`,你必须先安装它,然后提示它更新缓存: + +``` +$ sudo apt install apt-file +Reading package lists... Done +Building dependency tree +Reading state information... Done +The following additional packages will be installed: + libapt-pkg-perl libexporter-tiny-perl liblist-moreutils-perl libregexp-assemble-perl +The following NEW packages will be installed: + apt-file libapt-pkg-perl libexporter-tiny-perl liblist-moreutils-perl libregexp-assemble-perl +0 upgraded, 5 newly installed, 0 to remove and 14 not upgraded. +Need to get 297 kB of archives. +After this operation, 825 kB of additional disk space will be used. +Do you want to continue? [Y/n] y + +$ sudo apt-file update +[...] +``` + +你可以通过 `apt-file` 搜索命令。你可以使用此命令进行广泛的全局搜索,但假如你知道命令的执行路径,它会更准确: + +``` +$ sudo apt-file search /usr/bin/pgrep +pgreplay: /usr/bin/pgreplay               +procps: /usr/bin/pgrep +``` + +### 安装应用程序 + +使用`apt` 和 `dnf` 安装应用程序基本上是相同的: + +``` +$ sudo apt install zsh +``` + +使用 `dnf`,你可以使用同样的方式来安装一个包: + +``` +$ sudo dnf install zsh +``` + +许多基于 RPM 的发行版都具有组包安装的特性,它会将有时表面相关的应用程序收集到一个易于安装的目标中。例如,Fedora 中的 [Design Suite][4] 组包就包含流行的创意应用程序。那些想要某一个创意应用程序的艺术家可能也想要类似的应用程序,选择安装一整个组包一个简单而快速的方法,可以合理地开始建立一个数字工作室。你可以通过 `group list` 来查看可用的组包(使用 `-v` 来查看不带空格的组名): + +``` +$ sudo dnf group list -v +[...] +Available Groups: + Container Management (container-management) + RPM Development Tools (rpm-development-tools) + Design Suite (design-suite) + Development Tools (development) +[...] +``` + +使用 `group install` 子命令安装 RPM 组包: + +``` +$ sudo dnf group install design-suite +``` + +你可以使用 `@` 符号来减少输入: + +``` +$ sudo dnf install @design-suite +``` + +### 更新应用程序 + +使用包管理器的一个优点是,它知道所有已经安装的应用。这样你不必去寻找应用程序的更新版本。相反,你可以通过包管理器去获取更新的版本。 + +`dnf` 和 `apt` 使用的子命令略有不同。因为 `apt` 保存了一个需要定期更新的缓存信息,它使用 `upgrade` 子命令来更新应用程序: + +``` +$ sudo apt upgrade +``` + +相比之下,`dnf` 命令在你每次使用时都会更新元信息,所以 `update` 和 `upgrade` 子命令是可以互换的: + +``` +$ sudo dnf upgrade +``` + +这等同于: + +``` +$ sudo dnf update +``` + +### 移除应用程序 + +如果你曾经尝试在任何一个平台上手动删除一个应用程序,你就会知道,应用程序删除后,在硬盘上会残留各种文件,比如首选项文件、数据或图标。所以包管理器的另一个优点是,包管理器管理着包中安装的每一个文件,可以很方便的删除: + +``` +$ sudo dnf remove zsh +``` + +`remove` 子命令也适用于 `apt`: + +``` +$ sudo apt remove zsh +``` + +使用 `apt` 命令删除一个包并不会删除已修改的用户配置文件,以防你意外删除了包。如果你想通过 `apt` 命令删除一个应用及其配置文件,请在你之前删除过的应用程序上使用 `purge` 子命令: + +``` +$ sudo apt purge zsh +``` + +`apt` 和 `dnf` 都不会删除家目录中的数据和配置文件(即使使用 `purge` 子命令)。如果想要从家目录中删除数据,你必须手动操作(通常你可以在 `~/.config` 和 `~/.local` 文件中找到)。 + +### 了解包管理 + +无论你选择的发行版支持的是 `apt` 还是 `dnf`,这些命令的用途大致相同。它们可以帮助你安装、更新和移除包。这两种包管理器是目前最通用的包管理器。它们的语法元素在很大程度上是相同的,所以在两者之间切换非常容易。 + +`apt` 和 `dnf` 还有一些高级功能,例如仓库管理,但这些功能并不像你使用 `search` 和 `install` 那样频繁。 + +无论你更经常使用哪种包管理器,你都可以下载我们的 [apt 备忘单][5] 和 [dnf 备忘单][6],以便你在最需要的时候可以查询使用语法。 + +-------------------------------------------------------------------------------- + +via: https://opensource.com/article/21/7/dnf-vs-apt + +作者:[Seth Kenlon][a] +选题:[lujun9972][b] +译者:[perfiffer](https://github.com/perfiffer) +校对:[wxy](https://github.com/wxy) + +本文由 [LCTT](https://github.com/LCTT/TranslateProject) 原创编译,[Linux中国](https://linux.cn/) 荣誉推出 + +[a]: https://opensource.com/users/seth +[b]: https://github.com/lujun9972 +[1]: https://opensource.com/sites/default/files/styles/image-full-size/public/lead-images/OSDC_gift_giveaway_box_520x292.png?itok=w1YQhNH1 (Gift box opens with colors coming out) +[2]: https://opensource.com/article/18/1/how-install-apps-linux +[3]: https://opensource.com/article/18/5/getting-started-regular-expressions +[4]: https://labs.fedoraproject.org/en/design-suite/ +[5]: https://opensource.com/downloads/apt-cheat-sheet +[6]: https://opensource.com/downloads/dnf-cheat-sheet diff --git a/published/202107/20210719 Run Python applications in virtual environments.md b/published/202107/20210719 Run Python applications in virtual environments.md new file mode 100644 index 0000000000..fba26ff824 --- /dev/null +++ b/published/202107/20210719 Run Python applications in virtual environments.md @@ -0,0 +1,152 @@ +[#]: subject: (Run Python applications in virtual environments) +[#]: via: (https://opensource.com/article/21/7/python-pipx) +[#]: author: (Sumantro Mukherjee https://opensource.com/users/sumantro) +[#]: collector: (lujun9972) +[#]: translator: (geekpi) +[#]: reviewer: (wxy) +[#]: publisher: (wxy) +[#]: url: (https://linux.cn/article-13631-1.html) + +pipx:在虚拟环境中运行 Python 应用 +====== + +> 通过使用 pipx 隔离运行 Python 应用来避免版本冲突并提高安全性。 + +![](https://img.linux.net.cn/data/attachment/album/202107/29/205146cpwgxnnpgu44gxz0.jpg) + +如果你使用 Python,你可能会安装很多 Python 应用。有些是你只想尝试的工具。还有一些是你每天都在使用的久经考验的应用,所以你把它们安装在你使用的每一台计算机上。这两种情况下,在虚拟环境中运行你的 Python 应用是非常有用的,这可以使它们以及它们的依赖关系相互分离,以避免版本冲突,并使它们与你系统的其它部分隔离,以提高安全性。 + +这就是 [pipx][2] 出场的地方。 + +大多数 Python 应用可以使用 [pip][3] 进行安装,它只安装 Python 包。然而,`pipx` 为你的 Python 应用创建并管理一个虚拟环境,并帮助你运行它们。 + +### 安装 pipx + +`pipx` 主要是一个 RPM 包,你可以在任何 Fedora、RHEL 或 CentOS 机器上安装它: + +``` +$ sudo dnf install pipx +``` + +### 使用 pipx + +我将通过 Cowsay 以及 [Concentration][4] 工具演示如何使用 `pipx`。 + +#### 安装软件包 + +安装完 `pipx` 后,你可以用以下方法安装 Python 包: + +``` +$ pipx install +``` + +要安装 Cowsay 包: + +``` +$ pipx install cowsay ✔ │ 20:13:41 + installed package cowsay 4.0, Python 3.9.5 + These apps are now globally available + - cowsay +done! ✨ 🌟 ✨ +``` + +现在你可以在系统的任何地方运行 Cowsay,通过终端与你对话! + + +``` +$ cowsay "I <3 OSDC" + _________ +| I <3 OSDC | + ========= + \ + \ + ^__^ + (oo)\_______ + (__)\ )\/\ + ||----w | + || || +``` + +![Cowsay][5] + +#### 以特殊权限进行安装 + +不是所有的应用都像 Cowsay 一样简单。例如,Concentration 会与你系统中的许多其他组件交互,所以它需要特殊的权限。用以下方式安装它: + +``` +$ pipx install concentration ✔ │ 10s │ │ 20:26:12 + installed package concentration 1.1.5, Python 3.9.5 + These apps are now globally available + - concentration +done! ✨ 🌟 ✨ +``` + +Concentration 通过阻止 `distractors` 文件中列出的特定网站来帮助你集中注意力。要做到这点,它需要以 `sudo` 或 root 权限运行。你可以用 [OpenDoas][7] 来做到这点,这是 `doas` 命令的一个版本,可以用特定的用户权限运行任何命令。要使用 `doas` 以 `sudo` 权限来运行 Concentration: + +``` +$ doas concentration improve ✔ │ │ 20:26:54 +doas (sumantrom) password: +Concentration is now improved :D! +``` + +如你所见,这个独立的应用能够改变系统中的一些东西。 + +#### 列出已安装的应用 + +`pipx list` 命令显示所有用 `pipx` 安装的应用和它们的可执行路径: + +``` +$ pipx list +venvs are in /home/sumantrom/.local/pipx/venvs +apps are exposed on your $PATH at /home/sumantrom/.local/bin + package concentration 1.1.5, Python 3.9.5 + - concentration + package cowsay 4.0, Python 3.9.5 + - cowsay +``` + +#### 卸载应用 + +当你使用完毕后,知道如何卸载它们是很重要的。`pipx` 有一个非常简单的卸载命令: + +``` +$ pipx uninstall +``` + +或者你可以删除每个软件包: + +``` +$ pipx uninstall-all + +pipx uninstall-all 2 ✘ │ 20:13:35 +uninstalled cowsay! ✨ 🌟 ✨ +uninstalled concentration! ✨ 🌟 ✨ +``` + +### 尝试 pipx + +`pipx` 是一个流行的 Python 应用的包管理器。它可以访问 [PyPi][8] 上的所有东西,但它也可以从包含有效 Python 包的本地目录、Python wheel 或网络位置安装应用。 + +如果你安装了大量的 Python 应用,可以试试 `pipx`。 + +-------------------------------------------------------------------------------- + +via: https://opensource.com/article/21/7/python-pipx + +作者:[Sumantro Mukherjee][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/sumantro +[b]: https://github.com/lujun9972 +[1]: https://opensource.com/sites/default/files/styles/image-full-size/public/lead-images/browser_web_internet_website.png?itok=g5B_Bw62 (Digital creative of a browser on the internet) +[2]: https://pypi.org/project/pipx/ +[3]: https://pypi.org/project/pip/ +[4]: https://opensource.com/article/20/8/python-concentration +[5]: https://opensource.com/sites/default/files/uploads/cowsay.png (Cowsay) +[6]: https://creativecommons.org/licenses/by-sa/4.0/ +[7]: https://github.com/Duncaen/OpenDoas +[8]: https://pypi.org/ diff --git a/published/202107/20210720 Meet Clapper- A Sleek Looking Linux Video Player for Minimalists.md b/published/202107/20210720 Meet Clapper- A Sleek Looking Linux Video Player for Minimalists.md new file mode 100644 index 0000000000..2c05cb36a8 --- /dev/null +++ b/published/202107/20210720 Meet Clapper- A Sleek Looking Linux Video Player for Minimalists.md @@ -0,0 +1,91 @@ +[#]: subject: (Meet Clapper: A Sleek Looking Linux Video Player for Minimalists) +[#]: via: (https://itsfoss.com/clapper-video-player/) +[#]: author: (Abhishek Prakash https://itsfoss.com/author/abhishek/) +[#]: collector: (lujun9972) +[#]: translator: (geekpi) +[#]: reviewer: (turbokernel) +[#]: publisher: (wxy) +[#]: url: (https://linux.cn/article-13638-1.html) + +认识 Clapper:一款外观时尚的 Linux 视频播放器,极简主义者适用 +====== + +喜欢极简主义吗?你会喜欢 Clapper 的。 + +Clapper 是一个全新 [Linux 视频播放器][1]。实际上,它更多的是基于 GNOME 而不是 Linux。 + +它基于 GNOME 的 JavaScript 库和 GTK4 工具包构建,自然地融合在 GNOME 的桌面环境中。它使用 [GStreamer][2] 作为媒体后端,使用 [OpenGL][3] 进行渲染。 + +我喜欢极简主义的应用。虽然 VLC 是媒体播放器中的瑞士军刀,但我更喜欢 [MPV 播放器][4],因为它的界面时尚、简约。现在我想要坚持使用 Clapper 一段时间了。 + +### Clapper 视频播放器 + +![A screenshot of Clapper video player][5] + +[Clapper 默认开启硬件加速][6]。它支持英特尔和 AMD 的 GPU,在 Xorg 和 Wayland 上都能工作。 + +[Clapper][7] 不使用传统的上部窗口栏。为你提供自动隐藏的偏好菜单、模式切换器和窗口控制按钮供等功能。这给了它一个时尚、简约的外观。 + +它有三种模式: + + * 窗口模式:默认模式显示进度条和窗口控制。 + * 浮动模式:隐藏进度条,播放器浮于其他应用程序的顶部,就像“[总是在顶部][8]”或“画中画”模式。 + * 全屏模式:播放器进入全屏,进度条变大,但它们都会自动隐藏起来 + +![Interface of Clapper video player with preference control and window modes][9] + +Clapper 也有一个自适应的用户界面,可基于 Linux 的智能手机和平板电脑上使用。因此,如果你有自己的 Pine Phone 或 Librem5,你可以在它上面使用 Clapper。 + +它支持字幕,并可选择改变字体。然而,在我的测试中,字幕并不可用。也没有可以明确地在播放的视频中添加字幕的选项。这一点必须改进。 + +和 VLC 一样,如果你再次打开同一个视频文件,Clapper 也可以让你选择从最后一个时间点恢复播放。这是我喜欢的 VLC 中的一个 [方便的功能][10]。 + +如果你有 URL,Clapper 也支持从互联网上播放视频。 + +这里的截图中,我正在 Clapper 中播放一个 YouTube 视频。这是一首由一位美丽的歌手和演员唱的优美歌曲。你能猜到这是哪首歌或哪部电影吗? + +![Clapper playing a video from YouTube][11] + +### 在 Linux 上安装 Clapper + +对 Arch 和 Manjaro 用户而言,Clapper 可在 AUR 中找到。这很稀疏平常,因为 AUR 包罗万象。 + +对于其他发行版,Clapper 官方提供了 [Flatpak 包][12]。所以,请 [为你的发行版启用 Flatpak 支持][13],然后使用下面的命令来安装它: + +``` +flatpak install flathub com.github.rafostar.Clapper +``` + +安装后,只需在应用菜单中搜索它,或右击视频文件,选择用 Clapper 打开它。 + +Clapper 仍不是一个完美的视频播放器。然而,它有可能成为一个流行的 Linux 应用。 + +如果你使用它,请分享你的经验。如果你发现问题,请[通知开发者][14]。 + +-------------------------------------------------------------------------------- + +via: https://itsfoss.com/clapper-video-player/ + +作者:[Abhishek Prakash][a] +选题:[lujun9972][b] +译者:[geekpi](https://github.com/geekpi) +校对:[turbokernel](https://github.com/turbokernel) + +本文由 [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/video-players-linux/ +[2]: https://gstreamer.freedesktop.org/ +[3]: https://www.opengl.org/ +[4]: https://itsfoss.com/mpv-video-player/ +[5]: https://i1.wp.com/itsfoss.com/wp-content/uploads/2021/07/clapper-screenshot.png?resize=800%2C498&ssl=1 +[6]: https://github.com/Rafostar/clapper/wiki/Hardware-acceleration +[7]: https://github.com/Rafostar/clapper +[8]: https://itsfoss.com/always-on-top/ +[9]: https://i2.wp.com/itsfoss.com/wp-content/uploads/2021/07/clapper-video-player-interface.jpg?resize=800%2C480&ssl=1 +[10]: https://itsfoss.com/simple-vlc-tips/ +[11]: https://i0.wp.com/itsfoss.com/wp-content/uploads/2021/07/clapper-youtube-video.jpg?resize=800%2C501&ssl=1 +[12]: https://flathub.org/apps/details/com.github.rafostar.Clapper +[13]: https://itsfoss.com/flatpak-guide/ +[14]: https://github.com/Rafostar/clapper/issues diff --git a/published/202107/20210720 Run a Linux virtual machine in Podman.md b/published/202107/20210720 Run a Linux virtual machine in Podman.md new file mode 100644 index 0000000000..5f4d366a05 --- /dev/null +++ b/published/202107/20210720 Run a Linux virtual machine in Podman.md @@ -0,0 +1,114 @@ +[#]: subject: (Run a Linux virtual machine in Podman) +[#]: via: (https://opensource.com/article/21/7/linux-podman) +[#]: author: (Sumantro Mukherjee https://opensource.com/users/sumantro) +[#]: collector: (lujun9972) +[#]: translator: (geekpi) +[#]: reviewer: (wxy) +[#]: publisher: (wxy) +[#]: url: (https://linux.cn/article-13635-1.html) + +在 Podman 中运行一个 Linux 虚拟机 +====== + +> 使用 Podman Machine 创建一个基本的 Fedora CoreOS 虚拟机来使用容器和容器化工作负载。 + +![](https://img.linux.net.cn/data/attachment/album/202107/31/114043y4d0kstx90zpx6o3.jpg) + +Fedora CoreOS 是一个自动更新、最小化的基于 [rpm-ostree][2] 的操作系统,用于安全地、大规模地运行容器化工作负载。 + +[Podman][3] “是一个用于管理容器和镜像、挂载到这些容器中的卷,以及由这些容器组组成的吊舱的工具。Podman 基于 libpod,它是一个容器生命周期管理库”。 + +当你使用 [Podman Machine][4] 时,神奇的事情发生了,它可以帮助你创建一个基本的 Fedora CoreOS 虚拟机(VM)来使用容器和容器化工作负载。 + +### 开始使用 Podman Machine + +第一步是安装 Podman。如果你已经安装了最新版本的 Podman,你可以跳过这个步骤。在我的 Fedora 34 机器上,我用以下方式安装 Podman: + +``` +$ sudo dnf install podman +``` + +我使用的是 podman-3.2.2-1.fc34.x86_64。 + +### 初始化 Fedora CoreOS + +Podman 安装完成后,用以下方法初始化它: + +``` +❯ podman machine init vm2 +Downloading VM image: fedora-coreos-34.20210626.1.0-qemu.x86_64.qcow2.xz: done +Extracting compressed file +``` + +这个命令创建了 `vm2`,并下载了 .xz 格式的 Fedora CoreOS 的 qcow2 文件并将其解压。 + +### 列出你的虚拟机 + +了解你的虚拟机和它们的状态是很重要的,`list` 命令可以帮助你做到这一点。下面的例子显示了我所有的虚拟机的名称,它们被创建的日期,以及它们最后一次启动的时间: + +``` +❯ podman machine list +NAME VM TYPE CREATED LAST UP +podman-machine-default* qemu 6 days ago Currently running +vm2 qemu 11 minutes ago 11 minutes ago +``` + +### 启动一个虚拟机 + +要启动一个虚拟机,请运行: + +``` +❯ podman machine start +Waiting for VM ... +``` + +### SSH 到虚拟机 + +你可以使用 SSH 来访问你的虚拟机,并使用它来运行工作负载,而没有任何麻烦的设置: + +``` +❯ podman machine ssh +Connecting to vm podman-machine-default. To close connection, use `~.` or `exit` +Fedora CoreOS 34.20210611.1.0 +Tracker: https://github.com/coreos/fedora-coreos-tracker +Discuss: https://discussion.fedoraproject.org/c/server/coreos/ + +Last login: Wed Jun 23 13:23:36 2021 from 10.0.2.2 +[core@localhost ~]$ uname -a +Linux localhost 5.12.9-300.fc34.x86_64 #1 SMP Thu Jun 3 13:51:40 UTC 2021 x86_64 x86_64 x86_64 GNU/Linux +[core@localhost ~]$ +``` + +目前,Podman 只支持一次运行一个虚拟机。 + +### 停止你的虚拟机 + +要停止运行中的虚拟机,请使用 `stop` 命令: + +``` +❯ podman machine stop + +[core@localhost ~]$ Connection to localhost closed by remote host. +Connection to localhost closed. +Error: exit status 255 +``` + +我希望这能帮助你开始使用 Podman Machine。请试一试,并在评论中告诉我们你的想法。 + +-------------------------------------------------------------------------------- + +via: https://opensource.com/article/21/7/linux-podman + +作者:[Sumantro Mukherjee][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/sumantro +[b]: https://github.com/lujun9972 +[1]: https://opensource.com/sites/default/files/styles/image-full-size/public/lead-images/lenovo-thinkpad-laptop-window-focus.png?itok=g0xPm2kD (young woman working on a laptop) +[2]: http://coreos.github.io/rpm-ostree/ +[3]: https://github.com/containers/podman +[4]: http://docs.podman.io/en/latest/markdown/podman-machine.1.html \ No newline at end of file diff --git a/published/202107/20210722 Top Android Emulators to Run and Test Android Apps on Linux.md b/published/202107/20210722 Top Android Emulators to Run and Test Android Apps on Linux.md new file mode 100644 index 0000000000..2a4b7ab2d0 --- /dev/null +++ b/published/202107/20210722 Top Android Emulators to Run and Test Android Apps on Linux.md @@ -0,0 +1,139 @@ +[#]: subject: (Top Android Emulators to Run and Test Android Apps on Linux) +[#]: via: (https://itsfoss.com/android-emulators-linux/) +[#]: author: (Ankush Das https://itsfoss.com/author/ankush/) +[#]: collector: (lujun9972) +[#]: translator: (geekpi) +[#]: reviewer: (wxy) +[#]: publisher: (wxy) +[#]: url: (https://linux.cn/article-13629-1.html) + +Linux 上的顶级安卓模拟器 +====== + +![](https://img.linux.net.cn/data/attachment/album/202107/29/111502vg5knofnpjc2jp5c.jpg) + +安卓系统是建立在高度定制的 Linux 内核之上的。因此,使用安卓模拟器在 Linux 上运行移动应用是有意义的。 + +虽然这不是在 Linux 机器上你可以做的新鲜事,但在 Windows 于 2021 年推出运行安卓应用的能力后,它是一个更需要的功能。 + +不仅仅限于使用应用,一些安卓模拟器也可以在开发和测试中派上用场。 + +因此,我总结了一份最好的模拟器清单,你可以用它来测试或在 Linux 上运行安卓应用/游戏。 + +### 1、Anbox + +![视频](https://youtu.be/MbmiHnasGWg) + +Anbox 是一个相当流行的模拟器,可以让 Linux 用户运行 Android 应用。可能深度 Linux 正是利用它使得开箱即可运行安卓应用。 + +它使用一个容器将安卓操作系统与主机隔离,这也让它们可以使用最新的安卓版本。 + +运行的安卓应用不能直接访问你的硬件,这是一个很好的安全决定。 + +与这里的其他一些选择不同,Anbox 在技术上不需要仿真层来使安卓系统工作。换句话说,它在你的 Linux 系统上最接近于原生的安卓体验。 + +由于这个原因,它可能不是最简单的选择。你不能只使用谷歌应用商店来安装应用,你需要使用安卓调试桥(ADB)。你只需要一个应用的 APK 文件就可以安装和使用它。 + +- [Anbox][1] + +### 2、Genymotion + +![][2] + +Genymotion 是一个为测试和开发量身定做的令人印象深刻的解决方案。 + +它不是一个自由开源的选择。它们通过云端或独立于 Android Studio 的桌面客户端,提供虚拟的安卓体验作为服务。 + +你可以模拟各种硬件配置和安卓版本,创建一个虚拟设备进行测试。它还让你有能力扩大规模,并有多个安卓虚拟设备运行,进行广泛的测试。 + +它可以帮助你测试文件上传在你的应用中如何工作,电池影响、性能、内存等等。 + +虽然它是一个主要针对专业人士的高级解决方案,但它确实支持最新的 Linux 发行版,包括 Ubuntu 20.04 LTS。 + +- [Genymotion][3] + +### 3、Android-x86 + +![][4] + +Android x86 是一个开源项目,使得安卓可以在 PC 上运行,并支持 32 位。 + +你可以选择在你的 Linux 系统上使用虚拟机管理器来安装它,或者直接在你的 PC 上试用它。 + +如果你需要安装,可以查看官方的 [安装说明][5]。 + +与其他一些选择不同,它是一个简单的试图在 PC 上工作的模拟器,没有花哨的功能。 + +- [Android x86][6] + +### 4、Android Studio (虚拟设备) + +![][7] + +Android Studio 是一个用于开发和测试的完整工具。幸运的是,由于对 Linux 的支持,如果你需要的话,你可以用它来模拟安卓的体验进行实验。 + +你只需要创建一个安卓虚拟设备(AVD),你可以对其进行配置,然后作为模拟器进行模拟。 + +也有很大的机会能找到对一些最新的智能手机、电视和智能手表的支持。 + +它需要一定的学习曲线才能上手,但它是免费的,而且是完全开源的。 + +- [Android Studio][8] + +### 5、ARChon + +![][9] + +一个有趣的解决方案,这是一个你可以在 Linux 和任何其他平台上使用的安卓模拟器。 + +它有助于在 Chrome OS 上运行安卓应用,或者在任何操作系统上使用 Chrome 浏览器。与其他一些不同的是,你可能不会得到完整的安卓体验,而只是能够运行安卓应用。 + +你只需解压运行时,并将其加载到 Chrome 扩展中。接下来,下载 APK 文件到上面来添加你想使用的应用。 + +- [ARChon][10] + +### 6、Bliss OS + +![][11] + +Bliss OS 是另一个开源项目,与 Android x86 类似,旨在使安卓在 PC 上运行。 + +与 Android x86 不同的是,它通过支持 32 位和 64 位架构提供了更多的兼容性选择。此外,你可以根据你的处理器下载兼容文件。 + +它有积极的维护,支持市场上最新的安卓版本。 + +- [Bliss OS][12] + +### 总结 + +虽然你会能找到几个可用于 Linux 的安卓模拟器,但它们可能无法取代全面的智能手机体验。 + +每个模拟器都有一系列的功能和特定目的。请选择你需要的那个! + +你试过安卓模拟器么?你在 Linux 中使用的最喜欢的模拟器是什么?欢迎在下面的评论中让我知道。 + +-------------------------------------------------------------------------------- + +via: https://itsfoss.com/android-emulators-linux/ + +作者:[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://anbox.io +[2]: https://i2.wp.com/itsfoss.com/wp-content/uploads/2021/07/genymotion-android-emulator.png?resize=800%2C508&ssl=1 +[3]: https://www.genymotion.com +[4]: https://i2.wp.com/itsfoss.com/wp-content/uploads/2021/07/android-x86-emulator.jpg?resize=1920%2C1080&ssl=1 +[5]: https://www.android-x86.org/installhowto.html +[6]: https://www.android-x86.org +[7]: https://i1.wp.com/itsfoss.com/wp-content/uploads/2021/07/android-virtual-devices-studio.png?resize=800%2C296&ssl=1 +[8]: https://developer.android.com/studio +[9]: https://i0.wp.com/itsfoss.com/wp-content/uploads/2021/07/arcrhon.jpg?resize=800%2C426&ssl=1 +[10]: https://archon-runtime.github.io +[11]: https://i0.wp.com/itsfoss.com/wp-content/uploads/2021/07/bliss-os-android.png?resize=800%2C576&ssl=1 +[12]: https://blissos.org diff --git a/published/202107/20210722 Ubuntu 20.10 Reached End of Life, Time to Upgrade.md b/published/202107/20210722 Ubuntu 20.10 Reached End of Life, Time to Upgrade.md new file mode 100644 index 0000000000..128b6d38e5 --- /dev/null +++ b/published/202107/20210722 Ubuntu 20.10 Reached End of Life, Time to Upgrade.md @@ -0,0 +1,69 @@ +[#]: subject: (Ubuntu 20.10 Reached End of Life, Time to Upgrade!) +[#]: via: (https://news.itsfoss.com/ubuntu-20-10-end-of-life/) +[#]: author: (Ankush Das https://news.itsfoss.com/author/ankush/) +[#]: collector: (lujun9972) +[#]: translator: (zd200572) +[#]: reviewer: (wxy) +[#]: publisher: (wxy) +[#]: url: (https://linux.cn/article-13611-1.html) + +Ubuntu 20.10 到达生命终点,该升级啦! +====== + +> 哦!Ubuntu 20.10 将不再收到任何更新。如果你还在使用它,你的系统将面临风险,请考虑升级到 Ubuntu 21.04! + +![](https://i0.wp.com/news.itsfoss.com/wp-content/uploads/2021/07/ubuntu-20-10-eof.png?w=1200&ssl=1) + +Ubuntu 20.10(Groovy Gorilla)2021 年 7 月 22 日停止支持啦。它是一个非长期支持发行版本,[带来了一些令人兴奋的新特性][1]。 + +通常,非长期支持发行版维护 9 个月,所以生命周期结束意味着Ubuntu 20.10 用户将没有安全和维护更新。 + +你也会错过已安装应用的更新,[使用 apt 命令][2] 安装新软件也会面临问题。如果不手动修改 `sources.list`(不推荐),使用软件中心也将是个问题。 + +支持周期的结束会影响所有的其他 Ubuntu 特色版本,像 Kubuntu、Lubuntu、MATE 等。 + +但是像 Linux Mint 和 elementary OS 这样的发行版不依赖于非长期支持发行版,你不必有任何担心。 + +使用下面的命令在终端 [检查下你安装的 Ubuntu 版本][3]是个好主意: + +``` +lsb_release -a +``` + +### 升级到 Ubuntu 21.04(Hirsute Hippo):正是时候! + +毫无疑问,你需要升级到 Ubuntu 21.04 才能获得最新的更新和安全改进。 + +[Ubuntu 21.10 版本][4] 将在几个月后发布,所以你也可以尝试到时升级到这个版本。 + +现在,你可以按照我们的 [Ubuntu 升级][5]教程来开始升级。 + +我推荐你备份一下,以防升级过程中出现问题。 + +如果你想重新安装,也可以。 + +### 还在用 Ubuntu 20.10? + +从技术上来说,你可以继续使用不受支持的版本,如果你不想安全问题蔓延,建议还是升级到最新的版本,比如 Ubuntu 21.04。 + +Ubuntu 21.04 将会提供支持到 2022 年 1 月,升级前你可能想看下 [Ubuntu 21.04 的特性][6]。 + +-------------------------------------------------------------------------------- + +via: https://news.itsfoss.com/ubuntu-20-10-end-of-life/ + +作者:[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://itsfoss.com/ubuntu-20-10-features/ +[2]: https://itsfoss.com/apt-command-guide/ +[3]: https://itsfoss.com/how-to-know-ubuntu-unity-version/ +[4]: https://news.itsfoss.com/ubuntu-21-10-release-schedule/ +[5]: https://itsfoss.com/upgrade-ubuntu-version/ +[6]: https://news.itsfoss.com/ubuntu-21-04-features/ diff --git a/published/202107/20210725 How to Install VLC on Fedora Linux.md b/published/202107/20210725 How to Install VLC on Fedora Linux.md new file mode 100644 index 0000000000..6c9e40d684 --- /dev/null +++ b/published/202107/20210725 How to Install VLC on Fedora Linux.md @@ -0,0 +1,79 @@ +[#]: subject: (How to Install VLC on Fedora Linux) +[#]: via: (https://itsfoss.com/install-vlc-fedora/) +[#]: author: (Abhishek Prakash https://itsfoss.com/author/abhishek/) +[#]: collector: (lujun9972) +[#]: translator: (geekpi) +[#]: reviewer: (wxy) +[#]: publisher: (wxy) +[#]: url: (https://linux.cn/article-13637-1.html) + +如何在 Fedora Linux 上安装 VLC +====== + +![](https://img.linux.net.cn/data/attachment/album/202107/31/215634thkmiihq1limel4i.jpg) + +如果你刚刚安装了 Fedora,现在想在上面安装你最喜欢的视频播放器 VLC,你可能不会在软件中心找到它。至少不会立即找到。 + +出于只有它的开发者知道的原因,Fedora 既没有安装 [VLC][1],也不包括在 Fedora 官方仓库中。 + +那么,你如何在 Fedora 上安装 VLC 呢?很简单。RPM Fusion 是你的朋友。让我告诉你详细的步骤。 + +### 在 Fedora Linux 上安装 VLC + +在这里使用命令行会更容易。你也可以使用图形化的方法。我将在后面讨论它。 + +打开终端,使用下面的命令来添加和启用包含 VLC 包的 RPM Fusion 仓库: + +``` +sudo dnf install https://mirrors.rpmfusion.org/free/fedora/rpmfusion-free-release-$(rpm -E %fedora).noarch.rpm +``` + +当被要求确认添加新仓库时按 `Y`。接下来,使用 DNF 命令安装 VLC: + +``` +sudo dnf install vlc +``` + +它将在 Fedora 中从 RPM Fusion 仓库中安装 VLC,并从不同的仓库中安装一些额外的依赖项。 + +![Installing VLC in Fedora with DNF command][2] + +安装后,你可以在应用程序菜单中搜索 VLC,或者在“活动区”中搜索它。 + +![Search for VLC][3] + +点击、启动并享受它。 + +#### 替代方法:从软件中心安装 VLC + +当你已经启用了 RPM Fusion 仓库,你可以在软件中心显示这个仓库的应用。要做到这一点,在终端使用以下命令: + +``` +sudo dnf groupupdate core +``` + +之后,打开软件中心,搜索 VLC 并从那里安装。 + +![VLC in Fedora software center][4] + +如果你有添加 FlatHub 仓库,请避免安装 Flatpak 版本的 VLC,因为它的大小大约是 1GB。RPM 版本的大小要小得多。 + +我希望你觉得这个快速教程对在 Fedora 上安装 VLC 有帮助。享受吧。 + +-------------------------------------------------------------------------------- + +via: https://itsfoss.com/install-vlc-fedora/ + +作者:[Abhishek Prakash][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/abhishek/ +[b]: https://github.com/lujun9972 +[1]: https://www.videolan.org/ +[2]: https://itsfoss.com/wp-content/uploads/2021/07/installing-vlc-fedora-800x422.webp +[3]: https://i0.wp.com/itsfoss.com/wp-content/uploads/2021/07/vlc-fedora.png?resize=799%2C223&ssl=1 +[4]: https://itsfoss.com/wp-content/uploads/2021/07/vlc-in-fedora-software-center-800x486.webp \ No newline at end of file diff --git a/published/20210710 A new open source operating system for embedded systems.md b/published/20210710 A new open source operating system for embedded systems.md new file mode 100644 index 0000000000..2674c8d4dc --- /dev/null +++ b/published/20210710 A new open source operating system for embedded systems.md @@ -0,0 +1,91 @@ +[#]: subject: (A new open source operating system for embedded systems) +[#]: via: (https://opensource.com/article/21/7/rt-thread-smart) +[#]: author: (Zhu Tianlong https://opensource.com/users/zhu-tianlong) +[#]: collector: (lujun9972) +[#]: translator: (tendertime) +[#]: reviewer: (wxy) +[#]: publisher: (wxy) +[#]: url: (https://linux.cn/article-14552-1.html) + +一种新的开源嵌入式操作系统 +====== + +> RT-Thread Smart 致力于物联网和边缘计算领域的开源。 + +![](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 diff --git a/published/202108/20200107 5 ways to improve your Bash scripts.md b/published/202108/20200107 5 ways to improve your Bash scripts.md new file mode 100644 index 0000000000..22d5579875 --- /dev/null +++ b/published/202108/20200107 5 ways to improve your Bash scripts.md @@ -0,0 +1,169 @@ +[#]: collector: "lujun9972" +[#]: translator: "fisherue" +[#]: reviewer: "wxy" +[#]: publisher: "wxy" +[#]: url: "https://linux.cn/article-13717-1.html" +[#]: subject: "5 ways to improve your Bash scripts" +[#]: via: "https://opensource.com/article/20/1/improve-bash-scripts" +[#]: author: "Alan Formy-Duval https://opensource.com/users/alanfdoss" + +改进你的脚本程序的 5 个方法 +====== + +> 巧用 Bash 脚本程序能帮助你完成很多极具挑战的任务。 + +![](https://img.linux.net.cn/data/attachment/album/202108/25/131347yblk4jg4r6blebmg.jpg) + +系统管理员经常写脚本程序,不论长短,这些脚本可以完成某种任务。 + +你是否曾经查看过某个软件发行方提供的安装用的脚本script程序?为了能够适应不同用户的系统配置,顺利完成安装,这些脚本程序经常包含很多函数和逻辑分支。多年来,我积累了一些改进脚本程序的一些技巧,这里分享几个,希望能对朋友们也有用。这里列出一组短脚本示例,展示给大家做脚本样本。 + +### 初步尝试 + +我尝试写一个脚本程序时,原始程序往往就是一组命令行,通常就是调用标准命令完成诸如更新网页内容之类的工作,这样可以节省时间。其中一个类似的工作是解压文件到 Apache 网站服务器的主目录里,我的最初脚本程序大概是下面这样: + +``` +cp january_schedule.tar.gz /usr/apache/home/calendar/ +cd /usr/apache/home/calendar/ +tar zvxf january_schedule.tar.gz +``` + +这帮我节省了时间,也减少了键入多条命令操作。时日久了,我掌握了另外的技巧,可以用 Bash 脚本程序完成更难的一些工作,比如说创建软件安装包、安装软件、备份文件系统等工作。 + +### 1、条件分支结构 + +和众多其他编程语言一样,脚本程序的条件分支结构同样是强大的常用技能。条件分支结构赋予了计算机程序逻辑能力,我的很多实例都是基于条件逻辑分支。 + +基本的条件分支结构就是 `if` 条件分支结构。通过判定是否满足特定条件,可以控制程序选择执行相应的脚本命令段。比如说,想要判断系统是否安装了 Java ,可以通过判断系统有没有一个 Java 库目录;如果找到这个目录,就把这个目录路径添加到可运行程序路径,也就可以调用 Java 库应用了。 + +``` +if [ -d "$JAVA_HOME/bin" ] ; then +    PATH="$JAVA_HOME/bin:$PATH" +``` + +### 2、限定运行权限 + +你或许想只允许特定的用户才能执行某个脚本程序。除了 Linux 的权限许可管理,比如对用户和用户组设定权限、通过 SELinux 设定此类的保护权限等,你还可以在脚本里设置逻辑判断来设置执行权限。类似的情况可能是,你需要确保只有网站程序的所有者才能执行相应的网站初始化操作脚本。甚至你可以限定只有 root 用户才能执行某个脚本。这个可以通过在脚本程序里设置逻辑判断实现,Linux 提供的几个环境变量可以帮忙。其中一个是保存用户名称的变量 `$USER`, 另一个是保存用户识别码的变量 `$UID` 。在脚本程序里,执行用户的 UID 值就保存在 `$UID` 变量里。 + +#### 用户名判别 + +第一个例子里,我在一个带有几个应用服务器实例的多用户环境里指定只有用户 `jboss1` 可以执行脚本程序。条件 `if` 语句主要是判断,“要求执行这个脚本程序的用户不是 `jboss1` 吗?”当此条件为真时,就会调用第一个 `echo` 语句,接着是 `exit 1`,即退出这个脚本程序。 + +``` +if [ "$USER" != 'jboss1' ]; then +     echo "Sorry, this script must be run as JBOSS1!" +     exit 1 +fi +echo "continue script" +``` + +#### 根用户判别 + +接下来的例子是要求只有根用户才能执行脚本程序。根用户的用户识别码(UID)是 0,设置的条件判断采用大于操作符(`-gt`),所有 UID 值大于 0 的用户都被禁止执行该脚本程序。 + +``` +if [ "$UID" -gt 0 ]; then +     echo "Sorry, this script must be run as ROOT!" +     exit 1 +fi +echo "continue script" +``` + +### 3、带参数执行程序 + +可执行程序可以附带参数作为执行选项,命令行脚本程序也是一样,下面给出几个例子。在这之前,我想告诉你,能写出好的程序并不只是写出我们想要它执行什么的程序,程序还需要不执行我们不要它执行的操作。如果运行程序时没有提供参数造成程序缺少足够信息,我愿意脚本程序不要做任何破坏性的操作。因而,程序的第一步就是确认命令行是否提供了参数,判定的条件就是参数数量 `$#` 是否为 0 ,如果是(意味着没有提供参数),就直接终止脚本程序并退出操作。 + + +``` +if [ $# -eq 0 ]; then +    echo "No arguments provided" +    exit 1 +fi +echo "arguments found: $#" +``` + +#### 多个运行参数 + +可以传递给脚本程序的参数不止一个。脚本使用内部变量指代这些参数,内部变量名用非负整数递增标识,也就是 `$1`、`$2`、`$3` 等等递增。我只是扩展前面的程序,并在下面一行输出显示用户提供的前三个参数。显然,要针对所有的每个参数有对应的响应需要更多的逻辑判断,这里的例子只是简单展示参数的使用。 + +``` +echo $1 $2 $3 +``` + +我们在讨论这些参数变量名,你或许有个疑问,“参数变量名怎么跳过了 `$0`,(而直接从`$1` 开始)?” + +是的,是这样,这是有原因的。变量名 `$0` 确实存在,也非常有用,它储存的是被执行的脚本程序的名称。 + +``` +echo $0 +``` + +程序执行过程中有一个变量名指代程序名称,很重要的一个原因是,可以在生成的日志文件名称里包含程序名称,最简单的方式应该是调用一个 `echo` 语句。 + +``` +echo test >> $0.log +``` + +当然,你或许要增加一些代码,确保这个日志文件存放在你希望的路径,日志名称包含你认为有用的信息。 + +### 4、交互输入 + +脚本程序的另一个好用的特性是可以在执行过程中接受输入,最简单的情况是让用户可以输入一些信息。 + + +``` +echo "enter a word please:" +read word +echo $word +``` + +这样也可以让用户在程序执行中作出选择。 + +``` +read -p "Install Software ?? [Y/n]: " answ +if [ "$answ" == 'n' ]; then +   exit 1 +fi +   echo "Installation starting..." +``` + +### 5、出错退出执行 + +几年前,我写了个脚本,想在自己的电脑上安装最新版本的 Java 开发工具包(JDK)。这个脚本把 JDK 文件解压到指定目录,创建更新一些符号链接,再做一下设置告诉系统使用这个最新的版本。如果解压过程出现错误,在执行后面的操作就会使整个系统上的 Java 破坏不能使用。因而,这种情况下需要终止程序。如果解压过程没有成功,就不应该再继续进行之后的更新操作。下面语句段可以完成这个功能。 + +``` +tar kxzmf jdk-8u221-linux-x64.tar.gz -C /jdk --checkpoint=.500; ec=$? +if [ $ec -ne 0 ]; then +     echo "Installation failed - exiting." +     exit 1 +fi +``` + +下面的单行语句可以给你快速展示一下变量 `$?` 的用法。 + +``` +ls T; ec=$?; echo $ec +``` + +先用 `touch T` 命令创建一个文件名为 `T` 的文件,然后执行这个单行命令,变量 `ec` 的值会是 0。然后,用 `rm T` 命令删除文件,再执行该单行命令,变量 `ec` 的值会是 2,因为文件 `T` 不存在,命令 `ls` 找不到指定文件报错。 + +在逻辑条件里利用这个出错标识,参照前文我使用的条件判断,可以使脚本文件按需完成设定操作。 + +### 结语 + +要完成复杂的功能,或许我们觉得应该使用诸如 Python、C 或 Java 这类的高级编程语言,然而并不尽然,脚本编程语言也很强大,可以完成类似任务。要充分发挥脚本的作用,有很多需要学习的,希望这里的几个例子能让你意识到脚本编程的强大。 + +-------------------------------------------------------------------------------- + +via: https://opensource.com/article/20/1/improve-bash-scripts + +作者:[Alan Formy-Duval][a] +选题:[lujun9972][b] +译者:[fisherue](https://github.com/fisherue) +校对:[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/rh_003784_02_os.comcareers_os_rh2x.png?itok=jbRfXinl "工作者图片" diff --git a/published/202108/20200204 Managing your attached hardware on Linux with systemd-udevd.md b/published/202108/20200204 Managing your attached hardware on Linux with systemd-udevd.md new file mode 100644 index 0000000000..b9fc40090a --- /dev/null +++ b/published/202108/20200204 Managing your attached hardware on Linux with systemd-udevd.md @@ -0,0 +1,146 @@ +[#]: collector: (lujun9972) +[#]: translator: (YungeG) +[#]: reviewer: (wxy) +[#]: publisher: (wxy) +[#]: url: (https://linux.cn/article-13691-1.html) +[#]: subject: (Managing your attached hardware on Linux with systemd-udevd) +[#]: via: (https://opensource.com/article/20/2/linux-systemd-udevd) +[#]: author: (David Clinton https://opensource.com/users/dbclinton) + +在 Linux 使用 systemd-udevd 管理你的接入硬件 +====== + +> 使用 udev 管理你的 Linux 系统处理物理设备的方式。 + +![](https://img.linux.net.cn/data/attachment/album/202108/17/104654z1evcdx41xfc4zpq.jpg) + +Linux 能够出色地自动识别、加载、并公开接入的无数厂商的硬件设备。事实上,很多年以前,正是这个特性说服我,坚持让我的雇主将整个基础设施转换到 Linux。痛点在于 Redmond 的某家公司(LCTT 译注:指微软)不能在我们的 Compaq 台式机上加载集成网卡的驱动,而 Linux 可以轻松实现这一点。 + +从那以后的岁月里,Linux 的识别设备库随着该过程的复杂化而与日俱增,而 [udev][2] 就是解决这个问题的希望之星。udev 负责监听 Linux 内核发出的改变设备状态的事件。它可能是一个新 USB 设备被插入或拔出,也可能是一个无线鼠标因浸入洒出的咖啡中而脱机。 + +udev 负责处理所有的状态变更,比如指定访问设备使用的名称和权限。这些更改的记录可以通过 [dmesg][3] 获取。由于 dmesg 的输出通常有几千行,对结果进行过滤通常是聪明的选择。下面的例子说明了 Linux 如何识别我的 WiFi 接口。这个例子展示了我的无线设备使用的芯片组(`ath9k`)、启动过程早期阶段分配的原始名称(`wlan0`)、以及正在使用的又臭又长的永久名称(`wlxec086b1ef0b3`): + +``` +$ dmesg | grep wlan +[    5.396874] ath9k_htc 1-3:1.0 wlxec086b1ef0b3: renamed from wlan0 +``` + +在这篇文章中,我会讨论为何有人想要使用这样的名称。在这个过程中,我会探索剖析 udev 的配置文件,然后展示如何更改 udev 的设置,包括编辑系统命名设备的方式。这篇文件基于我的新课程中《[Linux 系统优化][4]》的一个模块。 + +### 理解 udev 配置系统 + +使用 systemd 的机器上,udev 操作由 `systemd-udevd` 守护进程管理,你可以通过常规的 systemd 方式使用 `systemctl status systemd-udevd` 检查 udev 守护进程的状态。 + +严格来说,udev 的工作方式是试图将它收到的每个系统事件与 `/lib/udev/rules.d/` 和 `/etc/udev/rules.d/` 目录下找到的规则集进行匹配。规则文件包括匹配键和分配键,可用的匹配键包括 `action`、`name` 和 `subsystem`。这意味着如果探测到一个属于某个子系统的、带有特定名称的设备,就会给设备指定一个预设的配置。 + +接着,“分配”键值对被拿来应用想要的配置。例如,你可以给设备分配一个新名称、将其关联到文件系统中的一个符号链接、或者限制为只能由特定的所有者或组访问。这是从我的工作站摘出的一条规则: + +``` +$ cat /lib/udev/rules.d/73-usb-net-by-mac.rules +# Use MAC based names for network interfaces which are directly or indirectly +# on USB and have an universally administered (stable) MAC address (second bit +# is 0). Don't do this when ifnames is disabled via kernel command line or +# customizing/disabling 99-default.link (or previously 80-net-setup-link.rules). + +IMPORT{cmdline}="net.ifnames" +ENV{net.ifnames}=="0", GOTO="usb_net_by_mac_end" + +ACTION=="add", SUBSYSTEM=="net", SUBSYSTEMS=="usb", NAME=="", \ +    ATTR{address}=="?[014589cd]:*", \ +    TEST!="/etc/udev/rules.d/80-net-setup-link.rules", \ +    TEST!="/etc/systemd/network/99-default.link", \ +    IMPORT{builtin}="net_id", NAME="$env{ID_NET_NAME_MAC}" +``` + +`add` 动作告诉 udev,只要新插入的设备属于网络子系统,*并且*是一个 USB 设备,就执行操作。此外,如果我理解正确的话,只有设备的 MAC 地址由特定范围内的字符组成,并且 `80-net-setup-link.rules` 和 `99-default.link` 文件*不*存在时,规则才会生效。 + +假定所有的条件都满足,接口 ID 会改变以匹配设备的 MAC 地址。还记得之前的 dmesg 信息显示我的接口名称从 `wlan0` 改成了讨厌的 `wlxec086b1ef0b3` 吗?那都是这条规则的功劳。我怎么知道?因为 `ec:08:6b:1e:f0:b3` 是设备的 MAC 地址(不包括冒号)。 + +``` +$ ifconfig -a +wlxec086b1ef0b3: flags=4163  mtu 1500 +        inet 192.168.0.103  netmask 255.255.255.0  broadcast 192.168.0.255 +        inet6 fe80::7484:3120:c6a3:e3d1  prefixlen 64  scopeid 0x20 +        ether ec:08:6b:1e:f0:b3  txqueuelen 1000  (Ethernet) +        RX packets 682098  bytes 714517869 (714.5 MB) +        RX errors 0  dropped 0  overruns 0  frame 0 +        TX packets 472448  bytes 201773965 (201.7 MB) +        TX errors 0  dropped 0 overruns 0  carrier 0  collisions 0 +``` + +Linux 默认包含这条 udev 规则,我不需要自己写。但是为什么费力进行这样的命名呢——尤其是看到这样的接口命名这么难使用后?仔细看一下包含在规则中的注释: + +> 对直接或间接插入在 USB 上的网络接口使用基于 MAC 的名称,并且用一个普遍提供的(稳定的)MAC 地址(第二位是 0)。当 ifnames 通过内核命令行或 `customizing/disabling 99-default.link`(或之前的 `80-net-setup-link.rules`)被禁用时,不要这样做。 + +注意,这个规则专为基于 USB 的网络接口设计的。和 PCI 网络接口卡(NIC)不同,USB 设备很可能时不时地被移除或者替换,这意味着无法保证它们的 ID 不变。某一天 ID 可能是 `wlan0`,第二天却变成了 `wlan3`。为了避免迷惑应用程序,指定绝对 ID 给设备——就像分配给我的 USB 接口的 ID。 + +### 操作 udev 的设置 + +下一个示例中,我将从 [VirtualBox][5] 虚拟机里抓取以太网接口的 MAC 地址和当前接口 ID,然后用这些信息创建一个改变接口 ID 的 udev 新规则。为什么这么做?也许我打算从命令行操作设备,需要输入那么长的名称让人十分烦恼。下面是工作原理。 + +改变接口 ID 之前,我需要关闭 [Netplan][6] 当前的网络配置,促使 Linux 使用新的配置。下面是 `/etc/netplan/` 目录下我的当前网络接口配置文件: + +``` +$ less /etc/netplan/50-cloud-init.yaml +# This file is generated from information provided by +# the datasource.  Changes to it will not persist across an instance. +# To disable cloud-init's network configuration capabilities, write a file +# /etc/cloud/cloud.cfg.d/99-disable-network-config.cfg with the following: +# network: {config: disabled} +network: +    ethernets: +        enp0s3: +            addresses: [] +            dhcp4: true +    version: 2 +``` + +`50-cloud-init.yaml` 文件包含一个非常基本的接口定义,但是注释中也包含一些禁用配置的重要信息。为此,我将移动到 `/etc/cloud/cloud.cfg.d` 目录,创建一个名为 `/etc/cloud/cloud.cfg.d` 的新文件,插入 `network: {config: disabled}` 字符串。 + +尽管我只在 Ubuntu 发行版上测试了这个方法,但它应该在任何一个带有 systemd 的 Linux(几乎所有的 Linux 发行版都有 systemd)上都可以工作。不管你使用哪个,都可以很好地了解编写 udev 配置文件并对其进行测试。 + +接下来,我需要收集一些系统信息。执行 `ip` 命令,显示我的以太网接口名为 `enp0s3`,MAC 地址是 `08:00:27:1d:28:10`。 + +``` +$ ip a +2: enp0s3: mtu 1500 qdisc fq_codel state UP group default qlen 1000 +    link/ether 08:00:27:1d:28:10 brd ff:ff:ff:ff:ff:ff +    inet 192.168.0.115/24 brd 192.168.0.255 scope global dynamic enp0s3 +``` + +现在,我要在 `/etc/udev/rules.d` 目录创建一个名为 `peristent-net.rules` 的新文件。我将给文件一个以较小的数字开头的名称,比如 10: + +``` +$ cat /etc/udev/rules.d/10-persistent-network.rules +ACTION=="add", SUBSYSTEM=="net",ATTR{address}=="08:00:27:1d:28:10",NAME="eth3" +``` + +数字越小,Linux 越早执行文件,我想要这个文件早点执行。文件被添加时,包含其中的代码就会分配名称 `eth3` 给网络设备——只要设备的地址能够匹配 `08:00:27:1d:28:10`,即我的接口的 MAC 地址 。 + +保存文件并重启计算机后,我的新接口名应该就会生效。我可能需要直接登录虚拟机,使用 `dhclient` 手动让 Linux 为这个新命名的网络请求一个 IP 地址。在执行下列命令前,可能无法打开 SSH 会话: + +``` +$ sudo dhclient eth3 +``` + +大功告成。现在你能够促使 udev 控制计算机按照你想要的方式指向一个网卡,但更重要的是,你已经有了一些工具,可以弄清楚如何管理任何不听话的设备。 + +-------------------------------------------------------------------------------- + +via: https://opensource.com/article/20/2/linux-systemd-udevd + +作者:[David Clinton][a] +选题:[lujun9972][b] +译者:[YungeG](https://github.com/YungeG) +校对:[wxy](https://github.com/wxy) + +本文由 [LCTT](https://github.com/LCTT/TranslateProject) 原创编译,[Linux中国](https://linux.cn/) 荣誉推出 + +[a]: https://opensource.com/users/dbclinton +[b]: https://github.com/lujun9972 +[1]: https://opensource.com/sites/default/files/styles/image-full-size/public/lead-images/osdc_BUS_Apple_520.png?itok=ZJu-hBV1 (collection of hardware on blue backround) +[2]: https://en.wikipedia.org/wiki/Udev +[3]: https://en.wikipedia.org/wiki/Dmesg +[4]: https://pluralsight.pxf.io/RqrJb +[5]: https://www.virtualbox.org/ +[6]: https://netplan.io/ diff --git a/published/202108/20200504 Understanding systemd at startup on Linux.md b/published/202108/20200504 Understanding systemd at startup on Linux.md new file mode 100644 index 0000000000..59f2c0442c --- /dev/null +++ b/published/202108/20200504 Understanding systemd at startup on Linux.md @@ -0,0 +1,421 @@ +[#]: collector: (lujun9972) +[#]: translator: (YungeG) +[#]: reviewer: (wxy) +[#]: publisher: (wxy) +[#]: url: (https://linux.cn/article-13720-1.html) +[#]: subject: (Understanding systemd at startup on Linux) +[#]: via: (https://opensource.com/article/20/5/systemd-startup) +[#]: author: (David Both https://opensource.com/users/dboth) + +理解 systemd 启动时在做什么 +====== + +> systemd 启动过程提供的重要线索可以在问题出现时助你一臂之力。 + +![](https://img.linux.net.cn/data/attachment/album/202108/26/110220piwnicwxvvc1s8io.jpg) + +在本系列的第一篇文章《[学着爱上 systemd][2]》,我考察了 systemd 的功能和架构,以及围绕 systemd 作为古老的 SystemV 初始化程序和启动脚本的替代品的争论。在这第二篇文章中,我将开始探索管理 Linux 启动序列的文件和工具。我会解释 systemd 启动序列、如何更改默认的启动目标(即 SystemV 术语中的运行级别)、以及在不重启的情况下如何手动切换到不同的目标。 + +我还将考察两个重要的 systemd 工具。第一个 `systemctl` 命令是和 systemd 交互、向其发送命令的基本方式。第二个是 `journalctl`,用于访问 systemd 日志,后者包含了大量系统历史数据,比如内核和服务的消息(包括指示性信息和错误信息)。 + +务必使用一个非生产系统进行本文和后续文章中的测试和实验。你的测试系统需要安装一个 GUI 桌面(比如 Xfce、LXDE、Gnome、KDE 或其他)。 + +上一篇文章中我写道计划在这篇文章创建一个 systemd 单元并添加到启动序列。由于这篇文章比我预期中要长,这些内容将留到本系列的下一篇文章。 + +### 使用 systemd 探索 Linux 的启动 + +在观察启动序列之前,你需要做几件事情得使引导和启动序列开放可见。正常情况下,大多数发行版使用一个开机动画或者启动画面隐藏 Linux 启动和关机过程中的显示细节,在基于 Red Hat 的发行版中称作 Plymouth 引导画面。这些隐藏的消息能够向寻找信息以排除程序故障、或者只是学习启动序列的系统管理员提供大量有关系统启动和关闭的信息。你可以通过 GRUB(大统一引导加载器Grand Unified Boot Loader)配置改变这个设置。 + +主要的 GRUB 配置文件是 `/boot/grub2/grub.cfg` ,但是这个文件在更新内核版本时会被覆盖,你不会想修改它的。相反,应该修改用于改变 `grub.cfg` 默认设置的 `/etc/default/grub` 文件。 + +首先看一下当前未修改的 `/etc/default/grub` 文件的版本: + +``` +[root@testvm1 ~]# cd /etc/default ; cat grub +GRUB_TIMEOUT=5 +GRUB_DISTRIBUTOR="$(sed 's, release .*$,,g' /etc/system-release)" +GRUB_DEFAULT=saved +GRUB_DISABLE_SUBMENU=true +GRUB_TERMINAL_OUTPUT="console" +GRUB_CMDLINE_LINUX="resume=/dev/mapper/fedora_testvm1-swap rd.lvm. +lv=fedora_testvm1/root rd.lvm.lv=fedora_testvm1/swap rd.lvm.lv=fedora_ +testvm1/usr rhgb quiet" +GRUB_DISABLE_RECOVERY="true" +[root@testvm1 default]# +``` + +[GRUB 文档][3] 的第 6 章列出了 `/etc/default/grub` 文件的所有可用项,我只关注下面的部分: + + * 我将 GRUB 菜单倒计时的秒数 `GRUB_TIMEOUT`,从 5 改成 10,以便在倒计时达到 0 之前有更多的时间响应 GRUB 菜单。 + * `GRUB_CMDLINE_LINUX` 列出了引导阶段传递给内核的命令行参数,我删除了其中的最后两个参数。其中的一个参数 `rhgb` 代表 “红帽图形化引导Red Hat Graphical Boot”,在内核初始化阶段显示一个小小的 Fedora 图标动画,而不是显示引导阶段的信息。另一个参数 `quiet`,屏蔽显示记录了启动进度和发生错误的消息。系统管理员需要这些信息,因此我删除了 `rhgb` 和 `quiet`。如果引导阶段发生了错误,屏幕上显示的信息可以指向故障的原因。 + +更改之后,你的 GRUB 文件将会像下面一样: + +``` +[root@testvm1 default]# cat grub +GRUB_TIMEOUT=10 +GRUB_DISTRIBUTOR="$(sed 's, release .*$,,g' /etc/system-release)" +GRUB_DEFAULT=saved +GRUB_DISABLE_SUBMENU=true +GRUB_TERMINAL_OUTPUT="console" +GRUB_CMDLINE_LINUX="resume=/dev/mapper/fedora_testvm1-swap rd.lvm. +lv=fedora_testvm1/root rd.lvm.lv=fedora_testvm1/swap rd.lvm.lv=fedora_ +testvm1/usr" +GRUB_DISABLE_RECOVERY="false" +[root@testvm1 default]# +``` + +`grub2-mkconfig` 程序使用 `/etc/default/grub` 文件的内容生成 `grub.cfg` 配置文件,从而改变一些默认的 GRUB 设置。`grub2-mkconfig` 输出到 `STDOUT`,你可以使用程序的 `-o` 参数指明数据流输出的文件,不过使用重定向也同样简单。执行下面的命令更新 `/boot/grub2/grub.cfg` 配置文件: + +``` +[root@testvm1 grub2]# grub2-mkconfig > /boot/grub2/grub.cfg +Generating grub configuration file ... +Found linux image: /boot/vmlinuz-4.18.9-200.fc28.x86_64 +Found initrd image: /boot/initramfs-4.18.9-200.fc28.x86_64.img +Found linux image: /boot/vmlinuz-4.17.14-202.fc28.x86_64 +Found initrd image: /boot/initramfs-4.17.14-202.fc28.x86_64.img +Found linux image: /boot/vmlinuz-4.16.3-301.fc28.x86_64 +Found initrd image: /boot/initramfs-4.16.3-301.fc28.x86_64.img +Found linux image: /boot/vmlinuz-0-rescue-7f12524278bd40e9b10a085bc82dc504 +Found initrd image: /boot/initramfs-0-rescue-7f12524278bd40e9b10a085bc82dc504.img +done +[root@testvm1 grub2]# +``` + +重新启动你的测试系统查看本来会隐藏在 Plymouth 开机动画之下的启动信息。但是如果你没有关闭开机动画,又需要查看启动信息的话又该如何操作?或者你关闭了开机动画,而消息流过的速度太快,无法阅读怎么办?(实际情况如此。) + +有两个解决方案,都涉及到日志文件和 systemd 日志 —— 两个都是你的好伙伴。你可以使用 `less` 命令查看 `/var/log/messages` 文件的内容。这个文件包含引导和启动信息,以及操作系统执行正常操作时生成的信息。你也可以使用不加任何参数的 `journalctl` 命令查看 systemd 日志,包含基本相同的信息: + +``` +[root@testvm1 grub2]# journalctl +-- Logs begin at Sat 2020-01-11 21:48:08 EST, end at Fri 2020-04-03 08:54:30 EDT. -- +Jan 11 21:48:08 f31vm.both.org kernel: Linux version 5.3.7-301.fc31.x86_64 (mockbuild@bkernel03.phx2.fedoraproject.org) (gcc version 9.2.1 20190827 (Red Hat 9.2.1-1) (GCC)) #1 SMP Mon Oct > +Jan 11 21:48:08 f31vm.both.org kernel: Command line: BOOT_IMAGE=(hd0,msdos1)/vmlinuz-5.3.7-301.fc31.x86_64 root=/dev/mapper/VG01-root ro resume=/dev/mapper/VG01-swap rd.lvm.lv=VG01/root rd> +Jan 11 21:48:08 f31vm.both.org kernel: x86/fpu: Supporting XSAVE feature 0x001: 'x87 floating point registers' +Jan 11 21:48:08 f31vm.both.org kernel: x86/fpu: Supporting XSAVE feature 0x002: 'SSE registers' +Jan 11 21:48:08 f31vm.both.org kernel: x86/fpu: Supporting XSAVE feature 0x004: 'AVX registers' +Jan 11 21:48:08 f31vm.both.org kernel: x86/fpu: xstate_offset[2]: 576, xstate_sizes[2]: 256 +Jan 11 21:48:08 f31vm.both.org kernel: x86/fpu: Enabled xstate features 0x7, context size is 832 bytes, using 'standard' format. +Jan 11 21:48:08 f31vm.both.org kernel: BIOS-provided physical RAM map: +Jan 11 21:48:08 f31vm.both.org kernel: BIOS-e820: [mem 0x0000000000000000-0x000000000009fbff] usable +Jan 11 21:48:08 f31vm.both.org kernel: BIOS-e820: [mem 0x000000000009fc00-0x000000000009ffff] reserved +Jan 11 21:48:08 f31vm.both.org kernel: BIOS-e820: [mem 0x00000000000f0000-0x00000000000fffff] reserved +Jan 11 21:48:08 f31vm.both.org kernel: BIOS-e820: [mem 0x0000000000100000-0x00000000dffeffff] usable +Jan 11 21:48:08 f31vm.both.org kernel: BIOS-e820: [mem 0x00000000dfff0000-0x00000000dfffffff] ACPI data +Jan 11 21:48:08 f31vm.both.org kernel: BIOS-e820: [mem 0x00000000fec00000-0x00000000fec00fff] reserved +Jan 11 21:48:08 f31vm.both.org kernel: BIOS-e820: [mem 0x00000000fee00000-0x00000000fee00fff] reserved +Jan 11 21:48:08 f31vm.both.org kernel: BIOS-e820: [mem 0x00000000fffc0000-0x00000000ffffffff] reserved +Jan 11 21:48:08 f31vm.both.org kernel: BIOS-e820: [mem 0x0000000100000000-0x000000041fffffff] usable +Jan 11 21:48:08 f31vm.both.org kernel: NX (Execute Disable) protection: active +Jan 11 21:48:08 f31vm.both.org kernel: SMBIOS 2.5 present. +Jan 11 21:48:08 f31vm.both.org kernel: DMI: innotek GmbH VirtualBox/VirtualBox, BIOS VirtualBox 12/01/2006 +Jan 11 21:48:08 f31vm.both.org kernel: Hypervisor detected: KVM +Jan 11 21:48:08 f31vm.both.org kernel: kvm-clock: Using msrs 4b564d01 and 4b564d00 +Jan 11 21:48:08 f31vm.both.org kernel: kvm-clock: cpu 0, msr 30ae01001, primary cpu clock +Jan 11 21:48:08 f31vm.both.org kernel: kvm-clock: using sched offset of 8250734066 cycles +Jan 11 21:48:08 f31vm.both.org kernel: clocksource: kvm-clock: mask: 0xffffffffffffffff max_cycles: 0x1cd42e4dffb, max_idle_ns: 881590591483 ns +Jan 11 21:48:08 f31vm.both.org kernel: tsc: Detected 2807.992 MHz processor +Jan 11 21:48:08 f31vm.both.org kernel: e820: update [mem 0x00000000-0x00000fff] usable ==> reserved +Jan 11 21:48:08 f31vm.both.org kernel: e820: remove [mem 0x000a0000-0x000fffff] usable + +``` + +由于数据流可能长达几十万甚至几百万行,我在这里截断了它。(我的主要工作站上列出的日志长度是 1,188,482 行。)请确保是在你的测试系统尝试的这个命令。如果系统已经运行了一段时间 —— 即使重启过很多次 —— 还是会显示大量的数据。查看这些日志数据,因为它包含了很多信息,在进行问题判断时可能非常有用。了解这个数据文件在正常的引导和启动过程中的模样,可以帮助你在问题出现时定位问题。 + +我将在本系列之后的文章讨论 systemd 日志、`journalctl` 命令、以及如何整理输出的日志数据来寻找更详细的信息。 + +内核被 GRUB 加载到内存后,必须先将自己从压缩后的文件中解压出来,才能执行任何有意义的操作。解压自己后,内核开始运行,加载 systemd 并转交控制权。 + +引导boot阶段到此结束,此时 Linux 内核和 systemd 正在运行,但是无法为用户执行任何生产性任务,因为其他的程序都没有执行,没有命令行解释器提供命令行,没有后台进程管理网络和其他的通信链接,也没有任何东西能够控制计算机执行生产功能。 + +现在 systemd 可以加载所需的功能性单元以便将系统启动到选择的目标运行状态。 + +### 目标 + +一个 systemd 目标target代表一个 Linux 系统当前的或期望的运行状态。与 SystemV 启动脚本十分类似,目标定义了系统运行必须存在的服务,以及处于目标状态下必须激活的服务。图表 1 展示了使用 systemd 的 Linux 系统可能的运行状态目标。就像在本系列的第一篇文章以及 systemd 启动的手册页(`man bootup`)所看到的一样,有一些开启不同必要服务的其他中间目标,包括 `swap.target`、`timers.target`、`local-fs.target` 等。一些目标(像 `basic.target`)作为检查点使用,在移动到下一个更高级的目标之前保证所有需要的服务已经启动并运行。 + +除非开机时在 GRUB 菜单进行更改,systemd 总是启动 `default.target`。`default.target` 文件是指向真实的目标文件的符号链接。对于桌面工作站,`default.target` 通常是 `graphical.target`,等同于 SystemV 的运行等级 5。对于服务器,默认目标多半是 `multi-user.target`,就像 SystemV 的运行等级 3。`emergency.target` 文件类似单用户模式。目标和服务service都是一种 systemd 单元。 + +下面的图表,包含在本系列的上一篇文章中,比较了 systemd 目标和古老的 SystemV 启动运行等级。为了向后兼容,systemd 提供了 systemd 目标别名,允许脚本和系统管理员使用像 `init 3` 一样的 SystemV 命令改变运行等级。当然,SystemV 命令被转发给 systemd 进行解释和执行。 + +**systemd 目标** | **SystemV 运行级别** | **目标别名** | **描述** +---|---|---|--- +| `default.target` | | | 这个目标通常是一个符号链接,作为 `multi-user.target` 或 `graphical.target` 的别名。systemd 总是用 `default.target` 启动系统。`default.target** 不能作为 `halt.target`、`poweroff.target` 和 `reboot.target` 的别名。| +| `graphical.target` | 5 | `runlevel5.target` | 带有 GUI 的 `multi-user.target` 。| +| | 4 | `runlevel4.target` | 未使用。运行等级 4 和 SystemV 的运行等级 3 一致,可以创建这个目标并进行定制,用于启动本地服务,而不必更改默认的 `multi-user.target`。 | +| `multi-user.target` | 3 | `runlevel3.target` | 运行所有的服务,但是只有命令行界面(CLI) 。| +| | 2 | `runlevel2.target` | 多用户,没有 NFS,但是运行其他所有的非 GUI 服务 +| `rescue.target` | 1 | `runlevel1.target` | 一个基本的系统,包括挂载文件系统,但是只运行最基础的服务,以及一个主控制台上的用于救援的命令行解释器。| +| `emergency.target` | S | | 单用户模式 —— 没有服务运行;文件系统没有挂载。这是最基础级的操作模式,只有一个运行在主控制台的用于紧急情况的命令行解释器,供用户和系统交互。 | +| `halt.target` | | | 不断电的情况下停止系统 | +| `reboot.target` | 6 | `runlevel6.target` | 重启 | +| `poweroff.target` | 0 | `runlevel0.target` | 停止系统并关闭电源 | + +每个目标在配置文件中都描述了一组依赖关系。systemd 启动需要的依赖,即 Linux 主机运行在特定功能级别所需的服务。加载目标配置文件中列出的所有依赖并运行后,系统就运行在那个目标等级。如果愿意,你可以在本系列的第一篇文章《[学着爱上 systemd][2]》中回顾 systemd 的启动序列和运行时目标。 + +### 探索当前的目标 + +许多 Linux 发行版默认安装一个 GUI 桌面界面,以便安装的系统可以像工作站一样使用。我总是从 Fedora Live USB 引导驱动器安装 Xfce 或 LXDE 桌面。即使是安装一个服务器或者其他基础类型的主机(比如用于路由器和防火墙的主机),我也使用 GUI 桌面的安装方式。 + +我可以安装一个没有桌面的服务器(数据中心的典型做法),但是这样不满足我的需求。原因不是我需要 GUI 桌面本身,而是 LXDE 安装包含了许多其他默认的服务器安装没有提供的工具,这意味着初始安装之后我需要做的工作更少。 + +但是,仅仅因为有 GUI 桌面并不意味着我要使用它。我有一个 16 端口的 KVM,可以用于访问我的大部分 Linux 系统的 KVM 接口,但我和它们交互的大部分交互是通过从我的主要工作站建立的远程 SSH 连接。这种方式更安全,而且和 `graphical.target` 相比,运行 `multi-user.target` 使用更少的系统资源。 + +首先,检查默认目标,确认是 `graphical.target`: + +``` +[root@testvm1 ~]# systemctl get-default +graphical.target +[root@testvm1 ~]# +``` + +然后确认当前正在运行的目标,应该和默认目标相同。你仍可以使用老方法,输出古老的 SystemV 运行等级。注意,前一个运行等级在左边,这里是 `N`(意思是 None),表示主机启动后没有修改过运行等级。数字 5 是当前的目标,正如古老的 SystemV 术语中的定义: + +``` +[root@testvm1 ~]# runlevel +N 5 +[root@testvm1 ~]# +``` + +注意,`runlevel` 的手册页指出运行等级已经被淘汰,并提供了一个转换表。 + +你也可以使用 systemd 方式,命令的输出有很多行,但确实用 systemd 术语提供了答案: + +``` +[root@testvm1 ~]# systemctl list-units --type target +UNIT                   LOAD   ACTIVE SUB    DESCRIPTION                 +basic.target           loaded active active Basic System               +cryptsetup.target      loaded active active Local Encrypted Volumes     +getty.target           loaded active active Login Prompts               +graphical.target       loaded active active Graphical Interface         +local-fs-pre.target    loaded active active Local File Systems (Pre)   +local-fs.target        loaded active active Local File Systems         +multi-user.target      loaded active active Multi-User System           +network-online.target  loaded active active Network is Online           +network.target         loaded active active Network                     +nfs-client.target      loaded active active NFS client services         +nss-user-lookup.target loaded active active User and Group Name Lookups +paths.target           loaded active active Paths                       +remote-fs-pre.target   loaded active active Remote File Systems (Pre)   +remote-fs.target       loaded active active Remote File Systems         +rpc_pipefs.target      loaded active active rpc_pipefs.target           +slices.target          loaded active active Slices                     +sockets.target         loaded active active Sockets                     +sshd-keygen.target     loaded active active sshd-keygen.target         +swap.target            loaded active active Swap                       +sysinit.target         loaded active active System Initialization       +timers.target          loaded active active Timers                     + +LOAD   = Reflects whether the unit definition was properly loaded. +ACTIVE = The high-level unit activation state, i.e. generalization of SUB. +SUB    = The low-level unit activation state, values depend on unit type. + +21 loaded units listed. Pass --all to see loaded but inactive units, too. +To show all installed unit files use 'systemctl list-unit-files'. +``` + +上面列出了当前加载的和激活的目标,你也可以看到 `graphical.target` 和 `multi-user.target`。`multi-user.target` 需要在 `graphical.target` 之前加载。这个例子中,`graphical.target` 是激活的。 + +### 切换到不同的目标 + +切换到 `multi-user.target` 很简单: + +``` +[root@testvm1 ~]# systemctl isolate multi-user.target +``` + +显示器现在应该从 GUI 桌面或登录界面切换到了一个虚拟控制台。登录并列出当前激活的 systemd 单元,确认 `graphical.target` 不再运行: + +``` +[root@testvm1 ~]# systemctl list-units --type target +``` + +务必使用 `runlevel` 确认命令输出了之前的和当前的“运行等级”: + +``` +[root@testvm1 ~]# runlevel +5 3 +``` + +### 更改默认目标 + +现在,将默认目标改为 `multi-user.target`,以便系统总是启动进入 `multi-user.target`,从而使用控制台命令行接口而不是 GUI 桌面接口。使用你的测试主机的根用户,切换到保存 systemd 配置的目录,执行一次快速列出操作: + +``` +[root@testvm1 ~]# cd /etc/systemd/system/ ; ll +drwxr-xr-x. 2 root root 4096 Apr 25  2018  basic.target.wants +<snip> +lrwxrwxrwx. 1 root root   36 Aug 13 16:23  default.target -> /lib/systemd/system/graphical.target +lrwxrwxrwx. 1 root root   39 Apr 25  2018  display-manager.service -> /usr/lib/systemd/system/lightdm.service +drwxr-xr-x. 2 root root 4096 Apr 25  2018  getty.target.wants +drwxr-xr-x. 2 root root 4096 Aug 18 10:16  graphical.target.wants +drwxr-xr-x. 2 root root 4096 Apr 25  2018  local-fs.target.wants +drwxr-xr-x. 2 root root 4096 Oct 30 16:54  multi-user.target.wants +<snip> +[root@testvm1 system]# +``` + +为了强调一些有助于解释 systemd 如何管理启动过程的重要事项,我缩短了这个列表。你应该可以在虚拟机看到完整的目录和链接列表。 + +`default.target` 项是指向目录 `/lib/systemd/system/graphical.target` 的符号链接(软链接),列出那个目录查看目录中的其他内容: + +``` +[root@testvm1 system]# ll /lib/systemd/system/ | less +``` + +你应该在这个列表中看到文件、目录、以及更多链接,但是专门寻找一下 `multi-user.target` 和 `graphical.target`。现在列出 `default.target`(指向 `/lib/systemd/system/graphical.target` 的链接)的内容: + +``` +[root@testvm1 system]# cat default.target +#  SPDX-License-Identifier: LGPL-2.1+ +# +#  This file is part of systemd. +# +#  systemd is free software; you can redistribute it and/or modify it +#  under the terms of the GNU Lesser General Public License as published by +#  the Free Software Foundation; either version 2.1 of the License, or +#  (at your option) any later version. + +[Unit] +Description=Graphical Interface +Documentation=man:systemd.special(7) +Requires=multi-user.target +Wants=display-manager.service +Conflicts=rescue.service rescue.target +After=multi-user.target rescue.service rescue.target display-manager.service +AllowIsolate=yes +[root@testvm1 system]# +``` + +`graphical.target` 文件的这个链接描述了图形用户接口需要的所有必备条件。我会在本系列的下一篇文章至少探讨其中的一些选项。 + +为了使主机启动到多用户模式,你需要删除已有的链接,创建一个新链接指向正确目标。如果你的 [PWD][5] 不是 `/etc/systemd/system`,切换过去: + +``` +[root@testvm1 system]# rm -f default.target +[root@testvm1 system]# ln -s /lib/systemd/system/multi-user.target default.target +``` + +列出 `default.target` 链接,确认其指向了正确的文件: + +``` +[root@testvm1 system]# ll default.target +lrwxrwxrwx 1 root root 37 Nov 28 16:08 default.target -> /lib/systemd/system/multi-user.target +[root@testvm1 system]# +``` + +如果你的链接看起来不一样,删除并重试。列出 `default.target` 链接的内容: + +``` +[root@testvm1 system]# cat default.target +#  SPDX-License-Identifier: LGPL-2.1+ +# +#  This file is part of systemd. +# +#  systemd is free software; you can redistribute it and/or modify it +#  under the terms of the GNU Lesser General Public License as published by +#  the Free Software Foundation; either version 2.1 of the License, or +#  (at your option) any later version. + +[Unit] +Description=Multi-User System +Documentation=man:systemd.special(7) +Requires=basic.target +Conflicts=rescue.service rescue.target +After=basic.target rescue.service rescue.target +AllowIsolate=yes +[root@testvm1 system]# +``` + +`default.target`(这里其实是指向 `multi-user.target` 的链接)其中的 `[Unit]` 部分现在有不同的必需条件。这个目标不需要有图形显示管理器。 + +重启,你的虚拟机应该启动到虚拟控制台 1 的控制台登录,虚拟控制台 1 在显示器标识为 `tty1`。现在你已经知道如何修改默认的目标,使用所需的命令将默认目标改回 `graphical.target`。 + +首先检查当前的默认目标: + +``` +[root@testvm1 ~]# systemctl get-default +multi-user.target +[root@testvm1 ~]# systemctl set-default graphical.target +Removed /etc/systemd/system/default.target. +Created symlink /etc/systemd/system/default.target → /usr/lib/systemd/system/graphical.target. +[root@testvm1 ~]# +``` + +输入下面的命令直接切换到 `graphical.target` 和显示管理器的登录界面,不需要重启: + +``` +[root@testvm1 system]# systemctl isolate default.target +``` + +我不清楚为何 systemd 的开发者选择了术语 `isolate` 作为这个子命令。我的研究表明指的可能是运行指明的目标,但是“隔离”并终结其他所有启动该目标不需要的目标。然而,命令执行的效果是从一个运行的目标切换到另一个——在这个例子中,从多用户目标切换到图形目标。上面的命令等同于 SystemV 启动脚本和 `init` 程序中古老的 `init 5` 命令。 + +登录 GUI 桌面,确认能正常工作。 + +### 总结 + +本文探索了 Linux systemd 启动序列,开始探讨两个重要的 systemd 工具 `systemdctl` 和 `journalctl`,还说明了如何从一个目标切换到另一个目标,以及如何修改默认目标。 + +本系列的下一篇文章中将会创建一个新的 systemd 单元,并配置为启动阶段运行。下一篇文章还会查看一些配置选项,可以帮助确定某个特定的单元在序列中启动的位置,比如在网络启动运行后。 + +### 资源 + +关于 systemd 网络上有大量的信息,但大部分都简短生硬、愚钝、甚至令人误解。除了本文提到的资源,下面的网页提供了关于 systemd 启动更详细可靠的信息。 + + * Fedora 项目有一个优质实用的 [systemd 指南][6],几乎有你使用 systemd 配置、管理、维护一个 Fedora 计算机需要知道的一切。 + * Fedora 项目还有一个好用的 [速查表][7],交叉引用了古老的 SystemV 命令和对应的 systemd 命令。 + * 要获取 systemd 的详细技术信息和创立的原因,查看 [Freedesktop.org][8] 的 [systemd 描述][9]。 + * Linux.com 上“systemd 的更多乐趣”提供了更高级的 systemd [信息和提示][11]。 + +还有一系列针对系统管理员的深层技术文章,由 systemd 的设计者和主要开发者 Lennart Poettering 所作。这些文章写于 2010 年 4 月到 2011 年 9 月之间,但在当下仍然像当时一样有价值。关于 systemd 及其生态的许多其他优秀的作品都是基于这些文章的。 + + * [Rethinking PID 1][12] + * [systemd for Administrators, Part I][13] + * [systemd for Administrators, Part II][14] + * [systemd for Administrators, Part III][15] + * [systemd for Administrators, Part IV][16] + * [systemd for Administrators, Part V][17] + * [systemd for Administrators, Part VI][18] + * [systemd for Administrators, Part VII][19] + * [systemd for Administrators, Part VIII][20] + * [systemd for Administrators, Part IX][21] + * [systemd for Administrators, Part X][22] + * [systemd for Administrators, Part XI][23] + + +-------------------------------------------------------------------------------- + +via: https://opensource.com/article/20/5/systemd-startup + +作者:[David Both][a] +选题:[lujun9972][b] +译者:[YungeG](https://github.com/YungeG) +校对:[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/start_line.jpg?itok=9reaaW6m (People at the start line of a race) +[2]: https://opensource.com/article/20/4/systemd +[3]: http://www.gnu.org/software/grub/manual/grub +[4]: mailto:mockbuild@bkernel03.phx2.fedoraproject.org +[5]: https://en.wikipedia.org/wiki/Pwd +[6]: https://docs.fedoraproject.org/en-US/quick-docs/understanding-and-administering-systemd/index.html +[7]: https://fedoraproject.org/wiki/SysVinit_to_Systemd_Cheatsheet +[8]: http://Freedesktop.org +[9]: http://www.freedesktop.org/wiki/Software/systemd +[10]: http://Linux.com +[11]: https://www.linux.com/training-tutorials/more-systemd-fun-blame-game-and-stopping-services-prejudice/ +[12]: http://0pointer.de/blog/projects/systemd.html +[13]: http://0pointer.de/blog/projects/systemd-for-admins-1.html +[14]: http://0pointer.de/blog/projects/systemd-for-admins-2.html +[15]: http://0pointer.de/blog/projects/systemd-for-admins-3.html +[16]: http://0pointer.de/blog/projects/systemd-for-admins-4.html +[17]: http://0pointer.de/blog/projects/three-levels-of-off.html +[18]: http://0pointer.de/blog/projects/changing-roots +[19]: http://0pointer.de/blog/projects/blame-game.html +[20]: http://0pointer.de/blog/projects/the-new-configuration-files.html +[21]: http://0pointer.de/blog/projects/on-etc-sysinit.html +[22]: http://0pointer.de/blog/projects/instances.html +[23]: http://0pointer.de/blog/projects/inetd.html diff --git a/published/202108/20200907 A beginner-s guide to SSH for remote connection on Linux.md b/published/202108/20200907 A beginner-s guide to SSH for remote connection on Linux.md new file mode 100644 index 0000000000..1d32280bd6 --- /dev/null +++ b/published/202108/20200907 A beginner-s guide to SSH for remote connection on Linux.md @@ -0,0 +1,173 @@ +[#]: collector: (lujun9972) +[#]: translator: (unigeorge) +[#]: reviewer: (wxy) +[#]: publisher: (wxy) +[#]: url: (https://linux.cn/article-13726-1.html) +[#]: subject: (A beginner’s guide to SSH for remote connection on Linux) +[#]: via: (https://opensource.com/article/20/9/ssh) +[#]: author: (Seth Kenlon https://opensource.com/users/seth) + +Linux 远程连接之 SSH 新手指南 +====== + +> 学会使用安全外壳协议连接远程计算机。 + +![](https://img.linux.net.cn/data/attachment/album/202108/28/105409ztj7akfjpcluwjp3.jpg) + +使用 Linux,你只需要在键盘上输入命令,就可以巧妙地使用计算机(甚至这台计算机可以在世界上任何地方),这正是 Linux 最吸引人的特性之一。有了 OpenSSH,[POSIX][2] 用户就可以在有权限连接的计算机上打开安全外壳协议,然后远程使用。这对于许多 Linux 用户来说可能不过是日常任务,但从没操作过的人可能就会感到很困惑。本文介绍了如何配置两台计算机的 安全外壳协议secure shell(简称 SSH)连接,以及如何在没有密码的情况下安全地从一台计算机连接到另一台计算机。 + +### 相关术语 + +在讨论多台计算机时,如何将不同计算机彼此区分开可能会让人头疼。IT 社区拥有完善的术语来描述计算机联网的过程。 + + * 服务service: + 服务是指在后台运行的软件,因此它不会局限于仅供安装它的计算机使用。例如,Web 服务器通常托管着 Web 共享 _服务_。该术语暗含(但非绝对)它是没有图形界面的软件。 + * 主机host: + 主机可以是任何计算机。在 IT 中,任何计算机都可以称为 _主机_,因为从技术上讲,任何计算机都可以托管host对其他计算机有用的应用程序。你可能不会把自己的笔记本电脑视为 **主机**,但其实上面可能正运行着一些对你、你的手机或其他计算机有用的服务。 + * 本地local: + 本地计算机是指用户或某些特定软件正在使用的计算机。例如,每台计算机都会把自己称为 `localhost`。 + * 远程remote: + 远程计算机是指你既没在其面前,也没有在实际使用的计算机,是真正意义上在 _远程_ 位置的计算机。 + +现在术语已经明确好,我们可以开始了。 + +### 在每台主机上激活 SSH + +要通过 SSH 连接两台计算机,每个主机都必须安装 SSH。SSH 有两个组成部分:本地计算机上使用的用于启动连接的命令,以及用于接收连接请求的 _服务器_。有些计算机可能已经安装好了 SSH 的一个或两个部分。验证 SSH 是否完全安装的命令因系统而异,因此最简单的验证方法是查阅相关配置文件: + +``` +$ file /etc/ssh/ssh_config +/etc/ssh/ssh_config: ASCII text +``` + +如果返回 `No such file or directory` 错误,说明没有安装 SSH 命令。 + +SSH 服务的检测与此类似(注意文件名中的 `d`): + +``` +$ file /etc/ssh/sshd_config +/etc/ssh/sshd_config: ASCII text +``` + +根据缺失情况选择安装两个组件: + +``` +$ sudo dnf install openssh-clients openssh-server +``` + +在远程计算机上,使用 systemd 命令启用 SSH 服务: + +``` +$ sudo systemctl enable --now sshd +``` + +你也可以在 GNOME 上的 **系统设置** 或 macOS 上的 **系统首选项** 中启用 SSH 服务。在 GNOME 桌面上,该设置位于 **共享** 面板中: + +![在 GNOME 系统设置中激活 SSH][3] + +### 开启安全外壳协议 + +现在你已经在远程计算机上安装并启用了 SSH,可以尝试使用密码登录作为测试。要访问远程计算机,你需要有用户帐户和密码。 + +远程用户不必与本地用户相同。只要拥有相应用户的密码,你就可以在远程机器上以任何用户的身份登录。例如,我在我的工作计算机上的用户是 `sethkenlon` ,但在我的个人计算机上是 `seth`。如果我正在使用我的个人计算机(即作为当前的本地计算机),并且想通过 SSH 连接到我的工作计算机,我可以通过将自己标识为 `sethkenlon` 并使用我的工作密码来实现连接。 + +要通过 SSH 连接到远程计算机,你必须知道其 IP 地址或可解析的主机名。在远程计算机上使用 `ip` 命令可以查看该机器的 IP 地址: + +``` +$ ip addr show | grep "inet " +inet 127.0.0.1/8 scope host lo +inet 10.1.1.5/27 brd 10.1.1.31 [...] +``` + +如果远程计算机没有 `ip` 命令,可以尝试使用 `ifconfig` 命令(甚至可以试试 Windows 上通用的 `ipconfig` 命令)。 + +`127.0.0.1` 是一个特殊的地址,它实际上是 `localhost` 的地址。这是一个环回loopback地址,系统使用它来找到自己。这在登录远程计算机时并没有什么用,因此在此示例中,远程计算机的正确 IP 地址为 `10.1.1.5`。在现实生活中,我的本地网络正在使用 `10.1.1.0` 子网,进而可得知前述正确的 IP 地址。如果远程计算机在不同的网络上,那么 IP 地址几乎可能是任何地址(但绝不会是 `127.0.0.1`),并且可能需要一些特殊的路由才能通过各种防火墙到达远程。如果你的远程计算机在同一个网络上,但想要访问比自己的网络更远的计算机,请阅读我之前写的关于 [在防火墙中打开端口][5] 的文章。 + +如果你能通过 IP 地址 _或_ 主机名 `ping` 到远程机器,并且拥有登录帐户,那么就可以通过 SSH 接入远程机器: + +``` +$ ping -c1 10.1.1.5 +PING 10.1.1.5 (10.1.1.5) 56(84) bytes of data. +64 bytes from 10.1.1.5: icmp_seq=1 ttl=64 time=4.66 ms +$ ping -c1 akiton.local +PING 10.1.1.5 (10.1.1.5) 56(84) bytes of data. +``` + +至此就成功了一小步。再试试使用 SSH 登录: + +``` +$ whoami +seth +$ ssh sethkenlon@10.1.1.5 +bash$ whoami +sethkenlon +``` + +测试登录有效,下一节会介绍如何激活无密码登录。 + +### 创建 SSH 密钥 + +要在没有密码的情况下安全地登录到另一台计算机,登录者必须拥有 SSH 密钥。可能你的机器上已经有一个 SSH 密钥,但再多创建一个新密钥也没有什么坏处。SSH 密钥的生命周期是在本地计算机上开始的,它由两部分组成:一个是永远不会与任何人或任何东西共享的私钥,一个是可以复制到任何你想要无密码访问的远程机器上的公钥。 + +有的人可能会创建一个 SSH 密钥,并将其用于从远程登录到 GitLab 身份验证的所有操作,但我会选择对不同的任务组使用不同的密钥。例如,我在家里使用一个密钥对本地机器进行身份验证,使用另一个密钥对我维护的 Web 服务器进行身份验证,再一个单独的密钥用于 Git 主机,以及又一个用于我托管的 Git 存储库,等等。在此示例中,我将只创建一个唯一密钥,以在局域网内的计算机上使用。 + +使用 `ssh-keygen` 命令创建新的 SSH 密钥: + +``` +$ ssh-keygen -t ed25519 -f ~/.ssh/lan +``` + +`-t` 选项代表 _类型_ ,上述代码设置了一个高于默认值的密钥加密级别。`-f` 选项代表 _文件_,指定了密钥的文件名和位置。运行此命令后会生成一个名为 `lan` 的 SSH 私钥和一个名为 `lan.pub` 的 SSH 公钥。 + +使用 `ssh-copy-id` 命令把公钥发送到远程机器上,在此之前要先确保具有远程计算机的 SSH 访问权限。如果你无法使用密码登录远程主机,也就无法设置无密码登录: + +``` +$ ssh-copy-id -i ~/.ssh/lan.pub sethkenlon@10.1.1.5 +``` + +过程中系统会提示你输入远程主机上的登录密码。 + +操作成功后,使用 `-i` 选项将 SSH 命令指向对应的密钥(在本例中为 `lan`)再次尝试登录: + +``` +$ ssh -i ~/.ssh/lan sethkenlon@10.1.1.5 +bash$ whoami +sethkenlon +``` + +对局域网上的所有计算机重复此过程,你就将能够无密码访问这个局域网上的每台主机。实际上,一旦你设置了无密码认证,你就可以编辑 `/etc/ssh/sshd_config` 文件来禁止密码认证。这有助于防止其他人使用 SSH 对计算机进行身份验证,除非他们拥有你的私钥。要想达到这个效果,可以在有 `sudo` 权限的文本编辑器中打开 `/etc/ssh/sshd_config` 并搜索字符串 `PasswordAuthentication`,将默认行更改为: + +``` +PasswordAuthentication no +``` + +保存并重启 SSH 服务器: + +``` +$ sudo systemctl restart sshd && echo "OK" +OK +$ +``` + +### 日常使用 SSH + +OpenSSH 改变了人们对操作计算机的看法,使用户不再被束缚在面前的计算机上。使用 SSH,你可以访问家中的任何计算机,或者拥有帐户的服务器,甚至是移动和物联网设备。充分利用 SSH 也意味着解锁 Linux 终端的更多用途。如果你还没有使用过 SSH,请试一下它吧。试着适应 SSH,创建一些适当的密钥,以此更安全地使用计算机,打破必须与计算机面对面的局限性。 + +-------------------------------------------------------------------------------- + +via: https://opensource.com/article/20/9/ssh + +作者:[Seth Kenlon][a] +选题:[lujun9972][b] +译者:[unigeorge](https://github.com/unigeorge) +校对:[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-window-focus.png?itok=g0xPm2kD (young woman working on a laptop) +[2]: https://opensource.com/article/19/7/what-posix-richard-stallman-explains +[3]: https://opensource.com/sites/default/files/uploads/gnome-activate-remote-login.png (Activate SSH in GNOME System Settings) +[4]: https://creativecommons.org/licenses/by-sa/4.0/ +[5]: https://opensource.com/article/20/8/open-ports-your-firewall diff --git a/published/202108/20210308 How the ARPANET Protocols Worked.md b/published/202108/20210308 How the ARPANET Protocols Worked.md new file mode 100644 index 0000000000..7794a808f4 --- /dev/null +++ b/published/202108/20210308 How the ARPANET Protocols Worked.md @@ -0,0 +1,125 @@ +[#]: subject: (How the ARPANET Protocols Worked) +[#]: via: (https://twobithistory.org/2021/03/08/arpanet-protocols.html) +[#]: author: (Two-Bit History https://twobithistory.org) +[#]: collector: (lujun9972) +[#]: translator: (Lin-vy) +[#]: reviewer: (wxy) +[#]: publisher: (wxy) +[#]: url: (https://linux.cn/article-13643-1.html) + +ARPANET 协议是如何工作的 +====== + +![](https://img.linux.net.cn/data/attachment/album/202108/03/130239ybmxjmixx3xbx7ix.jpg) + +ARPANET 通过证明可以使用标准化协议连接完全不同的制造商的计算机,永远改变了计算。在我的 [关于 ARPANET 的历史意义的文章][1] 中,我提到了其中的一些协议,但没有详细描述它们。所以我想仔细看看它们。也想看看那些早期协议的设计有多少保留到了我们今天使用的协议中。 + +ARPANET 协议像我们现代的互联网协议,是通过分层形式来组织的。[^1] 较高层协议运行在较低层协议之上。如今的 TCP/IP 套件有 5 层(物理层、链路层、网络层、传输层以及应用层),但是这个 ARPANET 仅有 3 层,也可能是 4 层,这取决于你怎样计算它们。 + +我将会解释每一层是如何工作的,但首先,你需要知道是谁在 ARPANET 中构建了些什么,你需要知道这一点才能理解为什么这些层是这样划分的。 + +### 一些简短的历史背景 + +ARPANET 由美国联邦政府资助,确切的说是位于美国国防部的高级研究计划局Advanced Research Projects Agency(因此被命名为 “ARPANET” )。美国政府并没有直接建设这个网络;而是,把这项工作外包给了位于波士顿的一家名为 “Bolt, Beranek, and Newman” 的咨询公司,通常更多时候被称为 BBN。 + +而 BBN 则承担了实现这个网络的大部分任务,但不是全部。BBN 所做的是设计和维护一种称为接口消息处理机Interface Message Processor(简称为 IMP) 的机器。这个 IMP 是一种定制的霍尼韦尔Honeywell小型机minicomputer,它们被分配给那些想要接入这个 ARPANET 的遍及全国各地的各个站点。它们充当通往 ARPANET 的网关,为每个站点提供多达四台主机的连接支持。它基本上是一台路由器。BBN 控制在 IMP 上运行的软件,把数据包从一个 IMP 转发到另一个 IMP ,但是该公司无法直接控制那些将要连接到 IMP 上并且成为 ARPANET 网络中实际主机的机器。 + +那些主机由网络中作为终端用户的计算机科学家们所控制。这些计算机科学家在全国各地的主机站负责编写软件,使主机之间能够相互通讯。而 IMP 赋予主机之间互相发送消息的能力,但是那并没有多大用处,除非主机之间能商定一种用于消息的格式。为了解决这个问题,一群杂七杂八的人员组成了网络工作组,其中有大部分是来自各个站点的研究生们,该组力求规定主机计算机使用的协议。 + +因此,如果你设想通过 ARPANET 进行一次成功的网络互动,(例如发送一封电子邮件),使这些互动成功的一些工程由一组人负责(BBN),然而其他的一些工程则由另一组人负责(网络工作组和在每个站点的工程师们)。这种组织和后勤方面的偶然性或许对推动采用分层的方法来管理 ARPANET 网络中的协议起到很大的作用,这反过来又影响了 TCP/IP 的分层方式。 + +### 好的,回到协议上来 + +![ARPANET Network Stack][3] + +*ARPANET 协议层次结构* + +这些协议层被组织成一个层次结构,在最底部是 “Level 0”。[^2] 这在某种意义上是不算数的,因为在 ARPANET 中这层完全由 BBN 控制,所以不需要标准协议。Level 0 的作用是管理数据在 IMP 之间如何传输。在 BBN 内部,有管理 IMP 如何做到这一点的规则;在 BBN 之外,IMP 子网是一个黑匣子,它只会传送你提供的任意数据。因此,Level 0 是一个没有真正协议的层,就公开已知和商定的规则集而言,它的存在可以被运行在 ARPANET 的主机上的软件忽略。粗略地说,它处理相当于当今使用的 TCP/IP 套件的物理层、链路层和网络层下的所有内容,甚至还包括相当多的传输层,这是我将在这篇文章的末尾回来讨论的内容。 + +“Level 1” 层在 ARPANET 的主机和它们所连接的 IMP 之间建立了接口。如果你愿意,可以认为它是为 BBN 构建的 “Level 0” 层的黑匣子使用的一个应用程序接口(API)。当时它也被称为 IMP-Host 协议。必须编写该协议并公布出来,因为在首次建立 ARPANET 网络时,每个主机站点都必须编写自己的软件来与 IMP 连接。除非 BBN 给他们一些指导,否则他们不会知道如何做到这一点。 + +BBN 在一份名为 [BBN Report 1822][5] 的冗长文件中规定了 IMP-Host 协议。随着 ARPANET 的发展,该文件多次被修订;我将在这里大致描述 IMP-Host 协议最初设计时的工作方式。根据 BBN 的规则,主机可以将长度不超过 8095 位的消息传递给它们的 IMP,并且每条消息都有一个包含目标主机号和链路识别号的头部字段。[^3] IMP 将检查指定的主机号,然后尽职尽责地将消息转发到网络中。当从远端主机接收到消息时,接收的 IMP 在将消息传递给本地主机之前会把目标主机号替换为源主机号。实际上在 IMP 之间传递的内容并不是消息 —— IMP 将消息分解成更小的数据包以便通过网络传输 —— 但该细节对主机来说是不可见的。 + +![1969 Host-IMP Leader][7] + +*Host-IMP 消息头部格式,截至 1969。 图表来自 [BBN Report 1763][8]* + +链路号的取值范围为 0 到 255 ,它有两个作用。一是更高级别的协议可以利用它在网络上的任何两台主机之间建立多个通信信道,因为可以想象得到,在任何时刻都有可能存在多个本地用户与同一个目标主机进行通信的场景(换句话说,链路号允许在主机之间进行多路通信)。二是它也被用在 “Level 1” 层去控制主机之间发送的大量流量,以防止高性能计算机压制低性能计算机的情况出现。按照最初的设计,这个 IMP-Host 协议限制每台主机在某一时刻通过某条链路仅发送一条消息。一旦某台主机沿着某条链路发送了一条消息给远端主机后,在它沿着该链路发送下一条消息之前,必须等待接收一条来自远端的 IMP 的特别类型的消息,叫做 RFNM(请求下一条消息Request for Next Message)。后来为了提高性能,对该系统进行了修订,允许一台主机在给定的时刻传送多达 8 条消息给另一台主机。[^4] + +“Level 2” 层才是事情真正开始变得有趣的地方,因为这一层和在它上面的那一层由 BBN 和国防部全部留给学者们和网络工作组自己去研发。“Level 2” 层包括了 Host-Host 协议,这个协议最初在 RFC9 中草拟,并且在 RFC54 中首次正式规定。在 [ARPANET 协议手册][10] 中有更易读的 Host-Host 协议的解释。 + +“Host-Host 协议” 管理主机之间如何创建和管理连接。“连接”是某个主机上的写套接字和另一个主机上的读套接字之间的一个单向的数据管道。“套接字socket” 的概念是在 “Level-1” 层的有限的链路设施(记住,链路号只能是那 256 个值中的一个)之上被引入的,是为了给程序提供寻址运行在远端主机上的特定进程的一种方式。“读套接字” 是用偶数表示的,而“写套接字”是用奇数表示的;套接字是 “读” 还是 “写” 被称为套接字的 “性别”。并没有类似于 TCP 协议那样的 “端口号” 机制,连接的打开、维持以及关闭操作是通过主机之间使用 “链路 0” 发送指定格式的 Host-Host 控制消息来实现的,这也是 “链路 0” 被保留的目的。一旦在 “链路 0” 上交换控制消息来建立起一个连接后,就可以使用接收端挑选的另一个链路号来发送进一步的数据消息。 + +Host-Host 控制消息一般通过 3 个字母的助记符来表示。当两个主机交换一条 STR(发送端到接收端sender-to-receiver)消息和一条配对的 RTS(接收端到发送端receiver-to-sender)消息后,就建立起了一条连接 —— 这些控制消息都被称为请求链接消息。链接能够被 CLS(关闭close)控制消息关闭。还有更多的控制信息能够改变从发送端到接收端发送消息的速率。从而再次需要确保较快的主机不会压制较慢的主机。在 “Level 1” 层上的协议提供了流量控制的功能,但对 “Level 2” 层来说显然是不够的;我怀疑这是因为从远端 IMP 接收到的 RFNM 只能保证远端 IMP 已经传送该消息到目标主机,而不能保证目标主机已经全部处理了该消息。还有 INR(接收端中断interrupt-by-receiver)、INS(发送端中断interrupt-by-sender)控制消息,主要供更高级别的协议使用。 + +更高级别的协议都位于 “Level 3”,这层是 ARPANET 的应用层。Telnet 协议,它提供到另一台主机的一个虚拟电传链接,其可能是这些协议中最重要的。但在这层中也有许多其他协议,例如用于传输文件的 FTP 协议和各种用于发送 Email 的协议实验。 + +在这一层中有一个不同于其他的协议:初始链接协议Initial Connection Protocol(ICP)。ICP 被认为是一个 “Level-3” 层协议,但实际上它是一种 “Level-2.5” 层协议,因为其他 “Level-3” 层协议都依赖它。之所以需要 ICP,是因为 “Level 2” 层的 Host-Host 协议提供的链接只是单向的,但大多数的应用需要一个双向(例如:全双工)的连接来做任何有趣的事情。要使得运行在某个主机上的客户端能够连接到另一个主机上的长期运行的服务进程,ICP 定义了两个步骤。第一步是建立一个从服务端到客户端的单向连接,通过使用服务端进程的众所周知的套接字号来实现。第二步服务端通过建立的这个连接发送一个新的套接字套接字号给客户端。到那时,那个存在的连接就会被丢弃,然后会打开另外两个新的连接,它们是基于传输的套接字号建立的“读”连接和基于传输的套接字号加 1 的“写”连接。这个小插曲是大多数事务的一个前提——比如它是建立 Telnet 链接的第一步。 + +以上是我们逐层攀登了 ARPANET 协议层次结构。你们可能一直期待我在某个时候提一下 “网络控制协议Network Control Protocol”(NCP) 。在我坐下来为这篇文章和上一篇文章做研究之前,我肯定认为 ARPANET 运行在一个叫 “NCP” 的协议之上。这个缩写有时用来指代整个 ARPANET 协议,这可能就是我为什么有这个想法的原因。举个例子,[RFC801][11] 讨论了将 ARPANET 从 “NCP” 过渡到 “TCP” 的方式,这使 NCP 听起来像是一个相当于 TCP 的 ARPANET 协议。但是对于 ARPANET 来说,从来都没有一个叫 “网络控制协议” 的东西(即使 [大英百科全书是这样认为的][12]),我怀疑人们错误地将 “NCP” 解释为 “网络控制协议Network Control Protocol” ,而实际上它代表的是 “网络控制程序Network Control Program” 。网络控制程序是一个运行在各个主机上的内核级别的程序,主要负责处理网络通信,等同于现如今操作系统中的 TCP/IP 协议栈。用在 RFC 801 的 “NCP” 是一种转喻,而不是协议。 + +### 与 TCP/IP 的比较 + +ARPANET 协议以后都会被 TCP/IP 协议替换(但 Telnet 和 FTP 协议除外,因为它们很容易就能在 TCP 上适配运行)。然而 ARPANET 协议都基于这么一个假设:就是网络是由一个单一实体(BBN)来构建和管理的。而 TCP/IP 协议套件是为网间网设计的,这是一个网络的网络,在那里一切都是不稳定的和不可靠的。这就导致了我们的现代协议套件和 ARPANET 协议有明显的不同,比如我们现在怎样区分网络层和传输层。在 ARPANET 中部分由 IMP 实现的类似传输层的功能现在完全由在网络边界的主机负责。 + +我发现 ARPANET 协议最有趣的事情是,现在在 TCP 中的许多传输层的功能是如何在 ARPANET 上经历了一个糟糕的青春期。我不是网络专家,因此我拿出大学时的网络课本(让我们跟着 Kurose 和 Ross 学习一下),他们对传输层通常负责什么给出了一个非常好的概述。总结一下他们的解释,一个传输层协议必须至少做到以下几点。这里的 “segment” 基本等同于 ARPANET 上的术语 “消息message”: + + * 提供进程之间的传送服务,而不仅仅是主机之间的(传输层多路复用和多路分解) + * 在每个段的基础上提供完整性检查(即确保传输过程中没有数据损坏) + +像 TCP 那样,传输层也能够提供可靠的数据传输,这意味着: + + * “段” 是按顺序被传送的 + * 不会丢失任何 “段” + * “段” 的传送速度不会太快以至于被接收端丢弃(流量控制) + +似乎在 ARPANET 上关于如何进行多路复用和多路分解以便进程可以通信存在一些混淆 —— BBN 在 IMP-Host 层引入了链路号来做到这一点,但结果证明在 Host-Host 层上无论如何套接字号都是必要的。然后链路号只是用于 IMP-Host 级别的流量控制,但 BBN 似乎后来放弃了它,转而支持在唯一的主机对之间进行流量控制,这意味着链路号一开始是一个超载的东西,后来基本上变成了虚设。TCP 现在使用端口号代替,分别对每一个 TCP 连接单独进行流量控制。进程间的多路复用和多路分解完全在 TCP 内部进行,不会像 ARPANET 一样泄露到较低层去。 + +同样有趣的是,鉴于 Kurose 和 Ross 如何开发 TCP 背后的想法,ARPANET 一开始就采用了 Kurose 和 Ross 所说的一个严谨的 “停止并等待stop-and-wait” 方法,来实现 IMP-Host 层上的可靠的数据传输。这个 “停止并等待” 方法发送一个 “段” 然后就拒绝再去发送更多 “段” ,直到收到一个最近发送的 “段” 的确认为止。这是一种简单的方法,但这意味着只有一个 “段” 在整个网络中运行,从而导致协议非常缓慢 —— 这就是为什么 Kurose 和 Ross 将 “停止并等待” 仅仅作为在通往功能齐全的传输层协议的路上的垫脚石的原因。曾有一段时间 “停止并等待” 是 ARPANET 上的工作方式,因为在 IMP–Host 层,必须接收到请求下一条消息Request for Next Message(RFNM)以响应每条发出的消息,然后才能发送任何进一步的消息。客观的说 ,BBN 起初认为这对于提供主机之间的流量控制是必要的,因此减速是故意的。正如我已经提到的,为了更好的性能,RFNM 的要求后来放宽松了,而且 IMP 也开始向消息中添加序列号和保持对传输中的消息的 “窗口” 的跟踪,这或多或少与如今 TCP 的实现如出一辙。[^5] + +因此,ARPANET 表明,如果你能让每个人都遵守一些基本规则,异构计算系统之间的通信是可能的。正如我先前所说的,这是 ARPANET 的最重要的遗产。但是,我希望对这些基线规则的仔细研究揭示了 ARPANET 协议对我们今天使用的协议有多大影响。在主机和 IMP 之间分担传输层职责的方式上肯定有很多笨拙之处,有时候是冗余的。现在回想起来真的很可笑,主机之间一开始只能通过给出的任意链路在某刻只发送一条消息。但是 ARPANET 实验是一个独特的机会,可以通过实际构建和操作网络来学习这些经验,当到了是时候升级到我们今天所知的互联网时,似乎这些经验变得很有用。 + +_如果你喜欢这篇贴子,更喜欢每四周发布一次的方式!那么在 Twitter 上关注 [@TwoBitHistory][14] 或者订阅 [RSS 提要][15],以确保你知道新帖子的发布时间。_ + +[^1]: 协议分层是网络工作组发明的。这个论点是在 [RFC 871][17] 中提出的。分层也是 BBN 如何在主机和 IMP 之间划分职责的自然延伸,因此 BBN 也值得称赞。 +[^2]: “level” 是被网络工作组使用的术语。 详见 [RFC 100][19] +[^3]: 在 IMP-Host 协议的后续版本中,扩展了头部字段,并且将链路号升级为消息 ID。但是 Host-Host 协议仅仅继续使用消息 ID 字段的高位 8 位,并将其视为链路号。请参阅 [ARPANET 协议手册][10] 的 “Host-Host” 协议部分。 +[^4]: John M. McQuillan 和 David C. Walden。 “ARPA 网络设计决策”,第 284页,。 2021 年 3 月 8 日查看。 +[^5]: 同上。 + +-------------------------------------------------------------------------------- + +via: https://twobithistory.org/2021/03/08/arpanet-protocols.html + +作者:[Two-Bit History][a] +选题:[lujun9972][b] +译者:[Lin-vy](https://github.com/Lin-vy) +校对:[wxy](https://github.com/wxy) + +本文由 [LCTT](https://github.com/LCTT/TranslateProject) 原创编译,[Linux中国](https://linux.cn/) 荣誉推出 + +[a]: https://twobithistory.org +[b]: https://github.com/lujun9972 +[1]: https://twobithistory.org/2021/02/07/arpanet.html +[2]: tmp.szauPoOKtk#fn:1 +[3]: https://twobithistory.org/images/arpanet-stack.png +[4]: tmp.szauPoOKtk#fn:2 +[5]: https://walden-family.com/impcode/BBN1822_Jan1976.pdf +[6]: tmp.szauPoOKtk#fn:3 +[7]: https://twobithistory.org/images/host-imp-1969.png +[8]: https://walden-family.com/impcode/1969-initial-IMP-design.pdf +[9]: tmp.szauPoOKtk#fn:4 +[10]: http://mercury.lcs.mit.edu/~jnc/tech/arpaprot.html +[11]: https://tools.ietf.org/html/rfc801 +[12]: https://www.britannica.com/topic/ARPANET +[13]: tmp.szauPoOKtk#fn:5 +[14]: https://twitter.com/TwoBitHistory +[15]: https://twobithistory.org/feed.xml +[16]: https://twitter.com/TwoBitHistory/status/1358487195905064960?ref_src=twsrc%5Etfw +[17]: https://tools.ietf.org/html/rfc871 +[18]: tmp.szauPoOKtk#fnref:1 +[19]: https://www.rfc-editor.org/info/rfc100 +[20]: tmp.szauPoOKtk#fnref:2 +[21]: tmp.szauPoOKtk#fnref:3 +[22]: tmp.szauPoOKtk#fnref:4 +[23]: tmp.szauPoOKtk#fnref:5 diff --git a/published/202108/20210414 3 essential Linux cheat sheets for productivity.md b/published/202108/20210414 3 essential Linux cheat sheets for productivity.md new file mode 100644 index 0000000000..410855472e --- /dev/null +++ b/published/202108/20210414 3 essential Linux cheat sheets for productivity.md @@ -0,0 +1,120 @@ +[#]: subject: "3 essential Linux cheat sheets for productivity" +[#]: via: "https://opensource.com/article/21/4/linux-cheat-sheets" +[#]: author: "Seth Kenlon https://opensource.com/users/seth" +[#]: collector: "lujun9972" +[#]: translator: "YungeG" +[#]: reviewer: "wxy" +[#]: publisher: "wxy" +[#]: url: "https://linux.cn/article-13662-1.html" + +3 个提高生产力的必备 Linux 速查表 +====== + +> 下载 `sed`、`grep` 和 `parted` 的速查表来整合新的流程到你的工作中。 + +![](https://img.linux.net.cn/data/attachment/album/202108/09/121350vvha4adg77b77j7c.jpg) + +Linux 因其命令闻名,部分原因是 Linux 执行的几乎所有操作都可以从终端调用;另一部分原因是 Linux 是一个高度模块化的操作系统,它的工具被设计用于产生十分确定的结果,在非常了解一些命令后,你可以将这些命令进行奇妙的组合,产生有用的输出。Linux 的学习过程一半是学习命令,另一半是学习如何将这些命令连成有意思的组合。 + +然而有这么多 Linux 命令需要学习,迈出第一步似乎令人望而生畏。应该先学习哪一个命令?有那些命令需要熟练掌握,又有哪些命令只需要浅尝辄止?认真考虑过这些问题后,我个人不相信有一个通用的答案。对所有人来说,“基本”命令很可能是相同的: + + * `ls` + * `cd` + * `mv` + +有这些命令你就可以浏览自己的 Linux 文件系统。 + +但是,除了基本命令,不同行业的“默认”命令有所不同。系统管理员需要 [系统自我检查和监测][2] 的工具;艺术家需要 [媒体转换][3] 和 [图形处理][4] 工具;家庭用户可能想要 [PDF 处理][5]、[日历][6]、[文档转换][7] 工具。这份列表无穷无尽。 + +然而一些 Linux 命令由于极其重要能够脱颖而出 —— 或者因为这些命令是每个人不时需要的常用的底层工具,或者因为这些命令是每个人在大多数时间都会觉得有用的万能工具。 + +这里有三个需要添加到你的列表中的命令。 + +### Sed + +**用途:** `sed` 是一个任何 Linux 用户都可以从学习中获益的优良通用工具。从表面上看,它只是一个基于终端的“查找和替换”,能够简单快速地纠正多个文档。`sed` 命令为我节省了打开单个文件、寻找和替换一个单词、保存文件、关闭文件所需要的数个小时(也可能是数天)时间,仅此一条命令就证明了我在学习 Linux 终端的投入是合理的。一旦充分了解 `sed`,你很有可能发现一个使生活更加轻松的潜在编辑技巧世界。 + +**长处:** 命令的长处在于重复。如果你只有一个要编辑的文件,很容易在传统的 [文本编辑器][8]打开并进行“查找和替换”。然而,如果要替换 5 或 50 个文件,恰当地使用 `sed` 命令(可能结合 [GNU Parallel][9] 进行加速)可以帮你节省数个小时。 + +**不足:** 你需要权衡直接更改期望所花的时间和构建正确的 `sed` 命令可能需要的时间。使用常见的 `sed 's/foo/bar/g'` 语法所做的简单编辑通常值得上输入这些命令所花的时间;但是利用保持空间和任何 `ed` 形式子命令的复杂 `sed` 命令可能需要高度集中的注意力和多次的试错。事实证明,使用 `sed` 进行编辑通常是更好的方式。 + +**秘技:** 下载我们的 [sed 速查表][10] 获取命令的单字母子命令和语法概述的快速参考。 + +### Grep + +**用途:** `grep` 一词来源于其公认的笨拙描述:全局正则表达式打印。换言之,在文件中(或者其他形式的输入中)找到的任何匹配模式,`grep` 都会打印到终端。这使得 `grep` 成为一个强大的搜索工具,尤其擅长处理大量的文本。 + +你可以使用 `grep` 查找 URL: + +``` +$ grep --only-matching \ + http\:\/\/.* example.txt +``` + +你可以使用 `grep` 查找一个特定的配置项: + +``` +$ grep --line-number \ + foo= example.ini +2:foo=true +``` + +当然,你还可以将 `grep` 和其他命令组合: + +``` +$ grep foo= example.ini | cut -d= -f2 +true +``` + +**长处:** `grep` 是一个简单的搜索命令,如果你阅读了上面的例子,就已经基本有所了解。为了增强灵活性,你可以使用命令的扩展正则表达式语法。 + +**不足:** `grep` 的问题也是它的长处:它只有搜索功能。一旦你找到想要的内容,可能会面临一个更大的问题 —— 如何处理找到的内容。有时进行的处理可能简单如重定向输出到一个文件,作为过滤后的结果列表。但是,更复杂的使用场景可能需要对结果做进一步处理,或者使用许多类似 [awk][11]、[curl][12](凑巧的是,我们也有 [curl 速查表][13])的命令,或者使用现代计算机上你所拥有的数千个其他选项中的任何一个命令。 + +**秘技:** 下载我们的 [grep 速查表][14] 获取更多命令选项和正则表达式语法的快速参考。 + +### Parted + +**用途:** GNU `parted` 不是一个常用命令,但它是最强大的硬盘操作工具之一。关于硬盘驱动器的沮丧事实是 —— 数年来你一直忽略它们,直到需要设置一个新的硬盘时,才会想起自己对于格式化驱动器的最好方式一无所知,而此时熟悉 `parted` 会十分有用。GNU `parted` 能够创建磁盘卷标,新建、备份、恢复分区。此外,你可以通过命令获取驱动器及其布局的许多信息,并为文件系统初始化驱动器。 + +**长处:** 我偏爱 `parted` 而不是 `fdisk` 等类似工具的原因在于它组合了简单的交互模式和完全的非交互选项。不管你如何使用 `parted`,它的命令符合相同的语法,其编写良好的帮助菜单包含了丰富的信息。更棒的是,命令本身是 _智能_ 的 —— 给一个驱动器分区时,你可以用扇区和百分比指明分区的大小,`parted` 会尽可能计算出更精细的位置存放分区表。 + +**不足:** 在很长一段时间内我不清楚驱动器的工作原理,因此切换到 Linux 后,我花费了很长时间学习 GNU `parted`。GNU `parted` 和大多数终端磁盘工具假定你已经知晓什么是一个分区、驱动器由扇区组成、初始时驱动器缺少文件系统,需要磁盘卷标和分区表等等知识。硬盘驱动器的基础而不是命令本身的学习曲线十分陡峭,而 GNU `parted` 并没有做太多的努力来弥补潜在的认知差距。可以说,带你完成磁盘驱动器的基础知识学习不是命令的职责,因为有类似的 [图形应用][15],但是一个聚焦于工作流程的选项对于 GNU `parted` 可能是一个有用的附加功能。 + +**秘技:** 下载我们的 [parted 速查表][16] 获取大量子命令和选项的快速参考。 + +### 了解更多 + +这是一些我最喜欢的命令列表,但是其中的命令自然取决于我如何使用自己的计算机。我编写很多命令解释器脚本,因此频繁地使用 `grep` 查找配置选项,通过 `sed` 编辑文本。我还会用到 `parted`,因为处理多媒体项目时,通常涉及很多硬盘驱动器。你可能已经开发了,或者很快就要使用最喜欢的(至少是 _频繁使用的_)命令开发自己的工作流程。 + +整合新的流程到日常工作时,我会创建或者下载一个速查表(就像上面的链接),然后进行练习。我们都有自己的学习方式,找出最适合你的方式,学习一个新的必需命令。你对最常使用的命令了解越多,你就越能充分地使用它们。 + + +-------------------------------------------------------------------------------- + +via: https://opensource.com/article/21/4/linux-cheat-sheets + +作者:[Seth Kenlon][a] +选题:[lujun9972][b] +译者:[YungeG](https://github.com/YungeG) +校对:[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/yearbook-haff-rx-linux-file-lead_0.png?itok=-i0NNfDC "Hand putting a Linux file folder into a drawer" +[2]: https://opensource.com/life/16/2/open-source-tools-system-monitoring +[3]: https://opensource.com/article/17/6/ffmpeg-convert-media-file-formats +[4]: https://opensource.com/article/17/8/imagemagick +[5]: https://opensource.com/article/20/8/reduce-pdf +[6]: https://opensource.com/article/19/4/calendar-git +[7]: https://opensource.com/article/20/5/pandoc-cheat-sheet +[8]: https://opensource.com/article/21/2/open-source-text-editors +[9]: https://opensource.com/article/18/5/gnu-parallel +[10]: https://opensource.com/downloads/sed-cheat-sheet +[11]: https://opensource.com/article/20/9/awk-ebook +[12]: https://www.redhat.com/sysadmin/social-media-curl +[13]: https://opensource.com/article/20/5/curl-cheat-sheet +[14]: https://opensource.com/downloads/grep-cheat-sheet +[15]: https://opensource.com/article/18/11/partition-format-drive-linux#gui +[16]: https://opensource.com/downloads/parted-cheat-sheet diff --git a/published/202108/20210525 Pen testing with Linux security tools.md b/published/202108/20210525 Pen testing with Linux security tools.md new file mode 100644 index 0000000000..4f1ece54a8 --- /dev/null +++ b/published/202108/20210525 Pen testing with Linux security tools.md @@ -0,0 +1,283 @@ +[#]: subject: "Pen testing with Linux security tools" +[#]: via: "https://opensource.com/article/21/5/linux-security-tools" +[#]: author: "Peter Gervase https://opensource.com/users/pgervase" +[#]: collector: "lujun9972" +[#]: translator: "MjSeven" +[#]: reviewer: "wxy" +[#]: publisher: "wxy" +[#]: url: "https://linux.cn/article-13650-1.html" + +使用 Linux 安全工具进行渗透测试 +====== + +> 使用 Kali Linux 和其他开源工具来发现系统中的安全漏洞和弱点。 + +![](https://img.linux.net.cn/data/attachment/album/202108/05/111124w66lpuzsc467nlv1.jpg) + +众多被广泛报道的大型消费企业入侵事件凸显了系统安全管理的重要性。幸运的是,有许多不同的应用程序可以帮助保护计算机系统。其中一个是 [Kali][2],一个为安全和渗透测试而开发的 Linux 发行版。本文演示了如何使用 Kali Linux 来审视你的系统以发现弱点。 + +Kali 安装了很多工具,它们都是开源的,默认情况下安装了它们会让事情变得更容易。 + +(LCTT 译注:Kali 及其携带工具只应该用于对自己拥有合法审查权利的系统和设备,任何未经授权的扫描、渗透和攻击均是违法的。本文作者、译者均不承担任何非授权使用的结果。) + +![Kali's tools][3] + +本文使用的系统是: + + 1. `kali.usersts.redhat.com`:这是我将用来启动扫描和攻击的系统。它拥有 30GB 内存和 6 个虚拟 CPU(vCPU)。 + 2. `vulnerable.usersys.redhat.com`: 这是一个 Red Hat 企业版 Linux 8 系统,它会成为目标。它拥有 16GB 内存和 6 个 vCPU。它是一个相对较新的系统,但有些软件包可能已经过时。 + 3. 这个系统包括 `httpd-2.4.37-30.module+el8.3.0+7001+0766b9e7.x86_64`、 `mariadb-server-10.3.27-3.module+el8.3.0+8972+5e3224e9.x86_64`、 `tigervnc-server-1.9.0-15.el8_1.x86_64`、 `vsftpd-3.0.3-32.el8.x86_64` 和一个 5.6.1 版本的 WordPress。 + +我在上面列出了硬件规格,因为一些任务要求很高,尤其是在运行 WordPress 安全扫描程序([WPScan][5])时对目标系统 CPU 的要求。 + +### 探测你的系统 + +首先,我会在目标系统上进行基本的 Nmap 扫描(你可以阅读 [使用 Nmap 结果帮助加固 Linux 系统][6] 一文来更深入地了解 Nmap)。Nmap 扫描是一种快速的方法,可以大致了解被测系统中哪些端口和服务是暴露的。 + +![Nmap scan][7] + +默认扫描显示有几个你可能感兴趣的开放端口。实际上,任何开放端口都可能成为攻击者破坏你网络的一种方式。在本例中,端口 21、22、80 和 443 是不错的扫描对象,因为它们是常用服务的端口。在这个早期阶段,我只是在做侦察工作,尽可能多地获取有关目标系统的信息。 + +我想用 Nmap 侦察 80 端口,所以我使用 `-p 80` 参数来查看端口 80,`-A` 参数来获取操作系统和应用程序版本等信息。 + +![Nmap scan of port 80][8] + +关键信息有: + +``` +PORT   STATE SERVICE VERSION +80/tcp open  http       Apache httpd 2.4.37 ((Red Hat Enterprise Linux)) +|_http-generator: WordPress 5.6.1 +``` + +现在我知道了这是一个 WordPress 服务器,我可以使用 WPScan 来获取有关潜在威胁的信息。一个很好的侦察方法是尝试找到一些用户名,使用 `--enumerate u` 告诉 WPScan 在 WordPress 实例中查找用户名。例如: + +``` +┌──(root💀kali)-[~] +└─# wpscan --url vulnerable.usersys.redhat.com --enumerate u +_______________________________________________________________ + __ _______ _____ + \ \ / / __ \ / ____| + \ \ /\ / /| |__) | (___ ___ __ _ _ __ ® + \ \/ \/ / | ___/ \___ \ / __|/ _` | '_ \ + \ /\ / | | ____) | (__| (_| | | | | + \/ \/ |_| |_____/ \___|\__,_|_| |_| + + WordPress Security Scanner by the WPScan Team + Version 3.8.10 + Sponsored by Automattic - https://automattic.com/ + @_WPScan_, @ethicalhack3r, @erwan_lr, @firefart +_______________________________________________________________ + +[+] URL: http://vulnerable.usersys.redhat.com/ [10.19.47.242] +[+] Started: Tue Feb 16 21:38:49 2021 + +Interesting Finding(s): +... +[i] User(s) Identified: + +[+] admin + | Found By: Author Posts - Display Name (Passive Detection) + | Confirmed By: + | Author Id Brute Forcing - Author Pattern (Aggressive Detection) + | Login Error Messages (Aggressive Detection) + +[+] pgervase + | Found By: Author Posts - Display Name (Passive Detection) + | Confirmed By: + | Author Id Brute Forcing - Author Pattern (Aggressive Detection) + | Login Error Messages (Aggressive Detection) +``` + +这显示有两个用户:`admin` 和 `pgervase`。我将尝试使用密码字典来猜测 `admin` 的密码。密码字典是一个包含很多密码的文本文件。我使用的字典大小有 37G,有 3,543,076,137 行。 + +就像你可以选择不同的文本编辑器、Web 浏览器和其他应用程序 一样,也有很多工具可以启动密码攻击。下面是两个使用 Nmap 和 WPScan 的示例命令: + +``` +# nmap -sV --script http-wordpress-brute --script-args userdb=users.txt,passdb=/path/to/passworddb,threads=6 vulnerable.usersys.redhat.com +``` + +``` +# wpscan --url vulnerable.usersys.redhat.com --passwords /path/to/passworddb --usernames admin --max-threads 50 | tee nmap.txt +``` + +这个 Nmap 脚本是我使用的许多脚本之一,使用 WPScan 扫描 URL 只是这个工具可以完成的许多任务之一。你可以用你喜欢的那一个。 + +WPScan 示例在文件末尾显示了密码: + +``` +┌──(root💀kali)-[~] +└─# wpscan --url vulnerable.usersys.redhat.com --passwords passwords.txt --usernames admin +_______________________________________________________________ + __ _______ _____ + \ \ / / __ \ / ____| + \ \ /\ / /| |__) | (___ ___ __ _ _ __ ® + \ \/ \/ / | ___/ \___ \ / __|/ _` | '_ \ + \ /\ / | | ____) | (__| (_| | | | | + \/ \/ |_| |_____/ \___|\__,_|_| |_| + + WordPress Security Scanner by the WPScan Team + Version 3.8.10 + Sponsored by Automattic - https://automattic.com/ + @_WPScan_, @ethicalhack3r, @erwan_lr, @firefart +_______________________________________________________________ + +[+] URL: http://vulnerable.usersys.redhat.com/ [10.19.47.242] +[+] Started: Thu Feb 18 20:32:13 2021 + +Interesting Finding(s): + +...... + +[+] Performing password attack on Wp Login against 1 user/s +Trying admin / redhat Time: 00:01:57 <==================================================================================================================> (3231 / 3231) 100.00% Time: 00:01:57 +Trying admin / redhat Time: 00:01:57 <========================================================= > (3231 / 6462) 50.00% ETA: ??:??:?? +[SUCCESS] - admin / redhat + +[!] Valid Combinations Found: + | Username: admin, Password: redhat + +[!] No WPVulnDB API Token given, as a result vulnerability data has not been output. +[!] You can get a free API token with 50 daily requests by registering at https://wpscan.com/register + +[+] Finished: Thu Feb 18 20:34:15 2021 +[+] Requests Done: 3255 +[+] Cached Requests: 34 +[+] Data Sent: 1.066 MB +[+] Data Received: 24.513 MB +[+] Memory used: 264.023 MB +[+] Elapsed time: 00:02:02 +``` + +在末尾的“找到有效组合”部分包含了管理员用户名和密码,3231 行只用了两分钟。 + +我还有另一个字典文件,其中包含 3,238,659,984 行,使用它花费的时间更长并且会留下更多的证据。 + +使用 Nmap 可以更快地产生结果: + +``` +┌──(root💀kali)-[~] +└─# nmap -sV --script http-wordpress-brute --script-args userdb=users.txt,passdb=password.txt,threads=6 vulnerable.usersys.redhat.com +Starting Nmap 7.91 ( https://nmap.org ) at 2021-02-18 20:48 EST +Nmap scan report for vulnerable.usersys.redhat.com (10.19.47.242) +Host is up (0.00015s latency). +Not shown: 995 closed ports +PORT STATE SERVICE VERSION +21/tcp open ftp vsftpd 3.0.3 +22/tcp open ssh OpenSSH 8.0 (protocol 2.0) +80/tcp open http Apache httpd 2.4.37 ((Red Hat Enterprise Linux)) +|_http-server-header: Apache/2.4.37 (Red Hat Enterprise Linux) +| http-wordpress-brute: +| Accounts: +| admin:redhat - Valid credentials <<<<<<< +| pgervase:redhat - Valid credentials <<<<<<< +|_ Statistics: Performed 6 guesses in 1 seconds, average tps: 6.0 +111/tcp open rpcbind 2-4 (RPC #100000) +| rpcinfo: +| program version port/proto service +| 100000 2,3,4 111/tcp rpcbind +| 100000 2,3,4 111/udp rpcbind +| 100000 3,4 111/tcp6 rpcbind +|_ 100000 3,4 111/udp6 rpcbind +3306/tcp open mysql MySQL 5.5.5-10.3.27-MariaDB +MAC Address: 52:54:00:8C:A1:C0 (QEMU virtual NIC) +Service Info: OS: Unix + +Service detection performed. Please report any incorrect results at https://nmap.org/submit/ . +Nmap done: 1 IP address (1 host up) scanned in 7.68 seconds +``` + +然而,运行这样的扫描可能会在目标系统上留下大量的 HTTPD 日志消息: + +``` +10.19.47.170 - - [18/Feb/2021:20:14:01 -0500] "POST /wp-login.php HTTP/1.1" 200 7575 "http://vulnerable.usersys.redhat.com/" "WPScan v3.8.10 (https://wpscan.org/)" +10.19.47.170 - - [18/Feb/2021:20:14:00 -0500] "POST /wp-login.php HTTP/1.1" 200 7575 "http://vulnerable.usersys.redhat.com/" "WPScan v3.8.10 (https://wpscan.org/)" +10.19.47.170 - - [18/Feb/2021:20:14:00 -0500] "POST /wp-login.php HTTP/1.1" 200 7575 "http://vulnerable.usersys.redhat.com/" "WPScan v3.8.10 (https://wpscan.org/)" +10.19.47.170 - - [18/Feb/2021:20:14:00 -0500] "POST /wp-login.php HTTP/1.1" 200 7575 "http://vulnerable.usersys.redhat.com/" "WPScan v3.8.10 (https://wpscan.org/)" +10.19.47.170 - - [18/Feb/2021:20:14:00 -0500] "POST /wp-login.php HTTP/1.1" 200 7575 "http://vulnerable.usersys.redhat.com/" "WPScan v3.8.10 (https://wpscan.org/)" +10.19.47.170 - - [18/Feb/2021:20:14:00 -0500] "POST /wp-login.php HTTP/1.1" 200 7575 "http://vulnerable.usersys.redhat.com/" "WPScan v3.8.10 (https://wpscan.org/)" +10.19.47.170 - - [18/Feb/2021:20:14:02 -0500] "POST /wp-login.php HTTP/1.1" 200 7575 "http://vulnerable.usersys.redhat.com/" "WPScan v3.8.10 (https://wpscan.org/)" +10.19.47.170 - - [18/Feb/2021:20:14:02 -0500] "POST /wp-login.php HTTP/1.1" 200 7575 "http://vulnerable.usersys.redhat.com/" "WPScan v3.8.10 (https://wpscan.org/)" +10.19.47.170 - - [18/Feb/2021:20:14:02 -0500] "POST /wp-login.php HTTP/1.1" 200 7575 "http://vulnerable.usersys.redhat.com/" "WPScan v3.8.10 (https://wpscan.org/)" + +``` + +为了获得关于在最初的 Nmap 扫描中发现的 HTTPS 服务器的信息,我使用了 `sslscan` 命令: + +``` +┌──(root💀kali)-[~] +└─# sslscan vulnerable.usersys.redhat.com +Version: 2.0.6-static +OpenSSL 1.1.1i-dev xx XXX xxxx + +Connected to 10.19.47.242 + +Testing SSL server vulnerable.usersys.redhat.com on port 443 using SNI name vulnerable.usersys.redhat.com + + SSL/TLS Protocols: +SSLv2 disabled +SSLv3 disabled +TLSv1.0 disabled +TLSv1.1 disabled +TLSv1.2 enabled +TLSv1.3 enabled + +``` + +它显示了有关启用的 SSL 协议的信息,在最下方,是关于 Heartbleed 漏洞的信息: + +``` +  Heartbleed: +TLSv1.3 not vulnerable to heartbleed +TLSv1.2 not vulnerable to heartbleed +``` + +### 防御或减轻攻击的技巧 + +有很多方法可以保护你的系统免受大量攻击。几个关键点是: + + * **了解你的系统:**包括了解哪些端口是开放的,哪些端口应该开放,谁应该能够看到这些开放的端口,以及使用这些端口服务的预期流量是多少。Nmap 是了解网络系统的一个绝佳工具。 + * **使用当前的最佳实践:** 现在的最佳实践可能不是未来的最佳实践。作为管理员,了解信息安全领域的最新趋势非常重要。 + * **知道如何使用你的产品:** 例如,与其让攻击者不断攻击你的 WordPress 系统,不如阻止他们的 IP 地址并限制尝试登录的次数。在现实世界中,阻止 IP 地址可能没有那么有用,因为攻击者可能会使用受感染的系统来发起攻击。但是,这是一个很容易启用的设置,可以阻止一些攻击。 + * **维护和验证良好的备份:** 如果攻击者攻击了一个或多个系统,能从已知的良好和干净的备份中重新构建可以节省大量时间和金钱。 + * **检查日志:** 如上所示,扫描和渗透命令可能会留下大量日志,这表明攻击者正在攻击系统。如果你注意到它们,可以采取先发制人的行动来降低风险。 + * **更新系统、应用程序和任何额外的模块:** 正如 [NIST Special Publication 800-40r3][9] 所解释的那样,“补丁通常是减轻软件缺陷漏洞最有效的方法,而且通常是唯一完全有效的解决方案。” + * **使用供应商提供的工具:** 供应商有不同的工具来帮助你维护他们的系统,因此一定要充分利用它们。例如,红帽企业 Linux 订阅中包含的 [Red Hat Insights][10] 可以帮助你优化系统并提醒你注意潜在的安全威胁。 + +### 了解更多 + +本文对安全工具及其使用方法的介绍只是冰山一角。深入了解的话,你可能需要查看以下资源: + + * [Armitage][11],一个开源的攻击管理工具 + * [Red Hat 产品安全中心][12] + * [Red Hat 安全频道][13] + * [NIST 网络安全页面][14] + * [使用 Nmap 结果来帮助加固 Linux 系统][6] + +-------------------------------------------------------------------------------- + +via: https://opensource.com/article/21/5/linux-security-tools + +作者:[Peter Gervase][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/pgervase +[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://www.kali.org/ +[3]: https://opensource.com/sites/default/files/uploads/kali-tools.png "Kali's tools" +[4]: https://creativecommons.org/licenses/by-sa/4.0/ +[5]: https://wpscan.com/wordpress-security-scanner +[6]: https://www.redhat.com/sysadmin/using-nmap-harden-systems +[7]: https://opensource.com/sites/default/files/uploads/nmap-scan.png "Nmap scan" +[8]: https://opensource.com/sites/default/files/uploads/nmap-port80.png "Nmap scan of port 80" +[9]: https://nvlpubs.nist.gov/nistpubs/SpecialPublications/NIST.SP.800-40r3.pdf +[10]: https://www.redhat.com/sysadmin/how-red-hat-insights +[11]: https://en.wikipedia.org/wiki/Armitage_(computing) +[12]: https://access.redhat.com/security +[13]: https://www.redhat.com/en/blog/channel/security +[14]: https://www.nist.gov/cybersecurity \ No newline at end of file diff --git a/published/202108/20210608 Tune your MySQL queries like a pro.md b/published/202108/20210608 Tune your MySQL queries like a pro.md new file mode 100644 index 0000000000..7ec70af50c --- /dev/null +++ b/published/202108/20210608 Tune your MySQL queries like a pro.md @@ -0,0 +1,107 @@ +[#]: subject: (Tune your MySQL queries like a pro) +[#]: via: (https://opensource.com/article/21/5/mysql-query-tuning) +[#]: author: (Dave Stokes https://opensource.com/users/davidmstokes) +[#]: collector: (lujun9972) +[#]: translator: (unigeorge) +[#]: reviewer: (wxy) +[#]: publisher: (wxy) +[#]: url: (https://linux.cn/article-13684-1.html) + +如老手一般玩转 MySQL 查询 +====== + +> 优化查询语句不过是一项简单的工程,而非什么高深的黑魔法。 + +![](https://img.linux.net.cn/data/attachment/album/202108/15/104728m3e3wefi3bq3qn34.jpg) + +许多人将数据库查询语句的调优视作哈利波特小说中某种神秘的“黑魔法”;使用错误的咒语,数据就会从宝贵的资源变成一堆糊状物。 + +实际上,对关系数据库系统的查询调优是一项简单的工程,其遵循的规则或启发式方法很容易理解。查询优化器会翻译你发送给 [MySQL][2] 实例的查询指令,然后将这些启发式方法和优化器已知的数据信息结合使用,确定获取所请求数据的最佳方式。再读一下后面这半句:_“优化器已知的数据信息_。”查询优化器需要对数据所在位置的猜测越少(即已知信息越多),它就可以越好地制定交付数据的计划。 + +为了让优化器更好地了解数据,你可以考虑使用索引和直方图。正确使用索引和直方图可以大大提高数据库查询的速度。这就像如果你按照食谱做菜,就可以得到你喜欢吃的东西;但是假如你随意在该食谱中添加材料,最终得到的东西可能就不那么尽如人意了。 + +### 基于成本的优化器 + +大多数现代关系型数据库使用基于成本的优化器cost-based optimizer来确定如何从数据库中检索数据。该成本方案是基于尽可能减少非常耗费资源的磁盘读取过程。数据库服务器内的查询优化器代码会在得到数据时对这些数据的获取进行统计,并构建一个获取数据的历史模型。 + +但历史数据是可能会过时的。这就好像你去商店买你最喜欢的零食,然后突然发现零食涨价或者商店关门了。服务器的优化进程可能会根据旧信息做出错误的假设,进而制定出低效的查询计划。 + +查询的复杂性可能会影响优化。优化器希望提供可用的最低成本查询方式。连接五个不同的表就意味着有 5 的阶乘(即 120)种可能的连接组合。代码中内置了启发式方法,以尝试对所有可能的选项进行快捷评估。MySQL 每次看到查询时都希望生成一个新的查询计划,而其他数据库(例如 Oracle)则可以锁定查询计划。这就是向优化器提供有关数据的详细信息至关重要的原因。要想获得稳定的性能,在制定查询计划时为查询优化器提供最新信息确实很有效。 + +此外,优化器中内置的规则可能与数据的实际情况并不相符。没有更多有效信息的情况下,查询优化器会假设列中的所有数据均匀分布在所有行中。没有其他选择依据时,它会默认选择两个可能索引中较小的一个。虽然基于成本的优化器模型可以制定出很多好的决策,但最终查询计划并不是最佳方案的情况也是有可能的。 + +### 查询计划是什么? + +查询计划query plan是指优化器基于查询语句产生的,提供给服务器执行的计划内容。查看查询计划的方法是在查询语句前加上 `EXPLAIN` 关键字。例如,以下查询要从城市表(`city`)和相应的国家表(`country`)中获得城市名称(和所属国家名称),城市表和国家表通过国家唯一代码连接。本例中仅查询了英国的字母顺序前五名的城市: + +``` +SELECT city.name AS 'City', +               country.name AS 'Country' +FROM city +JOIN country ON (city.countrycode = country.code) +WHERE country.code = 'GBR' +LIMIT 5; +``` + +在查询语句前加上 `EXPLAIN` 可以看到优化器生成的查询计划。跳过除输出末尾之外的所有内容,可以看到优化后的查询: + +``` +SELECT `world`.`city`.`Name` AS `City`, +                'United Kingdom' AS `Country` +FROM `world`.`city` +JOIN `world`.`country` +WHERE (`world`.`city`.`CountryCode` = 'GBR') +LIMIT 5; +``` + +看下比较大的几个变化, `country.name as 'Country'` 改成了 `'United Kingdom' AS 'Country'`,`WHERE` 子句从在国家表中查找变成了在城市表中查找。优化器认为这两个改动会提供比原始查询更快的结果。 + +### 索引 + +在 MySQL 世界中,你会听到索引或键的概念。不过,索引是由键组成的,键是一种识别记录的方式,并且大概率是唯一的。如果将列设计为键,优化器可以搜索这些键的列表以找到所需的记录,而无需读取整个表。如果没有索引,服务器必须从第一列的第一行开始读取每一行数据。如果该列是作为唯一索引创建的,则服务器可以直接读取该行数据并忽略其余数据。索引的值(也称为基数)唯一性越强越好。请记住,我们在寻找更快获取数据的方法。 + +MySQL 默认的 InnoDB 存储引擎希望你的表有一个主键,并按照该键将你的数据存储在 B+ 树中。“不可见列”是 MySQL 最近添加的功能,除非在查询中明确指明该不可见列,否则不会返回该列数据。例如,`SELECT * FROM foo;` 就不会返回任何不可见列。这个功能提供了一种向旧表添加主键的方法,且无需为了包含该新列而重写所有查询语句。 + +更复杂的是,有多种类型的索引,例如函数索引、空间索引和复合索引。甚至在某些情况下,你还可以创建这样一个索引:该索引可以为查询提供所有请求的信息,从而无需再去访问数据表。 + +本文不会详细讲解各种索引类型,你只需将索引看作指向要查询的数据记录的快捷方式。你可以在一个或多个列或这些列的一部分上创建索引。我的医师系统就可以通过我姓氏的前三个字母和出生日期来查找我的记录。使用多列时要注意首选唯一性最强的字段,然后是第二强的字段,依此类推。“年-月-日”的索引可用于“年-月-日”、“年-月”和“年”搜索,但不适用于“日”、“月-日”或“年-日”搜索。考虑这些因素有助于你围绕如何使用数据这一出发点来设计索引。 + +### 直方图 + +直方图就是数据的分布形式。如果你将人名按其姓氏的字母顺序排序,就可以对姓氏以字母 A 到 F 开头的人放到一个“逻辑桶”中,然后将 G 到 J 开头的放到另一个中,依此类推。优化器会假定数据在列内均匀分布,但实际使用时多数情况并不是均匀的。 + +MySQL 提供两种类型的直方图:所有数据在桶中平均分配的等高型,以及单个值在单个桶中的等宽型。最多可以设置 1,024 个存储桶。数据存储桶数量的选择取决于许多因素,包括去重后的数值量、数据倾斜度以及需要的结果准确度。如果桶的数量超过某个阈值,桶机制带来的收益就会开始递减。 + +以下命令将在表 `t` 的列 `c1` 上创建 10 个桶的直方图: + +``` +ANALYZE TABLE t UPDATE HISTOGRAM ON c1 WITH 10 BUCKETS; +``` + +想象一下你在售卖小号、中号和大号袜子,每种尺寸的袜子都放在单独的储物箱中。如果你想找某个尺寸的袜子,就可以直接去对应尺寸的箱子里找。MySQL 自从三年前发布 MySQL 8.0 以来就有了直方图功能,但该功能却并没有像索引那样广为人知。与索引不同,使用直方图插入、更新或删除记录都不会产生额外开销。而如果更新索引,就必须更新 `ANALYZE TABLE` 命令。当数据变动不大并且频繁更改数据会降低效率时,直方图是一种很好的方法。 + +### 选择索引还是直方图? + +对需要直接访问的且具备唯一性的数据项目使用索引。虽然修改、删除和插入操作会产生额外开销,但如果数据架构正确,索引就可以方便你快速访问。对不经常更新的数据则建议使用直方图,例如过去十几年的季度结果。 + +### 结语 + +本文源于最近在 [Open Source 101 会议][3] 上的一次报告。报告的演示文稿源自 [PHP UK Conferenc][4] 的研讨会。查询调优是一个复杂的话题,每次我就索引和直方图作报告时,我都会找到新的可改进点。但是每次报告反馈也表明很多软件界中的人并不精通索引,并且时常使用错误。我想直方图大概由于出现时间较短,还没有出现像索引这种使用错误的情况。 + +-------------------------------------------------------------------------------- + +via: https://opensource.com/article/21/5/mysql-query-tuning + +作者:[Dave Stokes][a] +选题:[lujun9972][b] +译者:[unigeorge](https://github.com/unigeorge) +校对:[wxy](https://github.com/wxy) + +本文由 [LCTT](https://github.com/LCTT/TranslateProject) 原创编译,[Linux中国](https://linux.cn/) 荣誉推出 + +[a]: https://opensource.com/users/davidmstokes +[b]: https://github.com/lujun9972 +[1]: https://opensource.com/sites/default/files/styles/image-full-size/public/lead-images/lenovo-thinkpad-laptop-window-focus.png?itok=g0xPm2kD (young woman working on a laptop) +[2]: https://www.mysql.com/ +[3]: https://opensource101.com/ +[4]: https://www.phpconference.co.uk/ diff --git a/published/202108/20210625 Windows 11 Makes Your Hardware Obsolete, Use Linux Instead.md b/published/202108/20210625 Windows 11 Makes Your Hardware Obsolete, Use Linux Instead.md new file mode 100644 index 0000000000..3f28da1fd2 --- /dev/null +++ b/published/202108/20210625 Windows 11 Makes Your Hardware Obsolete, Use Linux Instead.md @@ -0,0 +1,111 @@ +[#]: subject: (Windows 11 Makes Your Hardware Obsolete, Use Linux Instead!) +[#]: via: (https://news.itsfoss.com/windows-11-linux/) +[#]: author: (Ankush Das https://news.itsfoss.com/author/ankush/) +[#]: collector: (lujun9972) +[#]: translator: (zd200572) +[#]: reviewer: (wxy) +[#]: publisher: (wxy) +[#]: url: (https://linux.cn/article-13640-1.html) + +Windows 11 让你的硬件过时,使用 Linux 代替吧! +====== + +> 微软希望你为 Windows 11 买新的硬件。你是否应该为 Windows 11 升级你的电脑,或者只是,用 Linux 代替!? + +![](https://i1.wp.com/news.itsfoss.com/wp-content/uploads/2021/06/windows-to-linux.png?w=1200&ssl=1) + +Windows 11 终于来了,我们并不完全对此感到兴奋,它给许多电脑用户带来了困扰。 + +我甚至不是在讨论隐私方面或者它的设计选择,而是 Windows 11 要求更新的硬件才能工作,这在某种程度上让你的旧电脑变得过时,并迫使你毫无理由地升级新的硬件。 + +随着 Windows 11 的到来还有什么问题呢,它有什么不好的? + +### 只有符合条件的设备才能获得 Windows 11 升级 + +首先,有意思的是,Windows 11 添加了一个最低系统需求,这表面上看起来还行: + + * 1GHz 双核 64 位处理器 + * 4GB 内存 + * 64GB 存储空间 + * 支持 UEFI 安全启动 + * 受信任平台模块(TPM)版本 2.0 + * DirectX 12 兼容显卡 + * 720P 分辨率显示器 + +![][1] + +你可以在 [微软官方网站][2] 下载“电脑健康状况检查”应用检查你的系统是否符合条件。 + +过去十年内的大多数电脑能达到这些标准 —— 但有一个陷阱。 + +硬件需要有一个 TPM 芯片,一些电脑和笔记本可能没有。幸运的是,你可能只需要从 BIOS 设置中启用它(包括安全引导支持),就可以使你的电脑符合条件。这里有一个 [PCGamer][3] 的向导可以帮你。 + +从技术上说,根据微软官方文档,Windows 11 不支持比 **Intel 第 8 代和 Ryzen 3000 系列**更老的处理器([AMD][4] | [Intel][5])。 + +可是,有相当数量的电脑不支持,你该怎么做? + +很简单,在 Windows 10 不再收到更新之前,[都 2021 年了,换成 Linux 吧][6]。今年,在你的个人电脑上尝试 Linux 变得比任何时候更有意义! + +### Windows 11 安装需要网络连接 + +![][7] + +虽然我们不太清楚,但根据其系统要求规范,Windows 11 安装过程中将要求用户有可连通的互联网连接。 + +但是,Linux 不需要这样。 + +这只是其中一个 [使用 Linux 而不是 Windows][8] 的好处 —— 这是你可以完全掌控的操作系统。 + +### 没有 32 位支持 + +![][12] + +Windows 10 确实是支持 32 位系统的,但是 Windows 11 终结了相关支持。 + +这又是 Linux 的优势了。 + +尽管对 32 位支持都在逐渐减少,我们依然有一系列 [支持 32 位系统的 Linux 发行版][9]。或许你的 32 位电脑还能与 Linux 一起工作 10 年。 + +### Windows 10 将在 2025 年结束支持 + +好吧,鉴于微软最初计划在 Windows 10 之后永远不会有升级,而是在可预见的未来一直支持它,这是个意外。 + +现在,Windows 10 将会在 2025 年被干掉…… + +那么,到时候你该怎么做呢?升级你的硬件,只因为它不支持 Windows 11? + +除非有这个必要,否则 Linux 是你永远的朋友。 + +你可以尝试几个 [轻量级 Linux 发行版][10],它们将使你的任何一台被微软认为过时的电脑重新焕发生机。 + +### 结语 + +尽管 Windows 11 计划在未来几年内强迫用户升级他们的硬件,但 Linux 可以让你长时间继续使用你的硬件,并有一些额外的好处。 + +因此,如果你对 Windows 11 的发布不满意,你可能想开始使用 Linux 代替。不要烦恼,你可以参考我们的指南,来学习开始使用 Linux 的一切知识。 + +-------------------------------------------------------------------------------- + +via: https://news.itsfoss.com/windows-11-linux/ + +作者:[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://i2.wp.com/news.itsfoss.com/wp-content/uploads/2021/06/windows-11-requirements-new.png?w=1026&ssl=1 +[2]: https://www.microsoft.com/en-us/windows/windows-11 +[3]: https://www.pcgamer.com/Windows-11-PC-Health-Check/ +[4]: https://docs.microsoft.com/en-us/windows-hardware/design/minimum/supported/windows-11-supported-amd-processors +[5]: https://docs.microsoft.com/en-us/windows-hardware/design/minimum/supported/windows-11-supported-intel-processors +[6]: https://news.itsfoss.com/switch-to-linux-in-2021/ +[7]: https://i1.wp.com/news.itsfoss.com/wp-content/uploads/2021/06/internet-connectivity-illustration.png?w=1200&ssl=1 +[8]: https://itsfoss.com/linux-better-than-windows/ +[9]: https://itsfoss.com/32-bit-linux-distributions/ +[10]: https://itsfoss.com/lightweight-linux-beginners/ +[11]: https://itsfoss.com +[12]: https://i0.wp.com/news.itsfoss.com/wp-content/uploads/2021/06/32-bit-support-illustration.png?w=1200&ssl=1 \ No newline at end of file diff --git a/published/202108/20210626 Windows 11 Look Inspired by KDE Plasma and GNOME.md b/published/202108/20210626 Windows 11 Look Inspired by KDE Plasma and GNOME.md new file mode 100644 index 0000000000..6bf2303b94 --- /dev/null +++ b/published/202108/20210626 Windows 11 Look Inspired by KDE Plasma and GNOME.md @@ -0,0 +1,107 @@ +[#]: subject: (Windows 11 Look Inspired by KDE Plasma and GNOME?) +[#]: via: (https://www.debugpoint.com/2021/06/windows-11-inspiration-linux-kde-plasma/) +[#]: author: (Arindam https://www.debugpoint.com/author/admin1/) +[#]: collector: (lujun9972) +[#]: translator: (imgradeone) +[#]: reviewer: (wxy) +[#]: publisher: (wxy) +[#]: url: (https://linux.cn/article-13653-1.html) + +Windows 11 的外观受到了 KDE Plasma 和 GNOME 的启发吗? +====== + +> 截图显示,微软即将发布的 Windows 11 操作系统与我们所心爱的 KDE Plasma 和 GNOME 有许多相似之处。它们到底有多相似呢?我们试着比较了一下。 + +![](https://img.linux.net.cn/data/attachment/album/202108/06/103308cfoo3xoz2c002hx2.jpg) + +我曾记得一句俗话 —— “优秀者模仿,伟大者剽窃Good artists copy. Great artists steal”。我不认识 Windows 11 背后的设计团队,但他们似乎很大程度上受到了 Linux 桌面的影响。如果你回顾近几年来的 Windows 系统外观 —— 从 Windows XP 到 7,再到 10 —— 整体视觉上都没有什么太大的变化,直到今天为止。 + +Windows 操作系统的新版本通常有 5 到 7 年的生命周期。如果你试着回想 Windows 提供给你的个性化选项,你会发现这些选项近几年来基本都是一致的,甚至包括开始菜单位置、宽度、颜色在内的桌面整体的体验,一切都没变过。 + +但随着 Windows 11 的全新外观,这一点终于改变了。让我带你看一些我之前所见过的截图,并且分析一下,它们到底和流行的 Linux [桌面环境][1](如 KDE Plasma 和 GNOME)有多相似。 + +### Windows 11 的外观受到了 KDE Plasma 和 GNOME 的启发? + +#### 开始菜单和任务栏 + +传统的开始菜单和任务栏主题在 Windows 11 上有所变化。开始菜单和任务栏图标位于任务栏中央(默认视图)。Windows 也在设置中提供了将任务栏图标和开始菜单移回左侧的选项。 + +![Windows 11 – 浅色模式下的开始菜单][2] + +整体的布局方式和默认图标的色彩让我想起了 KDE Plasma 的任务栏和启动器。这些图标很精致,并且居中,给你带来一种类似 GNOME 上 Adwaita 图标的观感,而任务栏就更像是 KDE Plasma 的任务栏。 + +当你打开开始菜单后,它为你提供不同的图标和选项的排列方式。此外,当你开始打字时,顶部的搜索选项就会弹出。 + +现在,来看看全新设计的 KDE Plasma 启动器。我知道间距、图标大小和清晰度并不完全一致,但你可以看到,两者看起来有多么惊人的相似。 + +![KDE Plasma 5.22 亮色模式下的启动器][3] + +如果你正在使用 GNOME 或 Xfce 桌面,借助 [Arc Menu][4] 和一些小修改,你可以让两者看上去完全一致。 + +![修改过的 Arc Menu][5] + +#### 窗口装饰 + +按照传统,GNOME 总是用圆角作为标准的窗口装饰。作为对照,Windows 则一直采用直角作为窗口装饰 —— 似乎一直都这样,直到现在为止。嗯,在 Windows 11 中,所有窗口装饰都是圆角,看起来很好。圆角的概念不是什么版权专利或者新想法,这就有一个问题了,为什么现在全都在用圆角?是有什么隐藏的目的吗? + +![Windows 资源管理器和 Nautilus 的圆角][6] + +哦,还记得 GNOME 的应用程序菜单的小指示器吗?这些小点提示着这里到底有多少页的应用程序。Windows 11 似乎也使用了这种这种思路。 + +![标记页面数量的小点][7] + +#### 调色盘 + +Windows 多年来始终有基于“蓝色”或其他蓝色变体的主题。虽然用户可以自行更改任务栏、开始菜单背景、窗口标题栏颜色,但借助这个选项,调色板与亮暗模式结合,展示出巨大变化,给 Windows 桌面带来了更圆滑、迷人的外观。也许这个灵感源自 Ubuntu、KDE 或者其它风格的调色板。 + +#### 暗黑模式 + +Windows 11 首次官方支持了暗黑模式,或者说是暗色主题。那么,我就直接在下面放两张截图,由大家自己评判。左侧是 Windows 11 暗黑模式下的开始菜单,右侧是使用了 Breeze Dark 主题的 KDE Plasma。 + +![Windows 11 开始菜单与 KDE Plasma 的比较][9] + +#### 全新桌面小组件 + +灵感的启发从来不会停止。还记得 KDE Plasma 的小组件吗?其实,这也不是什么新概念,然而小组件已经出现在 Windows 11。这是全新小组件面板的截图。你可以添加、移除或者重新排序这些小组件。 + +![小组件菜单][10] + +这些只是吸引我眼球的冰山一角。也许 Windows 11 还有许多“灵感”来“启发”它的外观。 + +但问题来了 —— 为什么现在是一次推出这些功能和外观的最佳时机? + +### 结束语 + +实话实说,当我第一次看到 Windows 11 的新外观时,我脑袋里就浮现出 Breeze Dark 主题的 KDE Plasma。借助很少量的修改,你可以让 KDE Plasma 看上去像 Windows 11。这本身就说明了它们两者是有多么地相似。 + +如果你看向整个桌面操作系统的市场,竞争者只有 Windows、Linux 桌面和 macOS。至今为止,它们的外观都有明显的标志性特征,例如 macOS 有自己独一无二的外观。直到现在,Windows 也有一样的蓝色主题的常规开始菜单,等等。但借助这些新变化,Windows 为用户提供了更丰富的定制选项,让它看上去更像 Linux 桌面。 + +在我个人看来,Windows 团队需要一种不同的标志性特征,而不是一直从我们心爱的 Linux 桌面获得“启发”。 + +我不知道未来会发生什么,但现在看来,“E-E-E” 还在竭尽全力运作。(LCTT 译注:“E-E-E”是微软臭名昭著的拥抱、扩展再消灭Embrace, extend, and extinguish策略。) + +再会。 + +-------------------------------------------------------------------------------- + +via: https://www.debugpoint.com/2021/06/windows-11-inspiration-linux-kde-plasma/ + +作者:[Arindam][a] +选题:[lujun9972][b] +译者:[imgradeone](https://github.com/imgradeone) +校对:[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/category/desktop-environment +[2]: https://www.debugpoint.com/blog/wp-content/uploads/2021/06/Windows-11-Start-menu-in-light-mode.jpg +[3]: https://www.debugpoint.com/blog/wp-content/uploads/2021/06/KDE-Plasma-5.22-Launcher-in-Light-mode.jpg +[4]: https://gitlab.com/LinxGem33/Arc-Menu +[5]: https://www.debugpoint.com/blog/wp-content/uploads/2020/12/gnomecustomize2020-2-1024x576.jpg +[6]: https://www.debugpoint.com/blog/wp-content/uploads/2021/06/Rounded-Corners-in-Windows-Explorer-and-Nautilus-1024x716.jpg +[7]: https://www.debugpoint.com/blog/wp-content/uploads/2021/06/Dots-in-paging-1024x468.jpg +[8]: https://www.debugpoint.com/2021/06/windows-11-system-requirement/ +[9]: https://www.debugpoint.com/blog/wp-content/uploads/2021/06/Comparison-of-Windows-11-Start-Menu-and-KDE-Plasma-1024x505.jpg +[10]: https://www.debugpoint.com/blog/wp-content/uploads/2021/06/Widgets-menu-1024x833.jpg diff --git a/published/202108/20210707 How to Know if Your System Uses MBR or GPT Partitioning -on Windows and Linux.md b/published/202108/20210707 How to Know if Your System Uses MBR or GPT Partitioning -on Windows and Linux.md new file mode 100644 index 0000000000..b13f856687 --- /dev/null +++ b/published/202108/20210707 How to Know if Your System Uses MBR or GPT Partitioning -on Windows and Linux.md @@ -0,0 +1,116 @@ +[#]: subject: (How to Know if Your System Uses MBR or GPT Partitioning [on Windows and Linux]) +[#]: via: (https://itsfoss.com/check-mbr-or-gpt/) +[#]: author: (Abhishek Prakash https://itsfoss.com/author/abhishek/) +[#]: collector: (lujun9972) +[#]: translator: (alim0x) +[#]: reviewer: (wxy) +[#]: publisher: (wxy) +[#]: url: (https://linux.cn/article-13727-1.html) + +如何在 Windows 和 Linux 上确定系统使用的是 MBR 还是 GPT 分区 +====== + +![](https://img.linux.net.cn/data/attachment/album/202108/28/165508gqjyigp3yz3gy6yy.jpg) + +在你安装 Linux 或任何其他系统的时候,了解你的磁盘的正确分区方案是非常关键的。 + +目前有两种流行的分区方案,老一点的 MBR 和新一些的 GPT。现在大多数的电脑使用 GPT。 + +在制作临场镜像或可启动 USB 设备时,一些工具(比如 [Rufus][1])会问你在用的磁盘分区情况。如果你在 MBR 分区的磁盘上选择 GPT 方案的话,制作出来的可启动 USB 设备可能会不起作用。 + +在这个教程里,我会展示若干方法,来在 Windows 和 Linux 系统上检查磁盘分区方案。 + +### 在 Windows 上检查系统使用的是 MBR 还是 GPT + +尽管在 Windows 上包括命令行在内有不少方法可以检查磁盘分区方案,这里我还是使用图形界面的方式查看。 + +按下 Windows 按键然后搜索“disk”,然后点击“**创建并格式化硬盘分区**”。 + +![][2] + +在这里,**右键点击**你想要检查分区方案的磁盘。在右键菜单里**选择属性**。 + +![右键点击磁盘并选择属性][3] + +在属性窗口,切换到**卷**标签页,寻找**磁盘分区形式**属性。 + +![在卷标签页寻找磁盘分区形式属性][4] + +正如你在上面截图所看到的,磁盘正在使用 GPT 分区方案。对于一些其他系统,它可能显示的是 MBR 或 MSDOS 分区方案。 + +现在你知道如何在 Windows 下检查磁盘分区方案了。在下一部分,你会学到如何在 Linux 下进行检查。 + +### 在 Linux 上检查系统使用的是 MBR 还是 GPT + +在 Linux 上也有不少方法可以检查磁盘分区方案使用的是 MBR 还是 GPT。既有命令行方法也有图形界面工具。 + +让我先给你演示一下命令行方法,然后再看看一些图形界面的方法。 + +#### 在 Linux 使用命令行检查磁盘分区方案 + +命令行的方法应该在所有 Linux 发行版上都有效。 + +打开终端并使用 `sudo` 运行下列命令: + +``` +sudo parted -l +``` + +上述命令实际上是一个基于命令行的 [Linux 分区管理器][5]。命令参数 `-l` 会列出系统中的所有磁盘以及它们的详情,里面包含了分区方案信息。 + +在命令输出中,寻找以 **Partition Table**(分区表)开头的行: + +![][6] + +在上面的截图中,磁盘使用的是 GPT 分区方案。如果是 **MBR**,它会显示为 **msdos**。 + +你已经学会了命令行的方式。但如果你不习惯使用终端,你还可以使用图形界面工具。 + +#### 使用 GNOME Disks 工具检查磁盘信息 + +Ubuntu 和一些其它基于 GNOME 的发行版内置了叫做 Disks 的图形工具,你可以用它管理系统中的磁盘。 + +你也可以使用它来获取磁盘的分区类型。 + +![][7] + +#### 使用 Gparted 图形工具检查磁盘信息 + +如果你没办法使用 GNOME Disks 工具,别担心,还有其它工具可以使用。 + +其中一款流行的工具是 Gparted。你应该可以在大多数 Linux 发行版的软件源中找到它。如果系统中没有安装的话,使用你的发行版的软件中心或 [包管理器][9] 来 [安装 Gparted][8]。 + +在 Gparted 中,通过菜单选择 **View->Device Information**(查看—>设备信息)。它会在左下区域显示磁盘信息,这些信息中包含分区方案信息。 + +![][10] + +看吧,也不是太复杂,对吗?现在你了解了好几种途径来确认你的系统使用的是 GPT 还是 MBR 分区方案。 + +同时我还要提一下,有时候磁盘还会有 [混合分区方案][11]。这不是很常见,大多数时候分区不是 MBR 就是 GPT。 + +有任何问题或建议,请在下方留下评论。 + +-------------------------------------------------------------------------------- + +via: https://itsfoss.com/check-mbr-or-gpt/ + +作者:[Abhishek Prakash][a] +选题:[lujun9972][b] +译者:[alim0x](https://github.com/alim0x) +校对:[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://rufus.ie/en_US/ +[2]: https://i1.wp.com/itsfoss.com/wp-content/uploads/2021/03/disc-management-windows.png?resize=800%2C561&ssl=1 +[3]: https://i1.wp.com/itsfoss.com/wp-content/uploads/2021/07/gpt-check-windows-1.png?resize=800%2C603&ssl=1 +[4]: https://i1.wp.com/itsfoss.com/wp-content/uploads/2021/07/gpt-check-windows-2-1.png?resize=800%2C600&ssl=1 +[5]: https://itsfoss.com/partition-managers-linux/ +[6]: https://i0.wp.com/itsfoss.com/wp-content/uploads/2021/07/check-if-mbr-or-gpt-in-Linux.png?resize=800%2C446&ssl=1 +[7]: https://i0.wp.com/itsfoss.com/wp-content/uploads/2021/07/check-if-mbr-or-gpt-in-Linux-gui.png?resize=800%2C548&ssl=1 +[8]: https://itsfoss.com/gparted/ +[9]: https://itsfoss.com/package-manager/ +[10]: https://i2.wp.com/itsfoss.com/wp-content/uploads/2021/07/check-disk-partitioning-scheme-linux-gparted.jpg?resize=800%2C555&ssl=1 +[11]: https://www.rodsbooks.com/gdisk/hybrid.html diff --git a/published/202108/20210712 Reading and writing files with Python.md b/published/202108/20210712 Reading and writing files with Python.md new file mode 100644 index 0000000000..e399f2d528 --- /dev/null +++ b/published/202108/20210712 Reading and writing files with Python.md @@ -0,0 +1,129 @@ +[#]: subject: "Reading and writing files with Python" +[#]: via: "https://opensource.com/article/21/7/read-write-files-python" +[#]: author: "Seth Kenlon https://opensource.com/users/seth" +[#]: collector: "lujun9972" +[#]: translator: "MjSeven" +[#]: reviewer: "turbokernel" +[#]: publisher: "wxy" +[#]: url: "https://linux.cn/article-13649-1.html" + +使用 Python 读写文件 +====== + +> 每种编程语言处理文件数据的方式不尽相同,Python 是这么干的。 + +![](https://img.linux.net.cn/data/attachment/album/202108/05/094700u9kj42rn4jh5h4hr.jpg) + +有些数据是临时的,它们在应用程序运行时存储在内存中,然后丢弃。但是有些数据是持久的。它们存储在硬盘驱动器上供以后使用,而且它们通常是用户最关心的东西。对于程序员来说,编写代码读写文件是很常见的,但每种语言处理该任务的方式都不同。本文演示了如何使用 Python 处理文件数据。 + +### 安装 Python + +在 Linux 上,你可能已经安装了 Python。如果没有,你可以通过发行版软件仓库安装它。例如,在 CentOS 或 RHEL 上: + +``` +$ sudo dnf install python3 +``` + +在 macOS 上,你可以使用 [MacPorts][2] 或 [Homebrew][3] 安装。在 Windows 上,你可以使用 [Chocolatey][4] 安装。 + +一旦安装了 Python,打开你最喜欢的文本编辑器,准备好写代码吧。 + +### 使用 Python 向文件中写入数据 + +如果你需要向一个文件中写入数据,记住有三个步骤: + + 1. 打开 + 2. 写入 + 3. 关闭 + +这与你在计算机上编码、编辑照片或执行其他操作时使用的步骤完全相同。首先,打开要编辑的文档,然后进行编辑,最后关闭文档。 + +在 Python 中,过程是这样的: + +``` +f = open('example.txt', 'w') +f.write('hello world') +f.close() +``` + +这个例子中,第一行以**写**模式打开了一个文件,然后用变量 `f` 表示,我使用了 `f` 是因为它在 Python 代码中很常见,使用其他任意有效变量名也能正常工作。 + +在打开文件时,有不同的模式: + + * `w` 代表写入 + * `r+` 代表可读可写 + * `a` 表示追加 + +第二行表示向文件中写入数据,本例写入的是纯文本,但你可以写入任意类型的数据。 + +最后一行关闭了文件。 + +#### 使用 `with` 语法写入数据 + +对于快速的文件交互,常用有一种简短的方法可以写入数据。它不会使文件保持打开状态,所以你不必记得调用 `close()` 函数。相反,它使用 `with` 语法: + +``` +with open('example.txt', 'a') as f: +    f.write('hello open source') +``` + +### 使用 Python 读取数据 + +如果你或你的用户需要通过应用程序需要向文件中写入一些数据,然后你需要使用它们,那么你就需要读取文件了。与写入类似,逻辑一样: + + 1. 打开 + 2. 读取 + 3. 关闭 + +同样的,这个逻辑反映了你一开始使用计算机就已知的内容。阅读文档,你可以打开、阅读,然后关闭。在计算机术语中,“打开”文件意味着将其加载到内存中。 + +实际上,一个文本文件内容肯定不止一行。例如,你需要读取一个配置文件、游戏存档或乐队下一首歌曲的歌词,正如你打开一本实体书时,你不可能立刻读完整本书,代码也只能解析已经加载到内存中的文件。因此,你可能需要遍历文件的内容。 + +``` +f = open('example.tmp', 'r') + +for line in f: +    print(line) + +f.close() +``` + +示例的第一行指明使用 **读** 模式打开一个文件,然后文件交由变量 `f` 表示,但就像你写数据一样,变量名是任意的。`f` 并没有什么特殊的,它只是单词 “file” 的最简表示,所以 Python 程序员会经常使用它。 + +在第二行,我们使用了 `line`,另一个任意变量名,用来表示 `f` 的每一行。这告诉 Python 逐行迭代文件的内容,并将每一行的内容打印到输出中(在本例中为终端或 [IDLE][5])。 + +#### 使用 `with` 语法读取数据 + +就像写入一样,使用 `with` 语法是一种更简短的方法读取数据。即不需要调用 `close()` 方法,方便地快速交互。 + +``` +with open('example.txt', 'r') as f: +    for line in f: +        print(line) +``` + +### 文件和 Python + +使用 Python 有很多方法向文件写入数据,包括用 [JSON、YAML、TOML][6] 等不同的格式写入。还有一个非常好的内置方法用于创建和维护 [SQLite][7] 数据库,以及许多库来处理不同的文件格式,包括 [图像][8]、音频和视频等。 + +-------------------------------------------------------------------------------- + +via: https://opensource.com/article/21/7/read-write-files-python + +作者:[Seth Kenlon][a] +选题:[lujun9972][b] +译者:[MjSeven](https://github.com/MjSeven) +校对:[turbokernel](https://github.com/turbokernel) + +本文由 [LCTT](https://github.com/LCTT/TranslateProject) 原创编译,[Linux中国](https://linux.cn/) 荣誉推出 + +[a]: https://opensource.com/users/seth +[b]: https://github.com/lujun9972 +[1]: https://opensource.com/sites/default/files/styles/image-full-size/public/lead-images/python-programming-code-keyboard.png?itok=fxiSpmnd "Hands on a keyboard with a Python book " +[2]: https://opensource.com/article/20/11/macports +[3]: https://opensource.com/article/20/6/homebrew-mac +[4]: https://opensource.com/article/20/3/chocolatey +[5]: https://opensource.com/article/17/10/python-101#idle +[6]: https://opensource.com/article/21/6/parse-configuration-files-python +[7]: https://opensource.com/article/21/2/sqlite3-cheat-sheet +[8]: https://opensource.com/article/19/3/python-image-manipulation-tools diff --git a/published/202108/20210713 Use VS Code to develop in containers.md b/published/202108/20210713 Use VS Code to develop in containers.md new file mode 100644 index 0000000000..f646962510 --- /dev/null +++ b/published/202108/20210713 Use VS Code to develop in containers.md @@ -0,0 +1,121 @@ +[#]: subject: (Use VS Code to develop in containers) +[#]: via: (https://opensource.com/article/21/7/vs-code-remote-containers-podman) +[#]: author: (Brant Evans https://opensource.com/users/branic) +[#]: collector: (lujun9972) +[#]: translator: (wxy) +[#]: reviewer: (wxy) +[#]: publisher: (wxy) +[#]: url: (https://linux.cn/article-13708-1.html) + +使用 VS Code 在容器中开发 +====== + +> 一致性可以避免当你有多个开发人员开发同一个项目时出现问题。 + +![](https://img.linux.net.cn/data/attachment/album/202108/22/090306jlkzyrw8cytcatw8.jpg) + +当你有多个不同开发环境的开发人员在一个项目上工作时,编码和测试的不一致性是一种风险。[Visual Studio Code][2](VS Code)是一个集成开发环境(IDE),可以帮助减少这些问题。它可以和容器结合起来,为每个应用程序提供独立的开发环境,同时提供一个一致的开发环境。 + +VS Code 的 [“Remote - Containers” 扩展][3] 使你能够创建一个容器定义,使用该定义来构建一个容器,并在容器内进行开发。这个容器定义可以和应用程序代码一起被签入到源代码库中,这使得所有的开发人员可以使用相同的定义在容器中进行构建和开发。 + +默认情况下,“Remote - Containers” 扩展使用 Docker 来构建和运行容器,但使用 [Podman][4] 的容器运行环境环境也很容易,它可以让你使用 [免 root 容器][5]。 + +本文将带领你完成设置,通过 Podman 在免 root 容器内使用 VS Code 和 “Remote - Containers” 扩展进行开发。 + +### 初始配置 + +在继续之前,请确保你的红帽企业 Linux(RHEL)或 Fedora 工作站已经更新了最新的补丁,并且安装了 VS Code 和 “Remote - Containers” 扩展。(参见 [VS Code 网站][2]了解更多安装信息) + +接下来,用一个简单的 `dnf install` 命令来安装 Podman 和它的支持包: + +``` +$ sudo dnf install -y podman +``` + +安装完 Podman 后,配置 VS Code 以使用 Podman 的可执行文件(而不是 Docker)与容器进行交互。在 VS Code 中,导航到 “文件 > 首选项 > 设置”,点击 “扩展” 旁边的 “>” 图标。在出现的下拉菜单中,选择 “Remote - Containers”,并向下滚动找到 “Remote - Containers: Docker Path” 选项。在文本框中,用 “podman” 替换 “docker”。 + +![在文本框中输入 “podman”][6] + +现在配置已经完成,在 VS Code 中为该项目创建一个新的文件夹或打开现有的文件夹。 + +### 定义容器 + +本教程以创建 Python 3 开发的容器为例。 + +“Remote - Containers” 扩展可以在项目文件夹中添加必要的基本配置文件。要添加这些文件,通过在键盘上输入 `Ctrl+Shift+P` 打开命令面板,搜索 “Remote-Containers: Add Development Container Configuration Files”,并选择它。 + +![Remote-Containers: Add Development Container Configuration Files][8] + +在接下来的弹出窗口中,定义你想设置的开发环境的类型。对于这个例子的配置,搜索 “Python 3” 定义并选择它。 + +![选择 Python 3 定义][9] + +接下来,选择将在容器中使用的 Python 的版本。选择 “3 (default)” 选项以使用最新的版本。 + +![选择 “3 (default)” 选项][10] + +Python 配置也可以安装 Node.js,但在这个例子中,取消勾选 “Install Node.js”,然后点击 “OK”。 + +![取消勾选 “Install Node.js"][11] + +它将创建一个 `.devcontainer` 文件夹,包含文件`devcontainer.json`和`Dockerfile`。VS Code 会自动打开`devcontainer.json` 文件,这样你就可以对它进行自定义。 + +### 启用免 root 容器 + +除了明显的安全优势外,以免 root 方式运行容器的另一个原因是,在项目文件夹中创建的所有文件将由容器外的正确用户 ID(UID)拥有。要将开发容器作为免 root 容器运行,请修改 `devcontainer.json` 文件,在它的末尾添加以下几行: + +``` +"workspaceMount": "source=${localWorkspaceFolder},target=/workspace,type=bind,Z", +"workspaceFolder": "/workspace", + +"runArgs": ["--userns=keep-id"], +"containerUser": "vscode" +``` + +这些选项告诉 VS Code 用适当的 SELinux 上下文挂载工作区,创建一个用户命名空间,将你的 UID 和 GID 原样映射到容器内,并在容器内使用 `vscode` 作为你的用户名。`devcontainer.json` 文件应该是这样的(别忘了行末的逗号,如图所示): + +![更新后的 devcontainer.json 文件][12] + +现在你已经设置好了容器的配置,你可以构建容器并打开里面的工作空间。重新打开命令调板(用 `Ctrl+Shift+P`),并搜索 “Remote-Containers: Rebuild and Reopen in Container”。点击它,VS Code 将开始构建容器。现在是休息一下的好时机(拿上你最喜欢的饮料),因为构建容器可能需要几分钟时间: + +![构建容器][13] + +一旦容器构建完成,项目将在容器内打开。在容器内创建或编辑的文件将反映在容器外的文件系统中,并对这些文件应用适当的用户权限。现在,你可以在容器内进行开发了。VS Code 甚至可以把你的 SSH 密钥和 Git 配置带入容器中,这样提交代码就会像在容器外编辑时那样工作。 + +### 接下来的步骤 + +现在你已经完成了基本的设置和配置,你可以进一步加强配置的实用性。比如说: + + * 修改 Dockerfile 以安装额外的软件(例如,所需的 Python 模块)。 + * 使用一个定制的容器镜像。例如,如果你正在进行 Ansible 开发,你可以使用 Quay.io 的 [Ansible Toolset][14]。(确保通过 Dockerfile 将 `vscode` 用户添加到容器镜像中) + * 将 `.devcontainer` 目录下的文件提交到源代码库,以便其他开发者可以利用容器的定义进行开发工作。 + +在容器内开发有助于防止不同项目之间的冲突,因为隔离了不同项目的依赖关系及代码。你可以使用 Podman 在免 root 环境下运行容器,从而提高安全性。通过结合 VS Code、“Remote - Containers” 扩展和 Podman,你可以轻松地为多个开发人员建立一个一致的环境,减少设置时间,并以安全的方式减少开发环境的差异带来的错误。 + +-------------------------------------------------------------------------------- + +via: https://opensource.com/article/21/7/vs-code-remote-containers-podman + +作者:[Brant Evans][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/branic +[b]: https://github.com/lujun9972 +[1]: https://opensource.com/sites/default/files/styles/image-full-size/public/lead-images/collab-team-pair-programming-code-keyboard2.png?itok=WnKfsl-G (Women programming) +[2]: https://code.visualstudio.com/ +[3]: https://code.visualstudio.com/docs/remote/containers +[4]: https://podman.io/ +[5]: https://www.redhat.com/sysadmin/rootless-podman-makes-sense +[6]: https://opensource.com/sites/default/files/uploads/vscode-remote_podman.png (Enter "podman" in the text box) +[7]: https://creativecommons.org/licenses/by-sa/4.0/ +[8]: https://opensource.com/sites/default/files/uploads/adddevelopmentcontainerconfigurationfiles.png (Remote-Containers: Add Development Container Configuration Files) +[9]: https://opensource.com/sites/default/files/uploads/python3.png (Select Python 3 definition) +[10]: https://opensource.com/sites/default/files/uploads/python3default.png (Select the 3 \(default\) option) +[11]: https://opensource.com/sites/default/files/uploads/unchecknodejs.png (Uncheck "Install Node.js") +[12]: https://opensource.com/sites/default/files/uploads/newdevcontainerjson.png (Updated devcontainer.json file) +[13]: https://opensource.com/sites/default/files/uploads/buildingcontainer.png (Building the container) +[14]: https://quay.io/repository/ansible/toolset diff --git a/published/202108/20210720 How to Upgrade to Debian 11 from Debian 10.md b/published/202108/20210720 How to Upgrade to Debian 11 from Debian 10.md new file mode 100644 index 0000000000..d68dbbbf5d --- /dev/null +++ b/published/202108/20210720 How to Upgrade to Debian 11 from Debian 10.md @@ -0,0 +1,136 @@ +[#]: subject: (How to Upgrade to Debian 11 from Debian 10) +[#]: via: (https://www.debugpoint.com/2021/07/upgrade-debian-11-from-debian-10/) +[#]: author: (Arindam https://www.debugpoint.com/author/admin1/) +[#]: collector: (lujun9972) +[#]: translator: (geekpi) +[#]: reviewer: (wxy) +[#]: publisher: (wxy) +[#]: url: (https://linux.cn/article-13647-1.html) + +提前尝鲜,从 Debian 10 升级到 Debian 11 +====== + +> 本指南解释了从 Debian 10 升级到 Debian 11 的步骤。 + +![](https://img.linux.net.cn/data/attachment/album/202108/04/114428rewb8x8m8tckevt9.jpg) + +[Debian][1] 的大版本发布是很罕见的,因为它往往需要社区的多年努力。这就是为什么 Debian 是真正的通用操作系统,并且在稳定性方面坚如磐石。 + +代号 Bullseye 的 [Debian 11][2] 即将正式发布。2021 年 7 月 15 日,Debian 11 进入完全冻结状态,这意味着发行在即。虽然官方发布日期还没有最终确定,但你现在就可以从 Debian 10 安装或升级到 Debian 11。 + +以下是方法。 + +### 前提条件 + + * 升级的过程非常简单明了。然而,采取某些预防措施是一个好的做法。特别是如果你正在升级一台服务器。 + * 对你的系统进行备份,包括所有重要的数据和文件。 + * 尝试禁用/删除你可能在一段时间内添加的任何外部仓库(PPA)。你可以在升级后逐一启用它们。 + * 关闭所有正在运行的应用。 + * 停止任何你可能已经启用的运行中的服务。升级完成后,你可以通过 [systemctl][3] 启动它们。这包括 Web 服务器、SSH 服务器、FTP 服务器或任何其他服务器。 + * 确保你有稳定的互联网连接。 + * 并为你的系统留出足够的停机时间。因为根据你的系统配置,Debian 版本升级需要时间大约在 1.5 小时到 2 小时之间。 + +### 将 Debian 10 Buster 升级到 11 Bullseye + +确保你的系统是最新的,而且你的软件包列表是最新的。 + +``` +sudo apt update && sudo apt upgrade +``` + +使用下面的命令安装 `gcc-8-base` 包。这是必须的,因为在历史上曾出现过升级失败的情况,这是因为下面的软件包中包含了某些依赖。 + +``` +sudo apt install gcc-8-base +``` + +![upgrade debian – system check][4] + +打开 `/etc/apt/sources.list`,通过注释 Debian 10 buster 包,而使用 bullseye 仓库进行更新。 + +注释所有的 buster 仓库,在行的开头加上 `#`。 + +![Comment the Debian 10 lines][5] + +在文件的末尾添加以下几行。 + +``` +deb http://deb.debian.org/debian bullseye main contrib non-free +deb http://deb.debian.org/debian bullseye-updates main contrib non-free +deb http://security.debian.org/debian-security bullseye-security main +deb http://ftp.debian.org/debian bullseye-backports main contrib non-free +``` + +![Add Debian 11 lines][6] + +按 `Ctrl + O` 保存文件,按 `Ctrl + X` 退出 `nano`。 + +更新一次系统仓库列表,以验证仓库的添加情况。 + +``` +sudo apt update +``` + +如果上面的命令没有出现任何错误,那么你已经成功地添加了 bullseye 仓库。 + +现在,通过运行下面的命令开始升级过程。基本安装的下载大小约为 1.2GB。这可能会根据你的系统配置而有所不同。 + +``` +sudo apt full-upgrade +``` + +![Debian upgrade start][7] + +这个命令需要时间。但不要让系统无人看管。因为升级过程中需要各种输入。 + +![lib6 config][8] + +![sudoers file][9] + +完成后,你可以用以下命令重启系统。 + +``` +systemctl reboot +``` + +重启后,运行以下命令,以确保你的系统是最新的,并且清理了所有不再需要的不必要的软件包。 + +``` +sudo apt --purge autoremove +``` + +如果一切顺利,你应该看到了 Debian 11 bullseye。你可以用下面的命令来验证版本: + +``` +cat /etc/os-release +``` + +![Debian 11 after upgrade][10] + +### 结束语 + +我希望这个指南能帮助你将你的系统升级到 Debian 11 bullseye。如果你遇到任何问题,请在下面的评论栏告诉我。 + +-------------------------------------------------------------------------------- + +via: https://www.debugpoint.com/2021/07/upgrade-debian-11-from-debian-10/ + +作者:[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.debian.org/ +[2]: https://www.debugpoint.com/2021/05/debian-11-features/ +[3]: https://www.debugpoint.com/2020/12/systemd-systemctl-service/ +[4]: https://www.debugpoint.com/blog/wp-content/uploads/2021/07/upgrade-debian-system-check-1024x503.jpeg +[5]: https://www.debugpoint.com/blog/wp-content/uploads/2021/07/Cpmment-the-Debian-10-lines-1024x636.jpeg +[6]: https://www.debugpoint.com/blog/wp-content/uploads/2021/07/Add-Debian-11-lines-1024x635.jpeg +[7]: https://www.debugpoint.com/blog/wp-content/uploads/2021/07/Debian-upgrade-start-1024x226.jpeg +[8]: https://www.debugpoint.com/blog/wp-content/uploads/2021/07/lib6-config-1024x195.jpeg +[9]: https://www.debugpoint.com/blog/wp-content/uploads/2021/07/sudoers-file.jpeg +[10]: https://www.debugpoint.com/blog/wp-content/uploads/2021/07/Debian-11-after-upgrade.jpeg \ No newline at end of file diff --git a/published/202108/20210720 Install Shutter in Fedora 34 and Above.md b/published/202108/20210720 Install Shutter in Fedora 34 and Above.md new file mode 100644 index 0000000000..74feecbeaf --- /dev/null +++ b/published/202108/20210720 Install Shutter in Fedora 34 and Above.md @@ -0,0 +1,86 @@ +[#]: subject: (Install Shutter in Fedora 34 and Above) +[#]: via: (https://www.debugpoint.com/2021/07/install-shutter-fedora/) +[#]: author: (Arindam https://www.debugpoint.com/author/admin1/) +[#]: collector: (lujun9972) +[#]: translator: (geekpi) +[#]: reviewer: (wxy) +[#]: publisher: (wxy) +[#]: url: (https://linux.cn/article-13641-1.html) + +在 Fedora 34 及以上版本中安装 Shutter +====== + +![](https://img.linux.net.cn/data/attachment/album/202108/01/211059fzo531621ydrr27k.jpg) + +> 这个快速指南解释了在 Fedora 34 及以上版本中安装 Shutter 所需的步骤。 + +截图工具有很多替代和选择。但在我个人看来,没有一个能接近 Shutter 的灵活性。不幸的是,由于各种依赖性问题,特别是它的设计方式,多年来,Linux 发行版,如 Ubuntu、Fedora,都面临着将这个应用打包到官方仓库的问题。 + +主要问题是它仍然基于 GTK2 和 Perl。当大多数应用转移到 GTK3 时,它仍然是 GTK2。这就造成了一个依赖性问题,因为 Debian/Ubuntu、Fedora 删除了某些包的依赖的 GTK2 版本。 + +在 Fedora 34 及以上版本中安装 [Shutter][1] 截图工具需要采用另一种方法。 + +现在,你只能通过个人包存档(PPA)来安装这个工具。下面是如何在 Fedora 34 及以上版本中安装它。 + +![Shutter in Fedora][2] + +### 在 Fedora 34 及以上版本中安装 Shutter + +在你的 Fedora 中打开一个终端,启用以下 [Shutter 的 copr 仓库][3]。这个包存档为 Fedora 的 Shutter 提供了一个单独的构建,其中包含了所有未满足的依赖项。 + +``` +sudo dnf copr enable geraldosimiao/shutter +``` + +完成后,你就可以通过 `dnf` 在 Fedora 34 及以上版本中简单地安装 Shutter。 + +``` +sudo dnf install shutter +``` + +尽管目前最新的版本是 v0.97。遗憾的是,该仓库目前包含旧的 v0.94.x。我希望版本库的所有者尽快包括最新的版本。 + +安装后,你可以通过应用菜单启动它。 + +#### 卸载 Shutter + +如果你愿意,你可以通过命令轻松地删除这个第三方仓库: + +``` +sudo dnf copr remove geraldosimiao/shutter +``` + +然后按照下面的方法,完全删除 Shutter,包括依赖关系。 + +``` +sudo dnf autoremove shutter +``` + +#### 在其他 Linux 发行版中安装 Shutter + +如果你想在 Debian、Ubuntu 或相关发行版中安装它,请 [查看此指南][4]。 + +### Shutter 的开发 + +最近,这个项目 [转移到了 GitHub][6],以便更好地协作,并且正在进行 GTK3 移植。而且它相当活跃,最近还发布了一个版本。我们希望它能尽快被移植到 GTK3 上,并在各发行版的原生仓库中可用。 + +如果你在安装 Shutter 时遇到任何错误,请在评论栏告诉我。 + +-------------------------------------------------------------------------------- + +via: https://www.debugpoint.com/2021/07/install-shutter-fedora/ + +作者:[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/tag/shutter +[2]: https://www.debugpoint.com/blog/wp-content/uploads/2021/07/Shutter-in-Fedora.jpeg +[3]: https://copr.fedorainfracloud.org/coprs/geraldosimiao/shutter/ +[4]: https://www.debugpoint.com/2020/04/shutter-install-ubuntu/ +[6]: https://github.com/shutter-project/shutter diff --git a/published/202108/20210723 5 useful ways to manage Kubernetes with kubectl.md b/published/202108/20210723 5 useful ways to manage Kubernetes with kubectl.md new file mode 100644 index 0000000000..0053ec6a0f --- /dev/null +++ b/published/202108/20210723 5 useful ways to manage Kubernetes with kubectl.md @@ -0,0 +1,92 @@ +[#]: subject: (5 useful ways to manage Kubernetes with kubectl) +[#]: via: (https://opensource.com/article/21/7/kubectl) +[#]: author: (Alan Smithee https://opensource.com/users/alansmithee) +[#]: collector: (lujun9972) +[#]: translator: (geekpi) +[#]: reviewer: (turbokernel) +[#]: publisher: (wxy) +[#]: url: (https://linux.cn/article-13676-1.html) + +用 kubectl 管理 Kubernetes 的 5 种有用方法 +====== + +> 学习 kubectl,提升你与 Kubernetes 的互动方式。 + +![Ship captain sailing the Kubernetes seas][1] + +Kubernetes 可以帮你编排运行有大量容器的软件。Kubernetes 不仅提供工具来管理(或者说 [编排][2])运行的容器,还帮助这些容器根据需要进行扩展。有了 Kubernetes 作为你的中央控制面板control panel(或称 控制平面control plane),你需要一种方式来管理 Kubernetes,而这项工作的工具就是 kubectl。`kubectl` 命令让你控制、维护、分析和排查 Kubernetes 集群的故障。与许多使用 `ctl`(“控制”的缩写)后缀的工具一样,如 `systemctl` 和 `sysctl`,`kubectl` 拥有大量的功能和任务权限,所以如果你正在运行 Kubernetes,你肯定会经常使用它。它是一个拥有众多选项的命令,所以下面是 `kubectl` 中简单易用的五个常见任务。 + +### 1、列出并描述资源 + +按照设计,容器往往会成倍增加。在某些条件下,它们可以快速增加。如果你只能通过 `podman ps`或 `docker ps` 来查看正在运行的容器,这可能会让你不知所措。通过 `kubectl get` 和 `kubectl describe`,你可以列出正在运行的吊舱pod以及它们正在处理的容器信息。更重要的是,你可以通过使用 `--namespace` 或 `name` 或 `--selector`等选项,只列出所需信息。 + +`get` 子命令不仅仅对吊舱和容器有用。它也有关于节点、命名空间、发布、服务和副本的信息。 + +### 2、创建资源 + +如果你只通过类似 OpenShift、OKD 或 Kubernetes 提供的 Web 用户界面(UI)创建过发布,但你想从 Linux 终端控制你的集群,那么可以使用 `kubectl create`。`kubectl create` 命令并不只是实例化一个新的应用发布。Kubernetes 中还有很多其他组件可以创建,比如服务、配额和 [计划任务][3]。 + +Kubernetes 中的计划任务可以创建一个临时的吊舱,用来在你选择的时间表上执行一些任务。它们并不难设置。下面是一个计划任务,让一个 BusyBox 镜像每分钟打印 “hello world”。 + +``` +$ kubectl create cronjob \ + hello-world \ + --image=busybox \ + --schedule="*/1 * * * *" -- echo "hello world" +``` + +### 3、编辑文件 + +Kubernetes 中的对象都有相应的配置文件,但在文件系统中查找相应的文件较为麻烦。有了 `kubectl edit`,你可以把注意力放在对象上,而不是定义文件上。你可以通过 `kubectl` 找到并打开文件(通过 `KUBE_EDITOR` 环境变量,你可以设置成你喜欢的编辑器)。 + +``` +$ KUBE_EDITOR=emacs \ + kubectl edit cronjob/hello-world +``` + +### 4、容器之间的传输文件 + +初次接触容器的人往往对无法直接访问的共享系统的概念感到困惑。他们可能会在容器引擎或 `kubectl` 中了解到 `exec` 选项,但当他们不能从容器中提取文件或将文件放入容器中时,容器仍然会显得不透明。使用 `kubectl cp` 命令,你可以把容器当做远程服务器,使主机和容器之间文件传输如 SSH 命令一样简单: + +``` +$ kubectl cp foo my-pod:/tmp +``` + +### 5、应用变更 + +对 Kubernetes 对象进行修改,可以通过 `kubectl apply` 命令完成。你所要做的就是将该命令指向一个配置文件: + +``` +$ kubectl apply -f ./mypod.json +``` + +类似于运行 Ansible 剧本或 Bash 脚本,`apply` 使得快速“导入”设置到运行中的 Kubernetes 实例很容易。例如,GitOps 工具 [ArgoCD][4] 由于 `apply` 子命令,安装起来出奇地简单: + +``` +$ kubectl create namespace argocd +$ kubectl apply -n argocd \ + -f https://raw.githubusercontent.com/argoproj/argo-cd/vx.y.z/manifests/install.yaml +``` + +### 使用 kubectl + +Kubectl 是一个强大的工具,由于它是一个终端命令,它可以写成脚本,并能实现用众多 Web UI 无法实现的功能。学习 `kubectl` 是进一步了解 Kubernetes、容器、吊舱以及围绕这些重要的云计算创新技术的一个好方法。[下载我们的 kubectl 速查表][5],以获得快速参考,其中包括命令示例,以帮助你学习,并在为你提供注意细节。 + +-------------------------------------------------------------------------------- + +via: https://opensource.com/article/21/7/kubectl + +作者:[Alan Smithee][a] +选题:[lujun9972][b] +译者:[geekpi](https://github.com/geekpi) +校对:[turbokernel](https://github.com/turbokernel) + +本文由 [LCTT](https://github.com/LCTT/TranslateProject) 原创编译,[Linux中国](https://linux.cn/) 荣誉推出 + +[a]: https://opensource.com/users/alansmithee +[b]: https://github.com/lujun9972 +[1]: https://opensource.com/sites/default/files/styles/image-full-size/public/lead-images/ship_captain_devops_kubernetes_steer.png?itok=LAHfIpek (Ship captain sailing the Kubernetes seas) +[2]: https://opensource.com/article/20/11/orchestration-vs-automation +[3]: https://opensource.com/article/20/11/kubernetes-jobs-cronjobs +[4]: https://argoproj.github.io/argo-cd/ +[5]: https://opensource.com/downloads/kubectl-cheat-sheet diff --git a/published/202108/20210725 Top 7 Linux Laptops You Can Buy in 2021.md b/published/202108/20210725 Top 7 Linux Laptops You Can Buy in 2021.md new file mode 100644 index 0000000000..80cecb9d70 --- /dev/null +++ b/published/202108/20210725 Top 7 Linux Laptops You Can Buy in 2021.md @@ -0,0 +1,231 @@ +[#]: subject: (Top 7 Linux Laptops You Can Buy in 2021) +[#]: via: (https://news.itsfoss.com/best-linux-laptops-2021/) +[#]: author: (Ankush Das https://news.itsfoss.com/author/ankush/) +[#]: collector: (lujun9972) +[#]: translator: (wxy) +[#]: reviewer: (wxy) +[#]: publisher: (wxy) +[#]: url: (https://linux.cn/article-13672-1.html) + +2021 年可以购买的 10 大 Linux 笔记本电脑 +====== + +> 想挑选一台安装有 Linux 的新笔记本电脑?这里有几个选项可以考虑。 + +![](https://news.itsfoss.com/wp-content/uploads/2021/07/linux-laptop.webp) + +Linux 笔记本电脑是 MacOS 和 Windows 笔记本电脑的完美替代品。 + +从技术上讲,你可以通过安装任何你能找到的 Linux 发行版,将你选择的任何笔记本电脑变成一台 Linux 机器。 + +但是,在这里,我们的重点将放在提供 Linux 开箱即用体验的笔记本电脑上,确保无论你有什么样的预算,都能获得最佳的兼容性和支持。 + +### 大众品牌的 Linux 笔记本电脑 + +对于消费者来说,选择由大众品牌制造商生产的 Linux 笔记本电脑往往是最好的选择。 + +你不必担心售后、延长保修期和服务维修等问题。 + +戴尔和联想是通常提供预装了 Linux 的笔记本电脑的厂商之一。 + +请注意,这会因国家/地区的情况而定。 + +*本文中提到的价格已转换为美元,以方便比较,不包括运费和其他额外费用。* + +#### 1、联想 Thinkpad X1 Carbon (第 8 代/第 9 代) + +![][1] + +**价格**:起价为 **$1535** + +联想的整个 Thinkpad 系列是 Linux 用户的一个热门选择。它经久耐用,提供了良好的兼容性。 + +然而,它的价格一直偏高。 + +你有三种选择,这取决于你的需求。如果你定制一台第 9 代 Thinkpad 笔记本电脑,你可以选择安装 Ubuntu 20.04 和 Fedora 33。 + +对于第 8 代机型,似乎 Fedora 33 不在考虑之列,而是提供了 Fedora 32 和 Ubuntu 20.04。 + +所有的配置都采用英特尔芯片组,第 8 代采用的是 10 代芯片组,第 9 代采用 11 代芯片组。 + +其他的大部分规格都相似,有 14 英寸显示屏(FHD、WQHD 和 UHD 可供选择)、高达 32GB 的内存、1TB 固态硬盘、指纹识别器和 Wi-Fi 6 支持。 + +- [Thinkpad X1 Carbon (第 9 代)][2] +- [Thinkpad X1 Carbon (第 8 代)][3] + +#### 2、戴尔 XPS 13 开发者版 + +![][4] + +**价格**:起价为 **$1059** + +戴尔 XPS 系列是一个令人印象深刻的、可以考虑运行 Linux 的笔记本电脑系列。 + +它是为开发者运行 Linux(Ubuntu 20.04)而定制的。 + +你可以得到一个 13.4 英寸的显示屏(有 FHD 和 UHD 可选)、第 11 代 i5/i7 处理器、高达 32GB 的内存、2TB 固态硬盘、指纹识别器,以及 Wi-Fi 6 支持。 + +- [戴尔 XPS 13 开发者版][5] + +### 纯 Linux 制造商的笔记本电脑 + +如果你不想要主流的选择,而是想要一些独特的选择,那你可以选择支持纯 Linux 制造商,有几个是你可以考虑的。 + +#### 1、System76 Gazelle + +![][6] + +**价格**:起价为 **$1499** + +System76 的笔记本电脑将内置他们的 Pop!_OS 操作系统,该系统基于 Ubuntu,但提供了**无忧的开箱即用体验**。 + +可以把 System76 视作 Linux 笔记本电脑中的苹果电脑,他们尽力为其提供的硬件优化了 Pop!_OS。 + +他们可以完全控制这些软件和硬件,所以这对终端消费者来说应该是令人兴奋的产品整合。 + +除了 144Hz 的 16.5 英寸显示屏、第 11 代 i7 处理器、高达 8TB 的 NVMe 固态硬盘支持等令人印象深刻的基本配置外,你还会有一个 RTX 3050 GPU,应该可以让你在笔记本电脑上处理各种苛刻的任务。 + +虽然 System76 还有一些其他型号的笔记本电脑,但在写这篇文章时,还没有上市。因此,请随时查看官方商店页面,订购定制的配置。 + +- [System76 Gazelle][7] + +#### 2、Purism 笔记本电脑 + +![][8] + +**价格**:起价为 **$1599** + +如果你是一个有安全意识的用户,Purism 的笔记本电脑可以作为一个选择。 + +Librem 14 是他们最新的笔记本电脑之一,带有 [PureOS][9](也是由他们制造的)。 + +虽然它可能没有提供最新一代的处理器,但你应该对机上的第 10 代 i7 芯片感到满意吧。 + +它支持高达 64GB 的内存,并具有硬件封禁开关,可以禁用网络摄像头、耳机插孔、蓝牙或无线音频。 + +- [Librem 14][10] + +#### 3、TUXEDO Aura 15 + +![][11] + +**价格**:起价为 **$899** + +如果你想要一台 AMD 的笔记本电脑(采用上一代处理器 Ryzen 7 4700U),TUXEDO 计算机公司的 Aura 15 是一个不错的选择。 + +主要规格包括全高清显示屏、高达 64GB 的内存、支持 Wi-Fi 6,以及一个 LTE 模块。 + +它配备了 Ubuntu 或 TUXEDO 操作系统(基于 Ubuntu Budgie),可根据你的定制要求。 + +- [TUXEDO Aura 15][12] + +#### 4、TUXEDO Stellaris 15 + +![][13] + +**价格**:起价为 **$2160** + +如果你正在寻找最新和最强大的笔记本电脑,并希望用上 RTX 3080 显卡,这应该是一个非常好的选择。 + +它提供了最新的英特尔/AMD Ryzen 处理器的配置选择,并具有 165Hz 刷新率的 3K 分辨率显示屏。 + +它绝不是你会觉得在旅行时带着方便的东西,但如果你需要计算能力,你可以选择它。 + +- [TUXEDO Stellaris 15][21] + +#### 5、Slimbook Pro X + +![][14] + +**价格**:起价为 **$1105** + +Slimbook 专注于旅行方便携带的轻薄笔记本电脑型号。 + +你可以选择各种发行版,包括 Ubuntu(GNOME、KDE、MATE)、KDE Neon、Manjaro 和 Fedora。 + +你可以得到大部分的基本规格,包括支持高达 2TB 的固态硬盘、64GB 的内存、全高清 IPS 显示屏等等。 + +虽然你可以选择英特尔和 AMD Ryzen(最新一代处理器),并分别与 Nvidia 和 Vega 图形处理器相结合,但在写这篇文章时只有 Ryzen 型号有库存。 + +- [Slimbook Pro X][22] + +#### 6、Slimbook Essential + +![][23] + +**价格**:起价为 **$646** + +一个令人印象深刻的预算友好型 Linux 笔记本电脑的选择。 + +它提供了 AMD Ryzen 和英特尔的变体(最后一代)供你选择。你得到硬件规格还可以,包括高达 64GB 的内存、2TB 的 SSD 支持,但是要少一个大的屏幕和板载专用显卡。 + +- [Slimbook Essential][15] + +#### 7、Jupiter 14 Pro + +![][16] + +**价格**:起价为 **$1199** + +Juno 计算机公司的 Jupiter 14 采用了第 11 代英特尔处理器,并配备了 NVIDIA GTX 1650,价格诱人。 + +它内置了 Ubuntu 20.04 系统,没有其他系统可供选择。 + +基本配置包括 16GB 内存,与其他一些产品相比,这可能更物超所值一些。 + +你会发现在他们的网站上可以选择你的地区(英国/欧洲或美国/加拿大),请确保利用这一点。 + +- [Jupiter Pro 14][17] + +#### 荣誉奖:PineBook Pro + +![][18] + +PineBook Pro 是一款基于 ARM 的笔记本电脑(采用 Manjaro ARM 版),预算低廉,对于 Linux 上的很多基本任务来说,应该可以正常工作。 + +在写这篇文章的时候,它已经没有库存了(直到进一步通知)。然而,当你看到这篇文章时,可以自己去看看一下。 + +- [Pinebook Pro][19] + +### 总结 + +如果你不喜欢这里的选择,你可以去看看 [其他可以购买 Linux 笔记本电脑的地方][20]。根据你的预算,选择你觉得最适合你的东西。 + +毕竟,所有的东西都有 Linux 的影子。有些可以让你能够从多个发行版中选择,但大多数人都坚持使用预装的 Ubuntu。 + +-------------------------------------------------------------------------------- + +via: https://news.itsfoss.com/best-linux-laptops-2021/ + +作者:[Ankush Das][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://news.itsfoss.com/author/ankush/ +[b]: https://github.com/lujun9972 +[1]: https://i1.wp.com/news.itsfoss.com/wp-content/uploads/2021/07/thinkpad-x1-carbon.jpg?w=1060&ssl=1 +[2]: https://www.lenovo.com/us/en/laptops/thinkpad/thinkpad-x1/X1-Carbon-G9/p/22TP2X1X1C9 +[3]: https://www.lenovo.com/us/en/laptops/thinkpad/thinkpad-x1/X1-Carbon-Gen-8-/p/22TP2X1X1C8 +[4]: https://i1.wp.com/news.itsfoss.com/wp-content/uploads/2021/07/dell-xps-13.jpg?w=1200&ssl=1 +[5]: https://www.dell.com/en-us/work/shop/dell-laptops-and-notebooks/new-xps-13-developer-edition/spd/xps-13-9310-laptop/ctox139w10p2c3000u +[6]: https://i1.wp.com/news.itsfoss.com/wp-content/uploads/2021/07/system76-gazelle.jpg?w=1200&ssl=1 +[7]: https://system76.com/laptops/gazelle +[8]: https://i2.wp.com/news.itsfoss.com/wp-content/uploads/2021/07/librem14.png?resize=780%2C780&ssl=1 +[9]: https://www.pureos.net +[10]: https://puri.sm/products/librem-14/ +[11]: https://i0.wp.com/news.itsfoss.com/wp-content/uploads/2021/07/tuxedo-aura-15.jpg?resize=780%2C780&ssl=1 +[12]: https://www.tuxedocomputers.com/en/Linux-Hardware/Linux-Notebooks/15-16-inch/TUXEDO-Aura-15-Gen1.tuxedo +[13]: https://i0.wp.com/news.itsfoss.com/wp-content/uploads/2021/07/tuxedo-stellaris.jpg?resize=780%2C780&ssl=1 +[14]: https://i2.wp.com/news.itsfoss.com/wp-content/uploads/2021/07/slimbook-pro.jpg?resize=1568%2C849&ssl=1 +[15]: https://slimbook.es/en/essential-en +[16]: https://i2.wp.com/news.itsfoss.com/wp-content/uploads/2021/07/jupiter-pro.png?w=1314&ssl=1 +[17]: https://junocomputers.com/us/product/jupiter-14-pro/ +[18]: https://i2.wp.com/news.itsfoss.com/wp-content/uploads/2021/07/pinebook-pro.png?w=869&ssl=1 +[19]: https://www.pine64.org/pinebook-pro/ +[20]: https://itsfoss.com/get-linux-laptops/ +[21]: https://www.tuxedocomputers.com/en/Linux-Hardware/Linux-Notebooks/15-16-inch/TUXEDO-Stellaris-15-Gen3.tuxedo +[22]: https://slimbook.es/en/store/slimbook-pro-x +[23]: https://i1.wp.com/news.itsfoss.com/wp-content/uploads/2021/07/slimbook-essential.jpg?resize=1568%2C882&ssl=1 \ No newline at end of file diff --git a/published/202108/20210726 Command line quick tips- wc, sort, sed and tr.md b/published/202108/20210726 Command line quick tips- wc, sort, sed and tr.md new file mode 100644 index 0000000000..27a875e2a2 --- /dev/null +++ b/published/202108/20210726 Command line quick tips- wc, sort, sed and tr.md @@ -0,0 +1,376 @@ +[#]: subject: (Command line quick tips: wc, sort, sed and tr) +[#]: via: (https://fedoramagazine.org/command-line-quick-tips-wc-sort-sed-and-tr/) +[#]: author: (mahesh1b https://fedoramagazine.org/author/mahesh1b/) +[#]: collector: (lujun9972) +[#]: translator: (perfiffer) +[#]: reviewer: (wxy) +[#]: publisher: (wxy) +[#]: url: (https://linux.cn/article-13664-1.html) + +一些命令行小技巧:wc、sort、sed 和 tr +====== + +![](https://img.linux.net.cn/data/attachment/album/202108/10/085720hyd795y1wrmd5rx9.jpg) + +Linux 发行版十分好用,而且它们有一些用户可能不知道的技巧。让我们来看看一些命令行实用工具,当你热衷于终端而不是 GUI 时,它们可能更顺手。 + +我们都知道在一个系统上使用终端会更高效。当你编辑和排版一个文本文件时,终端会让你确切的感受到,生活如此简单。 + +本文将向你介绍 `wc`、`sort`、`tr` 和 `sed` 命令。 + +### wc + +`wc` 是一个实用工具,全称是 “word count”。顾名思义,它可以用来统计任何文件的行数、单词数和字节数。 + +让我们来看看它是如何工作的: + +``` +$ wc filename +lines words characters filename +``` + +输出的是文件的行数、单词数、字符数和文件名。 + +想获得特定的输出,我们必须使用选项: + + * `-c` 打印字节总数 + * `-l` 打印行数 + * `-w` 打印单词总数 + * `-m` 打印字符总数 + +#### wc 示例 + +让我们来看看它的运行结果。 + +让我们从一个文本文件 `lormipsm.txt` 开始。首先,我们通过 `cat` 查看文件内容,然后使用 `wc`: + +``` +$ cat loremipsm.txt +Linux is the best-known and most-used open source operating system. +As an operating system, Linux is software that sits underneath all of the other software on a computer, +receiving requests from those programs and replaying these requests to the computer's hardware. + +$ wc loremipsm.txt +3 41 268 loremipsm.txt +``` + +假设我只想查看文件的字节数: + +``` +$ wc -c loremipsm.txt +268 loremipsm.txt +``` + +查看文件的行数: + +``` +$ wc -l loremipsm.txt +3 loremipsm.txt +``` + +查看文件的单词数: + +``` +$ wc -w loremipsm.txt +41 loremipsm.txt +``` + +现在只查看文件的字符数: + +``` +$ wc -m loremipsm.txt +268 loremipsm.txt +``` + +### sort + +`sort` 命令是最有用的工具之一。它会对文件的数据进行排序。可以根据字符或数字进行升序或降序排列。它也可以用来对文件中的行进行排序和随机化。 + +使用 `sort` 非常简单。我们需要做的仅仅是提供一个文件名: + +``` +$ sort filename +``` + +默认的是按照字母顺序对数据进行排序。需要注意的是 `sort` 命令仅仅是对数据进行排序展示。它并不会改写文件。 + +使用 `sort` 命令的一些有用的选项: + + * `-r` 将文件中的行按倒序进行排序 + * `-R` 将文件中的行打乱为随机顺序 + * `-o` 将输出保存到另一个文件中 + * `-k` 按照特定列进行排序 + * `-t` 使用指定的分隔符,而不使用空格 + * `-n` 根据数值对数据进行排序 + +#### sort 示例 + +让我们看看 `sort` 的几个简单示例。 + +我们有一个 `list.txt` 的文件,包含逗号分隔的名称和数值。 + +首先让我们打印出文件内容并简单排序: + +``` +$ cat list.txt +Cieran Wilks, 9 +Adelina Rowland, 4 +Hayden Mcfarlnd, 1 +Ananya Lamb, 5 +Shyam Head, 2 +Lauryn Fuents, 8 +Kristian Felix, 10 +Ruden Dyer, 3 +Greyson Meyers, 6 +Luther Cooke, 7 + +$ sort list.txt +Adelina Rowland, 4 +Ananya Lamb, 5 +Cieran Wilks, 9 +Greyson Meyers, 6 +Hayden Mcfarlnd, 1 +Kristian Felix, 10 +Lauryn Fuents, 8 +Luther Cooke, 7 +Ruden Dyer, 3 +Shyam Head, 2 +``` + +现在对数据进行倒序排序: + +``` +$ sort -r list.txt +Shyam Head, 2 +Ruden Dyer, 3 +Luther Cooke, 7 +Lauryn Fuents, 8 +Kristian Felix, 10 +Hayden Mcfarlnd, 1 +Greyson Meyers, 6 +Cieran Wilks, 9 +Ananya Lamb, 5 +Adelina Rowland, 4 +``` + +让我们打乱数据: + +``` +$ sort -R list.txt +Cieran Wilks, 9 +Greyson Meyers, 6 +Adelina Rowland, 4 +Kristian Felix, 10 +Luther Cooke, 7 +Ruden Dyer, 3 +Lauryn Fuents, 8 +Hayden Mcfarlnd, 1 +Ananya Lamb, 5 +Shyam Head, 2 +``` + +来看一点更复杂的。这次我们根据第二个字段,也就是数值对数据进行排序,并使用 `-o` 选项将输出保存到另一个文件中: + +``` +$ sort -n -k2 -t ',' -o sorted_list.txt list.txt +$ ls + sorted_list.txt list.txt +$ cat sorted_list.txt +Hayden Mcfarlnd, 1 +Shyam Head, 2 +Ruden Dyer, 3 +Adelina Rowland, 4 +Ananya Lamb, 5 +Greyson Meyers, 6 +Luther Cooke, 7 +Lauryn Fuents, 8 +Cieran Wilks, 9 +Kristian Felix, 10 +``` + +这里我们使用 `-n` 选项按数字顺序进行排序,`-k` 选项用来指定要排序的字段(在本例中为第 2 个字段),`-t` 选项指定分隔符或字段分隔符(逗号),`-o` 选项将输出保存到 `sorted_list.txt` 文件中。 + +### sed + +`sed` 是一个流编辑器,用于过滤和转换输出中的文本。这意味着我们不需要对原文件进行修改,只需要对输出进行修改。如果需要,我们可以将更改保存到一个新的文件中。`sed` 提供了很多有用的选项用于过滤和编辑数据。 + +`sed` 的语法格式如下: + +``` +$ sed [OPTION] ‘PATTERN’ filename +``` + +sed 常用的一些选项: + + * `-n` 取消默认输出 + * `p` 打印指定的数据  + * `d` 删除指定行 + * `q` 退出 `sed` 脚本 + +#### sed 示例 + +我们来看看 `sed` 是如何运作的。我们从 `data` 文件开始,其中的字段表示编号、名称、年龄和操作系统。 + +如果行出现在特定的行范围内,该行将打印 2 次: + +``` +$ cat data +1 Vicky Grant 20 linux +2 Nora Burton 19 Mac +3 Willis Castillo 21 Windows +4 Gilberto Mack 30 Windows +5 Aubrey Hayes 17 windows +6 Allan Snyder 21 mac +7 Freddie Dean 25 linux +8 Ralph Martin 19 linux +9 Mindy Howard 20 Mac + +$ sed '3,7 p' data +1 Vicky Grant 20 linux +2 Nora Burton 19 Mac +3 Willis Castillo 21 Windows +3 Willis Castillo 21 Windows +4 Gilberto Mack 30 Windows +4 Gilberto Mack 30 Windows +5 Aubrey Hayes 17 windows +5 Aubrey Hayes 17 windows +6 Allan Snyder 21 mac +6 Allan Snyder 21 mac +7 Freddie Dean 25 linux +7 Freddie Dean 25 linux +8 Ralph Martin 19 linux +9 Mindy Howard 20 Mac +``` + +这里的操作用单引号括起来,表示第 3 行和第 7 行,并且使用了 `p` 打印出符合匹配规则的数据。sed 的默认行为是在解析后打印每一行。这意味着由于使用了 `p` ,第 3 行到第 7 行打印了两次。 + +如何打印文件中特定的行?使用 `-n` 选项来消除在输出中不匹配的行: + +``` +$ sed -n '3,7 p' data +3 Willis Castillo 21 Windows +4 Gilberto Mack 30 Windows +5 Aubrey Hayes 17 windows +6 Allan Snyder 21 mac +7 Freddie Dean 25 linux +``` + +使用 ‘-n’ 仅仅只有第 3 行到第 7 行会被打印。 + +省略文件中的特定行。使用 `d` 从输出中删除行: + +``` +$ sed '3 d' data +1 Vicky Grant 20 linux +2 Nora Burton 19 Mac +4 Gilberto Mack 30 Windows +5 Aubrey Hayes 17 windows +6 Allan Snyder 21 mac +7 Freddie Dean 25 linux +8 Ralph Martin 19 linux +9 Mindy Howard 20 Mac + +$ sed '5,9 d' data +1 Vicky Grant 20 linux +2 Nora Burton 19 Mac +3 Willis Castillo 21 Windows +4 Gilberto Mack 30 Windows +``` + +从文件中搜索特定的关键字: + +``` +$ sed -n '/linux/ p' data +7 Freddie Dean 25 linux +8 Ralph Martin 19 linux + +$ sed -n '/linux/I p' data +1 Vicky Grant 20 Linux +7 Freddie Dean 25 linux +8 Ralph Martin 19 linux +``` + +在这些例子中,我们在 `/ /` 中使用了一个正则表达式。如果文件中有类似的单词,但大小写不一致,可以使用 `I` 使得搜索不区分大小写。回想一下,`-n` 删除了输出中不匹配的行。 + +替换文件中的单词: + +``` +$ sed 's/linux/linus/' data +1 Vicky Grant 20 Linux +2 Nora Burton 19 Mac +3 Willis Castillo 21 Windows +4 Gilberto Mack 30 Windows +5 Aubrey Hayes 17 windows +6 Allan Snyder 21 mac +7 Freddie Dean 25 linus +8 Ralph Martin 19 linus +9 Mindy Howard 20 Mac +``` + +这里 `s/ / /` 表示它是一个正则表达式。在两个 `/` 之间的就是定位的单词和需要替换的新单词。 + +### tr + +`tr` 命令可以用来转换或删除字符。它可以将小写字母转换为大写字母,也可以将大写字母转换为小写字母,可以消除重复字符,也可以删除特定字符。 + +`tr` 的奇怪之处在于,它不同于 `wc`、`sort`、`sed` 那样接受文件作为输入。我们使用 `|` (管道符)为 `tr` 命令提供输入。 + +``` +$ cat filename | tr [OPTION] +``` + +`tr` 命令使用的一些选项: + + * `-d` 删除给定输入第一个集合中的指定字符,不做转换 + * `-s` 将重复出现的字符替换为单个 + +#### tr 示例 + +现在让我们使用 `tr` 命令将 `letter` 文件中的所有小写字符转换为大写字符: + +``` +$ cat letter +Linux is too easy to learn, +And you should try it too. + +$ cat letter | tr 'a-z' 'A-Z' +LINUX IS TOO EASY TO LEARN, +AND YOU SHOULD TRY IT TOO. +``` + +这里的 `a-z`、`A-Z` 表示我们想要将 `a` 到 `z` 范围内的小写字符转换为大写字符。 + +删除文件中的 `o` 字符: + +``` +$ cat letter | tr -d 'o' +Linux is t easy t learn, +And yu shuld try it t. +``` + +从文件中压缩字符 `o` 意味着如果 `o` 在文件中重复出现,那么它将会被删除并且只打印一次: + +``` +$ cat letter | tr -s 'o' +Linux is to easy to learn, +And you should try it to. +``` + +### 总结 + +这是使用 `wc`、`sort`、`sed`、`tr` 命令的快速演示。这些命令可以方便快捷的操作终端上的文本文件。你可以使用 `man` 命令来了解这些命令的更多信息。 + +-------------------------------------------------------------------------------- + +via: https://fedoramagazine.org/command-line-quick-tips-wc-sort-sed-and-tr/ + +作者:[mahesh1b][a] +选题:[lujun9972][b] +译者:[perfiffer](https://github.com/perfiffer) +校对:[wxy](https://github.com/wxy) + +本文由 [LCTT](https://github.com/LCTT/TranslateProject) 原创编译,[Linux中国](https://linux.cn/) 荣誉推出 + +[a]: https://fedoramagazine.org/author/mahesh1b/ +[b]: https://github.com/lujun9972 +[1]: https://fedoramagazine.org/wp-content/uploads/2018/10/commandlinequicktips-816x345.jpg diff --git a/published/202108/20210726 How to Install elementary Tweaks Tool.md b/published/202108/20210726 How to Install elementary Tweaks Tool.md new file mode 100644 index 0000000000..31bb5406a1 --- /dev/null +++ b/published/202108/20210726 How to Install elementary Tweaks Tool.md @@ -0,0 +1,80 @@ +[#]: subject: (How to Install elementary Tweaks Tool) +[#]: via: (https://www.debugpoint.com/2021/07/elementary-tweaks-install/) +[#]: author: (Arindam https://www.debugpoint.com/author/admin1/) +[#]: collector: (lujun9972) +[#]: translator: (imgradeone) +[#]: reviewer: (wxy) +[#]: publisher: (wxy) +[#]: url: (https://linux.cn/article-13665-1.html) + +如何安装 elementary 优化工具 +====== + +> 这篇快速教程演示了如何安装 elementary / Pantheon 优化工具。 + +![](https://img.linux.net.cn/data/attachment/album/202108/10/092914jj9gzejjglclu160.jpg) + +elementary 优化工具elementary Tweaks Tool是专为 [elementary OS][1] 设计的实用工具。它提供了一些用于修改 elementary 设置的选项。虽然 elementary 已经提供了绝大多数选项,但还有一小部分的 Pantheon 桌面优化是不能直接通过普通设置修改的,因此这个工具才得以诞生。这个工具与 GNOME 中的 [GNOME Tweaks][2] 有些相似。 + +也就是说,安装这个工具其实十分简单,只是 [elementary OS 6 Odin][3] 与早期版本(例如 elementary OS 5 Juno)存在一些区别。从 elementary OS 6 Odin 开始,这个工具已经重命名为 Pantheon 优化工具Pantheon Tweaks Tool。下面是安装步骤。 + +### 安装 elementary 优化工具 + +elementary OS 并没有内置用于添加 PPA 的 `software-properties-common` 软件包。如果你还没有安装此软件包,请使用如下命令安装: + +``` +sudo apt install software-properties-common +``` + +#### elementary OS 6 Odin + +该版本的优化工具已经改名,并且独立于原版开发。它的名称是 [Pantheon Tweaks][4]。你可以使用如下命令安装它。 + +``` +sudo add-apt-repository -y ppa:philip.scott/pantheon-tweaks +sudo apt install -y pantheon-tweaks +``` + +#### elementary OS 5 Juno 及更旧版本 + +如果你正在使用 elementary OS 5 Juno 或者更旧的版本,你可以使用同一 PPA 安装早期版本的 [elementary-tweaks][5]。在终端输入以下命令即可安装。 + +``` +sudo add-apt-repository -y ppa:philip.scott/elementary-tweaks +sudo apt install -y elementary-tweaks +``` + +### 使用方法 + +安装完成后,你可以在 “应用程序菜单 > 系统设置 > 优化” 中使用此工具。 + +![设置中的 Tweaks(优化)选项][6] + +在“优化”窗口,你可以修改一些选项,配置你的 elementary 桌面。 + +![安装完成后的 elementary 优化工具 —— 选项][7] + +顺便提示一下,这款工具仅仅是 elementary 桌面设置的前端。如果你知道准确的名称或属性,你可以直接在终端中修改配置。你在这款优化工具中获得的选项也可以在 `dconf` 编辑器中查找 `io.elementary` 路径以修改。 + +如果你在安装或使用优化工具时遇到了一些问题,你可以在评论区留言。 + +-------------------------------------------------------------------------------- + +via: https://www.debugpoint.com/2021/07/elementary-tweaks-install/ + +作者:[Arindam][a] +选题:[lujun9972][b] +译者:[imgradeone](https://github.com/imgradeone) +校对:[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/tag/elementary +[2]: https://www.debugpoint.com/2018/05/customize-your-ubuntu-desktop-using-gnome-tweak/ +[3]: https://www.debugpoint.com/2020/09/elementary-os-6-odin-new-features-release-date/ +[4]: https://github.com/pantheon-tweaks/pantheon-tweaks +[5]: https://github.com/elementary-tweaks/elementary-tweaks +[6]: https://www.debugpoint.com/blog/wp-content/uploads/2021/07/tweak-in-settings.png +[7]: https://www.debugpoint.com/blog/wp-content/uploads/2021/07/elementary-tweaks-after-install-options.png diff --git a/published/202108/20210726 How to use cron on Linux.md b/published/202108/20210726 How to use cron on Linux.md new file mode 100644 index 0000000000..1f1d9ffedb --- /dev/null +++ b/published/202108/20210726 How to use cron on Linux.md @@ -0,0 +1,99 @@ +[#]: subject: (How to use cron on Linux) +[#]: via: (https://opensource.com/article/21/7/cron-linux) +[#]: author: (Seth Kenlon https://opensource.com/users/seth) +[#]: collector: (lujun9972) +[#]: translator: (perfiffer) +[#]: reviewer: (turbokernel) +[#]: publisher: (wxy) +[#]: url: (https://linux.cn/article-13644-1.html) + +如何在 Linux 上使用 cron 定时器 +====== + +> cron 定时器是一个可以按照计划自动运行命令的工具。 + +![](https://img.linux.net.cn/data/attachment/album/202108/03/132733qhmt6mavtbh66m5j.jpg) + +cron 定时器是一个可以按照计划自动运行命令的工具。定时器作业称为 cronjob,创建于 `crontab` 文件中。这是用户自动操作电脑的最简单也是最古老的方法。 + +### 创建一个 cronjob + +要创建一个 cronjob,你可以使用 `crontab` 命令,并添加 `-e` 选项: + +``` +$ crontab -e +``` + +这将使用默认的文本编辑器打开 `crontab`。如需指定文本编辑器,请使用 `EDITOR` [环境变量][1]: + +``` +$ EDITOR=nano crontab -e +``` + +### Cron 语法 + +如需调度一个 cronjob,你需要提供给计算机你想要执行的命令,然后提供一个 cron 表达式。cron 表达式在命令调度时运行: + + * 分钟(0 到 59) + * 小时(0 到 23, 0 代表午夜执行) + * 日期(1 到 31) + * 月份(1 到 12) + * 星期(0 到 6, 星期天是 0) + +星号 (`*`) 代表的是“每一个”。例如,下面的表达式在每月每日每小时的 0 分钟运行备份脚本: + +``` +/opt/backup.sh 0 * * * * +``` + +下面的表达式在周日的凌晨 3:30 运行备份脚本: + +``` +/opt/backup.sh 30 3 * * 0 +``` + +### 简写语法 + +现代的 cron 支持简化的宏,而不是 cron 表达式: + + * `@hourly` 在每天的每小时的 0 分运行 + * `@daily` 在每天的 0 时 0 分运行 + * `@weekly` 在周日的 0 时 0 分运行 + * `@monthly` 在每月的第一天的 0 时 0 分运行 + +例如,下面的 `crontab` 命令在每天的 0 时运行备份脚本: + +``` +/opt/backup.sh @daily +``` + +### 如何停止一个 cronjob + +一旦你开始了一个 cronjob,它就会永远按照计划运行。想要在启动后停止 cronjob,你必须编辑 `crontab`,删除触发该作业的命令行,然后保存文件。 + +``` +$ EDITOR=nano crontab -e +``` + +如需停止一个正在运行的作业,可以 [使用标准的 Linux 进程命令][3] 来停止一个正在运行的进程。 + +### 它是自动的 + +一旦你编写完 `crontab`,保存了文件并且退出了编辑器。你的 cronjob 就已经被调度了,剩下的工作都交给 cron 完成。 + +-------------------------------------------------------------------------------- + +via: https://opensource.com/article/21/7/cron-linux + +作者:[Seth Kenlon][a] +选题:[lujun9972][b] +译者:[perfiffer](https://github.com/perfiffer) +校对:[turbokernel](https://github.com/turbokernel) + +本文由 [LCTT](https://github.com/LCTT/TranslateProject) 原创编译,[Linux中国](https://linux.cn/) 荣誉推出 + +[a]: https://opensource.com/users/seth +[b]: https://github.com/lujun9972 +[1]: https://opensource.com/sites/default/files/styles/image-full-size/public/cron-splash.png?itok=AoBigzts (Cron expression) +[2]: https://opensource.com/article/19/8/what-are-environment-variables +[3]: https://opensource.com/article/18/5/how-kill-process-stop-program-linux diff --git a/published/202108/20210727 Check used disk space on Linux with du.md b/published/202108/20210727 Check used disk space on Linux with du.md new file mode 100644 index 0000000000..878fafc648 --- /dev/null +++ b/published/202108/20210727 Check used disk space on Linux with du.md @@ -0,0 +1,105 @@ +[#]: subject: (Check used disk space on Linux with du) +[#]: via: (https://opensource.com/article/21/7/check-disk-space-linux-du) +[#]: author: (Seth Kenlon https://opensource.com/users/seth) +[#]: collector: (lujun9972) +[#]: translator: (geekpi) +[#]: reviewer: (turbokernel) +[#]: publisher: (wxy) +[#]: url: (https://linux.cn/article-13656-1.html) + +使用 du 检查 Linux 上已用的磁盘空间 +====== + +> 用 Linux 的 du 命令了解你正在使用多少磁盘空间。 + +![](https://img.linux.net.cn/data/attachment/album/202108/06/200731j561cwxyxyekaic5.jpg) + +无论你有多少存储空间,它总有可能被填满。在大多数个人设备上,磁盘被照片、视频和音乐填满,但在服务器上,由于用户账户和日志文件数据,空间减少是很正常的。无论你是负责管理一个多用户系统,还是只负责自己的笔记本电脑,你都可以用 `du` 命令检查磁盘的使用情况。 + +默认情况下,`du` 列出了当前目录中使用的磁盘空间,以及每个子目录的大小。 + +``` +$ du +12 ./.backups +60 . +``` + +在这个例子中,当前目录总共占用了 60KB,其中 12KB 被子目录 `.backups` 占用。 + +如果你觉得这很混乱,并希望分别看到所有的大小,你可以使用 `--separate-dirs`(或简写 `-S`)选项: + +``` +$ du --separate-dirs +12 ./.backups +48 . +``` + +显示相同的信息(48KB 加 12KB 是 60KB),但每个目录被独立处理。 + +如需看到更多的细节,可以使用 `--all`(简写 `-a`)选项,它显示每个目录中以及每个文件: + +``` +$ du --separate-dirs --all +4 ./example.adoc +28 ./graphic.png +4 ./.backups/example.adoc~ +12 ./.backups +4 ./index.html +4 ./index.adoc +48 . +``` + +### 查看文件的修改时间 + +当查看文件以找出占用空间的内容时,查看文件最后一次被修改的时间是很有用的。一年内没有使用过的文件可以考虑归档,特别是当你的空间快用完时。 + +通过 `du` 查看文件的修改时间,使用 `--time` 选项: + +``` +$ du --separate-dirs --all --time +28 2021-07-21 11:12 ./graphic.png +4 2021-07-03 10:43 ./example.adoc +4 2021-07-13 13:03 ./index.html +4 2021-07-23 14:18 ./index.adoc +48 2021-07-23 14:19 . +``` + +### 为文件大小设置一个阈值 + +当为了磁盘空间而查看文件时,你可能只关心较大的文件。你可以通过 `--threshold`(简写 `-t`)选项为文件大小设置一个阈值。例如,只查看大于 1GB 的文件: + +``` +$ \du --separate-dirs --all --time --threshold=1G ~/Footage/ +1839008 2021-07-14 13:55 /home/tux/Footage/snowfall.mp4 +1577980 2020-04-11 13:10 /home/tux/Footage/waterfall.mp4 +8588936 2021-07-14 13:55 /home/tux/Footage/ +``` + +当文件较大时,它们可能难以阅读。使用 `--human-readable`(简写 `-h`)选项可以使文件大小更容易阅读: + +``` +$ du --separate-dirs --all --time --threshold=1G --human-readable ~/Footage/ +1.8G 2021-07-14 13:55 /home/tux/Footage/snowfall.mp4 +1.6G 2020-04-11 13:10 /home/tux/Footage/waterfall.mp4 +8.5G 2021-07-14 13:55 /home/tux/Footage/ +``` + +### 查看可用磁盘空间 + +如需获得一个驱动器上可用磁盘空间的摘要,请阅读我们关于 [df 命令][2]的文章。 + +-------------------------------------------------------------------------------- + +via: https://opensource.com/article/21/7/check-disk-space-linux-du + +作者:[Seth Kenlon][a] +选题:[lujun9972][b] +译者:[geekpi](https://github.com/geekpi) +校对:[turbokernel](https://github.com/turbokernel) + +本文由 [LCTT](https://github.com/LCTT/TranslateProject) 原创编译,[Linux中国](https://linux.cn/) 荣誉推出 + +[a]: https://opensource.com/users/seth +[b]: https://github.com/lujun9972 +[1]: https://opensource.com/sites/default/files/styles/image-full-size/public/du-splash.png?itok=nRLlI-5A (Check disk usage) +[2]: https://opensource.com/article/21/7/use-df-check-free-disk-space-linux diff --git a/published/202108/20210727 How to Change Lock and Login Screen Wallpaper in elementary OS.md b/published/202108/20210727 How to Change Lock and Login Screen Wallpaper in elementary OS.md new file mode 100644 index 0000000000..095675b20f --- /dev/null +++ b/published/202108/20210727 How to Change Lock and Login Screen Wallpaper in elementary OS.md @@ -0,0 +1,119 @@ +[#]: subject: (How to Change Lock and Login Screen Wallpaper in elementary OS) +[#]: via: (https://www.debugpoint.com/2021/07/change-lock-login-screen-background-elementary-os/) +[#]: author: (Arindam https://www.debugpoint.com/author/admin1/) +[#]: collector: (lujun9972) +[#]: translator: (geekpi) +[#]: reviewer: (wxy) +[#]: publisher: (wxy) +[#]: url: (https://linux.cn/article-13655-1.html) + +如何在 elementary OS 中改变锁定和登录屏幕的壁纸 +====== + +> 本教程解释了在 elementary OS 中改变锁定和登录屏幕背景的步骤。这将取代默认的灰色背景。 + +在 elementary OS 中改变锁屏或登录屏背景的灰色默认壁纸是有点困难的。典型的用图像文件的路径改变 `greeter` 的配置是行不通的。 + +不幸的是,这不是一个更简单的解决方案,因为灰色背景是一个图像文件,它的数据是硬编码在 `greeter` 中的,需要用新的图像重新编译才能使其发挥作用。 + +下面是方法: + +![Lock / Login screen background elementary OS \(Odin\)][1] + +### 改变 elementary OS 锁定和登录屏幕背景 + +在 elementary OS 中打开一个终端。 + +为 [greeter 包][2]安装 git 和以下依赖项: + +``` +sudo apt install git +``` + +``` +sudo apt install -y gnome-settings-daemon libaccountsservice-dev libgdk-pixbuf2.0-dev libgranite-dev libgtk-3-dev libhandy-1-dev liblightdm-gobject-1-dev libmutter-6-dev libwingpanel-dev libx11-dev meson valac +``` + +进入临时的 `/tmp` 目录,从 GitHub 克隆最新的 greeter 主分支: + +``` +cd /tmp +git clone https://github.com/elementary/greeter.git +``` + +克隆完成后,在文件管理器中打开路径 `/tmp/greeter/data`。 + +elementary OS 使用一个 100×100px 的 PNG 文件作为登录屏幕/锁屏的默认背景。该图像是平铺的,给人一种灰色背景的感觉。 + +用 `texture.png` 重命名你想要的墙纸图像,并在路径中覆盖以下文件: + +![gray background is created using this file][3] + +``` +/tmp/greeter/data/texture.png +``` + +在文本编辑器中打开文件 `/tmp/greeter/compositor/SystemBackground.vala`,并替换下面一行: + +![change the path of image][4] + +``` +resource:///io/elementary/desktop/gala/texture.png +``` + +为: + +``` +resource:///io/elementary/greeter/texture.png +``` + +保存该文件。 + + +再次打开终端,使用以下命令构建 `greeter`。 + +``` +cd /tmp/greeter +meson _build --prefix=/usr +sudo ninja install -C _build +``` + +![building greeter][5] + +如果你遇到任何构建错误,请在下面的评论中告诉我。你应该不会看到任何错误,因为我已经测试过了。 + +上面的命令完成后,你可以在测试模式下运行 `lightdm` 来测试登录屏: + +``` +lightdm --test-mode --debug +``` + +如果看起来不错,重新启动系统。而你应该在 elementary OS 的登录屏上看到你的墙纸。 + +这个指南应该可在 [elementary OS 6 Odin][7]、elementary OS 5 Juno 及以下版本中可用。 + +### 结束语 + +我希望本指南能帮助你在 elementary OS 中改变锁屏或登录屏的背景。老实说,在 2021 年改变登录屏的背景图像需要编译代码,这让我很吃惊。 + +如果你遇到错误,请在下面的评论栏里告诉我。 + +-------------------------------------------------------------------------------- + +via: https://www.debugpoint.com/2021/07/change-lock-login-screen-background-elementary-os/ + +作者:[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/blog/wp-content/uploads/2021/07/elementary-OS-Login-Screen-in-Odin-1024x768.jpg +[2]: https://github.com/elementary/greeter +[3]: https://www.debugpoint.com/blog/wp-content/uploads/2021/07/gray-background-is-created-using-this-file.jpg +[4]: https://www.debugpoint.com/blog/wp-content/uploads/2021/07/change-the-path-of-image-1024x450.jpg +[5]: https://www.debugpoint.com/blog/wp-content/uploads/2021/07/building-greeter.png +[7]: https://www.debugpoint.com/tag/elementary-os-6 diff --git a/published/202108/20210729 Use df to check free disk space on Linux.md b/published/202108/20210729 Use df to check free disk space on Linux.md new file mode 100644 index 0000000000..c6e86fc125 --- /dev/null +++ b/published/202108/20210729 Use df to check free disk space on Linux.md @@ -0,0 +1,84 @@ +[#]: subject: (Use df to check free disk space on Linux) +[#]: via: (https://opensource.com/article/21/7/check-disk-space-linux-df) +[#]: author: (Seth Kenlon https://opensource.com/users/seth) +[#]: collector: (lujun9972) +[#]: translator: (piaoshi) +[#]: reviewer: (wxy) +[#]: publisher: (wxy) +[#]: url: (https://linux.cn/article-13646-1.html) + +使用 df 命令查看 Linux 上的可用磁盘空间 +====== + +> 利用 df 命令查看 Linux 磁盘还剩多少空间。 + +![](https://img.linux.net.cn/data/attachment/album/202108/04/110742netskjccb5vzvujk.jpg) + +磁盘空间已经不像计算机早期那样珍贵,但无论你有多少磁盘空间,总有耗尽的可能。计算机需要一些磁盘空间才能启动运行,所以为了确保你没有在无意间用尽了所有的硬盘空间,偶尔检查一下是非常必要的。在 Linux 终端,你可以用 `df` 命令来做这件事。 + +`df` 命令可以显示文件系统中可用的磁盘空间。 + +要想使输出结果易于阅读,你可以加上 `--human-readable`(或其简写 `-h`)选项: + +``` +$ df --human-readable +Filesystem      Size  Used Avail Use% Mounted on +/dev/sda1       1.0T  525G  500G  52% / +``` + +在这个例子中,计算机的磁盘已经用了 52%,还有 500 GB 可用空间。 + +由于 Linux 从整体上看待所有挂载设备的文件系统,`df` 命令会展示出连接到计算机上的每个存储设备的详细信息。如果你有很多磁盘,那么输出结果将会反映出来: + +``` +$ df --human-readable +Filesystem      Size  Used Avail Use% Mounted on +/dev/root       110G   45G   61G  43% / +devtmpfs         12G     0   12G   0% /dev +tmpfs            12G  848K   12G   1% /run +/dev/sda1       1.6T  1.3T  191G  87% /home +/dev/sdb1       917G  184G  687G  22% /penguin +/dev/sdc1        57G   50G  4.5G  92% /sneaker +/dev/sdd1       3.7T  2.4T  1.3T  65% /tux +``` + +在这个例子中,计算机的 `/home` 目录已经用了 87%,剩下 191 GB 的可用空间。 + +### 查看总的可用磁盘空间 + +如果你的文件系统确实很复杂,而你希望看到所有磁盘的总空间,可以使用 `--total` 选项: + +``` +$ df --human-readable --total +Filesystem      Size  Used Avail Use% Mounted on +/dev/root       110G   45G   61G  43% / +devtmpfs         12G     0   12G   0% /dev +tmpfs            12G  848K   12G   1% /run +/dev/sda1       1.6T  1.3T  191G  87% /home +/dev/sdb1       917G  184G  687G  22% /penguin +/dev/sdc1        57G   50G  4.5G  92% /sneaker +/dev/sdd1       3.7T  2.4T  1.3T  65% /tux +total           6.6T  4.0T  2.5T  62% - +``` + +输出的最后一行展示了文件系统的总空间、已用总空间、可用总空间。 + +### 查看磁盘空间使用情况 + +如果你想大概了解哪些文件占用了磁盘空间,请阅读我们关于 [du 命令][2] 的文章。 + +-------------------------------------------------------------------------------- + +via: https://opensource.com/article/21/7/check-disk-space-linux-df + +作者:[Seth Kenlon][a] +选题:[lujun9972][b] +译者:[piaoshi](https://github.com/piaoshi) +校对:[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/df-splash.png?itok=AGXQm737 (Free disk space) +[2]: https://opensource.com/article/21/7/check-used-disk-space-linux-du diff --git a/published/202108/20210730 4 cool new projects to try in Copr from July 2021.md b/published/202108/20210730 4 cool new projects to try in Copr from July 2021.md new file mode 100644 index 0000000000..914cf2f52c --- /dev/null +++ b/published/202108/20210730 4 cool new projects to try in Copr from July 2021.md @@ -0,0 +1,155 @@ +[#]: subject: (4 cool new projects to try in Copr from July 2021) +[#]: via: (https://fedoramagazine.org/4-cool-new-projects-to-try-in-copr-for-july-2021/) +[#]: author: (Jakub Kadlčík https://fedoramagazine.org/author/frostyx/) +[#]: collector: (lujun9972) +[#]: translator: (geekpi) +[#]: reviewer: (wxy) +[#]: publisher: (wxy) +[#]: url: (https://linux.cn/article-13673-1.html) + +COPR 仓库中 4 个很酷的新项目(2021.07) +====== + +![][1] + +COPR 是个人软件仓库 [集合][2],它不在 Fedora 中。这是因为某些软件不符合轻松打包的标准;或者它可能不符合其他 Fedora 标准,尽管它是自由而开源的。COPR 可以在 Fedora 套件之外提供这些项目。COPR 中的软件不受 Fedora 基础设施的支持,或者是由项目自己背书的。但是,这是一种尝试新的或实验性的软件的一种巧妙的方式。 + +本文介绍了 COPR 中一些有趣的新项目。如果你第一次使用 COPR,请参阅 [COPR 用户文档][3]。 + +### Wike + +[Wike][5] 是一个用于 GNOME 桌面的维基百科阅读器,在 GNOME Shell 中集成了搜索功能。它提供了对 [在线百科全书][6] 的无干扰访问。它的界面很简约,但它支持在多种语言之间切换文章、书签、文章目录、黑暗模式等。 + +![][7] + +#### 安装说明 + +该 [仓库][9] 目前为 Fedora 33、34 和 Fedora Rawhide 提供了 Wike。要安装它,请使用这些命令: + +``` +sudo dnf copr enable xfgusta/wike +sudo dnf install wike +``` + +### DroidCam + +我们正生活在一个混乱的时代,被隔离在家中,我们与朋友和同事的大部分互动都发生在一些视频会议平台上。如果你已经有一部手机,就不要把钱浪费在价格过高的网络摄像头上。[DroidCam][11] 让你将手机与电脑配对,并将其作为专用网络摄像头使用。通过 USB 线或通过 WiFi 进行连接。DroidCam 提供对摄像头的远程控制,并允许缩放、使用自动对焦、切换 LED 灯和其他便利功能。 + +![][12] + +#### 安装说明 + +该 [仓库][14] 目前为 Fedora 33 和 34 提供了 DroidCam。在安装之前,请更新你的系统并重新启动,或者确保你运行的是最新的内核版本,并安装了适当版本的 `kernel-headers`。 + +``` +sudo dnf update +sudo reboot +``` + +Droidcam 依赖 `v4l2loopback`,必须从 [RPM Fusion 自由软件仓库][15] 手动安装。 + +``` +sudo dnf install https://download1.rpmfusion.org/free/fedora/rpmfusion-free-release-$(rpm -E %fedora).noarch.rpm +sudo dnf install v4l2loopback +sudo modprobe v4l2loopback +``` + +现在安装 `droidcam` 软件包: + +``` +sudo dnf copr enable meeuw/droidcam +sudo dnf install droidcam +``` + +### Nyxt + +[Nyxt][17] 是一个面向键盘、可无限扩展的 Web 浏览器,专为高级用户设计。它在很大程度上受到 Emacs 的启发,因此用 Common Lisp 实现和配置,提供熟悉的按键绑定([Emacs][18]、[vi][19]、[CUA][20])。 + +其他不能错过的杀手锏是一个内置的 REPL、[树形历史][21]、[缓冲区代替标签][22],还有[更多][17]。 + +Nyxt 与网络引擎无关,所以不用担心页面会以意外的方式呈现。 + +![][23] + +#### 安装说明 + +该 [仓库][25] 目前为 Fedora 33、34 和 Fedora Rawhide 提供了 Nyxt。要安装它,请使用这些命令: + +``` +sudo dnf copr enable teervo/nyxt +sudo dnf install nyxt +``` + +### Bottom + +[Bottom][27] 是一个具有可定制界面和多种功能的系统监控器,它从 [gtop][28]、[gotop][29] 和 [htop][30] 获得了灵感。因此,它支持 [进程][31] 监控、[CPU][32]、[RAM][33] 和 [网络][34] 使用监控。除了这些,它还提供了更多奇特的小部件,如 [磁盘容量][35] 使用情况,[温度传感器][36],和 [电池][37] 使用情况。 + +由于小部件的可自定义布局以及 [可以只关注一个小部件并最大化它][38],Bottom 可以非常有效地利用屏幕空间。 + +![][39] + +#### 安装说明 + +该 [仓库][41] 为 Fedora 33、34 和 Fedora Rawhide 提供了 Bottom。它也可用于 EPEL 7 和 8。要安装它,请使用这些命令: + +``` +sudo dnf copr enable opuk/bottom +sudo dnf install bottom +``` + +使用 `btm` 命令来运行该程序。 + +-------------------------------------------------------------------------------- + +via: https://fedoramagazine.org/4-cool-new-projects-to-try-in-copr-for-july-2021/ + +作者:[Jakub Kadlčík][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/frostyx/ +[b]: https://github.com/lujun9972 +[1]: https://fedoramagazine.org/wp-content/uploads/2017/08/4-copr-945x400.jpg +[2]: https://copr.fedorainfracloud.org/ +[3]: https://docs.pagure.org/copr.copr/user_documentation.html +[4]: https://github.com/FrostyX/fedora-magazine/blob/main/2021-july.md#wike +[5]: https://github.com/hugolabe/Wike +[6]: https://en.wikipedia.org/wiki/Main_Page +[7]: https://fedoramagazine.org/wp-content/uploads/2021/07/wike.png +[8]: https://github.com/FrostyX/fedora-magazine/blob/main/2021-july.md#installation-instructions +[9]: https://copr.fedorainfracloud.org/coprs/xfgusta/wike/ +[10]: https://github.com/FrostyX/fedora-magazine/blob/main/2021-july.md#droidcam +[11]: https://www.dev47apps.com/ +[12]: https://fedoramagazine.org/wp-content/uploads/2021/07/droidcam.png +[13]: https://github.com/FrostyX/fedora-magazine/blob/main/2021-july.md#installation-instructions-1 +[14]: https://copr.fedorainfracloud.org/coprs/meeuw/droidcam +[15]: https://docs.fedoraproject.org/en-US/quick-docs/setup_rpmfusion/#proc_enabling-the-rpmfusion-repositories-using-command-line-utilities_enabling-the-rpmfusion-repositories +[16]: https://github.com/FrostyX/fedora-magazine/blob/main/2021-july.md#nyxt +[17]: https://nyxt.atlas.engineer/ +[18]: https://en.wikipedia.org/wiki/Emacs +[19]: https://en.wikipedia.org/wiki/Vim_(text_editor) +[20]: https://en.wikipedia.org/wiki/IBM_Common_User_Access +[21]: https://nyxt.atlas.engineer/#tree +[22]: https://nyxt.atlas.engineer/#fuzzy +[23]: https://fedoramagazine.org/wp-content/uploads/2021/07/nyxt.png +[24]: https://github.com/FrostyX/fedora-magazine/blob/main/2021-july.md#installation-instructions-2 +[25]: https://copr.fedorainfracloud.org/coprs/teervo/nyxt/ +[26]: https://github.com/FrostyX/fedora-magazine/blob/main/2021-july.md#bottom +[27]: https://github.com/ClementTsang/bottom +[28]: https://github.com/aksakalli/gtop +[29]: https://github.com/xxxserxxx/gotop +[30]: https://github.com/htop-dev/htop/ +[31]: https://clementtsang.github.io/bottom/nightly/usage/widgets/process/ +[32]: https://clementtsang.github.io/bottom/nightly/usage/widgets/cpu/ +[33]: https://clementtsang.github.io/bottom/nightly/usage/widgets/memory/ +[34]: https://clementtsang.github.io/bottom/nightly/usage/widgets/network/ +[35]: https://clementtsang.github.io/bottom/nightly/usage/widgets/disk/ +[36]: https://clementtsang.github.io/bottom/nightly/usage/widgets/temperature/ +[37]: https://clementtsang.github.io/bottom/nightly/usage/widgets/battery/ +[38]: https://clementtsang.github.io/bottom/nightly/usage/general-usage/#expansion +[39]: https://fedoramagazine.org/wp-content/uploads/2021/07/bottom.png +[40]: https://github.com/FrostyX/fedora-magazine/blob/main/2021-july.md#installation-instructions-3 +[41]: https://copr.fedorainfracloud.org/coprs/opuk/bottom/ diff --git a/published/202108/20210730 Brave vs. Firefox- Your Ultimate Browser Choice for Private Web Experience.md b/published/202108/20210730 Brave vs. Firefox- Your Ultimate Browser Choice for Private Web Experience.md new file mode 100644 index 0000000000..78021917e5 --- /dev/null +++ b/published/202108/20210730 Brave vs. Firefox- Your Ultimate Browser Choice for Private Web Experience.md @@ -0,0 +1,235 @@ +[#]: subject: (Brave vs. Firefox: Your Ultimate Browser Choice for Private Web Experience) +[#]: via: (https://itsfoss.com/brave-vs-firefox/) +[#]: author: (Ankush Das https://itsfoss.com/author/ankush/) +[#]: collector: (lujun9972) +[#]: translator: (wxy) +[#]: reviewer: (wxy) +[#]: publisher: (wxy) +[#]: url: (https://linux.cn/article-13736-1.html) + +Brave vs. Firefox:你的私人网络体验的终极浏览器选择 +====== + +![](https://img.linux.net.cn/data/attachment/album/202108/30/223133tqzkg4pjpwwb8u4g.jpg) + +Web 浏览器经过多年的发展,从下载文件到访问成熟的 Web 应用程序,已经有了长足的发展。 + +对于很多用户来说,Web 浏览器是他们如今完成工作的唯一需要。 + +因此,选择合适的浏览器就成为了一项重要的任务,它可以帮助改善你多年来的工作流程。 + +### Brave vs. Firefox + +Brave 和 Mozilla Firefox 是两个最受到关注隐私的用户和开源爱好者欢迎的 Web 浏览器。 + +考虑到两者都非常注重隐私和安全,让我们看看它们到底能提供什么,以帮助你决定应该选择哪一个。 + +以下是我所使用的比较指标: + +### 用户界面 + +用户界面是使用浏览器时的工作流程和体验的最大区别。 + +当然,你会有你的个人偏好,但它看起来越容易使用、越轻快、越干净,就越好。 + +![Brave 浏览器][12] + +首先,Brave 与 Chrome 和微软 Edge 有着相似的外观和感受。它提供了一种简洁的体验,具有精简的 UI 元素,所有的基本选项都可以通过浏览器菜单访问。 + +它也提供了一个暗色主题。恰到好处的动画使得互动成为一种愉快的体验。 + +要定制它,你可以选择使用 Chrome Web 商店中的主题。 + +说到 Mozilla Firefox,多年来它经历了几次重大的重新设计,其最新的用户界面试图提供与 Chrome 更接近的体验。 + +![Firefox 浏览器][13] + +Firefox 浏览器的设计看起来令人印象深刻,并提供了干净利落的用户体验。如果需要的话,你还可以选择一个暗色主题,此外还有其它几个主题可供下载使用。 + +这两个 Web 浏览器都能提供良好的用户体验。 + +如果你想要一个熟悉的体验,但又具有一丝独特之处,Mozilla Firefox 是一个不错的选择。 + +但是,如果你想获得更快捷的体验、更好的动画感受,Brave 更有优势。 + +### 性能 + +实际上,我发现 Brave 加载网页的速度更快,整体的用户体验感觉很轻快。 + +Firefox 浏览器倒不是非常慢,但它绝对感觉比 Brave 慢。 + +为了给你一些参考,我还利用 [Basemark][14] 运行了一个基准测试,看看事实上是否真的如此。 + +你可以使用其他的浏览器基准测试工具来测试一下,但我用 Basemark 进行了各种测试,所以我们在这篇文章中会用它。 + +![Firefox 基准得分][15] + +![Brave 基准得分][16] + +Firefox 浏览器成功获得了 **630** 的得分,而 Brave 以大约 **792** 的得分取得了更好的成绩。 + +请注意,这些基准测试是在没有安装任何浏览器扩展程序的情况下,以默认的浏览器设置进行的。 + +当然,你的分数可能会有所不同,这取决于你在后台进行的工作和你系统的硬件配置。 + +这是我在 **i5-7400、16GB 内存和 GTX 1050ti GPU** 配置的桌面电脑上得到的结果。 + +一般来说,与大多数流行的浏览器相比,Brave 浏览器是一个快速的浏览器。 + +这两者都占用了相当大的系统资源,而且在一定程度上随着标签数量、访问的网页类型和使用的拦截扩展的种类而变化。 + +例如,Brave 在默认情况下会主动阻止广告,但 Firefox 在默认情况下不会阻止显示广告。而且,这也影响了系统资源的使用。 + +### 浏览器引擎 + +Firefox 浏览器在自己的 Gecko 引擎基础上,使用来自 [servo 研究项目][17] 的组件来进行改进。 + +目前,它基本上是一个改进的 Gecko 引擎,其项目名称是随着 Firefox Quantum 的发布而推出的 “Quantum”。 + +另一方面,Brave 使用 Chromium 的引擎。 + +虽然两者都有足够的能力处理现代 Web 体验,但基于 Chromium 的引擎更受欢迎,Web 开发人员通常会在基于 Chrome 的浏览器上定制他们的网站以获得最佳体验。 + +另外,有些服务恰好只支持基于 Chrome 的浏览器。 + +### 广告 & 追踪器阻止功能 + +![][18] + +正如我之前提到的,Brave 在阻止跟踪器和广告方面非常积极。默认情况下,它已经启用了屏蔽功能。 + +Firefox 浏览器也默认启用了增强的隐私保护功能,但并不阻止显示广告。 + +如果你想摆脱广告,你得选择火狐浏览器的 “严格隐私保护模式”。 + +也就是说,火狐浏览器执行了一些独特的跟踪保护技术,包括“全面 Cookie 保护”,可以为每个网站隔离 Cookie 并防止跨站 Cookie 跟踪。 + +![][19] + +这是在 [Firefox 86][20] 中引入的技术,要使用它,你需要启用 “严格隐私保护模式”。 + +总的来说,Brave 可能看起来是一个更好的选择,而 Mozilla Firefox 提供了更好的隐私保护功能。 + +### 容器 + +当你访问 Facebook 时,Firefox 还提供了一种借助容器来隔离网站活动的方法。换句话说,它可以防止 Facebook 跟踪你的站外活动。 + +你还可以使用容器来组织你的标签,并在需要时分离会话。 + +Brave 没有提供任何类似的功能,但它本身可以阻止跨站追踪器和 cookie。 + +### 奖励 + +![][21] + +与 Firefox 不同,Brave 通过屏蔽网络上的其他广告来提供自己的广告网络。 + +当你选择显示 Brave 的隐私友好型广告时,你会得到可以放到加密货币钱包里的通证奖励,而你可以用这些通证来回馈你喜欢的网站。 + +虽然这是摆脱主流广告的一个很好的商业策略,但对于不想要任何形式的广告的用户来说,这可能没有用。 + +因此,Brave 以奖励的形式提供了一个替代方案,即使你屏蔽了广告,也可以帮助网站发展。如果这是你欣赏的东西,Brave 将是你的一个好选择。 + +### 跨平台可用性 + +你会发现 Brave 和 Firefox 都有 Linux、Windows 和 macOS 版本,也有用于 iOS 和 Android 的移动应用程序。 + +对于 Linux 用户来说,Firefox 浏览器捆绑在大多数的 Linux 发行版中。而且,你也可以在软件中心里找到它。除此之外,还有一个 [Flatpak][22] 包可用。 + +Brave 不能通过默认的软件库和软件中心获得。因此,你需要按照官方的说明来添加私有仓库,然后 [把 Brave 安装在你的 Linux 发行版中][23]。 + +### 同步 + +通过 Mozilla Firefox,你可以创建一个 Firefox 账户来跨平台同步你的所有数据。 + +![][24] + +Brave 也可以让你跨平台同步,但你需要能访问其中一个设备才行。 + +![][25] + +因此,Firefox 的同步更方便。 + +另外,你可以通过 Firefox 的账户访问它的“虚拟专用网络”、数据泄露监控器、电子邮件中继,以及密码管理器。 + +### 服务集成 + +从一开始 Firefox 就提供了更多的服务集成,包括 Pocket、“虚拟私有网络”、密码管理器,还有一些新产品,如 Firefox 中继。 + +如果你想通过你的浏览器访问这些服务,Firefox 将是你的方便选择。 + +虽然 Brave 确实提供了加密货币钱包,但它并不适合所有人。 + +![][26] + +同样,如果你喜欢使用 [Brave Search][27],在使用 Brave 浏览器时,由于用户体验的原因,你可能体验会更顺滑。 + +### 可定制性 & 安全性 + +Firefox 浏览器在可定制性方面大放异彩。你可以通过众多选项来调整体验,也可以控制你的浏览器的隐私/安全。 + +自定义的能力使你可以让 Firefox 比 Brave 浏览器更安全。 + +而加固 Firefox 浏览器是一个我们将讨论的单独话题。略举一例,[Tor 浏览器][28] 只是一个定制的 Firefox 浏览器。 + +然而,这并不意味着 Brave 的安全性更低。总的来说,它是一个安全的浏览器,但你确实可以通过 Firefox 浏览器获得更多的选择。 + +### 扩展支持 + +毫无疑问,Chrome Web 商店提供了更多的扩展。 + +因此,如果你是一个使用大量扩展(或不断尝试新扩展)的人,Brave 明显比 Firefox 更有优势。 + +可能 Firefox 的扩展清单不是最大的,但它确实支持大多数的扩展。对于常见的使用情况,你很少能找到一个 Firefox 中没有的扩展。 + +### 你应该选择那个? + +如果你希望尽量兼容现代的 Web 体验,并希望有更多的扩展,Brave 浏览器似乎更合适。 + +另一方面,Firefox 浏览器是日常浏览的绝佳选择,它具有业界首创的隐私功能,并为不懂技术的用户提供了方便的同步选项。 + +在选择它们中的任何一个时会有一些取舍。因此,你需要优先考虑你最想要的东西。 + +请在下面的评论中告诉我你的最终选择! + +-------------------------------------------------------------------------------- + +via: https://itsfoss.com/brave-vs-firefox/ + +作者:[Ankush Das][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://itsfoss.com/author/ankush/ +[b]: https://github.com/lujun9972 +[1]: tmp.5yJseRG2rb#ui +[2]: tmp.5yJseRG2rb#perf +[3]: tmp.5yJseRG2rb#engine +[4]: tmp.5yJseRG2rb#ad +[5]: tmp.5yJseRG2rb#container +[6]: tmp.5yJseRG2rb#reward +[7]: tmp.5yJseRG2rb#cp +[8]: tmp.5yJseRG2rb#sync +[9]: tmp.5yJseRG2rb#service +[10]: tmp.5yJseRG2rb#customise +[11]: tmp.5yJseRG2rb#extensions +[12]: https://i2.wp.com/itsfoss.com/wp-content/uploads/2021/07/brave-ui-new.jpg?resize=800%2C450&ssl=1 +[13]: https://i0.wp.com/itsfoss.com/wp-content/uploads/2021/07/firefox-ui.jpg?resize=800%2C450&ssl=1 +[14]: https://web.basemark.com +[15]: https://i0.wp.com/itsfoss.com/wp-content/uploads/2021/07/firefox-basemark.png?resize=800%2C598&ssl=1 +[16]: https://i1.wp.com/itsfoss.com/wp-content/uploads/2021/07/basemark-brave.png?resize=800%2C560&ssl=1 +[17]: https://servo.org +[18]: https://i2.wp.com/itsfoss.com/wp-content/uploads/2021/07/brave-blocker.png?resize=800%2C556&ssl=1 +[19]: https://i2.wp.com/itsfoss.com/wp-content/uploads/2021/07/firefox-blocker.png?resize=800%2C564&ssl=1 +[20]: https://news.itsfoss.com/firefox-86-release/ +[21]: https://i1.wp.com/itsfoss.com/wp-content/uploads/2021/07/brave-rewards.png?resize=800%2C560&ssl=1 +[22]: https://itsfoss.com/what-is-flatpak/ +[23]: https://itsfoss.com/brave-web-browser/ +[24]: https://i0.wp.com/itsfoss.com/wp-content/uploads/2021/07/firefox-sync.png?resize=800%2C651&ssl=1 +[25]: https://i2.wp.com/itsfoss.com/wp-content/uploads/2021/07/brave-sync.png?resize=800%2C383&ssl=1 +[26]: https://i0.wp.com/itsfoss.com/wp-content/uploads/2021/07/brave-crypto-wallet.png?resize=800%2C531&ssl=1 +[27]: https://itsfoss.com/brave-search-features/ +[28]: https://itsfoss.com/install-tar-browser-linux/ diff --git a/published/202108/20210801 Use the Linux terminal to see what files are on your computer.md b/published/202108/20210801 Use the Linux terminal to see what files are on your computer.md new file mode 100644 index 0000000000..a9dbcf3625 --- /dev/null +++ b/published/202108/20210801 Use the Linux terminal to see what files are on your computer.md @@ -0,0 +1,78 @@ +[#]: subject: (Use the Linux terminal to see what files are on your computer) +[#]: via: (https://opensource.com/article/21/8/linux-list-files) +[#]: author: (Seth Kenlon https://opensource.com/users/seth) +[#]: collector: (lujun9972) +[#]: translator: (piaoshi) +[#]: reviewer: (wxy) +[#]: publisher: (wxy) +[#]: url: (https://linux.cn/article-13669-1.html) + +使用 Linux 终端查看你的电脑上有哪些文件 +====== + +> 通过这个 Linux 教程学习如何使用 ls 命令在终端中列出文件。 + +![](https://img.linux.net.cn/data/attachment/album/202108/11/142450etebpqtp7bl4kupt.jpg) + +要在有图形界面的计算机上列出文件,你通常可以打开一个文件管理器(Linux 上的 “文件”,MacOS 上的 “访达”,Windows 上的 “文件资源管理器”)来查看文件。 + +要在终端中列出文件,你可以使用 `ls` 命令来列出当前目录中的所有文件。而 `pwd` 命令可以告诉你当前所在的目录: + +``` +$ pwd +/home/tux +$ ls +example.txt +Documents +Downloads +Music +Pictures +Templates +Videos +``` + +你可以通过 `--all`(简写为 `-a`) 选项看到隐藏文件: + +``` +$ pwd +/home/tux +$ ls --all +.               Downloads +..              .local +.bashrc         Music +.config         Pictures +example.txt     Templates +Documents       Videos +``` + +如你所见,列出的前两项是点。单个点(`.`)实际上是一个元位置,代表 _你当前所在的文件夹_ 。两个点(`..`)表示你可以从当前位置返回的上级目录。也就是说,当前目录在另一个文件夹中。当你在计算机目录间移动时,你就可以利用这些元位置为自己创建快捷方式,或者增加你的路径的独特性。 + +### 文件和文件夹以及如何区分它们 + +你可能会注意到,文件和文件夹是很难区分的。一些 Linux 发行版有一些漂亮的颜色设置,比如所有的文件夹都是蓝色的,文件是白色的,二进制文件是粉色或绿色的,等等。如果你没有看到这些颜色,你可以试试 `ls --color`。如果你有色盲症或者使用的不是彩色显示器,你可以使用 `--classify` 选项替代: + +``` +$ pwd +/home/tux/Downloads +$ ls --classify +android-info.txt +cheat/ +test-script.sh* +``` + +你会发现,文件夹末尾加了一个斜杠(`/`),以表示它们是文件系统中的某一级目录。而二进制文件,如压缩文件和可执行程序,用星号(`*`)标记。 + +-------------------------------------------------------------------------------- + +via: https://opensource.com/article/21/8/linux-list-files + +作者:[Seth Kenlon][a] +选题:[lujun9972][b] +译者:[piaoshi](https://github.com/piaoshi) +校对:[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/ch01.svg__0.png?itok=98wPcbAc (List files on your computer) diff --git a/published/202108/20210802 Use OpenCV on Fedora Linux - part 1.md b/published/202108/20210802 Use OpenCV on Fedora Linux - part 1.md new file mode 100644 index 0000000000..b1bb746623 --- /dev/null +++ b/published/202108/20210802 Use OpenCV on Fedora Linux - part 1.md @@ -0,0 +1,247 @@ +[#]: subject: (Use OpenCV on Fedora Linux ‒ part 1) +[#]: via: (https://fedoramagazine.org/use-opencv-on-fedora-linux-part-1/) +[#]: author: (Onuralp SEZER https://fedoramagazine.org/author/thunderbirdtr/) +[#]: collector: (lujun9972) +[#]: translator: (geekpi) +[#]: reviewer: (wxy) +[#]: publisher: (wxy) +[#]: url: (https://linux.cn/article-13698-1.html) + +在 Fedora Linux 上使用 OpenCV(一) +====== + +![][1] + +*封面图片选自[文森特·梵高][2]的《星空》,公共领域,通过维基共享资源发布* + +技术世界每天都在变化,对计算机视觉、人工智能和机器学习的需求也在增加。让计算机和手机能够看到周围环境的技术被称为 [计算机视觉][3]。这个重新创造人眼的工作始于 50 年代。从那时起,计算机视觉技术有了长足的发展。计算机视觉已经通过不同的应用进入了我们的手机。这篇文章将介绍 Fedora Linux 上的 [OpenCV][4]。 + +### 什么是 OpenCV? + +> OpenCV(开源计算机视觉库Open Source Computer Vision Library)是一个开源的计算机视觉和机器学习软件库。OpenCV 的建立是为了给计算机视觉应用提供一个通用的基础设施,并加速机器感知在商业产品中的应用。它有超过 2500 种优化后的算法,其中包括一套全面的经典和最先进的计算机视觉和机器学习算法。这些算法可用于检测和识别人脸、识别物体、对视频中的人类行为进行分类,并建立标记,将其与增强现实叠加等等。 +> +> [opencv.org – about][5] + +### 在 Fedora Linux 上安装 OpenCV + +要开始使用 OpenCV,请从 Fedora Linux 仓库中安装它: + +``` +$ sudo dnf install opencv opencv-contrib opencv-doc python3-opencv python3-matplotlib python3-numpy +``` + +**注意:** 在 Fedora Silverblue 或 CoreOS 上,Python 3.9 是核心提交的一部分。用以下方法安装 OpenCV 和所需工具: + +``` +rpm-ostree install opencv opencv-doc python3-opencv python3-matplotlib python3-numpy +``` + +接下来,在终端输入以下命令,以验证 OpenCV 是否已经安装: + +``` +$ python +Python 3.9.6 (default, Jul 16 2021, 00:00:00) +[GCC 11.1.1 20210531 (Red Hat 11.1.1-3)] on linux +Type "help", "copyright", "credits" or "license" for more information. +>>> import cv2 as cv +>>> print( cv.__version__ ) +4.5.2 +>>> exit() +``` + +当你输入 `print` 命令时,应该显示当前的 OpenCV 版本,如上图所示。这表明 OpenCV 和 Python-OpenCV 库已经成功安装。 + +此外,如果你想用 Jupyter Notebook 做笔记和写代码,并了解更多关于数据科学工具的信息,请查看早期的 Fedora Magazine 文章:[Fedora 中的 Jupyter 和数据科学][6]。 + +### 开始使用 OpenCV + +安装完成后,使用 Python 和 OpenCV 库加载一个样本图像(按 `S` 键以 png 格式保存图像的副本并完成程序): + +``` +$ cp /usr/share/opencv4/samples/data/starry_night.jpg . +$ python starry_night.py +``` + +`starry_night.py` 的内容: + +``` +import cv2 as cv +import sys +img = cv.imread(cv.samples.findFile("starry_night.jpg")) +if img is None: + sys.exit("Could not read the image.") +cv.imshow("Display window", img) +k = cv.waitKey(0) +if k == ord("s"): + cv.imwrite("starry_night.png", img) +``` + +![][7] + +通过在 `cv.imread` 函数中添加参数 `0`,对图像进行灰度处理,如下所示。 + +``` +img = cv.imread(cv.samples.findFile("starry_night.jpg"),0) +``` + +![][8] + +这些是一些可以用于 `cv.imread` 函数的第二个参数的替代值: + + * `cv2.IMREAD_GRAYSCALE` 或 `0`:以灰度模式加载图像。 + * `cv2.IMREAD_COLOR** 或 `1`:以彩色模式载入图像。图像中的任何透明度将被移除。这是默认的。 + * `cv2.IMREAD_UNCHANGED** 或 `-1`:载入未经修改的图像。包括 alpha 通道。 + +#### 使用 OpenCV 显示图像属性 + +图像属性包括行、列和通道的数量、图像数据的类型、像素的数量等等。假设你想访问图像的形状和它的数据类型。你可以这样做: + +``` +import cv2 as cv + +img = cv.imread(cv.samples.findFile("starry_night.jpg")) +print("Image size is", img.shape) +print("Data type of image is", img.dtype) + +Image size is (600, 752, 3) +Data type of image is uint8 + +print(f"Image 2D numpy array \n {img}") + +Image 2D numpy array + [[[0 0 0] + [0 0 0] + [0 0 0] + ... + [0 0 0] + [0 0 0] + [0 0 0]] + + [[0 0 0] + [0 0 0] + [0 0 0] + ... +``` + + * `img.shape`:返回一个行数、列数和通道数的元组(如果是彩色图像)。 + * `img.dtype`:返回图像的数据类型。 + +接下来用 Matplotlib 显示图像: + +``` +import cv2 as cv +import matplotlib.pyplot as plt +img = cv.imread(cv.samples.findFile("starry_night.jpg"),0) +plt.imshow(img) +plt.show() +``` + +![][9] + +#### 发生了什么? + +该图像是作为灰度图像读入的,但是当使用 Matplotlib 的 `imshow` 函数时,它不一定会以灰度显示。这是因为 `imshow` 函数默认使用不同的颜色映射。要指定使用灰度颜色映射,请将 `imshow` 函数的第二个参数设置为 `cmap='gray'`,如下所示: + +``` +plt.imshow(img,cmap='gray') +``` + +![][10] + +这个问题在以彩色模式打开图片时也会发生,因为 Matplotlib 期望图片为 RGB(红、绿、蓝)格式,而 OpenCV 则以 BGR(蓝、绿、红)格式存储图片。为了正确显示,你需要将 BGR 图像的通道反转。 + +``` +import cv2 as cv +import matplotlib.pyplot as plt +img = cv.imread(cv.samples.findFile("starry_night.jpg"),cv.IMREAD_COLOR) +fig, (ax1, ax2) = plt.subplots(1,2) +ax1.imshow(img) +ax1.set_title('BGR Colormap') +ax2.imshow(img[:,:,::-1]) +ax2.set_title('Reversed BGR Colormap(RGB)') +plt.show() +``` + +![][11] + +#### 分割和合并颜色通道 + +``` +import cv2 as cv +import matplotlib.pyplot as plt + +img = cv.imread(cv.samples.findFile("starry_night.jpg"),cv.IMREAD_COLOR) +b,g,r = cv.split(img) + +fig,ax = plt.subplots(2,2) + +ax[0,0].imshow(r,cmap='gray') +ax[0,0].set_title("Red Channel"); +ax[0,1].imshow(g,cmap='gray') +ax[0,1].set_title("Green Channel"); +ax[1,0].imshow(b,cmap='gray') +ax[1,0].set_title("Blue Channel"); + +# Merge the individual channels into a BGR image +imgMerged = cv.merge((b,g,r)) +# Show the merged output +ax[1,1].imshow(imgMerged[:,:,::-1]) +ax[1,1].set_title("Merged Output"); +plt.show() +``` + +![][12] + + * `cv2.split`:将一个多通道数组分割成几个单通道数组。 + * `cv2.merge`:将几个数组合并成一个多通道数组。所有的输入矩阵必须具有相同的大小。 + +**注意:** 白色较多的图像具有较高的颜色密度。相反,黑色较多的图像,其颜色密度较低。在上面的例子中,红色的密度是最低的。 + +#### 转换到不同的色彩空间 + +`cv2.cvtColor` 函数将一个输入图像从一个颜色空间转换到另一个颜色空间。在 RGB 和 BGR 色彩空间之间转换时,应明确指定通道的顺序(`RGB2BGR` 或 `BGR2RGB`)。**注意,OpenCV 中的默认颜色格式通常被称为 RGB,但它实际上是 BGR(字节是相反的)。** 因此,标准(24 位)彩色图像的第一个字节将是一个 8 位蓝色分量,第二个字节是绿色,第三个字节是红色。然后第四、第五和第六个字节将是第二个像素(蓝色、然后是绿色,然后是红色),以此类推。 + +``` +import cv2 as cv +import matplotlib.pyplot as plt +img = cv.imread(cv.samples.findFile("starry_night.jpg"),cv.IMREAD_COLOR) +img_rgb = cv.cvtColor(img, cv.COLOR_BGR2RGB) +plt.imshow(img_rgb) +plt.show() +``` + +![][13] + +### 更多信息 + +关于 OpenCV 的更多细节可以在[在线文档][14]中找到。 + +感谢阅读。 + +-------------------------------------------------------------------------------- + +via: https://fedoramagazine.org/use-opencv-on-fedora-linux-part-1/ + +作者:[Onuralp SEZER][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/thunderbirdtr/ +[b]: https://github.com/lujun9972 +[1]: https://fedoramagazine.org/wp-content/uploads/2021/08/starry-night-1-816x345.jpg +[2]: https://commons.wikimedia.org/wiki/File:Van_Gogh_-_Starry_Night_-_Google_Art_Project.jpg +[3]: https://en.wikipedia.org/wiki/Computer_vision +[4]: https://en.wikipedia.org/wiki/OpenCV +[5]: https://opencv.org/about/ +[6]: https://fedoramagazine.org/jupyter-and-data-science-in-fedora/ +[7]: https://fedoramagazine.org/wp-content/uploads/2021/06/image.png +[8]: https://fedoramagazine.org/wp-content/uploads/2021/06/image-1.png +[9]: https://fedoramagazine.org/wp-content/uploads/2021/06/image-2.png +[10]: https://fedoramagazine.org/wp-content/uploads/2021/06/image-3.png +[11]: https://fedoramagazine.org/wp-content/uploads/2021/06/image-4.png +[12]: https://fedoramagazine.org/wp-content/uploads/2021/06/image-5.png +[13]: https://fedoramagazine.org/wp-content/uploads/2021/06/image-7.png +[14]: https://docs.opencv.org/4.5.2/index.html diff --git a/published/202108/20210803 GNOME Web Canary is Now Available to Test Bleeding Edge Features.md b/published/202108/20210803 GNOME Web Canary is Now Available to Test Bleeding Edge Features.md new file mode 100644 index 0000000000..497171d122 --- /dev/null +++ b/published/202108/20210803 GNOME Web Canary is Now Available to Test Bleeding Edge Features.md @@ -0,0 +1,76 @@ +[#]: subject: (GNOME Web Canary is Now Available to Test Bleeding Edge Features) +[#]: via: (https://news.itsfoss.com/gnome-web-canary/) +[#]: author: (Ankush Das https://news.itsfoss.com/author/ankush/) +[#]: collector: (lujun9972) +[#]: translator: (zd200572) +[#]: reviewer: (wxy) +[#]: publisher: (wxy) +[#]: url: (https://linux.cn/article-13683-1.html) + +使用 GNOME Web 的 Canary 版本测试前沿功能 +====== + +> 如果你想测试高度不稳定的 GNOME Web 浏览器的前沿功能,Canary 版本就是为了这个。 + +![](https://i0.wp.com/news.itsfoss.com/wp-content/uploads/2021/08/gnome-web-canary.png?w=1200&ssl=1) + +Epiphany(或称 [GNOME Web][1])是一个 Linux 发行版上精简而功能强大的浏览器,你会发现它也是 elementary OS 的默认浏览器。 + +随同 GNOME 40 发布的 Epiphany 浏览器有一些 [改进和新增功能][2]。 + +而在幕后,经常有许多令人兴奋的提升和新增特性。因此,你可以选择为早期测试人员量身定制的 GNOME Web 技术预览版。 + +现在,它发布了一个新的 Canary 版本,你可以使用它来测试甚至在技术预览版中都没有的特性。 + +### GNOME Web Canary 版本 + +![][3] + +GNOME Web 的 Canary 版本允许你测试甚至没有出现在最新 [WebKitGTK][4] 版本中的特性。 + +注意 Canary 版本应该是极其不稳定的,甚至稳定性比开发者技术预览版更差。 + +可是,使用 Canary 版本,终端用户可以在开发过程中的早期进行测试,帮助开发者发现灾难性 bug。 + +不只是终端用户的早期测试,Canary 版本还让 GNOME Web 的开发者的工作更轻松。 + +他们不再需要为了实现和测试一个新特性,来单独构建 WebKitGTK。 + +尽管开发者有一个 Flatpak SDK 可以简化开发人员的流程,但是这仍然是一项耗时的任务。 + +现在,没有了这个阻碍,开发速度也有可能提升。 + +### 怎样获得 Canary 版本? + +首先,你需要使用以下命令添加 WebKit SDK Flatpak 远端仓库: + +``` +flatpak --user remote-add --if-not-exists webkit https://software.igalia.com/flatpak-refs/webkit-sdk.flatpakrepo +flatpak --user install https://nightly.gnome.org/repo/appstream/org.gnome.Epiphany.Canary.flatpakref +``` + +完成后,你就可以使用提供的 [Flatpakref 文件][5] 安装啦! + +测试 Canary 版本可以让更多的用户能够在此过程中帮助 GNOME Web 的开发人员。所以,这绝对是改进 GNOME Web 浏览器开发的急需补充。 + +更多技术细节,你可能需要看这位开发者发布的 [公告][6]。 + +-------------------------------------------------------------------------------- + +via: https://news.itsfoss.com/gnome-web-canary/ + +作者:[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://wiki.gnome.org/Apps/Web/ +[2]: https://news.itsfoss.com/gnome-web-new-tab/ +[3]: https://i2.wp.com/news.itsfoss.com/wp-content/uploads/2021/08/Epiphany-Canary.png?w=940&ssl=1 +[4]: https://webkitgtk.org +[5]: https://nightly.gnome.org/repo/appstream/org.gnome.Epiphany.Canary.flatpakref +[6]: https://base-art.net/Articles/introducing-the-gnome-web-canary-flavor/ diff --git a/published/202108/20210803 How to Install Google Chrome on Linux Mint -Beginners Tip.md b/published/202108/20210803 How to Install Google Chrome on Linux Mint -Beginners Tip.md new file mode 100644 index 0000000000..29ab48f613 --- /dev/null +++ b/published/202108/20210803 How to Install Google Chrome on Linux Mint -Beginners Tip.md @@ -0,0 +1,129 @@ +[#]: subject: (How to Install Google Chrome on Linux Mint [Beginners Tip]) +[#]: via: (https://itsfoss.com/install-chrome-linux-mint/) +[#]: author: (Abhishek Prakash https://itsfoss.com/author/abhishek/) +[#]: collector: (lujun9972) +[#]: translator: (geekpi) +[#]: reviewer: (wxy) +[#]: publisher: (wxy) +[#]: url: (https://linux.cn/article-13659-1.html) + +初级:如何在 Linux Mint 上安装 Google Chrome +====== + +![](https://img.linux.net.cn/data/attachment/album/202108/08/133301ni5k5i8rziezwe5i.jpg) + +这应该是一个非常简单的话题,但我写这个是因为我看到很多网站推荐在 Linux Mint 上安装 Google Chrome 的奇怪命令行步骤。那是可行的,但那是不必要的复杂,特别是对于不熟悉命令行的初学者。 + +实际上,你根本不需要走终端方式。你所要做的就是去谷歌浏览器的网站,下载 Ubuntu 的安装文件并安装。 + +让我详细介绍一下步骤,供你了解。 + +### 在 Linux Mint 上安装 Google Chrome + +进入 Google Chrome 的网站。 + +[Google Chrome Website][1] + +你会看到一个 “Download Chrome” 的按钮。点击它。 + +![Download Chrome for Linux][2] + +它将向你显示在 Linux 上下载 Chrome 的两个选项。选择 Debian/Ubuntu 选项并点击 “Accept and Install” 按钮。 + +![Select Debian/Ubuntu option for Chrome package on Mint][3] + +在开始下载之前,Firefox 会询问你是否要用 Gdebi 打开下载的文件或保存它。你可以选择任何一个选项,因为最终你会 [使用 Gdebi 来安装 deb 文件][4]。然而,我更喜欢先保存文件。 + +![Save the deb file][5] + +等待下载完成。 + +![Wait for Google Chrome download to finish][6] + +下载完成后,在文件管理器中进入下载文件夹。要 [安装 deb 文件][7],可以双击它或者右击它并选择 “Open With GDebi Package Installer”。 + +![Double click on the downloaded deb file to install it][8] + +等待几秒钟,它应该给你一个安装的选项。 + +![Hit the Install Package option in Gdebi][9] + +它将要求你提供 Linux Mint 的账户密码。在 Linux 中,你需要提供你的密码来安装任何应用。 + +![Enter your password for installing an application][10] + +你就要完成了。它将显示哪些额外的软件包将与之一起安装(如果有的话)。点击继续按钮即可。 + +![Details on the packages to be installed][11] + +安装完成应该只需要几秒钟或最多一分钟。 + +![Installing Chrome in progress][12] + +安装完成后,你应该看到这样的屏幕。 + +![Chrome successfully installed on Linux Mint][13] + +安装完成后,你可以在应用菜单中寻找 Google Chrome 来运行它。 + +![Run Google Chrome in Linux Mint][14] + +然后在 Linux Mint 上享受 Google Chrome。 + +![Google Chrome running in Linux Mint][15] + +### 如何在 Linux Mint 上更新 Google Chrome + +这个方法的好处是,谷歌浏览器会随着系统的更新而更新。当你安装 deb 文件的时候,它也会在你的系统中添加一个来自谷歌的仓库。 + +![Chrome adds a repository to the system for providing updates][16] + +由于这个添加的仓库,Chrome 浏览器上的更新将被添加到系统更新中。因此,当你更新 Linux Mint 时,它也会被更新(如果有可用的更新)。 + +### 如何从 Linux Mint 中删除 Google Chrome + +不喜欢 Chrome?不用担心。你可以从 Linux Mint 中卸载谷歌浏览器。同样这次你也不需要使用终端。 + +点击菜单,搜索 Chrome。在 Chrome 图标上点击右键,你会看到一个 “Uninstall” 选项。选择它。 + +![Removing Google Chrome from Linux Mint][17] + +当然,你必须输入你的密码。它将显示要删除的软件包。在这里点击 OK。 + +![Uninstalling Google Chrome from Linux mint][18] + +你可以留下 Google Chrome 的仓库,也可以删除它。这是你的选择。 + +我希望你觉得这个教程对在 Linux Mint 上使用 Google Chrome 有帮助。 + +-------------------------------------------------------------------------------- + +via: https://itsfoss.com/install-chrome-linux-mint/ + +作者:[Abhishek Prakash][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/abhishek/ +[b]: https://github.com/lujun9972 +[1]: https://www.google.com/chrome/index.html +[2]: https://i1.wp.com/itsfoss.com/wp-content/uploads/2021/08/download-chrome-linux-mint.png?resize=800%2C320&ssl=1 +[3]: https://i2.wp.com/itsfoss.com/wp-content/uploads/2021/08/downloading-chrome-linux-mint.png?resize=800%2C679&ssl=1 +[4]: https://itsfoss.com/gdebi-default-ubuntu-software-center/ +[5]: https://i0.wp.com/itsfoss.com/wp-content/uploads/2021/08/saving-downloaded-chrome-linux-mint.png?resize=798%2C400&ssl=1 +[6]: https://i1.wp.com/itsfoss.com/wp-content/uploads/2021/08/finishing-chrome-download-linux-mint.png?resize=799%2C315&ssl=1 +[7]: https://itsfoss.com/install-deb-files-ubuntu/ +[8]: https://i2.wp.com/itsfoss.com/wp-content/uploads/2021/08/installing-google-chrome-deb-file-mint.png?resize=799%2C529&ssl=1 +[9]: https://i1.wp.com/itsfoss.com/wp-content/uploads/2021/08/installing-google-chrome-gdebi-mint.png?resize=801%2C548&ssl=1 +[10]: https://i2.wp.com/itsfoss.com/wp-content/uploads/2021/08/enter-password-for-installing-chrome-mint.png?resize=800%2C399&ssl=1 +[11]: https://i0.wp.com/itsfoss.com/wp-content/uploads/2021/08/installing-chrome-mint.png?resize=799%2C483&ssl=1 +[12]: https://i2.wp.com/itsfoss.com/wp-content/uploads/2021/08/installing-chrome-mint-progress.png?resize=799%2C489&ssl=1 +[13]: https://i0.wp.com/itsfoss.com/wp-content/uploads/2021/08/chrome-installed-mint.png?resize=798%2C483&ssl=1 +[14]: https://i1.wp.com/itsfoss.com/wp-content/uploads/2021/08/run-google-chrome-linux-mint.png?resize=798%2C580&ssl=1 +[15]: https://itsfoss.com/wp-content/uploads/2021/08/google-chrome-in-linux-mint-800x450.webp +[16]: https://i0.wp.com/itsfoss.com/wp-content/uploads/2021/08/google-chrome-repo-added-mint.png?resize=799%2C272&ssl=1 +[17]: https://itsfoss.com/wp-content/uploads/2021/08/removing-google-chrome-from-mint.webp +[18]: https://itsfoss.com/wp-content/uploads/2021/08/uninstalling-google-chrome-from-linux-mint.webp diff --git a/published/202108/20210803 Mount Microsoft OneDrive in Linux With OneDriver GUI Tool.md b/published/202108/20210803 Mount Microsoft OneDrive in Linux With OneDriver GUI Tool.md new file mode 100644 index 0000000000..cae17b0138 --- /dev/null +++ b/published/202108/20210803 Mount Microsoft OneDrive in Linux With OneDriver GUI Tool.md @@ -0,0 +1,113 @@ +[#]: subject: (Mount Microsoft OneDrive in Linux With OneDriver GUI Tool) +[#]: via: (https://itsfoss.com/onedriver/) +[#]: author: (Abhishek Prakash https://itsfoss.com/author/abhishek/) +[#]: collector: (lujun9972) +[#]: translator: (geekpi) +[#]: reviewer: (wxy) +[#]: publisher: (wxy) +[#]: url: (https://linux.cn/article-13681-1.html) + +用 OneDriver GUI 工具在 Linux 中挂载微软 OneDrive +====== + +在 Windows 上,微软提供了一个 [免费云存储服务][1] OneDrive。它与 Windows 集成,你可以通过你的微软账户获得 5GB 的免费存储空间。 + +这在 Windows 上很好用,但和谷歌一样,微软也没有在 Linux 桌面上提供 OneDrive 的本地客户端。 + +当然,你可以通过浏览器访问你的 OneDrive 数据。除此以外,还有一些其他的方法可以在 Linux 上访问 OneDrive。 + +你可以使用像 [Insync][2] 这样的高级服务,或者选择用 [rclone 在 Linux 上使用 OneDrive][3] 这种稍微复杂的命令行方式。 + +最近,我发现了另一个工具,它稍有不同,使用起来也更简单。不出所料,它叫 OneDriver。 + +### OneDriver:在你的 Linux 系统上挂载 OneDrive + +![OneDrive Linux illustration][4] + +[OneDriver][5] 是一个自由而开源的工具,允许你在 Linux 系统上挂载 OneDrive 文件。 + +请记住,它不会像 OneDrive 在 Windows 系统上那样同步文件。它将 OneDrive 文件挂载在本地的挂载点上。你通过网络访问这些文件。 + +然而,它确实提供了一种混合方法。你在挂载的 OneDrive 中打开的文件也被下载到系统中。这意味着,你也可以离线访问打开的文件。如果你没有连接到互联网,这些文件将成为只读。 + +如果你在本地对文件做任何修改,并且连接到互联网,它就会反映到 OneDrive 上。 + +我注意到,在 GNOME 上的 Nautilus 文件管理器中,它会自动下载当前文件夹中的图像。在我的印象中,它们只有在我打开它们时才会被下载。 + +另一件事是,Nautilus 一开始会建立缩略图缓存。OneDriver 在开始的时候可能会觉得有点慢,有点耗费资源,但最终会好起来。 + +哦!你也可以挂载多个 OneDrive 账户。 + +### 安装和使用 OneDriver + +要在 Ubuntu 20.04(和 Linux Mint 20 系列)上安装 OneDriver,你可以使用 OneDriver 开发者的这个 PPA: + +``` +sudo add-apt-repository ppa:jstaf/onedriver +sudo apt update +sudo apt install onedriver +``` + +对于 Ubuntu 21.04,你可以下载 [其 PPA 中的 DEB 文件][6] 来使用它。 + +在 Fedora 上,你可以添加这个 COPR: + +``` +sudo dnf copr enable jstaf/onedriver +sudo dnf install onedriver +``` + +Arch 用户可以在 AUR 中找到它。 + +安装后,在菜单中搜索 OneDriver,然后从这里启动它。 + +![Search for OneDriver][7] + +首次运行时,它会给出一个奇怪的空界面。点击 “+” 号,选择一个文件夹或创建一个新的文件夹,OneDrive 会挂载在那里。在我的例子中,我在我的家目录下创建了一个名为 `One_drive` 的新文件夹。 + +![Click on + sign to add a mount point for OneDrive][8] + +当你选择了挂载点后,你会被要求输入你的微软凭证。 + +![one drive login][9] + +![one drive permission][10] + +登录后,你可以在挂载的目录中看到 OneDrive 的文件。 + +![OneDrive mounted in Linux][11] + +完成这些后,你可以在应用界面上看到你的 OneDrive 账户。点击旁边的勾按钮,以在重启后自动挂载 OneDrive。 + +![Autostart OneDriver mounting][12] + +总的来说,OneDriver 是一个可以在 Linux 上访问 OneDrive 的不错的免费工具。它可能无法像 [高级 Insync 服务][13] 那样提供完整的同步设施,但对于有限的需求来说,它做得不错。 + +如果你使用这个漂亮的工具,请分享你的使用经验。如果你喜欢这个项目,也许可以给它一个 [GitHub 上的星标][5]。 + +-------------------------------------------------------------------------------- + +via: https://itsfoss.com/onedriver/ + +作者:[Abhishek Prakash][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/abhishek/ +[b]: https://github.com/lujun9972 +[1]: https://itsfoss.com/cloud-services-linux/ +[2]: https://itsfoss.com/use-onedrive-on-linux/ +[3]: https://itsfoss.com/use-onedrive-linux-rclone/ +[4]: https://i1.wp.com/itsfoss.com/wp-content/uploads/2021/08/one-drive-linux.png?resize=800%2C450&ssl=1 +[5]: https://github.com/jstaf/onedriver +[6]: https://launchpad.net/~jstaf/+archive/ubuntu/onedriver/+packages +[7]: https://i0.wp.com/itsfoss.com/wp-content/uploads/2021/08/search-for-onedriver.png?resize=798%2C214&ssl=1 +[8]: https://i2.wp.com/itsfoss.com/wp-content/uploads/2021/08/onedriver-interface.png?resize=745%2C456&ssl=1 +[9]: https://i2.wp.com/itsfoss.com/wp-content/uploads/2021/08/one-drive-login.png?resize=470%2C660&ssl=1 +[10]: https://i1.wp.com/itsfoss.com/wp-content/uploads/2021/08/one-drive-permission.png?resize=470%2C660&ssl=1 +[11]: https://i0.wp.com/itsfoss.com/wp-content/uploads/2021/08/one-drive-mounted-in-linux.png?resize=800%2C491&ssl=1 +[12]: https://i0.wp.com/itsfoss.com/wp-content/uploads/2021/08/auto-start-onedriver.png?resize=602%2C499&ssl=1 +[13]: https://itsfoss.com/recommends/insync/ diff --git a/published/202108/20210803 Set up a VPN server on your Linux PC.md b/published/202108/20210803 Set up a VPN server on your Linux PC.md new file mode 100644 index 0000000000..d310844edb --- /dev/null +++ b/published/202108/20210803 Set up a VPN server on your Linux PC.md @@ -0,0 +1,130 @@ +[#]: subject: (Set up a VPN server on your Linux PC) +[#]: via: (https://opensource.com/article/21/8/openvpn-server-linux) +[#]: author: (D. Greg Scott https://opensource.com/users/greg-scott) +[#]: collector: (lujun9972) +[#]: translator: (perfiffer) +[#]: reviewer: (wxy) +[#]: publisher: (wxy) +[#]: url: (https://linux.cn/article-13680-1.html) + +如何在免费 WiFi 中保护隐私(一) +====== + +> 第一步是安装一个“虚拟专用网络”服务器。 + +![](https://img.linux.net.cn/data/attachment/album/202108/13/213142rclc5htyfahotfas.jpg) + +你是否连接到了不受信任的网络,例如酒店或咖啡馆的 WiFi,而又需要通过智能手机和笔记本电脑安全浏览互联网?通过使用虚拟专用网络,你可以匿名访问不受信任的网络,就像你在专用网络上一样安全。 + +“虚拟专用网络” 是保护私人数据的绝佳工具。通过使用 “虚拟专用网络”,你可以在保持匿名的同时连接到互联网上的专用网络。 + +可选的 “虚拟专用网络” 服务有很多,[0penVPN][2] 依然是很多人在使用不受信任的网络时保护私人数据的第一选择。 + +0penVPN 在两点之间创建一个加密通道,防止第三方访问你的网络流量数据。通过设置你的 “虚拟专用网络” 服务,你可以成为你自己的 “虚拟专用网络” 服务商。许多流行的 “虚拟专用网络” 服务都使用 0penVPN,所以当你可以掌控自己的网络时,为什么还要将你的网络连接绑定到特定的提供商呢? + +### 搭建 Linux 服务器 + +首先,在备用 PC 上安装一份 Linux。本例使用 Fedora,但是不论你使用的是什么 Linux 发行版,步骤基本是相同的。 + +从 [Fedora 项目][3] 网站下载最新的 Fedora ISO 副本。制作一个 USB 启动盘,将其插入到你的 PC 并启动,然后安装操作系统。如果你从未制作过可引导的 USB 启动盘,可以了解一下 [Fedora Media Writer][4]。如果你从未安装过 Linux,请阅读 [三步安装 Linux][5]。 + +### 设置网络 + +安装完成 Fedora 操作系统后,登录到控制台或者 SSH 会话。 + +更新到最新并重新启动: + +``` +$ sudo dnf update -y && reboot +``` + +重新登录并关闭防火墙: + +``` +systemctl disable firewalld.service +systemctl stop firewalld.service +``` + +你可能希望在此系统上为你的内部网络添加适当的防火墙规则。如果是这样,请在关闭所有防火墙规则后完成 0penVPN 的设置和调试,然后添加本地防火墙规则。想要了解更多,请参照 [在 Linux 上设置防火墙][6]。 + +### 设置 IP 地址 + +你需要在你的本地网络设置一个静态 IP 地址。下面的命令假设在一个名为 `ens3` 的设备上有一个名为 `ens3` 的网络管理器Network Manager连接。你的设备和连接名称可能不同,你可以通过打开 SSH 会话或从控制台输入以下命令: + +``` +$ sudo nmcli connection show +NAME  UUID                                  TYPE      DEVICE +ens3  39ad55bd-adde-384a-bb09-7f8e83380875  ethernet  ens3 +``` + +你需要确保远程用户能够找到你的 “虚拟专用网络” 服务器。有两种方法可以做到这一点。你可以手动设置它的 IP 地址,或者将大部分工作交给你的路由器去完成。 + +#### 手动配置一个 IP 地址 + +通过以下命令来设置静态 IP 地址、前缀、网关和 DNS 解析器,用来替换掉原有的 IP 地址: + +``` +$ sudo nmcli connection modify ens3 ipv4.addresses 10.10.10.97/24 +$ sudo nmcli connection modify ens3 ipv4.gateway 10.10.10.1 +$ sudo nmcli connection modify ens3 ipv4.dns 10.10.10.10 +$ sudo nmcli connection modify ens3 ipv4.method manual +$ sudo nmcli connection modify ens3 connection.autoconnect yes +``` + +设置主机名: + +``` +$ sudo hostnamectl set-hostname OVPNserver2020 +``` + +如果你运行了一个本地的 DNS 服务,你需要设置一个 DNS 条目,将主机名指向 “虚拟专用网络” 服务器的 IP 地址。 + +重启并确保系统的网络运行正常。 + +#### 在路由器中配置 IP 地址 + +在你的网络当中应该有一台路由器。你可能已经购买了它,或者从互联网服务提供商(ISP)那里获得了一台。无论哪种方式,你的路由器可能都有一个内置的 DHCP 服务,可以为连接到网络上的每台设备分配一个 IP 地址。你的新 “虚拟专用网络” 服务器也是属于网络的一台设备,因此你可能已经注意到它会自动分配一个 IP 地址。 + +这里的潜在问题是你的路由器不能保证每台设备都能在重新连接后获取到相同的 IP 地址。路由器确实尝试保持 IP 地址一致,但这会根据当时连接的设备数量而发生变化。 + +但是,几乎所有的路由器都会有一个界面,允许你为特定设备调停和保留 IP 地址。 + +![Router IP address settings][7] + +路由器没有统一的界面,因此请在你的路由器接口中搜索 “DHCP” 或 “Static IP address” 选项。为你的服务器分配自己的预留 IP 地址,使其在网络中保持 IP 不变。 + +### 连接到服务器 + +默认情况下,你的路由器可能内置了防火墙。这通常很好,因为你不希望网络之外的人能够强行进入你的任何计算机。但是,你必须允许发往 “虚拟专用网络” 服务器的流量通过防火墙,否则你的 “虚拟专用网络” 将无法访问,这种情况下你的 “虚拟专用网络” 服务器将形同虚设。 + +你至少需要一个来自互联网服务提供商的公共静态 IP 地址。使用其静态 IP 地址设置路由器的公共端,然后将你的 0penVPN 服务器放在专用端,在你的网络中使用专用静态 IP 地址。 0penVPN 默认使用 UDP 1194 端口。配置你的路由器,将你的公网 “虚拟专用网络” IP 地址的 UDP 1194 端口转发到 0penVPN 服务器上的 UDP 1194 端口。如果你决定使用不同的 UDP 端口,请相应地调整端口号。 + +### 准备好,我们开始下一步 + +在本文中,你在服务器上安装并配置了一个操作系统,这已经成功了一半。在下一篇文章中,你将解决安装和配置 0penVPN 本身的问题。同时,请熟悉你的路由器并确保你可以从外部访问你的服务器。但是请务必在测试后关闭端口转发,直到你的 “虚拟专用网络” 服务启动并运行。 + +本文的部分内容改编自 D. Greg Scott 的博客,并经许可重新发布。 + +-------------------------------------------------------------------------------- + +via: https://opensource.com/article/21/8/openvpn-server-linux + +作者:[D. Greg Scott][a] +选题:[lujun9972][b] +译者:[perfiffer](https://github.com/perfiffer) +校对:[wxy](https://github.com/wxy) + +本文由 [LCTT](https://github.com/LCTT/TranslateProject) 原创编译,[Linux中国](https://linux.cn/) 荣誉推出 + +[a]: https://opensource.com/users/greg-scott +[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://openvpn.net/ +[3]: http://getfedora.org +[4]: https://opensource.com/article/20/10/fedora-media-writer +[5]: https://opensource.com/article/21/2/linux-installation +[6]: https://www.redhat.com/sysadmin/secure-linux-network-firewall-cmd +[7]: https://opensource.com/sites/default/files/uploads/reserved-ip.jpg (Router IP address settings) +[8]: https://creativecommons.org/licenses/by-sa/4.0/ +[9]: https://opensource.com/article/20/9/firewall +[10]: https://www.dgregscott.com/how-to-build-a-vpn-in-four-easy-steps-without-spending-one-penny/ diff --git a/published/202108/20210803 Use the Linux terminal to navigate throughout your computer.md b/published/202108/20210803 Use the Linux terminal to navigate throughout your computer.md new file mode 100644 index 0000000000..303722ad27 --- /dev/null +++ b/published/202108/20210803 Use the Linux terminal to navigate throughout your computer.md @@ -0,0 +1,55 @@ +[#]: subject: (Use the Linux terminal to navigate throughout your computer) +[#]: via: (https://opensource.com/article/21/8/navigate-linux-directories) +[#]: author: (Seth Kenlon https://opensource.com/users/seth) +[#]: collector: (lujun9972) +[#]: translator: (piaoshi) +[#]: reviewer: (wxy) +[#]: publisher: (wxy) +[#]: url: (https://linux.cn/article-13674-1.html) + +使用 Linux 终端浏览你的计算机 +====== + +> 学习在 Linux 终端中从一个目录切换到另一个目录。 + +![](https://img.linux.net.cn/data/attachment/album/202108/12/113605d3hp448xm8m18wzw.jpg) + +要在图形界面中浏览你的计算机上的文件夹,你可能习惯于打开一个窗口来“进入”你的计算机,然后双击一个文件夹,再双击一个子文件夹,如此反复。你也可以使用箭头按钮或按键来回溯。 + +而要在终端中浏览你的计算机,你可以利用 `cd` 命令。你可以使用 `cd ..` 回到 _上一级_ 目录,或者使用 `cd ./另一个/文件夹的/路径` 来跳过许多文件夹进入一个特定的位置。 + +你在互联网上已经使用的 URL 的概念,实际上直接来自 [POSIX][2]。当你浏览某个网站的一个特定页面时,比如 `http://www.example.com/tutorials/lesson2.html`,你实际上做的是进入 `/var/www/imaginarysite/tutorials/` 目录,并打开一个叫 `classic2.html` 的文件。当然,你是在 Web 浏览器中打开它的,浏览器会将所有那些看起来奇怪的 HTML 代码解释成漂亮的文本和图片。但这两者的思路是完全一样的。 + +如果你把你的计算机看成是互联网(或者把互联网看成是计算机会更合适),那么你就能理解如何在你的文件夹和文件中遨游了。如果从你的用户文件夹(你的家目录,或简记为 `~`)开始,那么你想切换到的文件夹都是相对于这个文件夹而言的: + +``` +$ cd ~/Documents +$ pwd +/home/tux/Documents + +$ cd .. +$ pwd +/home/tux +``` + +这需要一些练习,但一段时间后,它会变得比你打开和关闭窗口、点击返回按钮和文件夹图标快得多。 + +### 用 Tab 键自动补全 + +键盘上的 `Tab` 键可以自动补全你开始输入的文件夹和文件的名字。如果你要 `cd` 到 `~/Documents` 文件夹,那么你只需要输入 `cd ~/Doc`,然后按 `Tab` 键即可。你的 Shell 会自动补全 `uments`。这不仅仅是一个令人愉快的便利工具,它也是一种防止错误的方法。如果你按下 `Tab` 键而没有任何东西自动补全,那么可能你 _认为_ 存在于某个位置的文件或文件件实际上并不存在。即使有经验的 Linux 用户也会试图切换到一个当前目录下不存在的文件夹,所以你可以经常使用 `pwd` 和 `ls` 命令来确认你确实在你认为你在的目录、以及你的当前目录确实包含了你认为它包含的文件。 + +-------------------------------------------------------------------------------- + +via: https://opensource.com/article/21/8/navigate-linux-directories + +作者:[Seth Kenlon][a] +选题:[lujun9972][b] +译者:[piaoshi](https://github.com/piaoshi) +校对:[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/ch01s04.svg_.png?itok=bC8Bcapk (Move around your computer) +[2]: https://opensource.com/article/19/7/what-posix-richard-stallman-explains diff --git a/published/202108/20210804 Firefox Lost Almost 50 million Users- Here-s Why It is Concerning.md b/published/202108/20210804 Firefox Lost Almost 50 million Users- Here-s Why It is Concerning.md new file mode 100644 index 0000000000..2c4802782c --- /dev/null +++ b/published/202108/20210804 Firefox Lost Almost 50 million Users- Here-s Why It is Concerning.md @@ -0,0 +1,112 @@ +[#]: subject: "Firefox Lost Almost 50 million Users: Here’s Why It is Concerning" +[#]: via: "https://news.itsfoss.com/firefox-decline/" +[#]: author: "Ankush Das https://news.itsfoss.com/author/ankush/" +[#]: collector: "lujun9972" +[#]: translator: "imgradeone" +[#]: reviewer: "wxy" +[#]: publisher: "wxy" +[#]: url: "https://linux.cn/article-13658-1.html" + +Firefox 失去了近 5000 万用户:令人担忧的原因 +====== + +> 2018 年以来,Mozilla 的火狐浏览器正在大面积流失用户,为什么用户正在远离它?这是否值得担心? + +![](https://i0.wp.com/news.itsfoss.com/wp-content/uploads/2021/08/firefox-decline.jpg?w=1200&ssl=1) + +Mozilla 的 Firefox 是基于 Chromium 内核的浏览器的唯一流行替代品。 + +它一直是 Linux 用户,以及每个平台上注重隐私的用户的默认选择。 + +然而,即便凭借着大量优势成为最好的 Web 浏览器之一,Firefox 近几年逐渐流失了它的影响力。 + +实话实说,我们都不需要借助统计数据来论证这一点,因为我们当中的许多人就已经转向其它 Chromium 内核的浏览器,或者 Chromium 本身,而不是 Firefox 和 Google Chrome。 + +不过,我在 Reddit 上偶然发现了由 [u/nixcraft][1] 写的一篇帖子,这篇帖子强调了 Firefox 的用户数从 2018 年来不断下降的原因。 + +而令人惊讶的是,这篇帖子的原始信息来源就是 [Firefox 的公开数据报表][2]。 + +![][3] + +根据官方数据统计,在 2018 年底,其报告的(月度)活跃人数达到了 **2.44 亿**。 + +但,到了 **2021 年第二季度**,这个数字降到了 **1.98 亿**。 + +由此可以得出,Firefox 的用户基数下降了高达 **4600 万**。 + +### Firefox 的衰落确实令人担忧,但也很明显 + +鉴于在 2021 年以隐私为重点的工具在其用户群体中大量出现,Mozilla 的 Firefox 用户基数正面临着不断下降。 + +尤其是在 Firefox 设法引入一些业界首创的隐私功能之后。呵,是不是很讽刺? + +如果你从来没有使用过 Firefox,或者已经迁移至其他浏览器许久,这篇 [关于 Brave 和 Firefox 浏览器的比较][4] 表明,到目前为止,Firefox 其实还是一个可靠的浏览器。 + +所以,为什么许多用户迁移到了 Chromium 内核的浏览器,尤其是 Chrome 呢? + +我这里马上就想到了这几点: + + * Google Chrome 是 Android 设备上的默认浏览器 + * Microsoft Edge 是 Windows 设备上的默认浏览器(因此自然就有巨大的市场份额) + * Google.com(最大的搜索引擎)建议用户安装 Google Chrome(实际上是一种潜在的反竞争手段) + * 一些 Web 服务只兼容基于 Chromium 的浏览器 + +除此之外,Firefox 可能也做错了这几件事: + + * 不断以大修的方式来破坏用户体验 + * 近年来缺乏显著的性能改进 + +当然,没有哪个浏览器是完美的,但这是什么值得担心的事吗?嗯,我觉得是的。 + +### 为什么你应该担忧 + +Mozilla 的 Firefox 是基于 Chromium 的浏览器的唯一可行的竞争品。如果 Firefox 消失了,用户就会失去其它浏览器内核的选择。 + +我相信你会同意,纵容垄断是有害的,因此我们需要一些 Google Chromium 引擎的替代品。 + +实际上,相当多的网站会根据基于 Chromium 的浏览器来优化用户体验。 + +因此,如果用户量下降的趋势一直持续下去,**我们这样的用户可能就会被迫适应新的工作流程而改用其他浏览器**。 + +即使忽略掉 Google 的 Chromium 引擎在互联网的主导地位,或者认为 Chrome 之类的浏览器在技术上更好,Firefox 仍旧十分珍贵。因为它至少提供了更多的个性化功能,也不断改进隐私体验,与其他的都不一样。 + +换句话说,我们可能会(被迫)失去许多好的东西,而这一切仅仅是因为其他竞争对手都选择基于 Chromium 内核,或者从事反竞争活动。 + +也许,你现在对 Firefox 很失望而想转向其他浏览器。当然,这是你自己的选择。 + +**但是,待到 Firefox 因为各种使其衰落的因素而彻底消失后,你又该何去何从呢?** + +![][5] + +因此,为了让一切保持平衡,我认为我们应该不断反抗科技巨头的反竞争行为,并且开始使用 Mozilla Firefox(不论是什么身份,甚至是作为备用浏览器)。 + +当然,Mozilla 也需要面对这种情况做出什么措施了。 + +当他们忙于添加隐私网络服务、邮件中继和其他服务集成时,Mozilla 在用户体验改善方面做的并不成功。 + +至少,我是这么认为的。多年来,我一直使用 Firefox 作为主力浏览器,但我最终还是会偶尔转向其他浏览器,尤其是每次 Firefox 界面进行大幅度更改后。 + +### 你怎么看? + +我很想知道你对此有何想法,以及你认为究竟是什么因素导致了 Firefox 用户数的下降。 + +你更喜欢将哪款浏览器作为你的主力浏览器?在评论区中告诉我吧! + +-------------------------------------------------------------------------------- + +via: https://news.itsfoss.com/firefox-decline/ + +作者:[Ankush Das][a] +选题:[lujun9972][b] +译者:[imgradeone](https://github.com/imgradeone) +校对:[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.reddit.com/user/nixcraft/ +[2]: https://data.firefox.com/dashboard/user-activity +[3]: https://news.itsfoss.com/wp-content/uploads/2021/08/firefox-userbase-decline.png +[4]: https://itsfoss.com/brave-vs-firefox/ +[5]: https://news.itsfoss.com/wp-content/uploads/2021/08/firefox-survive.jpg \ No newline at end of file diff --git a/published/202108/20210804 How to Find and Remove Duplicate Photos in Linux.md b/published/202108/20210804 How to Find and Remove Duplicate Photos in Linux.md new file mode 100644 index 0000000000..96d52f1258 --- /dev/null +++ b/published/202108/20210804 How to Find and Remove Duplicate Photos in Linux.md @@ -0,0 +1,108 @@ +[#]: subject: (How to Find and Remove Duplicate Photos in Linux) +[#]: via: (https://itsfoss.com/find-remove-duplicate-photos-linux/) +[#]: author: (Abhishek Prakash https://itsfoss.com/author/abhishek/) +[#]: collector: (lujun9972) +[#]: translator: (zpl1025) +[#]: reviewer: (wxy) +[#]: publisher: (wxy) +[#]: url: (https://linux.cn/article-13661-1.html) + +如何在 Linux 系统里查找并删除重复相片 +====== + +![](https://img.linux.net.cn/data/attachment/album/202108/09/101511dq8uo51o8go5s9n9.jpg) + +点击打开了很多相似的相片?同样的相片保存在不同文件夹里?我理解这种感受。 + +在相机里点击相片,通过 WhatsApp 发送。然后又备份相片,于是在 WhatsApp 和系统相册里就会存下同样的拷贝。这个很烦人,很乱而且额外占用不必要的存储空间。 + +我是在翻看我岳父的相片收藏时遇到这个问题的。下面是我如何找出重复相片并删除的做法。 + +### 使用 digiKam 来找出和删除重复相片 + +[digiKam][1] 是一个 [用来管理和收集相片的自由开源应用][2]。它主要是方便摄影师,但并不是说一定要专业玩相机的人才能用。 + +我可以演示如何使用这个工具来查找重复相片,然后根据需要删除重复内容。 + +#### 第一步 + +首先是安装 digiKam。它是一个很流行的应用程序,应该可以在软件中心里直接安装,或者通过你的发行版的包管理器安装。 + +![通过软件中心安装 digikam][3] + +#### 第二步 + +在第一次运行 digiKam 时,它会要求你选择相片保存的位置。然后会创建一个 SQLite 数据库并开始导入图片。 + +![][4] + +![][5] + +![][6] + +#### 第三步 + +在相片导入完成以后,在文件菜单里选择**工具->查找重复图片**。 + +![在文件菜单里,选择工具->查找重复图片][7] + +#### 第四步 + +根据你所收集的图片数量,会需要一些时间。之后,你应该可以在左侧边栏里看到有重复的所有相片。在选中图片后,重复的相片会在右侧边栏里显示出来。 + +![digiKam 找到的重复图片][8] + +在上面的截图里,我在左侧选中的图片有四张一样的。其中有一张图片标记了“参考图片Reference image”,不过还是由你来确定哪张是原始的,哪张是复制的。 + +重复的相片默认会按保存位置(比如文件夹)来分组。可以在文件菜单里选择**视图->分类显示**选择其他方式。 + +**要删除重复相片的话**,选中有侧边栏里的相片并按下删除键。 + +可以重复这个操作,选择左侧边栏里的图片,一个个删除重复图片。会花太长时间?有个方法可以一次删除多个重复内容。 + +#### 在 digiKam 里删除多个重复图片 + +如果想一次把所有重复相片全删掉的话,可以在左侧边栏里选中所有相片。 + +然后,打开**文件菜单->视图->排序**,然后选择按相似程度。 + +![删除多个重复相片][9] + +之后会在底部显示所有参考图片。然后可以在右侧边栏里选中所有没有标记重复的相片,并按下删除按钮。 + +#### 额外提示:可以在垃圾桶里恢复已删除的相片 + +意外总是有的。人们经常会不小心误删了相片。这也是为什么 digiKam 不会立刻彻底删除图片。而是选择在保存相片的文件夹下创建隐藏的 `.dtrash` 文件夹,然后将“已删除”的相片移动到里面。 + +在应用程序界面上,你也可以看到这个垃圾桶文件夹。在里面可以找到你“删除”的相片,然后根据需要可以选择恢复。 + +![digiKam 的垃圾桶文件夹][10] + +希望你能喜欢这个关于在 Linux 上查找和删除重复图片的简短教程。类似的,你可能会想了解 [使用 GUI 工具在 Linux 系统里搜索重复文件][11]。 + +有任何问题和建议,请在下方留评。 + +-------------------------------------------------------------------------------- + +via: https://itsfoss.com/find-remove-duplicate-photos-linux/ + +作者:[Abhishek Prakash][a] +选题:[lujun9972][b] +译者:[zpl1025](https://github.com/zpl1025) +校对:[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://www.digikam.org/ +[2]: https://itsfoss.com/linux-photo-management-software/ +[3]: https://itsfoss.com/wp-content/uploads/2021/08/digikam-software-center-800x452.webp +[4]: https://itsfoss.com/wp-content/uploads/2021/08/digikam-initial-setup-1.webp +[5]: https://itsfoss.com/wp-content/uploads/2021/08/digikam-initial-setup-2.webp +[6]: https://itsfoss.com/wp-content/uploads/2021/08/digikam-initial-setup-3-800x607.webp +[7]: https://itsfoss.com/wp-content/uploads/2021/08/find-duplicates-digikam-800x462.webp +[8]: https://itsfoss.com/wp-content/uploads/2021/08/duplicate-images-found-with-digikam-800x530.webp +[9]: https://itsfoss.com/wp-content/uploads/2021/08/remove-multiple-duplicate-photos-800x528.webp +[10]: https://itsfoss.com/wp-content/uploads/2021/08/trash-option-digiKam-800x545.webp +[11]: https://itsfoss.com/find-duplicate-files-linux/ diff --git a/published/202108/20210804 Install OpenVPN on your Linux PC.md b/published/202108/20210804 Install OpenVPN on your Linux PC.md new file mode 100644 index 0000000000..9c444e001e --- /dev/null +++ b/published/202108/20210804 Install OpenVPN on your Linux PC.md @@ -0,0 +1,175 @@ +[#]: subject: "Install OpenVPN on your Linux PC" +[#]: via: "https://opensource.com/article/21/7/openvpn-router" +[#]: author: "D. Greg Scott https://opensource.com/users/greg-scott" +[#]: collector: "lujun9972" +[#]: translator: "perfiffer" +[#]: reviewer: "wxy" +[#]: publisher: "wxy" +[#]: url: "https://linux.cn/article-13702-1.html" + +如何在免费 WiFi 中保护隐私(二) +====== + +> 安装完服务器之后,下一步就是安装和配置 0penVPN。 + +![](https://img.linux.net.cn/data/attachment/album/202108/20/123417yn554549p92ujt54.jpg) + +0penVPN 在两点之间创建一个加密通道,阻止第三方访问你的网络流量数据。通过设置你的 “虚拟专用网络” 服务,你可以成为你自己的 “虚拟专用网络” 服务商。许多流行的 “虚拟专用网络” 服务都使用 [0penVPN][2],所以当你可以掌控自己的网络时,为什么还要将你的网络连接绑定到特定的提供商呢? + +本系列的 [第一篇文章][3] 展示了如何安装和配置一台作为你的 0penVPN 服务器的 Linux 计算机。同时也讲述了如何配置你的路由器以便你可以在外部网络连接到你的服务器。 + +第二篇文章将演示根据 [0penVPN wiki][4] 给定的步骤安装一个 0penVPN 服务软件。 + +### 安装 0penVPN + +首先,使用包管理器安装 0penVPN 和 `easy-rsa` 应用程序(帮助你在服务器上设置身份验证)。本例使用的是 Fedora Linux,如果你选择了不同的发行版,请选用合适的命令。 + +``` +$ sudo dnf install openvpn easy-rsa +``` + +此操作会创建一些空目录: + + * `/etc/openvpn` + * `/etc/openvpn/client` + * `/etc/openvpn/server` + +如果这些目录在安装的过程中没有创建,请手动创建它们。 + +### 设置身份验证 + +0penVPN 依赖于 `easy-rsa` 脚本,并且应该有自己的副本。复制 `easy-rsa` 脚本和文件: + +``` +$ sudo mkdir /etc/openvpn/easy-rsa +$ sudo cp -rai /usr/share/easy-rsa/3/* /etc/openvpn/easy-rsa/ +``` + +身份验证很重要,0penVPN 非常重视它。身份验证的理论是,如果 Alice 需要访问 Bob 公司内部的私人信息,那么 Bob 确保 Alice 真的是 Alice 就至关重要。同样的,Alice 也必须确保 Bob 是真正的 Bob。我们称之为相互认证。 + +现有的最佳实践是从三个可能因素中的选择两个检查属性: + + * 你拥有的 + * 你知道的 + * 你是谁 + +选择有很多。0penVPN 安装使用如下: + + * **证书**:客户端和服务端都拥有的东西 + * **证书口令**:某人知道的东西 + +Alice 和 Bob 需要帮助彼此来验证身份。由于他们都相信 Cathy,Cathy 承担了称为 证书颁发机构certificate authority(CA)的角色。Cathy 证明 Alice 和 Bob 都是他们自己。因为 Alice 和 Bob 都信任 Cathy,现在他们也相互信任了。 + +但是是什么让 Cathy 相信 Alice 和 Bob 是真的 Alice 和 Bob?Cathy 在社区的声誉取决于如何正确处理这件事,因此如果她希望 Denielle、Evan、Fiona、Greg 和其他人也信任她,她就需要严格测试 Alice 和 Bob 的宣称内容。当 Alice 和 Bob 向 Cathy 证明了他们是真的 Alice 和 Bob 之后,Cathy 将向 Alice 和 Bob 签署证书,让他们彼此和全世界分享。 + +Alice 和 Bob 如何知道是 Cathy 签署了证书,而不是某个人冒充她签发了证书?他们使用一项叫做**公钥加密**的技术: + + * 找到一种用一个密钥加密并用另一个密钥解密的加密算法。 + * 将其中一个设为私钥,将另外一个设为公钥。 + * Cathy 与全世界分享她的公钥和她的签名的明文副本。 + * Cathy 用她的私钥加密她的签名,任何人都可以用她分享的公钥解密。 + * 如果 Cathy 的签名解密后与明文副本匹配,Alice 和 Bob 就可以相信 Cathy 确实签署了它。 + +每次在线购买商品和服务时,使用的就是这种技术。 + +### 认证实现 + +0penVPN 的 [文档][5] 建议在单独的系统上或者至少在 0penVPN 服务器的单独目录上设置 CA。该文档还建议分别从服务端和客户端生成各自的证书。因为这是一个简单的演示设置,你可以使用 0penVPN 服务器设置 CA,并将证书和密钥放入服务器上的指定目录中。 + +从服务端生成证书,并将证书拷贝到各个客户端,避免客户端再次设置。 + +此实现使用自签名证书。这是因为服务器信任自己,而客户端信任服务器。因此,服务器是签署证书的最佳 CA。 + +在 0penVPN 服务器上设置 CA: + +``` +$ sudo mkdir /etc/openvpn/ca +$ cd /etc/openvpn/ca +$ sudo /etc/openvpn/easy-rsa/easyrsa init-pki +$ sudo /etc/openvpn/easy-rsa/easyrsa build-ca +``` + +使用一个易记难猜的密码。 + +设置服务器密钥对和认证请求: + +``` +$ cd /etc/openvpn/server +$ sudo /etc/openvpn/easy-rsa/easyrsa init-pki +$ sudo /etc/openvpn/easy-rsa/easyrsa gen-req OVPNserver2020 nopass +``` + +在此例中,`OVPNServer2020` 是你在本系列第一篇文章中为 0penVPN 服务器设置的主机名。 + +### 生成和签署证书 + +现在你必须向 CA 发送服务器请求并生成和签署服务器证书。 + +此步骤实质上是将请求文件从 `/etc/openvpn/server/pki/reqs/OVPNserver2020.req` 复制到 `/etc/openvpn/ca/pki/reqs/OVPNserver2020.req` 以准备审查和签名: + +``` +$ cd /etc/openvpn/ca +$ sudo /etc/openvpn/easy-rsa/easyrsa \ + import-req /etc/openvpn/server/pki/reqs/OVPNserver2020.req OVPNserver2020 +``` + +### 审查并签署请求 + +你已经生成了一个请求,所以现在你必须审查并签署证书: + +``` +$ cd /etc/openvpn/ca +$ sudo /etc/openvpn/easy-rsa/easyrsa \ + show-req OVPNserver2020 +``` + +以服务器身份签署请求: + +``` +$ cd /etc/openvpn/ca +$ sudo /etc/openvpn/easy-rsa/easyrsa \ + sign-req server OVPNserver2020 +``` + +将服务器和 CA 证书的副本放在它们所属的位置,以便配置文件获取它们: + +``` +$ sudo cp /etc/openvpn/ca/pki/issued/OVPNserver2020.crt \ + /etc/openvpn/server/pki/ +$ sudo cp /etc/openvpn/ca/pki/ca.crt \ + /etc/openvpn/server/pki/ +``` + +接下来,生成 [Diffie-Hellman][6] 参数,以便客户端和服务器可以交换会话密钥: + +``` +$ cd /etc/openvpn/server +$ sudo /etc/openvpn/easy-rsa/easyrsa gen-dh +``` + +### 快完成了 + +本系列的下一篇文章将演示如何配置和启动你刚刚构建的 0penVPN 服务器。 + +本文的部分内容改编自 D. Greg Scott 的博客,并经许可重新发布。 + +-------------------------------------------------------------------------------- + +via: https://opensource.com/article/21/7/openvpn-router + +作者:[D. Greg Scott][a] +选题:[lujun9972][b] +译者:[perfiffer](https://github.com/perfiffer) +校对:[wxy](https://github.com/wxy) + +本文由 [LCTT](https://github.com/LCTT/TranslateProject) 原创编译,[Linux中国](https://linux.cn/) 荣誉推出 + +[a]: https://opensource.com/users/greg-scott +[b]: https://github.com/lujun9972 +[1]: https://opensource.com/sites/default/files/styles/image-full-size/public/lead-images/openwires_fromRHT_520_0612LL.png?itok=PqZi55Ab (Open ethernet cords.) +[2]: https://openvpn.net/ +[3]: https://linux.cn/article-13680-1.html +[4]: https://community.openvpn.net/openvpn/wiki +[5]: https://openvpn.net/community-resources/ +[6]: https://en.wikipedia.org/wiki/Diffie%E2%80%93Hellman_key_exchange +[7]: https://www.dgregscott.com/how-to-build-a-vpn-in-four-easy-steps-without-spending-one-penny/ diff --git a/published/202108/20210804 Move files in the Linux terminal.md b/published/202108/20210804 Move files in the Linux terminal.md new file mode 100644 index 0000000000..c198ff28ea --- /dev/null +++ b/published/202108/20210804 Move files in the Linux terminal.md @@ -0,0 +1,52 @@ +[#]: subject: (Move files in the Linux terminal) +[#]: via: (https://opensource.com/article/21/8/move-files-linux) +[#]: author: (Seth Kenlon https://opensource.com/users/seth) +[#]: collector: (lujun9972) +[#]: translator: (geekpi) +[#]: reviewer: (wxy) +[#]: publisher: (wxy) +[#]: url: (https://linux.cn/article-13677-1.html) + +基础:在 Linux 终端中移动文件 +====== + +> 使用 mv 命令将一个文件从一个位置移动到另一个位置。 + +![](https://img.linux.net.cn/data/attachment/album/202108/13/112248lnal8a0qz50zqzld.jpg) + +要在有图形界面的计算机上移动一个文件,你要打开该文件当前所在的文件夹,然后打开另一个窗口导航到你想把文件移到的文件夹。最后,你把文件从一个窗口拖到另一个窗口。 + +要在终端中移动文件,你可以使用 `mv` 命令将文件从一个位置移动到另一个位置。 + +``` +$ mv example.txt ~/Documents + +$ ls ~/Documents +example.txt +``` + +在这个例子中,你已经把 `example.txt` 从当前文件夹移到了主目录下的 `Documents` 文件夹中。 + +只要你知道一个文件在 _哪里_,又想把它移到 _哪里_ 去,你就可以把文件从任何地方移动到任何地方,而不管你在哪里。与在一系列窗口中浏览你电脑上的所有文件夹以找到一个文件,然后打开一个新窗口到你想让该文件去的地方,再拖动该文件相比,这可以大大节省时间。 + +默认情况下,`mv` 命令完全按照它被告知的那样做:它将一个文件从一个位置移动到另一个位置。如果在目标位置已经存在一个同名的文件,它将被覆盖。为了防止文件在没有警告的情况下被覆盖,请使用 `--interactive`(或简写 `-i`)选项。 + +``` +$ mv -i example.txt ~/Documents +mv: overwrite '/home/tux/Documents/example.txt'? +``` + +-------------------------------------------------------------------------------- + +via: https://opensource.com/article/21/8/move-files-linux + +作者:[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/ch01s05.svg_.png?itok=PgKQEDZ7 (Moving files) diff --git a/published/202108/20210805 Configure your OpenVPN server on Linux.md b/published/202108/20210805 Configure your OpenVPN server on Linux.md new file mode 100644 index 0000000000..14efcf70ca --- /dev/null +++ b/published/202108/20210805 Configure your OpenVPN server on Linux.md @@ -0,0 +1,161 @@ +[#]: subject: "Configure your OpenVPN server on Linux" +[#]: via: "https://opensource.com/article/21/7/openvpn-firewall" +[#]: author: "D. Greg Scott https://opensource.com/users/greg-scott" +[#]: collector: "lujun9972" +[#]: translator: "geekpi" +[#]: reviewer: "turbokernel" +[#]: publisher: "wxy" +[#]: url: "https://linux.cn/article-13707-1.html" + +如何在免费 WiFi 中保护隐私(三) +====== + +> 在你安装了 0penVPN 之后,是时候配置它了。 + +![](https://img.linux.net.cn/data/attachment/album/202108/22/081708mvgwwzv8f58vgwqz.jpg) + +0penVPN 在两点之间建立一条加密的隧道,阻止第三方访问你的网络流量。通过设置你的 “虚拟专用网络” 服务,你就成为你自己的 “虚拟专用网络” 供应商。许多流行的 “虚拟专用网络” 服务已支持 [0penVPN][2],所以当你可以掌控自己的网络时,为什么还要将你的网络连接绑定到特定的提供商呢? + +本系列中的 [第一篇][3] 展示了如何安装和配置一台作为你的 0penVPN 服务器的 Linux 计算机。,[第二篇][4] 演示了如何安装和配置 0penVPN 服务器软件。这第三篇文章演示了如何在认证成功的情况下启动 0penVPN。 + +要设置一个 0penVPN 服务器,你必须: + + * 创建一个配置文件。 + * 使用 `sysctl` 设置`net.ipv4.ip_forward = 1` 以启用路由。 + * 为所有的配置和认证文件设置适当的所有权,以便使用非 root 账户运行 0penVPN 服务器守护程序。 + * 设置 0penVPN 加载适当的配置文件启动。 + * 配置你的防火墙。 + +### 配置文件 + +你必须在 `/etc/openvpn/server/` 中创建一个服务器配置文件。如果你想的话,你可以从头开始,0penVPN 包括了几个配置示例示例文件,可以以此作为开始。看看 `/usr/share/doc/openvpn/sample/sample-config-files/` 就知道了。 + +如果你想手工建立一个配置文件,可以从 `server.conf` 或 `roadwarrior-server.conf` 开始(视情况而定),并将你的配置文件放在 `/etc/openvpn/server` 中。这两个文件都有大量的注释,所以请阅读注释并根据你的情况作出决定。 + +你可以使用我预先建立的服务器和客户端配置文件模板和 `sysctl` 文件来打开网络路由,从而节省时间和麻烦。这个配置还包括自定义记录连接和断开的情况。它在 0penVPN 服务器的 `/etc/openvpn/server/logs` 中保存日志。 + +如果你使用我的模板,你需要使用你的 IP 地址和主机名编辑它们。 + +要使用我的预建配置模板、脚本和 `sysctl` 来打开 IP 转发,请下载我的脚本: + +``` +$ curl \ + https://www.dgregscott.com/ovpn/OVPNdownloads.sh > \ + OVPNdownloads.sh +``` + +阅读该脚本,了解它的工作内容。下面是它的运行概述: + + * 在你的 0penVPN 服务器上创建适当的目录 + * 从我的网站下载服务器和客户端的配置文件模板 + * 下载我的自定义脚本,并以正确的权限把它们放到正确的目录中 + * 下载 `99-ipforward.conf` 并把它放到 `/etc/sysctl.d` 中,以便在下次启动时打开 IP 转发功能 + * 为 `/etc/openvpn` 中的所有内容设置了所有权 + +当你确定你理解了这个脚本的作用,就使它可执行并运行它: + +``` +$ chmod +x OVPNdownloads.sh +$ sudo ./OVPNdownloads.sh +``` + +下面是它复制的文件(注意文件的所有权): + +``` +$ ls -al -R /etc/openvpn +/etc/openvpn: +total 12 +drwxr-xr-x. 4 openvpn openvpn 34 Apr 6 20:35 . +drwxr-xr-x. 139 root root 8192 Apr 6 20:35 .. +drwxr-xr-x. 2 openvpn openvpn 33 Apr 6 20:35 client +drwxr-xr-x. 4 openvpn openvpn 56 Apr 6 20:35 server + +/etc/openvpn/client: +total 4 +drwxr-xr-x. 2 openvpn openvpn 33 Apr 6 20:35 . +drwxr-xr-x. 4 openvpn openvpn 34 Apr 6 20:35 .. +-rw-r--r--. 1 openvpn openvpn 1764 Apr 6 20:35 OVPNclient2020.ovpn + +/etc/openvpn/server: +total 4 +drwxr-xr-x. 4 openvpn openvpn 56 Apr 6 20:35 . +drwxr-xr-x. 4 openvpn openvpn 34 Apr 6 20:35 .. +drwxr-xr-x. 2 openvpn openvpn 59 Apr 6 20:35 ccd +drwxr-xr-x. 2 openvpn openvpn 6 Apr 6 20:35 logs +-rw-r--r--. 1 openvpn openvpn 2588 Apr 6 20:35 OVPNserver2020.conf + +/etc/openvpn/server/ccd: +total 8 +drwxr-xr-x. 2 openvpn openvpn 59 Apr 6 20:35 . +drwxr-xr-x. 4 openvpn openvpn 56 Apr 6 20:35 .. +-rwxr-xr-x. 1 openvpn openvpn 917 Apr 6 20:35 client-connect.sh +-rwxr-xr-x. 1 openvpn openvpn 990 Apr 6 20:35 client-disconnect.sh + +/etc/openvpn/server/logs: +total 0 +drwxr-xr-x. 2 openvpn openvpn 6 Apr 6 20:35 . +drwxr-xr-x. 4 openvpn openvpn 56 Apr 6 20:35 .. +``` + +下面是 `99-ipforward.conf` 文件: + +``` +# Turn on IP forwarding. OpenVPN servers need to do routing +net.ipv4.ip_forward = 1 +``` + +编辑 `OVPNserver2020.conf` 和 `OVPNclient2020.ovpn` 以包括你的 IP 地址。同时,编辑 `OVPNserver2020.conf` 以包括你先前的服务器证书名称。稍后,你将重新命名和编辑 `OVPNclient2020.ovpn` 的副本,以便在你的客户电脑上使用。以 `***?` 开头的块显示了你要编辑的地方。 + +### 文件所有权 + +如果你使用了我网站上的自动脚本,文件所有权就已经到位了。如果没有,你必须确保你的系统有一个叫 `openvpn` 的用户,并且是 `openvpn` 组的成员。你必须将 `/etc/openvpn` 中的所有内容的所有权设置为该用户和组。如果你不确定该用户和组是否已经存在,这样做也是安全的,因为 `useradd` 会拒绝创建一个与已经存在的用户同名的用户: + +``` +$ sudo useradd openvpn +$ sudo chown -R openvpn.openvpn /etc/openvpn +``` + +### 防火墙 + +如果你在步骤 1 中启用 firewalld 服务,那么你的服务器的防火墙服务可能默认不允许 “虚拟专用网络” 流量。使用 [firewall-cmd 命令][5],你可以启用 0penVPN 服务,它可以打开必要的端口并按需路由流量: + +``` +$ sudo firewall-cmd --add-service openvpn --permanent +$ sudo firewall-cmd --reload +``` + +没有必要在 iptables 的迷宫中迷失方向! + +### 启动你的服务器 + +现在你可以启动 0penVPN 服务器了。为了让它在重启后自动运行,使用 `systemctl` 的 `enable` 子命令: + +``` +systemctl enable --now openvpn-server@OVPNserver2020.service +``` + +### 最后的步骤 + +本文的第四篇也是最后一篇文章将演示如何设置客户端,以便远程连接到你的 0penVPN。 + +_本文基于 D.Greg Scott 的[博客][6],经许可后重新使用。_ + +-------------------------------------------------------------------------------- + +via: https://opensource.com/article/21/7/openvpn-firewall + +作者:[D. Greg Scott][a] +选题:[lujun9972][b] +译者:[geekpi](https://github.com/geekpi) +校对:[turbokernel](https://github.com/turbokernel) + +本文由 [LCTT](https://github.com/LCTT/TranslateProject) 原创编译,[Linux中国](https://linux.cn/) 荣誉推出 + +[a]: https://opensource.com/users/greg-scott +[b]: https://github.com/lujun9972 +[1]: https://opensource.com/sites/default/files/styles/image-full-size/public/lead-images/security-lock-password.jpg?itok=KJMdkKum (Lock) +[2]: https://openvpn.net/ +[3]: https://linux.cn/article-13680-1.html +[4]: https://linux.cn/article-13702-1.html +[5]: https://www.redhat.com/sysadmin/secure-linux-network-firewall-cmd +[6]: https://www.dgregscott.com/how-to-build-a-vpn-in-four-easy-steps-without-spending-one-penny/ diff --git a/published/202108/20210806 Access OpenVPN from a client computer.md b/published/202108/20210806 Access OpenVPN from a client computer.md new file mode 100644 index 0000000000..b09363db70 --- /dev/null +++ b/published/202108/20210806 Access OpenVPN from a client computer.md @@ -0,0 +1,130 @@ +[#]: subject: "Access OpenVPN from a client computer" +[#]: via: "https://opensource.com/article/21/7/openvpn-client" +[#]: author: "D. Greg Scott https://opensource.com/users/greg-scott" +[#]: collector: "lujun9972" +[#]: translator: "perfiffer" +[#]: reviewer: "wxy" +[#]: publisher: "wxy" +[#]: url: "https://linux.cn/article-13714-1.html" + +如何在免费 WiFi 中保护隐私(四) +====== + +> 在 Linux 上安装好“虚拟专用网络” 之后,是时候使用它了。 + +![](https://img.linux.net.cn/data/attachment/album/202108/24/101214ng2afee2gmefgj5z.jpg) + +0penVPN 在两点之间创建了一个加密通道,以阻止第三方访问你的网络流量数据。通过设置你的 “虚拟专用网络” 服务,你可以成为你自己的 “虚拟专用网络” 服务商。许多流行的 “虚拟专用网络” 服务都使用 0penVPN,所以当你可以掌控自己的网络时,为什么还要将你的网络连接绑定到特定的提供商呢? + +本系列的 [第一篇文章][3] 安装了一个“虚拟专用网络” 的服务器,[第二篇文章][4] 介绍了如何安装和配置一个 0penVPN 服务软件,[第三篇文章][5] 解释了如何配置防火墙并启动你的 0penVPN 服务。第四篇也是最后一篇文章将演示如何从客户端计算机使用你的 0penVPN 服务器。这就是你做了前三篇文章中所有工作的原因! + +### 创建客户端证书 + +请记住,0penVPN 的身份验证方法要求服务器和客户端都拥有某些东西(证书)并知道某些东西(口令)。是时候设置它了。 + +首先,为你的客户端计算机创建一个客户端证书和一个私钥。在你的 0penVPN 服务器上,生成证书请求。它会要求你输入密码;确保你记住它: + +``` +$ cd /etc/openvpn/ca +$ sudo /etc/openvpn/easy-rsa/easyrsa \ + gen-req greglaptop +``` + +本例中,`greglaptop` 是创建证书的客户端计算机主机名。 + +无需将请求导入证书颁发机构(CA),因为它已经存在。审查它以确保请求存在: + +``` +$ cd /etc/openvpn/ca +$ /etc/openvpn/easy-rsa/easyrsa \ + show-req greglaptop +``` + +你也可以以客户端身份签署请求: + +``` +$ /etc/openvpn/easy-rsa/easyrsa \ + sign-req client greglaptop +``` + +### 安装 0penVPN 客户端软件 + +在 Linux 系统上,网络管理器可能已经包含了一个 0penVPN 客户端。如果没有,你可以安装插件: + +``` +$ sudo dnf install NetworkManager-openvpn +``` + +在 Windows 系统上,你必须从 0penVPN 下载网页下载和安装 0penVPN 客户端。启动安装程序并按照提示操作。 + +### 复制证书和私钥到客户端 + +现在你的客户端需要你为其生成的身份验证凭据。你在服务器上生成了这些,因此你必须将它们传输到你的客户端。我推荐使用 SSH 来完成传输。在 Linux 系统上,通过 `scp` 命令实现。在 Windows 系统上,你可以以管理员身份运行 [WinSCP][6] 来推送证书和密钥。 + +假设客户端名称为 `greglaptop`,那么证书和私钥的文件名以及服务的位置如下: + +``` +/etc/openvpn/ca/pki/issued/greglaptop.crt +/etc/openvpn/ca/pki/private/greglaptop.key +/etc/openvpn/ca/pki/issued/ca.crt +``` + +在 Linux 系统上,复制这些文件到 `/etc/pki/tls/certs` 目录。在 Windows 系统上,复制它们到 `C:\Program Files\OpenVPN\config` 目录。 + +### 复制和自定义客户端配置文件 + +在 Linux 系统上,你可以复制服务器上的 `/etc/openvpn/client/OVPNclient2020.ovpn` 文件到 `/etc/NetworkManager/system-connections/` 目录,或者你也可以导航到系统设置中的网络管理器添加一个“虚拟专用网络” 连接。 + +连接类型选择“证书(TLS)Certificates(TLS)”。告知网络管理器你从服务器上复制的证书和密钥。 + +![VPN displayed in Network Manager][7] + +在 Windows 系统上,以管理员身份运行 WinSCP,将服务器上的客户端配置模板 `/etc/openvpn/client/OVPNclient2020.ovpn` 文件复制到客户端上的 `C:\Program Files\OpenVPN\config` 目录。然后: + + * 重命名它以匹配上面的证书。 + * 更改 CA 证书、客户端证书和密钥的名称以匹配上面从服务器复制的名称。 + * 修改 IP 信息,以匹配你的网络。 + +你需要超级管理员权限来编辑客户端配置文件。最简单的方式就是以管理员身份启动一个 CMD 窗口,然后从管理员 CMD 窗口启动记事本来编辑此文件。 + +### 将你的客户端连接到服务器 + +在 Linux 系统上,网络管理器会显示你的 “虚拟专用网络” 连接。选择它进行连接。 + +![Add a connection in Network Manager][9] + +在 Windows 系统上,启动 0penVPN 图形用户界面。它会在任务栏右侧的 Windows 系统托盘中生成一个图标,通常位于 Windows 桌面的右下角。右键单击图标以连接、断开连接或查看状态。 + +对于第一次连接,编辑客户端配置文件的 `remote` 行以使用 0penVPN 服务器的内部 IP 地址。通过右键单击 Windows 系统托盘中的 0penVPN 图标并单击“连接Connect”,从办公室网络内部连接到服务器。调试此连接,这应该可以找到并解决问题,而不会出现任何防火墙问题,因为客户端和服务器都在防火墙的同一侧。 + +接下来,编辑客户端配置文件的 `remote` 行以使用 0penVPN 服务器的公共 IP 地址。将 Windows 客户端连接到外部网络并进行连接。调试有可能的问题。 + +### 安全连接 + +恭喜!你已经为其他客户端系统准备好了 0penVPN 网络。对其余客户端重复设置步骤。你甚至可以使用 Ansible 来分发证书和密钥并使其保持最新。 + +本文基于 D.Greg Scott 的 [博客][10],经许可后重新使用。 + +-------------------------------------------------------------------------------- + +via: https://opensource.com/article/21/7/openvpn-client + +作者:[D. Greg Scott][a] +选题:[lujun9972][b] +译者:[perfiffer](https://github.com/perfiffer) +校对:[wxy](https://github.com/wxy) + +本文由 [LCTT](https://github.com/LCTT/TranslateProject) 原创编译,[Linux中国](https://linux.cn/) 荣誉推出 + +[a]: https://opensource.com/users/greg-scott +[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://openvpn.net/ +[3]: https://linux.cn/article-13680-1.html +[4]: https://linux.cn/article-13702-1.html +[5]: https://linux.cn/article-13707-1.html +[6]: https://winscp.net/eng/index.php +[7]: https://opensource.com/sites/default/files/uploads/network-manager-profile.jpg (VPN displayed in Network Manager) +[8]: https://creativecommons.org/licenses/by-sa/4.0/ +[9]: https://opensource.com/sites/default/files/uploads/network-manager-connect.jpg (Add a“虚拟专用网络” connection in Network Manager) +[10]: https://www.dgregscott.com/how-to-build-a-vpn-in-four-easy-steps-without-spending-one-penny/ diff --git a/published/202108/20210806 Change your Linux Desktop Wallpaper Every Hour -Here-s How.md b/published/202108/20210806 Change your Linux Desktop Wallpaper Every Hour -Here-s How.md new file mode 100644 index 0000000000..ec970dc530 --- /dev/null +++ b/published/202108/20210806 Change your Linux Desktop Wallpaper Every Hour -Here-s How.md @@ -0,0 +1,183 @@ +[#]: subject: "Change your Linux Desktop Wallpaper Every Hour [Here’s How]" +[#]: via: "https://www.debugpoint.com/2021/08/change-wallpaper-every-hour/" +[#]: author: "Arindam https://www.debugpoint.com/author/admin1/" +[#]: collector: "lujun9972" +[#]: translator: "geekpi" +[#]: reviewer: "wxy" +[#]: publisher: "wxy" +[#]: url: "https://linux.cn/article-13701-1.html" + +如何每小时改变你的 Linux 桌面壁纸 +====== + +![](https://img.linux.net.cn/data/attachment/album/202108/19/223054ga6b8a8paa61u31u.jpg) + +这个 shell 脚本 `styli.sh` 可以帮助你每小时自动改变你的 Linux 桌面壁纸,并且有几个选项。 + +用一张漂亮的壁纸来开始你的一天,你的桌面让人耳目一新。但寻找壁纸,然后保存,最终设置为壁纸,是非常麻烦的。所有这些步骤都可以通过这个叫做 [styli.sh][1] 的脚本完成。 + +### styli.sh - 每小时改变你的 Linux 桌面壁纸 + +这是一个 shell 脚本,你可以从 GitHub 上下载。当运行时,它从 Reddit 的热门版块中获取壁纸并将其设置为你的壁纸。 + +该脚本适用于所有流行的桌面环境,如 GNOME、KDE Plasma、Xfce 和 Sway 窗口管理器。 + +它有很多功能,你可以通过 crontab 来运行这个脚本,并在特定的时间间隔内得到一张新的壁纸。 + +### 下载并安装、运行 + +打开一个终端,并克隆 GitHub 仓库。如果没有安装的话,你需要安装 [feh][2] 和 git。 + +``` +git clone https://github.com/thevinter/styli.sh +cd styli.sh +``` + +要设置随机壁纸,根据你的桌面环境运行以下内容。 + +![Change your Linux Desktop Wallpaper Every Hour using styli.sh][3] + +GNOME: + +``` +./styli.sh -g +``` + +Xfce: + +``` +./styli.sh -x +``` + +KDE Plasma: + +``` +./styli.sh -k +``` + +Sway: + +``` +./styli.sh -y +``` + +### 每小时改变一次 + +要每小时改变背景,请运行以下命令: + +``` +crontab -e +``` + +并在打开的文件中加入以下内容。不要忘记改变脚本路径。 + +``` +@hourly script/path/styli.sh +``` + +### 改变版块 + +在源目录中,有一个名为 `subreddits` 的文件。它填满了一些标准的版块。如果你想要更多一些,只需在文件末尾添加版块名称。 + +### 更多配置选项 + +壁纸的类型、大小,也可以设置。以下是这个脚本的一些独特的配置选项。 + +设置一个随机的 1920×1080 背景: + +``` +./styli.sh +``` + +指定一个所需的宽度或高度: + +``` +./styli.sh -w 1080 -h 720 +./styli.sh -w 2560 +./styli.sh -h 1440 +``` + +根据搜索词设置壁纸: + +``` +./styli.sh -s island +./styli.sh -s “sea sunset” +./styli.sh -s sea -w 1080 +``` + +从设定的一个版块中获得一个随机壁纸: + +注意:宽度/高度/搜索参数对 reddit 不起作用。 + +``` +./styli.sh -l reddit +``` + +从一个自定义的版块获得随机壁纸: + +``` +./styli.sh -r +./styli.sh -r wallpaperdump +``` + +使用内置的 `feh -bg` 选项: + +``` +./styli.sh -b +./styli.sh -b bg-scale -r widescreen-wallpaper +``` + +添加自定义的 feh 标志: + +``` +./styli.sh -c +./styli.sh -c –no-xinerama -r widescreen-wallpaper +``` + +自动设置终端的颜色: + +``` +./styli.sh -p +``` + +使用 nitrogen 而不是 feh: + +``` +./styli.sh -n +``` + +使用 nitrogen 更新多个屏幕: + +``` +./styli.sh -n -m +``` + +从一个目录中选择一个随机的背景: + +``` +./styli.sh -d /path/to/dir +``` + +### 最后说明 + +这是一个独特且方便的脚本,内存占用小,可以直接在一个时间间隔内比如一个小时获取图片。让你的桌面看起来 [新鲜且高效][4]。如果你不喜欢这些壁纸,你可以简单地从终端再次运行脚本来循环使用。 + +你喜欢这个脚本吗?或者你知道有什么像这样的壁纸切换器吗?请在下面的评论栏里告诉我。 + +-------------------------------------------------------------------------------- + +via: https://www.debugpoint.com/2021/08/change-wallpaper-every-hour/ + +作者:[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://github.com/thevinter/styli.sh +[2]: https://feh.finalrewind.org/ +[3]: https://www.debugpoint.com/blog/wp-content/uploads/2021/08/Change-your-Linux-Desktop-Wallpaper-Every-Hour-using-styli.sh_.jpg +[4]: https://www.debugpoint.com/category/themes \ No newline at end of file diff --git a/published/202108/20210807 How to Install Java on Fedora Linux.md b/published/202108/20210807 How to Install Java on Fedora Linux.md new file mode 100644 index 0000000000..4a158e5714 --- /dev/null +++ b/published/202108/20210807 How to Install Java on Fedora Linux.md @@ -0,0 +1,102 @@ +[#]: subject: "How to Install Java on Fedora Linux" +[#]: via: "https://itsfoss.com/install-java-fedora/" +[#]: author: "Abhishek Prakash https://itsfoss.com/author/abhishek/" +[#]: collector: "lujun9972" +[#]: translator: "geekpi" +[#]: reviewer: "wxy" +[#]: publisher: "wxy" +[#]: url: "https://linux.cn/article-13694-1.html" + +如何在 Fedora Linux 上安装 Java +====== + +![](https://img.linux.net.cn/data/attachment/album/202108/18/102444nfsktbup4b7bfp88.jpg) + +不管是爱它还是恨它,都很难避开 Java。 + +Java 仍然是一种非常流行的编程语言,在学校里教,在企业里用。 + +如果你想使用基于 Java 的工具或用 Java 编程,你就需要在你的系统上安装 Java。 + +这就变得很混乱,因为围绕着 Java 有很多技术术语。 + + * Java 开发工具包Java Development Kit(JDK)用于创建 Java 程序 + * Java 运行环境Java Runtime Environment(JRE)或 Java 虚拟机(JVM),用于运行 Java 程序。 + +除此之外,你还会遇到 [OpenJDK][1] 和 [Oracle Java SE][2]。推荐使用 OpenJDK ,因为它是开源的。如果你有专门的需求,那么你应该选择 Oracle Java SE。 + +还有一件事。即使是 OpenJDK 也有几个版本可供选择。在写这篇文章的时候,Fedora 34 有 OpenJDK 1.8、OpenJDK 11 和 OpenJDK 16 可用。 + +你可以自行决定想要哪个Java版本。 + +### 在 Fedora Linux 上安装 Java + +首先,检查是否已经安装了 Java,以及它是哪个版本。我不是在开玩笑。Fedora 通常预装了 Java。 + +要检查它,请使用以下命令: + +``` +java -version +``` + +正如你在下面的截图中看到的,我的 Fedora 系统上安装了 Java 11(OpenJDK 11)。 + +![Check Java version][3] + +假设你想安装另一个版本的 Java。你可以用下面的命令检查可用的选项: + +``` +sudo dnf search openjdk +``` + +这里的 `sudo` 不是必须的,但它会刷新 `sudo` 用户的元数据,这在你安装另一个版本的 Java 时会有帮助。 + +上面的命令将显示很多输出,其中有很多看起来相似的软件包。你必须专注于最初的几个词来理解不同的版本。 + +![Available Java versions in Fedora][4] + +例如,要安装 Java 8(OpenJDK 1.8),包的名字应该是 `java-1.8.0-openjdk.x86_64` 或者 `java-1.8.0-openjdk`。用它来安装: + +``` +sudo dnf install java-1.8.0-openjdk.x86_64 +``` + +![Install Java Fedora][5] + +这就好了。现在你的系统上同时安装了 Java 11 和 Java 8。但你将如何使用其中一个呢? + +#### 在 Fedora 上切换 Java 版本 + +你正在使用的 Java 版本保持不变,除非你明确改变它。使用这个命令来列出系统上安装的 Java 版本: + +``` +sudo alternatives --config java +``` + +你会注意到在 Java 版本前有一个数字。Java 版本前的 `+` 号表示当前正在使用的 Java 版本。 + +你可以指定这个数字来切换 Java 版本。因此,在下面的例子中,如果我输入 2,它将把系统中的 Java 版本从 Java 11 改为 Java 8。 + +![Switching between installed Java versions][6] + +这就是你在 Fedora 上安装 Java 所需要做的一切。 + +-------------------------------------------------------------------------------- + +via: https://itsfoss.com/install-java-fedora/ + +作者:[Abhishek Prakash][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/abhishek/ +[b]: https://github.com/lujun9972 +[1]: https://openjdk.java.net/ +[2]: https://www.oracle.com/java/technologies/javase-downloads.html +[3]: https://i1.wp.com/itsfoss.com/wp-content/uploads/2021/08/check-java-version-fedora.png?resize=800%2C271&ssl=1 +[4]: https://itsfoss.com/wp-content/uploads/2021/08/available-java-versions-fedora-800x366.webp +[5]: https://i0.wp.com/itsfoss.com/wp-content/uploads/2021/08/install-java-fedora.png?resize=800%2C366&ssl=1 +[6]: https://i1.wp.com/itsfoss.com/wp-content/uploads/2021/08/switch-java-versions-fedora.png?resize=800%2C513&ssl=1 diff --git a/published/202108/20210807 It-s Time for Ubuntu to Opt for a Hybrid Rolling Release Model.md b/published/202108/20210807 It-s Time for Ubuntu to Opt for a Hybrid Rolling Release Model.md new file mode 100644 index 0000000000..041a45180f --- /dev/null +++ b/published/202108/20210807 It-s Time for Ubuntu to Opt for a Hybrid Rolling Release Model.md @@ -0,0 +1,73 @@ +[#]: subject: "It’s Time for Ubuntu to Opt for a Hybrid Rolling Release Model" +[#]: via: "https://news.itsfoss.com/ubuntu-hybrid-release-model/" +[#]: author: "Abhishek https://news.itsfoss.com/author/root/" +[#]: collector: "lujun9972" +[#]: translator: "wxy" +[#]: reviewer: "wxy" +[#]: publisher: "wxy" +[#]: url: "https://linux.cn/article-13666-1.html" + +是时候让 Ubuntu 选择混合滚动发布模式了 +====== + +> 在两个 LTS 版本之间有三个短期版本。Ubuntu 应该用滚动发布模式来取代它们。 + +![](https://i0.wp.com/news.itsfoss.com/wp-content/uploads/2021/08/Ubuntu-hybrid-release-model.jpg?w=1200&ssl=1) + +即使你不是 Ubuntu 的用户,你可能也知道它的发布模式。 + +有一个 [长期支持(LTS)版本][1],每两年发布一次,并有五年的支持。在这两个 LTS 版本之间,我们可以看到三个非 LTS 版本,它们的发布时间间隔为 6 个月。 + +LTS 版本会保持内核不会变化(除非你选择 [HWE 内核][2]),它还维持了各种软件组件不变以提供稳定的生产环境。 + +介于两者之间的非 LTS 版 Ubuntu 具有 Ubuntu 的新功能、更新一些的内核、新的桌面环境以及 Ubuntu 软件库中的各种软件的新版本。 + +这些非 LTS 版本作为“试验场”,为最终在 LTS 版本中出现的功能提供测试,这已不是什么秘密。 + +这就是为什么我建议摆脱这些中间版本,在 LTS 版本之间选择 [滚动发布][3] 模式。个中原因,请听我说。 + +### 在 LTS 发布之间进行滚动开发 + +六个月一次的发布计划给 Ubuntu 开发者制定了一个紧凑的工作时间表。这是一个好的方法,它可以使他们的目标集中在一个适当的路线图上。 + +但是,这也为在每个版本中提供“更多”新功能带来了额外的压力。如果时间很短,这不可能总是做到。还记得 [Ubuntu 不得不从 21.04 版本中删除 GNOME 40][4] 吗?因为开发者没有足够的时间来完成它。 + +另外,最终用户(比如你和我)想选择留在非 LTS 版本中也是不可行的。其支持在九个月后结束,这意味着即使你没有立即升级到下一个非 LTS 的 Ubuntu 版本,最终你也不得不这样做。如果你在 6 个月内没升级,那你可能就得在 9 个月内升级。 + +我知道你会说,升级 Ubuntu 版本很简单。点击几下,良好的网速和一个潜在的备份就可以让你在新的 Ubuntu 版本上没有什么麻烦。 + +我的问题是,为什么要这么麻烦。滚动发布会更简单。让升级在 LTS 版本之间进行。 + +开发人员在新功能准备好的时候发布。用户随着系统更新不断得到升级,而不是每 6 个月或 9 个月做一次“重大升级”。 + +你看,那些选择非 LTS 版本的人是那些想要新功能的人,让他们通过滚动发布获得新功能。LTS 的发布时间表保持不变,每两年来一次。 + +### Bug 测试?像其他滚动发布的版本一样做个测试分支好了 + +当我说滚动发布时,我并不是指像 Arch Linux 那样的滚动。它应该是像 Manjaro 那样的滚动。换句话说,在测试后推出升级版,而不是直接在野外发布。 + +目前,新的 Ubuntu 版本有测试版,以便早期采用者可以测试它并向开发者提供反馈。这可以通过保留测试和稳定分支来实现,就像许多其他滚动发布的版本一样。 + +### 你对滚动发布怎么看? + +我知道 Ubuntu 的铁杆用户期待着每一次的发布。代号、吉祥物、艺术品和墙纸,这些都是 Ubuntu 的传统的一部分。我们应该打破这种传统吗? + +这只是我的看法,我很想听听你的看法。Ubuntu 应该选择这种混合滚动模式还是坚持目前的模式?你怎么看呢? + +-------------------------------------------------------------------------------- + +via: https://news.itsfoss.com/ubuntu-hybrid-release-model/ + +作者:[Abhishek][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://news.itsfoss.com/author/root/ +[b]: https://github.com/lujun9972 +[1]: https://itsfoss.com/long-term-support-lts/ +[2]: https://itsfoss.com/ubuntu-hwe-kernel/ +[3]: https://itsfoss.com/rolling-release/ +[4]: https://news.itsfoss.com/no-gnome-40-in-ubuntu-21-04/ diff --git a/published/202108/20210807 Remove files and folders in the Linux terminal.md b/published/202108/20210807 Remove files and folders in the Linux terminal.md new file mode 100644 index 0000000000..006cc5e784 --- /dev/null +++ b/published/202108/20210807 Remove files and folders in the Linux terminal.md @@ -0,0 +1,84 @@ +[#]: subject: "Remove files and folders in the Linux terminal" +[#]: via: "https://opensource.com/article/21/8/remove-files-linux-terminal" +[#]: author: "Seth Kenlon https://opensource.com/users/seth" +[#]: collector: "lujun9972" +[#]: translator: "unigeorge" +[#]: reviewer: "wxy" +[#]: publisher: "wxy" +[#]: url: "https://linux.cn/article-13687-1.html" + +基础:在 Linux 终端中删除文件和文件夹 +====== + +> 本教程讲述了如何在 Linux 终端中安全地删除文件和文件夹。 + +![](https://img.linux.net.cn/data/attachment/album/202108/16/110943z9boolgobdlyoiyo.jpg) + +要想使用图形化界面删除计算机上的文件,你可能会直接将文件或文件夹拖拽到 “垃圾箱” 或 “回收站”。或者你也可以选择要删除的文件或文件夹,右键单击并选择 **删除**。 + +而在终端中删除文件或文件夹时并没有垃圾箱一说(至少默认情况下没有)。在图形化桌面上,`Trash`(即垃圾箱文件夹)是一个受保护的目录,保护机制可以防止用户不小心将该目录删除,或将其从默认位置移动从而导致找不到它。Trash 本质不过是一个被高度管理的文件夹,因此你可以创建自己的 Trash 文件夹以在终端中使用。 + +### 为终端设置一个垃圾箱 + +在家目录中创建一个名为 `Trash` 的目录: + +``` +$ mkdir ~/Trash +``` + +### 删除文件 + +要删除文件或文件夹时,使用 `mv` 命令将文件或文件夹移至 `Trash` 中: + +``` +$ mv example.txt ~/Trash +``` + +### 永久删除文件或文件夹 + +当你准备从系统中永久删除某个文件或文件夹时,可以使用 `rm` 命令清除垃圾箱文件夹中的所有数据。通过将 `rm` 命令指向星号(`*`),可以删除 `Trash` 文件夹内的所有文件和文件夹,而不会删除 `Trash` 文件夹本身。因为用户可以方便且自由地创建目录,所以即使不小心删除了 `Trash` 文件夹,你也可以再次新建一个。 + +``` +$ rm --recursive ~/Trash/* +``` + +### 删除空目录 + +删除空目录有一个专门的命令 `rmdir`,它只能用来删除空目录,从而保护你免受递归删除错误的影响。 + +``` +$ mkdir full +$ touch full/file.txt +$ rmdir full +rmdir: failed to remove 'full/': Directory not empty + +$ mkdir empty +$ rmdir empty +``` + +### 更好的删除方式 + +此外还有一些并没有默认安装在终端上的 [删除文件命令][2],你可以从软件库安装它们。这些命令管理和使用的 `Trash` 文件夹与你在桌面模式使用的是同一个(而非你自己单独创建的),从而使删除文件变得更加方便。 + +``` +$ trash ~/example.txt +$ trash --list +example.txt +$ trash --empty +``` + +-------------------------------------------------------------------------------- + +via: https://opensource.com/article/21/8/remove-files-linux-terminal + +作者:[Seth Kenlon][a] +选题:[lujun9972][b] +译者:[unigeorge](https://github.com/unigeorge) +校对:[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/ch01s10.svg_.png?itok=p07au80e (Removing files) +[2]: https://www.redhat.com/sysadmin/recover-file-deletion-linux diff --git a/published/202108/20210811 Monitor your Linux system in your terminal with procps-ng.md b/published/202108/20210811 Monitor your Linux system in your terminal with procps-ng.md new file mode 100644 index 0000000000..ebfa999849 --- /dev/null +++ b/published/202108/20210811 Monitor your Linux system in your terminal with procps-ng.md @@ -0,0 +1,188 @@ +[#]: subject: "Monitor your Linux system in your terminal with procps-ng" +[#]: via: "https://opensource.com/article/21/8/linux-procps-ng" +[#]: author: "Seth Kenlon https://opensource.com/users/seth" +[#]: collector: "lujun9972" +[#]: translator: "geekpi" +[#]: reviewer: "wxy" +[#]: publisher: "wxy" +[#]: url: "https://linux.cn/article-13713-1.html" + +在终端监控你的 Linux 系统 +====== + +> 如何找到一个程序的进程 ID(PID)。最常见的 Linux 工具是由 procps-ng 包提供的,包括 `ps`、`pstree`、`pidof` 和 `pgrep` 命令。 + +![](https://img.linux.net.cn/data/attachment/album/202108/24/092948gyyv6nvbn77x7y6o.jpg) + +在 [POSIX][2] 术语中,进程process是一个正在进行的事件,由操作系统的内核管理。当你启动一个应用时就会产生一个进程,尽管还有许多其他的进程在你的计算机后台运行,包括保持系统时间准确的程序、监测新的文件系统、索引文件,等等。 + +大多数操作系统都有某种类型的系统活动监视器,因此你可以了解在任何特定时刻有哪些进程在运行。Linux 有一些供你选择,包括 GNOME 系统监视器和 KSysGuard。这两个软件在桌面环境都很有用,但 Linux 也提供了在终端监控系统的能力。不管你选择哪一种,对于那些积极管理自己电脑的人来说,检查一个特定的进程是一项常见的任务。 + +在这篇文章中,我演示了如何找到一个程序的进程 ID(PID)。最常见的工具是由 [procps-ng][3] 包提供的,包括 `ps`、`pstree`、`pidof` 和 `pgrep` 命令。 + +### 查找一个正在运行的程序的 PID + +有时你想得到一个你知道正在运行的特定程序的进程 ID(PID)。`pidof` 和 `pgrep` 命令可以通过命令名称查找进程。 + +`pidof` 命令返回一个命令的 PID,它按名称搜索确切的命令: + +``` +$ pidof bash +1776 5736 +``` + +`pgrep` 命令允许使用正则表达式: + +``` +$ pgrep .sh +1605 +1679 +1688 +1776 +2333 +5736 +$ pgrep bash +5736 +``` + +### 通过文件查找 PID + +你可以用 `fuser` 命令找到使用特定文件的进程的 PID。 + +``` +$ fuser --user ~/example.txt +/home/tux/example.txt: 3234(tux) +``` + +### 通过 PID 获得进程名称 + +如果你有一个进程的 PID 编号,但没有生成它的命令,你可以用 `ps` 做一个“反向查找”: + +``` +$ ps 3234 +PID TTY STAT TIME COMMAND +5736 pts/1 Ss 0:00 emacs +``` + +### 列出所有进程 + +`ps` 命令列出进程。你可以用 `-e` 选项列出你系统上的每一个进程: + +``` +PID TTY TIME CMD + 1 ? 00:00:03 systemd + 2 ? 00:00:00 kthreadd + 3 ? 00:00:00 rcu_gp + 4 ? 00:00:00 rcu_par_gp + 6 ? 00:00:00 kworker/0:0H-events_highpri +[...] +5648 ? 00:00:00 gnome-control-c +5656 ? 00:00:00 gnome-terminal- +5736 pts/1 00:00:00 bash +5791 pts/1 00:00:00 ps +5792 pts/1 00:00:00 less +(END) +``` + +### 只列出你的进程 + +`ps -e` 的输出可能会让人不知所措,所以使用 `-U` 来查看一个用户的进程: + +``` +$ ps -U tux | less + PID TTY TIME CMD +3545 ? 00:00:00 systemd +3548 ? 00:00:00 (sd-pam) +3566 ? 00:00:18 pulseaudio +3570 ? 00:00:00 gnome-keyring-d +3583 ? 00:00:00 dbus-daemon +3589 tty2 00:00:00 gdm-wayland-ses +3592 tty2 00:00:00 gnome-session-b +3613 ? 00:00:00 gvfsd +3618 ? 00:00:00 gvfsd-fuse +3665 tty2 00:01:03 gnome-shell +[...] +``` + +这样就减少了 200 个(可能是 100 个,取决于你运行的系统)需要分类的进程。 + +你可以用 `pstree` 命令以不同的格式查看同样的输出: + +``` +$ pstree -U tux -u --show-pids +[...] +├─gvfsd-metadata(3921)─┬─{gvfsd-metadata}(3923) +│ └─{gvfsd-metadata}(3924) +├─ibus-portal(3836)─┬─{ibus-portal}(3840) +│ └─{ibus-portal}(3842) +├─obexd(5214) +├─pulseaudio(3566)─┬─{pulseaudio}(3640) +│ ├─{pulseaudio}(3649) +│ └─{pulseaudio}(5258) +├─tracker-store(4150)─┬─{tracker-store}(4153) +│ ├─{tracker-store}(4154) +│ ├─{tracker-store}(4157) +│ └─{tracker-store}(4178) +└─xdg-permission-(3847)─┬─{xdg-permission-}(3848) + └─{xdg-permission-}(3850) +``` + +### 列出进程的上下文 + +你可以用 `-u` 选项查看你拥有的所有进程的额外上下文。 + +``` +$ ps -U tux -u +USER PID %CPU %MEM VSZ RSS TTY STAT START TIME COMMAND +tux 3545 0.0 0.0 89656 9708 ? Ss 13:59 0:00 /usr/lib/systemd/systemd --user +tux 3548 0.0 0.0 171416 5288 ? S 13:59 0:00 (sd-pam) +tux 3566 0.9 0.1 1722212 17352 ? S 基于 Ubuntu 20.04 LTS,备受期待的 elementary OS 6 终于可以下载了。 + +![](https://i0.wp.com/news.itsfoss.com/wp-content/uploads/2021/08/elementary-os-6-release.jpg?w=1200&ssl=1) + +[2021 年最值得期待的 Linux 发行版][1] 之一,终于来了。 + +elementary OS 6 基于 Ubuntu 20.04 LTS,它大幅改进了用户体验和安全性。 + +虽然我们已经列出了 [elementary OS 6 的新功能列表][2],但咱们还是来看看本次更新的主要亮点吧。 + +### 正式引入暗黑模式 + +![][3] + +elementary OS 6 加入这个功能可能为时太晚,但至少他们做了极大的努力,让整个系统拥有一致的暗黑模式体验。 + +你也会注意到,预装应用和应用中心里部分适配过的应用都支持暗黑模式。 + +暗黑模式在安装 elementary OS 6 后也可以直接在欢迎页设置。 + +### 通知优化 + +![][4] + +通知现在支持操作按钮和图标徽章,视觉更舒适,也更加易用。 + +### Flatpak 优先原则 + +![][5] + +为了加强隐私保护和安全性,elementary OS 6 提供了开箱即用的 Flatpak 应用支持。 + +现在,不仅仅是系统应用,在应用中心,所有应用都已经打包为 Flatpak 格式。 + +### 多点触控手势 + +![][6] + +对于触控板和触摸屏用户,elementary OS 6 带来了不错的手势交互,你完全可以借助手势来穿梭于系统中。 + +你甚至可以通过手势来忽略通知。 + +### 新应用,新更新 + +本次更新中,待办事项和固件更新正式加入预装应用。 + +同时,大部分系统应用(如邮件)也重构了 UI,以及获得了一些新功能。 + +### 其他重要改进 + +![][7] + +如果你想了解更多关于本次更新的内容,我强烈建议你试用 elementary OS 6 来自行探索。 + +当然,如果你现在就想速览其他重要的新功能,那么我列出几个: + + * 在安装应用中心之外的第三方应用时会有警告。 + * 在向终端粘贴需要 root 权限的命令时会有警告。 + * 更便于区分多任务视图中活动窗口的细节变化。 + * 系统设置内置了在线账户集成。 + * 辅助功能优化。 + * 全新壁纸。 + * 改进的安装器。 + +### 下载 elementary OS 6 + +你现在可以从 elementary OS 的官网获取 elementary OS 的最新版本。如需了解详情,你也可以查阅 [官方公告][8]。 + +- [下载 elementary OS 6][9] + +-------------------------------------------------------------------------------- + +via: https://news.itsfoss.com/elementary-os-6-release/ + +作者:[Ankush Das][a] +选题:[lujun9972][b] +译者:[imgradeone](https://github.com/imgradeone) +校对:[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://news.itsfoss.com/linux-distros-for-2021/ +[2]: https://news.itsfoss.com/elementary-os-6-features/ +[3]: https://news.itsfoss.com/wp-content/uploads/2021/08/onboarding-dark.png +[4]: https://news.itsfoss.com/wp-content/uploads/2021/06/notification-badge-elementary-os-6.png +[5]: https://news.itsfoss.com/wp-content/uploads/2021/08/appcenter.png +[6]: https://news.itsfoss.com/wp-content/uploads/2021/08/multitouch-multitasking.png +[7]: https://news.itsfoss.com/wp-content/uploads/2021/08/elementary-os-6-terminal-paste-protection.png +[8]: https://blog.elementary.io/elementary-os-6-odin-released/ +[9]: https://elementary.io diff --git a/published/202108/20210811 Top 11 New Features in elementary OS 6 Linux Release.md b/published/202108/20210811 Top 11 New Features in elementary OS 6 Linux Release.md new file mode 100644 index 0000000000..e43ef67969 --- /dev/null +++ b/published/202108/20210811 Top 11 New Features in elementary OS 6 Linux Release.md @@ -0,0 +1,174 @@ +[#]: subject: "Top 11 New Features in elementary OS 6 Linux Release" +[#]: via: "https://news.itsfoss.com/elementary-os-6-features/" +[#]: author: "Ankush Das https://news.itsfoss.com/author/ankush/" +[#]: collector: "lujun9972" +[#]: translator: "wxy" +[#]: reviewer: "wxy" +[#]: publisher: "wxy" +[#]: url: "https://linux.cn/article-13678-1.html" + +elementary OS 6 Linux 中的 11 个亮点 +====== + +> elementary OS 6 终于来了。让我们看一下这个主要版本中的重要亮点。 + +![](https://i2.wp.com/news.itsfoss.com/wp-content/uploads/2021/08/elementary-os-6-features.png?w=1200&ssl=1) + +elementary OS 6 是其 5.x 系列经过几年更新后的一次重大升级。 + +虽然 5.x 系列也有许多功能更新和改进,但 [elementary OS 6][1] 的努力成果看起来令人兴奋。 + +在这里,让我们来看看 elementary OS 6 引入的所有新功能和变化。 + +### 1、暗黑风格及强调色 + +![][2] + +[elementary OS][3] 暗黑风格的主题与现在主流的工作方式类似,是一种选择的偏好。你可以在安装 elementary OS 6 之后,在欢迎屏幕上选择它。 + +虽然增加暗黑模式听起来像是小事一桩,但他们似乎投入了大量的精力来提供一个整体一致的暗黑模式体验。 + +所有的第一方应用程序都无缝地支持暗黑风格和浅色主题。 + +elementary OS 还让应用开发者在 elementary OS 6 中遵照用户的偏好。因此,如果用户喜欢暗黑模式或浅色模式,应用程序就可以适应这种模式。 + +伴随着新的强调色的出现,还有一个自动的强调色偏好,可以从你当前的壁纸中挑选出强调的颜色。 + +### 2、改进的通知及重新设计的通知中心 + +通知现在支持图标徽章和行动按钮,这应该能提供更好的体验。 + +![][4] + +这可以让你快速打开链接、标记一条消息已读,以及其他几种可能的操作。 + +紧急通知有了新的外观和独特的声音,以帮助你识别它们。 + +除了通知方面的改进,通知中心也进行了改造,使其看起来更好,并可以对多个通知进行清理。 + +### 3、在线账户 + +终于,在 elementary OS 6 中,你能够从系统设置中添加在线账户了。 + +一旦登录,你的数据将在支持的系统应用程序(如日历、任务)中同步。 + +它也会显示在系统托盘通知中。 + +### 4、第一方 Flatpak 应用及权限查看 + +为了提高整个平台的隐私和安全,elementary OS 6 采用了优先选择 Flatpak 的方式。 + +Elementary OS 现在有自己的应用中心 Flatpak 资源库。一些默认的应用程序以 Flatpak 包的形式出现,应用中心列出的所有应用程序也都有 Flatpak。 + +总的来说,这意味着更好的沙盒体验,你的所有应用程序将保持相互隔离,不会访问你的敏感数据。 + +![][5] + +而且,最重要的是,elementary OS 6 增加了“门户”功能,应用程序会请求权限,以访问你的文件或启动另一个应用程序。 + +你还可以从系统设置中控制所有的权限。 + +### 5、多点触控手势 + +![][6] + +对于笔记本电脑和触摸板用户来说,新的多点触控手势将变得非常方便。 + +从访问多任务视图到浏览工作区,你都可以用多点触摸手势来完成。 + +不仅仅局限于桌面上的某些功能,你还可以与通知互动、滑过应用程序,并可以通过新的多点触控手势获得全系统的顺滑体验。 + +你可以自定义手势或从系统设置下的手势部分了解更多信息。 + +### 6、屏幕盾牌 + +在 elementary OS 5 中,有些人注意到当你想运行一个耗时的任务或简单地观看视频时,会出现自动锁定屏幕的问题。 + +然而,这种情况在 elementary OS 6 中得到了改变,它不仅解决了这个问题,还以 “屏幕盾牌” 功能的形式带来了新的实现方式。 + +因此,在观看视频或执行耗时的任务时,你可以轻松地保持系统的清醒,而不会突然中断。 + +它利用了 GNOME 的守护程序设置,与第三方应用程序有更好的兼容性。 + +### 7、新的任务应用 + +![][7] + +elementary OS 6 中添加了一个新的任务应用,在那里你可以管理任务、收到提醒,并在你的系统上组织任务,或与在线账户同步。 + +我可能还不会用它来取代 Planner,但它是一个很好的补充,因为它打造的很好。 + +### 8、固件更新应用程序 + +![][14] + +你可以为支持的设备获得最新的固件更新,而无需摆弄任何其他设置。 + +只要从菜单中寻找“固件”应用程序就可以开始了。 + +### 9、更新的应用程序 + +一些应用程序已经被更新,同时引入了新的功能。 + +例如,Epiphany 浏览器被重新命名为 “Web”,现在有 Flatpak 包可用,以方便快速更新。 + +它还包括内置的跟踪保护和广告拦截。 + +其他一些值得注意的变化包括: + + * 相机应用获得了一个新的用户界面,可以切换相机、镜像图像等等。 + * 应用中心现在不仅列出了 Flatpak 应用程序,而且还在应用程序完成安装后通知你,让你快速打开它。 + * 文件应用程序也得到了改进,其形式是一个新的侧边栏和列表视图。另外,现在需要双击才能打开一个文件,而单次点击可以在文件夹中导航。 + +其他应用程序如邮件、日历也得到了改进,以便更好地进行在线整合。 + +### 10、改进的桌面工作流程及屏幕截图工具 + +![][8] + +多任务视图现在可以帮助你明确区分多个活动窗口。而热角视图可以让你将窗口移动到新的工作区,也可以将窗口最大化。 + +![][9] + +屏幕截图工具可以在窗口中移动,而不仅仅是停留在窗口的中心。你还可以从预览中拖放图片,而不需要保存。 + +### 11、改进的安装程序 + +![][10] + +你会注意到一些新的微妙的动画,而且还做了一些努力,以便在不重新调整窗口大小的情况下提供一个一致的安装程序布局。 + +这不是一次大修,但他们提到新的安装程序带有改进的磁盘检测和错误处理功能,这应该能使安装顺滑进行。 + +### 总结 + +[elementary OS 6][3] 是一个激动人心的版本,有多项改进。尽管外观和感觉并没有完全改变,但它已被全面精心雕琢。 + +我喜欢他们为提供一致和漂亮的用户体验所做的工作。另外,像全系统的 Flatpak 这样的变化应该使用户更容易和更安全。 + +你对这个版本有什么看法?你试过了吗? + +-------------------------------------------------------------------------------- + +via: https://news.itsfoss.com/elementary-os-6-features/ + +作者:[Ankush Das][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://news.itsfoss.com/author/ankush/ +[b]: https://github.com/lujun9972 +[1]: https://news.itsfoss.com/elementary-os-6-release/ +[2]: https://i1.wp.com/news.itsfoss.com/wp-content/uploads/2021/07/dark-style-elementary.jpg?w=1200&ssl=1 +[3]: https://elementary.io +[4]: https://i0.wp.com/news.itsfoss.com/wp-content/uploads/2021/06/notification-badge-elementary-os-6.png?w=724&ssl=1 +[5]: https://i2.wp.com/news.itsfoss.com/wp-content/uploads/2021/08/elementary-os-6-permissions.png?resize=1568%2C1158&ssl=1 +[6]: https://i0.wp.com/news.itsfoss.com/wp-content/uploads/2021/08/multitouch-multitasking.png?resize=1568%2C883&ssl=1 +[7]: https://i0.wp.com/news.itsfoss.com/wp-content/uploads/2021/08/tasks.png?resize=1568%2C1188&ssl=1 +[8]: https://i1.wp.com/news.itsfoss.com/wp-content/uploads/2021/08/window-context-dark.png?w=808&ssl=1 +[9]: https://i2.wp.com/news.itsfoss.com/wp-content/uploads/2021/08/screenshot.png?w=660&ssl=1 +[10]: https://i2.wp.com/news.itsfoss.com/wp-content/uploads/2021/08/installer-progress.png?resize=1568%2C1140&ssl=1 +[14]: https://i1.wp.com/news.itsfoss.com/wp-content/uploads/2021/08/firmware.png?resize=1568%2C1158&ssl=1 \ No newline at end of file diff --git a/published/202108/20210812 A Java developer-s guide to Quarkus.md b/published/202108/20210812 A Java developer-s guide to Quarkus.md new file mode 100644 index 0000000000..cee601ce54 --- /dev/null +++ b/published/202108/20210812 A Java developer-s guide to Quarkus.md @@ -0,0 +1,52 @@ +[#]: subject: "A Java developer's guide to Quarkus" +[#]: via: "https://opensource.com/article/21/8/java-quarkus-ebook" +[#]: author: "Daniel Oh https://opensource.com/users/daniel-oh" +[#]: collector: "lujun9972" +[#]: translator: "geekpi" +[#]: reviewer: "wxy" +[#]: publisher: "wxy" +[#]: url: "https://linux.cn/article-13690-1.html" + +下载《Quarkus 的 Java 开发者指南》电子书 +====== + +> 一本新的展示了开发者如何继续使用 Java 框架来构建新的无服务器功能的电子书。 + +![](https://img.linux.net.cn/data/attachment/album/202108/17/100432yslvlw6s2d462w41.jpg) + +[无服务器][2] 架构已经成为一种高效的解决方案,无论是物理服务器、虚拟机还是云环境,都可以根据实际工作负载调整超额配置和不足配置资源(如 CPU、内存、磁盘、网络)。然而,在选择新的编程语言来开发无服务器应用时,Java 开发者有一个担忧。对于云上的无服务器部署,尤其是 [Kubernetes][3],Java 框架似乎过于沉重和缓慢。 + +作为 Java 开发者,如果可以继续使用 Java 框架来构建传统的云原生微服务以及同时构建新的无服务器功能呢?这种方法应该是令人兴奋的,因为你不必担心新的无服务器应用框架的学习曲线会很陡峭。 + +此外,如果 Java 框架不仅可以为开发者提供熟悉技术的乐趣,还可以在启动时以毫秒为单位优化 Kubernetes 中的 Java 无服务器功能,并提供微小的内存足迹,又会怎样? + +### 什么是 Quarkus? + +[Quarkus][4] 是一个新的 Java 框架,可以为 Java 开发者、企业架构师和 DevOps 工程师提供这些功能和好处。它旨在设计无服务器应用,并编写云原生微服务,以便在云基础设施(例如 Kubernetes)上运行。 + +Quarkus 还支持一个名为 [Funqy][5] 的可移植 Java API 扩展,供开发者编写和部署无服务器功能到异构无服务器运行时。 + +Quarkus Funqy 使开发者能够将 [CloudEvents][6] 与 Knative 环境中的无服务器函数绑定,以处理反应式流。这有利于开发者建立一个通用的消息传递格式来描述事件,提高多云和混合云平台之间的互操作性。 + +在我的新电子书 《[Java 无服务器功能指南][7]》的帮助下,开始你的 Quarkus 之旅。与他人分享你的 Quarkus 经验,让大家都能享受到用 Java 和 Quarkus 进行的无服务器开发。 + +-------------------------------------------------------------------------------- + +via: https://opensource.com/article/21/8/java-quarkus-ebook + +作者:[Daniel Oh][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/daniel-oh +[b]: https://github.com/lujun9972 +[1]: https://opensource.com/sites/default/files/styles/image-full-size/public/lead-images/java-coffee-mug.jpg?itok=Bj6rQo8r (Coffee beans and a cup of coffee) +[2]: https://opensource.com/article/21/1/devapps-strategies +[3]: https://opensource.com/article/19/6/reasons-kubernetes +[4]: https://quarkus.io/ +[5]: https://quarkus.io/guides/funqy +[6]: https://cloudevents.io/ +[7]: https://opensource.com/downloads/java-serverless-ebook diff --git a/published/202108/20210813 Install Linux with LVM.md b/published/202108/20210813 Install Linux with LVM.md new file mode 100644 index 0000000000..1c6d955cb6 --- /dev/null +++ b/published/202108/20210813 Install Linux with LVM.md @@ -0,0 +1,117 @@ +[#]: subject: "Install Linux with LVM" +[#]: via: "https://opensource.com/article/21/8/install-linux-mint-lvm" +[#]: author: "Kenneth Aaron https://opensource.com/users/flyingrhino" +[#]: collector: "lujun9972" +[#]: translator: "geekpi" +[#]: reviewer: "wxy" +[#]: publisher: "wxy" +[#]: url: "https://linux.cn/article-13704-1.html" + +在 LVM 上安装 Linux Mint +====== + +> 一个关于让 Linux Mint 20.2 与逻辑卷管理器(LVM)一起工作的教程。 + +![](https://img.linux.net.cn/data/attachment/album/202108/21/104418yg111cba52caalc5.jpg) + +几周前,[Linux Mint][2] 的人员发布了他们的开源操作系统的 20.2 版本。Live ISO 中内置的安装程序非常好,只需要点击几下就可以安装操作系统。如果你想定制你的分区,你甚至有一个内置的分区软件。 + +安装程序重点关注在简单的安装上:定义你的分区并安装到这些分区。对于那些想要更灵活的设置的人来说,[逻辑卷管理器][3]logical volume manager(LVM)是个不错的选择,你可以通过设置卷组(VG)并在其中定义你的逻辑卷(LV)。 + +LVM 是一个硬盘管理系统,允许你在多个物理驱动器上创建存储空间。换句话说,你可以把几个小驱动器“拴”在一起,这样你的操作系统就会把它们当作一个驱动器。除此之外,它还有实时调整大小、文件系统快照和更多的优点。这篇文章并不是关于 LVM 的教程(网上已经有很多 [这方面不错的信息][4]了)。相反,我的目标是贴合这篇文章的主题,只关注让 Linux Mint 20.2 与 LVM 一起工作。 + +作为一个桌面操作系统,其安装程序致力于简单化,在 LVM 上安装 Linux Mint 20.2 会略微复杂一些,但不会太复杂。如果你在安装程序中选择了 LVM,你会得到一个由 Linux Mint 开发者定义的设置,而且你在安装时无法控制各个卷。 + +然而,有一个解决方案:在临场 ISO 中,该方案只需要在终端中使用几个命令来设置 LVM,然后你可以继续使用常规安装程序来完成工作。 + +我安装了 Linux Mint 20.2 和 [XFCE 桌面][5],但其他 Linux Mint 桌面的过程也类似。 + +### 分区驱动器 + +在 Linux Mint 临场 ISO 中,你可以通过终端和 GUI 工具访问 Linux 命令行工具。如果你需要做任何分区工作,你可以使用命令行 `fdisk` 或 `parted` 命令,或者 GUI 应用 `gparted`。我想让这些操作简单到任何人都能遵循,所以我会在可能的情况下使用 GUI 工具,在必要时使用命令行工具。 + +首先,为安装创建几个分区。 + +使用 `gparted`(从菜单中启动),完成以下工作: + +首先,创建一个 512MB 的分区,类型为 FAT32(这是用来确保系统可启动)。512MB 对大多数人来说是富余的,你可以用 256MB 甚至更少,但在今天的大容量磁盘中,即使分配 512MB 也不是什么大问题。 + +![Creating a boot partition][6] + +接下来,在磁盘的其余部分创建一个 `lvm2 pv` 类型(LVM 2 物理卷)的分区(这是你的 LVM 的位置)。 + +![Partition layout][7] + +现在打开一个终端窗口,并将你的权限提升到 root: + +``` +$ sudo -s +# whoami +root +``` + +接下来,你必须找到你之前创建的 LVM 成员(那个大分区)。使用下列命令之一:`lsblk -f` 或 `pvs` 或 `pvscan`。 + +``` +# pvs +PV VG Fmt [...] +/dev/sda2 lvm2 [...] +``` + +在我的例子中,该分区位于 `/dev/sda2`,但你应该用你的输出中得到的内容来替换它。 + +现在你知道了你的分区有哪些设备,你可以在那里创建一个 LVM 卷组(VG): + +``` +# vgcreate vg /dev/sda2 +``` + +你可以使用 `vgs` 或 `vgscan` 看到你创建的卷组的细节。 + +创建你想在安装时使用的逻辑卷(LV)。为了简单,我分别创建了 `root` 根分区(`/`)和 `swap` 交换分区,但是你可以根据需要创建更多的分区(例如,为 `/home` 创建一个单独的分区)。 + +``` +# lvcreate -L 80G -n root vg +# lvcreate -L 16G -n swap vg +``` + +我的例子中的分区大小是任意的,是基于我可用的空间。使用对你的硬盘有意义的分区大小。 + +你可以用 `lvs` 或 `lvdisplay` 查看逻辑卷。 + +终端操作到这就结束了。 + +### 安装 Linux + +现在从桌面上的图标启动安装程序: + + * 进入 “Installation type”,选择 “Something else”。 + * 编辑 512Mb 的分区并将其改为 `EFI`。 + * 编辑根逻辑卷,将其改为 `ext4`(或一个你选择的文件系统)。选择将其挂载为根目录(`/`),并选择将其格式化。 + * 编辑 `swap` 分区并将其设置为交换分区。 + * 继续正常的安装过程。Linux Mint 安装程序会将文件放在正确的位置并为你创建挂载点。 + +完成了。在你的 Linux Mint 安装中享受 LVM 的强大。 + +如果你需要调整分区大小或在系统上做任何高级工作,你会感谢选择 LVM。 + +-------------------------------------------------------------------------------- + +via: https://opensource.com/article/21/8/install-linux-mint-lvm + +作者:[Kenneth Aaron][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/flyingrhino +[b]: https://github.com/lujun9972 +[1]: https://opensource.com/sites/default/files/styles/image-full-size/public/lead-images/linux_keyboard_desktop.png?itok=I2nGw78_ (Linux keys on the keyboard for a desktop computer) +[2]: https://linuxmint.com/ +[3]: https://en.wikipedia.org/wiki/Logical_Volume_Manager_(Linux) +[4]: https://opensource.com/business/16/9/linux-users-guide-lvm +[5]: https://opensource.com/article/19/12/xfce-linux-desktop +[6]: https://opensource.com/sites/default/files/boot-part.png (Creating a boot partition) +[7]: https://opensource.com/sites/default/files/part-layout.png (Partition layout) diff --git a/published/202108/20210813 Parse command options in Java with commons-cli.md b/published/202108/20210813 Parse command options in Java with commons-cli.md new file mode 100644 index 0000000000..d0923f6214 --- /dev/null +++ b/published/202108/20210813 Parse command options in Java with commons-cli.md @@ -0,0 +1,227 @@ +[#]: subject: "Parse command options in Java with commons-cli" +[#]: via: "https://opensource.com/article/21/8/java-commons-cli" +[#]: author: "Seth Kenlon https://opensource.com/users/seth" +[#]: collector: "lujun9972" +[#]: translator: "unigeorge" +[#]: reviewer: "wxy" +[#]: publisher: "wxy" +[#]: url: "https://linux.cn/article-13699-1.html" + +使用 commons-cli 解析 Java 中的命令行选项 +====== + +> 让用户用命令行选项调整你的 Java 应用程序运行方式。 + +![](https://img.linux.net.cn/data/attachment/album/202108/19/115907lvjwc1ce5avumaau.jpg) + +通常向终端中输入命令时,无论是启动 GUI 应用程序还是仅启动终端应用程序,都可以使用 + + [命令行选项][2](options or switches or flags) + + (**以下简称选项**)来修改应用程序的运行方式。这是 [POSIX 规范][3] 设定的标准,因此能够检测和解析选项对 Java 程序员而言是很有用的技能。 + +Java 中有若干种解析选项的方法,其中我最喜欢用的是 [Apache Commons CLI][4] 库,简称 **commons-cli**。 + +### 安装 commons-cli + +如果你使用类似 [Maven][5] 之类的项目管理系统以及集成开发环境Integrated Development Environment(简称 IDE),可以在项目属性(比如 `pom.xml` 配置文件或者 Eclipse 和 NetBeans 的配置选项卡)中安装 Apache Commons CLI 库。 + +而如果你采用手动方式管理库,则可以从 Apache 网站下载 [该库的最新版本][6]。下载到本地的是几个捆绑在一起的 JAR 文件,你只需要其中的一个文件 `commons-cli-X.Y.jar`(其中 X 和 Y 代指最新版本号)。把这个 JAR 文件或手动或使用 IDE 添加到项目,就可以在代码中使用了。 + +### 将库导入至 Java 代码 + +在使用 `commons-cli` 库之前,必须首先导入它。对于本次选项解析的简单示例而言,可以先在 `Main.java` 文件中简单写入以下标准代码: + +``` +package com.opensource.myoptparser; + +import org.apache.commons.cli.*; + +public class Main { +    public static void main(String[] args) { +    // code  +    } +} +``` + +至此在 Java 中解析选项的准备工作已经做好了。 + +### 在 Java 中定义布尔选项 + +要实现解析选项,首先要定义应用程序可接收的有效选项。使用 `Option`(注意是单数)类来创建选项对象,使用 `Options`(注意是复数)类来追踪项目中创建的所有选项。 + +首先为选项创建一个组,按照惯例命名为 `options`: + +``` +    //code +    Options options = new Options(); +``` + +接下来,通过列出短选项(即选项名简写)、长选项(即全写)、默认布尔值(LCTT 译注:设置是否需要选项参数,指定为 `false` 时此选项不带参,即为布尔选项)和帮助信息来定义选项,然后设置该选项是否为必需项(LCTT 译注:下方创建 `alpha` 对象的代码中未手动设置此项),最后将该选项添加到包含所有选项的 `options` 组对象中。在下面几行代码中,我只创建了一个选项,命名为 `alpha`: + +``` +    //define options +    Option alpha = new Option("a", "alpha", false, "Activate feature alpha"); +    options.addOption(alpha); +``` + +### 在 Java 中定义带参选项 + +有时用户需要通过选项提供 `true` 或 `false` 以外的信息,比如给出配置文件、输入文件或诸如日期、颜色这样的设置项值。这种情况可以使用 `builder` 方法,根据选项名简写为其创建属性(例如,`-c` 是短选项,`--config` 是长选项)。完成定义后,再将定义好的选项添加到 `options` 组中: + +``` +    Option config = Option.builder("c").longOpt("config") +        .argName("config") +        .hasArg() +        .required(true) +        .desc("set config file").build(); +    options.addOption(config); +``` + +`builder` 函数可以用来设置短选项、长选项、是否为必需项(本段代码中必需项设置为 `true`,也就意味着用户启动程序时必须提供此选项,否则应用程序无法运行)、帮助信息等。 + +### 使用 Java 解析选项 + +定义并添加所有可能用到的选项后,需要对用户提供的参数进行迭代处理,检测是否有参数同预设的有效短选项列表中的内容相匹配。为此要创建命令行 `CommandLine` 本身的一个实例,其中包含用户提供的所有参数(包含有效选项和无效选项)。为了处理这些参数,还要创建一个 `CommandLineParser` 对象,我在代码中将其命名为 `parser`。最后,还可以创建一个 `HelpFormatter` 对象(我将其命名为 `helper`),当参数中缺少某些必需项或者用户使用 `--help` 或 `-h` 选项时,此对象可以自动向用户提供一些有用的信息。 + +``` +    // define parser +    CommandLine cmd; +    CommandLineParser parser = new BasicParser(); +    HelpFormatter helper = new HelpFormatter(); +``` + +最后,添加一些条件判断来分析用户提供的选项,我们假设这些选项已经作为命令行输入被获取并存储在 `cmd` 变量中。这个示例应用程序有两种不同类型的选项,但对这两种类型都可以使用 `.hasOption` 方法加上短选项名称来检测选项是否存在。检测到一个存在的选项后,就可以对数据做进一步操作了。 + +``` +try { + cmd = parser.parse(options, args); + if(cmd.hasOption("a")) { + System.out.println("Alpha activated"); + } + + if (cmd.hasOption("c")) { + String opt_config = cmd.getOptionValue("config"); + System.out.println("Config set to " + opt_config); + } +} catch (ParseException e) { + System.out.println(e.getMessage()); + helper.printHelp("Usage:", options); + System.exit(0); +} +``` + +解析过程有可能会产生错误,因为有时可能缺少某些必需项如本例中的 `-c` 或 `--config` 选项。这时程序会打印一条帮助信息,并立即结束运行。考虑到此错误(Java 术语中称为异常),在 `main` 方法的开头要添加语句声明可能的异常: + + +``` +public static void main(String[] args) throws ParseException { +``` + +示例程序至此就大功告成了。 + +### 测试代码 + +你可以通过调整传递给代码的默认参数来在 IDE 中测试应用程序,或者创建一个 JAR 文件并在终端运行测试。这个过程可能会因 IDE 的不同而不同。具体请参阅相应的 IDE 文档,以及我写过的关于如何创建 JAR 文件的文章,或者参考 Daniel Oh 的关于如何使用 [Maven][11] 执行同样操作的文章。 + +首先,省略必需项 `-c` 或 `--config` 选项,检测解析器的异常处理: + +``` +$ java -jar dist/myapp.jar                  +Missing required option: c +usage: Usage: + -a,--alpha             Activate feature alpha + -c,--config <config>   Set config file +``` + +然后提供输入选项再进行测试: + +``` +java -jar dist/myantapp.jar --config foo -a +Alpha activated +Config set to foo +``` + +### 选项解析 + +为用户提供选项功能对任何应用程序来说都是很重要的。有了 Java 和 Apache Commons,要实现这个功能并不难。 + +以下是完整的演示代码,供读者参考: + +``` +package com.opensource.myapp; + +import org.apache.commons.cli.*; + +public class Main { + + /** + * @param args the command line arguments + * @throws org.apache.commons.cli.ParseException + */ + public static void main(String[] args) throws ParseException { + // define options + Options options = new Options(); + + Option alpha = new Option("a", "alpha", false, "Activate feature alpha"); + options.addOption(alpha); + + Option config = Option.builder("c").longOpt("config") + .argName("config") + .hasArg() + .required(true) + .desc("Set config file").build(); + options.addOption(config); + + // define parser + CommandLine cmd; + CommandLineParser parser = new BasicParser(); + HelpFormatter helper = new HelpFormatter(); + + try { + cmd = parser.parse(options, args); + if(cmd.hasOption("a")) { + System.out.println("Alpha activated"); + } + + if (cmd.hasOption("c")) { + String opt_config = cmd.getOptionValue("config"); + System.out.println("Config set to " + opt_config); + } + } catch (ParseException e) { + System.out.println(e.getMessage()); + helper.printHelp("Usage:", options); + System.exit(0); + } + } +} +``` + +### 使用 Java 和选项 + +选项使用户可以调整命令的工作方式。使用 Java 时解析选项的方法有很多,其中之一的 `commons-cli` 是一个强大而灵活的开源解决方案。记得在你的下一个 Java 项目中尝试一下哦。 + +-------------------------------------------------------------------------------- + +via: https://opensource.com/article/21/8/java-commons-cli + +作者:[Seth Kenlon][a] +选题:[lujun9972][b] +译者:[unigeorge](https://github.com/unigeorge) +校对:[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/studying-books-java-couch-education.png?itok=C9gasCXr (Learning and studying technology is the key to success) +[2]: https://opensource.com/article/21/8/linux-terminal#options +[3]: https://opensource.com/article/19/7/what-posix-richard-stallman-explains +[4]: https://commons.apache.org/proper/commons-cli/usage.html +[5]: https://maven.apache.org/ +[6]: https://commons.apache.org/proper/commons-cli/download_cli.cgi +[7]: http://www.google.com/search?hl=en&q=allinurl%3Adocs.oracle.com+javase+docs+api+string +[8]: http://www.google.com/search?hl=en&q=allinurl%3Adocs.oracle.com+javase+docs+api+option +[9]: http://www.google.com/search?hl=en&q=allinurl%3Adocs.oracle.com+javase+docs+api+system +[10]: http://www.google.com/search?hl=en&q=allinurl%3Adocs.oracle.com+javase+docs+api+parseexception +[11]: https://developers.redhat.com/blog/2021/04/08/build-even-faster-quarkus-applications-with-fast-jar diff --git a/published/202108/20210814 What is SteamOS- Everything Important You Need to Know About This -Gaming Distribution.md b/published/202108/20210814 What is SteamOS- Everything Important You Need to Know About This -Gaming Distribution.md new file mode 100644 index 0000000000..223f78ff39 --- /dev/null +++ b/published/202108/20210814 What is SteamOS- Everything Important You Need to Know About This -Gaming Distribution.md @@ -0,0 +1,140 @@ +[#]: subject: "What is SteamOS? Everything Important You Need to Know About This “Gaming Distribution”" +[#]: via: "https://itsfoss.com/steamos/" +[#]: author: "Ankush Das https://itsfoss.com/author/ankush/" +[#]: collector: "lujun9972" +[#]: translator: "imgradeone" +[#]: reviewer: "wxy" +[#]: publisher: "wxy" +[#]: url: "https://linux.cn/article-13688-1.html" + +SteamOS 是什么?关于这款“游戏发行版”你所要知道的事 +====== + +![](https://img.linux.net.cn/data/attachment/album/202108/16/113402ass3smho7sbmo75b.jpg) + +SteamOS 是一款基于 Linux 的操作系统,旨在提供来自 Steam 自己的游戏商店顺滑的游戏体验。 + +虽然它已经存在了许久,但有几件事你应该知道。 + +在这篇文章中,我们将回答许多 SteamOS 相关的常见问题。 + +### SteamOS 是什么? + +SteamOS 是由游戏分发平台 Steam 开发的 Linux 发行版。它并是一款像 Debian、Linux Mint 或者 Ubuntu 那样的泛用型桌面操作系统,即便你确实可以使用桌面功能。默认情况下,SteamOS 的界面类似于游戏机,因为 SteamOS 旨在成为专为 Steam 游戏设备定制的操作系统,如 Steam Machine(已停产)和 Steam Deck。 + +![SteamOS 界面][1] + +你确实也可以在任何 Linux 发行版和其他平台安装 Steam 客户端,但 SteamOS 更是为了提供类似游戏机的体验,方便你玩 Steam 上的游戏。 + +### SteamOS 基于哪个 Linux 发行版? + +作为基于 Linux 的系统,SteamOS 最初基于 Debian 8 开发。随着 Valve 的全新 [Steam Deck][2] 掌机发布,SteamOS 的最新版本(SteamOS 3.0)将基于 Arch Linux 开发,因为 Arch 支持滚动更新。 + +SteamOS 的开发团队也相信,SteamOS 基于 Arch Linux 更有利于快速推送更新和优化 Steam Deck。 + +![][3] + +### SteamOS 的系统要求 + +理想情况下,符合以下最低要求的设备都应该可以正常运行 SteamOS: + + * Intel / AMD 的 64 位 CPU + * 4GB 或更高的运行内存(RAM) + * 250GB 或更大的磁盘 + * NVIDIA / Intel / AMD 的显卡 + * 用于安装介质的 USB 或者 DVD + +(LCTT 译注:本段内容仅针对 SteamOS 2.0。) + +### SteamOS 能否在你的电脑上正常运作? + +SteamOS(2.0 版本)内置了支持特定硬件的驱动程序。 + +理论上 SteamOS 可以在任何电脑上运行,但目前官方并没有支持最新的硬件。 + +### SteamOS 只是又一款 Linux 发行版吗? + +SteamOS 严格来说已经是现有的 [适合游戏的 Linux 发行版][4] 之一。但与其他发行版不同的是,SteamOS 并不是为了泛用型桌面而设计的。你确实可以安装 Linux 程序,但 SteamOS 支持的软件包极为有限。 + +总之,它并不适合替代普通 Linux 桌面系统。 + +### SteamOS 现在还在积极维护中吗? + +**是**,但又**不是**。 + +SteamOS 基于 Debian 8 许久,目前没有任何更新。 + +如果你正期望将 SteamOS 安装到你的个人设备上,那么目前公开发布的版本(SteamOS 2.0)已经处于不再维护的状态。 + +不过,Valve 目前正在为 Steam Deck 维护 SteamOS 3.0。因此,可能不久 SteamOS 就可以用于你的桌面了。 + +### 你是否推荐使用 SteamOS 来玩电脑游戏吗? + +**不推荐**。 在 Windows 和其它 Linux 发行版面前,SteamOS 并不是你应该选择的替代品。 + +虽然 SteamOS 主要是为游戏定制的,但在拿它玩游戏之前,你还需要了解许多注意事项。 + +### 所有游戏都可以在 SteamOS 上玩吗? + +**不**。 SteamOS 需要依赖 Proton 兼容层才能让 Windows 平台的游戏正常运行。 + +当然,如今借助同样的底层技术,[在 Linux 里玩游戏][5] 已经成为了可能,但至少在我写这篇文章时,你并不能让 Steam 上架的所有游戏都可以在 Linux 中运行。 + +虽然大部分游戏都可以运行,但这并不意味着你游戏库里的所有游戏都能正常游玩。 + +如果你想玩 Steam 支持的游戏,以及仅限于 Linux 平台的游戏,那还是值得一试的。 + +### SteamOS 是否开源? + +**是的**(SteamOS 2.0)。 + +SteamOS 操作系统是开源的,你可以在 [官方仓库][6] 中找到源码。 + +不过,你用来玩游戏的 Steam 客户端是专有的。 + +值得注意的是,SteamOS 3.0 目前仍处于开发阶段,因此你无法获得它的源代码和任何公开进展。 + +### SteamOS 是否免费使用? + +目前你暂时无法找到可供公众使用的最新版 SteamOS,但它基本上是免费的。基于 Debian 的旧版 SteamOS 可在其 [官方网站][7] 上获取。 + +### 我能找到内置 SteamOS 的游戏主机吗? + +![Steam Machine 游戏机,已经停产][8] + +SteamOS 最初是为 Steam Machine 这款 Steam 自家的 PlayStation/Xbox 风格的游戏机定制的操作系统。2015 年 Steam Machine 发布后并没有在市场上获得成功,最终停产。 + +目前,唯一一款预装 SteamOS 的设备是备受瞩目的 Steam Deck。 + +待到 SteamOS 开放针对其它设备的下载后,你就可以看到有硬件厂商销售预装 SteamOS 的游戏设备了。 + +但,至少目前来看,你不应该相信任何不知名的制造商提供开箱即用的 SteamOS。 + +### 下一代 SteamOS 能否使 Linux 成为游戏的可行选择? + +是的,绝对是的。 + +Linux 可能不是外界所推荐的游戏选择,但如果你乐意的话,你也可以查看 [我们所推荐的 Linux 游戏发行版][9]。最后,如果 SteamOS 下了狠心,让每款游戏都能在 Steam Deck 上运行,那么桌面 Linux 用户也将终于可以体验到所有曾经不支持的 Steam 游戏了。 + +-------------------------------------------------------------------------------- + +via: https://itsfoss.com/steamos/ + +作者:[Ankush Das][a] +选题:[lujun9972][b] +译者:[imgradeone](https://github.com/imgradeone) +校对:[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/wp-content/uploads/2021/08/steamos.jpg +[2]: https://www.steamdeck.com/en/ +[3]: https://itsfoss.com/wp-content/uploads/2021/08/steam-deck.jpg +[4]: https://itsfoss.com/linux-gaming-distributions/ +[5]: https://itsfoss.com/linux-gaming-guide/ +[6]: https://repo.steampowered.com/steamos/ +[7]: https://store.steampowered.com/steamos/ +[8]: https://itsfoss.com/wp-content/uploads/2021/08/valves-steam-machine.jpg +[9]: https://news.itsfoss.com/linux-for-gaming-opinion/ diff --git a/published/202108/20210815 7 New Features in the Newly Released Debian 11 ‘Bullseye- Linux Distro.md b/published/202108/20210815 7 New Features in the Newly Released Debian 11 ‘Bullseye- Linux Distro.md new file mode 100644 index 0000000000..e2190e87dd --- /dev/null +++ b/published/202108/20210815 7 New Features in the Newly Released Debian 11 ‘Bullseye- Linux Distro.md @@ -0,0 +1,122 @@ +[#]: subject: "7 New Features in the Newly Released Debian 11 ‘Bullseye’ Linux Distro" +[#]: via: "https://news.itsfoss.com/debian-11-feature/" +[#]: author: "Abhishek https://news.itsfoss.com/author/root/" +[#]: collector: "lujun9972" +[#]: translator: "wxy" +[#]: reviewer: "wxy" +[#]: publisher: "wxy" +[#]: url: "https://linux.cn/article-13695-1.html" + +新发布的 Debian 11 “Bullseye” Linux 发行版的 7 大亮点 +====== + +> 这个最新发布的通用操作系统已经来到。 + +![](https://i1.wp.com/news.itsfoss.com/wp-content/uploads/2021/08/debian-11-features.png?w=1200&ssl=1) + +期待已久的代号为 “Bullseye” 的 Debian 11 版本在经过两年的开发后终于来了。该版本将在未来五年内得到支持,就像任何其他的 Debian 稳定版版本一样。 + +感到兴奋吗?让我们来看看 Debian 11 的新内容。 + +### 1、新主题 + +Debian 11 带有一个新的 “Homeworld” 主题。它的灵感来自 [包豪斯运动][1],这是一种 20 世纪初诞生于德国的艺术风格,其特点是对建筑和设计的独特处理。 + +![Debian 11 的默认壁纸][2] + +在 Debian 11 中,无论是在登录界面、安装程序还是 Grub 菜单上,你都会看到这个主题。 + +![Grub 屏幕][3] + +![安装程序][4] + +![登录屏幕][10] + +### 2、较新版本的桌面环境 + +Debian 11 包含了它所提供的桌面变体的较新版本: + + * GNOME 3.38 + * KDE Plasma 5.20 + * LXDE 11 + * LXQt 0.16 + * MATE 1.24 + * Xfce 4.16 + +如果你使用 Fedora 或 Arch/Manjaro 等先锐发行版,你可能会觉得很奇怪。但就是这样。Debian 更倾向于稳定,因此桌面环境的版本不是最新的。当然,它们与之前的 Debian 稳定版相比,还是比较新的。 + +### 3、软件包更新 + +Debian 已经更新了它的软件包库。Debian 11 包括了多达 11294 个新软件包,软件包总数多达 59551 个。42821 个软件包有了新的版本。删除了 9519 个软件包。 + +也就是说你应该会看到像 LibreOffice、Emacs、GIMP 以及各种服务器和编程相关工具等流行应用程序的新版本。 + +### 4、Linux 内核 5.10 LTS + +Debian 11 带有 [Linux 5.10 内核,这是一个长期支持(LTS)版本][5]。Debian 10 Buster 在发布时使用的是 Linux 4.19 内核。 + +一个新的内核显然意味着对硬件有更好的支持,特别是较新的硬件以及性能的改进。 + +### 5、打印机和扫描器的改进 + +Debian 11 带来了新的软件包 ipp-usb。它使用了许多现代打印机所支持的供应商中立的 IPP-over-USB 协议。这意味着许多较新的打印机将被 Debian 11 所支持,而不需要驱动程序。 + +同样地,SANE 无驱动后端可以让你轻松使用扫描仪。 + +### 6、支持 exFAT + +你不再需要使用 exfat-fuse 包来挂载 exFAT 文件系统。借助 Linux 5.10 内核,Debian 11 已经支持 exFAT 文件系统,并且默认使用它来挂载 exFAT 文件系统。 + +### 7、仍然支持 32 位 + +这算是一个功能吗?考虑到现在只有 [少数几个 Linux 发行版支持 32 位架构][6],我觉得是。 + +除了 32 位和 64 位 PC,Debian 11 还支持 64 位 ARM(arm64)、ARM EABI(armel)、ARMv7(EABI hard-float ABI,armhf)、小端 MIPS(mipsel)、64 位小端 MIPS(mips64el)、64 位小端 PowerPC(ppc64el)和 IBM System z(s390x)。 + +现在你知道为什么它被称为“通用操作系统”了吧。 🙂 + +### 其他变化 + +在这个版本中还有一些变化: + + * Systemd 默认使用控制组 v2(cgroupv2)。 + * 针对中文、日文、韩文和其他许多语言的新 Fcitx 5 输入法。 + * Systemd 日记日志默认为持久性的。 + * 一个新的打开命令,可以用某个应用程序(GUI 或 CLI)从命令行自动打开文件。 + * 本地系统账户的密码散列现在默认使用 yescrypt 而不是 SHA-512 来提高安全性。 + +更多信息可以在 [官方发布说明][7] 中找到。 + +### 获取 Debian 11 + +Debian 11 可以从其网站下载。只要前往该网站并从那里获得 ISO。 + +- [下载 Debian][8] + +如果你已经在使用 Debian 10,你可以 [通过改变你的源列表轻松升级到 Debian 11][9] 。 + +享受最新和最棒的通用操作系统吧。🙂 + +-------------------------------------------------------------------------------- + +via: https://news.itsfoss.com/debian-11-feature/ + +作者:[Abhishek][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://news.itsfoss.com/author/root/ +[b]: https://github.com/lujun9972 +[1]: https://mymodernmet.com/what-is-bauhaus-art-movement/ +[2]: https://i1.wp.com/news.itsfoss.com/wp-content/uploads/2021/08/homeworld_desktop.png?resize=1568%2C882&ssl=1 +[3]: https://i2.wp.com/news.itsfoss.com/wp-content/uploads/2021/08/homeworld_grub.png?w=640&ssl=1 +[4]: https://i1.wp.com/news.itsfoss.com/wp-content/uploads/2021/08/homeworld_installer.png?w=800&ssl=1 +[5]: https://news.itsfoss.com/kernel-5-10-release/ +[6]: https://itsfoss.com/32-bit-linux-distributions/ +[7]: https://www.debian.org/releases/bullseye/amd64/release-notes/ch-whats-new.en.html +[8]: https://www.debian.org/ +[9]: https://www.debian.org/releases/bullseye/amd64/release-notes/ch-upgrading.en.html +[10]: https://i2.wp.com/news.itsfoss.com/wp-content/uploads/2021/08/homeworld_login.png?resize=1568%2C882&ssl=1 \ No newline at end of file diff --git a/published/202108/20210815 Schedule a task with the Linux at command.md b/published/202108/20210815 Schedule a task with the Linux at command.md new file mode 100644 index 0000000000..f4212f579c --- /dev/null +++ b/published/202108/20210815 Schedule a task with the Linux at command.md @@ -0,0 +1,161 @@ +[#]: subject: "Schedule a task with the Linux at command" +[#]: via: "https://opensource.com/article/21/8/linux-at-command" +[#]: author: "Seth Kenlon https://opensource.com/users/seth" +[#]: collector: "lujun9972" +[#]: translator: "geekpi" +[#]: reviewer: "wxy" +[#]: publisher: "wxy" +[#]: url: "https://linux.cn/article-13710-1.html" + +用 Linux 的 at 命令来安排一个任务 +====== + +> at 命令是一种在特定时间和日期安排一次性任务的 Linux 终端方法。 + +![](https://img.linux.net.cn/data/attachment/album/202108/23/144542rmmyzwxsnanm4wpj.jpg) + +计算机擅长 [自动化][2],但不是每个人都知道如何使自动化工作。不过,能够在特定的时间为电脑安排一个任务,然后忘记它,这确实是一种享受。也许你有一个文件要在特定的时间上传或下载,或者你需要处理一批还不存在但可以保证在某个时间存在的文件,或者需要监控设置,或者你只是需要一个友好的提醒,在下班回家的路上买上面包和黄油。 + +这就是 `at` 命令的用处。 + +### 什么是 Linux at 命令? + +`at` 命令是在 Linux 终端让你在特定时间和日期安排一次性工作的方法。它是一种自发的自动化,在终端上很容易实现。 + +### 安装 at + +在 Linux 上,`at` 命令可能已经安装了。你可以使用 `at -V` 命令来验证它是否已经安装。只要返回一个版本号,就说明你已经安装了 `at`。 + +``` +$ at -V +at version x.y.z +``` + +如果你试图使用 `at`,但没有找到该命令,大多数现代的 Linux 发行版会为你提供缺少的 `at` 软件包。 + +你可能还需要启动 `at` 守护程序,称为 `atd`。在大多数 Linux 系统中,你可以使用 `systemctl` 命令来启用该服务,并将它们设置为从现在开始自动启动: + +``` +$ sudo systemctl enable --now atd +``` + +### 用 at 交互式地安排一个作业 + +当你使用 `at` 命令并加上你希望任务运行的时间,会打开一个交互式 `at` 提示符。你可以输入你想在指定时间运行的命令。 + +做个比喻,你可以把这个过程看作是一个日历应用,就像你在你的手机上使用的那样。首先,你在某一天的某个时间创建一个事件,然后指定你想要发生什么。 + +例如,可以试试创建一个未来几分钟的任务,来给自己计划一个备忘录。这里运行一个简单的任务,以减少失败的可能性。要退出 `at` 提示符,请按键盘上的 `Ctrl+D`。 + +``` +$ at 11:20 AM +warning: commands will be executed using /bin/sh +at> echo "hello world" > ~/at-test.txt +at> +job 3 at Mon Jul 26 11:20:00 2021 +``` + +正如你所看到的,`at` 使用直观和自然的时间定义。你不需要用 24 小时制的时钟,也不需要把时间翻译成 UTC 或特定的 ISO 格式。一般来说,你可以使用你自然想到的任何符号,如 `noon`、`1:30 PM`、`13:37` 等等,来描述你希望一个任务发生的时间。 + +等待几分钟,然后在你创建的文件上运行 `cat` 或者 `tac` 命令,验证你的任务是否已经运行: + +``` +$ cat ~/at-test.txt +hello world +``` + +### 用 at 安排一个任务 + +你不必使用 `at` 交互式提示符来安排任务。你可以使用 `echo` 或 `printf` 向它传送命令。在这个例子中,我使用了 `now` 符号,以及我希望任务从现在开始延迟多少分钟: + +``` +$ echo "echo 'hello again' >> ~/at-test.txt" | at now +1 minute +``` + +一分钟后,验证新的命令是否已被执行: + +``` +$ cat ~/at-test.txt +hello world +hello again +``` + +### 时间表达式 + +`at` 命令在解释时间时是非常宽容的。你可以在许多格式中选择,这取决于哪一种对你来说最方便: + + * `YYMMDDhhmm[.ss]`(两位的年份、月、日、小时、分钟,及可选的秒) + * `CCYYMMDDhhmm[.ss]`(四位的年份、月、日、时、分钟,及可选的秒) + * `now`(现在) + * `midnight`(午夜 00:00) + * `noon`(中午 12:00) + * `teatime`(下午 16 点) + * `AM`(上午) + * `PM`(下午) + +时间和日期可以是绝对时间,也可以加一个加号(`+`),使其与 `now` 相对。当指定相对时间时,你可以使用你可能用过的词语: + + * `minutes`(分钟) + * `hours`(小时) + * `days`(天) + * `weeks`(星期) + * `months`(月) + * `years`(年) + +### 时间和日期语法 + +`at` 命令对时间的输入相比日期不那么宽容。时间必须放在第一位,接着是日期,尽管日期默认为当前日期,并且只有在为未来某天安排任务时才需要。 + +这些是一些有效表达式的例子: + +``` +$ echo "rsync -av /home/tux me@myserver:/home/tux/" | at 3:30 AM tomorrow +$ echo "/opt/batch.sh ~/Pictures" | at 3:30 AM 08/01/2022 +$ echo "echo hello" | at now + 3 days +``` + +### 查看你的 at 队列 + +当你爱上了 `at`,并且正在安排任务,而不是在桌子上的废纸上乱写乱画,你可能想查看一下你是否有任务还在队列中。 + +要查看你的 `at` 队列,使用 `atq` 命令: + +``` +$ atq +10 Thu Jul 29 12:19:00 2021 a tux +9 Tue Jul 27 03:30:00 2021 a tux +7 Tue Jul 27 00:00:00 2021 a tux +``` + +要从队列中删除一个任务,使用 `atrm` 命令和任务号。例如,要删除任务 7: + +``` +$ atrm 7 +$ atq +10 Thu Jul 29 12:19:00 2021 a tux +9 Tue Jul 27 03:30:00 2021 a tux +``` + +要看一个计划中的任务的实际内容,你需要查看 `/var/spool/at` 下的内容。只有 root 用户可以查看该目录的内容,所以你必须使用 `sudo` 来查看或 `cat` 任何任务的内容。 + +### 用 Linux at 安排任务 + +`at` 系统是一个很好的方法,可以避免忘记在一天中晚些时候运行一个作业,或者在你离开时让你的计算机为你运行一个作业。与 `cron` 不同的是,它不像 `cron` 那样要求任务必须从现在起一直按计划运行到永远,因此它的语法比 `cron` 简单得多。 + +等下次你有一个希望你的计算机记住并管理它的小任务,试试 `at` 命令。 + +-------------------------------------------------------------------------------- + +via: https://opensource.com/article/21/8/linux-at-command + +作者:[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/checklist_todo_clock_time_team.png?itok=1z528Q0y (Team checklist) +[2]: https://opensource.com/article/20/11/orchestration-vs-automation diff --git a/published/202108/20210817 4 alternatives to cron in Linux.md b/published/202108/20210817 4 alternatives to cron in Linux.md new file mode 100644 index 0000000000..72b6aae2d7 --- /dev/null +++ b/published/202108/20210817 4 alternatives to cron in Linux.md @@ -0,0 +1,72 @@ +[#]: subject: "4 alternatives to cron in Linux" +[#]: via: "https://opensource.com/article/21/7/alternatives-cron-linux" +[#]: author: "Seth Kenlon https://opensource.com/users/seth" +[#]: collector: "lujun9972" +[#]: translator: "unigeorge" +[#]: reviewer: "wxy" +[#]: publisher: "wxy" +[#]: url: "https://linux.cn/article-13716-1.html" + +Linux 中 cron 系统的 4 种替代方案 +====== + +> 在 Linux 系统中有一些其他开源项目可以结合或者替代 cron 系统使用。 + +![](https://img.linux.net.cn/data/attachment/album/202108/25/104033ro6lasn54lq25r2l.jpg) + +[Linux cron 系统][2] 是一项经过时间检验的成熟技术,然而在任何情况下它都是最合适的系统自动化工具吗?答案是否定的。有一些开源项目就可以用来与 cron 结合或者直接代替 cron 使用。 + +### at 命令 + +cron 适用于长期重复任务。如果你设置了一个工作任务,它会从现在开始定期运行,直到计算机报废为止。但有些情况下你可能只想设置一个一次性命令,以备不在计算机旁时该命令可以自动运行。这时你可以选择使用 `at` 命令。 + +`at` 的语法比 cron 语法简单和灵活得多,并且兼具交互式和非交互式调度方法。(只要你想,你甚至可以使用 `at` 作业创建一个 `at` 作业。) + +``` +$ echo "rsync -av /home/tux/ me@myserver:/home/tux/" | at 1:30 AM +``` + +该命令语法自然且易用,并且不需要用户清理旧作业,因为它们一旦运行后就完全被计算机遗忘了。 + +阅读有关 [at 命令][3] 的更多信息并开始使用吧。 + +### systemd + +除了管理计算机上的进程外,`systemd` 还可以帮你调度这些进程。与传统的 cron 作业一样,systemd 计时器可以在指定的时间间隔触发事件,例如 shell 脚本和命令。时间间隔可以是每月特定日期的一天一次(例如在星期一的时候触发),或者在 09:00 到 17:00 的工作时间内每 15 分钟一次。 + +此外 systemd 里的计时器还可以做一些 cron 作业不能做的事情。 + +例如,计时器可以在一个事件 _之后_ 触发脚本或程序来运行特定时长,这个事件可以是开机,可以是前置任务的完成,甚至可以是计时器本身调用的服务单元的完成! + +如果你的系统运行着 systemd 服务,那么你的机器就已经在技术层面上使用 systemd 计时器了。默认计时器会执行一些琐碎的任务,例如滚动日志文件、更新 mlocate 数据库、管理 DNF 数据库等。创建自己的计时器很容易,具体可以参阅 David Both 的文章 [使用 systemd 计时器来代替 cron][4]。 + +### anacron 命令 + +cron 专门用于在特定时间运行命令,这适用于从不休眠或断电的服务器。然而对笔记本电脑和台式工作站而言,时常有意或无意地关机是很常见的。当计算机处于关机状态时,cron 不会运行,因此设定在这段时间内的一些重要工作(例如备份数据)也就会跳过执行。 + +anacron 系统旨在确保作业定期运行,而不是按计划时间点运行。这就意味着你可以将计算机关机几天,再次启动时仍然靠 anacron 来运行基本任务。anacron 与 cron 协同工作,因此严格来说前者不是后者的替代品,而是一种调度任务的有效可选方案。许多系统管理员配置了一个 cron 作业来在深夜备份远程工作者计算机上的数据,结果却发现该作业在过去六个月中只运行过一次。anacron 确保重要的工作在 _可执行的时候_ 发生,而不是必须在安排好的 _特定时间点_ 发生。 + +点击参阅关于 [使用 anacron 获得更好的 crontab 效果][5] 的更多内容。 + +### 自动化 + +计算机和技术旨在让人们的生活更美好,工作更轻松。Linux 为用户提供了许多有用的功能,以确保完成重要的操作系统任务。查看这些可用的功能,然后试着将这些功能用于你自己的工作任务吧。(LCTT 译注:作者本段有些语焉不详,读者可参阅譬如 [Ansible 自动化工具安装、配置和快速入门指南](https://linux.cn/article-13142-1.html) 等关于 Linux 自动化的文章) + +-------------------------------------------------------------------------------- + +via: https://opensource.com/article/21/7/alternatives-cron-linux + +作者:[Seth Kenlon][a] +选题:[lujun9972][b] +译者:[unigeorge](https://github.com/unigeorge) +校对:[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/clocks_time.png?itok=_ID09GDk (Alarm clocks with different time) +[2]: https://opensource.com/article/21/7/cron-linux +[3]: https://opensource.com/article/21/7/intro-command +[4]: https://opensource.com/article/20/7/systemd-timers +[5]: https://opensource.com/article/21/2/linux-automation diff --git a/published/202108/20210817 Automatically Synchronize Subtitle With Video Using SubSync.md b/published/202108/20210817 Automatically Synchronize Subtitle With Video Using SubSync.md new file mode 100644 index 0000000000..367eb80668 --- /dev/null +++ b/published/202108/20210817 Automatically Synchronize Subtitle With Video Using SubSync.md @@ -0,0 +1,89 @@ +[#]: subject: "Automatically Synchronize Subtitle With Video Using SubSync" +[#]: via: "https://itsfoss.com/subsync/" +[#]: author: "Abhishek Prakash https://itsfoss.com/author/abhishek/" +[#]: collector: "lujun9972" +[#]: translator: "geekpi" +[#]: reviewer: "turbokernel" +[#]: publisher: "wxy" +[#]: url: "https://linux.cn/article-13722-1.html" + +使用 SubSync 自动同步视频字幕 +====== + +![](https://img.linux.net.cn/data/attachment/album/202108/27/100003ts3j0odw05j0ooy3.jpg) + +让我分享一个场景:当你想要观看一部电影或视频,而又需要字幕时,在你下载字幕后,却发现字幕没有正确同步,也没有其他更好的字幕可用。现在该怎么做? + +你可以 [在 VLC 中按 G 或 H 键来同步字幕][1]。它可以为字幕增加延迟。如果字幕在整个视频中的时间延迟相同,这可能会起作用。但如果不是这种情况,就需要 SubSync 出场了。 + +### SubSync: 字幕语音同步器 + +[SubSync][2] 是一款实用的开源工具,可用于 Linux、macOS 和 Windows。 + +它通过监听音轨来同步字幕,这就是它的神奇之处。即使音轨和字幕使用的是不同的语言,它也能发挥作用。如果有必要,它也支持翻译,但我没有测试过这个功能。 + +我播放一个视频不同步的字幕进行了一个简单的测试。令我惊讶的是,它工作得很顺利,我得到了完美的同步字幕。 + +使用 SubSync 很简单。启动这个应用,它会让你添加字幕文件和视频文件。 + +![SubSync 用户界面][3] + +你需要在界面上选择字幕和视频的语言。它可能会根据选择的语言下载额外的资源。 + +![SubSync 可下载附加语言支持包][4] + +请记住,同步字幕需要一些时间,这取决于视频和字幕的长度。在等待过程完成时,你可以喝杯茶/咖啡或啤酒。 + +你可以看到正在进行同步的状态,甚至可以在完成之前保存它。 + +![SubSync 同步中][5] + +同步完成后,你就可以点击保存按钮,把修改的内容保存到原文件中,或者把它保存为新的字幕文件。 + +![同步完成][6] + +我不能保证所有情况下都能正常工作,但在我运行的样本测试中它是正常的。 + +### 安装 SubSync + +SubSync 是一个跨平台的应用,你可以从它的 [下载页面][7] 获得 Windows 和 MacOS 的安装文件。 + +对于 Linux 用户,SubSync 是作为一个 Snap 包提供的。如果你的发行版已经提供了 Snap 支持,使用下面的命令来安装 SubSync: + +``` +sudo snap install subsync +``` + +请记住,下载 SubSync Snap 包将需要一些时间。所以要有一个稳定的网络连接或足够的耐心。 + +### 最后 + +就我个人而言,我很依赖字幕。即使我在 Netflix 上看英文电影,我也会把字幕打开。它有助于我清楚地理解每段对话,特别是在有强烈口音的情况下。如果没有字幕,我永远无法理解 [电影 Snatch 中 Mickey O'Neil(由 Brad Pitt 扮演)的一句话][8]。 + +使用 SubSync 比 [Subtitle Editor][9] 同步字幕要容易得多。对于像我这样在整个互联网上搜索不同国家的冷门或推荐(神秘)电影的人来说,除了 [企鹅字幕播放器][10],这是另一个很棒的工具。 + +如果你是一个“字幕用户”,你会喜欢这个工具。如果你使用过它,请在评论区分享你的使用经验。 + +-------------------------------------------------------------------------------- + +via: https://itsfoss.com/subsync/ + +作者:[Abhishek Prakash][a] +选题:[lujun9972][b] +译者:[geekpi](https://github.com/geekpi) +校对:[turbokernel](https://github.com/turbokernel) + +本文由 [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/how-to-synchronize-subtitles-with-movie-quick-tip/ +[2]: https://subsync.online/ +[3]: https://i0.wp.com/itsfoss.com/wp-content/uploads/2021/08/subsync-interface.png?resize=593%2C280&ssl=1 +[4]: https://i1.wp.com/itsfoss.com/wp-content/uploads/2021/08/subsync-subtitle-synchronize.png?resize=522%2C189&ssl=1 +[5]: https://i2.wp.com/itsfoss.com/wp-content/uploads/2021/08/subsync-subtitle-synchronize-1.png?resize=424%2C278&ssl=1 +[6]: https://i1.wp.com/itsfoss.com/wp-content/uploads/2021/08/subsync-subtitle-synchronize-2.png?resize=424%2C207&ssl=1 +[7]: https://subsync.online/en/download.html +[8]: https://www.youtube.com/watch?v=tGDO-9hfaiI +[9]: https://itsfoss.com/subtitld/ +[10]: https://itsfoss.com/penguin-subtitle-player/ diff --git a/published/202108/20210818 Build a JAR file with fastjar and gjar.md b/published/202108/20210818 Build a JAR file with fastjar and gjar.md new file mode 100644 index 0000000000..ce47a73776 --- /dev/null +++ b/published/202108/20210818 Build a JAR file with fastjar and gjar.md @@ -0,0 +1,140 @@ +[#]: subject: "Build a JAR file with fastjar and gjar" +[#]: via: "https://opensource.com/article/21/8/fastjar" +[#]: author: "Seth Kenlon https://opensource.com/users/seth" +[#]: collector: "lujun9972" +[#]: translator: "geekpi" +[#]: reviewer: "wxy" +[#]: publisher: "wxy" +[#]: url: "https://linux.cn/article-13723-1.html" + +用 fastjar 和 gjar 构建一个 JAR 文件 +====== + +> fastjar、gjar 和 jar 等工具可以帮助你手动或以编程方式构建 JAR 文件,而其他工具链,如 Maven 和 Gradle 提供了依赖性管理的功能。 + +![](https://img.linux.net.cn/data/attachment/album/202108/27/105207oj4f44t4vbkkv4iq.jpg) + +根据我的经验,Java 的许多优点之一是它能够以整齐方便的包(称为 JAR,或 Java 归档)来提供应用程序。JAR 文件使用户很容易下载并启动他们想尝试的应用,很容易将该应用从一台计算机转移到另一台计算机(而且 Java 是跨平台的,所以可以鼓励自由分享),而且对于新的程序员来说,查看 JAR 文件的内容,以找出使 Java 应用运行的原因是很容易理解的。 + +创建 JAR 文件的方法有很多,包括 Maven 和 Gradle 等工具链解决方案,以及 IDE 中的一键构建功能。然而,也有一些独立的命令,如 `jarfast`、`gjar` 和普通的 `jar`,它们对于快速和简单的构建是很有用的,并且可以演示 JAR 文件运行所需要的东西。 + +### 安装 + +在 Linux 上,你可能已经有了 `fastjar`、`gjar` 或作为 OpenJDK 包或 GCJ(GCC-Java)的一部分的 `jar` 命令。你可以通过输入不带参数的命令来测试这些命令是否已经安装: + +``` +$ fastjar +Try 'fastjar --help' for more information. +$ gjar +jar: must specify one of -t, -c, -u, -x, or -i +jar: Try 'jar --help' for more information +$ jar +Usage: jar [OPTION...] [ [--release VERSION] [-C dir] files] ... +Try `jar --help' for more information. +``` + +我安装了所有这些命令,但你只需要一个。所有这些命令都能够构建一个 JAR。 + +在 Fedora 等现代 Linux 系统上,输入一个缺失的命令你的操作系统提示安装它。 + +另外,你可以直接从 [AdoptOpenJDK.net][3] 为 Linux、MacOS 和 Windows [安装 Java][2]。 + +### 构建 JAR + +首先,你需要构建一个 Java 应用。 + +为了简单起见,在一个名为 `hello.java` 的文件中创建一个基本的 “hello world” 应用: + +``` +class Main { +public static void main(String[] args) { + System.out.println("Hello Java World"); +}} +``` + +这是一个简单的应用,在某种程度上淡化了管理外部依赖关系在现实世界中的重要性。不过,这也足以让你开始了解创建 JAR 所需的基本概念了。 + +接下来,创建一个清单文件。清单文件描述了 JAR 的 Java 环境。在这个例子里,最重要的信息是识别主类,这样执行 JAR 的 Java 运行时就知道在哪里可以找到应用的入口点。 + +``` +$ mdir META-INF +$ echo "Main-Class: Main" > META-INF/MANIFEST.MF +``` + +### 编译 Java 字节码 + +接下来,把你的 Java 文件编译成 Java 字节码。 + +``` +$ javac hello.java +``` + +另外,你也可以使用 GCC 的 Java 组件来编译: + +``` +$ gcj -C hello.java +``` + +无论哪种方式,都会产生文件 `Main.class`: + +``` +$ file Main.class +Main.class: compiled Java class data, version XX.Y +``` + +### 创建 JAR + +你有了所有需要的组件,这样你就可以创建 JAR 文件了。 + +我经常包含 Java 源码给好奇的用户参考,这只需 `META-INF` 目录和类文件即可。 + +`fastjar` 命令使用类似于 [tar 命令][6]的语法。 + +``` +$ fastjar cvf hello.jar META-INF Main.class +``` + +另外,你也可以用 `gjar`,方法大致相同,只是 `gjar` 需要你明确指定清单文件: + +``` +$ gjar cvf world.jar Main.class -m META-INF/MANIFEST.MF +``` + +或者你可以使用 `jar` 命令。注意这个命令不需要清单文件,因为它会自动为你生成一个,但为了安全起见,我明确定义了主类: + +``` +$ jar --create --file hello.jar --main-class=Main Main.class +``` + +测试你的应用: + +``` +$ java -jar hello.jar +Hello Java World +``` + +### 轻松打包 + +像 `fastjar`、`gjar` 和 `jar` 这样的工具可以帮助你手动或以编程方式构建 JAR 文件,而其他工具链如 Maven 和 Gradle 则提供了依赖性管理的功能。一个好的 IDE 可能会集成这些功能中的一个或多个。 + +无论你使用什么解决方案,Java 都为分发你的应用代码提供了一个简单而统一的目标。 + +-------------------------------------------------------------------------------- + +via: https://opensource.com/article/21/8/fastjar + +作者:[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/build_structure_tech_program_code_construction.png?itok=nVsiLuag (Someone wearing a hardhat and carrying code ) +[2]: https://opensource.com/article/19/11/install-java-linux +[3]: https://adoptopenjdk.net/ +[4]: http://www.google.com/search?hl=en&q=allinurl%3Adocs.oracle.com+javase+docs+api+string +[5]: http://www.google.com/search?hl=en&q=allinurl%3Adocs.oracle.com+javase+docs+api+system +[6]: https://opensource.com/article/17/7/how-unzip-targz-file diff --git a/published/202108/20210819 Check free disk space in Linux with ncdu.md b/published/202108/20210819 Check free disk space in Linux with ncdu.md new file mode 100644 index 0000000000..4d77814c02 --- /dev/null +++ b/published/202108/20210819 Check free disk space in Linux with ncdu.md @@ -0,0 +1,145 @@ +[#]: subject: "Check free disk space in Linux with ncdu" +[#]: via: "https://opensource.com/article/21/8/ncdu-check-free-disk-space-linux" +[#]: author: "Seth Kenlon https://opensource.com/users/seth" +[#]: collector: "lujun9972" +[#]: translator: "geekpi" +[#]: reviewer: "wxy" +[#]: publisher: "wxy" +[#]: url: "https://linux.cn/article-13729-1.html" + +用 ncdu 检查 Linux 中的可用磁盘空间 +====== + +> 用 ncdu Linux 命令获得关于磁盘使用的交互式报告。 + +![](https://img.linux.net.cn/data/attachment/album/202108/29/095819e87oz4ox6p40t6q0.jpg) + +计算机用户多年来往往积累了大量的数据,无论是重要的个人项目、数码照片、视频、音乐还是代码库。虽然现在的硬盘往往相当大,但有时你必须退一步,评估一下你在硬盘上实际存储了什么。经典的 Linux 命令 [df][2] 和 [du][3] 是快速了解硬盘上的内容的方法,它们提供了一个可靠的报告,易于解析和处理。这对脚本和处理来说是很好的,但人的大脑对数百行的原始数据并不总是反应良好。认识到这一点,`ncdu` 命令旨在提供一份关于你在硬盘上使用的空间的交互式报告。 + +### 在 Linux 上安装 ncdu + +在 Linux 上,你可以从你的软件仓库安装 `ncdu`。例如,在 Fedora 或 CentOS 上: + +``` +$ sudo dnf install ncdu +``` + +在 BSD 上,你可以使用 [pkgsrc][4]。 + +在 macOS 上,你可以从 [MacPorts][5] 或 [HomeBrew][6] 安装。 + +另外,你也可以 [从源码编译 ncdu][7]。 + +### 使用 ncdu + +`ncdu` 界面使用 ncurses 库,它将你的终端窗口变成一个基本的图形应用,所以你可以使用方向键来浏览菜单。 + +![ncdu interface][8] + +这是 `ncdu` 的主要吸引力之一,也是它与最初的 `du` 命令不同的地方。 + +要获得一个目录的完整列表,启动 `ncdu`。它默认为当前目录。 + +``` +$ ncdu +ncdu 1.16 ~ Use the arrow keys to navigate, press ? for help +--- /home/tux ----------------------------------------------- + 22.1 GiB [##################] /.var + 19.0 GiB [############### ] /Iso + 10.0 GiB [######## ] /.local + 7.9 GiB [###### ] /.cache + 3.8 GiB [### ] /Downloads + 3.6 GiB [## ] /.mail + 2.9 GiB [## ] /Code + 2.8 GiB [## ] /Documents + 2.3 GiB [# ] /Videos +[...] +``` + +这个列表首先显示了最大的目录(在这个例子中,那是 `~/.var` 目录,塞满了很多的 flatpak 包)。 + +使用键盘上的方向键,你可以浏览列表,深入到一个目录,这样你就可以更好地了解什么东西占用了最大的空间。 + +### 获取一个特定目录的大小 + +你可以在启动 `ncdu` 时提供任意一个文件夹的路径: + +``` +$ ncdu ~/chromiumos +``` + +### 排除目录 + +默认情况下,`ncdu` 包括一切可以包括的东西,包括符号链接和伪文件系统,如 procfs 和 sysfs。你可以用 `--exclude-kernfs` 来排除这些。 + +你可以使用 `--exclude` 选项排除任意文件和目录,并在后面加上一个匹配模式。 + +``` +$ ncdu --exclude ".var" + 19.0 GiB [##################] /Iso + 10.0 GiB [######### ] /.local + 7.9 GiB [####### ] /.cache + 3.8 GiB [### ] /Downloads +[...] +``` + +另外,你可以在文件中列出要排除的文件和目录,并使用 `--exclude-from` 选项来引用该文件: + +``` +$ ncdu --exclude-from myexcludes.txt /home/tux + 10.0 GiB [######### ] /.local + 7.9 GiB [####### ] /.cache + 3.8 GiB [### ] /Downloads +[...] +``` + +### 颜色方案 + +你可以用 `--color dark` 选项给 `ncdu` 添加一些颜色。 + +![ncdu color scheme][9] + +### 包括符号链接 + +`ncdu` 输出按字面意思处理符号链接,这意味着一个指向 9GB 文件的符号链接只占用 40 个字节。 + +``` +$ ncdu ~/Iso + 9.3 GiB [##################] CentOS-Stream-8-x86_64-20210427-dvd1.iso +@ 0.0 B [ ] fake.iso +``` + +你可以用 `--follow-symlinks` 选项强制 ncdu 跟踪符号链接: + +``` +$ ncdu --follow-symlinks ~/Iso + 9.3 GiB [##################] fake.iso + 9.3 GiB [##################] CentOS-Stream-8-x86_64-20210427-dvd1.iso +``` + +### 磁盘使用率 + +磁盘空间用完并不有趣,所以监控你的磁盘使用情况很重要。`ncdu` 命令使它变得简单和互动。下次当你对你的电脑上存储的东西感到好奇时,或者只是想以一种新的方式探索你的文件系统时,不妨试试 `ncdu`。 + +-------------------------------------------------------------------------------- + +via: https://opensource.com/article/21/8/ncdu-check-free-disk-space-linux + +作者:[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/du-splash.png?itok=nRLlI-5A (Check disk usage) +[2]: https://opensource.com/article/21/7/check-disk-space-linux-df +[3]: https://opensource.com/article/21/7/check-disk-space-linux-du +[4]: https://opensource.com/article/19/11/pkgsrc-netbsd-linux +[5]: https://opensource.com/article/20/11/macports +[6]: https://opensource.com/article/20/6/homebrew-mac +[7]: https://dev.yorhel.nl/ncdu +[8]: https://opensource.com/sites/default/files/ncdu.jpg (ncdu interface) +[9]: https://opensource.com/sites/default/files/ncdu-dark.jpg (ncdu color scheme) diff --git a/published/202108/20210819 Zorin OS 16 Released with Stunning New Look and Array of Updates.md b/published/202108/20210819 Zorin OS 16 Released with Stunning New Look and Array of Updates.md new file mode 100644 index 0000000000..f7003aad4f --- /dev/null +++ b/published/202108/20210819 Zorin OS 16 Released with Stunning New Look and Array of Updates.md @@ -0,0 +1,104 @@ +[#]: subject: "Zorin OS 16 Released with Stunning New Look and Array of Updates" +[#]: via: "https://www.debugpoint.com/2021/08/zorin-os-16-release-announcement/" +[#]: author: "Arindam https://www.debugpoint.com/author/admin1/" +[#]: collector: "lujun9972" +[#]: translator: "zd200572" +[#]: reviewer: "wxy" +[#]: publisher: "wxy" +[#]: url: "https://linux.cn/article-13705-1.html" + +Zorin OS 16 发布:惊艳的新外观和一系列更新 +====== + +![](https://img.linux.net.cn/data/attachment/album/202108/21/121757gvsasswbt28085r6.jpg) + +Zorin 团队宣布发布了全新的 Zorin OS 16,带来了许多急需的更新和改进。 我们在这篇文章中对这个版本进行了总结。 + +![Zorin OS 16 桌面版][1] + +开源而赏心悦目的 Linux 发行版 Zorin OS 发布了它的最新稳定的第 16 个版本,这个版本会在 2025 年前提供增强和更新支持。该团队在确保性能不会下降的同时,提供了一些独特和有用的特性。 + +Zorin OS 使用自有的软件参考,同时也可以使用 Ubuntu 的软件仓库。 + +让我们看下重要的新特性。 + +### Zorin OS 16 – 新特性 + +最新的 Zorin OS 16 建立在 Linux 内核 5.11(hwe 栈)的支持上,该版本基于 Ubuntu 20.04 LTS。 + +这个版本最主要的变化是在 Zorin 中 **默认包括了 Flathub 软件仓库**。由此,Zorin 应用商店成为了 Linux 发行版中最大的应用程序集合之一。因为它可以支持 Flathub,另外还有早前支持的 Snap 商店、Ubuntu 软件仓库、Zorin 自有仓库,和对 AppImage 的支持。 + +Zorin 主要因其外观而闻名,在这个版本中,有一系列改进,这是一个简要的总结: + + * 新的图标和色彩方案,默认主题更加精致。 + * 预装了新的设计和壁纸。 + * 锁屏现在可以展示自选壁纸的模糊效果,给你一个更简洁的视觉效果。 + +任务栏图标启用了活动指示器,以及带有计数的通知气泡。这意味着你可以在任务栏图标中获取信息 App 的未读消息计数等信息。任务栏还有一些基本特性,比如自动隐藏、透明度和移动图标等等。 + +![新的任务栏通知气泡][2] + +新版有许多内部提升,细节尚不清楚,但根据团队的意见,所有 Zorin 风格的整体桌面体验比其前身 [Zorin 15][3] 有了很大改进。 + +此版本中引入两个新应用,首次安装后可以用一个 Tour 应用概览 Zorin 桌面,另一个引入的是新的录音应用。 + +如果你使用笔记本,在应用和工作区间切换变得更加快捷和简便。Zorin OS 16 带来了多点触控手势,开箱即用。现在你可以通过上下滑动 4 个手指,以流畅的 1:1 动作在工作区之间切换。 用 3 个手指在触摸板撮合,可以打开活动概述,看到你工作区中运行的每个应用程序。 + +Zorin OS 16 现在支持高分辨率显示器的分数缩放。 + +安装器程序现在包含了 NVIDIA 驱动,可以在首次用临场盘启动时选择,它也支持加密。 + +详细的更新日志在 [这里][4]。 + +### Zorin OS 16 最低系统要求 + +Zorin OS Core、Education 和 Pro + + * CPU – 1 GHz 双核处理器,Intel/AMD 64 位处理器 + * RAM – 2 GB + * 存储 – 15 GB(Core & Education)或 30 GB(Pro) + * 显示器 – 800 × 600 分辨率 + +Zorin OS LITE + + * CPU – 700 MHz 单核,Intel/AMD 64 或 32 位处理器 + * RAM – 512 MB + * 存储 – 10 GB + * 显示器 – 640 × 480 分辨率 + +### 下载 Zorin OS 16 + +值得一提的是 Zorin 发布了一个 PRO 版本,售价大约 $39,有类似 Windows 11 风格等额外特性。可是,你仍然可以随时下载免费版本:Zorin OS 16 Core 和 Zorin OS 16 LITE(用于低配电脑)。你可能想看下它们的功能 [比较][5]。 + +你可以从以下链接下载最新的 .iso 文件。然后,你可以使用 [Etcher][6] 或其他工具来创建临场 USB 启动盘来安装。 + +- [下载 zorin os 16][7] + +### 从 Zorin 15.x 升级 + +现在还没有从 Zorin OS 15 升级的路径,不过据该团队称,未来将会有升级到最新版本的简单方法。 + +### 结束语 + +Zorin 的最佳特性之一是它独特的应用生态处理方式。它可能是唯一提供开箱即用体验的 Linux 桌面发行版,可以通过它的软件商店从 Flathub、Snap 商店、AppImage、Ubuntu / 自有软件仓库来搜索和安装应用。你不需要为 Snap 或者 Flatpak 手动配置系统。也就是说,它仍然是一个带有附加项目的 GNOME 修改版。可能有些人不喜欢 Zorin,可能会因为它预装了所有这些功能而感到臃肿。从某种意义上说,它是 Linux 桌面新用户的理想发行版之一,这些用户需要拥有类似 Windows/macOS 系统感觉的现成的 Linux 功能。 + +-------------------------------------------------------------------------------- + +via: https://www.debugpoint.com/2021/08/zorin-os-16-release-announcement/ + +作者:[Arindam][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://www.debugpoint.com/author/admin1/ +[b]: https://github.com/lujun9972 +[1]: https://www.debugpoint.com/blog/wp-content/uploads/2021/08/Zorin-OS-16-Desktop-1024x576.jpg +[2]: https://www.debugpoint.com/blog/wp-content/uploads/2021/08/New-Taskbar-Notification-Bubbles.png +[3]: https://www.debugpoint.com/2020/09/zorin-os-15-3-release/ +[4]: https://blog.zorin.com/2021/08/17/2021-08-17-zorin-os-16-is-released/ +[5]: https://zorin.com/os/pro/#compare +[6]: https://www.debugpoint.com/2021/01/etcher-bootable-usb-linux/ +[7]: https://zorin.com/os/download/ diff --git a/published/202108/20210822 How to Monitor Log Files in Real Time in Linux -Desktop and Server.md b/published/202108/20210822 How to Monitor Log Files in Real Time in Linux -Desktop and Server.md new file mode 100644 index 0000000000..3fd2befe24 --- /dev/null +++ b/published/202108/20210822 How to Monitor Log Files in Real Time in Linux -Desktop and Server.md @@ -0,0 +1,121 @@ +[#]: subject: "How to Monitor Log Files in Real Time in Linux [Desktop and Server]" +[#]: via: "https://www.debugpoint.com/2021/08/monitor-log-files-real-time/" +[#]: author: "Arindam https://www.debugpoint.com/author/admin1/" +[#]: collector: "lujun9972" +[#]: translator: "geekpi" +[#]: reviewer: "wxy" +[#]: publisher: "wxy" +[#]: url: "https://linux.cn/article-13733-1.html" + +如何在 Linux 中实时监控日志文件 +====== + +> 本教程解释了如何实时监控 Linux 日志文件(桌面、服务器或应用),以进行诊断和故障排除。 + +![](https://img.linux.net.cn/data/attachment/album/202108/30/082607bmf6nlud6sdy49rm.jpg) + +当你在你的 Linux 桌面、服务器或任何应用中遇到问题时,你会首先查看各自的日志文件。日志文件通常是来自应用的文本和信息流,上面有一个时间戳。它可以帮助你缩小具体的实例,并帮助你找到任何问题的原因。它也可以帮助从网络上获得援助。 + +一般来说,所有的日志文件都位于 `/var/log` 中。这个目录包含以 `.log` 为扩展名的特定应用、服务的日志文件,它还包含单独的其他目录,这些目录包含其日志文件。 + +![log files in var-log][1] + +所以说,如果你想监控一堆日志文件或特定的日志文件。这里有一些你可以做到方法。 + +### 实时监控 Linux 日志文件 + +#### 使用 tail 命令 + +使用 `tail` 命令是实时跟踪日志文件的最基本方法。特别是,如果你所在的服务器只有一个终端,没有 GUI。这是很有帮助的。 + +比如: + +``` +tail /path/to/log/file +``` + +![Monitoring multiple log files via tail][2] + +使用开关 `-f` 来跟踪日志文件,它是实时更新的。例如,如果你想跟踪 `syslog`,你可以使用以下命令: + +``` +tail -f /var/log/syslog +``` + +你可以用一个命令监控多个日志文件,使用: + +``` +tail -f /var/log/syslog /var/log/dmesg +``` + +如果你想监控 http 或 sftp 或任何服务器,你也可以在这个命令中监控它们各自的日志文件。 + +记住,上述命令需要管理员权限。 + +#### 使用 lnav(日志文件浏览器) + +![lnav Running][3] + +`lnav` 是一个很好的工具,你可以用它来通过彩色编码的信息以更有条理的方式监控日志文件。在 Linux 系统中,它不是默认安装的。你可以用下面的命令来安装它: + +``` +sudo apt install lnav ### Ubuntu +sudo dnf install lnav ### Fedora +``` + +好的是,如果你不想安装它,你可以直接下载其预编译的可执行文件,然后在任何地方运行。甚至从 U 盘上也可以。它不需要设置,而且有很多功能。使用 `lnav`,你可以通过 SQL 查询日志文件,以及其他很酷的功能,你可以在它的 [官方网站][4] 上了解。 + +一旦安装,你可以简单地用管理员权限从终端运行 `lnav`,它将默认显示 `/var/log` 中的所有日志并开始实时监控。 + +#### 关于 systemd 的 journalctl 说明 + +今天所有的现代 Linux 发行版大多使用 systemd。systemd 提供了运行 Linux 操作系统的基本框架和组件。systemd 通过 `journalctl` 提供日志服务,帮助管理所有 systemd 服务的日志。你还可以通过以下命令实时监控各个 systemd 服务和日志。 + +``` +journalctl -f +``` + +下面是一些具体的 `journalctl` 命令,可以在一些情况下使用。你可以将这些命令与上面的 `-f` 开关结合起来,开始实时监控。 + + * 对紧急系统信息,使用: + ``` + journalctl -p 0 + ``` + * 显示带有解释的错误: + ``` + journalctl -xb -p 3 + ``` + * 使用时间控制来过滤输出: + ``` + journalctl --since "2020-12-04 06:00:00" + journalctl --since "2020-12-03" --until "2020-12-05 03:00:00" + journalctl --since yesterday + journalctl --since 09:00 --until "1 hour ago" + ``` + +如果你想了解更多关于 `journalctl` 的细节,我已经写了一个 [指南][6]。 + +### 结束语 + +我希望这些命令和技巧能帮助你找出桌面或服务器问题/错误的根本原因。对于更多的细节,你可以随时参考手册,摆弄各种开关。如果你对这篇文章有什么意见或看法,请在下面的评论栏告诉我。 + +加油。 + +-------------------------------------------------------------------------------- + +via: https://www.debugpoint.com/2021/08/monitor-log-files-real-time/ + +作者:[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/blog/wp-content/uploads/2021/08/log-files-in-var-log-1024x312.jpeg +[2]: https://www.debugpoint.com/blog/wp-content/uploads/2021/08/Monitoring-multiple-log-files-via-tail-1024x444.jpeg +[3]: https://www.debugpoint.com/blog/wp-content/uploads/2021/08/lnav-Running-1024x447.jpeg +[4]: https://lnav.org/features +[6]: https://www.debugpoint.com/2020/12/systemd-journalctl/ diff --git a/published/202108/20210822 Linux Phones- Here are Your Options.md b/published/202108/20210822 Linux Phones- Here are Your Options.md new file mode 100644 index 0000000000..21375774ba --- /dev/null +++ b/published/202108/20210822 Linux Phones- Here are Your Options.md @@ -0,0 +1,126 @@ +[#]: subject: "Linux Phones: Here are Your Options" +[#]: via: "https://itsfoss.com/linux-phones/" +[#]: author: "Ankush Das https://itsfoss.com/author/ankush/" +[#]: collector: "lujun9972" +[#]: translator: "wxy" +[#]: reviewer: "wxy" +[#]: publisher: "wxy" +[#]: url: "https://linux.cn/article-13711-1.html" + +如何选择一台 Linux 手机 +====== + +![](https://img.linux.net.cn/data/attachment/album/202108/23/155159e5s33xo63tz5jddz.jpg) + +> 未来取代安卓或 iOS 的可能是 Linux 手机,但如今,有哪些选择可以尝试一下呢? + +虽然安卓是基于 Linux 内核的,但它经过了大量修改。因此,这意味着它不是一个完全意义上的基于 Linux 的操作系统。 + +谷歌正在努力使安卓内核更接近主线 Linux 内核,但这仍然是一个遥远的梦想。 + +那么,在这种情况下,如果你正在寻找一款 Linux 手机、一款由 Linux 操作系统驱动的智能手机,有哪些可以选择呢? + +这并不是一个容易做出的决定,因为你的选择非常有限。因此,我试图推荐一些最好的、不同于主流选择的 Linux 手机。 + +### 如今你可以使用的顶级 Linux 手机 + +值得注意的是,这里提到的 Linux 手机或许无法取代你的安卓或 iOS 设备。因此,在做出购买决定之前,请确保你做了一些背景研究。 + +**注意:** 你需要仔细检查这些 Linux 手机是否可以购买到、预期的发货日期和使用风险。它们大多数只适合于发烧友或早期试用者。 + +#### 1、PinePhone + +![][1] + +[PinePhone][2] 是最有性价比和最受欢迎的选择之一,我觉得它是一个有前途的 Linux 手机。 + +它并不局限于单一的操作系统。你可以尝试使用带有 Plasma mobile OS 的 Manjaro、UBports、Sailfish OS 等系统。PinePhone 的配置不错,它包括一个四核处理器和 2G 或3G 的内存。它支持使用可启动的 microSD 卡来帮助你安装系统,还可选 16/32GB eMMC 存储。 + +其显示屏是一个基本的 1440×720p IPS 屏幕。你还可以得到特殊的隐私保护,如蓝牙、麦克风和摄像头的断路开关。 + +PinePhone 还为你提供了使用六个可用的 pogo 引脚添加自定义的硬件扩展的方式。 + +其基本版(2GB 内存和 16GB 存储)默认加载了 Manjaro,价格为 149 美元;而融合版(3GB 内存和 32GB 存储)价格为 199 美元。 + +#### 2、Fairphone + +![][3] + +与这个清单上的其他选择相比,[Fairphone][6] 在商业上是成功的。它不是一款 Linux 智能手机,但它具有定制版的安卓系统,即 Fairphone OS,并且可以选择 [开源安卓系统替代品][5] 之一 [/e/ OS][4]。如果你想使用 Linux 操作系统,也有一些社区移植版本,但可能有点碰运气。 + +Fairphone 有两个不同的版本,提供了一些不错的配置规格。你会发现 Fairphone 3+ 有一个 4800 万像素的相机传感器和一个全高清显示屏。另外,你还会发现先进的高通处理器为该设备提供了动力。 + +他们专注于制造可持续发展的智能手机,并使用了一定量的回收塑料制造。这也为了方便维修。 + +因此,它不仅是一个非主流智能手机的选择,而且如果你选择了它,你也将为保护环境出了力。 + +### 3、Librem 5 + +![][7] + +[Librem 5][9] 是一款非常注重用户隐私的智能手机,同时它采用了开源的操作系统,即 PureOS,并非基于安卓。 + +它所提供的配置规格还不错,有 3GB 内存和四核 Cortex A53 芯片组。但是,这无法与主流选择相竞争。因此,你可能不会觉得它物美价廉。 + +它的目标是那些对尊重隐私的智能手机感兴趣的发烧友。 + +与其他产品类似,Librem 5 也专注于通过提供用户可更换的电池使手机易于维修。 + +在隐私方面,你会注意到有蓝牙、相机和麦克风的断路开关。他们还承诺了未来几年的安全更新。 + +### 4、Pro 1X + +![][10] + +[Pro 1X][11] 是一款有趣的智能手机,同时支持 Ubuntu Touch、Lineage OS 和安卓。 + +它不仅是一款 Linux 智能手机,而且是一款带有独立 QWERTY 键盘的手机,这在现在是很罕见的。 + +Pro 1 X 的配置规格不错,包括了一个骁龙 662 处理器和 6GB 内存。它还带有一块不错的 AMOLED 全高清显示屏。 + +它的相机不是特别强大,但在大多数情况下应该是足够了。 + +### 5、Volla Phone + +![][12] + +[Volla Phone][13] 是一个有吸引力的产品,运行在 UBports 的 Ubuntu Touch。 + +它配备了预制的 “虚拟专用网络” ,并专注于简化用户体验。它的操作系统是定制的,因此,可以快速访问所有重要的东西,而无需自己组织。 + +它的配置规格令人印象深刻,包括了一个八核联发科处理器和 4700 毫安时的电池。你会得到类似于一些最新的智能手机上的设计。 + +### 总结 + +Linux 智能手机不是到处都能买到的,当然也还不适合大众使用。 + +因此,如果你是一个发烧友,或者想支持这种手机的发展,你可以考虑购买一台。 + +你已经拥有一台这种智能手机了吗?请不要犹豫,在下面的评论中分享你的经验。 + +-------------------------------------------------------------------------------- + +via: https://itsfoss.com/linux-phones/ + +作者:[Ankush Das][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://itsfoss.com/author/ankush/ +[b]: https://github.com/lujun9972 +[1]: https://i1.wp.com/itsfoss.com/wp-content/uploads/2021/08/PinePhone-3.jpg?resize=800%2C800&ssl=1 +[2]: https://www.pine64.org/pinephone/ +[3]: https://i2.wp.com/itsfoss.com/wp-content/uploads/2021/08/fairphone.png?resize=360%2C600&ssl=1 +[4]: https://itsfoss.com/e-os-review/ +[5]: https://itsfoss.com/open-source-alternatives-android/ +[6]: https://shop.fairphone.com/en/ +[7]: https://i0.wp.com/itsfoss.com/wp-content/uploads/2021/08/librem-5.png?resize=800%2C450&ssl=1 +[8]: https://itsfoss.com/librem-linux-phone/ +[9]: https://puri.sm/products/librem-5/ +[10]: https://i0.wp.com/itsfoss.com/wp-content/uploads/2021/08/pro1x.jpg?resize=800%2C542&ssl=1 +[11]: https://www.fxtec.com/pro1x +[12]: https://i2.wp.com/itsfoss.com/wp-content/uploads/2021/08/volla-smartphone.jpg?resize=695%2C391&ssl=1 +[13]: https://www.indiegogo.com/projects/volla-phone-free-your-mind-protect-your-privacy#/ diff --git a/published/202108/20210823 Access your iPhone on Linux with this open source tool.md b/published/202108/20210823 Access your iPhone on Linux with this open source tool.md new file mode 100644 index 0000000000..f864386b61 --- /dev/null +++ b/published/202108/20210823 Access your iPhone on Linux with this open source tool.md @@ -0,0 +1,105 @@ +[#]: subject: "Access your iPhone on Linux with this open source tool" +[#]: via: "https://opensource.com/article/21/8/libimobiledevice-iphone-linux" +[#]: author: "Don Watkins https://opensource.com/users/don-watkins" +[#]: collector: "lujun9972" +[#]: translator: "geekpi" +[#]: reviewer: "wxy" +[#]: publisher: "wxy" +[#]: url: "https://linux.cn/article-13737-1.html" + +用这个开源工具在 Linux 上访问你的 iPhone +====== + +> 通过使用 Libimobiledevice 从 Linux 与 iOS 设备进行通信。 + +![](https://img.linux.net.cn/data/attachment/album/202108/31/092907bc26qep3ekc73czl.jpg) + +iPhone 和 iPad 绝不是开源的,但它们是流行的设备。许多拥有 iOS 备的人恰好也在使用大量的开源软件,包括 Linux。Windows 和 macOS 的用户可以通过使用苹果公司提供的软件与 iOS 设备通信,但苹果公司不支持 Linux 用户。开源程序员早在 2007 年(就在 iPhone 发布一年后)就以 Libimobiledevice(当时叫 libiphone)来拯救了人们,这是一个与 iOS 通信的跨平台解决方案。它可以在 Linux、Android、Arm 系统(如树莓派)、Windows、甚至 macOS 上运行。 + +Libimobiledevice 是用 C 语言编写的,使用原生协议与 iOS 设备上运行的服务进行通信。它不需要苹果公司的任何库,所以它完全是自由而开源的。 + +Libimobiledevice 是一个面向对象的 API,它捆绑了许多便于你使用的终端工具。该库支持苹果从最早到其最新的型号的 iOS 设备。这是多年来研究和开发的结果。该项目中的应用包括 `usbmuxd`、`ideviceinstaller`、`idevicerestore`、`ifuse`、`libusbmuxd`、`libplist`、`libirecovery` 和 `libideviceactivation`。 + +### 在 Linux 上安装 Libimobiledevice + +在 Linux 上,你可能已经默认安装了 `libimobiledevice`。你可以通过你的软件包管理器或应用商店找到,或者通过运行项目中包含的一个命令: + +``` +$ ifuse --help +``` + +你可以用你的包管理器安装 `libimobiledevice`。例如,在 Fedora 或 CentOS 上: + +``` +$ sudo dnf install libimobiledevice ifuse usbmuxd +``` + +在 Debian 和 Ubuntu 上: + + +``` +$ sudo apt install usbmuxd libimobiledevice6 libimobiledevice-utils +``` + +或者,你可以从源代码 [下载][2] 并安装 `libimobiledevice`。 + +### 连接你的设备 + +当你安装了所需的软件包,将你的 iOS 设备连接到你的电脑。 + +为你的 iOS 设备建立一个目录作为挂载点。 + +``` +$ mkdir ~/iPhone +``` + +接下来,挂载设备: + +``` +$ ifuse ~/iPhone +``` + +你的设备提示你,是否信任你用来访问它的电脑。 + +![iphone prompts to trust the computer][3] + +*图 1:iPhone 提示你要信任该电脑。* + +信任问题解决后,你会在桌面上看到新的图标。 + +![iphone icons appear on desktop][4] + +*图 2:iPhone 的新图标出现在桌面上。* + +点击 “iPhone” 图标,显示出你的 iPhone 的文件夹结构。 + +![iphone folder structure displayed][5] + +*图 3:显示了 iPhone 的文件夹结构。* + +我通常最常访问的文件夹是 `DCIM`,那里存放着我的 iPhone 照片。有时我在写文章时使用这些照片,有时有一些照片我想用 GIMP 等开源应用来增强。可以直接访问这些图片,而不是通过电子邮件把它们发给我自己,这是使用 `libimobiledevice` 工具的好处之一。我可以把这些文件夹中的任何一个复制到我的 Linux 电脑上。我也可以在 iPhone 上创建文件夹并删除它们。 + +### 发现更多 + +[Martin Szulecki][6] 是该项目的首席开发者。该项目正在寻找开发者加入他们的 [社区][7]。Libimobiledevice 可以改变你使用外设的方式,而无论你在什么平台上。这是开源的又一次胜利,这意味着它是所有人的胜利。 + +-------------------------------------------------------------------------------- + +via: https://opensource.com/article/21/8/libimobiledevice-iphone-linux + +作者:[Don Watkins][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/don-watkins +[b]: https://github.com/lujun9972 +[1]: https://opensource.com/sites/default/files/styles/image-full-size/public/lead-images/idea_innovation_mobile_phone.png?itok=RqVtvxkd (A person looking at a phone) +[2]: https://github.com/libimobiledevice/libimobiledevice/ +[3]: https://opensource.com/sites/default/files/1trust_0.png +[4]: https://opensource.com/sites/default/files/2docks.png +[5]: https://opensource.com/sites/default/files/2iphoneicon.png +[6]: https://github.com/FunkyM +[7]: https://libimobiledevice.org/#community diff --git a/published/202108/20210823 KDE Plasma 5.23 - New Features and Release Dates.md b/published/202108/20210823 KDE Plasma 5.23 - New Features and Release Dates.md new file mode 100644 index 0000000000..43cce08b84 --- /dev/null +++ b/published/202108/20210823 KDE Plasma 5.23 - New Features and Release Dates.md @@ -0,0 +1,105 @@ +[#]: subject: "KDE Plasma 5.23 – New Features and Release Dates" +[#]: via: "https://www.debugpoint.com/2021/08/kde-plasma-5-23/" +[#]: author: "Arindam https://www.debugpoint.com/author/admin1/" +[#]: collector: "lujun9972" +[#]: translator: "imgradeone" +[#]: reviewer: "wxy" +[#]: publisher: "wxy" +[#]: url: "https://linux.cn/article-13719-1.html" + +KDE Plasma 5.23 的新功能和发布日期 +====== + +![](https://img.linux.net.cn/data/attachment/album/202108/25/222802zwhmvv1vwzusevzw.jpg) + +> 我们在这篇文章中总结了 KDE Plasma 5.23(即将到来)的新功能,包括主要特点、下载和 测试说明。 + +KDE Plasma 桌面是当今最流行、最顶级的 Linux 桌面环境,而 KDE Plasma 的热度之高主要得益于其适应能力强、迭代发展迅速,以及性能不断提高。[KDE Plasma 5.22][1] 发布以来,KDE 团队一直忙于为即将到来的 KDE Plasma 5.23 合并更改和测试新功能。目前 KDE Plasma 5.23 仍在开发中,如下是暂定的时间表。 + +### KDE Plasma 5.23 发布时间表 + +KDE Plasma 5.23 将于 2021 年 10 月 7 日发布,以下是时间表: + + * Beta 公测 – 2021 年 9 月 16 日 + * 最终发布 – 2021 年 10 月 7 日 + +正如每个 Plasma 版本更新一样,本次更新也同样承诺对核心 Plasma Shell 和 KDE 应用进行大幅更改、代码清理、性能改进、数百个 bug 修复、Wayland 优化等。我们在本篇文章中收集了一些重要的功能,让你对即将发布的新功能有基本了解。下面就让我们看看。 + +### KDE Plasma 5.23 – 新功能 + + * 本次版本更新基于 Qt 5.15 版本,KDE 框架 5.86 版本。 + +#### Plasma Shell 和应用程序更新 + + * 本次 KDE Plasma 的 Kickoff 程序启动器将有大幅更新,包括 bug 修复、减少内存占用、视觉更新、键鼠导航优化。 + * Kickoff 程序启动器菜单允许使用固定按钮固定在桌面上,保持开启状态。 + * Kickoff 的标签不会在你滚动时切换(从应用标签到位置标签)。 + * Kickoff 里可以使用 `CTRL+F` 快捷键直接聚焦到搜索栏。 + * Kickoff 中的操作按钮(如关机等)可以设置为仅显示图标。 + * 现在可以针对所有 Kickoff 项目选择使用网格或列表视图(而不仅仅局限于收藏夹)。 + +![KDE Plasma 5.23 中 Kickoff 程序启动器新增的选项][2] + +![Kickoff 程序启动器的更改][3] + + * 新增基于 QML 的全新概览视图(类似 GNOME 3.38 的工作区视图),用于展示所有打开的窗口(详见如下视频)。目前我找不到关于此合并请求的更多详情,而且这个新视图也很不稳定。 + +![](https://www.debugpoint.com/blog/wp-content/uploads/2021/08/New-Overview-effect-in-KDE-Plasma-5.23.mp4) + +_视频作者:KDE 团队_ + + * 该概览效果将替代现有的“展现窗口”特效和“虚拟桌面平铺网格”特效(计划中)。 + * 未连接触控板时将展示更易察觉的“未找到触摸板”提示。 + * “电源配置方案”设置现在呈现于 Plasma UI(电池和亮度窗口)中。电源配置方案功能从 Linux 内核 5.12 版本开始已经登陆戴尔和联想的笔记本电脑了。因此,如果你拥有这些品牌的较新款笔记本电脑,你可以将电源配置方案设置为高性能或省电模式。_[注:Fedora 35(很大可能)会在 GNOME 41 中增加该功能]_ + +![新的“电源配置方案”设置][4] + + * 如果你有多屏幕设置,包括垂直和横向屏幕,那么登录屏幕现在可以正确同步和对齐。这个功能的需求度很高。 + * 新的 Breeze 主题预计会有风格上的更新。 + * 如前序版本一样,预计会有全新的壁纸(目前壁纸大赛仍在进行中)。 + * 新增当硬件从笔记本模式切换到平板模式时是否缩放系统托盘图标的设置。 + * 你可以选择在登录时的蓝牙状态:总是启用、总是禁用、记住上一次的状态。该状态在版本升级后仍可保留。 + * 用户现在可以更改传感器的显示名称。 + * Breeze 风格的滚动条现在比之前版本的更宽。 + * Dolphin 文件管理器提供在文件夹前之前优先显示隐藏文件的新选项。 + * 你现在可以使用 `DEL` 键删除剪贴板弹窗中选中的项目。 + * KDE 现在允许你直接从 Plasma 桌面,向 store.kde.org 提交你制作的图标和主题。 + +#### Wayland 更新 + + * 在 Wayland 会话中,运行程序时光标旁也会展示图标反馈动画。 + * 现在可以从通知中复制文字。 + * 中键单击粘贴功能现在可以在 Wayland 和 XWayland 应用程序中正常使用。 + +请务必牢记,每个版本都有数以百计的 bug 修复和改进。本文仅仅包括了我收集的表面层次的东西。因此,如果想了解应用程序和 Plasma Shell 的变更详情,请访问 GitLab 或 KDE Planet 社区。 + +### 不稳定版本下载 + +你现在可以通过下方的链接下载 KDE neon 的不稳定版本来体验上述全部功能。直接下载 .iso 文件,然后安装测试即可。请务必在发现 bug 后及时反馈。该不稳定版本不适合严肃场合及生产力设备使用。 + +- [下载 KDE neon 不稳定版本][5] + +### 结束语 + +KDE Plasma 5.23 每次发布都在改进底层、增加新功能。虽然这个版本不是大更新,但一切优化、改进最终都将累积成稳定性、适应性和更好的用户体验。当然,还有更多的 Wayland 改进(讲真,Wayland 兼容看上去一直都处在“正在进行中”的状态 - 就像十年过去了,却还在制作那样。当然这是另一个话题了)。 + +再会。 + +-------------------------------------------------------------------------------- + +via: https://www.debugpoint.com/2021/08/kde-plasma-5-23/ + +作者:[Arindam][a] +选题:[lujun9972][b] +译者:[imgradeone](https://github.com/imgradeone) +校对:[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/06/kde-plasma-5-22-release/ +[2]: https://www.debugpoint.com/blog/wp-content/uploads/2021/08/New-Kickoff-Options-in-KDE-Plasma-5.23.jpeg +[3]: https://www.debugpoint.com/blog/wp-content/uploads/2021/08/Changes-in-kickoff.jpeg +[4]: https://www.debugpoint.com/blog/wp-content/uploads/2021/08/New-power-profiles.jpeg +[5]: https://neon.kde.org/download diff --git a/published/202108/20210824 How to include options in your Bash shell scripts.md b/published/202108/20210824 How to include options in your Bash shell scripts.md new file mode 100644 index 0000000000..6aa2c9de83 --- /dev/null +++ b/published/202108/20210824 How to include options in your Bash shell scripts.md @@ -0,0 +1,173 @@ +[#]: subject: "How to include options in your Bash shell scripts" +[#]: via: "https://opensource.com/article/21/8/option-parsing-bash" +[#]: author: "Seth Kenlon https://opensource.com/users/seth" +[#]: collector: "lujun9972" +[#]: translator: "unigeorge" +[#]: reviewer: "wxy" +[#]: publisher: "wxy" +[#]: url: "https://linux.cn/article-13730-1.html" + +如何在 Bash shell 脚本中解析命令行选项 +====== + +> 给你的 shell 脚本添加选项。 + +![](https://img.linux.net.cn/data/attachment/album/202108/29/110849lvhr1bjg1r43sfcx.jpg) + +终端命令通常具有 [选项或开关][2],用户可以使用它们来修改命令的执行方式。关于命令行界面的 [POSIX 规范][3] 中就对选项做出了规范,这也是最早的 UNIX 应用程序建立的一个由来已久的惯例,因此你在创建自己的命令时,最好知道如何将选项包含进 [Bash 脚本][4] 中。 + +与大多数语言一样,有若干种方法可以解决 Bash 中解析选项的问题。但直到今天,我最喜欢的方法仍然是我从 Patrick Volkerding 的 Slackware 构建脚本中学到的方法,当我第一次发现 Linux 并敢于冒险探索操作系统所附带的纯文本文件时,这些脚本就是我的 shell 脚本的引路人。 + +### Bash 中的选项解析 + +在 Bash 中解析选项的策略是循环遍历所有传递给 shell 脚本的参数,确定它们是否是一个选项,然后转向下一个参数。重复这个过程,直到没有选项为止。 + +``` +#!/bin/bash + +while [ True ]; do +if [ "$1" = "--alpha" -o "$1" = "-a" ]; then +    ALPHA=1 +    shift 1 +else +    break +fi +done + +echo $ALPHA +``` + +在这段代码中,我创建了一个 `while` 循环,它会一直进行循环操作,直到处理完所有参数。`if` 语句会试着将在第一个位置(`$1`)中找到的参数与 `--alpha` 或 `-a` 匹配。(此处的待匹配项是任意选项名称,并没有特殊意义。在实际的脚本中,你可以使用 `--verbose` 和 `-v` 来触发详细输出)。 + +`shift` 关键字会使所有参数位移一位,这样位置 2(`$2`)的参数移动到位置 1(`$1`)。处理完所有参数后会触发 `else` 语句,进而中断 `while` 循环。 + +在脚本的末尾,`$ALPHA` 的值会输出到终端。 + +测试一下这个脚本: + +``` +$ bash ./test.sh --alpha +1 +$ bash ./test.sh + +$ bash ./test.sh -a +1 +``` + +可以看到,选项被正确地检测到了。 + +### 在 Bash 中检测参数 + +但上面的脚本还有一个问题:多余的参数被忽略了。 + +``` +$ bash ./test.sh --alpha foo +1 +$ +``` + +要想捕获非选项名的参数,可以将剩余的参数转储到 [Bash 数组][5] 中。 + +``` +#!/bin/bash + +while [ True ]; do +if [ "$1" = "--alpha" -o "$1" = "-a" ]; then +    ALPHA=1 +    shift 1 +else +    break +fi +done + +echo $ALPHA + +ARG=( "${@}" ) +for i in ${ARG[@]}; do +    echo $i +done +``` + +测试一下新版的脚本: + +``` +$ bash ./test.sh --alpha foo +1 +foo +$ bash ./test.sh foo + +foo +$ bash ./test.sh --alpha foo bar +1 +foo +bar +``` + +### 带参选项 + +有一些选项需要传入参数。比如,你可能希望允许用户设置诸如颜色或图形分辨率之类的属性,或者将应用程序指向自定义配置文件。 + +要在 Bash 中实现这一点,你仍然可以像使用布尔开关一样使用 `shift` 关键字,但参数需要位移两位而不是一位。 + +``` +#!/bin/bash + +while [ True ]; do +if [ "$1" = "--alpha" -o "$1" = "-a" ]; then +    ALPHA=1 +    shift 1 +elif [ "$1" = "--config" -o "$1" = "-c" ]; then +    CONFIG=$2 +    shift 2 +else +    break +fi +done + +echo $ALPHA +echo $CONFIG + +ARG=( "${@}" ) + +for i in ${ARG[@]}; do +    echo $i +done +``` + +在这段代码中,我添加了一个 `elif` 子句来将每个参数与 `--config` 和 `-c` 进行比较。如果匹配,名为 `CONFIG` 的变量的值就设置为下一个参数的值(这就表示 `--config` 选项需要一个参数)。所有参数都位移两位:其中一位是跳过 `--config` 或 `-c`,另一位是跳过其参数。与上节一样,循环重复直到没有匹配的参数。 + +下面是新版脚本的测试: + +``` +$ bash ./test.sh --config my.conf foo bar +my.conf +foo +bar +$ bash ./test.sh -a --config my.conf baz +1 +my.conf +baz +``` + +### Bash 让选项解析变得简单 + +还有一些其他方法也可以解析 Bash 中的选项。你可以替换使用 `case` 语句或 `getopt` 命令。无论使用什么方法,给你的用户提供选项都是应用程序的重要功能,而 Bash 让解析选项成为了一件简单的事。 + +-------------------------------------------------------------------------------- + +via: https://opensource.com/article/21/8/option-parsing-bash + +作者:[Seth Kenlon][a] +选题:[lujun9972][b] +译者:[unigeorge](https://github.com/unigeorge) +校对:[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/terminal-commands_1.png?itok=Va3FdaMB (Terminal commands) +[2]: https://opensource.com/article/21/8/linux-terminal#options +[3]: https://opensource.com/article/19/7/what-posix-richard-stallman-explains +[4]: https://opensource.com/downloads/bash-scripting-ebook +[5]: https://opensource.com/article/18/5/you-dont-know-bash-intro-bash-arrays diff --git a/published/202108/20210826 30 things you didn-t know about the Linux kernel.md b/published/202108/20210826 30 things you didn-t know about the Linux kernel.md new file mode 100644 index 0000000000..0a8360ba4b --- /dev/null +++ b/published/202108/20210826 30 things you didn-t know about the Linux kernel.md @@ -0,0 +1,70 @@ +[#]: subject: "30 things you didn't know about the Linux kernel" +[#]: via: "https://opensource.com/article/21/8/linux-kernel" +[#]: author: "Seth Kenlon https://opensource.com/users/seth" +[#]: collector: "lujun9972" +[#]: translator: "wxy" +[#]: reviewer: "wxy" +[#]: publisher: "wxy" +[#]: url: "https://linux.cn/article-13724-1.html" + +关于 Linux 内核的 30 件你不知道的事 +====== + +> Linux 内核今年 30 岁了。 + +![](https://img.linux.net.cn/data/attachment/album/202108/27/150006o152rdghq0zqr02f.jpg) + +Linux 内核今年 30 岁了。这开创性的开源软件的三个十年,让用户能够运行自由软件,让他们能从运行的应用程序中学习,让他们能与朋友分享他们所学到的知识。有人认为,如果没有 Linux 内核,我们如今所享受的 [开源文化][2] 和自由软件的累累硕果,可能就不会应时而出现。如果没有 Linux 作为催化剂,苹果、微软和谷歌所开源的那些就不可能开源。Linux 作为一种现象,对开源文化、软件开发和用户体验的影响,是怎么强调都不为过的,但所有这一切,都滥觞于一个 Linux 内核。 + +Linux 内核是启动计算机、并识别和确保计算机内外所连接的所有组件之间通信的软件。这些对于大多数用户从未想过,更不用说能理解的代码,Linux 内核有很多令人惊讶的地方。以下是 Linux 内核在其三十年生命中每一年的一件事。顺序无关。 + + 1. Linux 是第一个具有 USB 3.0 驱动的操作系统。Sarah Sharp 在 2009 年 6 月 7 日宣布她的 USB 3.0 设备的驱动程序可以使用了,她的代码被包含在内核 2.6.31 版本中。 + 2. 当某些事件发生时,内核会将自己标记为“受污染”,这在以后的故障排除中可能有用。运行一个“被污染”的内核并不是什么问题。但如果出现错误,首先要做的是在一个没有被污染的内核上重现该问题。 + 3. 你可以指定一个主机名或域名作为 `ip=` 内核命令行选项的一部分,Linux 会保留它,而不是用 DHCP 或 BOOTP 提供的主机名或域名来覆盖它。例如,`ip=::::myhostname::dhcp` 设置主机名 `myhostname`。 + 4. 在文本启动过程中,可以选择显示黑白的、16 色的或 224 色的 Tux 徽标之一。 + 5. 在娱乐业中,DRM 是一种用来防止访问媒介的技术。然而,在 Linux 内核中,DRM 指的是直接渲染管理器Direct Rendering Manager,它指的是用于与对接显卡的 GPU 的库(`libdrm`)和驱动程序。 + 6. 能够在不重启的情况下给 Linux 内核打补丁。 + 7. 如果你自己编译内核,你可以将文本控制台配置为超过 80 列宽。 + 8. Linux 内核提供了内置的 FAT、exFAT 和 NTFS(读和写)支持。 + 9. Wacom 平板电脑和许多类似设备的驱动程序都内置在内核中。 + 10. 大多数内核高手使用 `git send-email` 来提交补丁。 + 11. 内核使用一个叫做 [Sphinx][3] 的文档工具链,它是用 Python 编写的。 + 12. Hamlib 提供了具有标准化 API 的共享库,可以通过你的 Linux 电脑控制业余无线电设备。 + 13. 我们鼓励硬件制造商帮助开发 Linux 内核,以确保兼容性。这样就可以直接处理硬件,而不必从制造商那里下载驱动程序。直接成为内核一部分的驱动程序也会自动从新版本内核的性能和安全改进中受益。 + 14. 内核中包含了许多树莓派模块(Pi Hats)的驱动程序。 + 15. netcat 乐队发布了一张只能作为 [Linux 内核模块][4] 播放的专辑。 + 16. 受 netcat 发布专辑的启发,人们又开发了一个 [把你的内核变成一个音乐播放器][5] 的模块。 + 17. Linux 内核的功能支持许多 CPU 架构:ARM、ARM64、IA-64、 m68k、MIPS、Nios II、PA-RISC、OpenRISC、PowerPC、s390、 Sparc、x86、Xtensa 等等。 + 18. 2001 年,Linux 内核成为第一个 [以长模式运行的 x86-64 CPU 架构][6]。 + 19. Linux 3.4 版引入了 x32 ABI,允许开发者编译在 64 位模式下运行的代码,而同时只使用 32 位指针和数据段。 + 20. 内核支持许多不同的文件系统,包括 Ext2、Ext3、Ext4、JFS、XFS、GFS2、GCFS2、BtrFS、NILFS2、NFS、Overlay FS、UDF 等等。 + 21. 虚拟文件系统Virtual File System(VFS)是 Linux 内核中的一个软件层,为用户运行的应用程序提供文件系统接口。它也是内核的一个抽象层,以便不同的文件系统实现可以共存。 + 22. Linux 内核包括一个实体的盲文输出设备的驱动程序。 + 23. 在 2.6.29 版本的内核中,启动时的 Tux 徽标被替换为 “Tuz”,以提高人们对当时影响澳大利亚的塔斯马尼亚魔鬼Tasmanian Devil(即袋獾)种群的一种侵袭性癌症的认识。 + 24. 控制组Control Groups(cgroups)是容器(Docker、Podman、Kubernetes 等的基础技术)能够存在的原因。 + 25. 曾经花了大量的法律行动来解放 CIFS,以便将其纳入内核中,而今天,CIFS 模块已被内置于内核,以实现对 SMB 的支持。这使得 Linux 可以挂载微软的远程共享和基于云的文件共享。 + 26. 对于计算机来说,产生一个真正的随机数是出了名的困难(事实上,到目前为止是不可能的)。`hw_random` 框架可以利用你的 CPU 或主板上的特殊硬件功能,尽量改进随机数的生成。 + 27. _操作系统抖动_ 是应用程序遇到的干扰,它是由后台进程的调度方式和系统处理异步事件(如中断)的方式的冲突引起的。像这些问题在内核文档中都有详细的讨论,可以帮助面向 Linux 开发的程序员写出更聪明的代码。 + 28. `make menuconfig` 命令可以让你在编译前使用 GUI 来配置内核。`Kconfig` 语言定义了内核配置选项。 + 29. 对于基本的 Linux 服务器,可以实施一个 _看门狗_ 系统来监控服务器的健康状况。在健康检查间隔中,`watchdog` 守护进程将数据写入一个特殊的 `watchdog` 内核设备,以防止系统重置。如果看门狗不能成功记录,系统就会被重置。有许多看门狗硬件的实现,它们对远程任务关键型计算机(如发送到火星上的计算机)至关重要。 + 30. 在火星上有一个 Linux 内核的副本,虽然它是在地球上开发的。 + +-------------------------------------------------------------------------------- + +via: https://opensource.com/article/21/8/linux-kernel + +作者:[Seth Kenlon][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/seth +[b]: https://github.com/lujun9972 +[1]: https://opensource.com/sites/default/files/styles/image-full-size/public/kernel-30.png?itok=xmwX2pCQ (30 years) +[2]: https://opensource.com/article/18/1/creative-commons-real-world +[3]: https://opensource.com/article/19/11/document-python-sphinx +[4]: https://github.com/usrbinnc/netcat-cpi-kernel-module +[5]: https://github.com/FlaviaR/Netcat-Music-Kernel-Expansion +[6]: http://www.x86-64.org/pipermail/announce/2001-June/000020.html diff --git a/published/202109/20200121 13 of the best React JavaScript frameworks.md b/published/202109/20200121 13 of the best React JavaScript frameworks.md new file mode 100644 index 0000000000..45d734f18e --- /dev/null +++ b/published/202109/20200121 13 of the best React JavaScript frameworks.md @@ -0,0 +1,444 @@ +[#]: collector: (lujun9972) +[#]: translator: (zpl1025) +[#]: reviewer: (wxy) +[#]: publisher: (wxy) +[#]: url: (https://linux.cn/article-13796-1.html) +[#]: subject: (13 of the best React JavaScript frameworks) +[#]: via: (https://opensource.com/article/20/1/react-javascript-frameworks) +[#]: author: (Amit Dua https://opensource.com/users/amitdua) + +13 个最好的 React JavaScript 框架 +====== + +> 如果你正在用 React.js 或 React Native 来开发用户界面的话,试试这些框架。 + +![](https://img.linux.net.cn/data/attachment/album/202109/18/095748k48eskmjpzuhyzuj.jpg) + +React.js 和 React Native 都是用来开发用户界面(UI)的很受欢迎的开源平台。在 StackOverflow 2019 年度开发者调查里,两个框架的可取性和使用情况都排名靠前。React.js 是 Facebook 在 2011 年开发的一个 JavaScript 库,来实现跨平台,动态以及高性能的 UI 设计需求;而 React Native 则是 Facebook 在 2015 年发布的框架,目的是使用 JavaScript 构建原生应用。 + +下面介绍 13 个最好的 React JavaScript 框架,都是开源项目。前 11 个(和 React 一样)都使用 MIT 许可证授权,后面两个使用 Apache 2.0 许可证。 + +### 1、Create React App + +这个 Facebook 开发的命令行工具是 React Native 项目一定要用的。因为 [Create React App][2] 使用很简单,还可以避免你自己手动设定和配置应用,因此能节省大量的时间和精力。仅仅使用给一个简单的命令,就可以为你准备好创建 React 原生项目所需的一切。你可以用它来创建分类和文件,而且该框架还自带了工具用来构建,测试和启动应用。 + +``` +# 安装软件包 +$ npm install -g create-react-native-web-app +  +# 运行 create-react-native-web-app <项目目录> +$ create-react-native-web-app myApp +  +# 切换到创建的 <项目目录> +$ cd myApp +  +# 运行 Web/Ios/Android 调试 +# Web +$ npm run web +  +# IOS(模拟) +$ npm run ios +  +# Android(实际连接的设备) +$ npm run android +``` + +#### 为什么选择 Create React App + + 1. 使用配置包、转码器,以及测试运行器进行开发的一流工具 + 2. 在应用架构里不需要配置以及没有额外文件 + 3. 确定的开发栈 + 4. 高效快速的开发工具 + +### 2、Material Kit React + +[Material Kit React][3] 是受谷歌的 Material Design 系统启发开发的,很适合用来创建 React UI 组件。这个库最大的优点是提供了大量的组件,可以互相搭配做出非常好的效果。有超过一千个完全编码的组件,每一个都有用文件夹组织起来的独立层。这样你就可以有上千个选项可以选择。它同时也包含一些示例页面,方便你从中寻找灵感,或者向别人分享你的点子或创意。 + +#### 安装 Material Kit + +``` +$ npm install @material-ui/core +``` + +#### 使用 + +``` +import React from 'react'; +import Button from '@material-ui/core/Button'; + +const App = () => ( +  +); +``` + +Material-UI 组件不需要其他额外设置,也不会干扰全局变量空间。 + +#### 优点 + +这个 React 组件支持简易快速的网页开发。你可以用它创建自己的设计系统,或者直接开始 Material Design。 + +### 3、Shards React + +这个现代的 React UI 工具为了追求高效率,是从最底层开始构建的。它拥有现代的设计系统,可以让你按自己的想法任意定制。你甚至可以下载源文件,然后从代码级别定制。另外,它用来设计样式的 SCSS 语法提高了开发体验。 + +[Shards React][4] 基于 Shards,使用了 React Datepicker、React Popper(一个定位引擎)和 noUISlider。还带有非常优秀的 Material Design 图标。还有很多设计好的版本,可以帮你寻找灵感或上手。 + +#### 用 Yarn 或 NPM 安装 Shards + +``` +# Yarn +yarn add shards-react + +# NPM +npm i shards-react +``` + +#### 优点 + + 1. Shards 是一个轻量级的脚本,压缩后大概 13kb + 2. Shards 默认支持响应式,图层可以适配任意大小屏幕 + 3. Shards 有完整的文档,可以快速开始构建漂亮的界面 + +### 4、Styled Components + +这个高效的 CSS 工具可以用来为应用的可视界面创建小型可重用的组件。使用传统的 CSS,你可能会不小心覆盖掉网站其他位置的选择器,但 [Styled Components][5] 通过使用直接内嵌到组件里的 CSS 语法,可以完全避免这个问题。 + +#### 安装 + +``` +npm install --save styled-components +``` + +#### 使用 + +``` +const Button = styled.button` +  background: background_type; +  border-radius: radius_value; +  border: abc; +  color: name_of_color; +  Margin: margin_value; +  padding: value`; +``` + +#### 优点 + + 1. 让组件有更好的可读性 + 2. 组件样式依赖 JavaScript + 3. 创建定制 CSS 组件 + 4. 内嵌样式 + 5. 简单地调用 `styled()` 可以将组件甚至是自定义组件转换成样式组件 + +### 5、Redux + +[Redux][6] 是一个为 JavaScript 应用提供状态管理的方案。常用于 React.js,也可以用在其他类 React 框架里。 + +#### 安装 + +``` +sudo npm install redux +sudo npm install react-redux +``` + +#### 使用 + +``` +import { createStore } from "redux"; +import rotateReducer from "reducers/rotateReducer"; + +function configureStore(state = { rotating: value}) { +  return createStore(rotateReducer,state); +} + +export default configureStore; +``` + +#### 优点 + + 1. 可预计的状态更新有助于定义应用里的数据流 + 2. 逻辑上测试更简单,使用 reducer 函数进行时间旅行调试也更容易 + 3. 统一管理状态 + +### 6、React Virtualized + +这个 React Native JavaScript 框架帮助渲染 large-list 和 tabular-data。使用 [React Virtualized][7],你可以限制请求和文档对象模型(DOM)元素的数量,从而提高 React 应用的性能。 + +#### 安装 + +``` +npm install react-virtualized +``` + +#### 使用 + +``` +import 'react-virtualized/styles.css' +import { Column, Table } from 'react-virtualized' +import AutoSizer from 'react-virtualized/dist/commonjs/AutoSizer' +import List from 'react-virtualized/dist/commonjs/List' +{ +  alias: { +    'react-virtualized/List': 'react-virtualized/dist/es/List', +  }, +  ...等等 +} +``` + +#### 优点 + + 1. 高效展示大量数据 + 2. 渲染超大数据集 + 3. 使用一系列组件实现虚拟渲染 + +### 7、React DnD + +[React DnD][8] 用来创建复杂的拖放界面。拖放控件库有很多,选用 React DnD 是因为它是基于 HTML5 的拖放 API 的,创建界面更简单。 + +#### 安装 + +``` +npm install react-dnd-preview +``` + +#### 使用 + +``` +import Preview from 'react-dnd-preview'; +  +const generatePreview = ({itemType, item, style}) => { +  return
{itemType}
; +}; + +class App extends React.Component { + ... +  render() { +    return ( +      +        +        +        // or +        {generatePreview} +      +    ); +  } +} +``` + +#### 优点 + + 1. 漂亮自然的控件移动 + 2. 强大的键盘和屏幕阅读支持 + 3. 极限性能 + 4. 强大整洁的接口 + 5. 标准浏览器支持非常好 + 6. 中性样式 + 7. 没有额外创建 DOM 节点 + +### 8、React Bootstrap + +这个 UI 库将 Bootstrap 的 JavaScript 替换成了 React,可以更好地控制每个组件的功能。每个组件都构建成能轻易访问,因此 [React Bootstrap][9] 有利于构建前端框架。有上千种 bootstrap 主题可以选择。 + +#### 安装 + +``` +npm install react-bootstrap bootstrap +``` + +#### 使用 + +``` +import 'bootstrap/dist/css/bootstrap.min.css'; +import React from 'react'; +import ReactDOM from 'react-dom'; +import './index.css'; +import App from './App'; +import registerServiceWorker from './registerServiceWorker'; + +ReactDOM.render(, document.getElementById('root')); +registerServiceWorker(); +``` + +#### 优点 + + 1. 可以简单导入所需的代码/组件 + 2. 通过压缩 Bootstrap 节省了输入和问题 + 3. 通过压缩 Bootstrap 减少了输入工作和冲突 + 4. 使用简单 + 5. 使用元素封装 + +### 9、React Suite + +[React Suite][10] 是另一个高效的 React.js 框架,包含了大量组件库,方便开发企业级产品。支持所有主流浏览器和平台,适用于任何系统。还支持服务器端渲染。 + +#### 安装 + +``` +npm i rsuite --save +``` + +#### 使用 + +``` +import { Button } from 'rsuite'; +import 'rsuite/styles/less/index.less'; +ReactDOM.render(, mountNode); +``` + +#### 优点 + + 1. 通过全局访问特性轻松管理应用 + 2. 使用 Redux 库集中管理系统状态 + 3. Redux 库有灵活的 UI 层,以及广泛的生态 + 4. Redux 库减少系统复杂度,并提供了全局访问特性 + +### 10、PrimeReact + +[PrimeReact][11] 最值得推荐的是它提供了几乎覆盖所有基本 UI 需求的组件,比如输入选项,菜单,数据展示,消息,等等。这个框架还优化了移动体验,帮助你设计触摸优化的元素。 + +#### 安装 + +``` +npm install primereact --save +npm install primeicons --save +``` + +#### 使用 + +``` +import {Dialog} from 'primereact/dialog'; +import {Accordion,AccordionTab} from 'primereact/accordion'; +dependencies: { +    "react": "^16.0.0", +    "react-dom": "^16.0.0", +    "react-transition-group": "^2.2.1", +    "classnames": "^2.2.5", +    "primeicons": "^2.0.0" +} +``` + +#### 优点 + + 1. 简单而高效 + 2. 容易使用 + 3. Spring 应用 + 4. 创建复杂用户界面 + 5. 好用而简单 + +### 11、React Router + +[React Router][12] 在 React Native 开发社区很受欢迎,因为它上手很容易。只需要你在电脑上安装 Git 和 npm 包管理工具,有 React 的基础知识,以及好学的意愿。没什么特别难的地方。 + +#### 安装 + +``` +$ npm install --save react-router +``` + +#### 使用 + +``` +import { Router, Route, Switch } from "react-router"; +  +// 使用 CommonJS 模块 +var Router = require("react-router").Router; +var Route = require("react-router").Route; +var Switch = require("react-router").Switch; +``` + +#### 优点 + + 1. 动态路由匹配 + 2. 在导航时支持不同页面的 CSS 切换 + 3. 统一的应用结构和行为 + +### 12、Grommet + +[Grommet][13] 常用于开发响应式、可访问的移动网页应用。这个用 Apache 2.0 许可证授权的 JavaScript 框架最大的优点是用很小的包提供了可访问性、模块化、响应式以及主题功能。这可能是它被一些公司广泛使用的主要原因,比如奈飞、通用电气、优步以及波音。 + +#### 安装 for yarn and npm + +``` +$ npm install grommet styled-components --save +``` + +#### 使用 + +``` +"grommet-controls/chartjs": { +          "transform": "grommet-controls/es6/chartjs/${member}", +          "preventFullImport": true, +          "skipDefaultConversion": true +``` + +#### 优点 + + 1. 创建一个工具包来打包 + 2. 把开放政策发挥到极致 + 3. 重构有助于影响已成立的组织 + +### 13、Onsen UI + +[Onsen UI][14] 另一个使用 HTML5 和 JavaScript 的手机应用开发框架,集成了 Angular、Vue 和 React,使用 Apache 2.0 许可证授权。 + +Onsen 提供了标签、侧边栏、堆栈导航以及其他组件。这个框架最好的地方是,它所有的组件都支持 iOS 和安卓 Material Design 自动适配,会根据不同的平台切换应用的外观。 + +#### 安装 + +``` +npm install onsenui +``` + +#### 使用 + +``` +(function() { +    'use strict'; +    var module = angular.module('app', ['onsen']); + +    module.controller('AppController', function($scope) { +      // more to come here +    }); + +})(); +``` + +#### 优点 + + 1. Onsen UI 基于自由而开源代码 + 2. 不强制基于它开发的应用使用任何形式的 DRM + 3. 内置了 JavaScript 和 HTML5 代码 + 4. 给最终用户带来原生体验 + +* * * + +你最喜欢哪个 React JavaScript 框架?请在评论区分享。 + +-------------------------------------------------------------------------------- + +via: https://opensource.com/article/20/1/react-javascript-frameworks + +作者:[Amit Dua][a] +选题:[lujun9972][b] +译者:[zpl1025](https://github.com/zpl1025) +校对:[wxy](https://github.com/wxy) + +本文由 [LCTT](https://github.com/LCTT/TranslateProject) 原创编译,[Linux中国](https://linux.cn/) 荣誉推出 + +[a]: https://opensource.com/users/amitdua +[b]: https://github.com/lujun9972 +[1]: https://opensource.com/sites/default/files/styles/image-full-size/public/lead-images/code_javascript.jpg?itok=60evKmGl (Javascript code close-up with neon graphic overlay) +[2]: https://github.com/facebook/create-react-app +[3]: https://github.com/creativetimofficial/material-kit-react +[4]: https://github.com/DesignRevision/shards-react +[5]: https://github.com/styled-components/styled-components +[6]: https://github.com/reduxjs/redux +[7]: https://github.com/bvaughn/react-virtualized +[8]: https://github.com/react-dnd/react-dnd/ +[9]: https://github.com/react-bootstrap/react-bootstrap +[10]: https://github.com/rsuite/rsuite +[11]: https://github.com/primefaces/primereact +[12]: https://github.com/ReactTraining/react-router +[13]: https://github.com/grommet/grommet +[14]: https://github.com/OnsenUI/OnsenUI diff --git a/published/202109/20200211 Using external libraries in Java.md b/published/202109/20200211 Using external libraries in Java.md new file mode 100644 index 0000000000..c1f3652236 --- /dev/null +++ b/published/202109/20200211 Using external libraries in Java.md @@ -0,0 +1,317 @@ +[#]: collector: (lujun9972) +[#]: translator: (unigeorge) +[#]: reviewer: (wxy) +[#]: publisher: (wxy) +[#]: url: (https://linux.cn/article-13769-1.html) +[#]: subject: (Using external libraries in Java) +[#]: via: (https://opensource.com/article/20/2/external-libraries-java) +[#]: author: (Chris Hermansen https://opensource.com/users/clhermansen) + +在 Java 中使用外部库 +====== + +> 外部库填补了 Java 核心库中的一些功能空白。 + +![](https://img.linux.net.cn/data/attachment/album/202109/10/075749s65x89uzxj8x5kq9.jpg) + +Java 自带有一组核心库,其中包含了定义常用数据类型和相关行为的库(例如 `String` 和 `Date`)、与主机操作系统交互的实用程序(例如 `System` 和 `File`),以及一些用来管理安全性、处理网络通信、创建或解析 XML的有用的子系统。鉴于核心库的丰富性,程序员通常很容易在其中找到有用的组件,以减少需要编写的代码量。 + +即便如此,核心库仍有一些功能上的不足,因此发现这些不足的程序员们还额外创建了很多有趣的 Java 库。例如,[Apache Commons][2]“是一个专注于可重用 Java 组件所有方面的 Apache 项目”,提供了大约 43 个开源库的集合(截至撰写本文时),涵盖了 Java 核心库之外的一系列功能 (例如 [geometry][3] 或 [statistics][4]),并增强或替换了 Java 核心库中的原有功能(例如 [math][5] 或 [numbers][6])。 + +另一种常见的 Java 库类型是系统组件的接口(例如数据库系统接口),本文会着眼于使用此类接口连接到 [PostgreSQL][7] 数据库,并得到一些有趣的信息。首先,我们来回顾一下库的重要部分。 + +### 什么是库? + +library里自然包含的是一些有用的代码。但为了发挥用处,代码需要以特定方式进行组织,特定的方式使 Java 程序员可以访问其中组件来解决手头问题。 + +可以说,一个库最重要的部分是它的应用程序编程接口(API)文档。这种文档很多人都熟悉,通常是由 [Javadoc][8] 生成的。Javadoc 读取代码中的结构化注释并以 HTML 格式输出文档,通常 API 的 package 在页面左上角的面板中显示,class 在左下角显示,同时右侧会有库、包或类级别的详细文档(具体取决于在主面板中选择的内容)。例如,[Apache Commons Math 的顶级 API 文档][9] 如下所示: + +![API documentation for Apache Commons Math][10] + +单击主面板中的包会显示该包中定义的 Java 类和接口。例如,[org.apache.commons.math4.analysis.solvers][11] 显示了诸如 `BisectionSolver` 这样的类,该类用于使用二分算法查找单变量实函数的零点。单击 [BisectionSolver][12] 链接会列出 `BisectionSolver` 类的所有方法。 + +这类文档可用作参考文档,不适合作为学习如何使用库的教程。比如,如果你知道什么是单变量实函数并查看包 `org.apache.commons.math4.analysis.function`,就可以试着使用该包来组合函数定义,然后使用 `org.apache.commons.math4.analysis.solvers` 包来查找刚刚创建的函数的零点。但如果你不知道,就可能需要更多学习向的文档,也许甚至是一个实际例子,来读懂参考文档。 + +这种文档结构还有助于阐明 package(相关 Java 类和接口定义的集合)的含义,并显示特定库中捆绑了哪些包。 + +这种库的代码通常是在 [.jar 文件][13] 中,它基本上是由 Java 的 `jar` 命令创建的 .zip 文件,其中还包含一些其他有用的信息。.jar 文件通常被创建为构建过程的端点,该构建过程编译了所定义包中的所有 .java 文件。 + +要访问外部库提供的功能,有两个主要步骤: + + 1. 确保通过类路径(或者命令行中的 `-cp` 参数或者 `CLASSPATH` 环境变量),库可用于 Java 编译步骤([javac][14])和执行步骤(`java`)。 + 2. 使用恰当的 `import` 语句访问程序源代码中的包和类。 + +其余的步骤就与使用 `String` 等 Java核心类相同,使用库提供的类和接口定义来编写代码。很简单对吧?不过也没那么简单。首先,你需要了解库组件的预期使用模式,然后才能编写代码。 + +### 示例:连接 PostgreSQL 数据库 + +在数据库系统中访问数据的典型使用步骤是: + + 1. 访问正在使用的特定数据库软件代码。 + 2. 连接到数据库服务器。 + 3. 构建查询字符串。 + 4. 执行查询字符串。 + 5. 针对返回的结果,做需要的处理。 + 6. 断开与数据库服务器的连接。 + +所有这些面向程序员的部分由接口包 [java.sql][15] 提供,它独立于数据库,定义了核心客户端 Java 数据库连接(JDBC)API。`java.sql` 包是 Java 核心库的一部分,因此无需提供 .jar 文件即可编译。但每个数据库提供者都会创建自己的 `java.sql` 接口实现(例如 `Connection` 接口),并且必须在运行步骤中提供这些实现。 + +接下来我们使用 PostgreSQL,看看这一过程是如何进行的。 + +#### 访问特定数据库的代码 + +以下代码使用 [Java 类加载器][16](`Class.forName()` 调用)将 PostgreSQL 驱动程序代码加载到正在执行的虚拟机中: + +``` +import java.sql.*; + +public class Test1 { + + public static void main(String args[]) { + + // Load the driver (jar file must be on class path) [1] + + try { + Class.forName("org.postgresql.Driver"); + System.out.println("driver loaded"); + } catch (Exception e1) { + System.err.println("couldn't find driver"); + System.err.println(e1); + System.exit(1); + } + + // If we get here all is OK + + System.out.println("done."); + } +} +``` + +因为类加载器可能失败,失败时会抛出异常,所以将对 `Class.forName()` 的调用放在 `try-catch` 代码块中。 + +如果你使用 `javac` 编译上面的代码,然后用 `java` 运行,会报异常: + +``` +me@mymachine:~/Test$ javac Test1.java +me@mymachine:~/Test$ java Test1 +couldn't find driver +java.lang.ClassNotFoundException: org.postgresql.Driver +me@mymachine:~/Test$ +``` + +类加载器要求类路径中有包含 PostgreSQL JDBC 驱动程序实现的 .jar 文件: + +``` +me@mymachine:~/Test$ java -cp ~/src/postgresql-42.2.5.jar:. Test1 +driver loaded +done. +me@mymachine:~/Test$ +``` + +#### 连接到数据库服务器 + +以下代码实现了加载 JDBC 驱动程序和创建到 PostgreSQL 数据库的连接: + +``` +import java.sql.*; + +public class Test2 { + + public static void main(String args[]) { + + // Load the driver (jar file must be on class path) [1] + + try { + Class.forName("org.postgresql.Driver"); + System.out.println("driver loaded"); + } catch (Exception e1) { + System.err.println("couldn't find driver"); + System.err.println(e1); + System.exit(1); + } + + // Set up connection properties [2] + + java.util.Properties props = new java.util.Properties(); + props.setProperty("user","me"); + props.setProperty("password","mypassword"); + String database = "jdbc:postgresql://myhost.org:5432/test"; + + // Open the connection to the database [3] + + try (Connection conn = DriverManager.getConnection(database, props)) { + System.out.println("connection created"); + } catch (Exception e2) { + System.err.println("sql operations failed"); + System.err.println(e2); + System.exit(2); + } + System.out.println("connection closed"); + + // If we get here all is OK + + System.out.println("done."); + } +} +``` + +编译并运行上述代码: + +``` +me@mymachine:~/Test$ javac Test2.java +me@mymachine:~/Test$ java -cp ~/src/postgresql-42.2.5.jar:. Test2 +driver loaded +connection created +connection closed +done. +me@mymachine:~/Test$ +``` + +关于上述的一些注意事项: + + * 注释 `[2]` 后面的代码使用系统属性来设置连接参数(在本例中参数为 PostgreSQL 用户名和密码)。代码也可以从 Java 命令行获取这些参数并将所有参数作为参数包传递,同时还有一些其他 `Driver.getConnection()` 选项可用于单独传递参数。 + * JDBC 需要一个用于定义数据库的 URL,它在上述代码中被声明为 `String database` 并与连接参数一起传递给 `Driver.getConnection()` 方法。 + * 代码使用 `try-with-resources` 语句,它会在 `try-catch` 块中的代码完成后自动关闭连接。[Stack Overflow][23] 上对这种方法进行了长期的讨论。 + * `try-with-resources` 语句提供对 `Connection` 实例的访问,并可以在其中执行 SQL 语句;所有错误都会被同一个 `catch` 语句捕获。 + +#### 用数据库的连接处理一些有趣的事情 + +日常工作中,我经常需要知道为给定的数据库服务器实例定义了哪些用户,这里我使用这个 [简便的 SQL][24] 来获取所有用户的列表: + +``` +import java.sql.*; + +public class Test3 { + + public static void main(String args[]) { + + // Load the driver (jar file must be on class path) [1] + + try { + Class.forName("org.postgresql.Driver"); + System.out.println("driver loaded"); + } catch (Exception e1) { + System.err.println("couldn't find driver"); + System.err.println(e1); + System.exit(1); + } + + // Set up connection properties [2] + + java.util.Properties props = new java.util.Properties(); + props.setProperty("user","me"); + props.setProperty("password","mypassword"); + String database = "jdbc:postgresql://myhost.org:5432/test"; + + // Open the connection to the database [3] + + try (Connection conn = DriverManager.getConnection(database, props)) { + System.out.println("connection created"); + + // Create the SQL command string [4] + + String qs = "SELECT " + + " u.usename AS \"User name\", " + + " u.usesysid AS \"User ID\", " + + " CASE " + + " WHEN u.usesuper AND u.usecreatedb THEN " + + " CAST('superuser, create database' AS pg_catalog.text) " + + " WHEN u.usesuper THEN " + + " CAST('superuser' AS pg_catalog.text) " + + " WHEN u.usecreatedb THEN " + + " CAST('create database' AS pg_catalog.text) " + + " ELSE " + + " CAST('' AS pg_catalog.text) " + + " END AS \"Attributes\" " + + "FROM pg_catalog.pg_user u " + + "ORDER BY 1"; + + // Use the connection to create a statement, execute it, + // analyze the results and close the result set [5] + + Statement stat = conn.createStatement(); + ResultSet rs = stat.executeQuery(qs); + System.out.println("User name;User ID;Attributes"); + while (rs.next()) { + System.out.println(rs.getString("User name") + ";" + + rs.getLong("User ID") + ";" + + rs.getString("Attributes")); + } + rs.close(); + stat.close(); + + } catch (Exception e2) { + System.err.println("connecting failed"); + System.err.println(e2); + System.exit(1); + } + System.out.println("connection closed"); + + // If we get here all is OK + + System.out.println("done."); + } +} +``` + +在上述代码中,一旦有了 `Connection` 实例,它就会定义一个查询字符串(上面的注释 `[4]`),创建一个 `Statement` 实例并用其来执行查询字符串,然后将其结果放入一个 `ResultSet` 实例。程序可以遍历该 `ResultSet` 实例来分析返回的结果,并以关闭 `ResultSet` 和 `Statement` 实例结束(上面的注释 `[5]`)。 + +编译和执行程序会产生以下输出: + +``` +me@mymachine:~/Test$ javac Test3.java +me@mymachine:~/Test$ java -cp ~/src/postgresql-42.2.5.jar:. Test3 +driver loaded +connection created +User name;User ID;Attributes +fwa;16395;superuser +vax;197772; +mbe;290995; +aca;169248; +connection closed +done. +me@mymachine:~/Test$ +``` + +这是在一个简单的 Java 应用程序中使用 PostgreSQL JDBC 库的(非常简单的)示例。要注意的是,由于 `java.sql` 库的设计方式,它不需要在代码中使用像 `import org.postgresql.jdbc.*;` 这样的 Java 导入语句,而是使用 Java 类加载器在运行时引入 PostgreSQL 代码的方式,也正因此无需在代码编译时指定类路径。 + +-------------------------------------------------------------------------------- + +via: https://opensource.com/article/20/2/external-libraries-java + +作者:[Chris Hermansen][a] +选题:[lujun9972][b] +译者:[unigeorge](https://github.com/unigeorge) +校对:[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/books_library_reading_list.jpg?itok=O3GvU1gH (books in a library, stacks) +[2]: https://commons.apache.org/ +[3]: https://commons.apache.org/proper/commons-geometry/ +[4]: https://commons.apache.org/proper/commons-statistics/ +[5]: https://commons.apache.org/proper/commons-math/ +[6]: https://commons.apache.org/proper/commons-numbers/ +[7]: https://opensource.com/article/19/11/getting-started-postgresql +[8]: https://en.wikipedia.org/wiki/Javadoc +[9]: https://commons.apache.org/proper/commons-math/apidocs/index.html +[10]: https://opensource.com/sites/default/files/uploads/api-documentation_apachecommonsmath.png (API documentation for Apache Commons Math) +[11]: https://commons.apache.org/proper/commons-math/apidocs/org/apache/commons/math4/analysis/solvers/package-summary.html +[12]: https://commons.apache.org/proper/commons-math/apidocs/org/apache/commons/math4/analysis/solvers/BisectionSolver.html +[13]: https://en.wikipedia.org/wiki/JAR_(file_format) +[14]: https://en.wikipedia.org/wiki/Javac +[15]: https://docs.oracle.com/javase/8/docs/api/java/sql/package-summary.html +[16]: https://en.wikipedia.org/wiki/Java_Classloader +[17]: http://www.google.com/search?hl=en&q=allinurl%3Adocs.oracle.com+javase+docs+api+string +[18]: http://www.google.com/search?hl=en&q=allinurl%3Adocs.oracle.com+javase+docs+api+system +[19]: http://www.google.com/search?hl=en&q=allinurl%3Adocs.oracle.com+javase+docs+api+exception +[20]: http://www.google.com/search?hl=en&q=allinurl%3Adocs.oracle.com+javase+docs+api+properties +[21]: http://www.google.com/search?hl=en&q=allinurl%3Adocs.oracle.com+javase+docs+api+connection +[22]: http://www.google.com/search?hl=en&q=allinurl%3Adocs.oracle.com+javase+docs+api+drivermanager +[23]: https://stackoverflow.com/questions/8066501/how-should-i-use-try-with-resources-with-jdbc +[24]: https://www.postgresql.org/message-id/1121195544.8208.242.camel@state.g2switchworks.com +[25]: http://www.google.com/search?hl=en&q=allinurl%3Adocs.oracle.com+javase+docs+api+statement +[26]: http://www.google.com/search?hl=en&q=allinurl%3Adocs.oracle.com+javase+docs+api+resultset +[27]: http://www.google.com/search?hl=en&q=allinurl%3Adocs.oracle.com+javase+docs+api+attributes diff --git a/published/202109/20200908 Deploy a deep learning model on Kubernetes.md b/published/202109/20200908 Deploy a deep learning model on Kubernetes.md new file mode 100644 index 0000000000..cf034c4879 --- /dev/null +++ b/published/202109/20200908 Deploy a deep learning model on Kubernetes.md @@ -0,0 +1,274 @@ +[#]: collector: (lujun9972) +[#]: translator: (chunibyo-wly) +[#]: reviewer: (wxy) +[#]: publisher: (wxy) +[#]: url: (https://linux.cn/article-13744-1.html) +[#]: subject: (Deploy a deep learning model on Kubernetes) +[#]: via: (https://opensource.com/article/20/9/deep-learning-model-kubernetes) +[#]: author: (Chaimaa Zyani https://opensource.com/users/chaimaa) + +在 Kubernetes 上部署一个深度学习模型 +====== + +> 了解如何使用 Kubermatic Kubernetes 平台来部署、扩展与管理图像识别预测的深度学习模型。 + +![](https://img.linux.net.cn/data/attachment/album/202109/01/233417ryy87hyza7jmgy33.jpg) + +随着企业增加了对人工智能(AI)、机器学习(ML)与深度学习(DL)的使用,出现了一个关键问题:如何将机器学习的开发进行规模化与产业化?这些讨论经常聚焦于机器学习模型本身;然而,模型仅仅只是完整解决方案的其中一环。为了达到生产环境的应用和规模,模型的开发过程必须还包括一个可以说明开发前后关键活动以及可公用部署的可重复过程。 + +本文演示了如何使用 [Kubermatic Kubernetes 平台][2] 对图像识别预测的深度学习模型进行部署、扩展与管理。 + +Kubermatic Kubernetes 平台是一个生产级的开源 Kubernetes 集群管理工具,提供灵活性和自动化,与机器学习/深度学习工作流程整合,具有完整的集群生命周期管理。 + +### 开始 + +这个例子部署了一个用于图像识别的深度学习模型。它使用了 [CIFAR-10][3] 数据集,包含了 60,000 张分属 10 个类别的 32x32 彩色图,同时使用了 [Apache MXNet][5] 的 [Gluon][4] 与 NVIDIA GPU 进行加速计算。如果你希望使用 CIFAR-10 数据集的预训练模型,可以查阅其 [入门指南][6]。 + +使用训练集中的样本对模型训练 200 次,只要训练误差保持缓慢减少,就可以保证模型不会过拟合。下方图展示了训练的过程: + +![深度学习模型训练 loss 图][7] + +训练结束后,必须保存模型训练所得到的参数,以便稍后可以加载它们: + +``` +file_name = "net.params" +net.save_parameters(file_name) +``` + +一旦你的模型训练好了,就可以用 Flask 服务器来封装它。下方的程序演示了如何接收请求中的一张图片作为参数,并在响应中返回模型的预测结果: + +``` +from gluoncv.model_zoo import get_model +import matplotlib.pyplot as plt +from mxnet import gluon, nd, image +from mxnet.gluon.data.vision import transforms +from gluoncv import utils +from PIL import Image +import io +import flask +app = flask.Flask(__name__) + +@app.route("/predict",methods=["POST"]) +def predict(): +    if flask.request.method == "POST": +        if flask.request.files.get("img"): +           img = Image.open(io.BytesIO(flask.request.files["img"].read())) +            transform_fn = transforms.Compose([ +            transforms.Resize(32), +            transforms.CenterCrop(32), +            transforms.ToTensor(), +            transforms.Normalize([0.4914, 0.4822, 0.4465], [0.2023, 0.1994, 0.2010])]) +            img = transform_fn(nd.array(img)) +            net = get_model('cifar_resnet20_v1', classes=10) +            net.load_parameters('net.params') +            pred = net(img.expand_dims(axis=0)) +            class_names = ['airplane', 'automobile', 'bird', 'cat', 'deer', +                       'dog', 'frog', 'horse', 'ship', 'truck'] +            ind = nd.argmax(pred, axis=1).astype('int') +            prediction = 'The input picture is classified as [%s], with probability %.3f.'% +                         (class_names[ind.asscalar()], nd.softmax(pred)[0][ind].asscalar()) +    return prediction + +if __name__ == '__main__': +   app.run(host='0.0.0.0') +``` + +### 容器化模型 + +在将模型部署到 Kubernetes 前,你需要先安装 Docker 并使用你的模型创建一个镜像。 + +1. 下载、安装并启动 Docker: + + ``` + sudo yum install -y yum-utils device-mapper-persistent-data lvm2 + sudo yum-config-manager --add-repo + sudo yum install docker-ce + sudo systemctl start docker + ``` + +2. 创建一个你用来管理代码与依赖的文件夹: + + ``` + mkdir kubermatic-dl + cd kubermatic-dl + ``` + +3. 创建 `requirements.txt` 文件管理代码运行时需要的所有依赖: + + ``` + flask + gluoncv + matplotlib + mxnet + requests + Pillow + ``` + +4. 创建 `Dockerfile`,Docker 将根据这个文件创建镜像: + + ``` + FROM python:3.6 + WORKDIR /app + COPY requirements.txt /app + RUN pip install -r ./requirements.txt + COPY app.py /app + CMD ["python", "app.py"] + ``` + + 这个 `Dockerfile` 主要可以分为三个部分。首先,Docker 会下载 Python 的基础镜像。然后,Docker 会使用 Python 的包管理工具 `pip` 安装 `requirements.txt` 记录的包。最后,Docker 会通过执行 `python app.py` 来运行你的脚本。 + +5. 构建 Docker 容器: + + ``` + sudo docker build -t kubermatic-dl:latest . + ``` + 这条命令使用 `kubermatic-dl` 镜像为你当前工作目录的代码创建了一个容器。 + +6. 使用 + + ``` + sudo docker run -d -p 5000:5000 kubermatic-dl + ``` + + 命令检查你的容器可以在你的主机上正常运行。 + +7. 使用 + + ``` + sudo docker ps -a + ``` + 命令查看你本地容器的运行状态: + + ![查看容器的运行状态][9] + +### 将你的模型上传到 Docker Hub + +在向 Kubernetes 上部署模型前,你的镜像首先需要是公开可用的。你可以通过将你的模型上传到 [Docker Hub][10] 来将它公开。(如果你没有 Docker Hub 的账号,你需要先创建一个) + +1. 在终端中登录 Docker Hub 账号: + + ``` + sudo docker login + ``` + +2. 给你的镜像打上标签,这样你的模型上传到 Docker Hub 后也能拥有版本信息: + + ``` + sudo docker tag / + + sudo docker push / + ``` + + ![给镜像打上 tag][11] + +3. 使用 + + ``` + sudo docker images + ``` + + 命令检查你的镜像的 ID。 + +### 部署你的模型到 Kubernetes 集群 + +1. 首先在 Kubermatic Kubernetes 平台创建一个项目, 然后根据 [快速开始][12] 创建一个 Kubernetes 集群。 + + ![创建一个 Kubernetes 集群][13] + +2. 下载用于访问你的集群的 `kubeconfig`,将它放置在下载目录中,并记得设置合适的环境变量,使得你的环境能找到它: + + ![Kubernetes 集群示例][14] + +3. 使用 `kubectl` 命令检查集群信息,例如,需要检查 `kube-system` 是否在你的集群正常启动了就可以使用命令 `kubectl cluster-info`: + + ![查看集群信息][15] + +4. 为了在集群中运行容器,你需要创建一个部署用的配置文件(`deployment.yaml`),再运行 `apply` 命令将其应用于集群中: + + ``` + apiVersion: apps/v1 + kind: Deployment + metadata: +   name: kubermatic-dl-deployment + spec: +   selector: +     matchLabels: +       app: kubermatic-dl +   replicas: 3 +   template: +     metadata: +       labels: +         app: kubermatic-dl +     spec: +      containers: +      - name: kubermatic-dl +        image: kubermatic00/kubermatic-dl:latest +        imagePullPolicy: Always +        ports: +        - containerPort: 8080 + + ``` + + ``` + kubectl apply -f deployment.yaml` + ``` + +5. 为了将你的部署开放到公网环境,你需要一个能够给你的容器创建外部可达 IP 地址的服务: + + ``` + kubectl expose deployment kubermatic-dl-deployment  --type=LoadBalancer --port 80 --target-port 5000` + ``` + +6. 就快大功告成了!首先检查你布署的服务的状态,然后通过 IP 请求的你图像识别 API: + + ``` + kubectl get service + ``` + + ![获取请求图像识别 API 的 IP 地址][16] + +7. 最后根据你的外部 IP 使用以下两张图片对你的图像识别服务进行测试: + + ![马][17] + + ![狗][18] + + ![测试 API][19] + +### 总结 + +在这篇教程中,你可以创建一个深度学习模型,并且使用 Flask 提供 [REST API][20] 服务。它介绍了如何将应用放在 Docker 容器中,如何将这个镜像上传到 Docker Hub 中,以及如何使用 Kubernetes 部署你的服务。只需几个简单的命令,你就可以使用 Kubermatic Kubernetes 平台部署该应用程序,并且开放服务给别人使用。 + +-------------------------------------------------------------------------------- + +via: https://opensource.com/article/20/9/deep-learning-model-kubernetes + +作者:[Chaimaa Zyani][a] +选题:[lujun9972][b] +译者:[chunibyo-wly](https://github.com/chunibyo-wly) +校对:[wxy](https://github.com/wxy) + +本文由 [LCTT](https://github.com/LCTT/TranslateProject) 原创编译,[Linux中国](https://linux.cn/) 荣誉推出 + +[a]: https://opensource.com/users/chaimaa +[b]: https://github.com/lujun9972 +[1]: https://opensource.com/sites/default/files/styles/image-full-size/public/lead-images/brain_computer_solve_fix_tool.png?itok=okq8joti (Brain on a computer screen) +[2]: https://www.loodse.com/products/kubermatic/ +[3]: https://www.cs.toronto.edu/~kriz/cifar.html +[4]: https://gluon.mxnet.io/ +[5]: https://mxnet.apache.org/ +[6]: https://gluon-cv.mxnet.io/build/examples_classification/demo_cifar10.html +[7]: https://opensource.com/sites/default/files/uploads/trainingplot.png (Deep learning model training plot) +[8]: https://creativecommons.org/licenses/by-sa/4.0/ +[9]: https://opensource.com/sites/default/files/uploads/containerstatus.png (Checking the container's status) +[10]: https://hub.docker.com/ +[11]: https://opensource.com/sites/default/files/uploads/tagimage.png (Tagging the image) +[12]: https://docs.kubermatic.com/kubermatic/v2.13/installation/install_kubermatic/_installer/ +[13]: https://opensource.com/sites/default/files/uploads/kubernetesclusterempty.png (Create a Kubernetes cluster) +[14]: https://opensource.com/sites/default/files/uploads/kubernetesexamplecluster.png (Kubernetes cluster example) +[15]: https://opensource.com/sites/default/files/uploads/clusterinfo.png (Checking the cluster info) +[16]: https://opensource.com/sites/default/files/uploads/getservice.png (Get the IP address to call your image recognition API) +[17]: https://opensource.com/sites/default/files/uploads/horse.jpg (Horse) +[18]: https://opensource.com/sites/default/files/uploads/dog.jpg (Dog) +[19]: https://opensource.com/sites/default/files/uploads/testapi.png (Testing the API) +[20]: https://www.redhat.com/en/topics/api/what-is-a-rest-api diff --git a/published/202109/20210228 What is GNU-Linux Copypasta.md b/published/202109/20210228 What is GNU-Linux Copypasta.md new file mode 100644 index 0000000000..0026fa8d35 --- /dev/null +++ b/published/202109/20210228 What is GNU-Linux Copypasta.md @@ -0,0 +1,69 @@ +[#]: subject: (What is GNU/Linux Copypasta?) +[#]: via: (https://itsfoss.com/gnu-linux-copypasta/) +[#]: author: (Abhishek Prakash https://itsfoss.com/author/abhishek/) +[#]: collector: (lujun9972) +[#]: translator: (wxy) +[#]: reviewer: (wxy) +[#]: publisher: (wxy) +[#]: url: (wxy) + +谈谈 GNU/Linux 口水话 +====== + +![](https://i2.wp.com/itsfoss.com/wp-content/uploads/2021/02/gnu-linux-copypasta.png) + +作为一个 Linux 用户,你可能遇到过以这样开头的一大段文字:“我想插一句话。你所说的 Linux,实际上是指 GNU/Linux。” + +这让一些人对什么是 “Linux” 和什么是 “GNU/Linux” 感到困惑。对此,我在关于 [Linux 发行版的概念][1] 的文章中已经解释过。 + +基本上,[Linux 是一个内核][2],加上 [GNU 软件][3],它就可以以操作系统的形式使用。 + +许多纯粹主义者和拥趸们不希望人们忘记 GNU 对基于 Linux 的操作系统的贡献。因此,他们经常在各种论坛和社区发布这篇长文(被称为 GNU Linux 口水话copypaste)。 + +我不清楚这些 GNU/Linux 口水话的起源,也不清楚它是从什么时候开始出现的。有些人把它归功于 Richard Stallman 的 [2011 年在 GNU 博客上的文章][4]。我无法证实或否认这一点。 + +### 完整的 GNU/Linux 口水话 + +> 我只想插一句话。你所说的 Linux,实际上是 GNU/Linux,或者正如我最近所称,是 GNU + Linux。Linux 本身并不是一个操作系统,而是功能齐全的 GNU 系统的另一个自由组件,这个系统是由 GNU 核心库、shell 实用程序和重要的系统组件组成的、按 POSIX 定义构成的完整操作系统。 +> +> 许多计算机用户每天都在运行着一个修改过的 GNU 系统,却没有意识到这一点。通过一个奇特的转折,这个今天被广泛使用的 GNU 版本通常被称为 Linux,而它的许多用户并不知道它基本上是由 GNU 项目开发的 GNU 系统。 +> +> Linux 倒也真的是存在,这些人也在使用它,但它只是他们使用的系统的一部分罢了。Linux 是内核:在系统中该程序将机器的资源分配给你运行的其他程序。内核是操作系统的一个重要部分,但它本身是无用的;它只能在一个完整的操作系统的环境下发挥作用。Linux 通常与 GNU 操作系统结合使用:整个系统基本上是添加了 Linux 的 GNU,或者叫 GNU/Linux。所有所谓的 Linux 发行版实际上都是 GNU/Linux 的发行版! + +### 到底什么是口水话? + +![][7] + +你是否注意到,我使用了“Copypasta”(LCTT 译注:译者选择翻译为“口水话”,或许有更贴合中文的译法,请大家指正)这个术语。它与意大利面pasta毫无关系。 + +[口水话][8] 是在互联网上复制和粘贴的文本块,通常是为了嘲弄或取笑别人。它是“复制-粘贴copy-paste”一词的变种。 + +口水话也被认为是垃圾内容,因为它们被重复了一次又一次。以 GNU Linux 口水话为例。如果每次有人在讨论区中使用 Linux 这个词而不是 GNU/Linux 时,总会有几个人不断地粘贴这些大段的文本,那么就会惹恼其他成员。 + +### 你有没有贴过 GNU/Linux 口水话? + +就个人而言,我从来没有这样做过。但是,说实话,当我还是一个新的 Linux 用户,在浏览一些 Linux 论坛时,我就是这样知道 GNU/Linux 这个术语的。 + +你呢?你有没有在 Linux 论坛上复制粘贴过“我想插一句话……”?你认为它是“嘲弄”工具,还是让人们了解 GNU 项目的必要之举? + +-------------------------------------------------------------------------------- + +via: https://itsfoss.com/gnu-linux-copypasta/ + +作者:[Abhishek Prakash][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://itsfoss.com/author/abhishek/ +[b]: https://github.com/lujun9972 +[1]: https://itsfoss.com/what-is-linux-distribution/ +[2]: https://itsfoss.com/what-is-linux/ +[3]: https://www.gnu.org/ +[4]: https://www.gnu.org/gnu/linux-and-gnu.html +[5]: https://i0.wp.com/itsfoss.com/wp-content/uploads/2020/09/what-is-foss.png?fit=800%2C450&ssl=1 +[6]: https://itsfoss.com/what-is-foss/ +[7]: https://i0.wp.com/itsfoss.com/wp-content/uploads/2021/02/copypasta.png?resize=800%2C450&ssl=1 +[8]: https://www.makeuseof.com/what-is-a-copypasta/ diff --git a/published/202109/20210424 Can We Recommend Linux for Gaming in 2021.md b/published/202109/20210424 Can We Recommend Linux for Gaming in 2021.md new file mode 100644 index 0000000000..d2e5ad57bf --- /dev/null +++ b/published/202109/20210424 Can We Recommend Linux for Gaming in 2021.md @@ -0,0 +1,123 @@ +[#]: subject: (Can We Recommend Linux for Gaming in 2021?) +[#]: via: (https://news.itsfoss.com/linux-for-gaming-opinion/) +[#]: author: (Ankush Das https://news.itsfoss.com/author/ankush/) +[#]: collector: (lujun9972) +[#]: translator: (perfiffer) +[#]: reviewer: (wxy) +[#]: publisher: (wxy) +[#]: url: (https://linux.cn/article-13826-1.html) + +2021 年了,我们能推荐使用 Linux 来玩游戏吗? +====== + +> 每天,Linux 都在进行不断进步,以支持具有适当图形支持的现代游戏。但是,我们能推荐 Linux 用于游戏吗? + +![](https://i0.wp.com/news.itsfoss.com/wp-content/uploads/2021/04/Gaming-On-Linux.jpg?w=1200&ssl=1) + +你经常会听到 Linux 爱好者称赞 Linux 上改进的游戏功能。是的,考虑到在 Linux 桌面上支持现代游戏所取得的进步,Linux 已经在游戏方面获得了很大的提升。 + +甚至 Lutris 的创造者在我们的采访中也提到 [Linux 在游戏方面取得的进步简直令人难以置信][1]。 + +但是,这有什么值得大肆宣传的吗?我们能向游戏玩家推荐 Linux 吗? Linux 适合玩游戏吗? + +此文中,我想分享一些关于在 Linux 系统上玩游戏的的事情,并分享我对它的看法。 + +### 你可以在 Linux 上玩游戏吗?是的! + +如果有人曾经告诉过你,不能在 Linux 上玩游戏,**那是不对的**。 + +你可以在 Linux 上玩各种游戏而不会出现任何大的障碍。而且,在大多数情况下,它是可玩的,并且会提供很好的游戏体验。 + +事实上,如果你不知道从哪里开始,我们有一份 [Linux 游戏终极指南][2] 提供给你。 + +### 需要一个特定的 Linux 发行版才能玩游戏吗? + +并非如此。这取决于你想获得多么方便的体验。 + +例如,如果你希望 Linux 发行版能够与你的图形驱动程序很好地配合,并获得最新的硬件支持,那么有一些发行版可以做到。同样,如果你只是想用集成的 GPU 玩原生的 Linux 独立游戏,任何发行版都可以。 + +因此,在你开启 Linux 游戏之旅的同时,会有一些因素影响你对发行版的选择。 + +不用担心,为了帮助你,我们提供了一份有用的 [最佳 Linux 游戏发行版列表][3]。 + +### Linux 上的虚拟现实游戏,唉…… + +![][4] + +我确信 VR 游戏还没有完全普及。但是,如果你想要在 VR 头盔上获得激动人心的体验,那么**选择 Linux 作为你的首选平台可能不是一个好主意**。 + +你没有在 Linux 上获得便利体验所需的驱动程序或应用程序。没有任何发行版可以帮助你解决此问题。 + +如果你想了解有关虚拟现实状态的详细信息,可以看看 [Boiling Steam][5] 上的博客文章和 [GamingOnLinux][6] 上的使用 Valve 的 VR 头盔的有趣体验。 + +我已经提供了这些博客文章的链接以供参考,但总而言之 —— 如果你想体验 VR 游戏,请避免使用 Linux(如果你实在太闲,请随意尝试)。 + +### 可以在 Linux 上玩 Windows 系统的游戏吗? + +可以,也不可以。 + +你可以使用 [Steam Play 来玩 Windows 专属的游戏][7],但是它也存在一些问题,并不是每个游戏都可以运行。 + +例如,我最终还是使用 Windows 来玩《[地平线 4][8]》。如果你喜欢汽车模拟或赛车游戏,这是一款你可能不想错过的杰作。 + +或许我们在不久的将来可以看到它通过 Steam Play 完美的运行,谁知道呢? + +因此,可以肯定的是,你会遇到许多类似的游戏,可能根本无法运行。这是残酷的事实。 + +而且,要知道该游戏是否可以在 Linux 上运行,请前往 [ProtonDB][9] 并搜索该游戏,看看它是否至少具有 “**黄金**” 状态。 + +### 带有反作弊引擎的多人游戏可以吗? + +![][10] + +许多游戏玩家更喜欢玩多人游戏,如《[Apex Legends][11]》、《[彩虹六号:围攻][12]》和《[堡垒之夜][13]》。 + +然而,一些依赖于反作弊引擎的流行游戏还不能在 Linux 上运行。它仍然是一项进行中的工作,可能在未来的 Linux 内核版本中实现 —— 但目前还没有。 + +请注意,像 《[反恐精英:全球攻势][14]》、《Dota 2》、《军团要塞 2》、《[英灵神殿][15]》等多人游戏提供原生 Linux 支持并且运行良好! + +### 我会推荐使用 Linux 来玩游戏吗? + +![][16] + +考虑到你可以玩很多 Windows 专属的游戏、原生的独立游戏,以及 Linux 原生支持的各种 AAA 游戏,我能推荐初次使用者尝试在 Linux 上玩游戏。 + +但是,需要**注意**的是 —— 我建议你列出你想玩的游戏列表,以确保它在 Linux 上运行没有任何问题。否则,你最终都可能浪费大量时间进行故障排除而没有结果。 + +不要忘记,我相信 Linux 上的 VR 游戏是一个很大的问题。 + +而且,如果你想探索所有最新最好的游戏,我建议你坚持使用 Windows 的游戏电脑。 + +**虽然我应该鼓励更多的用户采用 Linux 作为游戏平台,但我不会忽视为什么普通消费者仍然喜欢使用 Windows 机器来玩游戏的客观事实。** + +你怎么认为呢?你同意我的想法吗?欢迎在下方的评论区分享你的想法! + +-------------------------------------------------------------------------------- + +via: https://news.itsfoss.com/linux-for-gaming-opinion/ + +作者:[Ankush Das][a] +选题:[lujun9972][b] +译者:[perfiffer](https://github.com/perfiffer) +校对:[wxy](https://github.com/wxy) + +本文由 [LCTT](https://github.com/LCTT/TranslateProject) 原创编译,[Linux中国](https://linux.cn/) 荣誉推出 + +[a]: https://news.itsfoss.com/author/ankush/ +[b]: https://github.com/lujun9972 +[1]: https://news.itsfoss.com/lutris-creator-interview/ +[2]: https://itsfoss.com/linux-gaming-guide/ +[3]: https://itsfoss.com/linux-gaming-distributions/ +[4]: https://i0.wp.com/news.itsfoss.com/wp-content/uploads/2021/04/linux-gaming-vr.jpg?w=1200&ssl=1 +[5]: https://boilingsteam.com/the-state-of-virtual-reality-on-linux/ +[6]: https://www.gamingonlinux.com/2020/08/my-experiences-of-valves-vr-on-linux +[7]: https://itsfoss.com/steam-play/ +[8]: https://forzamotorsport.net/en-US/games/fh4 +[9]: https://www.protondb.com/ +[10]: https://i1.wp.com/news.itsfoss.com/wp-content/uploads/2021/04/linux-gaming-illustration.jpg?w=1200&ssl=1 +[11]: https://www.ea.com/games/apex-legends +[12]: https://www.ubisoft.com/en-us/game/rainbow-six/siege +[13]: https://www.epicgames.com/fortnite/en-US/home +[14]: https://store.steampowered.com/app/730/CounterStrike_Global_Offensive/ +[15]: https://store.steampowered.com/app/892970/Valheim/ +[16]: https://i1.wp.com/news.itsfoss.com/wp-content/uploads/2021/04/gaming-on-linux-support.jpg?w=1200&ssl=1 diff --git a/published/202109/20210622 What is a config file.md b/published/202109/20210622 What is a config file.md new file mode 100644 index 0000000000..704240b003 --- /dev/null +++ b/published/202109/20210622 What is a config file.md @@ -0,0 +1,174 @@ +[#]: subject: (What is a config file?) +[#]: via: (https://opensource.com/article/21/6/what-config-files) +[#]: author: (Seth Kenlon https://opensource.com/users/seth) +[#]: collector: (lujun9972) +[#]: translator: (unigeorge) +[#]: reviewer: (wxy) +[#]: publisher: (wxy) +[#]: url: (https://linux.cn/article-13832-1.html) + +浅谈配置文件格式 +====== + +> 流行的配置文件格式有若干种,每种都有其自身优势。从中找到最适合你的格式吧! + +![](https://img.linux.net.cn/data/attachment/album/202109/29/134955py5ypl58dgplyx4x.jpg) + +计算机上有数以千计的配置文件。你可能永远不会直接与其中的大部分文件打交道,但它们确实散落在你的 `/etc` 以及 `~/.config`、`~/.local`、`/usr` 文件夹中。还有一些可能在 `/var`,甚至 `/opt` 文件夹中。如果无意中打开过或更改过它们,你就可能会有疑问:为什么有些配置文件看起来是某一种格式,而另一些则是看起来完全不同的格式? + +存储配置是一项很灵活的任务,因为只要开发人员知道他们的代码是如何将数据存入文件的,他们就可以轻松编写代码来根据需要提取数据。然而,科技行业非常青睐有详细文档的标准化事物,因此多年来出现了几种比较普遍的格式用来简化配置任务。 + +### 为什么我们需要配置文件 + +配置文件对于现代计算来说很重要。它们使你能够自定义与应用程序交互的方式,或自定义应用程序与系统内其他程序的交互方式。有了配置文件,每当你启动某个应用程序时,它都会有“记忆”,记录了你喜欢如何去使用该程序。 + +配置文件的结构可以很简单,而且通常确实也很简单。例如,如果你要编写一个应用程序,程序唯一需要知道的是其用户的偏好名字,那么它的唯一配置文件就可以只包含一个词:用户名。就像下面这样: + +``` +Tux +``` + +但通常应用程序需要追踪的不仅仅是一条信息,因此配置文件通常会有一个键和一个值: + +``` +NAME='Tux' +SPECIES='Penguin' +``` + +即使没有编程经验,你也可以想象出代码如何解析这些数据。这里有两个简单的例子,一个使用 [awk 命令][2],另一个使用 [grep 命令][3]。两个例子都是只关注包含 `NAME` “键”的行,并返回出现在等号 (`=`) 之后的“值”: + +``` +$ awk -F'=' '/NAME/ { print $2; }' myconfig.ini +'Tux' +$ grep NAME fake.txt | cut -d'=' -f2 +'Tux' +``` + +同样的原则适用于任何编程语言和任何配置文件。只要你有统一的数据结构,就可以在需要的时候编写简单的代码来提取和解析它。 + +### 选择格式 + +为了保证普遍有效性,配置文件最重要的一点是它们是一致的和可预测的。你绝对不会想做这样的事:以保存用户首选项的名义,将信息随意存储到文件中,然后花好几天时间逆向工程,来找到最终出现在文件中的随机信息。 + +流行的配置文件格式有若干种,每种格式都有自己的优势。 + +#### INI + +INI 文件采用了键值对的格式: + +``` +[example] +name=Tux +style=widgety,fidgety +enabled=1 +``` + +这种简单的配置风格很直观,只要你别选择使用糟糕的键名(比如用 `unampref` 这样的神秘键名来代替 `name`)就好。这些键值对很容易解析和编辑。 + +除了键和值之外,INI 格式还可以分 section。在下列示例代码中,`[example]` 和 `[demo]` 就是配置文件中的两个节: + +``` +[example] +name=Tux +style=widgety,fidgety +enabled=1 + +[demo] +name=Beastie +fullscreen=1 +``` + +这几个配置语句解析起来有点复杂,因为有两个 `name` 键。想象一下,一个粗心的程序员在这个配置文件中查询 `name`,结果总是返回 `Beastie`,因为这是文件中对 `name` 的最后一个定义值。在解析这样的文件时,开发人员必须加倍小心地在各节中搜索键,这可能会很棘手,具体取决于用来解析该文件的语言。然而,它仍然是一种很流行的格式,大多数语言都会有一个现成的库来帮助程序员解析 INI 文件。 + +#### YAML + +[YAML 文件][4] 是结构化列表,可以包含值或者键值对: + +``` +--- +Example: +  Name: 'Tux' +  Style: +   - 'widgety' +    - 'fidgety' +  Enabled: 1 +``` + +YAML 格式很流行,部分原因是它看起来很整洁。数据要放置到相对其上层数据的特定位置,除此之外没有太多其他语法。然而,对于某些人来说的这种特色,在其他人眼中可能就是一个问题。许多开发人员不愿使用 YAML,正是因为它很看重本质上 _不存在_ 的东西。如果你在 YAML 中缩进错误,YAML 解析器可能会将你的文件视为无效文件,即使不视为无效,返回的数据也可能是错误的。 + +大多数语言都有 YAML 解析器,并且有很好的开源 YAML linters(验证语法的应用程序)来帮你确保 YAML 文件的完整性。 + +#### JSON + +JSON 文件在技术上来说是 YAML 的子集,因此其数据结构是相同的,尽管其语法完全不同: + +``` +{ +  "Example": { +    "Name": [ +      "Tux" +    ], +    "Style": [ +      "widgety", +      "fidgety" +    ], +    "Enabled": 1 +  } +} +``` + +JSON 在 JavaScript 程序员中很流行,这并不奇怪,因为 JSON 全称为JavaScript 对象符号JavaScript Object Notation。由于与 Web 开发密切相关,JSON 是 Web API 的常见输出格式。大多数编程语言都有解析 JSON 的库。 + +#### XML + +XML 使用标签作为键,将配置值围绕起来: + +``` +Tux1 + +``` + +XML 经常被 Java 程序员使用,Java 有一套丰富的 XML 解析器。虽然 XML 以非常严格而著称,但同时也非常灵活。与有一系列特定标签的 HTML 不同,XML 中可以随意发明自己的标签。只要始终坚持相同的构建规则,并有一个良好的库来解析它,你就可以准确而轻松地提取数据。 + +有一些很好的开源 linter 可以帮你验证 XML 文件,并且大多数编程语言都提供用于解析 XML 的库。 + +#### 二进制格式 + +Linux 以纯文本配置为傲。这样做的优点是可以使用 [cat][5] 等基本工具查看配置数据,甚至可以使用你 [最喜欢的文本编辑器][6] 来编辑配置。 + +但是,某些应用程序使用二进制格式配置,就意味着数据以某种非自然语言的格式进行编码。这些文件通常需要一个特殊的应用程序(通常是它们要配置的应用程序)来解释它们的数据。你无法查看这些文件,至少无法以任何有意义的方式查看,并且无法在其宿主应用程序之外编辑它们。选用二进制格式的一些原因如下: + + * **速度:** 程序员可以使用自定义符号在二进制配置文件中的某些点注册特定的信息位。提取数据时不涉及搜索,因为所有内容都已标注了索引。 + * **大小:** 文本文件可能会变大,如果选择压缩文本文件,实际上是在将其转换为二进制格式。二进制文件可以通过编码技巧变得更小(文本文件也是如此,但在某些时候,你的优化会使数据变得晦涩,以至于文件也成了二进制文件)。 + * **晦涩:** 一些程序员甚至不希望人们查看他们的配置文件,因此将它们编码为二进制数据。这通常只会让用户感到沮丧,并不是使用二进制格式的好理由。 + +如果必须使用二进制格式进行配置,请使用已作为开放标准存在的格式,例如 [NetCDF][7]。 + +### 找到有效的配置格式 + +配置格式帮助开发人员存储应用程序所需的数据,并帮助用户存储他们希望应用程序如何操作的偏好项。对于应该使用什么格式的问题,可能没有错误的答案,只要你觉得所使用的语言能很好地支持就可以。在开发应用程序时,查看可用格式,用一些样例数据建模,查看和评估你的编程语言提供的库和实用程序,然后选择你觉得最合适的一种格式吧。 + +-------------------------------------------------------------------------------- + +via: https://opensource.com/article/21/6/what-config-files + +作者:[Seth Kenlon][a] +选题:[lujun9972][b] +译者:[unigeorge](https://github.com/unigeorge) +校对:[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/browser_screen_windows_files.png?itok=kLTeQUbY (Computer screen with files or windows open) +[2]: https://opensource.com/article/20/9/awk-ebook +[3]: https://opensource.com/downloads/grep-cheat-sheet +[4]: https://www.redhat.com/sysadmin/yaml-beginners +[5]: https://opensource.com/article/19/2/getting-started-cat-command +[6]: https://opensource.com/article/21/2/open-source-text-editors +[7]: https://www.unidata.ucar.edu/software/netcdf/ diff --git a/published/202109/20210719 Apps for daily needs part 2- office suites.md b/published/202109/20210719 Apps for daily needs part 2- office suites.md new file mode 100644 index 0000000000..eb2f6ecbcf --- /dev/null +++ b/published/202109/20210719 Apps for daily needs part 2- office suites.md @@ -0,0 +1,116 @@ +[#]: subject: (Apps for daily needs part 2: office suites) +[#]: via: (https://fedoramagazine.org/apps-for-daily-needs-part-2-office-suites/) +[#]: author: (Arman Arisman https://fedoramagazine.org/author/armanwu/) +[#]: collector: (lujun9972) +[#]: translator: (wxy) +[#]: reviewer: (wxy) +[#]: publisher: (wxy) +[#]: url: (https://linux.cn/article-13755-1.html) + +满足日常需求的应用(二):办公套件 +====== + +![][1] + +今天,几乎每个家庭都有一台台式电脑或笔记本电脑。这是因为计算机已经成为一个非常重要的要求。此外,不管是为了工作还是学习,许多人需要创建电子版的文档和演示文稿。因此,办公套件是几乎所有计算机上的必备应用程序。本文将介绍一些你可以在 Fedora Linux 上使用的开源办公套件。这些软件你可能需要安装。如果你不熟悉如何在 Fedora Linux 中添加软件包,请参阅我之前的文章 [安装 Fedora 34 工作站后要做的事情][4]。下面是满足日常需求的办公套件类的应用程序列表。 + +### LibreOffice + +LibreOffice 是 GNU/Linux 用户中最流行的办公套件。它的用户界面和用户体验类似于微软 Office。这使得 LibreOffice 对于那些刚刚从微软 Office 迁移过来的人来说很容易学习。LibreOffice 有完整的功能,可以满足你在文档和演示方面的工作需要。它由六个应用程序组成:Writer、Calc、Impress、Draw、Math 和 Base。 + +第一个应用程序是 Writer,用于创建各种类型的文档,如信件、传真、议程、会议记录等。它是一个全功能的文字处理和桌面出版工具。第二个应用程序是 Calc,它是一个电子表格程序,非常适合以表格形式呈现数据和记录数据。Calc 可以创建简单的表格或进行专业的数据分析。第三个应用程序是 Impress,它是一个易于使用的演示应用程序。你可以很容易地选择你在演示幻灯片中想要的功能,如文本、图像、表格、图表等。 + +![LibreOffice Writer][5] + +![LibreOffice Calc][6] + +![LibreOffice Impress][7] + +前面提到的三个 LibreOffice 应用程序是创建文档和演示文稿中最常用的应用程序。然而,LibreOffice 提供的其他三个应用程序也非常有用。第一个是 Draw,它可以用来创建从简单到复杂的图纸和图表。下一个应用程序是 Math,它可以帮助我们做出完美格式的数学和科学公式。最后一个是 Base,这是一个用于处理数据库的应用程序。 + +![LibreOffice Draw][8] + +![LibreOffice Math][9] + +![LibreOffice Base][10] + +更多信息请见此链接: + +### ONLYOFFICE + +ONLYOFFICE 是一款与微软 Office 高度兼容的办公套件应用程序。因此,我们与使用微软 Office 的同事协作时就不必担心了,因为它可以读取各种文件格式,如 docx、xlsx 和 pptx。 + +ONLYOFFICE 提供了三种具有简洁和现代外观的应用程序。我们可以很容易地找到我们需要的功能和工具。虽然功能没有 LibreOffice 那么齐全,但也足以帮助我们创建良好的文档和演示文稿。 + +第一个应用程序是文档编辑器,它的功能与 LibreOffice 的 Writer 相同。它具有文字处理器所需的所有基本功能,如管理字体和样式、格式化文本、调整行距和段距、插入页眉和页脚、自定义页面布局和设置页边距。第二个应用程序是电子表格编辑器,它是一个用于处理数据并将其创建为表格格式的文件的应用程序。它是一个具有与 Calc 相同功能的应用程序。最后一个是演示文稿编辑器,它是一个演示文稿应用程序,其功能类似于 Impress。 + +不幸的是,ONLYOFFICE 在官方的 Fedora Linux 软件库中并没有提供。但是你仍然可以使用 Flatpak 或 Appimages 在 Fedora Linux 上安装它。 + +![ONLYOFFICE Documents Editor][11] + +![ONLYOFFICE Spreadsheets Editor][12] + +![ONLYOFFICE Presentations Editor][13] + +更多信息请见此链接: + +### Calligra + +Calligra 是一个由 KDE 创建的办公套件。因此,这个应用程序实际上更适合于 KDE Plasma 桌面环境的用户。但它仍然可以在其他桌面环境中良好运行,例如使用 GNOME 的 Fedora 工作站。 + +Calligra 提供的几个应用程序的外观与 LibreOffice 或 ONLYOFFICE 略有不同。对于那些习惯于主流办公套件应用程序的人来说,可能需要一些适应。然而,Calligra 仍然是一个可靠的办公套件,足以支持我们的日常需求。 + +第一个应用程序是 Words,它是一个具有桌面出版功能的直观的文字处理器。它具有帮助我们进行文档创作的全面功能。第二个应用程序是 Sheets,它具有与 Calc 和电子表格编辑器相同的功能,是一个功能齐全的电子表格应用程序。第三个应用程序是 Stage,它可以帮助我们制作演示幻灯片。 + +![Calligra Words][14] + +![Calligra Sheets][15] + +![Calligra Stage][16] + +这三个 Calligra 应用程序是创建文档和演示文稿最常用的应用程序。另外还有三个应用程序也非常有用。第一个是 Karbon,它可以用来创建从简单到复杂的图纸和图表。下一个应用程序是 Plan,这是一个项目管理应用程序,可以帮助管理具有多种资源的中等规模的项目。最后一个是 KEXI,它是一个可视化数据库应用程序的创建器。 + +![Calligra Karbon][17] + +![Calligra Plan][18] + +![Calligra Kexi][19] + +更多信息请见此链接: + +### 总结 + +这篇文章介绍了 3 个可以在 Fedora Linux 上使用的办公套件,以满足你的日常需要。如果你想拥有具有一套完整功能的办公套件,那么 LibreOffice 可能是正确的选择。如果想与微软 Office 有良好的兼容性,那么你可以选择 ONLYOFFICE。然而,如果你想要一个不同的用户界面和创建文档和演示文稿的体验,你可以试试 Calligra。希望这篇文章能帮助你选择合适的办公套件。如果你有使用这些应用程序的经验,请在评论中分享你的经验。 + +-------------------------------------------------------------------------------- + +via: https://fedoramagazine.org/apps-for-daily-needs-part-2-office-suites/ + +作者:[Arman Arisman][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://fedoramagazine.org/author/armanwu/ +[b]: https://github.com/lujun9972 +[1]: https://fedoramagazine.org/wp-content/uploads/2021/07/FedoraMagz-Apps-2-Office-816x345.jpg +[2]: https://unsplash.com/@brookecagle?utm_source=unsplash&utm_medium=referral&utm_content=creditCopyText +[3]: https://unsplash.com/s/photos/meeting-on-cafe-computer?utm_source=unsplash&utm_medium=referral&utm_content=creditCopyText +[4]: https://fedoramagazine.org/things-to-do-after-installing-fedora-34-workstation/ +[5]: https://fedoramagazine.org/wp-content/uploads/2021/07/office-libre-writer-1-1024x575.png +[6]: https://fedoramagazine.org/wp-content/uploads/2021/07/office-libre-calc-1-1024x575.png +[7]: https://fedoramagazine.org/wp-content/uploads/2021/07/office-libre-impress-1-1024x575.png +[8]: https://fedoramagazine.org/wp-content/uploads/2021/07/office-libre-draw-1-1024x575.png +[9]: https://fedoramagazine.org/wp-content/uploads/2021/07/office-libre-math-1-1024x575.png +[10]: https://fedoramagazine.org/wp-content/uploads/2021/07/office-libre-base-1-1024x575.png +[11]: https://fedoramagazine.org/wp-content/uploads/2021/07/office-only-doc-1024x575.png +[12]: https://fedoramagazine.org/wp-content/uploads/2021/07/office-only-sheet-1024x575.png +[13]: https://fedoramagazine.org/wp-content/uploads/2021/07/office-only-presentation-1024x575.png +[14]: https://fedoramagazine.org/wp-content/uploads/2021/07/office-calligra-words-1024x575.png +[15]: https://fedoramagazine.org/wp-content/uploads/2021/07/office-calligra-sheets-1024x575.png +[16]: https://fedoramagazine.org/wp-content/uploads/2021/07/office-calligra-stage-1024x575.png +[17]: https://fedoramagazine.org/wp-content/uploads/2021/07/office-calligra-karbon-1-1024x575.png +[18]: https://fedoramagazine.org/wp-content/uploads/2021/07/office-calligra-plan-1024x575.png +[19]: https://fedoramagazine.org/wp-content/uploads/2021/07/office-calligra-kexi-1024x575.png diff --git a/published/202109/20210727 Analyze the Linux kernel with ftrace.md b/published/202109/20210727 Analyze the Linux kernel with ftrace.md new file mode 100644 index 0000000000..673661c1b3 --- /dev/null +++ b/published/202109/20210727 Analyze the Linux kernel with ftrace.md @@ -0,0 +1,389 @@ +[#]: subject: (Analyze the Linux kernel with ftrace) +[#]: via: (https://opensource.com/article/21/7/linux-kernel-ftrace) +[#]: author: (Gaurav Kamathe https://opensource.com/users/gkamathe) +[#]: collector: (lujun9972) +[#]: translator: (mengxinayan) +[#]: reviewer: (wxy) +[#]: publisher: (wxy) +[#]: url: (https://linux.cn/article-13752-1.html) + +通过 ftrace 来分析 Linux 内核 +====== + +> 通过 `ftrace` 来了解 Linux 内核内部工作方式是一个好方法。 + +![](https://img.linux.net.cn/data/attachment/album/202109/05/151954cb5z5rg7zqa9lbzu.jpg) + +操作系统的内核是最难以理解的软件之一。自从你的系统启动后,它会一直在后台运行。尽管每个用户都不与内核直接交互,但他们在内核的帮助下完成自己的计算任务。与内核的交互发生在调用系统调用或者用户日常使用的各种库或应用间接调用了系统调用。 + +在之前的文章里我介绍了如何使用 [strace][6] 来追踪系统调用。然而,使用 `strace` 时你的视野是有限的。它允许你查看特定参数的系统调用。并在工作完成后,看到其返回值或状态,以表明是成功还是失败。但是你无法知道内核在这段时间内发生了什么。除了系统调用外,还有很多其他活动内核中发生,而你却视而不见。 + +### ftrace 介绍 + +本文的旨在通过使用一个名为 `ftrace` 的机制来阐明追踪内核函数的一些情况。它使得任何 Linux 用户可以轻松地追踪内核,并且了解更多关于 Linux 内核内部如何工作。 + +`ftrace` 默认产生的输出往往是巨大的,因为内核总是忙碌的。为了节省空间,很多情况下我会通过截断来给出尽量小的输出。 + +我使用 Fedora 来演示下面的例子,但是它们应该在其他最新的 Linux 发行版上同样可以运行。 + +### 启用 ftrace + +`ftrace` 现在已经是内核中的一部分了,你不再需要事先安装它了。也就是说,如果你在使用最近的 Linux 系统,那么 `ftrace` 是已经启用了的。为了验证 `ftrace` 是否可用,运行 `mount` 命令并查找 `tracefs`。如果你看到类似下面的输出,表示 `ftrace` 已经启用,你可以轻松地尝试本文中下面的例子。下面有些命令需要在 root 用户下使用(用 `sudo` 执行是不够的)。 + +``` +# mount | grep tracefs +none on /sys/kernel/tracing type tracefs (rw,relatime,seclabel) +``` + +要想使用 `ftrace`,你首先需要进入上面 `mount` 命令中找到的特定目录中,在那个目录下运行文章中的其他命令。 + +``` +# cd /sys/kernel/tracing +``` + +### 一般的工作流程 + +首先,你需要理解捕捉踪迹和获取输出的一般流程。如果你直接运行 `ftrace`,不会运行任何特定的 `ftrace` 命令。相反的,基本操作是通过标准 Linux 命令来写入或读取一些文件。 + +一般的步骤如下: + +1. 通过写入一些特定文件来启用/结束追踪 +2. 通过写入一些特定文件来设置/取消追踪时的过滤规则 +3. 从文件中读取基于第 1 和 2 步的追踪输出 +4. 从文件中清除早期输出或缓冲区 +5. 缩小到你的特定用例(你要追踪的内核函数),重复 1、2、3、4 步 + +### 可用的追踪器类型 + +有多种不同的追踪器可供使用。之前提到,在运行任何命令前,你需要进入一个特定的目录下,因为需要的文件在这些目录下。我在我的例子中使用了相对路径(而不是绝对路径)。 + +你可以查看 `available_tracers` 文件内容来查看所有可用的追踪器类型。你可以看下面列出了几个。不需要担心这些: + +``` +$ pwd +/sys/kernel/tracing + +$ sudo cat available_tracers +hwlat blk mmiotrace function_graph wakeup_dl wakeup_rt wakeup function nop +``` + +在所有输出的追踪器中,我会聚焦于下面三个特殊的:启用追踪的 `function` 和 `function_graph`,以及停止追踪的 `nop`。 + +### 确认当前的追踪器 + +通常情况默认的追踪器设定为 `nop`。即在特殊文件中 `current_tracer` 中的 “无操作”,这意味着追踪目前是关闭的: + +``` +$ pwd +/sys/kernel/tracing + +$ sudo cat current_tracer +nop +``` + +### 查看追踪输出 + +在启用任何追踪功能之前,请你看一下保存追踪输出的文件。你可以用 [cat][2] 命令查看名为 `trace` 的文件的内容: + +``` +# cat trace + +# tracer: nop +# +# entries-in-buffer/entries-written: 0/0 #P:8 +# +# _-----=> irqs-off +# / _----=> need-resched +# | / _---=> hardirq/softirq +# || / _--=> preempt-depth +# ||| / delay +# TASK-PID CPU# |||| TIMESTAMP FUNCTION +# | | | |||| | | +``` + +### 启用 function 追踪器 + +你可以通过向 `current_tracer` 文件写入 `function` 来启用第一个追踪器 `function`(文件原本内容为 `nop`,意味着追踪是关闭的)。把这个操作看成是启用追踪的一种方式: + +``` +$ pwd +/sys/kernel/tracing + +$ sudo cat current_tracer +nop +$ echo function > current_tracer +$ +$ cat current_tracer +function +``` + +### 查看 function 追踪器的更新追踪输出 + +现在你已启用追踪,是时候查看输出了。如果你查看 `trace` 文件内容,你将会看到许多被连续写入的内容。我通过管道只展示了文件内容的前 20 行。根据左边输出的标题,你可以看到在某个 CPU 上运行的任务和进程 ID。根据右边输出的内容,你可以看到具体的内核函数和其父函数。中间显示了时间戳信息: + +``` +# sudo cat trace | head -20 + +# tracer: function +# +# entries-in-buffer/entries-written: 409936/4276216 #P:8 +# +# _-----=> irqs-off +# / _----=> need-resched +# | / _---=> hardirq/softirq +# || / _--=> preempt-depth +# ||| / delay +# TASK-PID CPU# |||| TIMESTAMP FUNCTION +# | | | |||| | | + -0 [000] d... 2088.841739: tsc_verify_tsc_adjust <-arch_cpu_idle_enter + -0 [000] d... 2088.841739: local_touch_nmi <-do_idle + -0 [000] d... 2088.841740: rcu_nocb_flush_deferred_wakeup <-do_idle + -0 [000] d... 2088.841740: tick_check_broadcast_expired <-do_idle + -0 [000] d... 2088.841740: cpuidle_get_cpu_driver <-do_idle + -0 [000] d... 2088.841740: cpuidle_not_available <-do_idle + -0 [000] d... 2088.841741: cpuidle_select <-do_idle + -0 [000] d... 2088.841741: menu_select <-do_idle + -0 [000] d... 2088.841741: cpuidle_governor_latency_req <-menu_select +``` + +请记住当追踪打开后,这意味着追踪结果会被一直连续写入直至你关闭追踪。 + +### 关闭追踪 + +关闭追踪是简单的。你只需要在 `current_tracer` 文件中用 `nop` 替换 `function` 追踪器即可: + +``` +$ sudo cat current_tracer +function + +$ sudo echo nop > current_tracer + +$ sudo cat current_tracer +nop +``` + +### 启用 function_graph 追踪器 + +现在尝试第二个名为 `function_graph` 的追踪器。你可以使用和上面相同的步骤:在 `current_tracer` 文件中写入 `function_graph`: + +``` +$ sudo echo function_graph > current_tracer + +$ sudo cat current_tracer +function_graph +``` + +### function_tracer 追踪器的追踪输出 + +注意到目前 `trace` 文件的输出格式已经发生变化。现在,你可以看到 CPU ID 和内核函数的执行时长。接下来,一个花括号表示一个函数的开始,以及它内部调用了哪些其他函数: + +``` +# cat trace | head -20 + +# tracer: function_graph +# +# CPU DURATION FUNCTION CALLS +# | | | | | | | + 6) | n_tty_write() { + 6) | down_read() { + 6) | __cond_resched() { + 6) 0.341 us | rcu_all_qs(); + 6) 1.057 us | } + 6) 1.807 us | } + 6) 0.402 us | process_echoes(); + 6) | add_wait_queue() { + 6) 0.391 us | _raw_spin_lock_irqsave(); + 6) 0.359 us | _raw_spin_unlock_irqrestore(); + 6) 1.757 us | } + 6) 0.350 us | tty_hung_up_p(); + 6) | mutex_lock() { + 6) | __cond_resched() { + 6) 0.404 us | rcu_all_qs(); + 6) 1.067 us | } +``` + +### 启用追踪的设置来增加追踪的深度 + +你可以使用下面的步骤来调整追踪器以看到更深层次的函数调用。完成之后,你可以查看 `trace` 文件的内容并发现输出变得更加详细了。为了文章的可读性,这个例子的输出被省略了: + +``` +# cat max_graph_depth +0 + +# echo 1 > max_graph_depth ## or: +# echo 2 > max_graph_depth + +# sudo cat trace +``` + +### 查找要追踪的函数 + +上面的步骤足以让你开始追踪。但是它产生的输出内容是巨大的,当你想试图找到自己感兴趣的内容时,往往会很困难。通常你更希望能够只追踪特定的函数,而忽略其他函数。但如果你不知道它们确切的名称,你怎么知道要追踪哪些进程?有一个文件可以帮助你解决这个问题 —— `available_filter_functions` 文件提供了一个可供追踪的函数列表: + +``` +$ sudo wc -l available_filter_functions   +63165 available_filter_functions +``` + +### 查找一般的内核函数 + +现在试着搜索一个你所知道的简单内核函数。用户空间由 `malloc` 函数用来分配内存,而内核由 `kmalloc` 函数,它提供类似的功能。下面是所有与 `kmalloc` 相关的函数: + +``` +$ sudo grep kmalloc available_filter_functions +debug_kmalloc +mempool_kmalloc +kmalloc_slab +kmalloc_order +kmalloc_order_trace +kmalloc_fix_flags +kmalloc_large_node +__kmalloc +__kmalloc_track_caller +__kmalloc_node +__kmalloc_node_track_caller +[...] +``` + +### 查找内核模块或者驱动相关函数 + +在 `available_filter_functions` 文件的输出中,你可以看到一些以括号内文字结尾的行,例如下面的例子中的 `[kvm_intel]`。这些函数与当前加载的内核模块 `kvm_intel` 有关。你可以运行 `lsmod` 命令来验证: + +``` +$ sudo grep kvm available_filter_functions | tail +__pi_post_block [kvm_intel] +vmx_vcpu_pi_load [kvm_intel] +vmx_vcpu_pi_put [kvm_intel] +pi_pre_block [kvm_intel] +pi_post_block [kvm_intel] +pi_wakeup_handler [kvm_intel] +pi_has_pending_interrupt [kvm_intel] +pi_update_irte [kvm_intel] +vmx_dump_dtsel [kvm_intel] +vmx_dump_sel [kvm_intel] + +$ lsmod  | grep -i kvm +kvm_intel             335872  0 +kvm                   987136  1 kvm_intel +irqbypass              16384  1 kvm +``` + +### 仅追踪特定的函数 + +为了实现对特定函数或模式的追踪,你可以利用 `set_ftrace_filter` 文件来指定你要追踪上述输出中的哪些函数。这个文件也接受 `*` 模式,它可以扩展到包括具有给定模式的其他函数。作为一个例子,我在我的机器上使用 ext4 文件系统。我可以用下面的命令指定 ext4 的特定内核函数来追踪: + +``` +# mount | grep home +/dev/mapper/fedora-home on /home type ext4 (rw,relatime,seclabel) + +# pwd +/sys/kernel/tracing + +# cat set_ftrace_filter + +#### all functions enabled #### +$ +$ echo ext4_* > set_ftrace_filter +$ +$ cat set_ftrace_filter +ext4_has_free_clusters +ext4_validate_block_bitmap +ext4_get_group_number +ext4_get_group_no_and_offset +ext4_get_group_desc +[...] +``` + +现在当你可以看到追踪输出时,你只能看到与内核函数有关的 `ext4` 函数,而你之前已经为其设置了一个过滤器。所有其他的输出都被忽略了: + +``` +# cat trace |head -20 + +## tracer: function +# +# entries-in-buffer/entries-written: 3871/3871 #P:8 +# +# _-----=> irqs-off +# / _----=> need-resched +# | / _---=> hardirq/softirq +# || / _--=> preempt-depth +# ||| / delay +# TASK-PID CPU# |||| TIMESTAMP FUNCTION +# | | | |||| | | + cupsd-1066 [004] .... 3308.989545: ext4_file_getattr <-vfs_fstat + cupsd-1066 [004] .... 3308.989547: ext4_getattr <-ext4_file_getattr + cupsd-1066 [004] .... 3308.989552: ext4_file_getattr <-vfs_fstat + cupsd-1066 [004] .... 3308.989553: ext4_getattr <-ext4_file_getattr + cupsd-1066 [004] .... 3308.990097: ext4_file_open <-do_dentry_open + cupsd-1066 [004] .... 3308.990111: ext4_file_getattr <-vfs_fstat + cupsd-1066 [004] .... 3308.990111: ext4_getattr <-ext4_file_getattr + cupsd-1066 [004] .... 3308.990122: ext4_llseek <-ksys_lseek + cupsd-1066 [004] .... 3308.990130: ext4_file_read_iter <-new_sync_read +``` + +### 排除要被追踪的函数 + +你并不总是知道你想追踪什么,但是,你肯定知道你不想追踪什么。因此,有一个 `set_ftrace_notrace` —— 请注意其中的 “no”。你可以在这个文件中写下你想要的模式,并启用追踪。这样除了所提到的模式外,任何其他东西都会被追踪到。这通常有助于删除那些使我们的输出变得混乱的普通功能: + +``` +$ sudo cat set_ftrace_notrace +#### no functions disabled #### +``` + +### 具有目标性的追踪 + +到目前为止,你一直在追踪内核中发生的一切。但是,它无法帮助你追踪与某个特定命令有关的事件。为了达到这个目的,你可以按需打开和关闭跟踪,并且在它们之间,运行我们选择的命令,这样你就不会在跟踪输出中得到额外的输出。你可以通过向 `tracing_on` 写入 `1` 来启用跟踪,写 `0` 来关闭跟踪。 + +``` +# cat tracing_on +0 + +# echo 1 > tracing_on + +# cat tracing_on +1 + +### Run some specific command that we wish to trace here ### + +# echo 0 > tracing_on + +# cat tracing_on +0 +``` + +### 追踪特定的 PID + +如果你想追踪与正在运行的特定进程有关的活动,你可以将该 PID 写入一个名为 `set_ftrace_pid` 的文件,然后启用追踪。这样一来,追踪就只限于这个 PID,这在某些情况下是非常有帮助的。 + +``` +$ sudo echo $PID > set_ftrace_pid +``` + +### 总结 + +`ftrace` 是一个了解 Linux 内核内部工作的很好方式。通过一些练习,你可以学会对 `ftrace` 进行调整以缩小搜索范围。要想更详细地了解 `ftrace` 和它的高级用法,请看 `ftrace` 的核心作者 Steven Rostedt 写的这些优秀文章。 + + * [调试 Linux 内核,第一部分][3] + * [调试 Linux 内核,第二部分][4] + * [调试 Linux 内核,第三部分][5] + + +-------------------------------------------------------------------------------- + +via: https://opensource.com/article/21/7/linux-kernel-ftrace + +作者:[Gaurav Kamathe][a] +选题:[lujun9972][b] +译者:[萌新阿岩](https://github.com/mengxinayan) +校对:[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/linux_keyboard_desktop.png?itok=I2nGw78_ (Linux keys on the keyboard for a desktop computer) +[2]: https://opensource.com/article/19/2/getting-started-cat-command +[3]: https://lwn.net/Articles/365835/ +[4]: https://lwn.net/Articles/366796/ +[5]: https://lwn.net/Articles/370423/ +[6]: https://linux.cn/article-11545-1.html \ No newline at end of file diff --git a/published/202109/20210804 Apps for daily needs part 3- image editors.md b/published/202109/20210804 Apps for daily needs part 3- image editors.md new file mode 100644 index 0000000000..f23981589d --- /dev/null +++ b/published/202109/20210804 Apps for daily needs part 3- image editors.md @@ -0,0 +1,79 @@ +[#]: subject: "Apps for daily needs part 3: image editors" +[#]: via: "https://fedoramagazine.org/apps-for-daily-needs-part-3-image-editors/" +[#]: author: "Arman Arisman https://fedoramagazine.org/author/armanwu/" +[#]: collector: "lujun9972" +[#]: translator: "wxy" +[#]: reviewer: "wxy" +[#]: publisher: "wxy" +[#]: url: "https://linux.cn/article-13761-1.html" + +满足日常需求的应用(三):图像编辑器 +====== + +![][1] + +图像编辑器是许多人喜欢和需要的应用程序,从专业的设计师、学生,或那些有某些爱好的人。特别是在这个数字时代,越来越多的人因为各种原因需要图像编辑器。本文将介绍一些你可以在 Fedora Linux 上使用的开源图像编辑器。你可能需要安装提到的软件。如果你不熟悉如何在 Fedora Linux 中添加软件包,请参阅我之前的文章 [安装 Fedora 34 工作站后要做的事情][4]。这里列出了图像编辑器类的一些日常需求的应用程序。 + +### GIMP + +GIMP(GNU 图像处理程序GNU Image Manipulation Program)是一个光栅图像(位图)编辑器,用于照片修饰、图像合成和图像创作。它的功能几乎与 Adobe Photoshop 相同。你可以用 GIMP 做很多你可以用 Photoshop 做的事情。正因为如此,GIMP 作为 Adobe Photoshop 的开源替代品,已经成为最受欢迎的应用程序。 + +GIMP 有很多图像处理的功能,特别是针对光栅图像。你可以用 GIMP 修复或改变照片的颜色。你可以选择图像的一部分,裁剪它,然后与图像的其他部分合并。GIMP 还有许多你可以应用于你的图像的效果,包括模糊、阴影、噪音等等。许多人用 GIMP 来修复损坏的照片,提高图像质量,裁剪图像中不需要的部分,制作海报和各种图形设计作品,等等。此外,你还可以在 GIMP 中添加插件和脚本,使其功能更加全面。 + +![][5] + +更多信息请见此链接:: + +### Inkscape + +Inkscape 是一个流行的开源应用程序,用于创建和编辑矢量图。它是一个功能丰富的矢量图形编辑器,这使它可以与其他类似的专有应用程序(如 Adobe Illustrator 和 Corel Draw)相竞争。正因为如此,许多专业插画师使用它来创建基于矢量的艺术作品。 + +你可以用 Inkscape 制作艺术和技术插图,如标志、图表、图标、桌面壁纸、流程图、漫画等等。此外,Inkscape 可以处理各种图形文件格式。此外,你还可以添加附加组件,使你的工作更容易。 + +![][6] + +更多信息请见此链接: + +### Krita + +Krita 乍一看像 GIMP 或 Inkscape。但实际上,它是一个完全不同的应用程序,尽管它有一些类似的功能。Krita 是一款用于创作像艺术家那样的数字绘画的应用程序。你可以用 Krita 来制作概念艺术、插图、漫画、纹理和哑光画。 + +Krita 有 100 多个预装的专业画笔。它还有一个画笔稳定器功能,有 3 种不同的方式来平滑和稳定你的画笔笔触。此外,你可以用 9 种以上的独特画笔引擎来定制你的画笔。Krita 是那些喜欢进行数字绘画的人的合适应用。 + +![][7] + +更多信息可在此链接获得: + +### darktable + +darktable 是摄影师或那些想提高照片质量的人的完美选择。darktable 更侧重于图像编辑,特别是对 RAW 图像的非破坏性后期制作。因此,它提供专业的色彩管理,支持自动检测显示配置文件。此外,你还可以用 darktable 过滤和排序多张图片。所以你可以通过标签、评级、颜色标签等来搜索你的收藏。它可以导入各种图像格式,如 JPEG、CR2、NEF、HDR、PFM、RAF 等。 + +![][8] + +更多信息可在此链接中获得: + +### 总结 + +这篇文章介绍了四个图像编辑器,你可以在 Fedora Linux 上使用它们满足你日常需求。每个应用程序都代表了图像编辑器应用程序的一个子类别。实际上,还有许多其他的图像编辑器可以在 Fedora Linux 上使用。你也可以使用 RawTherapee 或 Photivo 作为 dartkable 替代品。此外,还有 Pinta 作为 GIMP 的替代品,以及 MyPaint 作为 Krita 的替代品。希望这篇文章能帮助你选择正确的图像编辑器。如果你有使用这些应用程序的经验,请在评论中分享你的经验。 + +-------------------------------------------------------------------------------- + +via: https://fedoramagazine.org/apps-for-daily-needs-part-3-image-editors/ + +作者:[Arman Arisman][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://fedoramagazine.org/author/armanwu/ +[b]: https://github.com/lujun9972 +[1]: https://fedoramagazine.org/wp-content/uploads/2021/07/FedoraMagz-Apps-3-Graphics-816x345.jpg +[2]: https://unsplash.com/@brookecagle?utm_source=unsplash&utm_medium=referral&utm_content=creditCopyText +[3]: https://unsplash.com/s/photos/meeting-on-cafe-computer?utm_source=unsplash&utm_medium=referral&utm_content=creditCopyText +[4]: https://fedoramagazine.org/things-to-do-after-installing-fedora-34-workstation/ +[5]: https://fedoramagazine.org/wp-content/uploads/2021/07/image-gimp-1024x576.png +[6]: https://fedoramagazine.org/wp-content/uploads/2021/07/image-inkscape-1024x575.png +[7]: https://fedoramagazine.org/wp-content/uploads/2021/07/image-krita-1024x592.png +[8]: https://fedoramagazine.org/wp-content/uploads/2021/07/image-darktable-1024x583.png diff --git a/published/202109/20210819 A guide to understanding your team-s implicit values and needs.md b/published/202109/20210819 A guide to understanding your team-s implicit values and needs.md new file mode 100644 index 0000000000..b883d98c6f --- /dev/null +++ b/published/202109/20210819 A guide to understanding your team-s implicit values and needs.md @@ -0,0 +1,70 @@ +[#]: subject: "A guide to understanding your team's implicit values and needs" +[#]: via: "https://opensource.com/open-organization/21/8/leadership-cultural-social-norms" +[#]: author: "Ron McFarland https://opensource.com/users/ron-mcfarland" +[#]: collector: "lujun9972" +[#]: translator: "zz-air" +[#]: reviewer: "wxy" +[#]: publisher: "wxy" +[#]: url: "https://linux.cn/article-13765-1.html" + +了解团队隐含价值观和需求的指南 +====== + +> 为了增强团队动力,开放式领导可以研究指导成员行为和决策的隐性社会规范。 + +![](https://img.linux.net.cn/data/attachment/album/202109/08/142831uj5zz2shqr1pybr2.jpg) + +文化在 [开放式组织][2] 很重要。但“文化”似乎是一个如此庞大而复杂的概念。我们该如何帮助开放式组织去理解它呢? + +一个解决方案可能来自于《[Rule Makers, Rule Breakers][4]》的作者 [Michele J. Gelfand][3]:紧密和松散的文化以及指导我们生活的秘密信号。Gelfand 把所有的国家和文化分成简单的两类:一类是“紧密的”文化,另一类是“松散的”。然后,她解释了两者的特点和社会规范,提供了它们的相对优势和劣势。通过研究两者,我们可以克服团队、组织和国家之间的分歧和冲突。 + +在这个分为两篇的《Rule Makers, Rule Breakers》的点评中, 我将解释 Gelfand 的论点,并讨论它对在开放性组织中工作的人们有用的方式。 + +### 了解你的社会规范 + +Gelfand 认为,我们的行为很大程度上取决于我们是生活在“紧密的”还是“松散的”社区文化中,因为每一种文化都有不同于其他文化的社会规范。这些规范 ——— 以及强制执行的严格程度 ——— 将决定我们在社会中的行为。它们给了我们身份,它们帮助我们彼此协调。简而言之,这些价值使社区团结在一起。 + +它们也会影响我们的世界观,影响我们构造环境的方式,甚至影响我们大脑的处理过程。 Gelfand 写道:“无数研究表明,社会规范对于将社区团结成合作、协调良好的团体,从而实现伟大成就至关重要。” 纵观历史,社区让其公民参加看似最疯狂的仪式,除了维持群体凝聚力和合作外,别无其他原因。 这些仪式产生了更紧密的联系,使人们得以生存(特别是在狩猎、觅食和战争时期)。 + +社会规范包括我们所有人都会自动遵守的规则, Gelfand 称之为一种 “规范性自动驾驶仪”。 这些是我们不需要思考就能做的事情————例如,在图书馆、电影院、电梯或飞机上保持安静。 我们会自动的做这些事。 “从表面看,” Gelfand 说, “我们的社会规范通常看起来很奇怪。但在内心深处,我们认为这是理所当然的。” 她解释到,社会规范可以被编入法规和法律(“遵守停车标志”和“不要偷窃”)。还有一些基本上是不言而喻的(“不要盯着火车上的人看”或“打喷嚏时捂住嘴”)。当然,它们因环境而异。 + +挑战在于大多数社会规范都是无形的,我们不知道这些社会规范在多大程度上控制着我们。在不知不觉中,我们常常只是跟随周围的人群。这被称为“群体思维”,在这种思维中,人们会跟随他们认同的群体,即使这个群体是错误的。他们不想站出来。 + +### 组织,有松有紧 + +Gelfand 将社会规范组织成不同的组别。她认为,一些规范具有“紧密”文化的特征,而另一些规范则具有“松散”文化的特征。为此, Gelfand 对来自五大洲 30 多个国家的约 7000 人进行了研究和抽样,他们具有广泛的职业、性别、年龄、宗教、教派,以及社会阶层,以了解这些社区将自己定位在何处(以及他们的社会规范在官方和社区/社区总体上的执行力度)。 紧密和松散文化之间的差异在国家之间、国家内部(如美国及其各个地区)、组织内部、社会阶层内部甚至家庭内部都有所不同。 + +因为组织有文化,它们也有自己的社会规范(毕竟,如果一个组织无法协调其成员并影响其行为,它将无法存在)。 因此,组织也可以反映和灌输 Gelfand 所描述的“紧密”或“松散”的文化特征。 并且如果我们有很强的能力识别这些差异,我们就能更成功地预测和解决冲突。然后,在对这些社会规范有了更高认识的情况下,我们可以将开放式组织原则付诸实践。 + +Gelfand 这样描述紧密和松散文化的区别: + +> 从广义上讲,松散的文化倾向于开放,但它们也更加无序。另一方面,紧密的文化有令人欣慰的秩序和可预测性,但它们的容忍度较低。这就是紧与松的权衡:一个领域的优势与另一个领域的劣势并存。 + +她总结说,紧密的社会保持着严格的社会秩序、同步性和自律性;宽松的社会以高度宽容、富有创造力和对变化持开放态度而自豪。 + +虽然并非所有情况都是如此,但紧密和松散的文化通常会表现出一些权衡;每个人都有自己的长处和短处。参见下面的图 1 。 + +![][5] + +在这两种环境中成功应用五项开放式组织原则的工作可能会有很大的不同。要取得成功,社区承诺至关重要,如果社会规范不同,承诺的理由也会不同。组织领导者必须知道社区的价值观是什么。只有这样,这个人才能充分激励他人。 + +在本点评的下一部分中,我将更彻底地解释紧密文化和松散文化的特征,以便领导者能够更好地了解如何将开放式组织原则运用到团队中。 + +-------------------------------------------------------------------------------- + +via: https://opensource.com/open-organization/21/8/leadership-cultural-social-norms + +作者:[Ron McFarland][a] +选题:[lujun9972][b] +译者:[zz-air](https://github.com/zz-air) +校对:[wxy](https://github.com/wxy) + +本文由 [LCTT](https://github.com/LCTT/TranslateProject) 原创编译,[Linux中国](https://linux.cn/) 荣誉推出 + +[a]: https://opensource.com/users/ron-mcfarland +[b]: https://github.com/lujun9972 +[1]: https://opensource.com/sites/default/files/styles/image-full-size/public/lead-images/leader-team-laptops-conference-meeting.png?itok=ztoA0E6f (Working meetings can be effective meetings) +[2]: https://theopenorganization.org/definition/ +[3]: https://www.michelegelfand.com/ +[4]: https://www.michelegelfand.com/rule-makers-rule-breakers +[5]: https://opensource.com/sites/default/files/images/open-org/rule-makers-breakers-1.png diff --git a/published/202109/20210819 Debian vs Ubuntu- What-s the Difference- Which One Should You Use.md b/published/202109/20210819 Debian vs Ubuntu- What-s the Difference- Which One Should You Use.md new file mode 100644 index 0000000000..3468fcc4c2 --- /dev/null +++ b/published/202109/20210819 Debian vs Ubuntu- What-s the Difference- Which One Should You Use.md @@ -0,0 +1,184 @@ +[#]: subject: "Debian vs Ubuntu: What’s the Difference? Which One Should You Use?" +[#]: via: "https://itsfoss.com/debian-vs-ubuntu/" +[#]: author: "Abhishek Prakash https://itsfoss.com/author/abhishek/" +[#]: collector: "lujun9972" +[#]: translator: "perfiffer" +[#]: reviewer: "wxy" +[#]: publisher: "wxy" +[#]: url: "https://linux.cn/article-13746-1.html" + +Debian 和 Ubuntu:有什么不同?应该选择哪一个? +====== + +![](https://img.linux.net.cn/data/attachment/album/202109/02/230706mpahrwpwjjm2jkpu.jpg) + +在 Debian 和 Ubuntu 系统中,你都可以 [使用 apt-get 命令][1] 来管理应用。你也可以在这两个发行版中安装 DEB 安装包。很多时候,你会在这两个发行版中发现同样的包安装命令。 + +它们两者是如此的相似,那么,它们两者之间有什么区别呢? + +Debian 和 Ubuntu 属于同一系列的发行版。Debian 是由 Ian Murdock 在 1993 年创建的最初的发行版。Ubuntu 是 Mark Shuttleworth 在 2004 年基于 Debian 创建的发行版。 + +### Ubuntu 基于 Debian:这意味着什么? + +Linux 发行版虽然有数百个,但其中只有少数是从零开始的独立发行版。 [Debian][2]、Arch、Red Hat 是其中几个不派生于其它发行版的使用最广的发行版。 + +Ubuntu 源自 Debian。这意味着 Ubuntu 使用与 Debian 相同的 APT 包管理系统,并共享来自 Debian 库中的大量包和库。它建立在 Debian 基础架构上。 + +![Ubuntu uses Debian as base][3] + +这就是大多数“衍生”发行版所做的。它们使用相同的包管理器,并与基础发行版共享包。但它们也做了一些改变,添加了一些自己的包。这就是 Ubuntu 和 Debian 的不同之处,尽管它是从 Debian 衍生而来的。 + +### Ubuntu 和 Debian 的不同之处 + +因此,Ubuntu 构建在 Debian 架构和基础设施上,也与 Debian 一样是用 .DEB 格式的软件包。 + +这意味着使用 Ubuntu 和使用 Debian 是一样的吗?并不完全如此。有很多因素可以用来区分两个不同的发行版。 + +让我逐一讨论这些因素来比较 Ubuntu 和 Debian。请记住,有些比较适用于桌面版本,而有些比较适用于服务器版本。 + +![][4] + +#### 1、发布周期 + +Ubuntu 有两种发布版本:LTS(长期支持)和常规版本。[Ubuntu LTS 版本][5] 每两年发布一次,并且会提供五年的支持。你可以选择升级到下一个可用的 LTS 版本。LTS 版本被认为更稳定。 + +还有一个非 LTS 版本,每六个月发布一次。这些版本仅仅提供九个月的支持,但是它们会有一些新的软件版本和功能。在当前的版本到达维护年限时,你应当升级到下一个 Ubuntu 版本。 + +所以基本上,你可以根据这些版本在稳定性和新特性之间进行选择。 + +另一方面,Debian 有三个不同的版本:稳定版、测试版和非稳定版。非稳定版是为了实际测试,应该避免使用。 + +测试版不是那么不稳定。它是用来为下一个稳定版做准备。有一些 Debian 用户更倾向于使用测试版来获取新的特性。 + +然后是稳定版。这是 Debian 的主要版本。Debian 稳定版可能没有最新的软件和功能,但在稳定性方面毋庸置疑。 + +每两年 Debian 会发布一个稳定版,并且会提供三年的支持。此后,你应当升级到下一个可用的稳定版。 + +#### 2、软件更新 + +![][6] + +Debian 更关注稳定性,这意味着它并不总是使用最新版本的软件。例如,最新的 Debian 11 用的 GNOME 版本为 3.38,并不是最新版的 GNOME 3.40。 + +对于 GIMP、LibreOffice 等其它软件也是如此。这是你必须对 Debian 做出的妥协。这就是“Debian stable = Debian stale”笑话在 Linux 社区流行的原因。 + +Ubuntu LTS 版本也关注稳定性。但是它们通常拥有较新版本的常见软件。 + +你应该注意,对于某些软件,从开发者的仓库安装也是一种选择。例如,如果你想要安装最新版的 Docker,你可以在 Debian 和 Ubuntu 中添加 Docker 仓库。 + +总体来说,相比较于 Ubuntu ,Debian 稳定版的软件版本会更旧。 + +#### 3、软件可用性 + +Debian 和 Ubuntu 都拥有一个巨大的软件仓库。然而,[Ubuntu 还有 PPA][7](个人软件包存档Personal Package Archive)。通过 PPA,安装更新版本的软件或者获取最新版本的软件都将会变的更容易。 + +![][8] + +你可以在 Debian 中尝试使用 PPA,但是体验并不好。大多数时候你都会遇到问题。 + +#### 4、支持的平台 + +Ubuntu 可以在 64 位的 x86 和 ARM 平台上使用。它不再提供 32 位的镜像。 + +另一方面,Debian 支持 32 位和 64 位架构。除此之外,Debian 还支持 64 位 ARM(arm64)、ARM EABI(armel)、ARMv7(EABI hard-float ABI,armhf)、小端 MIPS(mipsel)、64 位小端 MIPS(mips64el)、64 位小端 PowerPC(ppc64el) 和 IBM System z(s390x)。 + +所以它也被称为 “通用操作系统universal operating system”。 + +#### 5、安装 + +[安装 Ubuntu][9] 比安装 Debian 容易得多。我并不是在开玩笑。即使对于有经验的 Linux 用户,Debian 也可能令人困惑。 + +当你下载 Debian 的时候,它默认提供的是最小化镜像。此镜像没有非自由(非开源)的固件。如果你继续安装它,你就可能会发现你的网络适配器和其它硬件将无法识别。 + +有一个单独的包含固件的非自由镜像,但它是隐藏的,如果你不知道,你可能会大吃一惊。 + +![Getting non-free firmware is a pain in Debian][10] + +Ubuntu 在默认提供的镜像中包含专有驱动程序和固件时要宽容的多。 + +此外,Debian 安装程序看起来很旧,而 Ubuntu 安装程序看起来就比较现代化。Ubuntu 安装程序还可以识别磁盘上其它已安装的操作系统,并为你提供将 Ubuntu 与现有操作系统一起安装的选项(双引导)。但我在测试时并没有注意到 Debian 有此选项。 + +![Installing Ubuntu is smoother][11] + +#### 6、开箱即用的硬件支持 + +就像之前提到的,Debian 主要关注 [FOSS][12](自由和开源软件)。这意味着 Debian 提供的内核不包括专有驱动程序和固件。 + +这并不是说你无法使其工作,而是你必须添加/启动额外的存储库并手动安装。这可能令人沮丧,特别是对于初学者来说。 + +Ubuntu 并不完美,但在提供开箱即用的驱动程序和固件方面,它比 Debian 好得多。这意味着更少的麻烦和更完整的开箱即用体验。 + +#### 7、桌面环境选择 + +Ubuntu 默认使用定制的 GNOME 桌面环境。你可以在其上安装 [其它桌面环境][13],或者选择 [各种不同桌面风格的 Ubuntu][14],如 Kubuntu(使用 KDE 桌面)、Xubuntu(使用 Xfce 桌面)等。 + +Debian 也默认安装了 GNOME 桌面。但是它会让你在安装的过程中选择你要安装的桌面环境。 + +![][15] + +你还可以从其网站获取 [特定桌面环境的 ISO 镜像][16]。 + +#### 8、游戏性 + +由于 Stream 及其 Proton 项目,Linux 上的游戏总体上有所改善。尽管如此,游戏在很大程度上取决于硬件。 + +在硬件兼容性上,Ubuntu 比 Debian 在支持专有驱动程序方面要好。 + +并不是说在 Debian 中不能做到这一点,而是需要一些时间和精力来实现。 + +#### 9、性能 + +性能部分没有明显的“赢家”,无论是在服务器版本还是在桌面版本。 Debian 和 Ubuntu 作为桌面和服务器操作系统都很受欢迎。 + +性能取决于你系统的硬件和你所使用的软件组件。你可以在你的操作系统中调整和控制你的系统。 + +#### 10、社区和支持 + +Debian 是一个真正的社区项目。此项目的一切都由其社区成员管理。 + +Ubuntu 由 [Canonical][17] 提供支持。然而,它并不是一个真正意义上的企业项目。它确实有一个社区,但任何事情的最终决定权都掌握在 Canonical 手中。 + +就支持而言,Ubuntu 和 Debian 都有专门的论坛,用户可以在其中寻求帮助和提出建议。 + +Canonical 还为其企业客户提供收费的专业支持。Debian 则没有这样的功能。 + +### 结论 + +Debian 和 Ubuntu 都是桌面或服务器操作系统的可靠选择。 APT 包管理器和 DEB 包对两者都是通用的,因此提供了一些相似的体验。 + +然而,Debian 仍然需要一定程度的专业知识,特别是在桌面方面。如果你是 Linux 新手,坚持使用 Ubuntu 将是你更好的选择。在我看来,你应该积累一些经验,熟悉了一般的 Linux,然后再尝试使用 Debian。 + +并不是说你不能从一开始就使用 Debian,但对于 Linux 初学者来说,这并不是一种很好的体验。 + +欢迎你对这场 Debian 与 Ubuntu 辩论发表意见。 + +-------------------------------------------------------------------------------- + +via: https://itsfoss.com/debian-vs-ubuntu/ + +作者:[Abhishek Prakash][a] +选题:[lujun9972][b] +译者:[perfiffer](https://github.com/perfiffer) +校对:[wxy](https://github.com/wxy) + +本文由 [LCTT](https://github.com/LCTT/TranslateProject) 原创编译,[Linux中国](https://linux.cn/) 荣誉推出 + +[a]: https://itsfoss.com/author/abhishek/ +[b]: https://github.com/lujun9972 +[1]: https://itsfoss.com/apt-get-linux-guide/ +[2]: https://www.debian.org/ +[3]: https://i0.wp.com/itsfoss.com/wp-content/uploads/2021/08/Debian-ubuntu-upstream.png?resize=800%2C400&ssl=1 +[4]: https://i0.wp.com/itsfoss.com/wp-content/uploads/2021/08/debian-vs-ubuntu.png?resize=800%2C450&ssl=1 +[5]: https://itsfoss.com/long-term-support-lts/ +[6]: https://i0.wp.com/itsfoss.com/wp-content/uploads/2020/10/apt-cache-policy.png?resize=795%2C456&ssl=1 +[7]: https://itsfoss.com/ppa-guide/ +[8]: https://i2.wp.com/itsfoss.com/wp-content/uploads/2019/03/ffmpeg_add_ppa.jpg?resize=800%2C222&ssl=1 +[9]: https://itsfoss.com/install-ubuntu/ +[10]: https://i0.wp.com/itsfoss.com/wp-content/uploads/2021/08/Debian-firmware.png?resize=800%2C600&ssl=1 +[11]: https://i2.wp.com/itsfoss.com/wp-content/uploads/2021/03/choose-something-else-installing-ubuntu.png?resize=800%2C491&ssl=1 +[12]: https://itsfoss.com/what-is-foss/ +[13]: https://itsfoss.com/best-linux-desktop-environments/ +[14]: https://itsfoss.com/which-ubuntu-install/ +[15]: https://i0.wp.com/itsfoss.com/wp-content/uploads/2021/08/debian-install-desktop-environment.png?resize=640%2C479&ssl=1 +[16]: https://cdimage.debian.org/debian-cd/current-live/amd64/iso-hybrid/ +[17]: https://canonical.com/ diff --git a/published/202109/20210820 Check file status on Linux with the stat command.md b/published/202109/20210820 Check file status on Linux with the stat command.md new file mode 100644 index 0000000000..551d34a53f --- /dev/null +++ b/published/202109/20210820 Check file status on Linux with the stat command.md @@ -0,0 +1,113 @@ +[#]: subject: "Check file status on Linux with the stat command" +[#]: via: "https://opensource.com/article/21/8/linux-stat-file-status" +[#]: author: "Seth Kenlon https://opensource.com/users/seth" +[#]: collector: "lujun9972" +[#]: translator: "New-World-2019" +[#]: reviewer: "turbokernel" +[#]: publisher: "wxy" +[#]: url: "https://linux.cn/article-13768-1.html" + +在 Linux 上使用 stat 命令查看文件状态 +====== + +> 获取到任何文件或文件系统的所有信息,仅需要一条 Linux 命令。 + +![](https://img.linux.net.cn/data/attachment/album/202109/10/072912ouo04jchatqazq53.jpg) + +在 GNU `coreutils` 软件包中包含 `stat` 命令,它提供了关于文件和文件系统包括文件大小、节点位置、访问权限和 SELinux 上下文,以及创建和修改时间等各种元数据。通常情况下,你需要多个不同命令获取的信息,而这一个命令就可以实现。 + +### 在 Linux 上安装 stat 命令 + +在 Linux 系统中,可能已经预装了 `stat` 命令,因为它属于核心功能软件包,通常默认包含在 Linux 发行版里。 + +如果系统中没有安装 `stat` 命令,你可以使用包管理器安装 `coreutils` 软件包。 + +另外,你可以 [通过源码编译安装 coreutils 包][2]。 + +### 获取文件状态 + +运行 `stat` 命令可以获取指定文件或目录易读的状态信息。 + +``` +$ stat planets.xml + File: planets.xml + Size: 325 Blocks: 8 IO Block: 4096 regular file +Device: fd03h/64771d Inode: 140217 Links: 1 +Access: (0664/-rw-rw-r--) Uid: (1000/tux) Gid: (100/users) +Context: unconfined_u:object_r:user_home_t:s0 +Access: 2021-08-17 18:26:57.281330711 +1200 +Modify: 2021-08-17 18:26:58.738332799 +1200 +Change: 2021-08-17 18:26:58.738332799 +1200 + Birth: 2021-08-17 18:26:57.281330711 +1200 +``` + +输出的信息易懂,但是包含了很多的信息,这里是 `stat` 所包含的项: + + * `File`:文件名 + * `Size`:文件大小,以字节表示 + * `Blocks`:在硬盘驱动器上为文件保留的数据块的数量 + * `IO Block`:文件系统块大小 + * `regular file`:文件类型(普通文件、目录、文件系统) + * `Device`:文件所在的设备 + * `Inode`:文件所在的 Inode 号 + * `Links`:文件的链接数 + * `Access`、`UID`、`GID`:文件权限、用户和组的所有者 + * `Context`:SELinux 上下文 + * `Access`、`Modify`、`Change`、`Birth`:文件被访问、修改、更改状态以及创建时的时间戳 + +### 精简输出 + +对于精通输出或者想要使用其它工具(例如:[awk][3])解析输出的人,这里可以使用 `--terse`(短参数为 `-t`)参数,实现没有标题或换行符的格式化输出。 + +``` +$ stat --terse planets.xml +planets.xml 325 8 81b4 100977 100 fd03 140217 1 0 0 1629181617 1629181618 1629181618 1629181617 4096 unconfined_u:object_r:user_home_t:s0 +``` + +### 自定义格式 + +你可以使用 `--printf` 参数以及与 [printf][4] 类似的语法定义自己的输出格式。`stat` 的每一个属性都有一个格式序列(`%C` 表示 SELinux 上下文,`%n` 表示文件名等等),所以,你可以定义输出格式。 + +``` +$ stat --printf="%n\n%C\n" planets.xml +planets.xml +unconfined_u:object_r:user_home_t:s0 +$ $ stat --printf="Name: %n\nModified: %y\n" planets.xml +Name: planets.xml +Modified: 2021-08-17 18:26:58.738332799 +1200 +``` + +下面是一些常见的格式序列: + + * `%a` 访问权限 + * `%F` 文件类型 + * `%n` 文件名 + * `%U` 用户名 + * `%u` 用户 ID + * `%g` 组 ID + * `%w` 创建时间 + * `%y` 修改时间 + +在 `stat` 手册和 `coreutils` 信息页中都有完整的格式化序列列表。 + +### 文件信息 + +如果你曾尝试解析过 `ls -l` 的输出,那么,你会很喜欢 `stat` 命令的灵活性。你并不是每次都需要 `stat` 提供的所有信息,但是,当你需要其中一些或全部的时候它是非常有用的。不管你是读取默认输出,还是你自己创建的查询输出,`stat` 命令都可以查看所需的数据。 + +-------------------------------------------------------------------------------- + +via: https://opensource.com/article/21/8/linux-stat-file-status + +作者:[Seth Kenlon][a] +选题:[lujun9972][b] +译者:[New-World-2019](https://github.com/New-World-2019) +校对:[turbokernel](https://github.com/turbokernel) + +本文由 [LCTT](https://github.com/LCTT/TranslateProject) 原创编译,[Linux中国](https://linux.cn/) 荣誉推出 + +[a]: https://opensource.com/users/seth +[b]: https://github.com/lujun9972 +[1]: https://opensource.com/sites/default/files/styles/image-full-size/public/lead-images/yearbook-haff-rx-linux-file-lead_0.png?itok=-i0NNfDC (Hand putting a Linux file folder into a drawer) +[2]: https://www.gnu.org/software/coreutils/ +[3]: https://opensource.com/article/20/9/awk-ebook +[4]: https://opensource.com/article/20/8/printf diff --git a/published/202109/20210820 How to Download Audio Only Using youtube-dl.md b/published/202109/20210820 How to Download Audio Only Using youtube-dl.md new file mode 100644 index 0000000000..fd70c1524c --- /dev/null +++ b/published/202109/20210820 How to Download Audio Only Using youtube-dl.md @@ -0,0 +1,116 @@ +[#]: subject: "How to Download Audio Only Using youtube-dl" +[#]: via: "https://itsfoss.com/youtube-dl-audio-only/" +[#]: author: "Abhishek Prakash https://itsfoss.com/author/abhishek/" +[#]: collector: "lujun9972" +[#]: translator: "geekpi" +[#]: reviewer: "wxy" +[#]: publisher: "wxy" +[#]: url: "https://linux.cn/article-13753-1.html" + +如何使用 youtube-dl 只下载音频 +====== + +![](https://img.linux.net.cn/data/attachment/album/202109/05/153110dkamc1kv0173ggc3.jpg) + +[youtube-dl][1] 是一个多功能的命令行工具,用于从 YouTube 和许多其他网站下载视频。我用它来做我自己的 YouTube 视频的备份。 + +默认情况下,你会 [使用 youtube-dl 下载视频][2]。用 youtube-dl 只提取音频怎么样? 其实很简单。让我告诉你步骤。 + +> **注意** +> +> 从网站下载视频可能违反他们的政策。这取决于你是否选择下载视频或音频。 + +### 使用 youtube-dl 只下载音频 + +请确保你已经在你的 Linux 发行版上安装了 `youtube-dl`。 + +``` +sudo snap install youtube-dl +``` + +如果你只想从 YouTube 视频中下载音频,你可以使用 `youtube-dl` 的 `-x` 选项。这个提取音频的选项将视频文件转换为纯音频文件。 + +``` +youtube-dl -x video_URL +``` + +该文件被保存在你运行 `youtube-dl` 命令的同一目录下。 + +这是我下载 Zorin OS 16 评论视频的画外音的示例: + +``` +youtube-dl -x https://www.youtube.com/watch?v=m_PmLG7HqbQ +[youtube] m_PmLG7HqbQ: Downloading webpage +[download] Destination: Zorin OS 16 Review - It's a Visual Masterpiece-m_PmLG7HqbQ.m4a +[download] 100% of 4.26MiB in 00:03 +[ffmpeg] Correcting container in "Zorin OS 16 Review - It's a Visual Masterpiece-m_PmLG7HqbQ.m4a" +[ffmpeg] Post-process file Zorin OS 16 Review - It's a Visual Masterpiece-m_PmLG7HqbQ.m4a exists, skipping +``` + +你注意到音频格式了吗?它是 .m4a 格式。你可以把音频格式指定为你所选择的格式。 + +比如你想提取 MP3 格式的音频。你可以像这样使用它: + +``` +youtube-dl -x --audio-format mp3 video_URL +``` + +下面是我之前展示的同一个例子。你可以看到它 [使用 ffmpeg 转换][3] m4a 文件为 mp3: + +``` +youtube-dl -x --audio-format mp3 https://www.youtube.com/watch?v=m_PmLG7HqbQ +[youtube] m_PmLG7HqbQ: Downloading webpage +[download] Zorin OS 16 Review - It's a Visual Masterpiece-m_PmLG7HqbQ.m4a has already been downloaded +[download] 100% of 4.26MiB +[ffmpeg] Correcting container in "Zorin OS 16 Review - It's a Visual Masterpiece-m_PmLG7HqbQ.m4a" +[ffmpeg] Destination: Zorin OS 16 Review - It's a Visual Masterpiece-m_PmLG7HqbQ.mp3 +Deleting original file Zorin OS 16 Review - It's a Visual Masterpiece-m_PmLG7HqbQ.m4a (pass -k to keep) +``` + +### 以 MP3 格式下载整个 YouTube 播放列表 + +是的,你完全可以这样做。最主要的是要在这里得到播放列表的 URL。它通常是以下格式: + +``` +https://www.youtube.com/playlist?list=XXXXXXXXXXXXXXXXXXX +``` + +要获得一个播放列表的 URL,当播放列表显示在右边栏时,点击其名称。 + +![Click on the playlist title][4] + +它将带你到播放列表页面,你可以在这里复制 URL。 + +![Grab the playlist URL][5] + +现在你有了播放列表的 URL,你可以用它来下载 MP3 格式的音频文件,方法如下: + +``` +youtube-dl --extract-audio --audio-format mp3 -o "%(title)s.%(ext)s" playlist_URL +``` + +那个看起来很可怕的 `-o "%(title)s.%(ext)s"` 指定了输出文件(选项 `-o`),并指示它使用视频的标题和扩展名(本例为 mp3)来命名音频文件。 + +![][6] + +我希望你觉得这个技巧对你有帮助。享受音频文件吧。 + +-------------------------------------------------------------------------------- + +via: https://itsfoss.com/youtube-dl-audio-only/ + +作者:[Abhishek Prakash][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/abhishek/ +[b]: https://github.com/lujun9972 +[1]: https://github.com/ytdl-org/youtube-dl +[2]: https://itsfoss.com/download-youtube-linux/ +[3]: https://itsfoss.com/ffmpeg/ +[4]: https://i1.wp.com/itsfoss.com/wp-content/uploads/2021/08/getting-youtube-playlist-url.png?resize=797%2C366&ssl=1 +[5]: https://i1.wp.com/itsfoss.com/wp-content/uploads/2021/08/youtube-playlist-url.png?resize=800%2C388&ssl=1 +[6]: https://i0.wp.com/itsfoss.com/wp-content/uploads/2021/08/downloading-youtube-playlist-audio.png?resize=800%2C559&ssl=1 diff --git a/published/202109/20210821 10 Things to Do After Installing elementary OS 6 -Odin.md b/published/202109/20210821 10 Things to Do After Installing elementary OS 6 -Odin.md new file mode 100644 index 0000000000..b713a04e1a --- /dev/null +++ b/published/202109/20210821 10 Things to Do After Installing elementary OS 6 -Odin.md @@ -0,0 +1,172 @@ +[#]: subject: "10 Things to Do After Installing elementary OS 6 “Odin”" +[#]: via: "https://www.debugpoint.com/2021/08/10-things-to-do-after-install-elementary-os-6/" +[#]: author: "Arindam https://www.debugpoint.com/author/admin1/" +[#]: collector: "lujun9972" +[#]: translator: "anine09" +[#]: reviewer: "wxy" +[#]: publisher: "wxy" +[#]: url: "https://linux.cn/article-13749-1.html" + +安装 elementary OS 6 “Odin” 后要做的 10 件事 +====== + +> 一个精心准备的在安装 elementary OS 6 “Odin” 后要做的事情的列表。 + +![](https://img.linux.net.cn/data/attachment/album/202109/04/081345bf9co7ot40szdytg.jpg) + +在经过两年多的开发后 [elementary OS 6 “Odin”][1] 于不久前发布,此次版本更新在核心模块、 Pantheon 桌面、原生应用方面带来了一大批新特性。elementary OS 6 “Odin” 是基于 Ubuntu 20.04 LTS 的。 + +如果你完成了安装,你可能想要尝试通过一些特定的设置来使你的系统更加的个性化。这里描述的选项是通用的,在某些情况下可能对你没有用,但是我们觉得有必要列出一些基本的东西,让你有合适的方式来探索这个漂亮的 elementary OS。 + +### 安装完 elementary OS 6 “Odin” 后要做的事情 + +准备步骤: + +首先确保你已经连上了互联网,你可以在顶部的通知区域查看可用的网络列表 + +#### 1、更改主机名 + +这可能不是你想做的第一件事。但是我不知道为什么在安装过程中没有给出更改主机名的选项。例如,见下图的终端提示, 这个主机名是 elementary OS 的默认硬件配置。在我看来这一点都不好。 + +![主机名修改之前][2] + +打开终端并运行下列命令以更改主机名: + +``` +hostnamectl set-hostname your-new-hostname +``` + +示例: + +![修改主机名][3] + +![主机名修改之后][4] + +#### 2、升级你的系统 + +在安装任何 Linux 发行版后,你应该做的第一件事就是确保系统处于最新的软件包和安全更新状态。 + +你可以通过打开应用中心来检查或者安装更新。 + +或者打开终端运行下列命令: + +``` +sudo apt update +sudo apt upgrade +``` + +#### 3、安装 Pantheon Tweaks + +Pantheon Tweaks 是 elementary OS 的必备应用。它提供了一些无法通过系统原生设置程序修改的额外的设置和配置选项,请打开终端并运行以下命令以安装 Pantheon Tweaks。注意:先前版本的 Tweak 工具叫做 elementary Tweaks,从 Odin 版本开始更名为 Pantheon Tweaks。 + +``` +sudo apt install software-properties-common +sudo add-apt-repository -y ppa:philip.scott/pantheon-tweaks +sudo apt install -y pantheon-tweaks +``` + +安装后打开系统设置,你可以在那里找到 “调整Tweaks” 选项。 + +[这里][5] 提供了更详细的安装指南(如果你需要了解更多信息)。 + +### 4、配置 Dock + +Dock 是整个桌面的中心。老实说,Dock 中默认包含的应用并不常用,因此你可以通过以下步骤配置 Dock 中的项目。 + + * 移除:右键单击并取消 “在 Dock 中驻留Keep in Dock” 选项。 + * 添加新的项目:单击顶部的应用程序。然后右键单击你想要放在 Dock 的应用图标。选择 “添加到 DockAdd to Dock”。 + +在我看来,你应该至少把文件管理、截图工具、Firefox 、计算器,以及其他的一些应用添加到 Dock。然后移除 Dock 上那些你不需要的应用。 + +#### 5、更改外观 + +elementary OS 6 Odin 改进了桌面的整体外观,为整个桌面和应用程序提供了自带的强调色和原生的夜间模式,同时,系统自带了许多漂亮的壁纸。你可以通过 “应用 > 系统设置 > 桌面” 来定制壁纸、外观、面板和多任务视图。 + +![elementary OS 6 Odin 桌面设置界面][6] + +按照你希望的样子来配置你系统的外观。 + +你也可以基于日出和日落的时间来设置夜间模式。 + +#### 6、安装其他的应用 + +自带的应用中心非常适合这个系统,我发现它是 Linux 桌面最好的应用商店之一。然而,有时候需要安装没有预装的必要应用(大多数是知名的应用)。下面是个新系统推荐安装的软件列表。(说真的,为什么 LibreOffice 没有预装?) + + * firefox + * gimp + * gedit + * inkscape + * obs-studio + * libreoffice + +#### 7、一些针对笔记本电脑的省电贴士 + +有许多方法可以配置你的 elementary OS(或者一般的 Linux 桌面),以达到延长电池寿命的目的。记住,电池寿命取决于你的笔记本硬件,以及电池和笔记本的使用年限。所以,遵循下面的一些建议,最大限度的利用你的笔记本电池。 + + * 安装 [tlp][8]。`tlp` 是一个简单易用的命令行程序,用来帮你在 Linux 上延长电池寿命。你只需要安装它,默认情况下,它会处理好其他的设置。安装命令: + + ``` + sudo add-apt-repository ppa:linrunner/tlp + sudo apt update + sudo apt-get install tlp + sudo tlp start + ``` + + * 关闭蓝牙,默认情况下,蓝牙是开启状态。在需要的时候再启动它。 + + * 通过下面的命令安装 `thermald`。这个实用程序(实际是个守护进程)控制着你的 CPU 的 P-States 和 T-States 的温度以及 CPU 发热。 + + ``` + sudo apt install thermald + ``` + + * 根据你的需要将亮度调到最小。 + +#### 8、安装磁盘实用程序 + +在很多情况下,你发现你需要格式化 USB 或者向 USB 中写入一些东西。默认情况下,系统没有安装任何相关的应用。你可以安装以下这些易用的应用。 + + * gnome-disk-utility + * gparted + +#### 9、启用最大化和最小化选项 + +许多用户喜欢在窗口标题栏左边或者右边使用最大化、最小化的按钮,elementary OS 默认只提供关闭和恢复两个选项。这没什么问题,因为这就是它的设计理念。然而你可以通过使用 Pantheon Tweaks 来开启最大化和最小化按钮,具体的方式是:“调整 > 外观 > 窗口控制”。 + +![在 elementary OS 中启动最大化和最小化设置][9] + +#### 10、在 Odin 中学习新的多点触控手势 + +如果你是笔记本用户,并且使用 elementary OS “Odin”,那么你一定要看看这些超酷的新触控手势。三根手指向上滑动,就会平滑的打开多任务视图,展示打开的应用程序和工作空间。用三根手指向左或向右滑动,就能在动态工作空间之间流畅的切换,使任务之间的切换更快。 + +用两根手指也可以在原生应用中实现类似的功能。 + +### 结束语 + +我希望这篇安装 elementary OS 6 “Odin” 后要做的 10 件事能帮助到你,让你可以上手使用 elementary OS 6 “Odin”,尽管这些事情完全是用户的偏好,因此这些事情有可能适合你也有可能不适用于你,但总的来说,这些都是一般用户喜欢的预期调整。 + +如果你觉得有更多的东西应该添加到列表中,请在下面的评论中告诉我。 + +-------------------------------------------------------------------------------- + +via: https://www.debugpoint.com/2021/08/10-things-to-do-after-install-elementary-os-6/ + +作者:[Arindam][a] +选题:[lujun9972][b] +译者:[anine09](https://github.com/anine09) +校对:[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/08/elementary-os-6/ +[2]: https://www.debugpoint.com/blog/wp-content/uploads/2021/08/hostname-change-before.jpeg +[3]: https://www.debugpoint.com/blog/wp-content/uploads/2021/08/changing-hostname.jpeg +[4]: https://www.debugpoint.com/blog/wp-content/uploads/2021/08/changed-hostname.jpeg +[5]: https://www.debugpoint.com/2021/07/elementary-tweaks-install/ +[6]: https://www.debugpoint.com/blog/wp-content/uploads/2021/08/elementary-OS-6-Odin-settings-window-Desktop.jpeg +[7]: https://www.debugpoint.com/2020/09/elementary-os-6-odin-new-features-release-date/ +[8]: https://linrunner.de/tlp/ +[9]: https://www.debugpoint.com/blog/wp-content/uploads/2021/08/enable-minimize-maximize-buttons-elementary-OS-1024x501.png + diff --git a/published/202109/20210821 How to set up your printer on Linux.md b/published/202109/20210821 How to set up your printer on Linux.md new file mode 100644 index 0000000000..6e56331207 --- /dev/null +++ b/published/202109/20210821 How to set up your printer on Linux.md @@ -0,0 +1,99 @@ +[#]: subject: "How to set up your printer on Linux" +[#]: via: "https://opensource.com/article/21/8/add-printer-linux" +[#]: author: "Seth Kenlon https://opensource.com/users/seth" +[#]: collector: "lujun9972" +[#]: translator: "fisherue" +[#]: reviewer: "wxy" +[#]: publisher: "wxy" +[#]: url: "https://linux.cn/article-13740-1.html" + +如何在 Linux 系统设置打印机 +====== + +> 如果系统没有自动检测到你的打印机,这篇文章教你如何在 Linux 系统手动添加打印机。 + +![](https://img.linux.net.cn/data/attachment/album/202109/01/104541gvvxvriei677o76v.jpg) + +即使未来已来,电子墨水e-ink和 AR 技术可以现实应用,我们还是会用到打印机的。打印机制造商还不能做到让自己的专利打印机可以与各种计算机完全标准化传递信息,以至于我们需要各种打印机驱动程序,在任何操作系统上都是如此。电子电气工程师协会信息科学与技术处(IEEE-ISTO)下属的打印机工作组(PWG)和开放打印技术组织(OpenPrinting.org)长期合作致力于让人们可以(使用任何型号打印机)轻松打印。带来的便利就是,很多打印机可以不需要用户进行配置就可以自动被识别使用。 + +如果系统没有自动检测到你的打印机,你可以在这篇文章中找到如何在 Linux 系统手动添加打印机。文中假定你使用的是 GNOME 图形桌面系统,其设置流程同样适用于 KDE 或其他大多数桌面系统。 + +### 打印机驱动程序 + +在你尝试用打印机打印文件时,要先确认你的 Linux 系统上是不是已经安装了更新的打印机驱动程序。 + +可以尝试安装的打印机驱动程序有三大类: + + * 作为安装包提供的,捆绑在你的 Linux 系统上的开源 [Gutenprint 驱动程序][2] + * 打印机制造商提供的专用驱动程序 + * 第三方开发提供的打印机驱动程序 + +开源打印机驱动程序库可以驱动 700 多种打印机,值得安装,这里面可能就有你的打印机的驱动,说不定可以自动设置好你的打印机(,你就可以使用它了)。 + +### 安装开源驱动程序包(库) + +有些 Linux 发行版已经预装了开源打印机驱动程序包,如果没有,你可以用包管理器来安装。比如说,在 Fedora、CentOS、Magela 等类似发行版的 Linux 系统上,执行下面命令来安装: + +``` +$ sudo dnf install gutenprint +``` + +惠普(HP)系列的打印机,还需要安装惠普的 Linux 图形及打印系统软件包(HPLIP)。如在 Debian、Linux Mint 等类似的系统上,可以使用下面的命令: + +``` +$ sudo apt install hplip +``` + +### 安装制造商提供的驱动程序 + +很多时候因为打印机制造商使用了非标准的接口协议,这种情况开源打印机驱动程序就不能驱动打印机。另外的情况就是,开源驱动程序可以驱动打印机工作,但是会缺少供应商特有的某些性能。这些情况,你需要访问制造商的网站,找到适合你的打印机型号的 Linux 平台驱动。安装过程各异,仔细阅读安装指南逐步安装。 + +如果你的打印机根本不被厂商支持,你或许也只能尝试第三方提供的该型号打印机的驱动软件了。这类第三方驱动程序不是开源的,但大多数打印机的专用驱动程序也不是。如果你需要额外花费从供应商那里获取帮助服务才能安装好驱动并使用你的打印机,那是很心疼,或者你索性把这台打印机扔掉,至少你知道下次再也不会购买这个品牌的打印机了。 + +### 通用打印驱动系统(CUPS) + +通用打印驱动系统Common Unix Printing System(CUPS)是由 Easy Software Products 公司于 1997 年开发的,2007 年被苹果公司收购。这是 Linux 平台打印的开源基础软件包,大多数现代发行版都为它提供了一个定制化的界面。得益于 CUPS 技术,你可以发现通过 USB 接口连接到电脑的打印机,甚至连接在同一网络的共享打印机。 + +一旦你安装了需要的驱动程序包,你就能手工添加你的打印机了。首先,把打印机连接到运行的电脑上,并打开打印机电源。然后从“活动”屏幕或者应用列表中找到并打开“打印机”设置。 + +![printer settings][4] + +基于你已经安装的驱动包,你的 Linux 系统有可能自动检测识别到你的打印机型号,不需要额外的设置就可以使用你的打印机了。 + +![printer settings][5] + +一旦你在列表中找到你的打印机型号,设置使用这个驱动,恭喜你就可以在 Linux 系统上用它打印了。 + +(如果你的打印机没有被自动识别,)你需要自行添加打印机。在“打印机”设置界面,点击右上角的解锁按钮,输入管理用户密码,按钮转换成“添加打印机”按钮。 + +然后点击这个“添加打印机”按钮,电脑会搜索已经连接的本地打印机型号并匹配相应驱动程序。如果要添加网络共享打印机,在搜索框输入打印机或者其服务器机的 IP 地址。 + +![searching for a printer][6] + +选中你想添加的打印机型号,点击“添加”按钮把打印机驱动加入系统,就可以使用它了。 + +### 在 Linux 系统上打印 + +在 Linux 系统上打印很容易,不管你是在使用本地打印机还是网络打印机。如果你计划购买打印机,建议查看开放打印技术组织的(可支持打印机)数据库([OpenPrinting.org][7]),看看你想购买的打印机是不是有相应的开源驱动程序。如果你已经拥有一台打印机,你现在也知道怎样在你的 Linux 系统上使用你的打印机了。 + +-------------------------------------------------------------------------------- + +via: https://opensource.com/article/21/8/add-printer-linux + +作者:[Seth Kenlon][a] +选题:[lujun9972][b] +译者:[fisherue](https://github.com/fisherue) +校对:[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/happy-printer.png?itok=9J44YaDs "printing on Linux" +[2]: http://gimp-print.sourceforge.net/ +[3]: https://www.turboprint.info/ +[4]: https://opensource.com/sites/default/files/system-settings-printer_0.png "printer settings" +[5]: https://opensource.com/sites/default/files/settings-printer.png "printer settings" +[6]: https://opensource.com/sites/default/files/printer-search.png "searching for a printer" +[7]: http://www.openprinting.org/printers/ + diff --git a/published/202109/20210823 Apps for daily needs part 4- audio editors.md b/published/202109/20210823 Apps for daily needs part 4- audio editors.md new file mode 100644 index 0000000000..782b51296d --- /dev/null +++ b/published/202109/20210823 Apps for daily needs part 4- audio editors.md @@ -0,0 +1,77 @@ +[#]: subject: "Apps for daily needs part 4: audio editors" +[#]: via: "https://fedoramagazine.org/apps-for-daily-needs-part-4-audio-editors/" +[#]: author: "Arman Arisman https://fedoramagazine.org/author/armanwu/" +[#]: collector: "lujun9972" +[#]: translator: "geekpi" +[#]: reviewer: "turbokernel" +[#]: publisher: "wxy" +[#]: url: "https://linux.cn/article-13771-1.html" + +满足日常需求的应用(四):音频编辑器 +====== + +![][1] + +在过去,音频编辑应用或数字音频工作站digital audio workstation(DAW)只提供给专业人士使用,如唱片制作人、音响工程师和音乐家。但现在很多不是专业人士的人也需要它们。这些工具被用于演示文稿解说、视频博客,甚至只是作为一种爱好。现在尤其如此,因为有这么多的在线平台,方便大家分享音频作品,如音乐、歌曲、播客等。本文将介绍一些你可以在 Fedora Linux 上使用的开源音频编辑器或 DAW。你可能需要安装提到的软件。如果你不熟悉如何在 Fedora Linux 中添加软件包,请参阅我之前的文章[安装 Fedora 34 工作站后要做的事情][4]。这里列出了音频编辑器或 DAW 类的一些日常需求的应用。 + +### Audacity + +我相信很多人已经知道 Audacity 了。它是一个流行的多轨音频编辑器和录音机,可用于对所有类型的音频进行后期处理。大多数人使用 Audacity 来记录他们的声音,然后进行编辑,使其成品更好。其成品可以作为播客或视频博客的解说词。此外,人们还用 Audacity 来创作音乐和歌曲。你可以通过麦克风或调音台录制现场音频。它还支持 32 位的声音质量。 + +Audacity 有很多功能,可以支持你的音频作品。它有对插件的支持,你甚至可以自己编写插件。Audacity 提供了许多内置效果,如降噪、放大、压缩、混响、回声、限制器等。你可以利用实时预览功能在直接聆听音频的同时尝试这些效果。内置的插件管理器可以让你管理经常使用的插件和效果。 + +![][5] + +详情请参考此链接: + +### LMMS + +LMMS(即 Linux 多媒体工作室Linux MultiMedia Studio)是一个全面的音乐创作应用。你可以从头使用 LMMS 用你的电脑开始制作你的音乐。你可以根据自己的创意创造旋律和节拍,并通过选择声音乐器和各种效果使其更加完美。有几个与乐器和效果有关的内置功能,如 16 个内置合成器、嵌入式 ZynAddSubFx、支持插入式 VST 效果插件、捆绑图形和参数均衡器、内置分析器等等。LMMS 还支持 MIDI 键盘和其他音频外围设备。 + +![][6] + +详情请参考此链接: + +### Ardour + +Ardour 作为一个全面的音乐创作应用,其功能与 LMMS 相似。它在其网站上说,Ardour 是一个 DAW 应用,是来自世界各地的音乐家、程序员和专业录音工程师合作的结果。Ardour 拥有音频工程师、音乐家、配乐编辑和作曲家需要的各种功能。 + +Ardour 提供了完整的录音、编辑、混音和输出功能。它有无限的多声道音轨、无限撤销/重做的非线性编辑器、一个全功能的混音器、内置插件等。Ardour 还包含视频播放工具,所以使用它为视频项目创建和编辑配乐也很有帮助。 + +![][7] + +详情请参考此链接: + +### TuxGuitar + +TuxGuitar 是一款指法谱和乐谱编辑器。它配备了指法编辑器、乐谱查看器、多轨显示、拍号管理和速度管理。它包括弯曲、滑动、颤音等各种效果。虽然 TuxGuitar 专注于吉他,但它也可以为其他乐器写乐谱。它也能够作为一个基本的 MIDI 编辑器。你需要对指法谱和乐谱有一定的了解才能使用它。 + +![][8] + +详情请参考此链接: + +### 总结 + +本文章介绍了四款音频编辑器,可以满足你在 Fedora Linux 上日常使用的需求。其实,在 Fedora Linux 上还有很多音频编辑器或者 DAW 供你选择。你也可以使用 Mixxx、Rosegarden、Kwave、Qtractor、MuseScore、musE 等等。希望本文为你调查和选择合适的音频编辑器或者 DAW 提供帮助。如你有使用这些应用的经验,请在评论中分享你的经验。 + +-------------------------------------------------------------------------------- + +via: https://fedoramagazine.org/apps-for-daily-needs-part-4-audio-editors/ + +作者:[Arman Arisman][a] +选题:[lujun9972][b] +译者:[geekpi](https://github.com/geekpi) +校对:[turbokernel](https://github.com/turbokernel) + +本文由 [LCTT](https://github.com/LCTT/TranslateProject) 原创编译,[Linux中国](https://linux.cn/) 荣誉推出 + +[a]: https://fedoramagazine.org/author/armanwu/ +[b]: https://github.com/lujun9972 +[1]: https://fedoramagazine.org/wp-content/uploads/2021/07/FedoraMagz-Apps-4-Audio-816x345.jpg +[2]: https://unsplash.com/@brookecagle?utm_source=unsplash&utm_medium=referral&utm_content=creditCopyText +[3]: https://unsplash.com/s/photos/meeting-on-cafe-computer?utm_source=unsplash&utm_medium=referral&utm_content=creditCopyText +[4]: https://fedoramagazine.org/things-to-do-after-installing-fedora-34-workstation/ +[5]: https://fedoramagazine.org/wp-content/uploads/2021/08/audio-audacity-1024x575.png +[6]: https://fedoramagazine.org/wp-content/uploads/2021/08/audio-lmms-1024x575.png +[7]: https://fedoramagazine.org/wp-content/uploads/2021/08/audio-ardour-1024x592.png +[8]: https://fedoramagazine.org/wp-content/uploads/2021/08/audio-tuxguitar-1024x575.png diff --git a/published/202109/20210824 Ulauncher- A Super Useful Application Launcher for Linux.md b/published/202109/20210824 Ulauncher- A Super Useful Application Launcher for Linux.md new file mode 100644 index 0000000000..b6fced4284 --- /dev/null +++ b/published/202109/20210824 Ulauncher- A Super Useful Application Launcher for Linux.md @@ -0,0 +1,124 @@ +[#]: subject: "Ulauncher: A Super Useful Application Launcher for Linux" +[#]: via: "https://itsfoss.com/ulauncher/" +[#]: author: "Ankush Das https://itsfoss.com/author/ankush/" +[#]: collector: "lujun9972" +[#]: translator: "geekpi" +[#]: reviewer: "wxy" +[#]: publisher: "wxy" +[#]: url: "https://linux.cn/article-13743-1.html" + +Ulauncher:一个超级实用的 Linux 应用启动器 +====== + +> Ulauncher 是一个快速应用启动器,支持扩展和快捷方式,帮助你在 Linux 中快速访问应用和文件。 + +应用启动器可以让你快速访问或打开一个应用,而无需在应用菜单图标上徘徊。 + +在默认情况下,我发现 Pop!_OS 的应用启动器超级方便。但是,并不是每个 Linux 发行版都提供开箱即用的应用启动器。 + +幸运的是,有一个你可以在大多数流行的发行版中添加应用启动器的方案。 + +### Ulauncher:开源应用启动器 + +![][1] + +Ulauncher 是一个使用 Python 还有 GTK+ 构建的快速应用启动器。 + +它提供了相当数量的自定义和控制选项来进行调整。总的来说,你可以调整它的行为和体验以适应你的喜好。 + +让我来说一下你可以期待它的一些功能。 + +### Ulauncher 功能 + +Ulauncher 中的选项非常非常易于访问且易于定制。一些关键的亮点包括: + + * 模糊搜索算法可以让你即使拼错了,也能找到应用 + * 可以记住你在同一会话中最后搜索的应用 + * 显示经常使用的应用(可选) + * 自定义颜色主题 + * 预设颜色主题,包括一个黑暗主题 + * 召唤启动器的快捷方式可以轻松定制 + * 浏览文件和目录 + * 支持扩展,以获得额外的功能(表情符号、天气、速度测试、笔记、密码管理器等) + * 浏览谷歌、维基百科和 Stack Overflow 等网站的快捷方式 + +它几乎提供了你在一个应用启动器中所期望的所有有用的能力,甚至更好。 + +### 如何在 Linux 中使用 Ulauncher? + +默认情况下,首次从应用菜单中打开应用启动器后,你需要按 `Ctrl + Space` 打开应用启动器。 + +输入以搜索一个应用。如果你正在寻找一个文件或目录,输入以 `~` 或者 `/` 开始。 + +![][2] + +有一些默认的快捷键,如 `g XYZ`,其中 “XYZ” 是你想在谷歌中搜索的搜索词。 + +![][3] + +同样,你可以通过 `wiki` 和 `so` 快捷键,直接在维基百科或 Stack Overflow 搜索。 + +在没有任何扩展的情况下,你也可以直接计算内容,并将结果直接复制到剪贴板。 + +![][4] + +这在快速计算时应该很方便,不需要单独启动计算器应用。 + +你可以前往它的 [扩展页面][5],浏览有用的扩展,以及指导你如何使用它的截图。 + +要改变它的工作方式,启用显示经常使用的应用,并调整主题,请点击启动器右侧的齿轮图标。 + +![][6] + +你可以把它设置为自动启动。但是,如果它在你的支持 Systemd 的发行版上不工作,你可以参考它的 GitHub 页面,把它添加到服务管理器中。 + +这些选项是非常直观,且易于定制,如下图所示。 + +![][7] + +### 在 Linux 中安装 Ulauncher + +Ulauncher 为基于 Debian 或 Ubuntu 的发行版提供了一个 deb 包。如果你是 Linux 新手,你可以了解一下 [如何安装 Deb 文件][8] 。 + +在这两种情况下,你也可以添加它的 PPA,并通过终端按照下面的命令来安装它: + +``` +sudo add-apt-repository ppa:agornostal/ulauncher +sudo apt update +sudo apt install ulauncher +``` + +你也可以在 [AUR][9] 中找到它,用于 Arch 和 Fedora 的默认仓库。 + +对于更多信息,你可以前往其官方网站或 [GitHub 页面][10]。 + +- [Ulauncher][11] + +Ulauncher 应该是任何 Linux 发行版中一个令人印象深刻的补充。特别是,如果你想要一个像 Pop!_OS 提供的快速启动器的功能,这是一个值得考虑的奇妙选择。 + +你试过 Ulauncher了吗?欢迎你就如何帮助你快速完成工作分享你的想法。 + +-------------------------------------------------------------------------------- + +via: https://itsfoss.com/ulauncher/ + +作者:[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://i2.wp.com/itsfoss.com/wp-content/uploads/2021/08/ulauncher.png?resize=800%2C512&ssl=1 +[2]: https://i0.wp.com/itsfoss.com/wp-content/uploads/2021/08/ulauncher-directory.png?resize=800%2C503&ssl=1 +[3]: https://i2.wp.com/itsfoss.com/wp-content/uploads/2021/08/ulauncher-google.png?resize=800%2C449&ssl=1 +[4]: https://i1.wp.com/itsfoss.com/wp-content/uploads/2021/08/ulauncher-calculator.png?resize=800%2C429&ssl=1 +[5]: https://ext.ulauncher.io +[6]: https://i1.wp.com/itsfoss.com/wp-content/uploads/2021/08/ulauncher-gear-icon.png?resize=800%2C338&ssl=1 +[7]: https://i2.wp.com/itsfoss.com/wp-content/uploads/2021/08/ulauncher-settings.png?resize=800%2C492&ssl=1 +[8]: https://itsfoss.com/install-deb-files-ubuntu/ +[9]: https://itsfoss.com/aur-arch-linux/ +[10]: https://github.com/Ulauncher/Ulauncher/ +[11]: https://ulauncher.io diff --git a/published/202109/20210826 Elementary OS 6 Odin Review - Late Arrival but a Solid One.md b/published/202109/20210826 Elementary OS 6 Odin Review - Late Arrival but a Solid One.md new file mode 100644 index 0000000000..906a2faf90 --- /dev/null +++ b/published/202109/20210826 Elementary OS 6 Odin Review - Late Arrival but a Solid One.md @@ -0,0 +1,82 @@ +[#]: subject: "Elementary OS 6 Odin Review – Late Arrival but a Solid One" +[#]: via: "https://www.debugpoint.com/2021/08/elementary-os-6-odin-review/" +[#]: author: "Arindam https://www.debugpoint.com/author/admin1/" +[#]: collector: "lujun9972" +[#]: translator: "imgradeone" +[#]: reviewer: "wxy" +[#]: publisher: "wxy" +[#]: url: "https://linux.cn/article-13739-1.html" + +elementary OS 6 Odin 评测:迟到的新版本,但也实至名归 +====== + +> 这篇 elementary OS 6 的评测将为你呈现该系统在旧款测试设备上的表现。 + +![](https://img.linux.net.cn/data/attachment/album/202109/01/095116zk73wcc4g5clnvq8.jpg) + +elementary OS 的粉丝们焦急等待 elementary OS 6 Odin 发布已经将近两年了。如此焦急的原因,主要在于早期版本 elementary OS 5.1 的内核和软件包在 2021 年来说过于陈旧。而且,这一旧版本基于 Ubuntu 18.04 LTS 构建。因此,用户都急切地等待着基于 Ubuntu 20.04 LTS 的全新版本 —— 最重要的是,Ubutnu 20.04 LTS 已经发布一年,接下来也将有下一个 LTS 版本发布。 + +你应该也明白的,过长的等待时间,很可能导致用户跳槽到其他发行版。 + +但即便如此,新版本终于还是 [在 8 月发布了][1],它在用户和粉丝群体很受欢迎。 + +于是,我在一周前为一台旧设备(我知道新设备的体验会更好)安装了 elementary OS 6 Odin,下面就是测评。 + +![elementary OS 6 Odin 的桌面][2] + +### elementary OS 6 Odin 测评 + +测试设备: + + * CPU – Intel Core i3,4 GB 运行内存 + * 硬盘 – SSD 固态硬盘 + * 显卡 – Nvidia GeForce(340) + +#### 安装 + +在这一版本中,elementary 团队针对他们自制的 elementary OS 安装器做了易用性优化。新安装器减少了安装前的准备步骤,虽然它还是需要依赖 GParted 进行分区操作(当然 GParted 本身是一款不错的工具)。 + +在前述测试设备中,安装过程大约花费了 10 分钟,没有任何报错。安装完之后,GRUB 也正常更新,没有任何意外。这是一个安装在老式 BIOS 上多引导系统。 + +#### 初见印象 + +如果你刚听说 elementary OS 和 Pantheon 桌面,或者从其他传统的菜单型桌面环境迁移过来,你可能需要一两天时间来适应这款桌面。当然,如果你已经是 elementary OS 的老用户的话,那么你将获得一致的体验,外加性能和外观的优化。 + +你应该可以察觉到一些明显可见的 [elementary OS 6 的新特性][3],像是强调色、原生暗黑模式,以及一组不错的新壁纸。 + +#### 稳定性与性能 + +我已经使用 elementary OS 6 Odin 超过一周的时间。在日常使用后,我只能说,它很稳定,没有突然的崩溃和意外。其他(通过 `apt` 单独安装的)额外软件也运作正常,性能也没有降低。 + +在近乎闲置的情况下,CPU 使用率处在 5%-10% 之间,内存占用约为 900 MB。CPU / 内存的消耗主要分配在 Gala(Pantheon 的窗口管理器)、Wingpanel(顶栏)和应用中心。 + +![elementary OS 6 的系统性能][5] + +考虑到系统的视觉效果,我认为这些占用数据也十分合理。不过,当你打开更多软件,例如 LibreOffice、Chrome、Kdenlive 之后,消耗的资源肯定会更多。 + +#### 应用程序与应用中心 + +elementary OS 的应用程序列表经过精选,几乎所有类型的软件都可以从应用中心获取,包括 Flatpak 应用。不过,elementary OS 默认并没有预装一些重要的应用程序,像是 Firefox、LibreOffice、Torrent 客户端、硬盘分区工具、照片编辑器之类 —— 这些重要的程序需要在安装系统后再自行安装。我认为预装软件这一块有很大的改进空间。 + +### 结束语 + +在这一周的测试中,我也多次遇到了一个 bug,Wi-Fi 有时会突然断开,不过这完全是上游 Ubuntu 20.04 的问题 —— 多年以来,它一直有奇怪的 Wi-Fi 问题。抛开这个问题,elementary OS 确实是一款稳定、优秀的 Linux 发行版。如果 elementary OS 有滚动更新的版本,也许会更好。因此,这是一款值得推荐的发行版,尤其适合那些从 macOS 迁移过来的人。 + +-------------------------------------------------------------------------------- + +via: https://www.debugpoint.com/2021/08/elementary-os-6-odin-review/ + +作者:[Arindam][a] +选题:[lujun9972][b] +译者:[imgradeone](https://github.com/imgradeone) +校对:[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://blog.elementary.io/elementary-os-6-odin-released/ +[2]: https://www.debugpoint.com/blog/wp-content/uploads/2021/08/elementary-OS-6-ODIN-Desktop-1024x576.jpeg +[3]: https://www.debugpoint.com/2021/08/elementary-os-6/ +[4]: https://www.debugpoint.com/2020/09/elementary-os-6-odin-new-features-release-date/ +[5]: https://www.debugpoint.com/blog/wp-content/uploads/2021/08/System-performance-of-elementary-OS-6.jpeg diff --git a/published/202109/20210827 How to Easily Install Debian Linux.md b/published/202109/20210827 How to Easily Install Debian Linux.md new file mode 100644 index 0000000000..e72e6b8f6e --- /dev/null +++ b/published/202109/20210827 How to Easily Install Debian Linux.md @@ -0,0 +1,250 @@ +[#]: subject: "How to Easily Install Debian Linux" +[#]: via: "https://itsfoss.com/install-debian-easily/" +[#]: author: "Abhishek Prakash https://itsfoss.com/author/abhishek/" +[#]: collector: "lujun9972" +[#]: translator: "guevaraya" +[#]: reviewer: "wxy" +[#]: publisher: "wxy" +[#]: url: "https://linux.cn/article-13789-1.html" + +如何轻松安装 Debian Linux 系统 +====== + +![](https://img.linux.net.cn/data/attachment/album/202109/16/123647x9uz7zjjqrq0qwkk.jpg) + +安装 Debian 的轻松程度依赖于选择什么镜像。 + +如果你使用 Debain 官网的默认 ISO 镜像,安装 Debian 就比较费劲。你会卡在这种界面,让你从外部可移动介质上安装网络驱动。 + +![对于新用户来说,从默认的 ISO 中安装 Debian 是有问题的][1] + +当然你可以花时间去排除这个故障,但这让事情变得没有必要的复杂。 + +不用担心,让我来展示如何轻松地简单安装 Debian。 + +### 轻松安装 Debian 桌面系统的方法 + +在你查看这些步骤之前,请确认以下准备工作: + + * 一个至少 4GB 大小的 USB 盘。 + * 一个连接了互联网的系统(可以是要安装 Debian 的同一个机器)。 + * 一个要安装的 Debian 的机器。它将会清理掉系统上所有数据,因此请复制重要数据到其他外部磁盘 + +你需要为 Debian 准备什么样配置的机器?这取决于你想用什么类型的 [桌面环境][2]。例如,GNOME 桌面系统可以在 4GB 内存上运行,但在 8GB 内存上更流畅一些。如果你只有 4GB 或更少的内存,还是建议尝试 KDE、Cinnamon 或 Xfce 桌面系统。 + +Debian 支持 [32 位和 64 位的指令架构][3]。你需要根据你的 CPU 指令架构选择对应的 Debian ISO 镜像。 + +你的系统应该至少要有 25GB 可用的硬盘空间。越多越好。 + +> **警告!** +> +> 这个方法会移除磁盘上所有其他操作系统及其数据。 +> +> 你可以保存你后面还需要用的个人信息、文档、照片等到外部 USB 盘或云存储中。 + +在这个教程中,我将展示安装带有 GNOME 桌面环境的 Debian 11 Bullseye 的步骤。即使你选择其他的桌面环境,步骤也应该是一样的。 + +这个教程是在 GPT 分区的 UEFI 系统上测试的。如果你的系统是 [MBR 而不是 GPT][4],或是 [传统的 BIOS 而不是 UEFI][5],那么创建临场Live USB 盘的步骤有一点不同。 + +#### 步骤 1:获取正确的 Debian ISO 镜像 + +在安装 Debian 过程中,选择正确的 ISO 镜像就已经成功一半了。令人惊讶的是,对于一个新的 Debian 用户来说,要浏览 Debian 的网站并找到最轻松好用的 ISO 真的很困难。 + +如果你点击 Debian 官网的下载按钮,它会下载一个最小化的网络安装文件,这对普通用户来说是非常复杂的。请 **不要** 使用这个。 + +反而,你应该用临场Live ISO。但这里要注意,有一些单独的含有非自由软件(以包括网络硬件的驱动程序)的版本。 + +你应该下载这个非自由版的临场 ISO 镜像。不过另一个问题是,你不会在网站的显著位置注意到它,而且有各种架构的 BT 种子或直接下载的 URL。 + +让我把这些链接放在这里: + +- [32 位和 64 位的主仓地址][7] +- [Debian 11 官方下载][8] +- [Debian 11 种子地址][9] + +你会看到几个文件,文件名中提到了桌面环境。选择一种你要的桌面环境。直接下载的话,直接点击 .iso 结尾的链接即可。 + +![下载非自由版的临场 Debian ISO][10] + +一旦你有了对应的 ISO 下载包,剩下就是和其他 Linux 发行版一样的标准安装流程了。 + +#### 步骤 2: 创建一个 Debian 的临场 USB 盘 + +将 USB 盘插入你的系统。在用之前最好格式化一下,反正它最终也会被格式化的。 + +你可以根据你的选择使用任何临场 USB 创建工具。如果你使用 Windows,可以使用 Rufus。我们在这里使用 Etcher,因为这个工具在 Windows 和 Linux 都可以用。 + +从它的官网下载 Etcher。 + +- [下载 Etcher][11] + +我专门写过一篇 [在 Linux 下使用 Etcher 的教程][12],因此这里我就不深入介绍了。只要运行下载的可执行程序,浏览找到 Debian 的 ISO 镜像,确认选择正确的 USB 盘,然后点击 “Flash” 按钮即可。 + +![用 Etcher 创建 Debian 的临场 USB 盘][13] + +不一会就创建好临场 USB 盘了。创建好之后,就可以开机引导了。 + +#### 步骤 3:从临场 USB 盘引导启动 + +重启你要安装 Debian 的机器。当显示制造商标识的时候,按下 `F2`、`F10` 或 `F12` 等键进入开机引导设置界面。你也可以从 Windows [进入到 UEFI 固件设置界面][14]。 + +有些机器如果启用了安全启动secure boot功能,就不允许从临场 USB 盘引导。如果是这种情况,请 [从 BIOS 设置里禁用安全启动][15] + +不同的的制造商在界面上会有一些差异。 + +![][16] + +你在 BIOS 里做了修改之后,按下 `F10` 保存并退出。你的系统将会重新启动。 + +再一次,当看到制造商的标识后按下 `F2`、`F10` 或 `F12` 查看引导配置。你应该可以看到从 USB 引导的选项,然后选中它。 + +![][17] + +一会儿就会看到如下图的显示界面,选择第一个选项。 + +![Debian 启动界面][18] + +#### 步骤 4: 开始安装 Debian + +当你进入临场 Debian 会话,如果你使用 GNONE 桌面,它呈现一个欢迎界面,可以在此选择你的键盘和语言。当你看到这些界面时,只需要点击下一步。 + +![Debian 临场欢迎界面][19] + +欢迎界面之后,按下 `Windows` / `Super` 键进入活动区。你应该可以看到 Debian 的安装按钮。 + +![开始安装 Debian][20] + +它会打开一个友好的 [Calamares 图形安装器][21]。从这里开始事情就比较简单了, + +![Debian 11 Calamares 图形安装器][22] + +它会让你选择你的地理位置和时区。 + +![选择你的地理位置和时区][23] + +下一个界面,会让你选择键盘类型。这儿请 **注意**。你的键盘会根据你所选的位置自动选择。例如,我的位置是印度,它会自动默认选择印度键盘和印地语。我需要将其改为印度英语。 + +![选择键盘类型][24] + +下一个界面是关于磁盘分区和要安装 Debian 的地方。在本文中,把 Debian 作为你电脑上唯一的操作系统来安装。 + +最简单的方法是直接选择 “擦除磁盘Erase Disk”。除了必须的 ESP 分区和交换分区外,Debian 会把其他所有东西都放在根挂载点(`/`)上。实际上,下面显示了你所选的安装方式后的磁盘布局。 + +![磁盘分区][25] + +如果你想把事情掌握在自己手中,你也可以选择手动分区,选择分配给 `/`、`/home`、`/boot` 或交换分区的大小。只有在你知道自己在做什么时,才可以这样做。 + +下一界面,你需要提供用户名和密码。但它不会设置 root 的密码,并将其保持为空。 + +![设置用户名和密码][26] + +这也意味着你可以用新创建的用户使用 `sudo` 。在“复杂的 Debian 安装”中,你也可以设置 root 密码,但这样你就必须手动将普通用户添加到 `sudoer` 列表。看看,这种安装过程是不是对新手来说很容易? + +在继续实际安装之前,它会呈现你所做的选择的汇总信息。如果没有问题,就可以点击“安装Install”按钮。 + +![安装配置的汇总信息][27] + +现在只需要等待安装完成。 + +![安装 Debian][28] + +几分钟后就会完成安装。当安装完成,它会提示重启。 + +![完成 Debian 安装][29] + +重启系统后如果一切顺利,你应该可以看到 Debian 的 GRUB 界面。 + +![Debian 启动画面][30] + +### 疑难解答(如果系统没有启动到 Debian) + +我遇到情况是,我的 Dell 系统不能识别任何要引导的操作系统。这很奇怪,我看见 Debian 经创建了一个 ESP 分区。 + +如果你也是同样的情况,进去 BIOS 配置里。检查启动顺序Boot Sequence,如果你看不到任何东西,就点击“新增引导选项Add Boot Option”。 + +![增加新的启动选项][31] + +它会提供一个增加 EFI 文件的选项。 + +![选择 EFI 文件][32] + +由于在安装过程中 Debian 创建了 ESP 分区,因此一个包含必要文件的 `EFI` 目录已经创建好了。 + +![选择 EFI 目录][33] + +它会显示一个 `Debian` 目录及其他目录。选择 `Debian` 目录。 + +![选择 Debian 目录][34] + +在 `Debian` 目录,你将看到 `grubx64.efi`、`shimx64.efi` 等文件。请选择 `shimx64.efi`。 + +![选择 shimx64.efi][35] + +你需要给这个文件一个合适的名字。最后的界面应该如下: + +![增加 efi 文件的新启动选项][36] + +现在你应该有了这个启动选项。因为我命名为 `Debian`,它显示了两个 `Debian` 引导选项(我猜其中一个是从 efi 文件来的)。按下 `F10` 保存退出 BIOS 的配置。 + +![新增的启动选项][37] + +现在启动你的系统,你可以看到带有 Debian 启动选项的 GRUB 界面了。你现在可以体验 Debian 了。 + +![][30] + +### 你能安装 Debian 吗? + +我写这篇文章的目的是让事情变得轻松点。并不是说你不能从默认的网络安装程序 ISO 来安装,只是它需要花更多的精力。 + +这个教程对你安装 Debian 有帮助吗?你如果还是有问题,请在下面留言给我,我会尽力提供帮助。 + +-------------------------------------------------------------------------------- + +via: https://itsfoss.com/install-debian-easily/ + +作者:[Abhishek Prakash][a] +选题:[lujun9972][b] +译者:[巴龙](https://github.com/guevaraya) +校对:[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://i0.wp.com/itsfoss.com/wp-content/uploads/2021/08/Debian-firmware.png?resize=800%2C600&ssl=1 +[2]: https://itsfoss.com/what-is-desktop-environment/ +[3]: https://itsfoss.com/32-bit-64-bit-ubuntu/ +[4]: https://itsfoss.com/check-mbr-or-gpt/ +[5]: https://itsfoss.com/check-uefi-or-bios/ +[6]: https://www.debian.org/ +[7]: https://cdimage.debian.org/images/unofficial/non-free/images-including-firmware/11.0.0-live+nonfree/ +[8]: https://cdimage.debian.org/images/unofficial/non-free/images-including-firmware/11.0.0-live+nonfree/amd64/iso-hybrid/ +[9]: https://cdimage.debian.org/images/unofficial/non-free/images-including-firmware/11.0.0-live+nonfree/amd64/bt-hybrid/ +[10]: https://i0.wp.com/itsfoss.com/wp-content/uploads/2021/08/downloading-Debian-live-non-free-iso.png?resize=800%2C490&ssl=1 +[11]: https://www.balena.io/etcher/ +[12]: https://itsfoss.com/install-etcher-linux/ +[13]: https://i1.wp.com/itsfoss.com/wp-content/uploads/2021/08/creating-live-debian-usb-with-etcher-800x518.png?resize=800%2C518&ssl=1 +[14]: https://itsfoss.com/access-uefi-settings-windows-10/ +[15]: https://itsfoss.com/disable-secure-boot-windows/ +[16]: https://i0.wp.com/itsfoss.com/wp-content/uploads/2014/05/Disable_Secure_Boot_Windows8.jpg?resize=700%2C525&ssl=1 +[17]: https://i1.wp.com/itsfoss.com/wp-content/uploads/2021/04/boot-from-windows-disk-ventoy.jpg?resize=800%2C611&ssl=1 +[18]: https://i1.wp.com/itsfoss.com/wp-content/uploads/2021/08/debian-live-boot-screen.png?resize=617%2C432&ssl=1 +[19]: https://i0.wp.com/itsfoss.com/wp-content/uploads/2021/08/debian-live-welcome-screen.png?resize=800%2C450&ssl=1 +[20]: https://itsfoss.com/wp-content/uploads/2021/08/start-Debian-installation-800x473.webp +[21]: https://calamares.io/ +[22]: https://i1.wp.com/itsfoss.com/wp-content/uploads/2021/08/Installing-Debian-1.png?resize=800%2C441&ssl=1 +[23]: https://itsfoss.com/wp-content/uploads/2021/08/Installing-Debian-2-800x441.webp +[24]: https://itsfoss.com/wp-content/uploads/2021/08/Installing-Debian-4-800x441.webp +[25]: https://i0.wp.com/itsfoss.com/wp-content/uploads/2021/08/Installing-Debian-5.png?resize=800%2C441&ssl=1 +[26]: https://i0.wp.com/itsfoss.com/wp-content/uploads/2021/08/Installing-Debian-6.png?resize=800%2C441&ssl=1 +[27]: https://itsfoss.com/wp-content/uploads/2021/08/Installing-Debian-7-800x500.webp +[28]: https://i2.wp.com/itsfoss.com/wp-content/uploads/2021/08/Installing-Debian-8.png?resize=800%2C500&ssl=1 +[29]: https://i0.wp.com/itsfoss.com/wp-content/uploads/2021/08/Installing-Debian-9.png?resize=800%2C500&ssl=1 +[30]: https://itsfoss.com/wp-content/uploads/2021/08/debian-boot-screen.webp +[31]: https://itsfoss.com/wp-content/uploads/2021/08/add-new-boot-option.webp +[32]: https://itsfoss.com/wp-content/uploads/2021/08/add-efi-file-for-boot-option.webp +[33]: https://itsfoss.com/wp-content/uploads/2021/08/select-efi-file-boot-option.webp +[34]: https://itsfoss.com/wp-content/uploads/2021/08/select-debian-folder-for-uefi.webp +[35]: https://itsfoss.com/wp-content/uploads/2021/08/select-shim-boot.webp +[36]: https://itsfoss.com/wp-content/uploads/2021/08/new-boot-option.webp +[37]: https://itsfoss.com/wp-content/uploads/2021/08/new-boot-option-added.webp diff --git a/published/202109/20210827 Linux kernel modules we can-t live without.md b/published/202109/20210827 Linux kernel modules we can-t live without.md new file mode 100644 index 0000000000..ddcdd82d5c --- /dev/null +++ b/published/202109/20210827 Linux kernel modules we can-t live without.md @@ -0,0 +1,135 @@ +[#]: subject: "Linux kernel modules we can't live without" +[#]: via: "https://opensource.com/article/21/8/linux-kernel-module" +[#]: author: "Jen Wike Huger https://opensource.com/users/jen-wike" +[#]: collector: "lujun9972" +[#]: translator: "geekpi" +[#]: reviewer: "wxy" +[#]: publisher: "wxy" +[#]: url: "https://linux.cn/article-13747-1.html" + +我们离不开的 Linux 内核模块 +====== + +> 开源爱好者们对他们所喜爱的 Linux 内核模块进行了评价。 + +![](https://img.linux.net.cn/data/attachment/album/202109/03/065649hik5hjiiy3htj589.jpg) + +Linux 内核今年就要满 30 岁了! 如果你像我们一样对此特别重视,那么让我们本周用几个特别的文章来庆祝 Linux。 + +今天,我们先来看看来自社区对“**你不能没有哪个 Linux 内核模块?为什么?**”的回答,让我们听听这 10 位爱好者是怎么说的。 + +### #1 + +我猜一些内核开发者听到我的回答后会尖叫着跑开。不过,我还是在这里列出了两个最具争议性的模块: + + * 第一个是 NVIDIA,因为我的工作笔记本和个人台式机上都有 NVIDIA 显卡。 + * 另一个可能产生的仇恨较少。VMware 的 VMNET 和 VMMON 模块,以便能够运行 VMware Workstation。 + +— [Peter Czanik][2] + +### #2 + +我最喜欢的是 [zram][3] 模块。它在内存中创建了一个压缩块设备,然后它可以作为交换分区使用。在内存有限的情况下(例如,在虚拟机上),还有如果你担心频繁的 I/O 操作会磨损你的 SSD 或者甚至更糟糕的基于闪存的存储,那么使用基于 zram 的交换分区是非常理想的。 + +— [Stephan Avenwedde][4] + +### #3 + +最有用的内核模块无疑是 snd-hda-intel,因为它支持大多数集成声卡。我可以一边听音乐,一边在 Linux 桌面上编码一个音频编曲器。 + +— [Joël Krähemann][5] + +### #4 + +如果没有我用 Broadcom 文件生成的 kmod-wl,我的笔记本就没有价值了。我有时会收到关于内核污染的信息,但没有无线网络的笔记本电脑有什么用呢? + +— [Gregory Pittman][6] + +### #5 + +我不能没有蓝牙。没有它,我的鼠标、键盘、扬声器和耳机除了用来挡住门板还有啥用? + +— [Gary Smith][7] + +### #6 + +我要冒昧地说 _全_ 都是。 说真的,我们已经到了随机拿一块硬件,插入它,它就可以工作的地步。 + + * USB 串行适配器能正常工作 + * 显卡可以使用(尽管可能不是最好的) + * 网卡正常工作 + * 声卡正常工作 + +所有这些模块整体带来大量可以工作的驱动程序,令人印象深刻。我记得在过去那些糟糕的日子里,我们曾经大喊 xrandr 魔法字符串才能来使投影仪工作。而现在,是的,当设备基本不能正常工作时,才真的罕见。 + +如果我不得不把它归结为一个,那就是 raid6。 + +— [John 'Warthog9' Hawley][8] + +### #7 + +对于这个问题,我想回到 20 世纪 90 年代末。我是一家小公司的 Unix 系统管理员(兼任 IS 经理)。我们的磁带备份系统死了,由于“小公司”预算有限,我们没有急于更换或现场维修。所以我们必须得把它送去维修。 + +在那两个星期里,我们没有办法进行磁带备份。没有一个系统管理员愿意处于这种境地。 + +但后来我想起了读过的 [如何使用软盘磁带机][9],我们刚好有一台刚换下来的塔式电脑,它有一个软盘磁带机。 + +于是我用 Linux 重新安装了它,设置了 ftape 内核驱动模块,进行了一些备份/恢复测试,然后将我们最重要的备份运行到 QIC 磁带上。在这两个星期里,我们依靠 ftape 备份重要数据。 + +所以,对于那些让软盘磁带机在 1990 年代的 Linux 上工作的无名英雄,你真是太厉害了! + +— [Jim Hall][10] + +### #8 + +嗯,这很简单。是 kvm 内核模块。就个人而言,我无法想象在没有虚拟机的情况下完成日常工作。我愿意相信我们大多数人都是这样。kvm 模块在使 Linux 成为云战略的核心方面也发挥了很大作用。 + +— [Gaurav Kamathe][11] + +### #9 + +对我来说,是 dm-crypt,它是用于 LUKS 的。参见: + + * + * + +知道别人无法看到你的磁盘上的内容是非常棒的,例如,如果你的笔记本丢失或被盗时。 + +— [Maximilian Kolb][12] + +### #10 + +对于密码学基础,很难超越 crypto 模块和它的 C API,它是如此简洁明了。 + +在日常生活中,还有什么比蓝牙提供的即插即用更有价值的吗? + +— [Marty Kalin][13] + +在评论中与我们分享。你的生活中不能没有什么 Linux 内核模块? + +-------------------------------------------------------------------------------- + +via: https://opensource.com/article/21/8/linux-kernel-module + +作者:[Jen Wike Huger][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/jen-wike +[b]: https://github.com/lujun9972 +[1]: https://opensource.com/sites/default/files/styles/image-full-size/public/lead-images/linux_keyboard_desktop.png?itok=I2nGw78_ (Linux keys on the keyboard for a desktop computer) +[2]: https://opensource.com/users/czanik +[3]: https://en.wikipedia.org/wiki/Zram +[4]: https://opensource.com/users/hansic99 +[5]: https://opensource.com/users/joel2001k +[6]: https://opensource.com/users/greg-p +[7]: https://opensource.com/users/greptile +[8]: https://opensource.com/users/warthog9 +[9]: https://tldp.org/HOWTO/Ftape-HOWTO.html +[10]: https://opensource.com/users/jim-hall +[11]: https://opensource.com/users/gkamathe +[12]: https://opensource.com/users/kolb +[13]: https://opensource.com/users/mkalindepauledu diff --git a/published/202109/20210829 Position text on your screen in Linux with ncurses.md b/published/202109/20210829 Position text on your screen in Linux with ncurses.md new file mode 100644 index 0000000000..7e1d61b25f --- /dev/null +++ b/published/202109/20210829 Position text on your screen in Linux with ncurses.md @@ -0,0 +1,130 @@ +[#]: sub·ject: "Position text on your screen in Linux with ncurses" +[#]: via: "https://opensource.com/article/21/8/ncurses-linux" +[#]: author: "Jim Hall https://opensource.com/users/jim-hall" +[#]: collector: "lujun9972" +[#]: translator: "perfiffer" +[#]: reviewer: "wxy" +[#]: publisher: "wxy" +[#]: url: "https://linux.cn/article-13756-1.html" + +使用 ncurses 在你的 Linux 屏幕上定位文本 +====== + +> 使用 ncurses 在 Linux 屏幕上的特定位置放置文本,可以带来更友好的用户界面体验。 + +![](https://img.linux.net.cn/data/attachment/album/202109/06/085908qrdrrv5dru6pcucr.jpg) + +大多数的 Linux 实用程序仅仅只在屏幕的底部滚动文本。如果你想在屏幕中放置你的文本,例如一个游戏或者一个数据展示,你可以试试 ncurses。 + +curses 是一个旧的 Unix 库,它可以在文本终端界面控制光标。curses 的名称就来自于术语 “光标控制cursor control”。多年以后,其他人编写了新的 curses 版本用来添加新的功能,新版本被叫做 “new curses” 或者 “ncurses”。你可以在每个流行的 Linux 发行版中找到 ncurses。尽管默认情况下可能未安装开发库、头文件和文档。例如,在 Fedora 上,你需要使用以下命令安装 `ncurses-devel` 包: + +``` +$ sudo dnf install ncurses-devel +``` + +### 在程序中使用 ncurses + +要在屏幕上直接寻址,你首先需要初始化 `ncurses` 库。大部分程序会通过以下三行来做到这一点: + + * `initscr()`:初始化窗口对象和 ncurses 代码,返回代表整个屏幕的窗口对象 + * `cbreak()`:禁用缓冲并使键入的输入立即可用 + * `noecho()`:关闭回显,因此用户输入不会显示在屏幕上 + +这些函数定义在 `curses.h` 头文件中,你需要在你的程序中通过以下方式将其包含进来: + +``` +#include +``` + +初始化终端后,你可以自由使用任何 ncurses 函数,我们将在示例程序中探讨其中的一些函数。 + +当你使用完 ncurses 并想返回到常规终端模式下时,使用 `endwin()` 重置一切。此命令可以重置任何屏幕颜色,将光标移动到屏幕的左下角,并使光标可见。通常在退出程序之前执行此操作。 + +### 在屏幕上寻址 + +关于 ncurses 首先需要知道的是屏幕的坐标分为行和列,左上角的是 `0,0` 点。ncurses 定义了两个全局变量来帮助你识别屏幕:`LINES` 是屏幕的行数,`COLS` 是屏幕的列数。屏幕右下角的位置是 `LINES-1,COLS-1`。 + +例如,如果你想要移动光标到第 10 行和第 30 列,你可以使用 `move()` 函数,移动到此坐标: + +``` +move(10, 30); +``` + +之后显示的任何文本都将从屏幕的该位置开始。要显示单个字符,请对单个字符使用 `addch(c)` 函数。要显示字符串,将对字符串使用 `addstr(s)` 函数。对于类似于 `printf` 的格式化输出,请使用带有常用选项的 `printw(fmt, ...)`。 + +移动到屏幕指定位置和显示文本是一件很常见的事情,ncurses 提供了同时执行这两项操作的快捷方式。`mvaddch(row, col, c)` 函数将在屏幕第 `row` 行,第 `col` 列的位置显示一个字符。而 `mvaddstr(row, col, s)` 函数将在屏幕第 `row` 行,第 `col` 列的位置显示一个字符串。举个更直接的例子,在程序中使用 `mvaddstr(10, 30, "Welcome to ncurses");` 函数将从屏幕的第 `10` 行和第 `30` 列开始显示文本 `Welcome to ncurses`。使用 `mvaddch(0, 0, '+')` 函数将在屏幕的左上角第 `0` 行和第 `0` 列处显示一个加号(`+`)。 + +在终端屏幕上绘制文本会对某些系统产生性能影响,尤其是在较旧的硬件终端上。因此 ncurses 允许你“堆叠”一堆文本以显示在屏幕上,然后使用 `refresh()` 函数使所有这些更改对用户可见。 + +让我们来看一个将以上所有内容整合在一起的简单示例: + +``` +#include + +int +main() +{ +  initscr(); +  cbreak(); +  noecho(); + +  mvaddch(0, 0, '+'); +  mvaddch(LINES - 1, 0, '-'); +  mvaddstr(10, 30, "press any key to quit"); +  refresh(); + +  getch(); + +  endwin(); +} +``` + +程序的开始初始化了一个终端窗口,然后在屏幕的左上角打印了一个加号,在左下角打印了一个减号,在第 `10` 行和第 `30` 列打印了 `press any key to quit` 文本。程序通过使用 `getch()` 函数接收了键盘输入的单个字符,接着,使用 `endwin()` 函数在程序完全退出前重置了终端。 + +`getch()` 是一个很有用的函数,你可以使用它来做很多事情。我经常使用它在我退出程序前用来暂停。与大多数 ncurses 函数一样,还有一个名为 `mvgetch(row, col)` 的 `getch()` 版本,用于在等待字符输入之前移动到屏幕位置的第 `row` 行,第 `col` 列。 + +### 使用 ncurses 编译 + +如果你尝试以通常的方式编译该示例程序,例如 `gcc pause.c`,你可能会从链接器中获得大量错误列表。那是因为 GNU C 编译器不会自动链接 `ncurses` 库。相反,你需要使用 `-l ncurses` 命令行选项加载它以进行链接。 + +``` +$ gcc -o pause pause.c -lncurses +``` + +运行新程序将打印一条简单的 `press any key to quit`消息,该消息差不多位于屏幕中央: + +![centered message in a program window][2] + +*图 1:程序中居中的 “press any key to quit” 消息。* + +### 使用 ncurses 构建更好的程序 + +探索 `ncurses` 库函数以了解在屏幕上显示文本的其它方法。你可以在 `ncurses` 的手册页中找到所有 `ncurses` 函数的列表。这给出了 ncurses 的一般概述,并提供了不同 `ncurses` 函数的类似表格的列表,并参考了包含完整详细信息的手册页。例如,在 `curs_printw(3X)` 手册页中描述了 `printw`,可以通过以下方式查看: + +``` +$ man 3x curs_printw +``` + +更简单点: + +``` +$ man curs_printw +``` + +使用 ncurses,你可以创建更多有趣的程序。通过在屏幕上的特定位置打印文本,你可以创建在终端中运行的游戏和高级实用程序。 + +-------------------------------------------------------------------------------- + +via: https://opensource.com/article/21/8/ncurses-linux + +作者:[Jim Hall][a] +选题:[lujun9972][b] +译者:[perfiffer](https://github.com/perfiffer) +校对:[wxy](https://github.com/wxy) + +本文由 [LCTT](https://github.com/LCTT/TranslateProject) 原创编译,[Linux中国](https://linux.cn/) 荣誉推出 + +[a]: https://opensource.com/users/jim-hall +[b]: https://github.com/lujun9972 +[1]: https://opensource.com/sites/default/files/styles/image-full-size/public/lead-images/laptop_screen_desk_work_chat_text.png?itok=UXqIDRDD (Person using a laptop) +[2]: https://opensource.com/sites/default/files/press-key_0.png diff --git a/published/202109/20210830 Linux Jargon Buster- What is sudo rm -rf- Why is it Dangerous.md b/published/202109/20210830 Linux Jargon Buster- What is sudo rm -rf- Why is it Dangerous.md new file mode 100644 index 0000000000..be034f13b5 --- /dev/null +++ b/published/202109/20210830 Linux Jargon Buster- What is sudo rm -rf- Why is it Dangerous.md @@ -0,0 +1,143 @@ +[#]: subject: "Linux Jargon Buster: What is sudo rm -rf? Why is it Dangerous?" +[#]: via: "https://itsfoss.com/sudo-rm-rf/" +[#]: author: "Abhishek Prakash https://itsfoss.com/author/abhishek/" +[#]: collector: "lujun9972" +[#]: translator: "wxy" +[#]: reviewer: "wxy" +[#]: publisher: "wxy" +[#]: url: "https://linux.cn/article-13813-1.html" + +Linux 黑话解释:什么是 sudo rm -rf?为什么如此危险? +====== + +![][11] + +当你刚接触 Linux 时,你会经常遇到这样的建议:永远不要运行 `sudo rm -rf /`。在 Linux 世界里,更是围绕着 `sudo rm -rf` 有很多梗。 + +![][1] + +但似乎对于它也有一些混乱的认识。在 [清理 Ubuntu 以腾出空间][2] 的教程中,我建议运行一些涉及 `sudo` 和 `rm -rf` 的命令。一位读者问我,如果 `sudo rm -rf` 是一个不应该运行的危险的 Linux 命令,我为什么要建议这样做。 + +因此,我想到了写一篇 Linux 黑话解释,以消除误解。 + +### sudo rm -rf 在做什么? + +让我们按步骤来学习。 + +`rm` 命令用于 [在 Linux 命令行中删除文件和目录][3]。 + +``` +$ rm agatha +$ +``` + +但是因为有只读的 [文件权限][4],有些文件不会被立即删除。它们必须用选项 `-f` 强制删除。 + +``` +$ rm books +rm: remove write-protected regular file 'books'? y +$ rm -f christie +$ +``` + +另外,`rm` 命令不能被用来直接删除目录(文件夹)。你必须在 `rm` 命令中使用递归选项 `-r`。 + +``` +$ rm new_dir +rm: cannot remove 'new_dir': Is a directory +``` + +因此最终,`rm -rf` 命令意味着递归地、强制删除指定的目录。 + +``` +$ rm -r new_dir +rm: remove write-protected regular file 'new_dir/books'? ^C +$ rm -rf new_dir +$ +``` + +下面是上述所有命令的截图。 + +![解释 rm 命令的例子][5] + +如果你在 `rm -rf` 命令前加入 `sudo`,你就是在删除具有 root 权限的文件。这意味着你可以删除由 [root 用户][6] 拥有的系统文件。 + +### 所以,sudo rm -rf 是一个危险的 Linux 命令? + +嗯,任何删除东西的命令都可能是危险的,如果你不确定你正在删除什么。 + +把 `rm -rf` 命令看作一把刀。刀是一个危险的东西吗?有可能。如果你用刀切蔬菜,那是好事。如果你用刀切手指,那当然是不好的。 + +`rm -rf` 命令也是如此。它本身并不危险。它只是用来删除文件的。但是,如果你在不知情的情况下用它来删除重要文件,那就有问题了。 + +现在来看看 `sudo rm -rf /`。 + +你知道,使用 `sudo`,你是以 root 身份运行一个命令,这允许你对系统进行任何改变。 + +`/` 是根目录的符号。`/var` 表示根目录下的 `var` 目录。`/var/log/apt` 指的是根目录的 `log` 目录下的 `apt` 目录。 + +![Linux 目录层次表示法][7] + +按照 [Linux 目录层次结构][8],Linux 文件系统中的一切都从根目录开始。如果你删除了根目录,你基本上就是删除了系统中的所有文件。 + +这就是为什么建议不要运行 `sudo rm -rf /` 命令,因为你会抹去你的整个 Linux 系统。 + +请注意,在某些情况下,你可能正在运行像 `sudo rm -rf /var/log/apt` 这样的命令,这可能是没问题的。同样,你必须注意你正在删除的东西,就像你必须注意你正在用刀切割的东西一样。 + +### 我在玩火:如果我运行 sudo rm -rf /,看看会发生什么呢? + +大多数 Linux 发行版都提供了一个故障安全保护,防止意外删除根目录。 + +``` +$ sudo rm -rf / +[sudo] password for abhishek: +rm: it is dangerous to operate recursively on '/' +rm: use --no-preserve-root to override this failsafe +``` + +我的意思是,人是会打错字的,如果你不小心打了 `/ var/log/apt`,而不是 `/var/log/apt`(`/` 和 `var` 之间的空格意味着你给出了 `/` 和 `var` 目录来删除),你将会删除根目录。(LCTT 译注:我真干过,键盘敲的飞起,结果多敲了一个空格,然后就丢了半个文件系统 —— 那时候 Linux 还没这种故障安全保护。) + +![使用 sudo rm -rf 时要注意][9] + +别担心。你的 Linux 系统会照顾到这种意外。 + +现在,如果你一心想用 `sudo rm -rf /` 来破坏你的系统呢?你将必须使用它将要求你使用的 `-no-preserve-root` 选项与之配合。 + +不,请不要自己这样做。让我做给你看看。 + +所以,我在一个虚拟机中运行基本的操作系统。我运行 `sudo rm -rf / --no-preserve-root`,你可以在下面的视频中看到灯光熄灭(大约 1 分钟)。 + +![video](https://vimeo.com/594025609) + +### 清楚了么? + +Linux 有一个活跃的社区,大多数人都会帮助新用户。 之所以说是大多数,是是因为有一些的邪恶坏人潜伏着捣乱新用户。他们经常会建议对初学者所面临的最简单的问题运行 `rm -rf /`。我认为这些白痴在这种邪恶行为中得到了某种至上主义的满足。我会立即将他们从我管理的论坛和群组中踢出去。 + +我希望这篇文章能让你更清楚地了解这些情况。你有可能仍然有一些困惑,特别是因为它涉及到根目录、文件权限和其他新用户可能不熟悉的东西。如果是这样的话,请在评论区告诉我你的疑惑,我会尽力去解决。 + +最后,请记住。不要喝酒胡搞Don’t drink and root。在运行你的 Linux 系统时要安全驾驶。 + +-------------------------------------------------------------------------------- + +via: https://itsfoss.com/sudo-rm-rf/ + +作者:[Abhishek Prakash][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://itsfoss.com/author/abhishek/ +[b]: https://github.com/lujun9972 +[1]: https://i2.wp.com/itsfoss.com/wp-content/uploads/2016/04/sudo-rm-rf.gif?resize=400%2C225&ssl=1 +[2]: https://itsfoss.com/free-up-space-ubuntu-linux/ +[3]: https://linuxhandbook.com/remove-files-directories/ +[4]: https://linuxhandbook.com/linux-file-permissions/ +[5]: https://i0.wp.com/itsfoss.com/wp-content/uploads/2021/08/rm-rf-command-example-800x487.png?resize=800%2C487&ssl=1 +[6]: https://itsfoss.com/root-user-ubuntu/ +[7]: https://i2.wp.com/itsfoss.com/wp-content/uploads/2021/08/linux-directory-structure.png?resize=800%2C400&ssl=1 +[8]: https://linuxhandbook.com/linux-directory-structure/ +[9]: https://i1.wp.com/itsfoss.com/wp-content/uploads/2021/08/sudo-rm-rf-example.png?resize=798%2C346&ssl=1 +[10]: https://www.youtube.com/c/itsfoss?sub_confirmation=1 +[11]: https://i0.wp.com/itsfoss.com/wp-content/uploads/2021/08/dont-drink-and-root.jpg?resize=800%2C450&ssl=1 diff --git a/published/202109/20210830 Write a guessing game in ncurses on Linux.md b/published/202109/20210830 Write a guessing game in ncurses on Linux.md new file mode 100644 index 0000000000..581e629460 --- /dev/null +++ b/published/202109/20210830 Write a guessing game in ncurses on Linux.md @@ -0,0 +1,161 @@ +[#]: subject: "Write a guessing game in ncurses on Linux" +[#]: via: "https://opensource.com/article/21/8/guess-number-game-ncurses-linux" +[#]: author: "Jim Hall https://opensource.com/users/jim-hall" +[#]: collector: "lujun9972" +[#]: translator: "perfiffer" +[#]: reviewer: "wxy" +[#]: publisher: "wxy" +[#]: url: "https://linux.cn/article-13762-1.html" + +通过 ncurses 在 Linux 上写一个猜谜游戏 +====== + +> 使用 ncurses 的灵活性和强大功能在 Linux 上创建一个猜数字游戏。 + +![](https://img.linux.net.cn/data/attachment/album/202109/07/224224ecchm0t5jbjc1dzy.jpg) + +在我的 [上一篇文章][2],我简要介绍了使用 ncurses 库通过 C 语言编写文本模式交互式应用程序。使用 ncurses,我们可以控制文本在终端上的显示位置和方式。如果你通过阅读手册页探索 ncurses 库函数,你会发现显示文本有很多不同的方式,包括粗体文本、颜色、闪烁文本、窗口、边框、图形字符和其它功能,这些都可以使你的应用脱颖而出。 + +如果你想探索一个更高级的程序来演示其中一些有趣的功能,有一个简单的“猜数字”游戏,我已更新为使用 ncurses 编写的了。该程序在一个范围内选择一个随机数,然后要求用户进行重复猜测,直到他们猜到这个秘密数字。当用户进行猜测时,程序会告知他们猜测的数字是太低还是太高。 + +请注意,程序限定可能的数字范围是 0 到 7。将值保持在有限的个位数数字范围内,可以更轻松的使用 `getch()` 函数从用户读取单个数字。我还使用了 `getrandom` 内核系统调用来生成随机数,设定数字最大值为 7,以从 0 (二进制 `0000`)到 7 (二进制 `0111`)中选择一个随机数。 + +``` +#include ; +#include ;          /* for strlen */ +#include ;      /* for getrandom */ + +int +random0_7() +{ +   int num; +   getrandom(&num, sizeof(int), GRND_NONBLOCK); +   return (num & 7); /* from 0000 to 0111 */ +} + +int +read_guess() +{ +  int ch; + +  do { +    ch = getch(); +  } while ((ch < '0') || (ch > '7')); + +  return (ch - '0'); /* turn into a number */ +} +``` + +通过使用 ncurses,我们可以增加一些有趣的视觉体验。通过添加函数,我们可以在屏幕顶部显示重要的文本信息,在屏幕底部显示状态消息行: + +``` +void +print_header(const char *text) +{ +  move(0, 0); +  clrtoeol(); + +  attron(A_BOLD); +  mvaddstr(0, (COLS / 2) - (strlen(text) / 2), text); +  attroff(A_BOLD); +  refresh(); +} + +void +print_status(const char *text) +{ +  move(LINES - 1, 0); +  clrtoeol(); +  +  attron(A_REVERSE); +  mvaddstr(LINES - 1, 0, text); +  attroff(A_REVERSE); +  refresh(); +} +``` + +通过这些函数,我们就可以构建猜数字游戏的主要部分。首先,程序为 ncurses 设置终端,然后从 0 到 7 中选择一个随机数。显示数字刻度后,程序启动一个循环,询问用户的猜测。 + +当用户进行猜测时,程序会在屏幕上提供反馈。如果猜测太低,程序会在屏幕上的数字下方打印一个左方括号。如果猜测太高,程序会在屏幕上的数字下方打印一个右方括号。这有助于用户缩小他们的选择范围,直到他们猜出正确的数字。 + +``` +int +main() +{ +  int number, guess; + +  initscr(); +  cbreak(); +  noecho(); + +  number = random0_7(); +  mvprintw(1, COLS - 1, "%d", number); /* debugging */ + +  print_header("Guess the number 0-7"); + +  mvaddstr(9, (COLS / 2) - 7, "0 1 2 3 4 5 6 7"); + +  print_status("Make a guess..."); + +  do { +    guess = read_guess(); + +    move(10, (COLS / 2) - 7 + (guess * 2)); + +    if (guess < number) { +      addch('['); +      print_status("Too low"); +    } + +    else if (guess > number) { +      addch(']'); +      print_status("Too high"); +    } + +    else { +      addch('^'); +    } +  } while (guess != number); + +  print_header("That's right!"); +  print_status("Press any key to quit"); +  getch(); + +  endwin(); + +  return 0; +} +``` + +复制这个程序,自己尝试编译它。不要忘记你需要告诉 GCC 编译器链接到 ncurses 库: + +``` +$ gcc -o guess guess.c -lncurses +``` + +我留下了一个调试行,所以你可以看到屏幕右上角附近的秘密数字: + +![guess number game interface][3] + +*图1:猜数字游戏。注意右上角的秘密数字。* + +### 开始使用 ncurses + +该程序使用了 ncurses 的许多其它函数,你可以从这些函数开始。例如,`print_header` 函数在屏幕顶部居中以粗体文本打印消息,`print_status` 函数在屏幕左下角以反向文本打印消息。使用它来帮助你开始使用 ncurses 编程。 + +-------------------------------------------------------------------------------- + +via: https://opensource.com/article/21/8/guess-number-game-ncurses-linux + +作者:[Jim Hall][a] +选题:[lujun9972][b] +译者:[perfiffer](https://github.com/perfiffer) +校对:[wxy](https://github.com/wxy) + +本文由 [LCTT](https://github.com/LCTT/TranslateProject) 原创编译,[Linux中国](https://linux.cn/) 荣誉推出 + +[a]: https://opensource.com/users/jim-hall +[b]: https://github.com/lujun9972 +[1]: https://opensource.com/sites/default/files/styles/image-full-size/public/lead-images/question-mark_chalkboard.jpg?itok=DaG4tje9 (question mark in chalk) +[2]: https://linux.cn/article-13756-1.html +[3]: https://opensource.com/sites/default/files/guessnumber07.png diff --git a/published/202109/20210831 What is a container image.md b/published/202109/20210831 What is a container image.md new file mode 100644 index 0000000000..7f3729f419 --- /dev/null +++ b/published/202109/20210831 What is a container image.md @@ -0,0 +1,120 @@ +[#]: subject: "What is a container image?" +[#]: via: "https://opensource.com/article/21/8/container-image" +[#]: author: "Nived V https://opensource.com/users/nivedv" +[#]: collector: "lujun9972" +[#]: translator: "geekpi" +[#]: reviewer: "wxy" +[#]: publisher: "wxy" +[#]: url: "https://linux.cn/article-13766-1.html" + +什么是容器镜像? +====== + +> 容器镜像包含一个打包的应用,以及它的依赖关系,还有它在启动时运行的进程信息。 + +![](https://img.linux.net.cn/data/attachment/album/202109/08/152733c9i69xsssa62b6rr.jpg) + +容器是当今 IT 运维的一个关键部分。容器镜像container image包含了一个打包的应用,以及它的依赖关系,还有它在启动时运行的进程信息。 + +你可以通过提供一组特殊格式的指令来创建容器镜像,可以是提交给注册中心Registry,或者是作为 Dockerfile 保存。例如,这个 Dockerfile 为 PHP Web 应用创建了一个容器: + +``` +FROM registry.access.redhat.com/ubi8/ubi:8.1 + +RUN yum --disableplugin=subscription-manager -y module enable php:7.3 \ + && yum --disableplugin=subscription-manager -y install httpd php \ + && yum --disableplugin=subscription-manager clean all + +ADD index.php /var/www/html + +RUN sed -i 's/Listen 80/Listen 8080/' /etc/httpd/conf/httpd.conf \ + && sed -i 's/listen.acl_users = apache,nginx/listen.acl_users =/' /etc/php-fpm.d/www.conf \ + && mkdir /run/php-fpm \ + && chgrp -R 0 /var/log/httpd /var/run/httpd /run/php-fpm \ + && chmod -R g=u /var/log/httpd /var/run/httpd /run/php-fpm + +EXPOSE 8080 +USER 1001 +CMD php-fpm & httpd -D FOREGROUND +``` + +这个文件中的每条指令都会在容器镜像中增加一个layer。每一层只增加与下面一层的区别,然后,所有这些堆叠在一起,形成一个只读的容器镜像。 + +### 它是如何工作的? + +你需要知道一些关于容器镜像的事情,按照这个顺序理解这些概念很重要: + + 1. 联合文件系统 + 2. 写入时复制(COW) + 3. 叠加文件系统 + 4. 快照器 + +### 联合文件系统 + +联合文件系统Union File System(UnionFS)内置于 Linux 内核中,它允许将一个文件系统的内容与另一个文件系统的内容合并,同时保持“物理”内容的分离。其结果是一个统一的文件系统,即使数据实际上是以分支形式组织。 + +这里的想法是,如果你有多个镜像有一些相同的数据,不是让这些数据再次复制过来,而是通过使用一个叫做layer的东西来共享。 + +![UnionFS][2] + +每一层都是一个可以在多个容器中共享的文件系统,例如,httpd 基础层是 Apache 的官方镜像,可以在任何数量的容器中使用。想象一下,由于我们在所有的容器中使用相同的基础层,我们节省了多少磁盘空间。 + +这些镜像层总是只读的,但是当我们用这个镜像创建一个新的容器时,我们会在它上面添加一个薄的可写层。这个可写层是你创建、修改、删除或进行每个容器所需的其他修改的地方。 + +### 写时复制(COW) + +当你启动一个容器时,看起来好像这个容器有自己的整个文件系统。这意味着你在系统中运行的每个容器都需要自己的文件系统副本。这岂不是要占用大量的磁盘空间,而且还要花费大量的时间让容器启动?不是的,因为每个容器都不需要它自己的文件系统副本! + +容器和镜像使用写时复制copy-on-write(COW)机制来实现这一点。写时复制策略不是复制文件,而是将同一个数据实例分享给多个进程,并且只在一个进程需要修改或写入数据时进行复制。所有其他进程将继续使用原始数据。 + +Docker 对镜像和容器都使用了写时复制的机制。为了做到这一点,在旧版本中,镜像和运行中的容器之间的变化是通过图驱动graph driver来跟踪的,现在则是通过快照器snapshotter来跟踪。 + +在运行中的容器中执行任何写操作之前,要修改的文件的副本被放在容器的可写层上。这就是发生 _写_ 的地方。现在你知道为什么它被称为“写时复制”了么。 + +这种策略既优化了镜像磁盘空间的使用,也优化了容器启动时间的性能,并与 UnionFS 一起工作。 + +### 叠加文件系统 + +叠加文件系统Overlay File System位于现有文件系统的顶部,结合了上层和下层的目录树,并将它们作为一个单一的目录来呈现。这些目录被称为layer。下层保持不被修改。每一层只增加与下一层的差异(计算机术语为 “diff”),这种统一的过程被称为联合挂载union mount。 + +最低的目录或镜像层被称为下层目录lowerdir,上面的目录被称为 上层目录upperdir。最后的覆盖层或统一层被称为合并层merged。 + +![Layered file system][3] + +常见的术语包括这些层的定义: + + * 基础层Base layer:是你的文件系统的文件所在的地方。就容器镜像而言,这个层就是你的基础镜像。 + * 叠加层Overlay layer:通常被称为容器层container layer,因为对运行中的容器所做的所有改变,如添加、删除或修改文件,都会写到这个可写层。对这一层所做的所有修改都存储在下一层,是基础层和差异层的联合视图。 + * 差异层Diff layer包含了在叠加层所作的所有修改。如果你写的东西已经在基础层了,那么叠加文件系统就会把文件复制到差异层,并做出你想写的修改。这被称为写时复制。 + +### 快照器 + +通过使用层和图驱动,容器可以将其更改作为其容器文件系统的一部分来构建、管理和分发。但是使用图驱动graph driver的工作真的很复杂,而且容易出错。快照器SnapShotter与图驱动不同,因为它们不用了解镜像或容器。 + +快照器的工作方式与 Git 非常相似,比如有树的概念,并跟踪每次提交对树的改变。一个快照snapshot代表一个文件系统状态。快照有父子关系,使用一组目录。可以在父级和其快照之间进行差异比较(`diff`),以创建一个层。 + +快照器提供了一个用于分配、快照和挂载抽象的分层文件系统的 API。 + +### 总结 + +你现在对什么是容器镜像以及它们的分层方法如何使容器可移植有了很好的认识。接下来,我将介绍容器的运行机制和内部结构。 + +本文基于 [techbeatly][4] 的文章,经许可后改编。 + +-------------------------------------------------------------------------------- + +via: https://opensource.com/article/21/8/container-image + +作者:[Nived V][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/nivedv +[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/sites/default/files/unionfs.png (UnionFS) +[3]: https://miro.medium.com/max/4800/0*h61UE3S0jRPv3mA7 (Layered file system) +[4]: https://medium.com/techbeatly/container-part-ii-images-4f2139194775 diff --git a/published/202109/20210831 Zulip- An Interesting Open-Source Alternative to Slack.md b/published/202109/20210831 Zulip- An Interesting Open-Source Alternative to Slack.md new file mode 100644 index 0000000000..edbf0cdbbe --- /dev/null +++ b/published/202109/20210831 Zulip- An Interesting Open-Source Alternative to Slack.md @@ -0,0 +1,99 @@ +[#]: subject: "Zulip: An Interesting Open-Source Alternative to Slack" +[#]: via: "https://itsfoss.com/zulip/" +[#]: author: "Ankush Das https://itsfoss.com/author/ankush/" +[#]: collector: "lujun9972" +[#]: translator: "geekpi" +[#]: reviewer: "wxy" +[#]: publisher: "wxy" +[#]: url: "https://linux.cn/article-13750-1.html" + +Zulip:一个不错的开源的 Slack 替代品 +====== + +> Zulip 是一个开源的协作平台,它把自己定位为一个更好的 Slack 替代品。让我们来了解一下。 + +![](https://img.linux.net.cn/data/attachment/album/202109/04/083746lbheeynx13jmn3xn.jpg) + +当涉及到你的工作时,消息和协作平台有很大的不同。 + +虽然有几个选择,但 Slack 是许多组织使用的一个流行选择。但是,可以自托管的 Slack 的开源替代方案如何呢? + +Zulip 就是这样一个软件。 + +### Zulip:开源的协作消息应用 + +![][1] + +如果你想多了解,我必须提到还有更多的 [Slack 开源替代品][2]。 + +但在这里,我重点介绍 Zulip。 + +Zulip 是一个自由而开源的消息应用,有付费托管选项和自托管的能力。 + +它旨在提供与 Slack 类似的体验,同时努力帮助你利用话题提高对话的有效性。 + +与 Slack 中的频道相比,Zulip 聊天添加了话题(类似标签),以快速过滤与你有关的对话。 + +### Zulip 的特点 + +![][3] + +你可以通过 Zulip 获得大部分的基本功能。这里列出主要的亮点,你可以发现: + + * 支持 Markdown + * 频道的主题 + * 支持拖放文件 + * 代码块 + * 集成 GitHub 来跟踪问题 + * 支持电子邮件通知 + * 自托管选项 + * 信息编辑 + * 集成 GIPHY + * 用 Zoom、Jitsi 或 BigBlueButton 进行视频通话 + +除了上述功能外,你可以预期得到你通常在 Slack 和其他方面得到的基本选项。 + +此外,如果你愿意,你还可以将它与 Matrix 和 IRC 整合。 + +![][4] + +在我简短的测试使用中,其用户界面对于有效的沟通来说是足够好的。然而,我没能找到任何黑暗模式或改变主题的能力。 + +它看起来比 Slack 更简单直白,这样可以改善用户体验方面的问题。 + +### 在 Linux 中安装 Zulip + +Zulip 在其官方网站上以 AppImage 文件的形式提供。如果你需要帮助,可以参考我们关于 [在 Linux 中使用 AppImage][5] 的指南。 + +它也有一个 Snap 包。所以,你可以在任何一个 Linux 发行版上使用它们中的任何一个。 + +你也可以使用 APT 通过终端为基于 Ubuntu/Debian 的发行版安装它。如果你想这样做,请看它的 [官方说明][6]。 + +Zulip 可用于 Windows、Mac 和 Linux。你也应该发现它可用于 Android 和 iOS 手机。 + +- [Zulip][7] + +你可以在网络、桌面和智能手机上使用 Zulip,所以可以把它当做 Slack 的合适替代品。 + +你试过了吗?你用什么消息平台来进行工作协作?欢迎在评论中分享你的想法。 + +-------------------------------------------------------------------------------- + +via: https://itsfoss.com/zulip/ + +作者:[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://i1.wp.com/itsfoss.com/wp-content/uploads/2021/08/zulip-chat-new.png?resize=800%2C551&ssl=1 +[2]: https://itsfoss.com/open-source-slack-alternative/ +[3]: https://i0.wp.com/itsfoss.com/wp-content/uploads/2021/08/zulip-chat-screenshot.png?resize=800%2C550&ssl=1 +[4]: https://i0.wp.com/itsfoss.com/wp-content/uploads/2021/08/zulip-settings.png?resize=800%2C546&ssl=1 +[5]: https://itsfoss.com/use-appimage-linux/ +[6]: https://zulip.com/help/desktop-app-install-guide +[7]: https://zulip.com/ diff --git a/published/202109/20210901 20 essential Linux commands for every user.md b/published/202109/20210901 20 essential Linux commands for every user.md new file mode 100644 index 0000000000..61ef6c4baf --- /dev/null +++ b/published/202109/20210901 20 essential Linux commands for every user.md @@ -0,0 +1,244 @@ +[#]: subject: "20 essential Linux commands for every user" +[#]: via: "https://opensource.com/article/21/9/essential-linux-commands" +[#]: author: "Seth Kenlon https://opensource.com/users/seth" +[#]: collector: "lujun9972" +[#]: translator: "unigeorge" +[#]: reviewer: "wxy" +[#]: publisher: "wxy" +[#]: url: "https://linux.cn/article-13759-1.html" + +用户必会的 20 个 Linux 基础命令 +====== + +> 无论新手老手,这 20 个 Linux 命令都能让你的操作更轻松。 + +![](https://img.linux.net.cn/data/attachment/album/202109/07/082525n7amf7gejo16zaxx.jpg) + +在黝黑的终端窗口中输入命令,这样的方式对某些人群来说可能好像过时了,但对许多专业计算机人员来说,这几乎是计算机完成能够执行的所有任务的最有效、最简便和最清晰的方式。如今,一些项目将开源命令引入了 macOS 和 Windows 等非开放平台,因此终端命令不仅仅是针对 Linux 和 BSD 用户,更是与每个人都息息相关。你可能会惊讶地发现,在一台普通的 [POSIX][2] 计算机上安装了数千个命令,当然,其中很多命令并不是真的有用,至少不是直接或经常性被使用。而其中的一部分命令虽然不是有效终端必须使用的命令,但相比其他命令而言使用频率较高,值得大家学习一下。 + +以下是终端用户最可能会使用的前 20 个命令: + +### cd + +在终端外,你可以单击图标从一个文件夹移动到另一个文件夹,但在终端中,你需要使用 `cd`。`cd` 命令代表变更目录change directory,是用户在 Linux 系统中移动的方式。这是 Linux 中从一个地方到另一个地方最快、最直接的路线。 + +例如,在桌面上,当你想从你的主目录(你保存所有文件夹的地方)移动到一个名为 `presentations` 的文件夹时,你首先要打开你的 `Documents` 文件夹,然后打开一个名叫 `work` 的文件夹,然后是 `projects` 文件夹,然后是 `conference` 文件夹,最后是 `presentations` 文件夹,里面存放的是 LibreOffice Impress 幻灯片。这个过程包含了很多次的双击操作。同时屏幕上还需要许多鼠标移动动作,这取决于新窗口出现的位置,以及大脑需要跟踪的许多路径点。许多人通过将 _所有文件_ 都放在桌面上来避免这个看似微不足道的任务。 + +而终端用户只需键入以下内容即可避免此问题: + +``` +$ cd ~/Documents/work/projects/conference/presentations +``` + +一些有经验的终端用户甚至都懒得输入所有这些,而是使用 `Tab` 键自动完成单词填充。更甚者,有时你都不必依赖自动完成,而是改用通配符: + +``` +$ cd ~/Doc*/work/*/conf*/p* +``` + +### pwd + +用 Buckaroo Banzai 的话来说:“无论你走到哪里,你就在那里。” + +当你想弄清楚确切位置时,就可以使用 `pwd` 命令。`pwd` 代表打印工作目录print working directory,这正是它的作用。`--physical`(在某些情况时缩写为 `-P`)显示解析所有符号链接后的确切位置。 + +``` +$ pwd +/home/tux/presentation + +$ pwd --physical +/home/tux/Documents/work/projects/conference/presentations +``` + +### sed + +流编辑器 `sed` 更广为人知的是一个强大的批量 _查找和替换_ 命令,但它同时也是一个正当合理的文本编辑器。你可以通过阅读我的 [介绍性文章][3] 来学习使用它,然后通过我的 [高级教程和备忘录][4] 成为老手。 + +### grep + +`grep` 命令使用很普遍,以至于经常被用作动词(例如 “我会对一些文件进行 grep”)和动名词(例如 “grep 一些输出”)。无论是查看日志文件还是解析其他命令的输出,它都是在 shell 中解析文本时的关键组件。这是忙碌的用户专注于特定信息的一种方式。考虑一下计算世界中的数据量,`grep` 命令的流行就见怪不怪了。你可以通过阅读我的 [介绍性文章][5] 了解 `grep`,然后下载 [备忘录][6] 学习。 + +### file + +当你需要知道文件包含什么类型的数据时,请使用 `file` 命令: + +``` +$ file example.foo +example.foo: RIFF (little-endian) data, Web/P image [...] + +$ file example.bar +example.bar: ELF 64-bit LSB executable, x86-64 [...] +``` + +当然,`file` 命令并不神奇。它只不过是根据文件如何标识自身而进行输出的,并且文件可能是错误的、损坏的或伪装的。使用 [hexdump][7] 进行严格检查的方式确定性更强,但对于日常使用而言,`file` 命令非常方便。 + +### awk + +`awk` 不仅仅是一个命令,它还是一种字面意义上的 [编程语言][8]。[点此下载我们的免费 Awk 电子书][9] 进行学习,你可能会写出远超你想象的脚本。 + +### curl + +`curl` 命令是用于终端的 [非交互式 Web 浏览器][10]。它是面向 Web 和 API 开发人员的 [开发工具][11]。它是一个复杂灵活的命令,但如果你想从你的终端顺利地与 Web 服务交互,该命令是很值得学习的。 + +下载我们免费的 [curl 备忘录][12],你可以从中学会 `curl` 的许多选项。 + +### ps + +管理系统资源主要由内核负责,当你更喜欢或更需要手动管理时,可以使用 `ps` 命令。读者可以在我的 [使用 procps-ng 监控 Linux 系统][13] 文章中了解 `ps`。 + +### cat + +[cat 命令][14] 是连接concatenate的缩写,它曾因为能将若干小文件合并而显得非常有用,这些小文件可能是由于大小限制而(使用 `split` 命令)拆分的。如今,`cat` 主要是用来将文本文件的内容转储到终端中以供快速阅读,除非你为此专门去使用 `head`、`tail`、`more` 或 `less` 等命令。 + +尽管它的原始用途几乎已被弃用,并且其他几个命令也主要提供了其次要功能,但 `cat` 仍然是一个有用的工具。例如,它可以是复制(`cp`)命令的替代品: + +``` +$ cat myfile.ogg > /backups/myfile.ogg +``` + +它可以显示文件中不便观察的隐形字符。例如,使用 `--show-tabs` 选项,分割 [YAML][15] 的 `Tab` 字符就会显示为 `^I`: + +``` +$ cat --show-tabs my.yaml + +--- + +- hosts: all +  tasks: +  - name: Make sure the current version of 'sysstat' is installed. +    dnf: +     name: +^I- sysstat +^I- httpd +^I- mariadb-server +     state: latest +``` + +它还可以用 `--show-nonprinting` 显示非打印字符,用 `--show-ends` 标记行尾,用 `--number` 提供行号,等等。 + +### find + +`find` 命令可以用来查找文件,但它还有许多选项,这些选项可以帮助你通过各种过滤器和参数查找文件。读者可以从我的 [介绍性文章][16] 中学习该命令的基础知识。 + +如果你一直想知道为什么最基本的、不起眼的 [ls 命令][17],不在本文列表中,那是因为 `find` 的灵活性。它不仅可以列表文件: + +``` +$ find . +./bar.txt +./baz.xml +./foo.txt +[...] +``` + +它还可以提供包含详细信息的长列表功能: + +``` +$ find . -ls +3014803  464 -rw-rw-r--   1 tux users  473385 Jul 26 07:25 ./foo.txt +3014837  900 -rwxrwxr-x   1 tux users  918217 Nov  6  2019 ./baz.xml +3026891  452 -rw-rw-r--   1 tux users  461354 Aug 10 13:41 ./foo.txt +[...] +``` + +这是一个技术问题,但也是很一个巧妙的技巧。 + +### tar + +人们有时会引用 BSD 的 `tar` 语法来拿 Linux 命令开玩笑。尽管有这样的名声,但 `tar` 命令实际上非常直观。读者可以阅读我的 [如何解压缩 tar.gz 文件][18] 文章,了解在需要时使用 `tar` 命令的简单知识。 + +### more、less 和 most + +这些统称为分页命令。分页命令与 `cat` 类似,但前者会在屏幕底部暂停输出,直到你向下滚动查看更多内容。这些命令比较简单,但每个之间都有细微差别。用户是用箭头键还是空格键滚动?是必须手动退出,还是在显示的文件末尾自动退出?用户的首选搜索行为是什么样的?选择你最喜欢的分页命令并将其设置在 `.bashrc` 中吧! + +### ssh 和 scp + +OpenSSH 不仅有助于保护与远程系统的连接安全,还可以用于启用其他命令。例如,对于许多用户来说,有了 `.ssh` 目录,他们才能与 Git 存储库顺利交互、将更新发布到网站、登录云控制平台。 + +### mv + +`mv` 命令有双重作用:它既可以 [移动文件][19] 又可以 [重命名文件][20]。它有几个可用的保护措施,例如 `--interactive` 和 `--no-clobber` 选项避免破坏现有文件,`--backup` 命令确保数据在新位置验证之前被保留,以及 `--update` 选项确保旧版本不会替换新版本文件。 + +### sudo + +当某个用户账户的用户名已知,且具有 _全部_ 系统权限时,该用户很快就会成为黑客攻击的目标。`sudo` 命令消除了对字面上 `root` 用户的需求,从而优雅地移除了有关系统的重要信息。不过这还不是全部,使用 `sudo` 你还可以轻松地管理单个命令、用户和组的权限。你可以在选定的命令上启用无密码执行、记录用户会话、使用摘要验证来验证命令,[等等][21]。 + +### alias + +使用 `alias` 命令将长命令变成易于记忆的快捷方式: + +``` +$ alias ls='ls --classify --almost-all --ignore-backups --color' +``` + +### clear + +有时终端会显得很混乱,输入 `clear`(或在某些 shell 中按 `Ctrl+L`)后,你就能得到漂亮、刷新的屏幕了。 + +### setfacl + +传统上,POSIX 文件权限由 `chown` 和 `chmod` 决定。然而,如今系统变得更加复杂,因此有一个灵活性更高的命令。`setfacl` 命令允许创建一个 [访问控制列表(ACL)][22],可以配置任意用户所需权限,并可以为文件夹及其中创建的内容设置默认权限。 + +### netcat + +可能需要使用 `netcat`(`nc`)的人不多,但这些使用它的人确离不开它。`nc` 命令是一个通用的网络连接工具。 + +它可以连接到一个端口,类似于 `telnet` 命令: + +``` +$ nc -u 192.168.0.12 80 +``` + +它可以 ping 一个端口,类似于 `ping` 命令: + +``` +$ nc -zvn 192.168.0.12 25 +``` + +它可以探测开放端口,类似于 `nmap` 命令: + +``` +$ nc -zv 192.168.0.12 25-80 +``` + +以上仅是该命令的一小部分用途。 + +### 你自己构建的命令 + +在某种程度上,Linux 终端是一个创造性解决问题的平台。当你学习命令时,你也在学习可用于创建自己的命令的组块。我的 [shell 历史][23] 中的许多命令都是自己编写的 shell 脚本,从而实现了根据自己想要的工作方式定制工作流程。你为自己的效率和舒适度而设计的命令也可以作为 shell 中的基本命令。花些时间了解一些很棒的命令,然后试着构建自己的命令吧。当你构建出的命令非常好用时,把它开源,这样就可以与他人分享你的想法啦! + +-------------------------------------------------------------------------------- + +via: https://opensource.com/article/21/9/essential-linux-commands + +作者:[Seth Kenlon][a] +选题:[lujun9972][b] +译者:[unigeorge](https://github.com/unigeorge) +校对:[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/command_line_prompt.png?itok=wbGiJ_yg (Command line prompt) +[2]: https://opensource.com/article/19/7/what-posix-richard-stallman-explains +[3]: https://opensource.com/article/20/12/sed +[4]: https://opensource.com/article/21/3/sed-cheat-sheet +[5]: https://opensource.com/article/21/3/grep-cheat-sheet +[6]: https://opensource.com/downloads/grep-cheat-sheet +[7]: https://opensource.com/article/19/8/dig-binary-files-hexdump +[8]: https://opensource.com/article/21/1/learn-awk +[9]: https://opensource.com/article/20/9/awk-ebook +[10]: https://opensource.com/article/20/5/curl-cheat-sheet +[11]: https://www.redhat.com/sysadmin/use-curl-api +[12]: https://opensource.com/downloads/curl-command-cheat-sheet +[13]: https://opensource.com/article/21/8/linux-procps-ng +[14]: https://opensource.com/article/19/2/getting-started-cat-command +[15]: https://www.redhat.com/sysadmin/yaml-beginners +[16]: https://opensource.com/article/21/8/find-files-and-directories-find +[17]: https://opensource.com/article/19/7/master-ls-command +[18]: https://opensource.com/article/17/7/how-unzip-targz-file +[19]: https://opensource.com/article/21/8/move-files-linux +[20]: https://opensource.com/article/21/8/rename-file-linux-terminal +[21]: https://opensource.com/article/19/10/know-about-sudo +[22]: https://opensource.com/article/20/3/external-drives-linux +[23]: https://opensource.com/article/18/6/history-command diff --git a/published/202109/20210901 What are container runtimes.md b/published/202109/20210901 What are container runtimes.md new file mode 100644 index 0000000000..9119fc9aeb --- /dev/null +++ b/published/202109/20210901 What are container runtimes.md @@ -0,0 +1,92 @@ +[#]: subject: "What are container runtimes?" +[#]: via: "https://opensource.com/article/21/9/container-runtimes" +[#]: author: "Nived V https://opensource.com/users/nivedv" +[#]: collector: "lujun9972" +[#]: translator: "geekpi" +[#]: reviewer: "turbokernel" +[#]: publisher: "wxy" +[#]: url: "https://linux.cn/article-13772-1.html" + +什么是容器运行时? +====== + +> 通过深入了解容器运行时,理解容器环境是如何建立的。 + +![](https://img.linux.net.cn/data/attachment/album/202109/11/110104vzgjs0v9c9o04s78.jpg) + +在学习 [容器镜像][2] 时,我们讨论了容器的基本原理,但现在是深入研究容器运行时runtime的时候了,从而了解容器环境是如何构建的。本文的部分信息摘自 开放容器计划Open Container Initiative(OCI)的 [官方文档][3],所以无论使用何种容器引擎,这些信息都是一致的。 + +### 容器运行机制 + +那么,当你运行 `podman run` 或 `docker run` 命令时,在后台到底发生了什么?一个分步的概述如下: + + 1. 如果本地没有镜像,则从镜像登记仓库registry拉取镜像 + 2. 镜像被提取到一个写时复制(COW)的文件系统上,所有的容器层相互堆叠以形成一个合并的文件系统 + 3. 为容器准备一个挂载点 + 4. 从容器镜像中设置元数据,包括诸如覆盖 `CMD`、来自用户输入的 `ENTRYPOINT`、设置 SECCOMP 规则等设置,以确保容器按预期运行 + 5. 提醒内核为该容器分配某种隔离,如进程、网络和文件系统(命名空间namespace) + 6. 提醒内核为改容器分配一些资源限制,如 CPU 或内存限制(控制组cgroup) + 7. 传递一个系统调用syscall给内核用于启动容器 + 8. 设置 SELinux/AppArmor + +容器运行时负责上述所有的工作。当我们提及容器运行时,想到的可能是 runc、lxc、containerd、rkt、cri-o 等等。嗯,你没有错。这些都是容器引擎和容器运行时,每一种都是为不同的情况建立的。 + +容器运行时Container runtime更侧重于运行容器,为容器设置命名空间和控制组(cgroup),也被称为底层容器运行时。高层的容器运行时或容器引擎专注于格式、解包、管理和镜像共享。它们还为开发者提供 API。 + +### 开放容器计划(OCI) + +开放容器计划Open Container Initiative(OCI)是一个 Linux 基金会的项目。其目的是设计某些开放标准或围绕如何与容器运行时和容器镜像格式工作的结构。它是由 Docker、rkt、CoreOS 和其他行业领导者于 2015 年 6 月建立的。 + +它通过两个规范来完成如下任务: + +#### 1、镜像规范 + +该规范的目标是创建可互操作的工具,用于构建、传输和准备运行的容器镜像。 + +该规范的高层组件包括: + + * [镜像清单][4] — 一个描述构成容器镜像的元素的文件 + * [镜像索引][5] — 镜像清单的注释索引 + * [镜像布局][6] — 一个镜像内容的文件系统布局 + * [文件系统布局][7] — 一个描述容器文件系统的变更集 + * [镜像配置][8] — 确定镜像层顺序和配置的文件,以便转换成 [运行时捆包][9] + * [转换][10] — 解释应该如何进行转换的文件 + * [描述符][11] — 一个描述被引用内容的类型、元数据和内容地址的参考资料 + +#### 2、运行时规范 + +该规范用于定义容器的配置、执行环境和生命周期。`config.json` 文件为所有支持的平台提供了容器配置,并详细定义了用于创建容器的字段。在详细定义执行环境时也描述了为容器的生命周期定义的通用操作,以确保在容器内运行的应用在不同的运行时环境之间有一个一致的环境。 + +Linux 容器规范使用了各种内核特性,包括命名空间namespace控制组cgroup权能capability、LSM 和文件系统隔离jail等来实现该规范。 + +### 小结 + +容器运行时是通过 OCI 规范管理的,以提供一致性和互操作性。许多人在使用容器时不需要了解它们是如何工作的,但当你需要排除故障或优化时,了解容器是一个宝贵的优势。 + +本文基于 [techbeatly][12] 的文章,并经授权改编。 + +-------------------------------------------------------------------------------- + +via: https://opensource.com/article/21/9/container-runtimes + +作者:[Nived V][a] +选题:[lujun9972][b] +译者:[geekpi](https://github.com/geekpi) +校对:[turbokernel](https://github.com/turbokernel) + +本文由 [LCTT](https://github.com/LCTT/TranslateProject) 原创编译,[Linux中国](https://linux.cn/) 荣誉推出 + +[a]: https://opensource.com/users/nivedv +[b]: https://github.com/lujun9972 +[1]: https://opensource.com/sites/default/files/styles/image-full-size/public/lead-images/kubernetes_containers_ship_lead.png?itok=9EUnSwci (Ships at sea on the web) +[2]: https://opensource.com/article/21/8/container-fundamentals-2 +[3]: https://github.com/opencontainers +[4]: https://github.com/opencontainers/image-spec/blob/master/manifest.md +[5]: https://github.com/opencontainers/image-spec/blob/master/image-index.md +[6]: https://github.com/opencontainers/image-spec/blob/master/image-layout.md +[7]: https://github.com/opencontainers/image-spec/blob/master/layer.md +[8]: https://github.com/opencontainers/image-spec/blob/master/config.md +[9]: https://github.com/opencontainers/runtime-spec +[10]: https://github.com/opencontainers/image-spec/blob/master/conversion.md +[11]: https://github.com/opencontainers/image-spec/blob/master/descriptor.md +[12]: https://medium.com/techbeatly/container-runtimes-deep-dive-77eb0e511939 diff --git a/published/202109/20210902 4 Linux technologies fundamental to containers.md b/published/202109/20210902 4 Linux technologies fundamental to containers.md new file mode 100644 index 0000000000..0a719929b2 --- /dev/null +++ b/published/202109/20210902 4 Linux technologies fundamental to containers.md @@ -0,0 +1,192 @@ +[#]: subject: "4 Linux technologies fundamental to containers" +[#]: via: "https://opensource.com/article/21/8/container-linux-technology" +[#]: author: "Nived V https://opensource.com/users/nivedv" +[#]: collector: "lujun9972" +[#]: translator: "wxy" +[#]: reviewer: "turbokernel" +[#]: publisher: "wxy" +[#]: url: "https://linux.cn/article-13792-1.html" + +容器的四大基础技术 +====== + +> 命名空间、控制组、seccomp 和 SELinux 构成了在系统上构建和运行一个容器进程的 Linux 技术基础。 + +![](https://img.linux.net.cn/data/attachment/album/202109/17/085439ye0iq5ynzyhpusy5.jpg) + +在以前的文章中,我介绍过 [容器镜像][2] 及其 [运行时][3]。在本文中,我研究了容器是如何在一些特殊的 Linux 技术基础上实现的,这其中包括命名空间和控制组。 + +![容器技术的层次][4] + +*图1:对容器有贡献的 Linux 技术(Nived Velayudhan, [CC BY-SA 4.0][5])* + +这些 Linux 技术构成了在系统上构建和运行容器进程的基础: + + 1. 命名空间 + 2. 控制组(cgroups) + 3. Seccomp + 4. SELinux + +### 命名空间 + +命名空间namespace 为容器提供了一个隔离层,给容器提供了一个看起来是独占的 Linux 文件系统的视图。这就限制了进程能访问的内容,从而限制了它所能获得的资源。 + +在创建容器时,Docker 或 Podman 和其他容器技术使用了 Linux 内核中的几个命名空间: + +``` +[nivedv@homelab ~]$ docker container run alpine ping 8.8.8.8 +[nivedv@homelab ~]$ sudo lsns -p 29413 + + NS TYPE NPROCS PID USER COMMAND +4026531835 cgroup 299 1 root /usr/lib/systemd/systemd --switched... +4026531837 user 278 1 root /usr/lib/systemd/systemd --switched... +4026533105 mnt 1 29413 root ping 8.8.8.8 +4026533106 uts 1 29413 root ping 8.8.8.8 +4026533107 ipc 1 29413 root ping 8.8.8.8 +4026533108 pid 1 29413 root ping 8.8.8.8 +4026533110 net 1 29413 root ping 8.8.8.8 +``` +#### 用户 + +用户(`user`)命名空间将用户和组隔离在一个容器内。这是通过分配给容器与宿主系统有不同的 UID 和 GID 范围来实现的。用户命名空间使软件能够以 root 用户的身份在容器内运行。如果入侵者攻击容器,然后逃逸到宿主机上,他们就只能以受限的非 root 身份运行了。 + +#### 挂载 + +挂载(`mnt`)命名空间允许容器有自己的文件系统层次结构视图。你可以在 Linux 系统中的 `/proc//mounts` 位置找到每个容器进程的挂载点。 + +#### UTS + +Unix 分时系统Unix Timeharing System(UTS)命名空间允许容器拥有一个唯一主机名和域名。当你运行一个容器时,即使使用 `- name` 标签,也会使用一个随机的 ID 作为主机名。你可以使用 [unshare 命令][6] 来了解一下这个工作原理。 + +``` +nivedv@homelab ~]$ docker container run -it --name nived alpine sh +/ # hostname +9c9a5edabdd6 +/ # +nivedv@homelab ~]$ sudo unshare -u sh +sh-5.0# hostname isolated.hostname +sh-5.0# hostname +isolated.hostname +sh-5.0# +sh-5.0# exit +exit +[nivedv@homelab ~]$ hostname +homelab.redhat.com +``` + +#### IPC + +进程间通信Inter-Process Communication(IPC)命名空间允许不同的容器进程之间,通过访问共享内存或使用共享消息队列来进行通信。 + +``` +[root@demo /]# ipcmk -M 10M +Shared memory id: 0 +[root@demo /]# ipcmk -M 20M +Shared memory id: 1 +[root@demo /]# +[root@demo /]# ipcs +------ Message Queues -------- +key msqid owner perms used-bytes messages +------ Shared Memory Segments -------- +key shmid owner perms bytes nattch status +0xd1df416a 0 root 644 10485760 0 +0xbd487a9d 1 root 644 20971520 0 +------ Semaphore Arrays -------- +key semid owner perms nsems +``` + +#### PID + +进程 IDProcess ID(PID)命名空间确保运行在容器内的进程与外部隔离。当你在容器内运行 `ps` 命令时,由于这个命名空间隔离的存在,你只能看到在容器内运行的进程,而不是在宿主机上。 + +#### 网络 + +网络(`net`)命名空间允许容器有自己网络接口、IP 地址、路由表、端口号等视图。容器如何能够与外部通信?你创建的所有容器都会被附加到一个特殊的虚拟网络接口上进行通信。 + +``` +[nivedv@homelab ~]$ docker container run --rm -it alpine sh +/ # ping 8.8.8.8 +PING 8.8.8.8 (8.8.8.8): 56 data bytes +64 bytes from 8.8.8.8: seq=0 ttl=119 time=21.643 ms +64 bytes from 8.8.8.8: seq=1 ttl=119 time=20.940 ms +^C +[root@homelab ~]# ip link show veth84ea6fc +veth84ea6fc@if22: mtu 1500 qdisc noqueue +master docker0 state UP mode DEFAULT group default +``` + +### 控制组 + +控制组(`cgroup`)是组成一个容器的基本模块。控制组会分配和限制容器所使用的资源,如 CPU、内存、网络 I/O 等。容器引擎会自动创建每种类型的控制组文件系统,并在容器运行时为每个容器设置配额。 + +``` +[root@homelab ~]# lscgroup | grep docker +cpuset:/docker +net_cls,net_prio:/docker +cpu,cpuacct:/docker +hugetlb:/docker +devices:/docker +freezer:/docker +memory:/docker +perf_event:/docker +blkio:/docker +pids:/docker +``` + +容器运行时为每个容器设置了控制组值,所有信息都存储在 `/sys/fs/cgroup/*/docker`。下面的命令将确保容器可以使用 50000 微秒的 CPU 时间片,并将内存的软、硬限制分别设置为 500M 和 1G。 + +``` +[root@homelab ~]# docker container run -d --name test-cgroups --cpus 0.5 --memory 1G --memory-reservation 500M httpd +[root@homelab ~]# lscgroup cpu,cpuacct:/docker memory:/docker +cpu,cpuacct:/docker/ +cpu,cpuacct:/docker/c3503ac704dafea3522d3bb82c77faff840018e857a2a7f669065f05c8b2cc84 +memory:/docker/ +memory:/docker/c3503ac704dafea3522d3bb82c77faff840018e857a2a7f669065f05c8b2cc84 +[root@homelab c....c84]# cat cpu.cfs_period_us +100000 +[root@homelab c....c84]# cat cpu.cfs_quota_us +50000 +[root@homelab c....c84]# cat memory.soft_limit_in_bytes +524288000 +[root@homelab c....c84]# cat memory.limit_in_bytes +1073741824 +``` + +### SECCOMP + +Seccomp 意思是“安全计算secure computing”。它是一项 Linux 功能,用于限制应用程序进行的系统调用的集合。例如,Docker 的默认 seccomp 配置文件禁用了大约 44 个系统调用(总计超过 300 个)。 + +这里的思路是让容器只访问所必须的资源。例如,如果你不需要容器改变主机上的时钟时间,你可能不会使用 `clock_adjtime` 和 `clock_settime` 系统调用,屏蔽它们是合理的。同样地,你不希望容器改变内核模块,所以没有必要让它们使用 `create_module`、 `delete_module` 系统调用。 + +### SELinux + +SELinux 是“安全增强的 Linuxsecurity-enhanced Linux”的缩写。如果你在你的宿主机上运行的是 Red Hat 发行版,那么 SELinux 是默认启用的。SELinux 可以让你限制一个应用程序只能访问它自己的文件,并阻止任何其他进程访问。因此,如果一个应用程序被破坏了,它将限制该应用程序可以影响或控制的文件数量。通过为文件和进程设置上下文环境以及定义策略来实现,这些策略将限制一个进程可以访问和更改的内容。 + +容器的 SELinux 策略是由 `container-selinux` 包定义的。默认情况下,容器以 `container_t` 标签运行,允许在 `/usr` 目录下读取(`r`)和执行(`x`),并从 `/etc` 目录下读取大部分内容。标签`container_var_lib_t` 是与容器有关的文件的通用标签。 + +### 总结 + +容器是当今 IT 基础设施的一个重要组成部分,也是一项相当有趣的技术。即使你的工作不直接涉及容器化,了解一些基本的容器概念和方法,也能让你体会到它们如何帮助你的组织。容器是建立在开源的 Linux 技术之上的,这使它们变得更加美好。 + +本文基于 [techbeatly][7] 的文章,并经授权改编。 + +-------------------------------------------------------------------------------- + +via: https://opensource.com/article/21/8/container-linux-technology + +作者:[Nived V][a] +选题:[lujun9972][b] +译者:[wxy](https://github.com/wxy) +校对:[turbokernel](https://github.com/turbokernel) + +本文由 [LCTT](https://github.com/LCTT/TranslateProject) 原创编译,[Linux中国](https://linux.cn/) 荣誉推出 + +[a]: https://opensource.com/users/nivedv +[b]: https://github.com/lujun9972 +[1]: https://opensource.com/sites/default/files/styles/image-full-size/public/lead-images/car-penguin-drive-linux-yellow.png?itok=twWGlYAc (Penguin driving a car with a yellow background) +[2]: https://linux.cn/article-13766-1.html +[3]: https://linux.cn/article-13772-1.html +[4]: https://opensource.com/sites/default/files/1linuxtechs.png (layers of linux technologies) +[5]: https://creativecommons.org/licenses/by-sa/4.0/ +[6]: https://opensource.com/article/19/10/namespaces-and-containers-linux +[7]: https://nivedv.medium.com/container-internals-deep-dive-5cc424957413 diff --git a/published/202109/20210904 How to Install Dropbox on Ubuntu Linux.md b/published/202109/20210904 How to Install Dropbox on Ubuntu Linux.md new file mode 100644 index 0000000000..450681de4c --- /dev/null +++ b/published/202109/20210904 How to Install Dropbox on Ubuntu Linux.md @@ -0,0 +1,118 @@ +[#]: subject: "How to Install Dropbox on Ubuntu Linux" +[#]: via: "https://itsfoss.com/install-dropbox-ubuntu/" +[#]: author: "Abhishek Prakash https://itsfoss.com/author/abhishek/" +[#]: collector: "lujun9972" +[#]: translator: "geekpi" +[#]: reviewer: "wxy" +[#]: publisher: "wxy" +[#]: url: "https://linux.cn/article-13773-1.html" + +如何在 Ubuntu Linux 上安装 Dropbox +====== + +![](https://img.linux.net.cn/data/attachment/album/202109/11/112839qa96g29ws99z9479.jpg) + +Dropbox 是 [最受欢迎的云存储服务之一,可用于 Linux][1] 和其他操作系统。 + +事实上,Dropbox 是最早提供原生 Linux 应用的服务之一。它仍然 [支持 32 位 Linux 系统][2],这也是一项值得称赞的工作。 + +在这个初学者的教程中,我将展示在 Ubuntu 上安装 Dropbox 的步骤。这些步骤其实很简单,但有些网站把它弄得不必要的复杂。 + +### 在 Ubuntu 桌面上安装 Dropbox + +让我们来看看安装步骤,一步一步来。 + +#### 第一步:获取 Ubuntu 的 Dropbox 安装程序 + +Dropbox 为其安装程序提供 DEB 文件。进入网站的下载页面: + +- [下载 Dropbox][3] + +下载相应的 DEB 文件。考虑到你使用的是 64 位的 Ubuntu,请获取 64 位版本的 DEB 文件。 + +![Download the Dropbox installer][4] + +#### 第二步:安装 Dropbox 安装程序 + +你下载的 deb 文件只是 Dropbox 的一个安装程序。实际的 Dropbox 安装稍后开始,类似于 [在 Ubuntu 上安装 Steam][5]。 + +要 [安装下载的 deb 文件][6],可以双击它,或者右击并选择用软件安装打开。 + +![Installing the downloaded Dropbox deb file][7] + +它将打开软件中心,你可以点击安装按钮。 + +![Installing Dropbox deb file][8] + +等待安装完成。 + +#### 第三步:开始安装 Dropbox + +现在 Dropbox 安装程序已经安装完毕。按 `Windows` 键(也叫 `Super` 键),搜索 Dropbox 并点击它。 + +![Start Dropbox for installation][9] + +第一次启动时,它显示两个弹出窗口。一个是关于重启 Nautilus(Ubuntu 中的文件资源管理器),另一个是关于 Dropbox 的安装。 + +![Starting Dropbox installation][10] + +点击 “Restart Nautilus” -> “Close”(在 Nautilus 弹出窗口)或 “OK”(在安装弹出窗口),开始实际的 Dropbox 客户端下载和安装。如果 “Nautilus Restart” 在点击关闭按钮时没有关闭,请点击 “X” 按钮。 + +等待 Dropbox 的安装完成。 + +![Installing Dropbox][11] + +哦!需要重新启动 Nautilus,因为 Dropbox 增加了一些额外的功能,如在文件资源管理器中显示同步状态。 + +当 Dropbox 安装完毕,它应该会自动带你到 Dropbox 的登录页面,或者你可以点击顶部的 Dropbox 图标并选择登录选项。 + +![Sign in to Dropbox after installation][12] + +事实上,这就是你今后访问 Dropbox 设置的方式。 + +#### 第四步:开始在 Ubuntu 上使用 Dropbox + +![Sign in into Dropbox][13] + +**注意**:在你成功登录之前,Dropbox 将不会工作。这里有一个问题。免费版的 Dropbox 限制了你可以链接到你的账户的设备数量。**如果你已经有 3 个链接的设备,你应该删除一些你不使用的旧设备。** + +当你成功登录后,你应该看到在你的家目录中创建了一个 Dropbox 文件夹,你的云端文件开始出现在这里。 + +![Dropbox folder is created under home directory][14] + +如果你想节省磁盘空间或带宽,你可以进入偏好设置并选择选择性同步Selective Sync选项。该选项允许你只在本地系统上同步来自 Dropbox 云的选定文件夹。 + +![Using selective sync in Dropbox][15] + +Dropbox 会在每次启动时自动启动。我相信,这是你应该从任何云服务中期待的行为。 + +这就是你在 Ubuntu 上开始使用 Dropbox 所需要的一切。我希望这个教程对你有帮助。 + +-------------------------------------------------------------------------------- + +via: https://itsfoss.com/install-dropbox-ubuntu/ + +作者:[Abhishek Prakash][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/abhishek/ +[b]: https://github.com/lujun9972 +[1]: https://itsfoss.com/cloud-services-linux/ +[2]: https://itsfoss.com/32-bit-linux-distributions/ +[3]: https://www.dropbox.com/install-linux +[4]: https://i2.wp.com/itsfoss.com/wp-content/uploads/2021/09/get-dropbox-for-ubuntu.png?resize=800%2C294&ssl=1 +[5]: https://itsfoss.com/install-steam-ubuntu-linux/ +[6]: https://itsfoss.com/install-deb-files-ubuntu/ +[7]: https://i1.wp.com/itsfoss.com/wp-content/uploads/2021/09/dropbox-installer-ubuntu.png?resize=797%2C476&ssl=1 +[8]: https://i1.wp.com/itsfoss.com/wp-content/uploads/2021/09/installing-dropbox-deb-file.png?resize=800%2C346&ssl=1 +[9]: https://itsfoss.com/wp-content/uploads/2021/09/start-drobox-ubuntu.webp +[10]: https://itsfoss.com/wp-content/uploads/2021/09/starting-dropbox-installation-800x599.webp +[11]: https://itsfoss.com/wp-content/uploads/2021/09/installing-dropbox.webp +[12]: https://itsfoss.com/wp-content/uploads/2021/09/sign-in-to-dropbox-after-first-installation.webp +[13]: https://i0.wp.com/itsfoss.com/wp-content/uploads/2021/09/sign-in-dropbox.png?resize=800%2C409&ssl=1 +[14]: https://i1.wp.com/itsfoss.com/wp-content/uploads/2021/09/dropbox-folder-ubuntu.png?resize=800%2C491&ssl=1 +[15]: https://i1.wp.com/itsfoss.com/wp-content/uploads/2021/09/Dropbox-selective-sync.png?resize=800%2C399&ssl=1 diff --git a/published/202109/20210905 Neither Windows, nor Linux- Shrine is ‘God-s Operating System.md b/published/202109/20210905 Neither Windows, nor Linux- Shrine is ‘God-s Operating System.md new file mode 100644 index 0000000000..aac67eb493 --- /dev/null +++ b/published/202109/20210905 Neither Windows, nor Linux- Shrine is ‘God-s Operating System.md @@ -0,0 +1,82 @@ +[#]: subject: "Neither Windows, nor Linux! Shrine is ‘God’s Operating System’" +[#]: via: "https://itsfoss.com/shrine-os/" +[#]: author: "John Paul https://itsfoss.com/author/john/" +[#]: collector: "lujun9972" +[#]: translator: "wxy" +[#]: reviewer: "wxy" +[#]: publisher: "wxy" +[#]: url: "https://linux.cn/article-13831-1.html" + +不是 Windows,也不是 Linux,Shrine 才是 “神之操作系统” +====== + +![](https://img.linux.net.cn/data/attachment/album/202109/28/154516dcc5u1a50zfn4abw.jpg) + +在生活中,我们都曾使用过多种操作系统。有些好,有些坏。但你能说你使用过由“神”设计的操作系统吗?今天,我想向你介绍 Shrine(圣殿)。 + +### 什么是 Shrine? + +![Shrine 界面][1] + +从介绍里,你可能想知道这到底是怎么回事。嗯,这一切都始于一个叫 Terry Davis 的人。在我们进一步介绍之前,我最好提醒你,Terry 在生前患有精神分裂症,而且经常不吃药。正因为如此,他在生活中说过或做过一些不被社会接受的事情。 + +总之,让我们回到故事的主线。在 21 世纪初,Terry 发布了一个简单的操作系统。多年来,它不停地换了几个名字,有 J Operating System、LoseThos 和 SparrowOS 等等。他最终确定了 [TempleOS][2](神庙系统)这个名字。他选择这个名字是因为这个操作系统将成为“神的圣殿”。因此,“神”给 Terry 的操作系统规定了以下 [规格][3]: + +![video](https://youtu.be/LtlyeDAJR7A) + + * 它将有 640×480 的 16 色图形显示 + * 它将使用 “单声道 8 位带符号的类似 MIDI 的声音采样” + * 它将追随 Commodore 64,即“一个非网络化的简单机器,编程是目标,而不仅仅是达到目的的手段” + * 它将只支持一个文件系统(名为 “Red Sea”) + * 它将被限制在 10 万行代码内,以使它 “整体易于学习” + * “只支持 Ring-0 级,一切都在内核模式下运行,包括用户应用程序” + * 字体将被限制为 “一种 8×8 等宽字体” + * “对一切都可以完全访问。所有的内存、I/O 端口、指令和类似的东西都绝无限制。所有的函数、变量和类成员都是可访问的” + * 它将只支持一个平台,即 64 位 PC + +Terry 用一种他称之为 HolyC(神圣 C 语言)的编程语言编写了这个操作系统。TechRepublic 称其为一种 “C++ 的修改版(‘比 C 多,比 C++ 少’)”。如果你有兴趣了解 HolyC,我推荐 [这篇文章][4] 和 [RosettaCode][5] 上的 HolyC 条目。 + +2013 年,Terry 在他的网站上宣布,TempleOS 已经完成。不幸的是,几年后的 2018 年 8 月,Terry 被火车撞死了。当时他无家可归。多年来,许多人通过他在该操作系统上的工作关注着他。大多数人对他在如此小的体积中编写操作系统的能力印象深刻。 + +现在,你可能想知道这些关于 TempleOS 的讨论与 Shrine 有什么关系。好吧,正如 Shrine 的 [GitHub 页面][6] 所说,它是 “一个为异教徒设计的 TempleOS 发行版”。GitHub 用户 [minexew][7] 创建了 Shrine,为 TempleOS 添加 Terry 忽略的功能。这些功能包括: + + * 与 TempleOS 程序 99% 的兼容性 + * 带有 Lambda Shell,感觉有点像经典的 Unix 命令解释器 + * TCP/IP 协议栈和开机即可上网 + * 包括一个软件包下载器 + +minexew 正计划在未来增加更多的功能,但还没有宣布具体会包括什么。他有计划为 Linux 制作一个完整的 TempleOS 环境。 + +![video](https://youtu.be/UCgoxQCf5Jg) + +### 体验 + +让 Shrine 在虚拟机中运行是相当容易的。你所需要做的就是安装你选择的虚拟化软件。(我的是 VirtualBox)当你为 Shrine 创建一个虚拟机时,确保它是 64 位的,并且至少有 512MB 的内存。 + +一旦你启动到 Shrine,会询问你是否要安装到你的(虚拟)硬盘上。一旦安装完成(你也可以选择不安装),你会看到一个该操作系统的导览,你可以由此探索。 + +### 总结 + +TempleOS (和 Shrine)显然不是为了取代 Windows 或 Linux。即使 Terry 把它称为 “神之圣殿”,我相信在他比较清醒的时候,他也会承认这更像是一个业余的作业系统。考虑到这一点,已完成的产品相当 [令人印象深刻][8]。在 12 年的时间里,Terry 用他自己创造的语言创造了一个稍稍超过 10 万行代码的操作系统。他还编写了自己的编译器、图形库和几个游戏。所有这些都是在与他自己的个人心魔作斗争的时候进行的。 + +-------------------------------------------------------------------------------- + +via: https://itsfoss.com/shrine-os/ + +作者:[John Paul][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://itsfoss.com/author/john/ +[b]: https://github.com/lujun9972 +[1]: https://i2.wp.com/itsfoss.com/wp-content/uploads/2021/09/shrine.jpg?resize=800%2C600&ssl=1 +[2]: https://templeos.org/ +[3]: https://web.archive.org/web/20170508181026/http://www.templeos.org:80/Wb/Doc/Charter.html +[4]: https://harrisontotty.github.io/p/a-lang-design-analysis-of-holyc +[5]: https://rosettacode.org/wiki/Category:HolyC +[6]: https://github.com/minexew/Shrine +[7]: https://github.com/minexew +[8]: http://www.codersnotes.com/notes/a-constructive-look-at-templeos/ diff --git a/published/202109/20210906 Getting the Top Indicator Panel Back in GNOME.md b/published/202109/20210906 Getting the Top Indicator Panel Back in GNOME.md new file mode 100644 index 0000000000..784a213bb9 --- /dev/null +++ b/published/202109/20210906 Getting the Top Indicator Panel Back in GNOME.md @@ -0,0 +1,82 @@ +[#]: subject: "Getting the Top Indicator Panel Back in GNOME" +[#]: via: "https://itsfoss.com/enable-applet-indicator-gnome/" +[#]: author: "Abhishek Prakash https://itsfoss.com/author/abhishek/" +[#]: collector: "lujun9972" +[#]: translator: "imgradeone" +[#]: reviewer: "wxy" +[#]: publisher: "wxy" +[#]: url: "https://linux.cn/article-13785-1.html" + +恢复 GNOME 顶栏的托盘图标 +====== + +GNOME 是一款流行的 Linux 桌面环境,致力于为 Linux 用户提供现代化的桌面体验。 + +虽然这款桌面绝大部分功能都不错,但 GNOME 团队的某些决定确实也让许多用户恼火、质疑。 + +前脚不能在桌面摆放图标和文件,后脚将右键菜单中的 [新建文档选项移除][1],现在,除此之外,GNOME 同样也移除了托盘图标栏功能。 + +怎么说,你总得知道托盘图标栏是什么吧?这些小图标允许你使用相应应用程序的附加功能。我自己的 Ubuntu 系统里就有许多托盘图标。 + +![托盘图标栏][2] + +这一砍就砍出了大问题,尤其是针对那些完全依赖托盘图标的软件的致命打击。就拿 [Dropbox][3] 举例子吧,你只能通过 Dropbox 的托盘图标菜单来访问 Dropbox 的设置页面,很不幸,你在 GNOME 中就完全找不到这个图标。 + +这确实是个大问题,好在,我们还是有解决办法的。 + +### 借助插件来重新启用 GNOME 的托盘图标栏 + +如果你在用 GNOME,想必你已经知道 GNOME 插件是什么了。这些小插件基本上是由热心的独立开发者开发的。 + +如果你没有准备好,那么就去 [启用 GNOME 插件][4] 吧。这一步其实非常简单,使用 Chrome 或 Firefox 打开任意一个插件的页面,然后页面会提示你安装浏览器扩展。安装这个扩展,然后就可以启程了。 + +![启用 GNOME 插件的浏览器扩展][5] + +现在,有一些可以向顶栏增加托盘图标的 GNOME 插件。在撰写本篇教程的时候,[AppIndicator and KStatusNotifierItem Support][6] 这款插件在 GNOME 的较新版本中已经有良好的开发优化与支持。 + +前往插件的页面: + +- [AppIndicator 插件][6] + +在这个页面中,你应该能看到一个开关按钮。点击这个按钮即可安装该插件。 + +![][7] + +接下来会有一个弹窗,弹出后请点击“安装”。 + +![安装插件][8] + +也许安装插件后,插件不会立即生效。此时,你必须重启 GNOME。在 Xorg 会话中,你只需要按下 `Alt + F2` 并输入 `r` 即可重启 GNOME,但这个操作不支持 Wayland 会话。 + +注销当前会话,并且重新登录,此后托盘图标应该就能成功启用了。如果你安装了任何一款带托盘图标的软件,那么你应该可以在顶栏上看见这些图标的身影了。 + +于我而言,我已经安装了 Dropbox,因此托盘图标就直接出现在顶栏上了。 + +![Dropbox 托盘图标在 GNOME 下可用的截图][9] + +希望这个小技巧能帮助你恢复 GNOME 顶栏中的托盘图标。 + +我完全不理解,为什么 GNOME 的开发者会认为把这种实用性极强的功能删除会是个好主意。不过,上帝关上了一扇门,却(通常)会再打开一扇窗。好好享受按你的偏好运作的 GNOME 吧。 + +-------------------------------------------------------------------------------- + +via: https://itsfoss.com/enable-applet-indicator-gnome/ + +作者:[Abhishek Prakash][a] +选题:[lujun9972][b] +译者:[imgradeone](https://github.com/imgradeone) +校对:[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/add-new-document-option/ +[2]: https://itsfoss.com/wp-content/uploads/2021/09/indicator-applet-linux.webp +[3]: https://www.dropbox.com +[4]: https://itsfoss.com/gnome-shell-extensions/ +[5]: https://itsfoss.com/wp-content/uploads/2021/09/installing-gnome-extension-add-on-800x355.webp +[6]: https://extensions.gnome.org/extension/615/appindicator-support/ +[7]: https://itsfoss.com/wp-content/uploads/2021/09/appindicator-extension-800x329.webp +[8]: https://i2.wp.com/itsfoss.com/wp-content/uploads/2021/09/installing-appindicator-extension.png?resize=800%2C269&ssl=1 +[9]: https://itsfoss.com/wp-content/uploads/2021/09/gnome-dropbox-indicator-800x561.webp diff --git a/published/202109/20210906 Resize an image from the Linux terminal.md b/published/202109/20210906 Resize an image from the Linux terminal.md new file mode 100644 index 0000000000..c3438f6d0e --- /dev/null +++ b/published/202109/20210906 Resize an image from the Linux terminal.md @@ -0,0 +1,77 @@ +[#]: subject: "Resize an image from the Linux terminal" +[#]: via: "https://opensource.com/article/21/9/resize-image-linux" +[#]: author: "Jim Hall https://opensource.com/users/jim-hall" +[#]: collector: "lujun9972" +[#]: translator: "geekpi" +[#]: reviewer: "wxy" +[#]: publisher: "wxy" +[#]: url: "https://linux.cn/article-13779-1.html" + +在 Linux 终端调整图像的大小 +====== + +> 用 ImageMagick 的转换命令从你的终端缩放一张图像。 + +![](https://img.linux.net.cn/data/attachment/album/202109/12/235041ohsppv1hg1m26y1m.jpg) + +ImageMagick 是一个方便的多用途命令行工具,它能满足你所有的图像需求。ImageMagick 支持各种图像类型,包括 JPG 照片和 PNG 图形。 + +### 调整图像大小 + +我经常在我的 Web 服务器上使用 ImageMagick 来调整图像大小。例如,假设我想在我的个人网站上发一张我的猫的照片。我手机里的照片非常大,大约 4000x3000 像素,有 3.3MB。这对一个网页来说太大了。我使用 ImageMagick 转换工具来改变照片的大小,这样我就可以把它放在我的网页上。ImageMagick 是一套完整的工具,其中最常用的是 `convert` 命令。 + +ImageMagick 的 `convert` 命令使用这样的一般语法: + +``` +convert {input} {actions} {output} +``` + +要将一张名为 `PXL_20210413_015045733.jpg` 的照片调整到一个更容易管理的 500 像素宽度,请输入: + +``` +$ convert PXL_20210413_015045733.jpg -resize 500x sleeping-cats.jpg +``` + +现在新图片的大小只有 65KB。 + +![Sleeping cats][2] + +你可以用 `-resize` 选项同时提供宽度和高度尺寸。但是,如果只提供宽度,ImageMagic 就会为你做计算,并通过调整输出图像的高度比例来自动保留长宽比。 + +### 在 Linux 上安装 ImageMagick + +在 Linux 上,你可以使用你的包管理器安装 ImageMagick。例如,在 Fedora 或类似系统上: + +``` +$ sudo dnf install imagemagick +``` + +在 Debian 和类似系统上: + +``` +$ sudo apt install imagemagick +``` + +在 macOS 上,使用 [MacPorts][4] 或 [Homebrew][5]。 + +在 Windows 上,使用 [Chocolatey][6] 即可。 + +-------------------------------------------------------------------------------- + +via: https://opensource.com/article/21/9/resize-image-linux + +作者:[Jim Hall][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/jim-hall +[b]: https://github.com/lujun9972 +[1]: https://opensource.com/sites/default/files/styles/image-full-size/public/lead-images/osdc-photo-camera-blue.png?itok=AsIMZ9ga (Old camera blue) +[2]: https://opensource.com/sites/default/files/sleeping-cats.jpg (Sleeping cats) +[3]: https://creativecommons.org/licenses/by-sa/4.0/ +[4]: https://opensource.com/article/20/11/macports +[5]: https://opensource.com/article/20/6/homebrew-mac +[6]: https://opensource.com/article/20/3/chocolatey diff --git a/published/202109/20210907 How to Stop a Program in Linux Terminal.md b/published/202109/20210907 How to Stop a Program in Linux Terminal.md new file mode 100644 index 0000000000..e9856a16c0 --- /dev/null +++ b/published/202109/20210907 How to Stop a Program in Linux Terminal.md @@ -0,0 +1,92 @@ +[#]: subject: "How to Stop a Program in Linux Terminal" +[#]: via: "https://itsfoss.com/stop-program-linux-terminal/" +[#]: author: "Abhishek Prakash https://itsfoss.com/author/abhishek/" +[#]: collector: "lujun9972" +[#]: translator: "geekpi" +[#]: reviewer: "wxy" +[#]: publisher: "wxy" +[#]: url: "https://linux.cn/article-13783-1.html" + +如何在 Linux 终端中退出一个程序 +====== + +![](https://img.linux.net.cn/data/attachment/album/202109/14/112410p18i9dsj813i1j4p.jpg) + +有趣的是,当你刚接触一些东西时,最简单的事情也会变得复杂。 + +有一天,我发现我的朋友搞不清楚如何退出 `top` 命令。他没有中止这个命令,而是关闭了整个终端程序。 + +这不仅是不必要的,而且是一件不好的事情。 + +### 在 Linux 里中止程序 + +在 Linux 中,你可以使用 `Ctrl+C` 键来中止终端中的运行程序。这对 Ubuntu 和其他 Linux 发行版都适用。 + +以 `ping` 命令为例。如果你不中止它,它将持续显示结果。 + +按住 `Ctrl` 键并同时按下 `C` 键。它向正在运行的程序发送 [SIGINT 信号][1]以强制退出该命令。 + +![Stopping a program in the Linux terminal][2] + +你看到 `^C` 了吗?这个插入符号(`^`)代表 `Ctrl`。所以基本上,终端将 `Ctrl+C` 的按键显示为 `^C`。 + +`Ctrl+C` 对于那些被设计为持续运行直到被打断的命令非常有效。你觉得你需要取消命令,就用 `Ctrl+C`。 + +在一个更复杂的方法中,你可以 [找到进程 ID 并杀死一个正在运行的进程][3]。这是更高级的东西,只有进程在后台或由其他用户运行或在另一个终端窗口运行时使用。 + +除此以外,还有一些其他的命令和命令行工具也有自己的退出命令。让我在这里简单地提一下其中的一些。 + +#### 如何退出 Vim 编辑器 + +[退出 Vim 编辑器][4] 在 Linux 世界里闹出了很多笑话。当你刚接触这个强大的基于命令行的文本编辑器时,是很难搞清楚的。在几种退出 `vim` 的方法中,最常见的是按 `Esc` 键,然后输入冒号(`:`),再输入 `q!` 表示不保存而强制退出,或者 `wq` 表示保存并退出。 + +![][5] + +#### 如何退出 Nano 编辑器 + +退出 [Nano 编辑器][6]比退出 Vim 要简单一些。为什么?因为 Nano 在底部有快捷方式。如果你是新手,你可能不明白,但至少你下次就能搞清楚了。 + +要退出 Nano,按 `Ctrl+X`。它将询问你是否要保存对文件所做的修改。你可以输入你的选择。 + +![][7] + +#### 如何退出 less 命令 + +`less` 是一个奇妙的命令,它可以让你在不像 `cat` 命令那样杂乱的终端屏幕上进行查看。如果你在 `less` 命令的视图内,使用 `q` 键来退出 `less`。 + +#### 如何退出终端 + +要退出终端本身,不是关闭终端,而是使用 `Ctrl+D` 键盘快捷键或输入退出命令: + +``` +exit +``` + +这实际上是让你从当前的 shell 中退出。当你[在 Ubuntu 或其他发行版中打开一个终端][8],它会运行默认的 shell。当你从这个 shell 退出时,终端也会结束。`Ctrl+D` 是做同样事情的快捷方式,并退出终端。 + +我希望你觉得这个快速教程对你有帮助。我强烈建议你学习这些 [Linux 命令技巧][9]。 + +有问题或建议?请在下面留下评论。 + +-------------------------------------------------------------------------------- + +via: https://itsfoss.com/stop-program-linux-terminal/ + +作者:[Abhishek Prakash][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/abhishek/ +[b]: https://github.com/lujun9972 +[1]: https://linuxhandbook.com/sigterm-vs-sigkill/#what-is-sigkill +[2]: https://i2.wp.com/itsfoss.com/wp-content/uploads/2021/09/stop-a-program-linux-terminal.png?resize=800%2C373&ssl=1 +[3]: https://itsfoss.com/how-to-find-the-process-id-of-a-program-and-kill-it-quick-tip/ +[4]: https://itsfoss.com/how-to-exit-vim/ +[5]: https://i2.wp.com/itsfoss.com/wp-content/uploads/2017/05/how-to-exit-vim.png?resize=737%2C422&ssl=1 +[6]: https://itsfoss.com/nano-editor-guide/ +[7]: https://i1.wp.com/itsfoss.com/wp-content/uploads/2020/05/nano-editor-save-and-exit.png?resize=799%2C503&ssl=1 +[8]: https://itsfoss.com/open-terminal-ubuntu/ +[9]: https://itsfoss.com/linux-command-tricks/ \ No newline at end of file diff --git a/published/202109/20210907 OpenWrt 21.02 Arrives With Linux Kernel 5.4 - WPA3 Support.md b/published/202109/20210907 OpenWrt 21.02 Arrives With Linux Kernel 5.4 - WPA3 Support.md new file mode 100644 index 0000000000..d0e2b53289 --- /dev/null +++ b/published/202109/20210907 OpenWrt 21.02 Arrives With Linux Kernel 5.4 - WPA3 Support.md @@ -0,0 +1,92 @@ +[#]: subject: "OpenWrt 21.02 Arrives With Linux Kernel 5.4 & WPA3 Support" +[#]: via: "https://news.itsfoss.com/openwrt-21-02-release/" +[#]: author: "Rishabh Moharir https://news.itsfoss.com/author/rishabh/" +[#]: collector: "lujun9972" +[#]: translator: "wxy" +[#]: reviewer: "wxy" +[#]: publisher: "wxy" +[#]: url: "https://linux.cn/article-13763-1.html" + +OpenWrt 21.02 发布,支持 Linux 内核 5.4 和 WPA3 +====== + +![](https://i2.wp.com/news.itsfoss.com/wp-content/uploads/2021/09/OpenWrt-21.02.jpg?w=1200&ssl=1) + +OpenWrt 社区宣布了该发行版的最新稳定版本:OpenWrt 21.02。 + +补充一句,OpenWrt 是一个帮助你创建嵌入式设备定制操作系统的项目。 + +它使用户能够根据他们的网络需求公开定制他们的设备,这是市面上销售的路由器的固件所没有的功能。除了路由器之外,OpenWrt 还可以在各种设备上运行,如智能手机、住宅网关,甚至是 32 位的个人电脑。 + +自从旧的 OpenWrt 19.07 以来,这个版本的发布带来了超过 5800 个新提交。 + +让我们来看看 OpenWrt 21.02 有哪些新功能。 + +### OpenWrt 21.02 有什么新内容? + +虽然有一些技术上的变化和改进,但让我强调一下主要的新增内容。 + +#### WPA3 支持 + +虽然在 19.07 版本中就已经存在,但这个最新的 Wi-Fi 网络安全标准现在已默认包含在镜像中了。 + +WPA3 的意思是Wi-Fi 受保护接入第三版Wi-Fi Protected Access 3,与流行的 WPA2 相比,在安全方面有很大的改进,也向后兼容。 + +#### TLS 和 HTTPS 支持 + +就像 WPA3 一样,它也默认包括了 TLS 和 HTTPS 支持,并且带有来自 Mozilla 的可信 CA 证书。 + +有了这个支持,无需其它工作,`wget` 和 ` opkg` 现在可以通过 HTTPS 获取资源了。此外,除了 HTTP 之外,[LuCl][1] 也可以通过 HTTPS 获得。 + +#### 初步的 DSA 支持 + +正如其发布公告中所说: + +> “DSA(分布式交换机架构Distributed Switch Architecture)是关于可配置的以太网交换机的 Linux 标准。” + +这取代了直到现在还在使用的 `swconfig` 系统,是对 VLAN 和交换机端口管理方式的一个明显变化。 + +#### 新的最低硬件要求 + +随着 OpenWrt 的众多新功能和更新,以及 Linux 内核的大小的普遍增加,其最低硬件要求也被提高。 + +现在设备需要至少 8MB 的闪存和 64MB 的内存来运行默认的构建版本,以确保适当的稳定性。 + +#### 软件包更新 + +该版本还包含了几个软件包的升级,其中一些是: + + * Linux 内核 5.4.143 + * gcc 8.4.0 + * glibc 2.33 + * binutils 2.34 + * busybox 1.33.1 + +除了上述列出的软件包,还有许多其他软件包也得到了升级。你可以在 [官方发布公告][2] 中了解完整的技术细节。 + +### 下载 OpenWrt 21.02 + +你可以前往其官方网站下载最新的稳定版,或者选择开发快照进行实验。 + +构建自己的软件包和固件的说明应该可以在其文档中找到。 + +可以使用 `sysupgrade` 命令将你的系统从 OpenWrt 19.07 升级到 OpenWrt 21.02。请注意,你无法从 18.06 升级。 + +- [OpenWrt 21.02][3] + +-------------------------------------------------------------------------------- + +via: https://news.itsfoss.com/openwrt-21-02-release/ + +作者:[Rishabh Moharir][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://news.itsfoss.com/author/rishabh/ +[b]: https://github.com/lujun9972 +[1]: https://openwrt.org/docs/techref/luci +[2]: https://openwrt.org/releases/21.02/notes-21.02.0 +[3]: https://openwrt.org/downloads diff --git a/published/202109/20210907 Run Web Applications in Linux Using Tangram Browser.md b/published/202109/20210907 Run Web Applications in Linux Using Tangram Browser.md new file mode 100644 index 0000000000..3d22db8010 --- /dev/null +++ b/published/202109/20210907 Run Web Applications in Linux Using Tangram Browser.md @@ -0,0 +1,92 @@ +[#]: subject: "Run Web Applications in Linux Using Tangram Browser" +[#]: via: "https://itsfoss.com/tangram/" +[#]: author: "Ankush Das https://itsfoss.com/author/ankush/" +[#]: collector: "lujun9972" +[#]: translator: "anine09" +[#]: reviewer: "wxy" +[#]: publisher: "wxy" +[#]: url: "https://linux.cn/article-13777-1.html" + +使用 Tangram 浏览器在 Linux 中运行 Web 应用 +======= + +> Tangram 是一个旨在帮助你在 Linux 中运行和管理 Web 应用的浏览器。一起来看看它是如何使用的吧。 + +对于一些工具来说,即使我们有许多 Linux 原生应用,但是许多人最终还是选择使用 Web 应用。 + +他们也许是使用 Electron 构建的应用,或是直接在浏览器中打开的网页,使用原生应用正在成为一种比较“传统”的做法。 + +当然,不管在什么平台运行 Web 应用都会占用更多的系统资源。而且,考虑到每一个服务都正在提供基于 Web 的方式,而不是原生体验,我们就需要一种有效管理 Web 应用的解决方案。 + +一款开源的 Linux 应用 Tangram 或许就是这个解决方案。 + +### Tangram:专为 Web 应用设计的浏览器 + +![][1] + +你可以选择其他 [优秀的浏览器][2] 来运行 Web 应用,但是如果你想完全专注于 Web 应用体验的浏览器,Tangram 是个不错的选择。 + +Tangram 的开发者从 GNOME Web、[Franz][3] 和 [Rambox][4] 中获得了灵感。 + +没有其他花里胡哨的功能,只是能更改你的用户代理User Agent和管理你所登录的 Web 应用。 + +它可以用于访问多个社交媒体,聊天工具,工作协同应用等等。 + +### Tangram 的特性 + +![][5] + +考虑到 Tangram 是一个基于 WebKitGTK 的精简化浏览器,它拥有的功能不算很多,下面是一些功能要点: + + * 重新排列侧边栏的标签 + * 方便地将任何一个 Web 服务添加为 Web 应用程序 + * 调整用户代理(桌面端和移动端) + * 使用键盘快捷键 + * 改变侧边栏(标签栏)的位置 + +你所需要做的就是加载一个 Web 服务,登录,然后点击“完成”,将其添加为 Web 应用程序。 + +![][6] + +### 在 Linux 中安装 Tangram + +每个 Linux 发行版都可以通过 Flatpak 来安装 Tangram,你也可以在 [AUR][7] 中找到它。 + +如果你想通过终端来安装它,输入以下命令: + +``` +flatpak install flathub re.sonny.Tangram +``` + +如果你的系统没有启用 Flatpak,你可以参考我们的 [Flatpak 指南][8]。 + +想要了解更多信息,请访问 [Tangram 的 Github 页面][9]。 + +- [Tangram Browser][10] + +你试过 Tangram 吗?你更喜欢 Web 应用还是原生应用?欢迎在下面的评论中分享你的想法。 + +-------------------------------------------------------------------------------- + +via: https://itsfoss.com/tangram/ + +作者:[Ankush Das][a] +选题:[lujun9972][b] +译者:[anine09](https://github.com/anine09) +校对:[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://i2.wp.com/itsfoss.com/wp-content/uploads/2021/09/tangram-web-app-browser.png?resize=800%2C611&ssl=1 +[2]: https://itsfoss.com/best-browsers-ubuntu-linux/ +[3]: https://itsfoss.com/franz-messaging-app/ +[4]: https://itsfoss.com/rambox/ +[5]: https://i0.wp.com/itsfoss.com/wp-content/uploads/2021/09/tangram-settings.png?resize=530%2C290&ssl=1 +[6]: https://i2.wp.com/itsfoss.com/wp-content/uploads/2021/09/tangram-web-app-whatsapp.png?resize=800%2C431&ssl=1 +[7]: https://itsfoss.com/aur-arch-linux/ + +[8]: https://itsfoss.com/flatpak-guide/ +[9]: https://github.com/sonnyp/Tangram +[10]: https://flathub.org/apps/details/re.sonny.Tangram diff --git a/published/202109/20210907 Use lspci on Linux to see your hardware.md b/published/202109/20210907 Use lspci on Linux to see your hardware.md new file mode 100644 index 0000000000..1e0d130b60 --- /dev/null +++ b/published/202109/20210907 Use lspci on Linux to see your hardware.md @@ -0,0 +1,150 @@ +[#]: subject: "Use lspci on Linux to see your hardware" +[#]: via: "https://opensource.com/article/21/9/lspci-linux-hardware" +[#]: author: "Alan Formy-Duval https://opensource.com/users/alanfdoss" +[#]: collector: "lujun9972" +[#]: translator: "unigeorge" +[#]: reviewer: "turbokernel" +[#]: publisher: "wxy" +[#]: url: "https://linux.cn/article-13793-1.html" + +在 Linux 上使用 lspci 命令查看硬件情况 +====== + +> lspci 命令用于显示 Linux 系统上的设备和驱动程序。 + +![](https://img.linux.net.cn/data/attachment/album/202109/17/091425l7c8au5c865x7q68.jpg) + +当你在个人电脑或服务器上运行 Linux 时,有时需要识别该系统中的硬件。`lspci` 命令用于显示连接到 PCI 总线的所有设备,从而满足上述需求。该命令由 [pciutils][2] 包提供,可用于各种基于 Linux 和 BSD 的操作系统。 + +### 基础用法 + +由于访问权限,普通用户运行 `lspci` 时显示的信息可能会受限,因此可以使用 `sudo` 运行命令,系统会给出完整的信息图。 + +直接运行 `lspci` 命令会列出 PCI 总线及其连接的设备,下图是在我的媒体中心 PC 上的演示样例。图中是一个基于 AMD Phenom CPU 的系统,所以它有一个 AMD 芯片组,以及 Atheros 无线适配器和 Nvidia 显卡。所有硬件设备都列出了详细信息,例如供应商、名称和型号等: + +``` +$ sudo lspci +00:00.0 Host bridge: Advanced Micro Devices, Inc. [AMD] RS880 Host Bridge +00:02.0 PCI bridge: Advanced Micro Devices, Inc. [AMD] RS780 PCI to PCI bridge (ext gfx port 0) +00:04.0 PCI bridge: Advanced Micro Devices, Inc. [AMD] RS780/RS880 PCI to PCI bridge (PCIE port 0) +00:05.0 PCI bridge: Advanced Micro Devices, Inc. [AMD] RS780/RS880 PCI to PCI bridge (PCIE port 1) +00:11.0 SATA controller: Advanced Micro Devices, Inc. [AMD/ATI] SB7x0/SB8x0/SB9x0 SATA Controller [AHCI mode] +00:12.0 USB controller: Advanced Micro Devices, Inc. [AMD/ATI] SB7x0/SB8x0/SB9x0 USB OHCI0 Controller +00:12.1 USB controller: Advanced Micro Devices, Inc. [AMD/ATI] SB7x0 USB OHCI1 Controller +00:12.2 USB controller: Advanced Micro Devices, Inc. [AMD/ATI] SB7x0/SB8x0/SB9x0 USB EHCI Controller +00:13.0 USB controller: Advanced Micro Devices, Inc. [AMD/ATI] SB7x0/SB8x0/SB9x0 USB OHCI0 Controller +00:13.1 USB controller: Advanced Micro Devices, Inc. [AMD/ATI] SB7x0 USB OHCI1 Controller +00:13.2 USB controller: Advanced Micro Devices, Inc. [AMD/ATI] SB7x0/SB8x0/SB9x0 USB EHCI Controller +00:14.0 SMBus: Advanced Micro Devices, Inc. [AMD/ATI] SBx00 SMBus Controller (rev 3c) +00:14.1 IDE interface: Advanced Micro Devices, Inc. [AMD/ATI] SB7x0/SB8x0/SB9x0 IDE Controller +00:14.3 ISA bridge: Advanced Micro Devices, Inc. [AMD/ATI] SB7x0/SB8x0/SB9x0 LPC host controller +00:14.4 PCI bridge: Advanced Micro Devices, Inc. [AMD/ATI] SBx00 PCI to PCI Bridge +00:14.5 USB controller: Advanced Micro Devices, Inc. [AMD/ATI] SB7x0/SB8x0/SB9x0 USB OHCI2 Controller +00:18.0 Host bridge: Advanced Micro Devices, Inc. [AMD] Family 10h Processor HyperTransport Configuration +00:18.1 Host bridge: Advanced Micro Devices, Inc. [AMD] Family 10h Processor Address Map +00:18.2 Host bridge: Advanced Micro Devices, Inc. [AMD] Family 10h Processor DRAM Controller +00:18.3 Host bridge: Advanced Micro Devices, Inc. [AMD] Family 10h Processor Miscellaneous Control +00:18.4 Host bridge: Advanced Micro Devices, Inc. [AMD] Family 10h Processor Link Control +01:00.0 VGA compatible controller: NVIDIA Corporation GK107 [GeForce GTX 650] (rev a1) +01:00.1 Audio device: NVIDIA Corporation GK107 HDMI Audio Controller (rev a1) +02:00.0 Network controller: Qualcomm Atheros AR9287 Wireless Network Adapter (PCI-Express) (rev 01) +``` + +### 详细输出 + +添加 `-v` 选项会显示每个设备的详细信息,你可以使用 `-vv` 或 `-vvv` 来获取更多的设备细节。在 `-v` 级别,`lspci` 会显示所有设备的各种子系统和内存地址、中断请求(IRQ)编号和一些其他功能信息。输出信息会非常长。在你的系统上试一试吧。 + +### 使用 grep 过滤搜索 + +你可能会需要缩小搜索范围。例如,RPM Fusion 网站有安装 Nvidia 图形驱动程序的说明,里面就首先使用了 `grep` 命令来定位显卡信息。下面是我在笔记本电脑上得到的输出: + +``` +$ sudo lspci | grep -e VGA +00:02.0 VGA compatible controller: Intel Corporation UHD Graphics 620 (rev 07) +$ sudo lspci | grep -e 3D +01:00.0 3D controller: NVIDIA Corporation GM108M [GeForce MX130] (rev a2) +``` + +下面(LCTT 译注:原文为 “above”,应为作者笔误)的 `grep` 命令在我的媒体中心 PC 上定位了一个 VGA 设备,但没有显示 3D 设备。 + +``` +$ sudo lspci | grep -e VGA +01:00.0 VGA compatible controller: NVIDIA Corporation GK107 [GeForce GTX 650] (rev a1) +$ sudo lspci | grep -e 3D +$ +``` + +### 按供应商 ID 搜索 + +还有另一种无需 `grep` 的方法可以使用。假设我想确认一下此计算机是否有其他的 Nvidia 设备,在此之前我们还需要一些额外信息,使用 `-nn` 选项显示的供应商和设备 ID 号。在我的媒体中心 PC 上,此选项会给出我的 VGA 卡、供应商 ID 和设备 ID: + +``` +$ sudo lspci -nn | grep -e VGA +01:00.0 VGA compatible controller [0300]: NVIDIA Corporation GK107 [GeForce GTX 650] [10de:0fc6] (rev a1) +``` + +设备名称后的方括号内有用冒号分隔的数字,即供应商和设备 ID。输出表明 Nvidia Corporation 制造的设备的供应商 ID 为 `10de`。 + +`-d` 选项用于指定供应商、设备或类 ID 的所有设备。以下是我系统中的所有 Nvidia 设备(保留 `-nn` 以解析供应商 ID): + +``` +$ sudo lspci -nn -d 10de: +01:00.0 VGA compatible controller [0300]: NVIDIA Corporation GK107 [GeForce GTX 650] [10de:0fc6] (rev a1) +01:00.1 Audio device [0403]: NVIDIA Corporation GK107 HDMI Audio Controller [10de:0e1b] (rev a1) +``` + +从输出中可以看到,除了显卡之外,我还有一个 Nvidia 音频设备。实际上它们都属于同一张 **Nvidia GeForce GTX 650** 卡,但这仍然是一个很好的示例。 + +### 内核模块 + +结合 PCI 硬件设备,`lspci` 可以使用 `-k` 选项显示内核加载了哪些驱动程序模块。我将此选项添加到我的 `lspci` 命令来查看有关我的 Nvidia 设备的信息。 + +``` +$ sudo lspci -nn -k -d 10de: +01:00.0 VGA compatible controller [0300]: NVIDIA Corporation GK107 [GeForce GTX 650] [10de:0fc6] (rev a1) + Subsystem: eVga.com. Corp. GK107 [GeForce GTX 650] [3842:2650] + Kernel driver in use: nvidia + Kernel modules: nvidiafb, nouveau, nvidia_drm, nvidia +01:00.1 Audio device [0403]: NVIDIA Corporation GK107 HDMI Audio Controller [10de:0e1b] (rev a1) + Subsystem: eVga.com. Corp. GK107 HDMI Audio Controller [3842:2650] + Kernel driver in use: snd_hda_intel + Kernel modules: snd_hda_intel +``` + +可以看到额外显示了两行:正在使用的内核驱动程序Kernel driver in use内核模块Kernel modules,其中后者列出了可用于支持该设备的模块。 + +### 同步最新状态 + +新设备和供应商总是在不断迭代。如果看到显示为 `unknown` 的设备,说明你的 PCI 设备 ID 数据库可能已过时。有两种方法可以检查更新。`-Q` 选项会使用 DNS 查询中央数据库,当然,这需要联网。 + +``` +$ sudo lspci -Q +``` + +你还可以通过运行命令 `update-pciids` 来更新本地 PCI ID 数据库。 + +``` +$ sudo update-pciids +Downloaded daily snapshot dated 2021-08-22 03:15:01 +``` + +### 了解有关你的硬件的更多信息 + +当然,`lspci` 只是 Linux 中用于查询系统硬件和软件的诸多命令之一。读者可以在阅读关于 USB 设备的文章,了解有关 Linux 硬件的更多信息:[使用此 USB ID 存储库识别 Linux 上的更多设备][3]。 + +-------------------------------------------------------------------------------- + +via: https://opensource.com/article/21/9/lspci-linux-hardware + +作者:[Alan Formy-Duval][a] +选题:[lujun9972][b] +译者:[unigeorge](https://github.com/unigeorge) +校对:[turbokernel](https://github.com/turbokernel) + +本文由 [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/features_solutions_command_data.png?itok=4_VQN3RK (computer screen ) +[2]: https://mj.ucw.cz/sw/pciutils/ +[3]: https://opensource.com/article/20/8/usb-id-repository diff --git a/published/202109/20210908 Apps for daily needs part 5- video editors.md b/published/202109/20210908 Apps for daily needs part 5- video editors.md new file mode 100644 index 0000000000..b8fdeceee1 --- /dev/null +++ b/published/202109/20210908 Apps for daily needs part 5- video editors.md @@ -0,0 +1,78 @@ +[#]: subject: "Apps for daily needs part 5: video editors" +[#]: via: "https://fedoramagazine.org/apps-for-daily-needs-part-5-video-editors/" +[#]: author: "Arman Arisman https://fedoramagazine.org/author/armanwu/" +[#]: collector: "lujun9972" +[#]: translator: "wxy" +[#]: reviewer: "wxy" +[#]: publisher: "wxy" +[#]: url: "https://linux.cn/article-13808-1.html" + +满足日常需求的应用(五):视频编辑器 +====== + +![][1] + +视频编辑已经成为一种流行的活动。人们出于各种原因需要视频编辑,不管是工作、教育或仅仅是一种爱好。现在也有很多平台可以在互联网上分享视频,以及几乎所有的社交媒体和聊天工具都提供分享视频的功能。本文将介绍一些你可以在 Fedora Linux 上使用的开源视频编辑器。你可能需要安装提到的这些软件才能使用。如果你不熟悉如何在 Fedora Linux 中添加软件包,请参阅我之前的文章《[安装 Fedora 34 工作站后要做的事情][4]》。这里列出了视频编辑器类别的一些日常需求的应用程序。 + +### Kdenlive + +当有人问起 Linux 上的开源视频编辑器时,经常出现的答案是 Kdenlive。它是一个在开源用户群体中非常流行的视频编辑器。这是因为它的功能对于一般用途来说是足够的,而且对于非专业人士的人来说也很容易使用。 + +Kdenlive 支持多轨编辑,因此你可以将多个来源的音频、视频、图像和文本结合起来。这个应用程序还支持各种视频和音频格式,这样你就不必事先转换它们。此外,Kdenlive 提供了各种各样的效果和转场,以支持你的创造力来制作很酷的视频。Kdenlive 提供的一些功能有:用于创建 2D 字幕的字幕器、音频和视频范围、代理编辑、时间线预览、关键帧效果等等。 + +![][5] + +更多信息可在此链接中获得: + +### Shotcut + +Shotcut 与 Kdenlive 的功能大致相同。这个应用程序是一个通用的视频编辑器。它有一个相当简单的界面,但功能齐全,可以满足你视频编辑工作的各种需要。 + +Shotcut 拥有一套完整视频编辑功能,提供了从简单的编辑到高级的功能。它还支持各种视频、音频和图像格式。你不需要担心你的编辑历史,因为这个应用程序有无限的撤销和重做功能。Shotcut 还提供了各种视频和音频效果,因此你可以自由地创造性地制作你的视频作品。它提供的一些功能有:音频过滤器、音频混合、交叉淡化的音视频溶解过渡、音调发生器、速度变化、视频合成、3 路色轮、轨道合成/混合模式、视频过滤器等。 + +![][6] + +更多信息可在此链接中获得: + +### Pitivi + +如果你想要一个具有直观和简洁用户界面的视频编辑器,Pitivi 将是正确的选择。你会对它的外观感到舒适,并且不难找到你需要的功能。这个应用程序被归类为非常容易学习,特别是如果你需要一个用于简单编辑需求的应用程序时。然而,Pitivi 仍然提供了种种功能,如修剪 & 切割、混音、关键帧音频效果、音频波形、音量关键帧曲线、视频过渡等。 + +![][7] + +更多信息可在此链接中获得: + +### Cinelerra + +Cinelerra 是一个已经开发了很久的视频编辑器。它为你的视频工作提供了大量的功能,如内置帧渲染、各种视频效果、无限的层、8K 支持、多相机支持、视频音频同步、渲染农场、动态图形、实时预览等。这个应用程序可能不适合那些刚开始学习的人。我认为你需要一段时间来适应这个界面,特别是如果你已经熟悉了其他流行的视频编辑应用程序。但 Cinelerra 仍是一个有趣的选择,可以作为你的视频编辑器。 + +![][8] + +更多信息请见此链接: + +### 总结 + +这篇文章介绍了四个在 Fedora Linux 上可用的视频编辑器应用,以满足你的日常需求。实际上,在 Fedora Linux 上还有很多其他的视频编辑器可以使用。你也可以使用 Olive(Fedora Linux 仓库)、 OpenShot(rpmfusion-free)、Flowblade(rpmfusion-free)等等。每个视频编辑器都有自己的优势。有些在纠正颜色方面比较好,而有些在各种转场和效果方面比较好。当涉及到如何轻松地添加文本时,有些则更好。请选择适合你需求的应用程序。希望这篇文章可以帮助你选择正确的视频编辑。如果你有使用这些应用程序的经验,请在评论中分享你的经验。 + +-------------------------------------------------------------------------------- + +via: https://fedoramagazine.org/apps-for-daily-needs-part-5-video-editors/ + +作者:[Arman Arisman][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://fedoramagazine.org/author/armanwu/ +[b]: https://github.com/lujun9972 +[1]: https://fedoramagazine.org/wp-content/uploads/2021/08/FedoraMagz-Apps-5-video-816x345.jpg +[2]: https://unsplash.com/@brookecagle?utm_source=unsplash&utm_medium=referral&utm_content=creditCopyText +[3]: https://unsplash.com/s/photos/meeting-on-cafe-computer?utm_source=unsplash&utm_medium=referral&utm_content=creditCopyText +[4]: https://fedoramagazine.org/things-to-do-after-installing-fedora-34-workstation/ +[5]: https://fedoramagazine.org/wp-content/uploads/2021/08/video-kdenlive-1024x576.png +[6]: https://fedoramagazine.org/wp-content/uploads/2021/08/video-shotcut-1024x576.png +[7]: https://fedoramagazine.org/wp-content/uploads/2021/08/video-pitivi-1024x576.png +[8]: https://fedoramagazine.org/wp-content/uploads/2021/08/video-cinelerra-1024x576.png +[9]: https://www.olivevideoeditor.org/ diff --git a/published/202109/20210908 Debug a web page error from the command line.md b/published/202109/20210908 Debug a web page error from the command line.md new file mode 100644 index 0000000000..a720798e24 --- /dev/null +++ b/published/202109/20210908 Debug a web page error from the command line.md @@ -0,0 +1,80 @@ +[#]: subject: "Debug a web page error from the command line" +[#]: via: "https://opensource.com/article/21/9/wget-debug-web-server" +[#]: author: "Jim Hall https://opensource.com/users/jim-hall" +[#]: collector: "lujun9972" +[#]: translator: "geekpi" +[#]: reviewer: "wxy" +[#]: publisher: "wxy" +[#]: url: "https://linux.cn/article-13795-1.html" + +从命令行使用 wget 调试网页错误 +====== + +> 调试 Web 服务器的一种方法是使用 wget 命令行程序。 + +![](https://img.linux.net.cn/data/attachment/album/202109/17/225018elcip4pii4qcknir.jpg) + +有时在管理一个网站时,事情会被搞得一团糟。你可能会删除一些陈旧的内容,用重定向到其他页面来代替。后来,在做了其他改动后,你发现一些网页变得完全无法访问了。你可能会在浏览器中看到一个错误:“该页面没有正确重定向”,并建议你检查你的 cookie。 + +![Redirect loop example in Firefox][2] + +调试这种情况的一个方法是使用 `wget` 命令行程序,使用 `-S` 选项来显示所有的服务器响应。当使用 `wget` 进行调试时,我也喜欢使用 `-O` 选项将输出保存到一些临时文件中,以备以后需要查看其内容。 + +``` +$ wget -O /tmp/test.html -S http://10.0.0.11/announce/ +--2021-08-24 17:09:49-- http://10.0.0.11/announce/ +Connecting to 10.0.0.11:80... connected. + +HTTP request sent, awaiting response... + +HTTP/1.1 302 Found +Date: Tue, 24 Aug 2021 22:09:49 GMT +Server: Apache/2.4.48 (Fedora) +X-Powered-By: PHP/7.4.21 +Location: http://10.0.0.11/assets/ +Content-Length: 0 +Keep-Alive: timeout=5, max=100 +Connection: Keep-Alive +Content-Type: text/html; charset=UTF-8 +Location: http://10.0.0.11/assets/ [following] +--2021-08-24 17:09:49-- http://10.0.0.11/assets/ +Reusing existing connection to 10.0.0.11:80. + +HTTP request sent, awaiting response... + +HTTP/1.1 302 Found +Date: Tue, 24 Aug 2021 22:09:49 GMT +Server: Apache/2.4.48 (Fedora) +X-Powered-By: PHP/7.4.21 +Location: http://10.0.0.11/announce/ +Content-Length: 0 +Keep-Alive: timeout=5, max=99 +Connection: Keep-Alive +Content-Type: text/html; charset=UTF-8 +Location: http://10.0.0.11/announce/ [following] +--2021-08-24 17:09:49-- http://10.0.0.11/announce/ +Reusing existing connection to 10.0.0.11:80. +. +. +. +20 redirections exceeded. +``` + +我在这个输出中省略了很多重复的内容。通过阅读服务器的响应,你可以看到 `http://10.0.0.11/announce/` 立即重定向到 `http://10.0.0.11/assets/`,然后又重定向到 `http://10.0.0.11/announce/`。以此类推。这是一个无休止的循环,`wget` 将在 20 次重定向后退出。但有了这些调试信息,你可以修复重定向,避免循环。 + +-------------------------------------------------------------------------------- + +via: https://opensource.com/article/21/9/wget-debug-web-server + +作者:[Jim Hall][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/jim-hall +[b]: https://github.com/lujun9972 +[1]: https://opensource.com/sites/default/files/styles/image-full-size/public/lead-images/browser_web_internet_website.png?itok=g5B_Bw62 (Digital creative of a browser on the internet) +[2]: https://opensource.com/sites/default/files/uploads/firefox-redirect-loop.png (Redirect loop example in Firefox) +[3]: https://creativecommons.org/licenses/by-sa/4.0/ \ No newline at end of file diff --git a/published/202109/20210908 How to Run Java Programs in Ubuntu.md b/published/202109/20210908 How to Run Java Programs in Ubuntu.md new file mode 100644 index 0000000000..e7b3277f53 --- /dev/null +++ b/published/202109/20210908 How to Run Java Programs in Ubuntu.md @@ -0,0 +1,118 @@ +[#]: subject: "How to Run Java Programs in Ubuntu" +[#]: via: "https://itsfoss.com/run-java-program-ubuntu/" +[#]: author: "Abhishek Prakash https://itsfoss.com/author/abhishek/" +[#]: collector: "lujun9972" +[#]: translator: "geekpi" +[#]: reviewer: "wxy" +[#]: publisher: "wxy" +[#]: url: "https://linux.cn/article-13790-1.html" + +如何在 Ubuntu 中运行 Java 程序 +====== + +![](https://img.linux.net.cn/data/attachment/album/202109/16/163803pn2dja7ajcx8jjw2.jpg) + +听说,你已经开始学习 Java 编程了?很好。 + +你想在你的 Linux 系统上运行 Java 程序?那就更好了。 + +让我告诉你如何在 Ubuntu 和其他 Linux 发行版的终端中运行 Java。 + +### 在 Ubuntu 中运行 Java 程序 + +让我们在这里按正确的步骤进行。 + +#### 第一步:安装 Java 编译器 + +要运行一个 Java 程序,你需要先编译该程序。为此你需要 Java 编译器。 + +Java 编译器是 [JDK][1](Java 开发工具包Java Development Kit)的一部分。你需要安装 JDK,以便编译和运行 Java 程序。 + +首先,检查你的系统上是否已经安装了 Java 编译器: + +``` +javac --version +``` + +如果你看到类似 “Command ‘javac’ not found, but can be installed with” 的错误,这意味着你需要安装 Java 开发工具包。 + +![Check if Java compiler is already installed or not][2] + +在 Ubuntu 上安装 JDK 的最简单方法是使用 Ubuntu 的默认包: + +``` +sudo apt install default-jdk +``` + +你会被要求输入你的账户密码。当你输入密码时,屏幕上什么也看不到。这很正常。直接输入密码即可。当询问时,按回车键或 `Y` 键。 + +![Installing JDK that also contains the Java compiler][3] + +上述命令应该适用于其他基于 Debian 和 Ubuntu 的发行版,如 Linux Mint、Elementary OS 等。对于其他发行版,请使用你的发行版的包管理器。包的名称也可能不同。 + +安装完毕后,验证 `javac` 现在是否可用。 + +![Verify that Java compiler can be used now][4] + +#### 第二步:在 Linux 中编译 Java 程序 + +要编译的话,你首先需要有一个 Java 程序文件。假设你创建了一个名为 `HelloWorld.java` 的新的 Java 程序文件,它的内容如下: + +``` +class HelloWorld{ + public static void main(String args[]){ + System.out.println("Hello World"); + } +} +``` + +你可以 [使用终端下的 Nano 编辑器][5] 或 Gedit 图形化文本编辑器来编写你的 Java 程序。 + +``` +javac HelloWorld.java +``` + +如果没有错误,上面的命令不会产生输出。 + +当你编译 Java 程序时,它会生成一个 .class 文件,文件名是你在程序中使用的类。你需要运行这个类文件。 + +#### 第三步:运行 Java 类文件 + +你不需要在这里指定类的扩展名。只需要类的名称。而这一次,你使用 `java` 命令,而不是 `javac`。 + +``` +java HelloWorld +``` + +我的程序将在屏幕上打印 “Hello World”。 + +![Running java programs in the Linux terminal][6] + +这就是你如何在 Linux 终端中运行一个 Java 程序。 + +这是最简单的一个例子。这个示例程序只有一个类。Java 编译器为你程序中的每个类都创建一个类文件。对于较大的程序和项目来说,事情会变得很复杂。 + +这就是为什么我建议 [在 Ubuntu 上安装 Eclipse][7] 来进行 Java 编程。在 IDE 中编程更容易。 + +希望本教程对你有所帮助。有问题或建议吗?评论区都是你的。 + +-------------------------------------------------------------------------------- + +via: https://itsfoss.com/run-java-program-ubuntu/ + +作者:[Abhishek Prakash][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/abhishek/ +[b]: https://github.com/lujun9972 +[1]: https://jdk.java.net/ +[2]: https://i1.wp.com/itsfoss.com/wp-content/uploads/2021/09/java-compiler-check-ubuntu.png?resize=800%2C328&ssl=1 +[3]: https://i0.wp.com/itsfoss.com/wp-content/uploads/2021/09/install-jdk-ubuntu.png?resize=800%2C430&ssl=1 +[4]: https://i1.wp.com/itsfoss.com/wp-content/uploads/2021/09/java-compiler-ubuntu.png?resize=798%2C226&ssl=1 +[5]: https://itsfoss.com/nano-editor-guide/ +[6]: https://i1.wp.com/itsfoss.com/wp-content/uploads/2021/09/running-java-programs-in-Linux-terminal.png?resize=798%2C301&ssl=1 +[7]: https://itsfoss.com/install-latest-eclipse-ubuntu/ diff --git a/published/202109/20210908 How to Use the dd Command to Create a Live USB Drive in Linux Terminal -For Experts and Adventurers.md b/published/202109/20210908 How to Use the dd Command to Create a Live USB Drive in Linux Terminal -For Experts and Adventurers.md new file mode 100644 index 0000000000..8c2b4ba03a --- /dev/null +++ b/published/202109/20210908 How to Use the dd Command to Create a Live USB Drive in Linux Terminal -For Experts and Adventurers.md @@ -0,0 +1,127 @@ +[#]: subject: "How to Use the dd Command to Create a Live USB Drive in Linux Terminal [For Experts and Adventurers]" +[#]: via: "https://itsfoss.com/live-usb-with-dd-command/" +[#]: author: "Hunter Wittenborn https://itsfoss.com/author/hunter/" +[#]: collector: "lujun9972" +[#]: translator: "perfiffer" +[#]: reviewer: "wxy" +[#]: publisher: "wxy" +[#]: url: "https://linux.cn/article-13787-1.html" + +怎样在 Linux 终端下使用 dd 命令创建一个临场 USB 驱动器 +====== + +![](https://img.linux.net.cn/data/attachment/album/202109/15/104940ucajv4o4zb8934ll.jpg) + +有很多的图形化工具可以用来创建临场live USB 驱动器。Linux 上的 [Etcher][1] 可能是最受欢迎的。为此,Ubuntu 也开发了自己的启动盘创建工具。 + +但是,资深 Linux 用户可能更喜欢使用 `dd` 命令在 Linux 终端中创建临场 USB,这会更快速便捷。 + +`dd` 命令是一个 [命令行][2] 工具,它提供了用来复制和转换文件的强大功能。 + +一个常见的使用示例是,用户使用 `dd` 命令将 ISO 文件写入到他们的外部存储设备(例如 USB 驱动盘),以用来给他们的电脑或者笔记本安装一个新的 Linux 发行版。 + +这就是我将在本教程中展示的内容。我将带你认识需要的命令,从终端找到我们的 USB 驱动器,然后对 ISO 文件进行实际刷写。 + +### 使用 dd 命令从 ISO 镜像创建临场 USB + +在我向你展示步骤前,让我带你快速过一下你将要使用到的命令并解释它的作用。 + +这是一个使用命令刷写 ISO 的例子: + +``` +dd if="./filename.iso" of="/dev/sdb" status="progress" conv="fsync" +``` + +让我们来看看 [dd 命令][3] 实际都做了些什么。 + +#### 理解 dd 命令 + +![Explanation of the dd command for live USB creation][4] + +首先,你输入 `dd`。没错,这就是你要运行的程序的名称。 + +接下来,你指定 `if="./filename.iso"`。`if` 代表输入文件input file,告诉 `dd` 命令你将要向外部存储设备写入哪个文件。 + +之后,你输入 `of="/dev/sdb"`。和 `if` 一样,`of` 代表的是输出文件output file。 + +要记住的是,输出文件在技术上不必是系统上的文件。你还可以指定诸如外部设备路径之类的内容(如示例所示),它看起来像系统上的普通文件,但实际上指向连接到你机器的设备。 + +`status` 可以设定为 3 个选项:`none`、`noxfer` 和 `progress`。 + +- 你设置的 `progress` 选项将使 `dd` 任务显示有关已将多少 ISO 文件传输到存储驱动器的定期统计信息,以及对 `dd` 任务完成前需要多长时间的估计。 +- 如果你改为设置 `none` 选项,`dd` 任务在写入 ISO 文件期间只会打印错误消息,并且删除进度条之类的内容。 +- `noxfer` 选项隐藏了传输完成后打印的一些信息,例如从开始到完成所用的时间。 + +最后,你将 `conv` 选项设置为 `fsync`。这会导致 `dd` 任务在整个 ISO 文件写入 USB 驱动器之前不会报告成功写入。 + +如果你省略这个选项,`dd` 任务会工作的很好(并且实际上可能看起来运行得更快),但你可能会发现你的系统需要很长时间才能告诉你移除 USB 驱动器是安全的,因为它会在后台完成 ISO 的内容写入,从而允许你在此期间做其它事情。 + +**现在你明白了你必须做什么,让我们看看如何去做。** + +> **注意事项** +> +> 命令行是把双刃剑。当你在命令行使用类似于 `dd` 命令时必须十分小心。你必须确保你目标输出文件是正确的设备。一个错误的步骤就可能会格式化你的系统硬盘,你的操作系统也会因此而损坏。 + +#### 第 0 步: 下载所需的 ISO 镜像 + +不用说,你需要有一个 ISO 镜像文件才能将其刷写到 USB 上。 + +我将使用 Ubuntu 20.04 ISO(可在此处[下载][5])来测试我之前介绍的 `dd` 命令。 + +#### 第 1 步: 获取 USB 盘符 + +插入你的 USB 驱动器。 + +我为 `of` 参数输入的具体路径是 `/dev/sdb`。USB 磁盘通常会标记为 `/dev/sdb`,但这不是硬性规定。 + +此路径可能因你的系统而异,你可以使用 `lsblk` 命令确认 USB 磁盘的路径。只需从列表中查找一个看起来像你的 USB 磁盘大小的驱动器,就可以了。 + +![][6] + +如果你更熟悉 GUI 程序,还可以使用 GNOME Disks 等工具找到驱动器的路径。 + +![][7] + +现在你已经确认了外部驱动器的路径,让我们开始创建临场 USB。 + +#### 第 2 步:将 ISO 文件写入 USB 磁盘 + +在下载 ISO 文件的目录打开一个终端,然后运行以下命令(如果 `/dev/sdb` 与你的存储设备名称不同,请记住将其替换): + +``` +sudo dd if="./ubuntu-20.04.2.0-desktop-amd64.iso" of="/dev/sdb" status="progress" conv="fsync" +``` + +之后,让 `dd` 去做剩下的事情,它会在完成后打印一条完成消息: + +![][8] + +就像这样,你已经在 Linux 终端中使用 `dd` 命令刷写了 ISO 文件! + +### 总结 + +现在,你可以通过终端做更多的事情,让你的工作效率大大提高。 + +对 `dd` 命令有任何没解决的问题,或者无法正常工作?请随时在下面的评论部分中留下你的问题。 + +-------------------------------------------------------------------------------- + +via: https://itsfoss.com/live-usb-with-dd-command/ + +作者:[Hunter Wittenborn][a] +选题:[lujun9972][b] +译者:[perfiffer](https://github.com/perfiffer) +校对:[wxy](https://github.com/wxy) + +本文由 [LCTT](https://github.com/LCTT/TranslateProject) 原创编译,[Linux中国](https://linux.cn/) 荣誉推出 + +[a]: https://itsfoss.com/author/hunter/ +[b]: https://github.com/lujun9972 +[1]: https://itsfoss.com/install-etcher-linux/ +[2]: https://itsfoss.com/gui-cli-tui/ +[3]: https://linuxhandbook.com/dd-command/ +[4]: https://i2.wp.com/itsfoss.com/wp-content/uploads/2021/09/dd-command-for-live-usb-creation.png?resize=800%2C450&ssl=1 +[5]: https://ubuntu.com/download/desktop/thank-you?version=20.04.2.0&architecture=amd64 +[6]: https://i2.wp.com/itsfoss.com/wp-content/uploads/2021/08/dd_disks.png?resize=753%2C264&ssl=1 +[7]: https://i2.wp.com/itsfoss.com/wp-content/uploads/2021/08/dd_gnome_disks.png?resize=800%2C440&ssl=1 +[8]: https://i1.wp.com/itsfoss.com/wp-content/uploads/2021/08/dd-iso-write.png?resize=800%2C322&ssl=1 diff --git a/published/202109/20210909 Adobe Kills Brackets Code Editor - Suggests Using Visual Studio Code.md b/published/202109/20210909 Adobe Kills Brackets Code Editor - Suggests Using Visual Studio Code.md new file mode 100644 index 0000000000..f8962272b2 --- /dev/null +++ b/published/202109/20210909 Adobe Kills Brackets Code Editor - Suggests Using Visual Studio Code.md @@ -0,0 +1,79 @@ +[#]: subject: "Adobe Kills Brackets Code Editor & Suggests Using Visual Studio Code" +[#]: via: "https://news.itsfoss.com/adobe-kills-brackets-editor/" +[#]: author: "Ankush Das https://news.itsfoss.com/author/ankush/" +[#]: collector: "lujun9972" +[#]: translator: "wxy" +[#]: reviewer: "wxy" +[#]: publisher: "wxy" +[#]: url: "https://linux.cn/article-13782-1.html" + +Adobe 终止支持 Brackets,并建议使用 VS Code 替代 +====== + +> Adobe 结束了对 Brackets 代码编辑器的支持,坚持让用户迁移到微软的 Visual Studio Code。不过,还好总还算是留下了一个复刻。 + +![](https://i2.wp.com/news.itsfoss.com/wp-content/uploads/2021/09/adobe-bracket-visual-studio.jpg?w=1200&ssl=1) + +Brackets 是一个令人印象深刻的现代开源代码编辑器,可用于 Windows、macOS 和 Linux。 + +Adobe 以一个社区引导的项目的形式创建了它,来帮助 Web 开发者。我们之前把它列为 [可供编程人员使用的最佳现代文本编辑器][1] 之一。 + +不幸的是,Adobe 在 2021 年 9 月 1 日结束了对 Brackets 的支持。 + +### 为什么 Adobe 停用了 Brackets? + +![][2] + +看起来可能是 Adobe 与微软的合作关系促使他们拔掉了这个社区项目的插头。 + +因此,他们建议用户迁移到微软的 Visual Studio Code 编辑器。 + +![][3] + +这是 Brackets 项目中止后 GitHub 的原始页面上的内容。 + +### Visual Studio Code 作为 Brackets 的替代品 + +当然,微软的 Visual Studio Code 是一个很好的替代品,而且建立在开源的基础上。然而,当你从他们的网站上下载 Visual Studio Code 时,它并不在一个促进自由和开源软件的许可证之下。 + +因此,你可能不得不从源代码构建,或者尝试 [VSCodium][4],这是一个没有遥测/跟踪功能的 Visual Studio Code 的自由许可版本。 + +另外,有一个 [关于从 Brackets 迁移的官方指南][5],如果你感兴趣,可以去看看。 + +### Brackets 将继续以没有 Adobe 的复刻出现 + +![][6] + +尽管 Adobe 已经停止了这个项目,但 [原网站][7] 仍然存在,以维持这个项目的复刻。 + +该项目名称可能会改变,但从目前来看,它叫 “Brackets Continued”,以帮助用户识别该复刻。 + +请注意,这个复刻项目还没有发布,我们也不知道它是否会作为一个独立的项目继续下去。 + +所以,如果你想帮助 Brackets 复刻,并以某种方式帮助维护它,请前往其 GitHub 页面了解更多细节。 + +- [Brackets Continued(复刻)][8] + +你喜欢用什么作为你的代码编辑器?你喜欢用 Brackets 代码编辑器进行 Web 开发工作吗?欢迎在评论中分享你的想法。 + +-------------------------------------------------------------------------------- + +via: https://news.itsfoss.com/adobe-kills-brackets-editor/ + +作者:[Ankush Das][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://news.itsfoss.com/author/ankush/ +[b]: https://github.com/lujun9972 +[1]: https://itsfoss.com/best-modern-open-source-code-editors-for-linux/ +[2]: https://i2.wp.com/news.itsfoss.com/wp-content/uploads/2021/09/brackets-screenshot.png?w=800&ssl=1 +[3]: https://i2.wp.com/news.itsfoss.com/wp-content/uploads/2021/09/adobe-brackets-github.png?w=964&ssl=1 +[4]: https://vscodium.com +[5]: https://code.visualstudio.com/migrate-from-brackets +[6]: https://i2.wp.com/news.itsfoss.com/wp-content/uploads/2021/09/brackets-fork.png?w=1511&ssl=1 +[7]: https://brackets.io +[8]: https://github.com/brackets-cont/brackets diff --git a/published/202109/20210910 Building an open source community health analytics platform.md b/published/202109/20210910 Building an open source community health analytics platform.md new file mode 100644 index 0000000000..fb77032618 --- /dev/null +++ b/published/202109/20210910 Building an open source community health analytics platform.md @@ -0,0 +1,57 @@ +[#]: subject: "Building an open source community health analytics platform" +[#]: via: "https://opensource.com/article/21/9/openrit-mystic" +[#]: author: "Quinn Foster https://opensource.com/users/quinn-foster" +[#]: collector: "lujun9972" +[#]: translator: "geekpi" +[#]: reviewer: "wxy" +[#]: publisher: "wxy" +[#]: url: "https://linux.cn/article-13800-1.html" + +构建开源的社区健康分析平台 +====== + +> 一个学术性的 OSPO 正在与 CHAOSS 软件合作,以建立一个社区健康分析平台。 + +![](https://img.linux.net.cn/data/attachment/album/202109/19/100755mlngkwvvwjjlblgn.png) + +罗切斯特理工学院Rochester Institute of Technology(RIT)最近在增加其在开源世界的影响力方面取得了相当大的进展。RIT的自由和开源软件及自由文化辅修课程是学术界的第一个此类课程。例如,其开源项目办公室 Open@RIT 已经开始帮助 RIT 的教职员工和研究员为他们的开源项目建立和维护社区。 + +这些进展是由 RIT 的学生、教师和工作人员推动的。目前,大学里已经有越来越多的人在管理他们自己的开源项目。然而,运行一个完全的开源项目可能是很麻烦的。这主要来自于维护项目的社区和管理数据,如项目的代码、问题跟踪和仓库。 + +为了帮助他们,Open@RIT 正在创建一个名为 Mystic 的系统,这是一个社区健康分析平台,利用了 [GrimoireLab][2],这是一个由 [CHAOSS][3] 软件开发的开源工具包,为开源项目提供了指标和分析。GrimoireLab 允许用户收集、丰富、过滤和可视化一个项目的数据,例如一个报告的问题被解决的时间、贡献者的关系等。 + +Mystic 将作为一个前端门户,任何人都可以提交他们的项目。在那里,项目将被直接发送到 GrimoireLab,它将在几分钟后为提交者计算并发布项目的指标。 + +> Open@RIT 的全栈开发者和 Mystic 的首席开发者 Emi Simpson 说:“我们希望 RIT 的任何管理、领导或参与开源项目的人都能将该项目提交给 Mystic,并获得他们需要的任何指标”。 + +这个过程很简单。登录 Mystic 后,上传项目的用户会打开一个弹出式窗口,输入项目的细节和数据源的链接,如 GitLab、RSS feed 和一个开放软件基金会Open Software Foundation(OSF)项目名。一旦保存了细节和项目,Mystic 就会使用 GrimoireLab 从项目源中自动检索指标,并为每个源渲染图表。然后,该项目及其指标将显示在它自己的仪表板上。 + +![Mystic statistics page][4] + +这些仪表盘将并列显示在一个页面上,以供其他人查看,鼓励 RIT 内部的开源社区之间的合作开发和互动。Simpson 和 Open@RIT 希望这将增加 RIT 的开放工作的参与度,并进一步巩固该大学作为开放工作中心的地位。 + +> Simpson 说:“如果有人问 RIT 在为开源软件做什么,我希望人们能够指着 Mystic 和 GrimoireLab 说就是这些。通过建立‘这些是我们正在做的,这些是我们的贡献,这些是人们正在做的项目’的指标,我们可以在 RIT 建立一个以我们正在做的开源工作为中心的社区。” + +目前,Mystic 仍在开发中,还没有准备好进入生产环境,但它对 RIT 和整个开源的潜力仍然是有目共睹的。未来的目标包括实现与大学报告工具的轻松整合,以及在项目层面和总体上的综合仪表盘。 + +你对 Mystic 的贡献感兴趣吗?[请与我们联系][6] 开始吧。 + +-------------------------------------------------------------------------------- + +via: https://opensource.com/article/21/9/openrit-mystic + +作者:[Quinn Foster][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/quinn-foster +[b]: https://github.com/lujun9972 +[1]: https://opensource.com/sites/default/files/styles/image-full-size/public/lead-images/metrics_data_dashboard_system_computer_analytics.png?itok=oxAeIEI- (metrics and data shown on a computer screen) +[2]: https://chaoss.github.io/grimoirelab/ +[3]: https://chaoss.community/ +[4]: https://opensource.com/sites/default/files/uploads/mystic_statistics_page.png (Mystic statistics page) +[5]: https://creativecommons.org/licenses/by-sa/4.0/ +[6]: https://opensource.ieee.org/rit/mystic diff --git a/published/202109/20210910 Quadratic algorithms are slow (and hashmaps are fast).md b/published/202109/20210910 Quadratic algorithms are slow (and hashmaps are fast).md new file mode 100644 index 0000000000..c20f6d13c9 --- /dev/null +++ b/published/202109/20210910 Quadratic algorithms are slow (and hashmaps are fast).md @@ -0,0 +1,253 @@ +[#]: subject: "Quadratic algorithms are slow (and hashmaps are fast)" +[#]: via: "https://jvns.ca/blog/2021/09/10/hashmaps-make-things-fast/" +[#]: author: "Julia Evans https://jvns.ca/" +[#]: collector: "lujun9972" +[#]: translator: "unigeorge" +[#]: reviewer: "wxy" +[#]: publisher: "wxy" +[#]: url: "https://linux.cn/article-13786-1.html" + +浅谈慢速的二次算法与快速的 hashmap +====== + +![](https://img.linux.net.cn/data/attachment/album/202109/15/094524s7dlcq74ksqazyyc.jpg) + +大家好!昨天我与一位朋友聊天,他正在准备编程面试,并试图学习一些算法基础知识。 + +我们聊到了二次时间quadratic-time线性时间linear-time算法的话题,我认为在这里写这篇文章会很有趣,因为避免二次时间算法不仅在面试中很重要——有时在现实生活中了解一下也是很好的!后面我会快速解释一下什么是“二次时间算法” :) + +以下是我们将要讨论的 3 件事: + + 1. 二次时间函数比线性时间函数慢得非常非常多 + 2. 有时可以通过使用 hashmap 把二次算法变成线性算法 + 3. 这是因为 hashmap 查找非常快(即时查询!) + +我会尽量避免使用数学术语,重点关注真实的代码示例以及它们到底有多快/多慢。 + +### 目标问题:取两个列表的交集 + +我们来讨论一个简单的面试式问题:获取 2 个数字列表的交集。 例如,`intersect([1,2,3], [2,4,5])` 应该返回 `[2]`。 + +这个问题也是有些现实应用的——你可以假设有一个真实程序,其需求正是取两个 ID 列表的交集。 + +### “显而易见”的解决方案: + +我们来写一些获取 2 个列表交集的代码。下面是一个实现此需求的程序,命名为 `quadratic.py`。 + +``` +import sys + +# 实际运行的代码 +def intersection(list1, list2): + result = [] + for x in list1: + for y in list2: + if x == y: + result.append(y) + return result + +# 一些样板,便于我们从命令行运行程序,处理不同大小的列表 +def run(n): + # 定义两个有 n+1 个元素的列表 + list1 = list(range(3, n)) + [2] + list2 = list(range(n+1, 2*n)) + [2] + # 取其交集并输出结果 + print(list(intersection(list1, list2))) + +# 使用第一个命令行参数作为输入,运行程序 +run(int(sys.argv[1])) +``` + +程序名为 `quadratic.py`(LCTT 译注:“quadratic”意为“二次方的”)的原因是:如果 `list1` 和 `list2` 的大小为 `n`,那么内层循环(`if x == y`)会运行 `n^2` 次。在数学中,像 `x^2` 这样的函数就称为“二次”函数。 + +### `quadratic.py` 有多慢? + +用一些不同长度的列表来运行这个程序,两个列表的交集总是相同的:`[2]`。 + +``` +$ time python3 quadratic.py 10 +[2] + +real 0m0.037s +$ time python3 quadratic.py 100 +[2] + +real 0m0.053s +$ time python3 quadratic.py 1000 +[2] + +real 0m0.051s +$ time python3 quadratic.py 10000 # 10,000 +[2] + +real 0m1.661s +``` + +到目前为止,一切都还不错——程序仍然只花费不到 2 秒的时间。 + +然后运行该程序处理两个包含 100,000 个元素的列表,我不得不等待了很长时间。结果如下: + +``` +$ time python3 quadratic.py 100000 # 100,000 +[2] + +real 2m41.059s +``` + +这可以说相当慢了!总共花费了 160 秒,几乎是在 10,000 个元素上运行时(1.6 秒)的 100 倍。所以我们可以看到,在某个点之后,每次我们将列表扩大 10 倍,程序运行的时间就会增加大约 100 倍。 + +我没有尝试在 1,000,000 个元素上运行这个程序,因为我知道它会花费又 100 倍的时间——可能大约需要 3 个小时。我没时间这样做! + +你现在大概明白了为什么二次时间算法会成为一个问题——即使是这个非常简单的程序也会很快变得非常缓慢。 + +### 快速版:`linear.py` + +好,接下来我们编写一个快速版的程序。我先给你看看程序的样子,然后再分析。 + +``` +import sys + +# 实际执行的算法 +def intersection(list1, list2): + set1 = set(list1) # this is a hash set + result = [] + for y in list2: + if y in set1: + result.append(y) + return result + +# 一些样板,便于我们从命令行运行程序,处理不同大小的列表 +def run(n): + # 定义两个有 n+1 个元素的列表 + list1 = range(3, n) + [2] + list2 = range(n+1, 2*n) + [2] + # 输出交集结果 + print(intersection(list1, list2)) + +run(int(sys.argv[1])) +``` + +(这不是最惯用的 Python 使用方式,但我想在尽量避免使用太多 Python 思想的前提下编写代码,以便不了解 Python 的人能够更容易理解) + +这里我们做了两件与慢速版程序不同的事: + + 1. 将 `list1` 转换成名为 `set1` 的 set 集合 + 2. 只使用一个 for 循环而不是两个 + +### 看看 `linear.py` 程序有多快 + +在讨论 _为什么_ 这个程序快之前,我们先在一些大型列表上运行该程序,以此证明它确实是很快的。此处演示该程序依次在大小为 10 到 10,000,000 的列表上运行的过程。(请记住,我们上一个的程序在 100,000 个元素上运行时开始变得非常非常慢) + +``` +$ time python3 linear.py 100 +[2] + +real 0m0.056s +$ time python3 linear.py 1000 +[2] + +real 0m0.036s +$ time python3 linear.py 10000 # 10,000 +[2] + +real 0m0.028s +$ time python3 linear.py 100000 # 100,000 +[2] + +real 0m0.048s <-- quadratic.py took 2 minutes in this case! we're doing it in 0.04 seconds now!!! so fast! +$ time python3 linear.py 1000000 # 1,000,000 +[2] + +real 0m0.178s +$ time python3 linear.py 10000000 # 10,000,000 +[2] + +real 0m1.560s +``` + +### 在极大型列表上运行 `linear.py` + +如果我们试着在一个非常非常大的列表(100 亿 / 10,000,000,000 个元素)上运行它,那么实际上会遇到另一个问题:它足够 _快_ 了(该列表仅比花费 4.2 秒的列表大 100 倍,因此我们大概应该能在不超过 420 秒的时间内完成),但我的计算机没有足够的内存来存储列表的所有元素,因此程序在运行结束之前崩溃了。 + +``` +$ time python3 linear.py 10000000000 +Traceback (most recent call last): + File "/home/bork/work/homepage/linear.py", line 18, in + run(int(sys.argv[1])) + File "/home/bork/work/homepage/linear.py", line 13, in run + list1 = [1] * n + [2] +MemoryError + +real 0m0.090s +user 0m0.034s +sys 0m0.018s +``` + +不过本文不讨论内存使用,所以我们可以忽略这个问题。 + +### 那么,为什么 `linear.py` 很快呢? + +现在我将试着解释为什么 `linear.py` 很快。 + +再看一下我们的代码: + +``` +def intersection(list1, list2): + set1 = set(list1) # this is a hash set + result = [] + for y in list2: + if y in set1: + result.append(y) + return result +``` + +假设 `list1` 和 `list2` 都是大约 10,000,000 个不同元素的列表,这样的元素数量可以说是很大了! + +那么为什么它还能够运行得如此之快呢?因为 hashmap!!! + +### hashmap 查找是即时的(“常数级时间”) + +我们看一下快速版程序中的 `if` 语句: + +``` +if y in set1: + result.append(y) +``` + +你可能会认为如果 `set1` 包含 1000 万个元素,那么这个查找——`if y in set1` 会比 `set1` 包含 1000 个元素时慢。但事实并非如此!无论 `set1` 有多大,所需时间基本是相同的(超级快)。 + +这是因为 `set1` 是一个哈希集合,它是一种只有键没有值的 hashmap(hashtable)结构。 + +我不准备在本文中解释 _为什么_ hashmap 查找是即时的,但是神奇的 Vaidehi Joshi 的 [basecs][1] 系列中有关于 [hash table][2] 和 [hash 函数][3] 的解释,其中讨论了 hashmap 即时查找的原因。 + +### 不经意的二次方:现实中的二次算法! + +二次时间算法真的很慢,我们看到的的这个问题实际上在现实中也会遇到——Nelson Elhage 有一个很棒的博客,名为 [不经意的二次方][4],其中有关于不经意以二次时间算法运行代码导致性能问题的故事。 + +### 二次时间算法可能会“偷袭”你 + +关于二次时间算法的奇怪之处在于,当你在少量元素(如 1000)上运行它们时,它看起来并没有那么糟糕!没那么慢!但是如果你给它 1,000,000 个元素,它真的会花费几个小时去运行。 + +所以我认为它还是值得深入了解的,这样你就可以避免无意中使用二次时间算法,特别是当有一种简单的方法来编写线性时间算法(例如使用 hashmap)时。 + +### 总是让我感到一丝神奇的 hashmap + +hashmap 当然不是魔法(你可以学习一下为什么 hashmap 查找是即时的!真的很酷!),但它总是让人 _感觉_ 有点神奇,每次我在程序中使用 hashmap 来加速,都会使我感到开心 :) + +-------------------------------------------------------------------------------- + +via: https://jvns.ca/blog/2021/09/10/hashmaps-make-things-fast/ + +作者:[Julia Evans][a] +选题:[lujun9972][b] +译者:[unigeorge](https://github.com/unigeorge) +校对:[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://medium.com/basecs +[2]: https://medium.com/basecs/taking-hash-tables-off-the-shelf-139cbf4752f0 +[3]: https://medium.com/basecs/hashing-out-hash-functions-ea5dd8beb4dd +[4]: https://accidentallyquadratic.tumblr.com/ diff --git a/published/202109/20210911 Here-s Why Firefox is Seeing a Continuous Decline for Last 12 Years.md b/published/202109/20210911 Here-s Why Firefox is Seeing a Continuous Decline for Last 12 Years.md new file mode 100644 index 0000000000..95737229ff --- /dev/null +++ b/published/202109/20210911 Here-s Why Firefox is Seeing a Continuous Decline for Last 12 Years.md @@ -0,0 +1,84 @@ +[#]: subject: "Here’s Why Firefox is Seeing a Continuous Decline for Last 12 Years" +[#]: via: "https://news.itsfoss.com/firefox-continuous-decline/" +[#]: author: "Community https://news.itsfoss.com/author/team/" +[#]: collector: "lujun9972" +[#]: translator: "wxy" +[#]: reviewer: "wxy" +[#]: publisher: "wxy" +[#]: url: "https://linux.cn/article-13780-1.html" + +Firefox 在过去 12 年里损失了 5 亿用户及其 75% 份额的原因 +====== + +> 一位有四十年编程经验的老程序员表达了他对 Firefox 浏览器为何逐渐衰退的看法。 + +![](https://i2.wp.com/news.itsfoss.com/wp-content/uploads/2021/09/decline.png?w=1200&ssl=1) + +最近有很多关于 Firefox 浏览器衰落的讨论,还有很多讨论 [它在过去两年里失去了 5000 万用户][1] 的文章。 + +但是 **实际上它的衰落已经有 12 年之久了,总共损失了 5 亿用户和它曾经拥有的市场份额的 75%**。 + +这一切都开始于 2009 年第三季度,其致命的决定是强迫…… + +### 顶部标签 + +自从 [做了这个决定][2],Firefox 就开始丢失市场份额。PC 上的所有程序都使用针对活动窗口的标签。如微软 Office 和 Adobe 这样的专有软件,如 GIMP、3D 设计、视频编辑器、十六进制编辑器这样的 FOSS 软件,你能想的的种种软件都是这样的,这是标准的、合乎逻辑的设计。 + +然后,谷歌决定将标签放在其 Chrome 浏览器的顶部,该浏览器是为移动设备而非台式机设计的。在智能手机上,这可能是有意义的,因为没有空间来容纳一个完整的桌面风格的菜单布局。但在桌面上,它是反直觉的,并且会破坏与所有其他程序的工作流程。台式机的代码与手机不同,所以没有合理的理由试图将移动用户界面强加给台式机用户,而台式机是 Firefox 的主要用户群。在一个 400 万行的代码库中,由两行代码所制定的单一设置“太难维护”的论点,只是在侮辱用户的智商。代码不是草坪,如果你几周不管它,它也不会改变。 + +当用户对这一变化的投诉蜂拥而至时,我从一位不愿透露姓名的主要开发者那里得到的回应是:“我们有数亿用户。5000 人的抱怨并不代表大多数的用户。”这些投诉有一个共同的观点:“如果我想让我的浏览器看起来像 Chrome,我就会使用 Chrome。”于是他们就这么做了。 + +### 不断删除“没人使用”的功能 + +对 Firefox 所做的每项改动都是一样的做法。默认功能被改变了,但有一个菜单设置可以恢复它。然后菜单设置被删除,你只能通过`about:config` 来改变它。再然后,`about:config` 选项也被删除了。用户群的每一次抗议都得到了同样的回应:“你只是极少数人,大多数人喜欢这种改变。” + +75% 并不是少数人。几乎每个人都讨厌这些变化,每一次变化都会把更多的用户赶走,而 Mozilla 工作人员傲慢的、居高临下的回应让用户们有苦难言,让他们再也不想回来了。仔细观察,你可以看到每次删除一些功能,用户数量都有明显的下降,只有在第三方组件或 CSS 恢复了这些变化时才会稳定下来。一次又一次,年复一年。他们没有学到任何教训。 + +光是移除设置还不够。Firefox 继续阉割附加组件和主题,强迫集中签名,并最终废除了 XUL,而没有足够的 Web 扩展 API 来替代失去的功能。在抱怨这一变化时,我再次与一位主要开发者(同一个人)交谈。他的回答是(原话)“人们并不是因为附加组件而使用 Firefox 的。我们的遥测显示 80% 的用户从未安装过任何附加组件。”也就是说,任何懂技术的人都会立即关闭遥测,因为他们不想让浏览器监视他们,对此我们也曾无数次抱怨过。 + +即使是他们在用户界面设计方面的一项重大举措,即可拖放定制的 Australis 界面,也因为可怕的默认布局和缺乏不需要 CSS 的选项而疏远了更多用户。难看的斜角标签(抄袭自 Chrome)是 Mozilla 唯一承认糟糕的用户界面变化,而且令人惊讶的是,他们只是在 Chrome 取消了斜角标签 **之后** 才这样做。 + +时至今日,Mozilla 仍然声称要听取用户的意见,但 12 年后,他们仍然无视我们,难看的默认 Proton 用户界面是最新强加给不情愿的用户群的愚蠢选择。(如果你认为我属于少数的话,可以在谷歌上输入 “Firefox Proton” 来查看最常搜索的建议。)幸运的是,它仍然可以用 `userChrome.css` 来大致修复,但即使是我,也已经厌倦了必须反复修补新的代码来跟上不断的弃用和格式变化。  + +### 糟糕的编码范式 + +Mozilla 的源代码是一场噩梦。例如,默认配置文件的位置被定义了 3 次,使用了 3 种不同的语言的不同的变量,其中之一是由位于不同文件中的多个变量组合生成的。我看到的另外一个例子是在 6 个不同的文件中定义的另一个全局变量。 + +在编译后,下载历史、访问过的网页、书签等等,都被一起塞进了乱七八糟的文件中。最终的结果是什么?试着从你的历史记录中删除 400 个条目,看看它需要多长时间。而从一个单独的文本文件中删除这么多行,只需要一瞬间。想改变一个图标的外观或为自定义搜索添加一个新的图标?它们大多只是 PNG,但它们被混淆并被封入 `omni.ja` 文件。本来可以用你选择的编辑器在几秒钟内改变,但你需要安装和学习 Eclipse 之类的程序,并在每次更改时重新编译文件。这样的例子不胜枚举。 + +难怪 Mozilla 的码农在寻找和修复错误方面这么困难。这导致了更糟糕的编码范式,为了修复错误而记录一切。它部分导致了... + +### 糟糕的内存管理 + +如果一个程序坐在那里什么都不做,它的内存使用量不应该改变。看看我的内存管理器,我有 40 个进程在遵守这个原则。尽管什么都不做,却不断地读写磁盘的唯一程序是什么?Firefox。它正在运行 13 个进程,所有这些进程都在不断地做这两件事。我写了 40 年的代码,造了 30 年的电脑,所以我确实了解一点计算机如何工作的事情。这就是基础层面上的糟糕设计,在表面上做再多的修补也无济于事。 + +代码范式是 Mozilla 性能问题的根源,他们不会解决这个问题。我敢打赌,这也是 FirefoxOS 失败的原因,它是一个伟大的想法,但由于执行不力和编码实践问题,导致太多的错误无法修复而失败。  +### 在告诉我们“我们重视你的隐私”的同时,侵犯了你的隐私 + +就是遥测。当你点击“禁用遥测”时,隐藏的遥测并没有被禁用。首次运行也要发出遥测信号。强制签署附加组件。无法关闭的自动更新,每 10 分钟发出一次信号。需要单独选择退出的“实验”。现在最新的问题是,只是为了制作一个自定义的主题,就强制使用基于 2FA 的应用以登录到 Firefox 插件帐户,如果不是强制签署附加组件,根本就不需要。 + +Mozilla 对用户隐私的尊重和对我们意见的尊重一样少。 + +### 总结 + +事情不一定是这样的。虽然还没有,但是不能承认自己的错误,也不考虑不同的意见的人,注定要停滞不前,走向衰败。Mozilla 的决策者似乎就是这样想的,所以我对未来不抱什么希望。希望你们中的一些人至少能从他们的错误中学习,在他们失败的地方取得成功。通过为用户提供他们想要的东西,而不是告诉他们应该想要什么来取得成功。通过提供市场上缺少的东西,而不是盲目地试图复制你的竞争对手。 + +*本文所表达的观点和意见仅代表作者本人,不一定反映本站和 It's FOSS 的官方政策或立场。* + +> 作者信息:Dan 来自澳大利亚墨尔本,已经有大约 40 年的编码经验,做了 25 年的平面设计。他还从事基于 3D 打印机套件的开源机械设计。 + +-------------------------------------------------------------------------------- + +via: https://news.itsfoss.com/firefox-continuous-decline/ + +作者:[Community][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://news.itsfoss.com/author/team/ +[b]: https://github.com/lujun9972 +[1]: https://news.itsfoss.com/firefox-decline/ +[2]: https://www.wired.com/2009/07/mozilla-considers-copying-chrome-for-firefox-4dot0/ diff --git a/published/202109/20210913 Replace smart quotes with the Linux sed command.md b/published/202109/20210913 Replace smart quotes with the Linux sed command.md new file mode 100644 index 0000000000..753582a52d --- /dev/null +++ b/published/202109/20210913 Replace smart quotes with the Linux sed command.md @@ -0,0 +1,80 @@ +[#]: subject: "Replace smart quotes with the Linux sed command" +[#]: via: "https://opensource.com/article/21/9/sed-replace-smart-quotes" +[#]: author: "Seth Kenlon https://opensource.com/users/seth" +[#]: collector: "lujun9972" +[#]: translator: "geekpi" +[#]: reviewer: "wxy" +[#]: publisher: "wxy" +[#]: url: "https://linux.cn/article-13806-1.html" + +用 Linux sed 命令替换智能引号 +====== + +> 用你喜欢的 sed 版本去除“智能”引号。 + +![](https://img.linux.net.cn/data/attachment/album/202109/21/151406chun5nyumy8wyu5y.png) + +在排版学中,一对引号传统上是朝向彼此的。它们看起来像这样: + +“智能引号” + +随着计算机在二十世纪中期的普及,这种朝向往往被放弃了。计算机的原始字符集没有太多的空间,所以在 ASCII 规范中,两个双引号和两个单引号被缩减为各一个是合理的。如今,通用的字符集是 Unicode,有足够的空间容纳许多花哨的引号和撇号,但许多人已经习惯了开头和结尾引号都只有一个字符的极简主义。此外,计算机实际上将不同种类的引号和撇号视为不同的字符。换句话说,对计算机来说,右双引号与左双引号或直引号是不同的。 + +### 用 sed 替换智能引号 + +计算机并不是打字机。当你按下键盘上的一个键时,你不是在按一个带有印章的控制杆。你只是按下一个按钮,向你的计算机发送一个信号,计算机将其解释为一个显示特定预定义字符的请求。这个请求取决于你的键盘映射。作为一个 Dvorak 打字员,我目睹了人们在发现我的键盘上的 “asdf” 在屏幕上产生 “aoeu” 时脸上的困惑。你也可能按了一些特殊的组合键来产生字符,如 ™ 或 ß 或 ≠,这甚至没有印在你的键盘上。 + +每个字母或字符,不管它是否印在你的键盘上,都有一个编码。字符编码可以用不同的方式表达,但对计算机来说,Unicode 序列 u2018 和 u2019 产生 `‘` 和 `’`,而代码 u201c 和 u201d 产生 `“` 和 `”` 字符。知道这些“秘密”代码意味着你可以使用 [sed][2] 这样的命令以编程方式替换它们。任何版本的 sed 都可以,所以你可以使用 GNU sed 或 BSD sed,甚至是 [Busybox][3] sed。 + +下面是我使用的简单的 shell 脚本: + +``` +#!/bin/sh +# GNU All-Permissive License + +SDQUO=$(echo -ne '\u2018\u2019') +RDQUO=$(echo -ne '\u201C\u201D') +$SED -i -e "s/[$SDQUO]/\'/g" -e "s/[$RDQUO]/\"/g" "${1}" +``` + +将此脚本保存为 `fixquotes.sh`,然后创建一个包含智能引号的单独测试文件: + +``` +‘Single quote’ +“Double quote” +``` + +运行该脚本,然后使用 [cat][4] 命令查看结果: + +``` +$ sh ./fixquotes.sh test.txt +$ cat test.txt +'Single quote' +"Double quote" +``` + +### 安装 sed + +如果你使用的是 Linux、BSD 或 macOS,那么你已经安装了 GNU 或 BSD 的 `sed`。这是原始 `sed` 命令的两个独特的重新实现,对于本文中的脚本来说,它们在功能上是一样的(不过并不是所有的脚本都是这样)。 + +在 Windows 上,你可以用 [Chocolatey][6] [安装 GNU sed][5]。 + +-------------------------------------------------------------------------------- + +via: https://opensource.com/article/21/9/sed-replace-smart-quotes + +作者:[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/code_computer_laptop_hack_work.png?itok=aSpcWkcl (Coding on a computer) +[2]: https://opensource.com/article/20/12/sed +[3]: https://opensource.com/article/21/8/what-busybox +[4]: https://opensource.com/article/19/2/getting-started-cat-command +[5]: https://chocolatey.org/packages/sed +[6]: https://opensource.com/article/20/3/chocolatey diff --git a/published/202109/20210915 How to check for update info and changelogs with rpm-ostree db.md b/published/202109/20210915 How to check for update info and changelogs with rpm-ostree db.md new file mode 100644 index 0000000000..a45df8003b --- /dev/null +++ b/published/202109/20210915 How to check for update info and changelogs with rpm-ostree db.md @@ -0,0 +1,112 @@ +[#]: subject: "How to check for update info and changelogs with rpm-ostree db" +[#]: via: "https://fedoramagazine.org/how-to-check-for-update-info-and-changelogs-with-rpm-ostree-db/" +[#]: author: "Mateus Rodrigues Costa https://fedoramagazine.org/author/mateusrodcosta/" +[#]: collector: "lujun9972" +[#]: translator: "geekpi" +[#]: reviewer: "wxy" +[#]: publisher: "wxy" +[#]: url: "https://linux.cn/article-13803-1.html" + +如何用 rpm-ostree 数据库检查更新信息和更新日志 +====== + +![][1] + +这篇文章将教你如何使用 `rpm-ostree` 数据库及其子命令检查更新、检查更改的软件包和阅读更新日志。 + +这些命令将在 Fedora Silverblue 上进行演示,并且应该在任何使用 `rpm-ostree` 的操作系统上工作。 + +### 简介 + +假设你对不可更改的系统感兴趣。在基于容器技术构建用例时使用只读的基本系统听起来非常有吸引力,它会说服你选择使用 `rpm-ostree` 的发行版。 + +你现在发现自己在 [Fedora Silverblue][4](或其他类似的发行版)上,你想检查更新。但你遇到了一个问题。虽然你可以通过 GNOME Software 找到 Fedora Silverblue 上的更新包,但你实际上无法阅读它们的更新日志。你也不能 [使用 dnf updateinfo 在命令行上读取它们][5],因为主机系统上没有 DNF。 + +那么,你应该怎么做呢?嗯,`rpm-ostree` 有一些子命令可以在这种情况下提供帮助。 + +### 检查更新 + +第一步是检查更新。只需运行: + +``` +$ rpm-ostree upgrade --check +... +AvailableUpdate: + Version: 34.20210905.0 (2021-09-05T20:59:47Z) + Commit: d8bab818f5abcfb58d2c038614965bf26426d55667e52018fcd295b9bfbc88b4 + GPGSignature: Valid signature by 8C5BA6990BDB26E19F2A1A801161AE6945719A39 + SecAdvisories: 1 moderate + Diff: 4 upgraded +``` + +请注意,虽然它没有在输出中告诉更新的软件包,但它显示了更新的提交为 `d8bab818f5abcfb58d2c038614965bf26426d55667e52018fcd295b9bfbc88b4`。这在后面会很有用。 + +接下来你需要做的是找到你正在运行的当前部署的提交。运行 `rpm-ostree status` 以获得当前部署的基提交BaseCommit: + +``` +$ rpm-ostree status +State: idle +Deployments: +● fedora:fedora/34/x86_64/silverblue + Version: 34.20210904.0 (2021-09-04T19:16:37Z) + BaseCommit: e279286dcd8b5e231cff15c4130a4b1f5a03b6735327b213ee474332b311dd1e + GPGSignature: Valid signature by 8C5BA6990BDB26E19F2A1A801161AE6945719A39 + RemovedBasePackages: ... + LayeredPackages: ... +... +``` + +对于这个例子,基提交是`e279286dcd8b5e231cff15c4130a4b1f5a03b6735327b213ee474332b311dd1e`。 + +现在你可以用 `rpm-ostree db diff [commit1] [commit2]` 找到这两个提交的差异。在这个命令中,`[commit1]` 将是当前部署的基提交,`[commit2]` 将是升级检查命令中的提交。 + +``` +$ rpm-ostree db diff e279286dcd8b5e231cff15c4130a4b1f5a03b6735327b213ee474332b311dd1e d8bab818f5abcfb58d2c038614965bf26426d55667e52018fcd295b9bfbc88b4 +ostree diff commit from: e279286dcd8b5e231cff15c4130a4b1f5a03b6735327b213ee474332b311dd1e +ostree diff commit to: d8bab818f5abcfb58d2c038614965bf26426d55667e52018fcd295b9bfbc88b4 +Upgraded: + soundtouch 2.1.1-6.fc34 -> 2.1.2-1.fc34 +``` + +`diff` 输出显示 `soundtouch` 被更新了,并指出了版本号。通过在前面的命令中加入 `-changelogs` 来查看更新日志: + +``` +$ rpm-ostree db diff e279286dcd8b5e231cff15c4130a4b1f5a03b6735327b213ee474332b311dd1e d8bab818f5abcfb58d2c038614965bf26426d55667e52018fcd295b9bfbc88b4 --changelogs +ostree diff commit from: e279286dcd8b5e231cff15c4130a4b1f5a03b6735327b213ee474332b311dd1e +ostree diff commit to: d8bab818f5abcfb58d2c038614965bf26426d55667e52018fcd295b9bfbc88b4 +Upgraded: + soundtouch 2.1.1-6.fc34.x86_64 -> 2.1.2-1.fc34.x86_64 + * dom ago 29 2021 Uwe Klotz - 2.1.2-1 + - Update to new upstream version 2.1.2 + Bump version to 2.1.2 to correct incorrect version info in configure.ac + + * sex jul 23 2021 Fedora Release Engineering - 2.1.1-7 + - Rebuilt for https://fedoraproject.org/wiki/Fedora_35_Mass_Rebuild +``` + +这个输出显示了提交说明以及版本号。 + +### 总结 + +使用 `rpm-ostree db`,你现在可以拥有相当于 `dnf check-update` 和 `dnf updateinfo` 的功能。 + +如果你想检查你所安装的更新的详细信息,这将非常有用。 + +-------------------------------------------------------------------------------- + +via: https://fedoramagazine.org/how-to-check-for-update-info-and-changelogs-with-rpm-ostree-db/ + +作者:[Mateus Rodrigues Costa][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/mateusrodcosta/ +[b]: https://github.com/lujun9972 +[1]: https://fedoramagazine.org/wp-content/uploads/2021/09/rpm-ostree-db_changelog-816x345.jpg +[2]: https://unsplash.com/@dancristianp?utm_source=unsplash&utm_medium=referral&utm_content=creditCopyText +[3]: https://unsplash.com/s/photos/backdrop?utm_source=unsplash&utm_medium=referral&utm_content=creditCopyText +[4]: https://fedoramagazine.org/what-is-silverblue/ +[5]: https://fedoramagazine.org/use-dnf-updateinfo-to-read-update-changelogs/ diff --git a/published/202109/20210915 Raspberry Pi Zero vs Zero W- What-s the Difference.md b/published/202109/20210915 Raspberry Pi Zero vs Zero W- What-s the Difference.md new file mode 100644 index 0000000000..b7b68fd5ce --- /dev/null +++ b/published/202109/20210915 Raspberry Pi Zero vs Zero W- What-s the Difference.md @@ -0,0 +1,96 @@ +[#]: subject: "Raspberry Pi Zero vs Zero W: What’s the Difference?" +[#]: via: "https://itsfoss.com/raspberry-pi-zero-vs-zero-w/" +[#]: author: "Ankush Das https://itsfoss.com/author/ankush/" +[#]: collector: "lujun9972" +[#]: translator: "anine09" +[#]: reviewer: "wxy" +[#]: publisher: "wxy" +[#]: url: "https://linux.cn/article-13799-1.html" + +树莓派 Zero 与 Zero W 对比 +====== + +树莓派十年前凭借 25 美元的迷你电脑掀起了一场革命。随着时间的推移,树莓派发布了许多变种。有些是对以前的型号进行升级,有些是为特定目的而制作的。 + +在所有的树莓派模块中,Pi Zero 和 Pi Zero W 是最便宜的型号,旨在用于小规模项目和 IoT 项目。这两种设备几乎是相同的,但是它们之间有一些微妙而重要的区别。 + +**那么,树莓派 Zero 和 Zero W 之间的区别是什么?Zero W 中的 W 代表的是无线Wireless,它表示的是 Zero W 模块拥有无线功能。这是这两个相似模块之间的最大差异。** + +让我们来详细了解一下。 + +### Pi Zero 与 Pi Zero W 之间的主要不同点 + +![][1] + +树莓派 Zero 是以在只有 A+ 板一半的大小上提供尽可能多的功能为目标。 + +而树莓派 Zero W 是为了支持无线在后来推出的,在不需要任何附加的组件和模块的情况下就可以使用蓝牙和 Wi-Fi。 + +这是两者之间的关键区别,其他的规格保持一致。 + +所以,如果你需要以下功能: + + * 802.11 b/g/n 无线网口 + * 蓝牙 4.1 + * 低功耗蓝牙(BLE) + +树莓派 Zero W 将是你的不二之选。 + +此外,树莓派 Zero W 还提供了一种带引脚的版本,叫做 “树莓派 Pi Zero WH” + +### 树莓派 Zero 和 Zero W 的规格 + +![Raspberry Pi Zero W][6] + +[树莓派 Zero 和 Zero W 的规格][7] 几乎是一样的。 + +它们都具有 1 GHz 的单核 CPU 和 512 MB 的 RAM。至于接口方面,一个 mini HDMI 接口,支持 micro USB OTG、micro USB 供电和一个 CSI 摄像头接口(用于插入一个相机模块)。 + +这些板子会提供一种叫 [HAT][8](顶部附加硬件Hardware Attached on Top)兼容的 40 个引脚。但一般情况下,没有这些可以让你轻松插入接口的引脚。 + +你可以根据自己的功能需要选择使用 [各种树莓派兼容的系统][9],但无论哪种情况,我还是推荐你使用树莓派 OS。 + +### 树莓派 Zero 系列值不值得买? + +![Raspberry Pi Zero][10] + +树莓派 Zero 是一种很受人们喜欢的单片机形式,即使你有很多树莓派 Zero 的替代品,树莓派 Zero 仍然是最推荐的选择。 + +当然,除非你有特殊需求。 + +除了板子的尺寸之外,定价、功率要求、运算能力也是这款 20 美元以下的板子的主要亮点。 + +因此,如果你正在寻找预算内满足基本功能的单片机,树莓派 Zero 就是专门为你打造的。 + +### 树莓派 Zero 系列价格怎么样? + +树莓派 Zero 售价 **5 美元** ,Zero W 售价 **10 美元左右**,当然,根据其供应情况和地区,定价规则会不一样,如果你选择带引脚的版本树莓派 Zero WH ,售价大概是 **14 美元** 左右。 + +还有 [其他的设备可以代替树莓派 Zero][11],它们价格也相差不大。 + +-------------------------------------------------------------------------------- + +via: https://itsfoss.com/raspberry-pi-zero-vs-zero-w/ + +作者:[Ankush Das][a] +选题:[lujun9972][b] +译者:[anine09](https://github.com/anine09) +校对:[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/2021/09/raspberry-pi-zero-vs-zero-w.png?resize=800%2C450&ssl=1 +[2]: https://i1.wp.com/m.media-amazon.com/images/I/517BwcAPmTL._SL160_.jpg?ssl=1 +[3]: https://www.amazon.com/dp/B072N3X39J?tag=chmod7mediate-20&linkCode=osi&th=1&psc=1 "CanaKit Raspberry Pi Zero W (Wireless) Complete Starter Kit - 16 GB Edition" +[4]: https://www.amazon.com/gp/prime/?tag=chmod7mediate-20 "Amazon Prime" +[5]: https://www.amazon.com/dp/B072N3X39J?tag=chmod7mediate-20&linkCode=osi&th=1&psc=1 "Buy on Amazon" +[6]: https://i0.wp.com/itsfoss.com/wp-content/uploads/2021/09/raspberry-pi-zero-w.png?resize=600%2C400&ssl=1 +[7]: https://itsfoss.com/raspberry-pi-zero-w/ +[8]: https://github.com/raspberrypi/hats +[9]: https://itsfoss.com/raspberry-pi-os/ +[10]: https://i0.wp.com/itsfoss.com/wp-content/uploads/2021/09/raspberry-pi-zero-1.png?resize=600%2C400&ssl=1 +[11]: https://itsfoss.com/raspberry-pi-zero-alternatives/ +[12]: https://i0.wp.com/itsfoss.com/wp-content/uploads/2020/10/raspberry-pi-zero-w-projects.png?fit=800%2C450&ssl=1 +[13]: https://itsfoss.com/raspberry-pi-zero-projects/ diff --git a/published/202109/20210915 Screen Recording in Linux With OBS and Wayland.md b/published/202109/20210915 Screen Recording in Linux With OBS and Wayland.md new file mode 100644 index 0000000000..931655002d --- /dev/null +++ b/published/202109/20210915 Screen Recording in Linux With OBS and Wayland.md @@ -0,0 +1,125 @@ +[#]: subject: "Screen Recording in Linux With OBS and Wayland" +[#]: via: "https://itsfoss.com/screen-record-obs-wayland/" +[#]: author: "Abhishek Prakash https://itsfoss.com/author/abhishek/" +[#]: collector: "lujun9972" +[#]: translator: "geekpi" +[#]: reviewer: "wxy" +[#]: publisher: "wxy" +[#]: url: "https://linux.cn/article-13802-1.html" + +在 Linux 中使用 OBS 和 Wayland 进行屏幕录制 +====== + +有 [大量可用于 Linux 的屏幕录像机][1]。但是当涉及到支持 [Wayland][2] 时,几乎所有的都不能用。 + +这是个问题,因为许多新发布的版本都再次默认切换到 Wayland 显示管理器。而如果像屏幕录像机这样基本的东西不能工作,就会给人留下不好的体验。 + +[GNOME 的内置屏幕录像机][3] 可以工作,但它是隐藏的,没有 GUI,也没有办法配置和控制记录内容。此外,还有一个叫 [Kooha][4] 的工具,但它一直在屏幕上显示一个计时器。 + +只是为了录制屏幕而 [在 Xorg 和 Wayland 之间切换][5],这不是很方便。 + +这种情况下,我很高兴地得知,由于 Pipewire 的帮助,在 OBS Studio v27 中支持了 Wayland。但即使是这样,也不是很简单,因此我将向你展示使用 [OBS Studio][6] 在 Wayland 上录制屏幕的步骤。 + +### 使用 OBS 在 Wayland 上进行屏幕录制 + +![][7] + +让我们来看看它是如何完成的。 + +#### 第一步:安装 OBS Studio + +你应该先安装 OBS Studio v27。它已经包含在 Ubuntu 21.10 中,我会在本教程中使用它。 + +要在 Ubuntu 18.04、20.04、Linux Mint 20 等系统上安装 OBS Studio 27,请使用 [官方的 OBS Studio PPA][8]。 + +打开终端,逐一使用以下命令: + +``` +sudo add-apt-repository ppa:obsproject/obs-studio +sudo apt update +sudo apt install obs-studio +``` + +如果已经安装了 OBS Studio 的旧版本,它将被升级到较新的版本。 + +对于 Fedora、Arch 和其他发行版,请检查你的包管理器或非官方仓库以安装最新版本的 OBS Studio。 + +#### 第二步:检查 Wayland 捕获是否工作 + +请确认你正在使用 Wayland。现在启动 OBS Studio,查看它在第一次运行时显示的所有内容。我不打算展示这些。 + +主要步骤是添加 Pipewire 作为屏幕捕捉源。点击 “Sources” 列表下的 “+” 符号。 + +![Add screen capture source in OBS Studio][9] + +你有没有看到 “Screen Capture (PipeWire)” 的字样? + +![Do you see PipeWire option in the screen sources?][10] + +**如果没看到,请退出 OBS Studio**。这很正常。至少在 Ubuntu 下,OBS Studio 不会自动切换到使用 Wayland。对此有一个修复方法。 + +打开一个终端,使用以下命令: + +``` +export QT_QPA_PLATFORM=wayland +``` + +在同一个终端,运行以下命令,启动 OBS Studio: + +``` +obs +``` + +它将在终端上显示一些信息。不要理会它们。你的注意力应该放在 OBS Studio GUI 上。再次尝试添加屏幕捕捉。你现在应该看到 PipeWire 选项了。 + +![][10] + +你这次用 `QT_QPA_PLATFORM` 变量明确要求 OBS Studio 使用 Wayland。 + +选择 PipeWire 作为源,然后它要求你选择一个显示屏幕。选择它并点击分享按钮。 + +![][11] + +现在它应该无限次递归地显示你的屏幕。如果你看到了,你现在就可以开始在 Wayland 中录制屏幕了。 + +![][12] + +#### 第三步:让改变成为永久性的 + +这很好。你刚刚验证了你可以在 Wayland 上录制屏幕。但每次设置环境变量并从终端启动 OBS 并不方便。 + +你可以做的是**把这个变量导出到你的 `~/.bash_profile`(对你而言)或 `/etc/profile`(对系统中的所有用户而言)。** + +``` +export QT_QPA_PLATFORM=wayland +``` + +退出并重新登录。现在 OBS 会自动开始使用这个参数,你可以用它来录制 Wayland 的屏幕。 + +我希望这个快速技巧对你有帮助。如果你还有问题或建议,请在评论区告诉我。 + +-------------------------------------------------------------------------------- + +via: https://itsfoss.com/screen-record-obs-wayland/ + +作者:[Abhishek Prakash][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/abhishek/ +[b]: https://github.com/lujun9972 +[1]: https://itsfoss.com/best-linux-screen-recorders/ +[2]: https://wayland.freedesktop.org/ +[3]: https://itsfoss.com/gnome-screen-recorder/ +[4]: https://itsfoss.com/kooha-screen-recorder/ +[5]: https://itsfoss.com/switch-xorg-wayland/ +[6]: https://obsproject.com/ +[7]: https://i0.wp.com/itsfoss.com/wp-content/uploads/2021/09/obs-screen-record-wayland.webp?resize=800%2C450&ssl=1 +[8]: https://launchpad.net/~obsproject/+archive/ubuntu/obs-studio +[9]: https://i2.wp.com/itsfoss.com/wp-content/uploads/2021/09/obs-studio-add-screen-capture-source.png?resize=800%2C537&ssl=1 +[10]: https://i0.wp.com/itsfoss.com/wp-content/uploads/2021/09/obs-studio-wayland-support.png?resize=800%2C538&ssl=1 +[11]: https://i2.wp.com/itsfoss.com/wp-content/uploads/2021/09/obs-studio-screen.png?resize=800%2C578&ssl=1 +[12]: https://i1.wp.com/itsfoss.com/wp-content/uploads/2021/09/start-screen-recording-obs-wayland.jpg?resize=800%2C537&ssl=1 diff --git a/published/202109/20210916 Kali Linux 2021.3 Brings in Kali Live VM Support, New Tools, and Other Improvements.md b/published/202109/20210916 Kali Linux 2021.3 Brings in Kali Live VM Support, New Tools, and Other Improvements.md new file mode 100644 index 0000000000..64d25716e9 --- /dev/null +++ b/published/202109/20210916 Kali Linux 2021.3 Brings in Kali Live VM Support, New Tools, and Other Improvements.md @@ -0,0 +1,107 @@ +[#]: subject: "Kali Linux 2021.3 Brings in Kali Live VM Support, New Tools, and Other Improvements" +[#]: via: "https://news.itsfoss.com/kali-linux-2021-3-release/" +[#]: author: "Omar Maarof https://news.itsfoss.com/author/omar/" +[#]: collector: "lujun9972" +[#]: translator: "wxy" +[#]: reviewer: "wxy" +[#]: publisher: "wxy" +[#]: url: "https://linux.cn/article-13798-1.html" + +Kali Linux 2021.3 的新改进 +====== + +> Kali Linux 2021.3 带来了一些重要的功能改进以及一些新工具。此外还有一个惊喜,他们还宣布正在开发他们的第一个 NetHunter 智能手表。 + +![](https://i2.wp.com/news.itsfoss.com/wp-content/uploads/2021/09/kali-linux-2021-3.jpg?w=1200&ssl=1) + +Kali Linux 是 [用于渗透测试的最佳 Linux 发行版][1] 之一。它是基于 Debian 的,但它可能不适合替代你的成熟的桌面操作系统。 + +最新的 2021.3 版本带来了一些重要的功能添加和改进。让我们来看看它们。 + +### 有何新变化? + +![][2] + +#### OpenSSL 兼容性 + +重新配置了 [OpenSSL][3],以扩大 Kali 可以连接的服务。因此,老式过期的协议,如 TLS 1.0 和 TLS 1.1 以及更旧的加密算法,在默认情况下是允许的。也就是说;它将让 Kali 可以连接到更多过时的服务器。然而,如果你不需要它,你可以改变这个选项。 + +#### 虚拟化的改进 + +众所周知,Kali 可以作为一个虚拟机完美地工作。首先,无论你的访客机是在 VirtualBox、VMware、Hyper-V 还是 QEMU+Spice 下运行,宿主机和访客机系统之间的拖放、复制和粘贴等操作都比以前更顺畅。 + +其次,使用 Kali-Tweaks 可以更容易为 Hyper-V 增强会话模式(一种虚拟化管理程序)配置 Kali。 + +简而言之,Kali Linux 2021.3 使得在设置虚拟环境时的体验更加完美。 + +#### Kali 工具 + +每一个 Kali 版本都包含新的工具,这是理所当然的。同样的,这个版本也不例外。Kali 加入的工具有: + + * [Berate_ap][4] - 编组 MANA rogue Wi-Fi 接入点 + * [CALDERA][5] - 可扩展的自动对手模拟平台 + * [EAPHammer][6] - 针对 WPA2-Enterprise Wi-Fi 网络的 evil twin 攻击 + * [HostHunter][7] - 使用 OSINT 技术发现主机名的侦察工具 + * [RouterKeygenPC][8] - 生成默认的 WPA/WEP 无线密钥 + * [Subjack][9] - 子域接管 + * [WPA_Sycophant][10] - EAP 中继攻击的邪恶客户端部分 + +#### Kali ARM 更新和 Kali-Tools + +在 Kali 2021.3 中,对 ARM 设备的支持得到了更多的改进。我发现最吸引人的是: + + * en_US.UTF-8 是所有镜像的默认语言。 + * 重新构建了 Kali ARM 构建脚本,以更好地支持一些设备。 + * 树莓派镜像现在可以使用 `/boot` 分区上的 `wpa_supplicant.conf` 文件。 + +此外,Kali 刷新了其信息域 **Kali-Tools**,以提供简洁的工具概述、整洁的界面和快速的系统。 + +### 其他变化 + +![Kali Linux 2021.3][11] + +Kali 还有其他一些不错的改进,包括: + + * 改进了 Xfce 和 Gnome 版本的布局。Kali 并没有忘记 KDE,因为这是它最喜欢的桌面环境之一,已经内置了 KDE 5.21 是新的版本。 + * 他们的文档网站中的一些重要页面进行了大幅更新。 + * 与 Ampere 合作,让其 ARM 包构建机运行在 Ampere 的硬件上。因此,其大幅的提速使得 Kali 受益。 + +Kali 增强了针对安卓设备的移动渗透测试平台。换句话说,你现在可以在 Android 11 设备上安装 Kali NetHunter,而不需要完整的可工作的 [TWRP][12](Team Win Recovery Project)。最重要的是,由于其方便的安装程序,这一更新很有希望。 + +除了这个版本之外,他们还宣布了他们的第一个 NetHunter 智能手表,**TicHunter Pro**。但是,它仍然处于开发的最初阶段。 + +要了解更多关于这次升级的所有技术变化,请参考 [官方公告][13]。 + +### 总结 + +总的来说,这是一个重要的版本,提供了重要的改进和令人兴奋的新工具。从它的官方网站上下载它,就可以开始了。 + +- [下载 Kali Linux 2021.3][14] + +-------------------------------------------------------------------------------- + +via: https://news.itsfoss.com/kali-linux-2021-3-release/ + +作者:[Omar Maarof][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://news.itsfoss.com/author/omar/ +[b]: https://github.com/lujun9972 +[1]: https://itsfoss.com/linux-hacking-penetration-testing/ +[2]: https://i1.wp.com/news.itsfoss.com/wp-content/uploads/2021/09/kali-linux-desktop-2021-3.png?w=1200&ssl=1 +[3]: https://www.openssl.org/ +[4]: https://pkg.kali.org/pkg/berate-ap +[5]: https://pkg.kali.org/pkg/caldera +[6]: https://pkg.kali.org/pkg/eaphammer +[7]: https://pkg.kali.org/pkg/hosthunter +[8]: https://pkg.kali.org/pkg/routerkeygenpc +[9]: https://pkg.kali.org/pkg/subjack +[10]: https://pkg.kali.org/pkg/wpa-sycophant +[11]: https://i0.wp.com/news.itsfoss.com/wp-content/uploads/2021/09/banner-kali-2021.3-release.jpg?w=1200&ssl=1 +[12]: http://twrp.me/ +[13]: https://www.kali.org/blog/kali-linux-2021-3-release/ +[14]: https://www.kali.org/get-kali/ diff --git a/published/202109/20210916 Watch commands and tasks with the Linux watch command.md b/published/202109/20210916 Watch commands and tasks with the Linux watch command.md new file mode 100644 index 0000000000..4bd279ab40 --- /dev/null +++ b/published/202109/20210916 Watch commands and tasks with the Linux watch command.md @@ -0,0 +1,116 @@ +[#]: subject: "Watch commands and tasks with the Linux watch command" +[#]: via: "https://opensource.com/article/21/9/linux-watch-command" +[#]: author: "Moshe Zadka https://opensource.com/users/moshez" +[#]: collector: "lujun9972" +[#]: translator: "geekpi" +[#]: reviewer: "wxy" +[#]: publisher: "wxy" +[#]: url: "https://linux.cn/article-13810-1.html" + +用 Linux 的 watch 命令观察命令和任务 +====== + +> 了解 watch 命令如何让你知道任务已完成或命令已执行。 + +![](https://img.linux.net.cn/data/attachment/album/202109/22/104541ddfgzpvud5ga55sp.jpg) + +有很多时候,你需要等待一些事情的完成,比如: + + * 一个文件的下载。 + * 创建或解压一个 [tar][2] 文件。 + * 一个 [Ansible][3] 作业。 + +其中一些进程有进度指示,但有时进程是通过一层抽象运行的,衡量进度的唯一方法是通过其副作用。其中一些可能是: + + * 一个正在下载的文件不断增长。 + * 一个从 tarball 中提取的目录被文件填满了。 + * Ansible 作业构建了一个[容器][4]。 + +你可以用这样的命令查询所有这些: + +``` +$ ls -l downloaded-file +$ find . | wc -l +$ podman ps +$ docker ps +``` + +但是反复运行这些命令,即使是利用 [Bash 历史][5] 和**向上箭头**的便利,也是很乏味的。 + +另一种方法是写一个小的 Bash 脚本来为你自动执行这些命令: + +``` +while : +do + docker ps + sleep 2 +done +``` + +但这样的脚本写起来也会很繁琐。你可以写一个小的通用脚本,并将其打包,这样它就可以一直被你使用。幸运的是,其他开源的开发者已经有了这样的经验和做法。 + +那就是 `watch` 这个命令。 + +### 安装 watch + +`watch` 命令是 [procps-ng 包][6]的一部分,所以如果你是在 Linux 上,你已经安装了它。 + +在 macOS 上,使用 [MacPorts][7] 或 [Homebrew][8] 安装 `watch`。在 Windows 上,使用 [Chocolatey][9]。 + +### 使用 watch + +`watch` 命令定期运行一个命令并显示其输出。它有一些文本终端的特性,所以只有最新的输出才会出现在屏幕上。 + +最简单的用法是:`watch `。 + +例如,在 `docker ps` 命令前加上 `watch`,就可以这样操作: + +``` +$ watch docker ps +``` + +用 `watch` 命令,以及一些创造性的 Unix 命令行技巧,可以生成临时的仪表盘。例如,要计算审计事件: + +``` +$ watch 'grep audit: /var/log/kern.log |wc -l' +``` + +在最后一个例子中,如果有一个可视化的指示,表明审计事件的数量发生了变化,这可能是有用的。如果变化是预期的,但你想让一些东西看起来“不同”,`watch --differences` 就很好用。它可以高亮显示与上次运行的任何差异。如果你在多个文件中搜索,这一点尤其有效,所以你可以很容易地看到哪个文件发生了变化。 + +如果没有预期的变化,你可以使用 `watch --differences=permanent` 要求它们被“永久”高亮显示,以便知道哪些变化需要调查。这通常是更有用的。 + +### 控制频率 + +最后,有时该命令可能是资源密集型的,不应运行得太频繁。`-n` 参数控制频率。`watch` 默认使用 2 秒间隔,但是 `watch -n 10` 可能适合于资源密集型的情况,比如在子目录的任何文件中搜索一个模式: + +``` +$ watch -n 10 'find . -type f | xargs grep suspicious-pattern' +``` + +### 用 watch 观察一个命令 + +`watch` 命令对于许多临时性的系统管理任务非常有用,在这些任务中,你需要在没有进度条的情况下等待一些耗时的步骤,然后再进入下一个步骤。尽管这种情况并不理想,但 `watch` 可以使情况稍微好转。它让你有时间为工作做回顾性笔记!"。下载 [备忘录][10],让有用的语法和选项触手可及。。 + +-------------------------------------------------------------------------------- + +via: https://opensource.com/article/21/9/linux-watch-command + +作者:[Moshe Zadka][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/moshez +[b]: https://github.com/lujun9972 +[1]: https://opensource.com/sites/default/files/styles/image-full-size/public/lead-images/desk_clock_job_work.jpg?itok=Nj4fuhl6 (Clock, pen, and notepad on a desk) +[2]: https://opensource.com/article/17/7/how-unzip-targz-file +[3]: https://opensource.com/resources/what-ansible +[4]: https://opensource.com/resources/what-docker +[5]: https://opensource.com/article/20/6/bash-history-control +[6]: https://opensource.com/article/21/8/linux-procps-ng +[7]: https://opensource.com/article/20/11/macports +[8]: https://opensource.com/article/20/6/homebrew-mac +[9]: https://opensource.com/article/20/3/chocolatey +[10]: https://opensource.com/downloads/watch-cheat-sheet diff --git a/published/202109/20210917 How to Install Kali Linux in VMware.md b/published/202109/20210917 How to Install Kali Linux in VMware.md new file mode 100644 index 0000000000..0312e49ddf --- /dev/null +++ b/published/202109/20210917 How to Install Kali Linux in VMware.md @@ -0,0 +1,194 @@ +[#]: subject: "How to Install Kali Linux in VMware" +[#]: via: "https://itsfoss.com/install-kali-linux-vmware/" +[#]: author: "Ankush Das https://itsfoss.com/author/ankush/" +[#]: collector: "lujun9972" +[#]: translator: "wxy" +[#]: reviewer: "wxy" +[#]: publisher: " " +[#]: url: " " + +如何在 VMware 中安装 Kali Linux +====== + +![](https://img.linux.net.cn/data/attachment/album/202109/21/144206sjhgutyjgtu6m22z.jpg) + +Kali Linux 是 [用于学习和练习黑客攻击和渗透测试的 Linux 发行版][1] 的不二之选。 + +而且,如果你经常捣鼓 Linux 发行版,出于好奇心,你可能已经尝试过它。 + +> **警告!** +> +> 本文介绍的内容仅供学习 Kali Linux 的安装,请勿使用 Kali Linux 进行任何非授权的行为。Kali Linux 应该用于在授权的情况下,对授权的目标进行合理的渗透测试,以了解其脆弱性并加以防范。本文作译者和本站均不对非授权和非法的使用及其造成的后果负责。 + +然而,无论你用它做什么,它都不能替代正规成熟的桌面 Linux 操作系统。因此,(至少对于初学者来说)建议使用虚拟机程序(如 VMware)来安装 Kali Linux。 + +通过虚拟机,你可以把 Kali Linux 作为你的 Windows 或 Linux 系统中的一个常规应用程序来使用,就像在你的系统中运行 VLC 或 Skype 一样。 + +有一些免费的虚拟化工具可供使用。你可以 [在 Oracle VirtualBox 上安装 Kali Linux][2] ,也可以使用 VMWare Workstation。 + +本教程重点介绍 VMWare。 + +### 在 Windows 和 Linux 的 VMware 上安装 Kali Linux + +> **非 FOSS 警报!** +> +> VMWare 不是开源软件。 + +对于本教程,我假定你使用的是 Windows,是考虑到大多数 VMware 用户喜欢使用 Windows 10/11。 + +然而,除了在 Windows 上安装 VMWare 的部分,本 **教程对 Linux 也是有效的**。你可以 [轻松地在 Ubuntu 和其他 Linux 发行版上安装 VMWare][3]。 + +#### 步骤 1:安装 VMWare Workstation Player(在 Windows 上) + +如果你的系统上已经安装了 VMware,你可以跳到安装 Kali Linux 的步骤。 + +前往 [VMWare 的 Workstation Player 官方网页][4],然后点击 “Download For Free” 按钮。 + +![][5] + +接下来,你可以选择版本(如果你想要特定的版本或遇到最新版本的 bug),然后点击 “Go to Downloads”。 + +![][6] + +然后你就会看到 Windows 和 Linux 版本的下载按钮。你需要点击 “Windows 64-bit” 的按钮,因为这就是我们在这里需要的。 + +![][7] + +顺便提一句,它不支持 32 位系统。 + +最后,当你得到下载的 .exe 文件时,启动它以开始安装过程。你需要点击 “Next” 来开始安装 VMware。 + +![][8] + +接下来,你需要同意这些政策和条件才能继续。 + +![][9] + +现在,你可以选择安装的路径。理想情况下,保持默认设置。但是,如果你在虚拟机中需要更好的键盘响应/屏幕上的键盘性能,你可能想启用 “增强型键盘驱动程序Enhanced Keyboard Driver”。 + +![][10] + +进入下一步,你可以选择禁用每次启动程序时的更新检查(可能很烦人),并禁用向 VMware 发送数据,这是其用户体验改进计划的一部分。 + +![][11] + +如果你想使用桌面和开始菜单的快捷方式进行快速访问,你可以勾选这些设置,或像我一样将其取消。 + +![][12] + +现在,继续以开始安装。 + +![][13] + +这可能需要一些时间,完成后,你会看到另一个窗口,让你完成这个过程,并让你选择输入一个许可证密钥。如果你想获得商业许可,你需要 VMware Workstation 专业版,否则,该 Player 版本对个人使用是免费的。 + +![][14] + +> **注意!** +> +> 请确保你的系统已经启用了虚拟化功能。最近的 VMWare 的 Windows 版本要求你明确启用虚拟化以使用虚拟机。 + +#### 步骤 2:在 VMware 上安装 Kali Linux + +开始时,你需要下载 Kali Linux 的镜像文件。而且,如果你打算在虚拟机上使用它,Kali Linux 会提供一个单独的 ISO 文件。 + +![][15] + +前往其 [官方下载页面][16],下载可用的预构建的 VMware 镜像。 + +![][17] + +你可以直接下载 .7z 文件或利用 Torrent(一般来说速度更快)。在这两种情况下,你也可以用提供的 SHA256 值检查文件的完整性。 + +下载完成,你需要将文件解压到你选择的任何路径。 + +![][18] + +打开 VMware Workstation Player,然后点击 “打开一个虚拟机Open a Virtual Machine”。现在,寻找你提取的文件夹。然后浏览它,直到你找到一个扩展名为 .vmx 的文件。 + +比如说,`Kali-Linux-2021.3-vmware-amd64.vmx`。 + +![][19] + +选择 .vmx 文件来打开该虚拟机。它应该直接出现在你的 VMware Player 中。 + +你可以选择以默认设置启动虚拟机。或者,如果你想调整分配给虚拟机的硬件,可以在启动前随意改变设置。 + +![][20] + +根据你的计算机硬件,你应该分配更多的内存和至少一半的处理器核心,以获得流畅的性能。 + +在这种情况下,我有 16GB 的内存和一个四核处理器。因此,为这个虚拟机分配近 7GB 的内存和两个内核是安全的。 + +![][21] + +虽然你可以分配更多的资源,但它可能会影响你的宿主机操作系统在工作时的性能。所以,建议在这两者之间保持平衡。 + +现在,保存设置并点击 “播放虚拟机Play virtual machine” 来启动 Kali Linux on VMware。 + +当它开始加载时,你可能会看到一些提示,告诉你可以通过调整一些虚拟机设置来提高性能。 + +你不用必须这样做,但如果你注意到性能问题,你可以禁用侧通道缓解措施side-channel mitigations(用于增强安全性)来提高虚拟机的性能。 + +另外,你可能会被提示下载并 [安装 VMware tools for Linux][22];你需要这样做以获得良好的虚拟机体验。 + +完成之后,你就会看到 Kali Linux 的登录界面。 + +![][23] + +考虑到你启动了一个预先建立的 VMware 虚拟机,你需要输入默认的登录名和密码来继续。 + +- 用户名:`kali` +- 密码: `kali` + +![][24] + +就是这样!你已经完成了在 VMware 上安装 Kali Linux。现在,你所要做的就是开始探索了! + +### 接下来呢? + +这里有一些你可以利用的提示: + + * 如果剪贴板共享和文件共享不工作,请在访客系统(Kali Linux)上 [安装 VMWare tools][22]。 + * 如果你是新手,请查看这个 [Kali Linux 工具列表][25]。 + +如果你觉得这个教程有帮助,欢迎分享你的想法。你是否喜欢在不使用 VMware 镜像的情况下安装 Kali Linux?请在下面的评论中告诉我。 + +-------------------------------------------------------------------------------- + +via: https://itsfoss.com/install-kali-linux-vmware/ + +作者:[Ankush Das][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://itsfoss.com/author/ankush/ +[b]: https://github.com/lujun9972 +[1]: https://itsfoss.com/linux-hacking-penetration-testing/ +[2]: https://itsfoss.com/install-kali-linux-virtualbox/ +[3]: https://itsfoss.com/install-vmware-player-ubuntu-1310/ +[4]: https://www.vmware.com/products/workstation-player.html +[5]: https://i2.wp.com/itsfoss.com/wp-content/uploads/2021/09/vmware-player-download.png?resize=732%2C486&ssl=1 +[6]: https://i1.wp.com/itsfoss.com/wp-content/uploads/2021/09/vmware-player-download-1.png?resize=800%2C292&ssl=1 +[7]: https://i0.wp.com/itsfoss.com/wp-content/uploads/2021/09/vmware-player-download-final.png?resize=800%2C212&ssl=1 +[8]: https://i1.wp.com/itsfoss.com/wp-content/uploads/2021/09/vmware-setup-1.png?resize=692%2C465&ssl=1 +[9]: https://i2.wp.com/itsfoss.com/wp-content/uploads/2021/09/vmware-setup-license.png?resize=629%2C443&ssl=1 +[10]: https://i2.wp.com/itsfoss.com/wp-content/uploads/2021/09/vmware-setup-2.png?resize=638%2C440&ssl=1 +[11]: https://i0.wp.com/itsfoss.com/wp-content/uploads/2021/09/vmware-workstation-tracking.png?resize=618%2C473&ssl=1 +[12]: https://i2.wp.com/itsfoss.com/wp-content/uploads/2021/09/vmware-workstation-shortcuts.png?resize=595%2C445&ssl=1 +[13]: https://i0.wp.com/itsfoss.com/wp-content/uploads/2021/09/vmware-player-install.png?resize=620%2C474&ssl=1 +[14]: https://i2.wp.com/itsfoss.com/wp-content/uploads/2021/09/vmware-player-installed.png?resize=589%2C441&ssl=1 +[15]: https://i0.wp.com/itsfoss.com/wp-content/uploads/2021/09/vmware-image-kali.png?resize=800%2C488&ssl=1 +[16]: https://www.kali.org/get-kali/ +[17]: https://i2.wp.com/itsfoss.com/wp-content/uploads/2021/09/vmware-kali-linux-image-download.png?resize=800%2C764&ssl=1 +[18]: https://i2.wp.com/itsfoss.com/wp-content/uploads/2021/09/extract-vmware-image.png?resize=617%2C359&ssl=1 +[19]: https://i2.wp.com/itsfoss.com/wp-content/uploads/2021/09/vmware-kali-linux-image-folder.png?resize=800%2C498&ssl=1 +[20]: https://i0.wp.com/itsfoss.com/wp-content/uploads/2021/09/virtual-machine-settings-kali.png?resize=800%2C652&ssl=1 +[21]: https://i1.wp.com/itsfoss.com/wp-content/uploads/2021/09/kali-vm-settings.png?resize=800%2C329&ssl=1 +[22]: https://itsfoss.com/install-vmware-tools-linux/ +[23]: https://i0.wp.com/itsfoss.com/wp-content/uploads/2021/09/kali-linux-vm-login.png?resize=800%2C540&ssl=1 +[24]: https://i1.wp.com/itsfoss.com/wp-content/uploads/2021/09/vmware-kali-linux.png?resize=800%2C537&ssl=1 +[25]: https://itsfoss.com/best-kali-linux-tools/ diff --git a/published/202109/20210917 Start using YAML now.md b/published/202109/20210917 Start using YAML now.md new file mode 100644 index 0000000000..51a6134df8 --- /dev/null +++ b/published/202109/20210917 Start using YAML now.md @@ -0,0 +1,126 @@ +[#]: subject: "Start using YAML now" +[#]: via: "https://opensource.com/article/21/9/intro-yaml" +[#]: author: "Ayush Sharma https://opensource.com/users/ayushsharma" +[#]: collector: "lujun9972" +[#]: translator: "geekpi" +[#]: reviewer: "wxy" +[#]: publisher: "wxy" +[#]: url: "https://linux.cn/article-13811-1.html" + +YAML 使用入门 +====== + +> 什么是 YAML,为什么我们现在应该开始使用它? + +![](https://img.linux.net.cn/data/attachment/album/202109/23/095242fw0qzzp5fe6e565z.jpg) + +[YAML](https://yaml.org/)(YAML 不是标记语言YAML Ain't Markup Language)是一种适宜阅读理解的数据序列化语言。它的语法简单而易于阅读。它不包含引号、打开和关闭的标签或大括号。它不包含任何可能使人类难以解析嵌套规则的东西。你可以看一下你的 YAML 文档就知道它在什么。 + +### YAML 特性 + +YAML 有一些超级特性,使其优于其他序列化格式: + + * 易于略读。 + * 易于使用。 + * 可在编程语言之间移植。 + * 敏捷语言的原生数据结构。 + * 支持通用工具的一致模型。 + * 支持一次性处理。 + * 表现力和可扩展性。 + +我将通过一些例子进一步向你展示 YAML 的强大。 + +你能弄清楚下面发生了什么吗? + +``` +------- +# My grocery list +groceries: + - Milk + - Eggs + - Bread + - Butter +... +``` + +上面的例子包含了一个简单的杂货购物清单,它是一个完全格式化的 YAML 文档。在 YAML 中,字符串不加引号,而列表需要简单的连字符和空格。一个 YAML 文档以 `---` 开始,以 `...` 结束,但它们是可选的。YAML中的注释以 `#` 开始。 + +缩进是 YAML 的关键。缩进必须包含空格,而不是制表符。虽然所需的空格数量是灵活的,但保持一致是个好主意。 + +### 基本元素 + +#### 集合 + +YAML 有两种类型的集合。列表(用于序列)和字典(用于映射)。列表是键值对,每个值都在一个新的行中,以连字符和空格开始。字典也是键值对,每个值都是一个映射,包含一个键、一个冒号和空格以及一个值。 + +例如: + +``` +# My List +groceries: + - Milk + - Eggs + - Bread + - Butter + +# My dictionary +contact: + name: Ayush Sharma + email: myemail@example.com +``` + +列表和字典经常被结合起来,以提供更复杂的数据结构。列表可以包含字典,而字典可以包含列表。 + +#### 字符串 + +YAML 中的字符串不需要加引号。多行字符串可以用 `|` 或 `>` 来定义。前者保留了换行符,而后者则没有。 + +例如: + +``` +my_string: | + This is my string. + It can contain many lines. + Newlines are preserved. +``` + +``` +my_string_2: > + This is my string. + This can also contain many lines. + Newlines aren't preserved and all lines are folded. +``` + +#### 锚点 + +YAML 可以通过节点锚点来获得可重复的数据块。`&` 字符定义了一个数据块,以后可以用 `*` 来引用。例如: + +``` +billing_address: &add1 + house: B1 + street: My Street + +shipping_address: *add1 +``` + +至止你对 YAML 的了解就足以让你开始工作了。你可以使用在线 YAML 解析器来测试。如果你每天都与 YAML 打交道,那么 [这个方便的备忘单][3] 会对你有所帮助。 + +_这篇文章最初发表在[作者的个人博客][4]上,并经授权改编。_ + +-------------------------------------------------------------------------------- + +via: https://opensource.com/article/21/9/intro-yaml + +作者:[Ayush Sharma][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/ayushsharma +[b]: https://github.com/lujun9972 +[1]: https://opensource.com/sites/default/files/styles/image-full-size/public/lead-images/lenovo-thinkpad-laptop-window-focus.png?itok=g0xPm2kD (young woman working on a laptop) +[2]: mailto:myemail@example.com +[3]: https://yaml.org/refcard.html +[4]: https://notes.ayushsharma.in/2021/08/introduction-to-yaml diff --git a/published/202109/20210918 How to Install Ubuntu Desktop on Raspberry Pi 4.md b/published/202109/20210918 How to Install Ubuntu Desktop on Raspberry Pi 4.md new file mode 100644 index 0000000000..809d57ea63 --- /dev/null +++ b/published/202109/20210918 How to Install Ubuntu Desktop on Raspberry Pi 4.md @@ -0,0 +1,235 @@ +[#]: subject: "How to Install Ubuntu Desktop on Raspberry Pi 4" +[#]: via: "https://itsfoss.com/install-ubuntu-desktop-raspberry-pi/" +[#]: author: "Avimanyu Bandyopadhyay https://itsfoss.com/author/avimanyu/" +[#]: collector: "lujun9972" +[#]: translator: "wxy" +[#]: reviewer: "turbokernel" +[#]: publisher: "wxy" +[#]: url: "https://linux.cn/article-13817-1.html" + +如何在树莓派 4 上安装 Ubuntu 桌面系统 +====== + +> 本教程将详细告诉你在树莓派 4 设备上如何安装 Ubuntu 桌面。 + +![](https://img.linux.net.cn/data/attachment/album/202109/25/084015z4cfiiy8e1ezmmz0.jpg) + +革命性的树莓派Raspberry Pi是最受欢迎的单板计算机。它拥有基于 Debian 的操作系统,叫做 [树莓派操作系统][1]Raspberry Pi OS(原名 Raspbian)。 + +还有其他几个 [可用于树莓派的操作系统][2],但几乎所有的都是轻量级的,适合于树莓派设备的小尺寸和低端硬件。 + +随着标榜 8GB 内存和支持 4K 显示的树莓派 4B 的推出,情况发生了变化。其目的是将树莓派作为常规桌面使用,并在更大程度上成功地做到了这一点。 + +在 4B 型号之前,你可以 [在树莓派上安装 Ubuntu 服务器][3],但桌面版本却无法使用。然而,**Ubuntu 现在为树莓派 4 提供了官方的桌面镜像**。 + +在本教程中,我将展示在树莓派 4 上安装 Ubuntu 桌面的步骤。 + +首先,快速了解一下运行要求。 + +### 在树莓派 4 上运行 Ubuntu 的要求 + +![][4] + +以下是你需要的东西: + + 1. 一个能够联网的 Linux 或 Windows 系统。 + 2. [树莓派镜像工具][5] :树莓派的官方开源工具,可以在你的 SD 卡上写入发行版镜像。 + 3. Micro SD 卡:最低使用 16GB 的存储卡,推荐使用 32GB 的版本。 + 4. 一个基于 USB 的 Micro SD 卡读卡器(如果你的电脑没有读卡器)。 + 5. 树莓派 4 必备配件,如 HDMI 兼容显示器、[Micro HDMI 连接到标准 HDMI(A/M) 接口的电缆][6]、[电源(建议使用官方适配器)][7]、USB 的有线/无线键盘和鼠标/触摸板。 + +最好能够提前 [详细阅读树莓派的要求][8] 。 + +现在,闲话少叙,让我快速带领你完成 SD 卡的镜像准备。 + +### 为树莓派准备 Ubuntu 桌面镜像 + +树莓派提供了一个 GUI 应用程序,用于将 ISO 镜像写入 SD 卡中。**这个工具还可以自动下载兼容的操作系统,如 Ubuntu、树莓派操作系统等**。 + +![下载并将操作系统放入 SD 卡的官方工具][9] + +你可以从官方网站上下载这个工具的 Ubuntu、Windows 和 macOS 版本: + +- [下载树莓派镜像工具][10] + +在 Ubuntu 和其他 Linux 发行版上,你也可以使用 Snap 安装它: + +``` +sudo snap install rpi-imager +``` + +安装完毕后,运行该工具。当你看到下面的界面时,选择 “选择操作系统CHOOSE OS”: + +![镜像工具:选择首选操作系统][11] + +在“操作系统Operating System”下,选择 “其它通用的操作系统Other general purpose OS”: + +![镜像工具: 其他通用的操作系统][12] + +现在,选择 “Ubuntu”: + +![镜像工具:发行版 - Ubuntu][13] + +接下来,选择 “Ubuntu Desktop 21.04(RPI 4/400)”,如下图所示。 + +![镜像工具:发行版 - Ubuntu 21.04][14] + +> **注意:** +> +> 如果你没有一个稳定的网络连接,你可以 [从 Ubuntu 的网站上单独下载 Ubuntu 的树莓派镜像][15]。在镜像工具中,在选择操作系统时,从底部选择“使用自定义Use custom”选项。你也可以使用 Etcher 将镜像写入到 SD 卡上。 + +将 Micro SD 卡插入读卡器中,等待它挂载。选择“存储设备Storage”下的 “选择存储设备CHOOSE STORAGE”: + +![镜像工具:选择存储设备(SD 卡)][16] + +你应该可以根据存储空间大小,识别你的 Micro SD 卡。这里,我使用的是 32GB 的卡: + +![镜像工具:选择 SD 卡][17] + +现在点击“写入WRITE”: + +![镜像工具:镜像写入][18] + +如果你已经备份了 SD 卡上的内容或是一张新卡,你可以直接进行: + +![镜像工具:镜像写入确认][19] + +由于这需要 [sudo][20] 的权限,你必须输入密码。如果你从终端运行 `sudo rpi-imager`,就不会出现这种情况: + +![镜像工具:镜像写入授权需要密码][21] + +如果你的 SD 卡有点旧,这将需要一些时间。如果它是一个新的高速 SD 卡,就无需很长时间: + +![镜像工具:写入镜像][22] + +为确保镜像写入成功,我不建议跳过验证: + +![镜像工具:验证写入][23] + +写入结束后,会有以下确认提示: + +![镜像工具:写入成功][24] + +现在,从你的系统中安全移除 SD 卡。 + +### 在树莓派上使用装有 Ubuntu 的 MicroSD 卡 + +已经成功了一半了。与常规的 Ubuntu 安装不同,无需创建一个临场安装环境。Ubuntu 已经安装在 SD 卡上了,而且几乎可以直接使用了。让我们来看看这里还剩下什么。 + +#### 第 1 步:将 SD 卡插入树莓派中 + +对于第一次使用的用户来说,有时会有点困惑,不知道那个卡槽到底在哪里?不用担心。它位于电路板背面的左手边。下面是一个插入卡后的倒置视图。 + +![树莓派 4B 板倒置,插入 Micro SD 卡][25] + +按照这个方向将卡慢慢插入板子下面的卡槽,轻轻地插,直到它不再往前移动。你可能还会听到一点咔嚓声来确认。这意味着它已经完美地插入了。 + +![树莓派 SD 插槽在板子背面的左侧][26] + +当你把它插进去的时候,你可能会注意到在插槽中有两个小针脚调整了自己的位置(如上图所示),但这没关系。一旦插入,卡看起来会有一点突出。这就是它应该有的样子。 + +![树莓派 SD 卡插入时有一小部分可见][27] + +#### 第 2 步:设置树莓派 + +我无需在这里详细介绍。 + +保证电源线接头、微型 HDMI 线接头、键盘和鼠标接头(有线/无线)都牢固地连接到树莓派板的相关端口。 + +确保显示器和电源插头也已正确连接,然后再去打开电源插座。我不建议把适配器插到带电的插座上。参考 [电弧][28]。 + +确认了以上两个步骤后,你就可以 [打开树莓派设备的电源][29]。 + +#### 第 3 步:在树莓派上 Ubuntu 桌面的首次运行 + +当你打开树莓派的电源,你需要在初次运行时进行一些基本配置。你只需按照屏幕上的指示操作即可。 + +选择你的语言、键盘布局、连接到 WiFi 等: + +![选择语言][30] + +![选择键盘布局][31] + +![选择 WiFi][32] + +你可以根据需求选择时区: + +![选择时区][33] + +然后创建用户和密码: + +![输入所需的用户名和密码][34] + +之后的步骤将配置一些东西,这个过程需要一些时间: + +![完成 Ubuntu 设置][35] + +![完成 Ubuntu 设置][36] + +系统会重新启动之前需要一些时间,最终,你将会来到 Ubuntu 的登录界面: + +![Ubuntu 的登录界面][37] + +现在,你可以开始享受树莓派上的 Ubuntu 桌面了: + +![树莓派上的 Ubuntu 桌面][38] + +### 总结 + +我注意到**一个暂时的异常情况**。在进行安装时,我的显示器左侧有一个红色的闪烁边界。这种闪烁(也有不同的颜色)在屏幕的随机部分也能注意到。但在重启和第一次启动后,它就消失了。 + +很高兴能够看到它在树莓派上运行,我非常需要 Ubuntu 开始为树莓派等流行的 ARM 设备提供支持。 + +希望这个教程对你有所帮助。如果你有问题或建议,请在评论中告诉我。 + +-------------------------------------------------------------------------------- + +via: https://itsfoss.com/install-ubuntu-desktop-raspberry-pi/ + +作者:[Avimanyu Bandyopadhyay][a] +选题:[lujun9972][b] +译者:[wxy](https://github.com/wxy) +校对:[turbokernel](https://github.com/turbokernel) + +本文由 [LCTT](https://github.com/LCTT/TranslateProject) 原创编译,[Linux中国](https://linux.cn/) 荣誉推出 + +[a]: https://itsfoss.com/author/avimanyu/ +[b]: https://github.com/lujun9972 +[1]: https://itsfoss.com/tutorial-how-to-install-raspberry-pi-os-raspbian-wheezy/ +[2]: https://itsfoss.com/raspberry-pi-os/ +[3]: https://itsfoss.com/install-ubuntu-server-raspberry-pi/ +[4]: https://i0.wp.com/itsfoss.com/wp-content/uploads/2021/09/ubuntu-desktop-raspberry-pi.png?resize=800%2C450&ssl=1 +[5]: https://github.com/raspberrypi/rpi-imager +[6]: https://www.raspberrypi.org/products/micro-hdmi-to-standard-hdmi-a-cable/ +[7]: https://www.raspberrypi.org/products/type-c-power-supply/ +[8]: https://itsfoss.com/things-you-need-to-get-your-raspberry-pi-working/ +[9]: https://i2.wp.com/itsfoss.com/wp-content/uploads/2021/09/raspberry-pi-imager-tool.webp?resize=680%2C448&ssl=1 +[10]: https://www.raspberrypi.org/software/ +[11]: https://i1.wp.com/itsfoss.com/wp-content/uploads/2021/09/pi-imager-choose-os.webp?resize=681%2C443&ssl=1 +[12]: https://i2.wp.com/itsfoss.com/wp-content/uploads/2021/09/pi-imager-other-general-purpose-os.webp?resize=679%2C440&ssl=1 +[13]: https://i1.wp.com/itsfoss.com/wp-content/uploads/2021/09/pi-imager-os-ubuntu.webp?resize=677%2C440&ssl=1 +[14]: https://i0.wp.com/itsfoss.com/wp-content/uploads/2021/09/pi-imager-os-ubuntu-21-04.webp?resize=677%2C440&ssl=1 +[15]: https://ubuntu.com/download/raspberry-pi +[16]: https://i0.wp.com/itsfoss.com/wp-content/uploads/2021/09/pi-imager-choose-storage.webp?resize=677%2C438&ssl=1 +[17]: https://i1.wp.com/itsfoss.com/wp-content/uploads/2021/09/pi-imager-choose-sd-card.webp?resize=790%2C450&ssl=1 +[18]: https://i2.wp.com/itsfoss.com/wp-content/uploads/2021/09/pi-imager-image-write.webp?resize=676%2C437&ssl=1 +[19]: https://i2.wp.com/itsfoss.com/wp-content/uploads/2021/09/pi-imager-image-write-confirm.webp?resize=679%2C440&ssl=1 +[20]: https://itsfoss.com/add-sudo-user-ubuntu/ +[21]: https://i0.wp.com/itsfoss.com/wp-content/uploads/2021/09/pi-imager-image-write-password.webp?resize=380%2C227&ssl=1 +[22]: https://i1.wp.com/itsfoss.com/wp-content/uploads/2021/09/pi-imager-writing-image.webp?resize=673%2C438&ssl=1 +[23]: https://i2.wp.com/itsfoss.com/wp-content/uploads/2021/09/pi-imager-verifying-changes.webp?resize=677%2C440&ssl=1 +[24]: https://i2.wp.com/itsfoss.com/wp-content/uploads/2021/09/pi-imager-write-successful.webp?resize=675%2C442&ssl=1 +[25]: https://i1.wp.com/itsfoss.com/wp-content/uploads/2021/09/pi-inverted-micro-sd-card-inserted.webp?resize=800%2C572&ssl=1 +[26]: https://i1.wp.com/itsfoss.com/wp-content/uploads/2021/09/raspberry-pi-sd-slot-left-side-middle-below-board.webp?resize=632%2C324&ssl=1 +[27]: https://i0.wp.com/itsfoss.com/wp-content/uploads/2021/09/pi-sd-card-inserted.webp?resize=650%2C432&ssl=1 +[28]: https://www.electricianatlanta.net/what-is-electrical-arcing-and-why-is-it-dangerous/ +[29]: https://itsfoss.com/turn-on-raspberry-pi/ +[30]: https://i1.wp.com/itsfoss.com/wp-content/uploads/2021/09/ubuntu-raspberry-pi-first-run.webp?resize=800%2C451&ssl=1 +[31]: https://i0.wp.com/itsfoss.com/wp-content/uploads/2021/09/ubuntu-raspberry-pi-first-run-2.webp?resize=800%2C600&ssl=1 +[32]: https://i2.wp.com/itsfoss.com/wp-content/uploads/2021/09/ubuntu-raspberry-pi-first-run-3.webp?resize=800%2C600&ssl=1 +[33]: https://i0.wp.com/itsfoss.com/wp-content/uploads/2021/09/ubuntu-raspberry-pi-first-run-4.webp?resize=800%2C600&ssl=1 +[34]: https://i1.wp.com/itsfoss.com/wp-content/uploads/2021/09/ubuntu-raspberry-pi-first-run-5.webp?resize=800%2C600&ssl=1 +[35]: https://i1.wp.com/itsfoss.com/wp-content/uploads/2021/09/ubuntu-raspberry-pi-first-run-6.webp?resize=800%2C600&ssl=1 +[36]: https://i1.wp.com/itsfoss.com/wp-content/uploads/2021/09/ubuntu-raspberry-pi-first-run-7.webp?resize=800%2C600&ssl=1 +[37]: https://i1.wp.com/itsfoss.com/wp-content/uploads/2021/09/ubuntu-raspberry-pi-login-screen.webp?resize=800%2C600&ssl=1 +[38]: https://i1.wp.com/itsfoss.com/wp-content/uploads/2021/09/ubuntu-21-04-post-setup-desktop.webp?resize=800%2C450&ssl=1 diff --git a/published/202109/20210920 Use Vagrant to test your scripts on different operating systems.md b/published/202109/20210920 Use Vagrant to test your scripts on different operating systems.md new file mode 100644 index 0000000000..b105bb5413 --- /dev/null +++ b/published/202109/20210920 Use Vagrant to test your scripts on different operating systems.md @@ -0,0 +1,135 @@ +[#]: subject: "Use Vagrant to test your scripts on different operating systems" +[#]: via: "https://opensource.com/article/21/9/test-vagrant" +[#]: author: "Ayush Sharma https://opensource.com/users/ayushsharma" +[#]: collector: "lujun9972" +[#]: translator: "geekpi" +[#]: reviewer: "wxy" +[#]: publisher: "wxy" +[#]: url: "https://linux.cn/article-13829-1.html" + +使用 Vagrant 在不同的操作系统上测试你的脚本 +====== + +> Vagrant 可以帮助你在你的电脑上运行其他操作系统,这意味着你可以构建、测试、疯狂折腾而不毁坏你的系统。 + +![](https://img.linux.net.cn/data/attachment/album/202109/28/115827gv75kkrhnnhvkhcf.jpg) + +我使用 Vagrant 已经很长时间了。我使用几种 DevOps 工具,把它们全安装在一个系统上会搞得很乱。Vagrant 可以让你在不破坏系统的情况下随意折腾,因为你根本不需要在生产系统上做实验。 + +如果你熟悉 [VirtualBox][2] 或 [GNOME Boxes][3],那么学习 Vagrant 很容易。Vagrant 有一个简单而干净的界面用于管理虚拟机。一个名为 `Vagrantfile` 的配置文件,允许你定制你的虚拟机(称为 “Vagrant 盒子box”)。一个简单的命令行界面让你启动、停止、暂停或销毁你的“盒子”。 + +考虑一下这个简单的例子。 + +假设你想写 Ansible 或 shell 脚本,在一个新的服务器上安装 Nginx。你不能在你自己的系统上这样做,因为你运行的可能不是你想测试的操作系统,或者没有所有的依赖项。启动新的云服务器进行测试可能会很费时和昂贵。这就是 Vagrant 派上用处的地方。你可以用它来启动一个虚拟机,用你的脚本来配备provision它,并证明一切按预期工作。然后,你可以删除这个“盒子”,重新配备它,并重新运行你的脚本来验证它。你可以多次重复这个过程,直到你确信你的脚本在所有条件下都能工作。你可以将你的 Vagrantfile 提交给 Git,以确保你的团队正在测试完全相同的环境(因为他们将使用完全相同的测试机)。不会再有“但它在我的机器上运行良好!”这事了。 + +### 开始使用 + +首先,[在你的系统上安装 Vagrant][4],然后创建一个新的文件夹进行实验。在这个新文件夹中,创建一个名为 `Vagrantfile` 的新文件,内容如下: + +``` +Vagrant.configure("2") do |config| + + config.vm.box = "ubuntu/hirsute64" + +end +``` + +你也可以运行 `vagrant init ubuntu/hirsute64`,它将为你生成一个新的 Vagrant 文件。现在运行 `vagrant up`。这个命令将从 Vagrant 仓库中下载 `ubuntu/hirsuite64` 镜像。 + +``` +Bringing machine 'default' up with 'virtualbox' provider... +==> default: Importing base box 'ubuntu/hirsute64'... +==> default: Matching MAC address for NAT networking... +==> default: Checking if box 'ubuntu/hirsute64' version '20210820.0.0' is up to date... +==> default: Setting the name of the VM: a_default_1630204214778_76885 +==> default: Clearing any previously set network interfaces... +==> default: Preparing network interfaces based on configuration... + default: Adapter 1: nat + default: Adapter 2: hostonly +==> default: Forwarding ports... + default: 22 (guest) => 2222 (host) (adapter 1) +==> default: Running 'pre-boot' VM customizations... +==> default: Booting VM... +==> default: Waiting for machine to boot. This may take a few minutes... + default: SSH address: 127.0.0.1:2222 + default: SSH username: vagrant + default: SSH auth method: private key + default: Warning: Remote connection disconnect. Retrying... + default: Warning: Connection reset. Retrying... + default: + default: Vagrant insecure key detected. Vagrant will automatically replace + default: this with a newly generated keypair for better security. + default: + default: Inserting generated public key within guest... + default: Removing insecure key from the guest if it's present... + default: Key inserted! Disconnecting and reconnecting using new SSH key... +==> default: Machine booted and ready! +``` + +此时,如果你打开你的 Vagrant 后端(如 VirtualBox 或 virt-manager),你会看到你的“盒子”已经有了。接下来,运行 `vagrant ssh` 登录到“盒子”。如果你能看到 Vagrant 的提示符,那么你就进入了! + +``` +~ vagrant ssh +Welcome to Ubuntu 21.04 (GNU/Linux 5.11.0-31-generic x86_64) + +* Documentation: +* Management: +* Support: + + System information as of Sun Aug 29 02:33:51 UTC 2021 + + System load: 0.01 Processes: 110 + Usage of /: 4.1% of 38.71GB Users logged in: 0 + Memory usage: 17% IPv4 address for enp0s3: 10.0.2.15 + Swap usage: 0% IPv4 address for enp0s8: 192.168.1.20 + +0 updates can be applied immediately. + +vagrant@ubuntu-hirsute:~$ +``` + +Vagrant 使用“基础盒子”来建立你的本地机器。在我们的例子中,Vagrant 从 [Hashicorp 的 Vagrant 目录][5]下载 `ubuntu/hirsuite64` 镜像,并插入 VirtualBox 来创建实际的“盒子”。 + +### 共享文件夹 + +Vagrant 将你的当前文件夹映射到 Vagrant “盒子”中的 `/vagrant`。这允许你在你的系统和“盒子”里保持文件同步。这很适合测试 Nginx 网站,通过将你的文件根目录指向 `/vagrant`。你可以使用 IDE 进行修改,“盒子”里的 Nginx 会提供这些修改。 + +### Vagrant 命令 + +有几个 Vagrant 命令,你可以用它们来控制你的“盒子”。 + +其中一些重要的命令是: + + * `vagrant up`:启动一个“盒子”。 + * `vagrant status`:显示当前“盒子”的状态。 + * `vagrant suspend`:暂停当前的“盒子”。 + * `vagrant resume`:恢复当前的“盒子”。 + * `vagrant halt`:关闭当前的“盒子”。 + * `vagrant destroy`:销毁当前的“盒子”。通过运行此命令,你将失去存储在“盒子”上的任何数据。 + * `vagrant snapshot`:对当前的“盒子”进行快照。 + +### 试试 Vagrant + +Vagrant 是一个使用 DevOps 原则进行虚拟机管理的工具,久经时间考验。配置你的测试机,与你的团队分享配置,并在一个可预测和可重复的环境中测试你的项目。如果你正在开发软件,那么通过使用 Vagrant 进行测试,你将为你的用户提供良好的服务。如果你不开发软件,但你喜欢尝试新版本的操作系统,那么没有比这更简单的方法了。今天就试试 Vagrant 吧! + +这篇文章最初发表在 [作者的个人博客][6] 上,经许可后被改编。 + +-------------------------------------------------------------------------------- + +via: https://opensource.com/article/21/9/test-vagrant + +作者:[Ayush Sharma][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/ayushsharma +[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/21/6/try-linux-virtualbox +[3]: https://opensource.com/article/19/5/getting-started-gnome-boxes-virtualization +[4]: https://www.vagrantup.com/docs/installation +[5]: https://app.vagrantup.com/boxes/search +[6]: https://notes.ayushsharma.in/2021/08/introduction-to-vagrant diff --git a/published/202109/20210920 Use this Linux command-line tool to learn more about your NVMe drives.md b/published/202109/20210920 Use this Linux command-line tool to learn more about your NVMe drives.md new file mode 100644 index 0000000000..782e44586b --- /dev/null +++ b/published/202109/20210920 Use this Linux command-line tool to learn more about your NVMe drives.md @@ -0,0 +1,177 @@ +[#]: subject: "Use this Linux command-line tool to learn more about your NVMe drives" +[#]: via: "https://opensource.com/article/21/9/nvme-cli" +[#]: author: "Don Watkins https://opensource.com/users/don-watkins" +[#]: collector: "lujun9972" +[#]: translator: "geekpi" +[#]: reviewer: "turbokernel" +[#]: publisher: "wxy" +[#]: url: "https://linux.cn/article-13822-1.html" + +使用 Linux 命令行工具来了解你的 NVMe 驱动器 +====== + +> nvme-cli 命令拥有诸多实用的选项,且它是控制和管理数据一种很好的方式。 + +![](https://img.linux.net.cn/data/attachment/album/202109/26/102441ux8cy36gy1vggykz.jpg) + +NVMe 是指非易失性内存规范Non-Volatile Memory Express,它规范了软件和存储通过 PCIe 和其他协议(包括 TCP)进行通信的方式。它是由非营利组织领导的 [开放规范][2],并定义了几种形式的固态存储。 + +我的笔记本电脑有一个 NVMe 驱动器,我的台式机也有。而且它们的速度很快。我喜欢我的电脑启动的速度,以及它们读写数据的速度。几乎没有延迟。 + +没过多久,我就对驱动这种超高速存储的技术产生了好奇,所以我做了一些调查。我了解到,NVMe 驱动器消耗的电力更少,而提供的数据访问速度甚至比 SATA 的 SSD 驱动器快得多。这很有趣,但我想知道更多关于我的特定 NVMe 驱动器的信息,我想知道它们与其他驱动器有何区别。我可以安全地擦除驱动器吗?我怎样才能检查它的完整性? + +带着这些问题我在互联网上搜索,发现了一个开源项目,其中有一系列管理 NVMe 驱动器的工具。它被称为 [nvme-cli][3]。 + +### 安装 nvme-cli + +你可以从你的发行版的包管理器中安装 `nvme-cli`。例如,在 Fedora、CentOS 或类似系统上: + +``` +$ sudo dnf install nvme-cli +``` + +在 Debian、Mint、Elementary 和类似系统上: + +``` +$ sudo apt install nvme-cli +``` + +### 探索 NVMe 驱动器 + +在安装 `nvme-cli` 后,我想探索我的驱动器。`nvme-cli` 没有手册页,但你可以通过输入 `nvme help` 获得很多帮助: + +``` +$ nvme help +nvme-1.14 +usage: nvme [] [] + +The '' may be either an NVMe character device (ex: /dev/nvme0) or an +nvme block device (ex: /dev/nvme0n1). + +The following are all implemented sub-commands: + list List all NVMe devices and namespaces on machine + list-subsys List nvme subsystems + id-ctrl Send NVMe Identify Controller + id-ns Send NVMe Identify Namespace, display structure + id-ns-granularity Send NVMe Identify Namespace Granularity List, display structure + list-ns Send NVMe Identify List, display structure + list-ctrl Send NVMe Identify Controller List, display structure + nvm-id-ctrl Send NVMe Identify Controller NVM Command Set, display structure + primary-ctrl-caps Send NVMe Identify Primary Controller Capabilities +[...] +``` + +### 列出所有的 NVMe 驱动器 + +`sudo nvme list` 命令列出你机器上所有的 NVMe 设备和命名空间。我用它在 `/dev/nvme0n1` 找到了一个 NVMe 驱动器。下面是命令输出结果: + + +``` +$ sudo nvme list + +Node SN Model Namespace Usage Format FW Rev + +--------------------- -------------------- ---------------------------------------- --------- -------------------------- ---------------- -------- + +/dev/nvme0n1 S42GMY9M141281 SAMSUNG MZVLB256HAHQ-000L7 1 + +214.68 GB / 256.06 GB 512 B + 0 B 0L2QEXD7 +``` + +我有一个名为 `nvme0n1` 的驱动器。它列出了序列号、品牌、容量、固件版本等等。 + +通过使用 `id-ctrl` 子命令,你可以得到更多关于该硬盘和它所支持的特性的信息: + +``` +$ sudo nvme id-ctrl /dev/nvme0n1 +NVME Identify Controller: +vid : 0x144d +ssvid : 0x144d +sn : S42GMY9M141281 +mn : SAMSUNG MZVLB256HAHQ-000L7 +fr : 0L2QEXD7 +rab : 2 +ieee : 002538 +cmic : 0 +mdts : 9 +cntlid : 0x4 +ver : 0x10200 +rtd3r : 0x186a0 +rtd3e : 0x7a1200 +[...] +``` + +### 驱动器健康 + +你可以通过 `smart-log` 子命令来了解硬盘的整体健康状况: + +``` +$ sudo nvme smart-log /dev/nvme0n1 +Smart Log for NVME device:nvme0n1 namespace-id:ffffffff +critical_warning : 0 +temperature : 21 C +available_spare : 100% +available_spare_threshold : 10% +percentage_used : 2% +endurance group critical warning summary: 0 +data_units_read : 5,749,452 +data_units_written : 10,602,948 +host_read_commands : 77,809,121 +host_write_commands : 153,405,213 +controller_busy_time : 756 +power_cycles : 1,719 +power_on_hours : 1,311 +unsafe_shutdowns : 129 +media_errors : 0 +num_err_log_entries : 1,243 +Warning Temperature Time : 0 +Critical Composite Temperature Time : 0 +Temperature Sensor 1 : 21 C +Temperature Sensor 2 : 22 C +Thermal Management T1 Trans Count : 0 +Thermal Management T2 Trans Count : 0 +Thermal Management T1 Total Time : 0 +Thermal Management T2 Total Time : 0 +``` + +这为你提供了硬盘的当前温度、到目前为止的使用时间、不安全的关机次数等等。 + +### 格式化一个 NVMe 驱动器 + +你可以用 `nvme-cli` 格式化一个 NVMe 驱动器,但要注意。这将删除驱动器上的所有数据!如果你的硬盘上有重要的数据,你必须在这样做之前将其备份,否则你**将会**丢失数据。子命令是 `format`: + +``` +$ sudo nvme format /dev/nvme0nX +``` + +(为了安全起见,我用 `X` 替换了驱动器的实际位置,以防止复制粘贴的错误。将 `X` 改为 `1` 或 `nvme list` 结果中列出的实际位置。) + +### 安全地擦除 NVMe 驱动器 + +当你准备出售或处理你的 NVMe 电脑时,你可能想安全地擦除驱动器。这里的警告与格式化过程中的警告相同。首先要备份重要的数据,因为这个命令会删除这些数据! + +``` +$ sudo nvme sanitize /dev/nvme0nX +``` + +### 尝试 nvme-cli + +`nvme-cli` 命令是在 [GPLv2][4] 许可下发布的。它是一个强大的命令,有很多有用的选项,用来有效地控制和管理数据。 + +-------------------------------------------------------------------------------- + +via: https://opensource.com/article/21/9/nvme-cli + +作者:[Don Watkins][a] +选题:[lujun9972][b] +译者:[geekpi](https://github.com/geekpi) +校对:[turbokernel](https://github.com/turbokernel) + +本文由 [LCTT](https://github.com/LCTT/TranslateProject) 原创编译,[Linux中国](https://linux.cn/) 荣誉推出 + +[a]: https://opensource.com/users/don-watkins +[b]: https://github.com/lujun9972 +[1]: https://opensource.com/sites/default/files/styles/image-full-size/public/lead-images/command_line_prompt.png?itok=wbGiJ_yg (Command line prompt) +[2]: https://nvmexpress.org/ +[3]: https://github.com/linux-nvme/nvme-cli +[4]: https://github.com/linux-nvme/nvme-cli/blob/master/LICENSE diff --git a/published/202109/20210921 Run containers on your Mac with Lima.md b/published/202109/20210921 Run containers on your Mac with Lima.md new file mode 100644 index 0000000000..759725d878 --- /dev/null +++ b/published/202109/20210921 Run containers on your Mac with Lima.md @@ -0,0 +1,146 @@ +[#]: subject: "Run containers on your Mac with Lima" +[#]: via: "https://opensource.com/article/21/9/run-containers-mac-lima" +[#]: author: "Moshe Zadka https://opensource.com/users/moshez" +[#]: collector: "lujun9972" +[#]: translator: "geekpi" +[#]: reviewer: "wxy" +[#]: publisher: "wxy" +[#]: url: "https://linux.cn/article-13824-1.html" + +用 Lima 在你的 Mac 上运行容器 +====== + +> Lima 可以帮助克服在 Mac 上运行容器的挑战。 + +![](https://img.linux.net.cn/data/attachment/album/202109/27/091509kx8u9uqdzcz8c6ud.jpg) + +在你的 Mac 上运行容器可能是一个挑战。毕竟,容器是基于 Linux 特有的技术,如控制组和命名空间。 + +幸运的是,macOS 拥有一个内置的虚拟机监控程序hypervisor,允许在 Mac 上运行虚拟机(VM)。虚拟机监控程序是一个底层的内核功能,而不是一个面向用户的功能。 + +hyperkit 是一个可以使用 macOS 虚拟机监控程序运行虚拟机的 [开源项目][2]。hyperkit 被设计成一个“极简化”的虚拟机运行器。与 VirtualBox 不同,它没有花哨的 UI 功能来管理虚拟机。 + +你可以获取 hyperkit,这是一个运行容器管理器的极简 Linux 发行版,并将所有部分组合在一起。但这将有很多变动组件,且听起来像有很多工作。特别是如果你想通过使用 `vpnkit` (一个开源项目,用于创建感觉更像是主机网络一部分的虚拟机网络)使网络连接更加无缝。 + +### Lima + +当 [lima 项目][3] 已经解决了这些细节问题时,就没有理由再去做这些努力了。让 `lima` 运行的最简单方法之一是使用 [Homebrew][4]。你可以用这个命令安装 `lima`: + +``` +$ brew install lima +``` + +安装后,可能需要一些时间,就享受一些乐趣了。为了让 `lima` 知道你已经准备好了,你需要启动它。下面是命令: + +``` +$ limactl start +``` + +如果这是你第一次运行,你会被问到是否喜欢默认值,或者是否要改变其中的任何一项。默认值是非常安全的,但我喜欢生活在疯狂的一面。这就是为什么我跳进一个编辑器,从以下地方进行修改: + +``` +- location: "~" + # CAUTION: `writable` SHOULD be false for the home directory. + # Setting `writable` to true is possible but untested and dangerous. + writable: false +``` + +变成: + +``` + - location: "~" + # I *also* like to live dangerously -- Austin Powers + writable: true +``` + +正如评论中所说,这可能是危险的。可悲的是,许多现有的工作流程都依赖于挂载是可读写的。 + +默认情况下,`lima` 运行 `containerd` 来管理容器。`containerd` 管理器也是一个非常简洁的管理器。虽然使用一个包装的守护程序,如 `dockerd`,来增加这些漂亮的工效是很常见的,但也有另一种方法。 + +### nerdctl 工具 + +`nerdctl` 工具是 Docker 客户端的直接替换,它将这些功能放在客户端,而不是服务器上。`lima` 工具允许无需在本地安装就可以直接从虚拟机内部运行 `nerdctl`。 + +做完这些后,可以运行一个容器了!这个容器将运行一个 HTTP 服务器。你可以在你的 Mac 上创建这些文件: + +``` +$ ls +index.html +$ cat index.html +hello +``` + +现在,挂载并转发端口: + +``` +$ lima nerdctl run --rm -it -p 8000:8000 -v $(pwd):/html --entrypoint bash python +root@9486145449ab:/# +``` + +在容器内,运行一个简单的 Web 服务器: + +``` +$ lima nerdctl run --rm -it -p 8000:8000 -v $(pwd):/html --entrypoint bash python +root@9486145449ab:/# cd /html/ +root@9486145449ab:/html# python -m http.server 8000 +Serving HTTP on 0.0.0.0 port 8000 () ... +``` + +在另一个终端,你可以检查一切看起来都很好: + +``` +$ curl localhost:8000 +hello +``` + +回到容器上,有一条记录 HTTP 客户端连接的日志信息: + +``` +10.4.0.1 - - [09/Sep/2021 14:59:08] "GET / HTTP/1.1" 200 - +``` + +一个文件是不够的,所以还要做些优化。 在服务器上执行 `CTRL-C`,并添加另一个文件: + +``` +^C +Keyboard interrupt received, exiting. +root@9486145449ab:/html# echo goodbye > foo.html +root@9486145449ab:/html# python -m http.server 8000 +Serving HTTP on 0.0.0.0 port 8000 (http://0.0.0.0:8000/) ... +``` + +检查你是否能看到新的文件: + +``` +$ curl localhost:8000/foo.html +goodbye +``` + +### 总结 + +总结一下,安装 `lima` 需要一些时间,但完成后,你可以做以下事情: + + * 运行容器。 + * 将你的主目录中的任意子目录挂载到容器中。 + * 编辑这些目录中的文件。 + * 运行网络服务器,在 Mac 程序看来,它们是在 localhost 上运行的。 + +这些都是通过 `lima nerdctl` 实现的。 + +-------------------------------------------------------------------------------- + +via: https://opensource.com/article/21/9/run-containers-mac-lima + +作者:[Moshe Zadka][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/moshez +[b]: https://github.com/lujun9972 +[1]: https://opensource.com/sites/default/files/styles/image-full-size/public/lead-images/containers_2015-2-osdc-lead.png?itok=kAfHrBoy (Containers for shipping overseas) +[2]: https://www.docker.com/blog/docker-unikernels-open-source/ +[3]: https://github.com/lima-vm/lima +[4]: https://brew.sh/ diff --git a/published/202109/20210923 GNOME 41 Released- The Most Popular Linux Desktop Environment Gets Better.md b/published/202109/20210923 GNOME 41 Released- The Most Popular Linux Desktop Environment Gets Better.md new file mode 100644 index 0000000000..0a3ec80616 --- /dev/null +++ b/published/202109/20210923 GNOME 41 Released- The Most Popular Linux Desktop Environment Gets Better.md @@ -0,0 +1,164 @@ +[#]: subject: "GNOME 41 Released: The Most Popular Linux Desktop Environment Gets Better" +[#]: via: "https://news.itsfoss.com/gnome-41-release/" +[#]: author: "Ankush Das https://news.itsfoss.com/author/ankush/" +[#]: collector: "lujun9972" +[#]: translator: "wxy" +[#]: reviewer: "wxy" +[#]: publisher: "wxy" +[#]: url: "https://linux.cn/article-13816-1.html" + +GNOME 41 发布:最受欢迎的 Linux 桌面环境的精细打磨 +====== + +> GNOME 41 是一次有价值的升级,它带来了新的应用程序、功能和细微的视觉改进。 + +![](hhttps://img.linux.net.cn/data/attachment/album/202109/24/130703iznp8p53dbd1kktz.jpg) + +现在 GNOME 41 稳定版终于发布了。 + +虽然 GNOME 40 带来了不少激进的改变,让许多用户不得不去适应新的工作流程,但 GNOME 41 似乎避免了这个问题。 + +在 GNOME 41 中没有明显的工作流程变化,但有增加了新的功能,做了全面的改进。 + +GNOME 41 的测试版已经发布了一段时间了。而且,为了发现它值得关注的地方,我们在发布前就使用 [GNOME OS][1] 试用了它的稳定版。 + +### GNOME 41 有什么新功能? + +GNOME 41 并没有给你带来任何新的视觉感受,但是一些有用的改进可以帮助你改善或控制工作流程。 + +此外,还升级了一些 GNOME 应用程序。 + +让我提一下 GNOME 41 的主要亮点。 + +#### GNOME 41 软件的上下文板块 + +![][3] + +每个版本中,用户都期待着对 GNOME “软件Software”的改进。 + +虽然他们一直在朝着正确的方向改进它,但它需要一次视觉上的重新打造。而且,这一次,GNOME 41 带来了急需的 UI 更新。 + +软件商店的描述性更强了,看起来应该对新用户有吸引力。它使用表情符号/创意图标来对应用程序进行分类,使软件中心变得更时尚。 + +就像 [Apps for GNOME][4] 门户网站一样,“软件”的应用程序屏幕包括了更多的细节,以尽可能地告知用户,而不需要参考项目页面或其网站。 + +![][5] + +换句话说,这些添加到应用程序页面的上下文板块,提供了有关设备支持、安全/许可、年龄等级、下载的大小、项目等信息。 + +你还可以为某些应用程序(如 GIMP)选择可用的附加组件,以便一次都安装上。这样你就可以节省寻找附加组件和单独安装它们的时间了。 + +事实证明,GNOME 41 “软件”比以前更有好用了。 + +#### 新的多任务选项 + +![][6] + +GNOME 41 打造了新的多任务设置以帮助你改善工作流程。 + +你可以通过切换热角来快速打开“活动概览Activities Overview”。还添加了一个拖动窗口到边缘时调整其大小的能力。 + +根据你的需求,你可以设置一个固定的可用工作空间的数量,当然也可以保持动态数量。 + +除此以外,你还可以调整这些功能: + + * 多显示器工作区 + * 应用程序切换行为 + +当你有多个显示器时,你可以选择将工作空间限制在一个屏幕上,或在连接的显示器上连续显示。 + +而且,当你在切换应用程序并浏览它们时,你可以自定义只在同一工作区或在所有工作区预览应用程序。 + +#### 节电设置 + +![][7] + +在 GNOME 41 中,现在有一个有效节省电力的性能调整。这对于笔记本用户手动调整其性能,或者当一个应用程序要求切换模式以节省电力时,是非常有用的。 + +![][8] + +#### GNOME “日历”的改进 + +GNOME “日历Calendar”现在可以打开 ICS 文件及导入活动。 + +#### 触摸板手势 + +无缝的工作流程的体验:可以利用三指垂直向上/向下滑动的动作来获得“活动概览”,以及利用三指水平向右/向左滑动的动作在工作空间之间导航。 + +很高兴看到他们重点放在改善使用触摸板的工作流程上,这类似于 [elementary OS 6 的功能][9]。 + +#### GNOME 连接应用 + +![][10] + +添加了一个新的“连接Connections”应用程序,可以连接到远程计算机,不管是什么平台。 + +我看到这个应用程序仍然是一个 alpha 版本,但也许随着接下来的几次更新,就会看到这个应用程序的完成版本。 + +我还没有试过它是否可以工作,但也许值得再写一篇简短的文章来告诉你如何使用它。 + +#### SIP/VoIP 支持 + +在 [GNOME 41 测试版][11] 中,我发现了对 SIP/VoIP 的支持。 + +如果你是一个商业用户或者经常打国际电话,你现在可以直接从 GNOME 41 的拨号盘上拨打 VoIP 电话了。 + +不幸的是,在使用带有 GNOME 41 稳定版的 GNOME OS 时,我无法找到包含的“通话Calls”应用程序。所以,我无法截图给你看。 + +#### GNOME Web / Epiphany 的改进 + +![][12] + +GNOME Web(即 Epiphany 浏览器)最近进行了很多很棒的改进。 + +在 GNOME 41 中,Epiphany 浏览器现在利用 AdGuard 的脚本来阻止 YouTube 广告。别忘了,它还增加了对 Epiphany canary 构建版的支持。 + +#### 其他改进 + +在底层,有一些细微但重要的变化带来了更好、更快的用户体验。 + +例如,你可能会注意到,在应用程序/窗口的标题区域,图标更加醒目。这是为了提高清晰度和增强外观。 + +同样地,GNOME 应用程序和功能也有许多改进,你在使用它们时可能会发现: + + * GNOME “地图Map”现在以一种用户友好的方式显示平均海平面。 + * Nautilus 文件管理器进行了改进,支持有密码保护的压缩文件,并能够让你切换启用/禁用自动清理垃圾的功能 + * “音乐Music”应用程序的用户界面进行了更新 + * GNOME 文本编辑器有了更多功能 + * GTK 更新至 4.4.0 + * 增加 libawaita,以潜在地改善 GNOME 应用程序的用户体验 + +你可以参考 [官方更新日志和公告博文][13] 来探索所有的技术变化。 + +### 总结 + +GNOME 41 可能不是一个突破性的升级,但它是一个带有许多有价值的补充的重要更新。 + +你可以期待在下个月发布 Fedora 35 中带有它。不幸的是,Ubuntu 21.10 将不包括它,但你可以在其他 Linux 发行版中等待它。 + +-------------------------------------------------------------------------------- + +via: https://news.itsfoss.com/gnome-41-release/ + +作者:[Ankush Das][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://news.itsfoss.com/author/ankush/ +[b]: https://github.com/lujun9972 +[1]: https://itsfoss.com/gnome-os/ +[2]: https://i2.wp.com/i.ytimg.com/vi/holOYrZquBQ/hqdefault.jpg?w=780&ssl=1 +[3]: https://i2.wp.com/news.itsfoss.com/wp-content/uploads/2021/09/gnome-41-software.png?w=1233&ssl=1 +[4]: https://news.itsfoss.com/apps-for-gnome-portal/ +[5]: https://i0.wp.com/news.itsfoss.com/wp-content/uploads/2021/09/gnome-41-software-app.png?w=1284&ssl=1 +[6]: https://i2.wp.com/news.itsfoss.com/wp-content/uploads/2021/09/gnome-41-multitasking.png?w=1032&ssl=1 +[7]: https://i1.wp.com/news.itsfoss.com/wp-content/uploads/2021/09/gnome-41-power-settings.png?w=443&ssl=1 +[8]: https://i0.wp.com/news.itsfoss.com/wp-content/uploads/2021/09/gnome-41-power-options.png?w=1012&ssl=1 +[9]: https://news.itsfoss.com/elementary-os-6-features/ +[10]: https://i1.wp.com/news.itsfoss.com/wp-content/uploads/2021/09/connections-gnome-41.png?w=1075&ssl=1 +[11]: https://news.itsfoss.com/gnome-41-beta/ +[12]: https://i1.wp.com/news.itsfoss.com/wp-content/uploads/2021/09/gnome-web-41.png?w=1328&ssl=1 +[13]: https://help.gnome.org/misc/release-notes/41.0/ diff --git a/published/202109/20210924 An open source alternative to Microsoft Exchange.md b/published/202109/20210924 An open source alternative to Microsoft Exchange.md new file mode 100644 index 0000000000..31cd9853e0 --- /dev/null +++ b/published/202109/20210924 An open source alternative to Microsoft Exchange.md @@ -0,0 +1,81 @@ +[#]: subject: "An open source alternative to Microsoft Exchange" +[#]: via: "https://opensource.com/article/21/9/open-source-groupware-grommunio" +[#]: author: "Markus Feilner https://opensource.com/users/mfeilner" +[#]: collector: "lujun9972" +[#]: translator: "geekpi" +[#]: reviewer: "wxy" +[#]: publisher: "wxy" +[#]: url: "https://linux.cn/article-13833-1.html" + +微软 Exchange 的一个开源替代方案 +====== + +> 开源用户现在有了一个强大的、功能齐全的群件选择。 + +![](https://img.linux.net.cn/data/attachment/album/202109/29/141404pesw8xgh8oohwhjh.jpg) + +多年来,微软 Exchange 作为一个平台牢牢统治着群件环境。然而,在 2020 年末,一个奥地利的开源软件开发商推出了 [grommunio][2],这是一个群件服务器和客户端,其外观和感觉让 Exchange 和 Outlook 用户感到很熟悉。 + +grmmunio 项目可以很好地替代 Exchange。开发者以与微软相同的方式将组件连接到平台上,它们支持 RPC (远程过程调用)与 HTTP 协议。据开发者介绍,grommunio 还包括许多常见的群件接口,如 IMAP、POP3、SMTP、EAS(Exchange ActiveSync)、EWS(Exchange Web Services)、CalDAV 和 CardDAV。有了这样广泛的支持,grommunio 可以顺利地整合到现有的基础设施中。 + +用户会注意到对 Outlook、Android 和 iOS 客户端来说几乎没有区别。当然,作为开源软件,它也支持其他客户端。由于集成了原生的 Exchange 协议,Outlook 和智能手机与 grommunio 的通信就像与微软 Exchange 服务器一样。日常的企业用户可以继续使用他们现有的客户端,而 grommunio 服务器则在后台安静地运行。 + +### 不仅仅是邮件 + +除了邮件功能外,grommunio 界面还提供了日历系统。可以直接在日历显示中或在一个新标签中点击创建约会。这很直观,正如你对现代工具的期望。用户可以创建、管理和分享日历以及地址簿。私人联系人或普通联系人都支持,而且你可以与同事分享一切。 + +任务管理在左边的下拉菜单中显示任务列表,它们可以有一个所有者和多个合作者。你可以为每个任务指定截止日期、类别、附件和其他属性。笔记可以以同样的方式被管理并与其他团队成员共享。 + +### 聊天、视频会议和文件同步 + +除了现代群件的所有标准功能外,grommunio 还提供聊天、视频会议和文件同步功能。它为企业实现了大规模的全面整合,具有极高的性能。对于开源的推动者来说,这是一个简单的选择,对于系统管理员来说,这是一个强大的选择。因为 grommunio 的目标是整合而不是重新发明,所以所有的组件都是标准的开源工具。 + +![Screenshot of grommunio meeting space][3] + +*用于高级视频会议的 Jitsi 集成(Markus Feilner, [CC BY-SA 4.0][4])* + +在 grommunio 会议功能的背后是 [Jitsi][5],它以熟悉的用户界面顺利地集成到 grommunio 的用户界面中。完全集成和集中管理的聊天功能是基于 [Mattermost][6]。 + +![Screenshot of grommunio's town square for chat][7] + +*用于聊天的 Mattermost(Markus Feilner,[CC BY-SA 4.0][4])* + +[ownCloud][8] 承诺提供企业级的文件共享和同步,在点击“文件”按钮后开始。 + +![Screenshot of grommunio file sharing space][9] + +*用于文件同步和交换的 ownCloud(Markus Feilner,[CC BY-SA 4.0][4])* + +grommunio 项目有一个强大的管理界面,包括角色、域和组织管理、预测性监测和自助服务门户。基于 shell 的向导指导管理员完成安装和从微软 Exchange 迁移数据。开发团队正在不断努力,以实现更好的整合和更集中的管理,并随之为管理员提供更好的工作流程。 + +![Screenshot of grommunio dashboards][10] + +*grommunio 的管理界面(Markus Feilner, [CC BY-SA 4.0][4])* + +### 探索 grommunio + +grommunio 项目的目标很高,但它的开发者已经付出了努力,这一点很明显。一家专门从事税务咨询的德国托管服务机构最近宣布,他们的客户可以使用 grommunio,这是一个德国数据保护法特别严厉的行业。grommunio 项目做得很好:将现有的、成功的概念干净地结合在一起,实现了开放、安全和符合隐私的通信。 + +-------------------------------------------------------------------------------- + +via: https://opensource.com/article/21/9/open-source-groupware-grommunio + +作者:[Markus Feilner][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/mfeilner +[b]: https://github.com/lujun9972 +[1]: https://opensource.com/sites/default/files/styles/image-full-size/public/lead-images/team_dev_email_chat_video_work_wfm_desk_520.png?itok=6YtME4Hj (Working on a team, busy worklife) +[2]: https://grommunio.com/en/ +[3]: https://opensource.com/sites/default/files/uploads/jitsi_0.png (grommunio meeting space) +[4]: https://creativecommons.org/licenses/by-sa/4.0/ +[5]: https://opensource.com/article/20/5/open-source-video-conferencing +[6]: https://opensource.com/education/16/3/mattermost-open-source-chat +[7]: https://opensource.com/sites/default/files/uploads/mattermost.png (grommunio's town square for chat) +[8]: https://owncloud.com/ +[9]: https://opensource.com/sites/default/files/uploads/owncloud_0.png (Owncloud for file synchronization and exchange) +[10]: https://opensource.com/sites/default/files/uploads/grommunio_interface_0.png (Screenshot of grommunio dashboards) diff --git a/published/202109/20210924 Linux Gamers Can Finally Play Games like Apex Legends, Fortnite, Thanks to Easy Anti-Cheat Support.md b/published/202109/20210924 Linux Gamers Can Finally Play Games like Apex Legends, Fortnite, Thanks to Easy Anti-Cheat Support.md new file mode 100644 index 0000000000..c2728027ce --- /dev/null +++ b/published/202109/20210924 Linux Gamers Can Finally Play Games like Apex Legends, Fortnite, Thanks to Easy Anti-Cheat Support.md @@ -0,0 +1,82 @@ +[#]: subject: "Linux Gamers Can Finally Play Games like Apex Legends, Fortnite, Thanks to Easy Anti-Cheat Support" +[#]: via: "https://news.itsfoss.com/easy-anti-cheat-linux/" +[#]: author: "Ankush Das https://news.itsfoss.com/author/ankush/" +[#]: collector: "lujun9972" +[#]: translator: "wxy" +[#]: reviewer: "wxy" +[#]: publisher: "wxy" +[#]: url: "https://linux.cn/article-13821-1.html" + +Linux 玩家终于可以玩《Apex Legends》、《Fortnite》等游戏了 +====== + +> 如果你是一个狂热的多人游戏玩家,你将能够玩到《Apex Legends》和《Fortnite》这样的热门游戏。但是,你可能需要等待一段时间。 + +![](https://i1.wp.com/news.itsfoss.com/wp-content/uploads/2021/09/easy-anti-cheat-linux.png?w=1200&ssl=1) + +Linux 玩家们,这可是个大新闻啊! + +Epic Games 为其“简易反作弊”服务增加了完整的 Linux 支持,官方提供了兼容 [SteamPlay][1](或 Proton)和 Wine 兼容性。 + +尽管我们预计这将在未来的某个时候发生,但 Steam Deck 的引入改变了 [在 Linux 上玩游戏][2] 的场景。 + +你可能知道,Steam Deck 是由 Linux 驱动的,这就是为什么 Epic Games 有兴趣扩大对 Linux 平台的支持。 + +因此,可以说,如果不是 Valve 在 Steam Deck 上的努力,在 Linux 上获得“简易反作弊”支持的机会并不乐观。 + +### 多人游戏玩家可以考虑转到 Linux 上了 + +有了 [简易反作弊][3] 的支持,许多流行的多人游戏,如《Apex Legends》、《Fortnite》、《Tom Clancy's Division 2》、《Rust》 和其他许多游戏应该可以在 Linux 上完美地运行了。 + +根据 Epic Games 的公告: + +> 从最新的 SDK 版本开始,开发者只需在 Epic 在线服务开发者门户点击几下,就可以通过 Wine 或 Proton 激活对 Linux 的反作弊支持。 + +因此,开发人员可能需要一段时间来激活对各种游戏的反作弊支持。但是,对于大多数带有简易反作弊功能的游戏来说,这应该是一个绿色信号。 + +少了一个 [Windows 与 Linux 双启动][4] 的理由。 + +《Apex Legends》 是我喜欢的多人游戏之一。而且,我不得不使用 Windows 来玩这个游戏。希望这种情况很快就会改变,在未来几周内,我可以在 Linux 上试一试! + +同样,如果你几乎就要转到 Linux 了,但因为它与游戏的兼容性问题而迟疑,我想说问题已经解决了一半了! + +当然,我们仍然需要对 BattleEye、其他反作弊服务和游戏客户端的官方支持。但是,这是个开端。 + +### Steam Deck 现在是一个令人信服的游戏选择 + +虽然许多人不确定 Steam Deck 是否支持所有的 AAA 级游戏,但这应该会有所改善! + +[Steam Deck][5] 现在应该是多人游戏玩家的一个简单选择。 + +### 总结 + +如果 Steam Deck 作为一个成功的掌上游戏机而成为了焦点,那么正如我们所知,在 Linux 上玩游戏也将发生改变。 + +而且,我认为 Epic Games 在其反作弊服务中加入 Linux 支持仅仅只是一个开始。 + +也许,我们永远都不用借助 [ProtonDB][6] 来在 Linux 上玩一个只有 Windows 支持的游戏;谁知道呢?但是,在这之后,Linux 游戏的未来似乎充满希望。 + +如果你是一个开发者,你可能想阅读 [该公告][7] 来获得最新的 SDK。 + +你对 Epic Games 将简易反作弊引入 Linux 有何看法?欢迎在下面的评论中分享你的想法。 + +-------------------------------------------------------------------------------- + +via: https://news.itsfoss.com/easy-anti-cheat-linux/ + +作者:[Ankush Das][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://news.itsfoss.com/author/ankush/ +[b]: https://github.com/lujun9972 +[1]: https://itsfoss.com/steam-play/ +[2]: https://itsfoss.com/linux-gaming-guide/ +[3]: https://www.easy.ac/en-us/ +[4]: https://itsfoss.com/install-ubuntu-1404-dual-boot-mode-windows-8-81-uefi/ +[5]: https://www.steamdeck.com/en/ +[6]: https://www.protondb.com +[7]: https://dev.epicgames.com/en-US/news/epic-online-services-launches-anti-cheat-support-for-linux-mac-and-steam-deck diff --git a/published/202109/20210927 5 open source alternatives to Zoom.md b/published/202109/20210927 5 open source alternatives to Zoom.md new file mode 100644 index 0000000000..64e4bd65c2 --- /dev/null +++ b/published/202109/20210927 5 open source alternatives to Zoom.md @@ -0,0 +1,73 @@ +[#]: subject: "5 open source alternatives to Zoom" +[#]: via: "https://opensource.com/article/21/9/alternatives-zoom" +[#]: author: "Seth Kenlon https://opensource.com/users/seth" +[#]: collector: "lujun9972" +[#]: translator: "geekpi" +[#]: reviewer: "wxy" +[#]: publisher: "wxy" +[#]: url: "https://linux.cn/article-13836-1.html" + +5 个替代 Zoom 的开源软件 +====== + +> 试试这些开源视频会议服务之一。 + +![](https://img.linux.net.cn/data/attachment/album/202109/30/114413ylalu7dcl5au575v.jpg) + +我最近参加了 [实用开源信息(POSI)][2] 会议,它是在一个自由开源的视频会议平台上举行的。当我参加了一系列关于开源软件的实际用途的精彩讲座时,我意识到视频会议在过去几年里已经变得非常普遍。 + +如果说开源做了什么,那就是提供了选择,现在越来越多的工人有了远程工作的自由,在你的连接方式上有一个选择是非常有意义的。 + +有时,你需要一个全功能的视频会议应用,其中包括审核、演示模式和分组讨论室,而其他时候,你想做的只是给朋友打一个快速电话,以便看到对方的脸。 + +### Jitsi + +[Jitsi][3] 是一个简单、随意、但强大的视频通话平台。你可以自己托管它,也可以在 [meet.jit.si][4] 的公共实例上使用它。它有可定制的 URL,可以很容易地与你想见面的朋友分享链接、通话中的聊天、管理控制,和通话录音。它的开发非常活跃,每年都会测试和发布一大批新功能。它是 Opensource.com 用于我们每周会议的平台。 + +### Signal + +[Signal][5] 已经是一个流行的以安全为重点的聊天应用,最近它又增加了 [团体视频通话][6] 的功能。视频通话非常适合简单的会议,而且因为你只能与你的 Signal 联系人列表中的其他人见面,所以不用担心你的视频通话会议上有不速之客。当你尝试定位你应该参与开会的虚拟房间时,也没有来回的“电话标签”。这一切都发生在 Signal 中,因此无需猜测。 + +Signal 本身是非常直观的,视频功能非常适合其现有惯例。简而言之,只要你的联系人在使用 Signal,这就是一个不费力的视频通话平台。这是我用于个人联系的应用,我经常使用其视频通话功能与朋友和家人联系。 + +### P2p.chat + +[P2p.chat][7] 是这些中最简单的一个,无论是设计还是实现。通过 WebRTC 工作,p2p.chat 是一个 Web 应用,允许你直接连接到你正在呼叫的人,而不需要托管服务器。p2p.chat 的界面并不多,但这也是其吸引力的另一部分。没有管理控制或演示模式,因为 p2p.chat 在很大程度上是科幻片中承诺的“视频电话”:与远方的人进行轻松的人对人(或人们对人们)视频通话。 + +你可以使用自定义的 URL 来动态地创建一个会议空间,所以它们相对容易记忆(除了小的随机部分)和输入。我和不在 Signal 上的朋友使用 p2p.chat,它从未让我失望过。 + +### BigBlueButton + +如果你需要严格的管理控制和极端的灵活性,[BigBlueButton][8] 是你正在寻找的解决方案,它专为教室、会议和演讲而设计。有了 BigBlueButton,你可以让所有与会者静音,阻止和踢走一个与会者,创建分组讨论室,创建协作式白板,共享屏幕,进行演讲,以及记录会议。与会者可以“举起手”表示注意,并将他们的状态设定为非语言交流方式。它很容易使用,但它是一个严肃的平台,适用于重点和非常大的群体。我参加过一些使用 BigBlueButton 的技术会议,包括 [实用开源信息(POSI)][2]会议。 + +### Wire + +[Wire][9] 是寻找托管视频聊天和群件客户端的企业客户的绝佳选择。它是 [AGPL][10] 许可,这个开源项目可用于桌面和服务器、安卓和 iOS。它具有视频通话、发信和文件共享的功能,因此,即使是远程会议,基本上也有亲自开会的所有便利。你可以在有限的时间内免费试用 Wire,然后为你的公司购买一份支持合同。另外,你也可以自己托管它。 + +### 开源视频聊天 + +没有理由满足于由你可能不完全信任的公司托管的专有视频通话。今天可用的开源选项对于与你的职业和个人生活中的所有人保持联系是非常好的。下次你想和朋友见面时,不妨试试这些解决方案之一。 + +-------------------------------------------------------------------------------- + +via: https://opensource.com/article/21/9/alternatives-zoom + +作者:[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/chat_video_conference_talk_team.png?itok=t2_7fEH0 (Two people chatting via a video conference app) +[2]: https://opensource.org/posicfp +[3]: http://jitsi.org +[4]: http://meet.jit.si +[5]: https://signal.org +[6]: https://support.signal.org/hc/en-us/articles/360052977792-Group-Calling-Voice-or-Video-with-Screen-Sharing +[7]: https://p2p.chat/ +[8]: https://bigbluebutton.org/ +[9]: https://wire.com/en/ +[10]: https://opensource.org/licenses/AGPL-3.0 diff --git a/published/202109/20210929 Manage CentOS Stream with Foreman.md b/published/202109/20210929 Manage CentOS Stream with Foreman.md new file mode 100644 index 0000000000..52d66d056a --- /dev/null +++ b/published/202109/20210929 Manage CentOS Stream with Foreman.md @@ -0,0 +1,164 @@ +[#]: subject: "Manage CentOS Stream with Foreman" +[#]: via: "https://opensource.com/article/21/9/centos-stream-foreman" +[#]: author: "Melanie Corr https://opensource.com/users/melanie-corr" +[#]: collector: "lujun9972" +[#]: translator: "wxy" +[#]: reviewer: "wxy" +[#]: publisher: "wxy" +[#]: url: "https://linux.cn/article-13837-1.html" + +用 Foreman 管理 CentOS Stream +====== + +> 这个例子让我们看到了在 Foreman 中管理和配置 CentOS Stream 内容的许多选项。 + +![](https://img.linux.net.cn/data/attachment/album/202109/30/133541s3e3s31yzmnugl1s.jpg) + +2021 年 12 月,CentOS 8 将达到生命终点,被 CentOS Stream 取代。CentOS Stream 和 CentOS 之前的迭代之间的主要变化之一是没有小版本。Centos Stream 采用了一个连续的发布周期。从今年年初开始,Foreman 社区的开发者开始看到 CentOS Stream 由于持续发布而提供的更早的错误检测和补丁的好处。我们不再需要等待下一个版本来利用最新的变化和错误修复。[一位资深的 Linux 社区爱好者][2] 指出,此举也使 RHEL 开发者比以往更接近 FOSS 社区。 + +然而,如果你是一个拥有数百或数千台服务器的管理员,你可能想控制新的软件包何时被添加到特定的服务器。如果你正在寻找一个免费的开源工具,帮助你确保生产服务器的稳定性,同时允许你安全地从 Centos Stream 中拉入最新的变化用于开发和测试,这就是 Foreman 可以帮助你的地方。有了 Foreman,你可以在生命周期环境的各个阶段管理你的 Centos Stream 内容。 + +### Foreman 介绍 + +Foreman 是一个完整的物理和虚拟服务器的生命周期管理工具。有了 Foreman,系统管理员有能力轻松实现重复性任务的自动化,快速部署应用程序,并主动管理内部或云中的服务器。Foreman 为配备provisioning管理、配置管理和监控提供了企业级解决方案。由于其插件架构,Foreman 可以以无数种方式进行扩展。使用 Katello 插件,你可以把 Foreman 作为一个完整的内容管理content management工具来管理 CentOS Stream,以及其他许多内容类型。 + +通过 Foreman 和 Katello,你可以准确地定义你希望每个环境包含哪些软件包。例如,生产环境可能使用已被验证为稳定的软件包,而开发环境可能需要最新、最先进的软件包版本。你还可以跨生命周期环境推广内容视图content view。让我们来看看 Foreman 是如何完成这个任务的。 + +我们在这篇文章中使用了网页用户界面,但 Foreman 也有一个强大的 CLI 和 API。Katello 插件为 Pulp 项目提供了一个工作流和网页用户界面,你可以在 [这篇文章][3] 中了解更多。我们在这里也提供了一个简单的工作流程,但是 Foreman 和 Katello 项目提供了许多不同的配置选项来满足你的具体需求。 + +本文假设 Foreman 和 Katello 已经安装完毕。关于如何安装的更多信息,请参阅 [Katello 安装手册][4]。 + +### 创建一个产品 + +第一步是在 Foreman 中创建一个产品product。该产品的功能是作为一个内部标签来存储 CentOS Stream 存储库。 + + 1. 在 Foreman 网页用户界面,导航到“内容Content > 产品Products”,并点击“创建产品Create Product”。 + 2. 在“名称Name”字段中,为产品输入一个名称。Foreman会根据你输入的“名称Name”自动完成“标签Label”字段,以后不能再更改。 + +### 将 CentOS Stream 存储库添加到产品中 + +现在你有了一个产品,你可以使用 AppStream 和 BaseOS 存储库的 URL,并将它们添加到你的新产品中。 + + 1. 在 Foreman 网页用户界面中,导航到 “内容Content > 产品Products”,选择你要使用的产品,然后点击 “新存储库New Repository”。 + 2. 在“名称Name”字段中,为存储库输入一个名称;例如,“Centos8StreamBaseOS”。Foreman 会根据你输入的“名称Name”,自动完成“标签Label”字段。 + 3. 从“类型Type”列表中,选择存储库的类型,然后选择“Yum”。 + 4. 在 “URL” 字段中,输入 CentOS Stream Baseos 存储库的 URL,作为源: `http://mirror.centos.org/centos/8-stream/BaseOS/x86_64/os/`。 + 5. 选择“下载规则Download Policy”列表。默认的是“按需On Demand”,这意味着 Katello 将只下载元数据。如果你想下载所有的软件包,请改成“即时Immediate”,它可以下载所有的软件包,可能会达到 20-30GB。 + 6. 确保“与镜像同步Mirror on Sync”复选框被选中。这个选项确保在同步过程中,不再是上游存储库的一部分的内容被删除。 + 7. 点击“保存Save”。 + + + +重复这些步骤,添加 AppStream 存储库及其 URL,例如,`http://mirror.centos.org/centos/8-stream/AppStream/x86_64/os/`。确保你使用最近的官方 CentOS 镜像来代替它。 + +要执行立即同步,在你的产品窗口,点击“立即同步Sync Now”。最初的同步可能需要一些时间。你可以从“内容Content > 同步状态Sync Status”查看同步状态。 + +同步完成后,你可以在“主机 Hosts > 操作系统Operating System”中查看新的 CentOS Stream 操作系统。请随意编辑名称和描述以满足你的要求。 + +如果你打算使用 Ansible 或 Puppet 等配置管理软件,Foreman 会自动创建一个操作系统报告。你可以在“管理Administe > 设置Settings > 忽略操作系统状况Ignore facts for operating system”中关闭这个选项。重命名操作系统以匹配配置管理软件中的名称是一个好主意。例如,对于 Puppet,这将是“CentOS 8”。 + +### 定义你的基础设施的生命周期环境 + +应用程序生命周期是 Foreman 的内容管理功能的一个核心概念。应用程序的生命周期定义了一个特定的系统和它的软件在特定阶段的状况。例如,一个应用程序的生命周期可能很简单,你可能只有一个“开发”阶段和“生产”阶段。Foreman 提供了一些方法来以可控的方式定制每个应用生命周期阶段,以适应你的规范。 + +在这一点上,你必须创建你的生命周期环境路径。 + + 1. 在 Foreman 网页用户界面中,导航到“内容Content > 生命周期环境Lifecycle Environments”。 + 2. 点击“新环境路径New Environment Path”,开始一个新的应用生命周期。 + 3. 在“名称Name”字段中,为你的环境输入一个名称。 + 4. 在“描述Description”字段中,为你的环境输入一个描述。 + 5. 点击“保存Save”。 + 6. 根据你的需要添加尽可能多的环境路径。例如,你可以创建“dev”、“test”、“stage” 和 “production” 环境。要添加这些环境,点击“添加新环境”,完成“名称Name”和“描述Description”字段,并从“优先环境Prior Environment*”列表中选择先前的环境,这样你就可以按照你预期使用的顺序将它们串联起来。 + + + +### 创建和发布一个内容视图 + +在 Foreman 中,“内容视图Content View”是你的存储库在某个特定时间点的快照。内容视图提供了隔离软件包版本到你想保留的状态的机制。内容视图有很多可配置的功能,你可以用它来进一步细化。为了本教程的目的,让我们保持简单。 + + 1. 在 Foreman 网页用户界面中,导航到“内容Content > 内容视图Content View”,并点击“创建新视图Create New View”。 + 2. 在“名称Name”字段中,为视图输入一个名称。Foreman 会根据你输入的名称自动完成“标签Label”字段。 + 3. 在“描述Description”字段中,输入视图的描述。 + 4. 单击“保存Save”以创建内容视图。 + 5. 在新的内容视图中,点击“Yum 内容Yum Contents > 添加存储库Add Repositories”,在“存储库选择Repository Selection”区域,点击“添加Add”。对于 BaseOS 和 Appstream 存储库,选择你想包括的软件包,然后点击“添加存储库Add Repositories”。 + 6. 点击“发布新版本Publish New Version”,在“描述Description”区域,输入关于版本的信息以记录变化。 + 7. 单击“保存Save”。 + +当你点击“发布新版本Publish New Version”时,你创建了一个你已同步的所有内容的快照。这意味着你订阅此内容视图的每台服务器将只能访问与此生命周期环境相关的内容视图中的软件包版本。 + +每一个新的内容视图和后续版本都会首先发布到库环境,然后你可以在那里推广到其他环境。 + +### 跨生命周期环境推广内容 + +如果你已经测试了新的软件包,并且确信一切都很稳定,你可以把你的内容视图推广到另一个生命周期环境中。 + + 1. 导航到“内容Content > 内容视图Content Views”,选择你想推广的内容视图。 + 2. 点击内容视图的“版本Versions”标签。 + 3. 选择你想推广的版本,并在“操作Action”栏中,点击“推广Promote”。 + 4. 选择你要推广内容视图的环境,并点击“推广版本Promote Version”。 + 5. 再次点击“推广Promote”按钮。这次选择生命周期环境,例如,“Test”,然后单击“推广版本Promote Version”。 + 6. 最后,再次点击“推广Promote”按钮。例如,选择“Production”环境并点击“推广版本Promote Version”。 + +被分配到该特定环境的服务器现在可以从一套更新的软件包中提取。 + +### 创建一个激活密钥 + +为了将 CentOS Stream 服务器注册到你在特定生命周期中定义的内容,你必须创建一个激活密钥。激活密钥是一种与服务器共享凭证的安全方法。这使用了一个叫做“订阅管理器subscription-manager的工具来订阅 CentOS Stream 服务器的内容。 + +当你创建了激活密钥后,将 CentOS Stream 订阅添加到激活密钥中。 + + 1. 在 Foreman 网页用户界面中,导航到“内容Content > 激活密钥Activation keys”,并点击“创建激活密钥Create Activation Key”。 + 2. 在“名称Name”栏中,输入激活密钥的名称。 + 3. 在“描述Description”栏中,输入激活密钥的描述。 + 4. 从“环境Environment”列表中,选择要使用的环境。 + 5. 从“内容视图Content View”列表中,选择你刚才创建的内容视图。 + 6. 点击“保存Save”。 + +###从 Foreman 管理的内容中创建一个 CentOS Stream 主机 + +现在一切都准备好了。随着你创建的内容包含在内容视图中,并在整个生命周期中推广,你现在可以准确地用你想使用的内容来配置主机,并订阅你想让它们接收的更新。 + +要在 Foreman 中创建一个主机,请导航到“主机 > 创建主机”。 + + 1. 在“名称Name”字段中,为主机输入一个名称。 + 2. 单击“组织Organization”和“位置Location”选项卡,以确保配置环境自动设置为当前环境。 + 3. 从“部署在Deploy On”列表中,选择“裸金属Bare Metal”。 + 4. 单击“操作系统Operating System”选项卡。 + 5. 从“架构Architectures”列表中,选择“x86_64”。 + 6. 从“操作系统Operating System”列表中,选择“CentOS_Stream 8”。 + 7. 勾选“构建模式Build Mode”框。 + 8. 对于“媒体选择Media Selection”,选择“同步的内容Synced Content”来使用你之前同步的 CentOS Stream 内容。 + 9. 从“同步的内容Synced Content”列表中,确保选择 “CentOS Stream”。 + 10. 从“分区表Partition Table”列表中,对于这个演示,选择默认的 “Kickstart”,但有许多可用的选项。 + 11. 在“Root 密码Root Password”栏中,为你的新主机输入一个 root 密码。 + 12. 点击“接口Interface”标签,并点击“编辑Edit”,并添加一个 “Mac 地址Mac address”。 + 13. 点击“参数Parameters”标签,并确保存在一个提供激活密钥的参数。如果没有,添加一个激活密钥。 + 14. 点击“提交Submit”以保存主机条目。 + + + +现在,新的主机处于构建模式,这意味着当你打开它时,它将开始安装操作系统。 + +如果你导航到“主机Hosts > 内容主机Content Hosts”,你可以看到你的主机所订阅的订阅、生命周期环境和内容视图的全部细节。 + +这个例子只是对你在 Foreman 中管理和配置 CentOS Stream 内容的众多选项的一个小窥视。如果你想了解更多关于如何管理 CentOS Stream 版本,控制你的服务器可以访问的内容,以及控制和保护你的基础设施的稳定性的详细信息,请查看 [Foreman 内容管理][5] 文档。当所有 CentOS Stream 内容在你的控制之下时,你可以创建和注册 Centos Stream,只使用你指定的内容。有关配备的更多详细信息,请参见 [Foreman 配备][6] 文档。如果你有任何问题、反馈或建议,你可以在 找到 Foreman 社区。 + +-------------------------------------------------------------------------------- + +via: https://opensource.com/article/21/9/centos-stream-foreman + +作者:[Melanie Corr][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/melanie-corr +[b]: https://github.com/lujun9972 +[1]: https://opensource.com/sites/default/files/styles/image-full-size/public/lead-images/puzzle_computer_solve_fix_tool.png?itok=U0pH1uwj (Puzzle pieces coming together to form a computer screen) +[2]: https://twitter.com/Det_Conan_Kudo/status/1337366036023218177?s=20 +[3]: https://opensource.com/article/20/8/manage-repositories-pulp +[4]: https://docs.theforeman.org/3.0/Installing_Server_on_Red_Hat/index-katello.html +[5]: https://docs.theforeman.org/master/Content_Management_Guide/index-foreman.html +[6]: https://docs.theforeman.org/master/Provisioning_Guide/index-foreman.html diff --git a/published/202110/20200228 How to process real-time data with Apache.md b/published/202110/20200228 How to process real-time data with Apache.md new file mode 100644 index 0000000000..7d4b4189b2 --- /dev/null +++ b/published/202110/20200228 How to process real-time data with Apache.md @@ -0,0 +1,82 @@ +[#]: collector: (lujun9972) +[#]: translator: (unigeorge) +[#]: reviewer: (wxy) +[#]: publisher: (wxy) +[#]: url: (https://linux.cn/article-13891-1.html) +[#]: subject: (How to process real-time data with Apache) +[#]: via: (https://opensource.com/article/20/2/real-time-data-processing) +[#]: author: (Simon Crosby https://opensource.com/users/simon-crosby) + +如何使用 Apache 软件处理实时数据 +====== + +> 开源以丰富的项目画布引领着处理实时事件的方向。 + +![](https://img.linux.net.cn/data/attachment/album/202110/17/105502opl53qrmj950j3mv.jpg) + +在“永不下线”的未来,入网设备规模可能会达到数十亿。存储原始数据,日后再进行分析的方案将不再能满足需求,因为用户需要实时且准确的响应。要对故障等对环境敏感的状况进行预测,实时处理数据也必不可少 —— 数据到达数据库后再处理肯定是来不及的。 + +有人可能会说,“云可扩展性”能够满足实时处理流数据的需求,但一些简单的例子就能表明它永远无法满足对无界数据流进行实时响应的需求。从移动设备到物联网,都需要一种新的范式来满足需求。尽管云计算依赖于对大数据“先存储后分析”的方案,但也迫切需要一种能够处理持续、杂乱和海量数据流的软件框架,并在数据流到达时立即对其进行处理,以保证实时的响应、预测和对数据的洞悉。 + +例如,在加利福尼亚州的帕洛阿尔托市,每天从基础交通设施产生的流数据比 Twitter Firehose 还要多。这是很大的数据量。为 Uber、Lyft 和 FedEx 等消费者预测城市交通需要实时的分析、学习和预测。云处理不可避免地导致每个事件大约会有半秒的延迟。 + +我们需要一个简单而强大的编程范式,让应用程序在类似下面的情况时能够动态处理无界数据流: + + * 数据量巨大,或原始数据的移动成本很高。 + * 数据由广泛分布的资产(例如移动设备)生成。 + * 数据具有转瞬即逝的价值,即时分析迫在眉睫。 + * 需要始终洞悉最新数据情况,外推法行不通。 + +### 发布和订阅 + +事件驱动系统领域中有一个关键架构模式:发布/订阅publish/subscribe 消息传递模式。这是一种异步通信方法,其中消息会从 _发布者_(数据产生方)传递到 _订阅者_(处理数据的应用程序)。发布/订阅模式可以将消息发送者与消费者分离开来。 + +在发布/订阅模式中,消息源会 _发布_ 针对某个 主题topic事件event服务端broker,后者按接收顺序存储它们。应用程序可以 _订阅_ 一个或多个 _主题_,然后 _服务端_ 会转发匹配的事件。 Apache Kafka 和 Pulsar 以及 CNCF NATS 是发布/订阅系统。 发布/订阅的云服务包括 Google Pub/Sub、AWS Kinesis、Azure Service Bus、Confluent Cloud 等。(LCTT 译注:本段部分术语英文名称更为泛用,针对这些术语,采用了中英文标注。) + +发布/订阅系统不会 _运行_ 订阅者应用程序,它们只是 _传递_ 数据给相应主题的订阅者。 + +流数据通常包含应用程序或基础架构状态更新的事件。在选择架构来处理数据时,发布/订阅框架等数据分发系统的作用是有限的。消费者应用程序的“处理方式”超出了发布/订阅系统的范围。这让开发人员的管理变得极具复杂性。所谓的流处理器是一种特殊的订阅者,可以动态分析数据并将结果返回给同一个服务端。 + +### Apache Spark + +[Apache Spark][2] 是用于大规模数据处理的统一分析引擎。通常将 Apache Spark Streaming 用作流处理器,例如给机器学习模型提供新数据。Spark Streaming 将数据分成小批量,每个小批量都由 Spark 模型或其他系统独立分析。事件流可以被分组成小批量以进行分析,但流处理器本身必须具有弹性: + + * 流处理器必须能够根据数据速率进行扩展,甚至要能够跨越服务器和云,并且还可以跨实例实现负载均衡,以确保弹性和其他应用层的需求。 + * 它必须能够分析来自不同来源的数据,这些数据源的报告速率可能相差很大。这意味着它必须是有状态的,或者将状态存储在数据库中。当使用 Spark Streaming 作为流处理器时,通常会使用后一种方法,这种方法在需要超低延迟响应时可能会存在性能问题。 + +相关项目 [Apache Samza][3] 也提供了一种处理实时事件流的方法,并使用 [Hadoop Yarn][4] 或 [Apache Mesos][5] 来管理计算资源,以便进行弹性扩展。 + +### 解决数据扩展问题 + +需要注意的是,即使是 Samza 也不能完全减轻开发人员的数据处理需求。扩展数据规模意味着处理事件的任务需要跨多个实例进行负载均衡,而使用数据库是实例间共享结果应用层状态的唯一方法。然而,当应用程序任务之间的状态协调转移到数据库时,对性能会产生不可避免的连锁反应。此外,数据库的选择也至关重要。随着系统的扩展,数据库的集群管理会成为下一个潜在的瓶颈。 + +这个问题可以通过有状态、有弹性的替代方案来解决,并且这样的解决方案可以用来代替流处理器。在应用程序级别(容器或实例内),这些解决方案依据流的更新,动态构建并发、互连的“web 代理”的有状态模型。代理是并发的“微服务”,它们消费单一来源的原始数据并维护它们的状态。基于数据中发现的源之间的真实关系(如包含和临近),代理实现互连以共享状态。代理也因此形成了一个并发服务图,可以分析它们自己的状态和链接到的代理的状态。数据源将原始数据转换为状态,并根据自身及其链接子图的变化进行分析、学习和预测,每个代理都为单个这样的数据源提供微服务。 + +这些解决方案允许大量的代理(真实数据源的数字类比)分布,甚至还有在应用层使代理互连的分布式图,从而简化了应用架构。这是因为代理之间互连的本质,是映射到解决方案的当前运行时执行实例和代理本身的 URL。通过这种方式,应用程序可以跨实例无缝扩展,而无需担心 DevOps 问题。代理消费数据并维护状态,还会计算自己和其他代理的状态。由于代理是有状态的,因此不需要数据库,并且数据洞察是以内存速度计算的。 + +### 使用开源阅读数据世界 + +我们查看数据的方式正在发生翻天覆地的变化:不再将数据库用作记录系统,取而代之的是现实世界,现实世界事物的数字类比可以不断地传输它们的状态。幸运的是,开源社区在处理实时事件的项目丰富度方面处于领先地位。从发布/订阅模式(其中最活跃的社区是 Apache Kafka、Pulsar 和 CNCF NATS)到持续处理流数据的分析框架,包括 Apache Spark、[Flink][6]、[Beam][7]、Samza,以及 Apache 许可的 [SwimOS][8] 和 [Hazelcast][9],对开发人员来说,可选择项目非常之多。可以说,没有什么地方比开源社区的专有软件框架更多了。试看软件的未来,必是开源的天下。 + +-------------------------------------------------------------------------------- + +via: https://opensource.com/article/20/2/real-time-data-processing + +作者:[Simon Crosby][a] +选题:[lujun9972][b] +译者:[unigeorge](https://github.com/unigeorge) +校对:[wxy](https://github.com/wxy) + +本文由 [LCTT](https://github.com/LCTT/TranslateProject) 原创编译,[Linux中国](https://linux.cn/) 荣誉推出 + +[a]: https://opensource.com/users/simon-crosby +[b]: https://github.com/lujun9972 +[1]: https://opensource.com/sites/default/files/styles/image-full-size/public/lead-images/clocks_time.png?itok=_ID09GDk (Alarm clocks with different time) +[2]: https://spark.apache.org/ +[3]: https://samza.apache.org/ +[4]: https://hadoop.apache.org/ +[5]: http://mesos.apache.org/ +[6]: https://flink.apache.org/ +[7]: https://beam.apache.org +[8]: https://github.com/swimos/swim +[9]: https://hazelcast.com/ diff --git a/published/202110/20200504 Define and optimize data partitions in Apache Cassandra.md b/published/202110/20200504 Define and optimize data partitions in Apache Cassandra.md new file mode 100644 index 0000000000..2d5c833852 --- /dev/null +++ b/published/202110/20200504 Define and optimize data partitions in Apache Cassandra.md @@ -0,0 +1,141 @@ +[#]: collector: (lujun9972) +[#]: translator: (unigeorge) +[#]: reviewer: (wxy) +[#]: publisher: (wxy) +[#]: url: (https://linux.cn/article-13908-1.html) +[#]: subject: (Define and optimize data partitions in Apache Cassandra) +[#]: via: (https://opensource.com/article/20/5/apache-cassandra) +[#]: author: (Anil Inamdar https://opensource.com/users/anil-inamdar) + +在 Apache Cassandra 中定义和优化数据分区 +====== + +> 速度和可扩展性是 Apache Cassandra 不变的追求;来学习一下如何充分发挥它的专长吧。 + +![](https://img.linux.net.cn/data/attachment/album/202110/22/103651gse3iyiajyaagk34.jpg) + +Apache Cassandra 是一个数据库,但又不是一个简单的数据库;它是一个复制数据库,专为可扩展性、高可用性、低延迟和良好性能而设计调整。Cassandra 可以帮你的数据在区域性中断、硬件故障时,以及很多管理员认为数据量过多的情况下幸免于难。 + +全面掌握数据分区知识,你就能让 Cassandra 集群实现良好的设计、极高的性能和可扩展性。在本文中,我将探究如何定义分区,Cassandra 如何使用这些分区,以及一些你应该了解的最佳实践方案和已知问题。 + +基本概念是这样的: 供数据库关键函数(如数据分发、复制和索引化)使用的原子单元,单个这样的数据块就是一个分区。分布式数据系统通常会把传入的数据分配到这些分区中,使用简单的数学函数(例如 identity 或 hashing 函数)执行分区过程,并用得到的 “分区键” 对数据分组,进一步再形成分区。例如,假设传入数据是服务器日志,使用 “identity” 分区函数和每个日志的时间戳(四舍五入到小时值)作为分区键,我们可以对这些数据进行分区,实现每个分区各保存一小时的日志的目的。 + +### Cassandra 中的数据分区 + +Cassandra 作为分布式系统运行,并且符合前述数据分区原则。使用 Cassandra,数据分区依赖于在集群级别配置的算法和在表级别配置的分区键。 + +![Cassandra data partition][2] + +Cassandra 查询语言(CQL)使用大家很熟悉的 SQL 表、行、列等术语。在上面的示例图中,表配置的主键中包含了分区键,具体格式为:主键Primary Key = 分区键Partition Key + [聚簇列Clustering Columns] 。 + +Cassandra 中的主键既定义了唯一的数据分区,也包含着分区内的数据排列依据信息。数据排列信息取决于聚簇列(非必需项)。每个唯一的分区键代表着服务器(包括其副本所在的服务器)中管理的若干行。 + +### 在 CQL 中定义主键 + +接下来的四个示例演示了如何使用 CQL 语法表示主键。定义主键会让数据行分到不同的集合里,通常这些集合就是分区。 + +#### 定义方式 1(分区键:log_hour,聚簇列:无) + +``` +CREATE TABLE server_logs( +   log_hour TIMESTAMP PRIMARYKEY, +   log_level text, +   message text, +   server text +   ) +``` + +这里,有相同 `log_hour` 的所有行都会进入同一个分区。 + +#### 定义方式 2(分区键:log_hour,聚簇列:log_level) + +``` +CREATE TABLE server_logs( +   log_hour TIMESTAMP, +   log_level text, +   message text, +   server text, +   PRIMARY KEY (log_hour, log_level) +   ) +``` + +此定义方式与方式 1 使用了相同的分区键,但此方式中,每个分区的所有行都会按 `log_level` 升序排列。 + +#### 定义方式 3(分区键:log_hour,server,聚簇列:无) + +``` +CREATE TABLE server_logs( +   log_hour TIMESTAMP, +   log_level text, +   message text, +   server text, +   PRIMARY KEY ((log_hour, server)) +   ) +``` + +在此定义中,`server` 和 `log_hour` 字段都相同的行才会进入同一个分区。 + +#### 定义方式 4(分区键:log_hour,server,聚簇列:log_level) + +``` +CREATE TABLE server_logs( +   log_hour TIMESTAMP, +   log_level text, +   message text, +   server text, +   PRIMARY KEY ((log_hour, server),log_level) +   )WITH CLUSTERING ORDER BY (column3 DESC); +``` + +此定义方式与方式 3 分区相同,但分区内的行会依照 `log_level` 降序排列。 + +### Cassandra 如何使用分区键 + +Cassandra 依靠分区键来确定在哪个节点上存储数据,以及在需要时定位数据。Cassandra 通过查看表中的分区键来执行这些读取和写入操作,并使用令牌tokens(一个 $-2^{63}$ 到 $+2^{63}-1$ 范围内的 long 类型值)来进行数据分布和索引。这些令牌通过分区器映射到分区键,分区器使用了将分区键转换为令牌的分区函数。通过这种令牌机制,Cassandra 集群的每个节点都拥有一组数据分区。然后分区键在每个节点上启用数据索引。 + +![Cassandra cluster with 3 nodes and token-based ownership][3] + +图中显示了一个三节点的 Cassandra 集群以及相应的令牌范围分配。这只是一个简单的示意图:具体实现过程使用了 [Vnodes][4]。 + +### 数据分区对 Cassandra 集群的影响 + +用心的分区键设计对于实现用例的理想分区大小至关重要。合理的分区可以实现均匀的数据分布和强大的 I/O 性能。分区大小对 Cassandra 集群有若干需要注意的影响: + + * 读取性能 —— 为了在磁盘上的 SSTables 文件中找到分区,Cassandra 使用缓存、索引和索引摘要等数据结构。过大的分区会降低这些数据结构的维护效率,从而对性能产生负面影响。Cassandra 新版本在这方面取得了长足的进步:特别是 3.6 及其以上版本的 Cassandra 引擎引入了存储改进,针对大型分区,可以提供更好的性能,以及更强的应对内存问题和崩溃的弹性。 + * 内存使用 —— 大分区会对 JVM 堆产生更大的压力,同时分区的增大也降低了垃圾收集机制的效率。 + * Cassandra 修复 —— 大分区使 Cassandra 执行修复维护操作(通过跨副本比较数据来保持数据一致)时更加困难。 + * “墓碑”删除 —— 听起来可能有点骇人,Cassandra 使用称为“墓碑tombstones”的独特标记来记录要删除的数据。如果没有合适的数据删除模式和压缩策略,大分区会使删除过程变得更加困难。 + +虽然这些影响可能会让人更倾向于简单地设计能产生小分区的分区键,但数据访问模式对理想的分区大小也有很大影响(有关更多信息,请阅读关于 [Cassandra 数据建模][5] 的深入讲解)。数据访问模式可以定义为表的查询方式,包括表的所有 `select` 查询。 理想情况下,CQL 选择查询应该在 `where` 子句中只使用一个分区键。也就是说,当查询可以从单个分区,而不是许多较小的分区获取所需数据时,Cassandra 是最有效率的。 + +### 分区键设计的最佳实践 + +遵循分区键设计的最佳实践原则,这会帮你得到理想的分区大小。根据经验,Cassandra 中的最大分区应保持在 100MB 以下。理想情况下,它应该小于 10MB。虽然 Cassandra 3.6 及其以上版本能更好地支持大分区,但也必须对每个工作负载进行仔细的测试和基准测试,以确保分区键设计能够支持所需的集群性能。 + +具体来说,这些最佳实践原则适用于任何分区键设计: + + * 分区键的目标必须是将理想数量的数据放入每个分区,以支持其访问模式的需求。 + * 分区键应禁止无界分区:那些大小可能随着时间无限增长的分区。例如,在上面的 `server_logs` 示例中,随着服务器日志数量的不断增加,使用服务器列作为分区键就会产生无界分区。相比之下,使用 `log_hour` 将每个分区限制为一个小时数据的方案会更好。 + * 分区键还应避免产生分区倾斜,即分区增长不均匀,有些分区可能随着时间的推移而不受限制地增长。在 `server_logs` 示例中,在一台服务器生成的日志远多于其他服务器的情况下使用服务器列会产生分区倾斜。为了避免这种情况,可以从表中引入另一个属性来强制均匀分布,即使要创建一个虚拟列来这样做,也是值得的。 + * 使用时间元素和其他属性的组合分区键,这对时间序列数据分区很有帮助。这种方式可以防止无界分区,使访问模式能够在查询特定数据时使用时间属性,而且能够对特定时间段内的数据进行删除。上面的每个示例都使用了 `log_hour` 时间属性来演示这一点。 + +还有一些工具可用于帮助测试、分析和监控 Cassandra 分区,以检查所选模式是否高效。通过仔细设计分区键,使解决方案的数据和需求保持一致,并遵循最佳实践原则来优化分区大小,你就可以充分利用数据分区,更好地发挥 Cassandra 的可扩展性和性能潜力。 + +-------------------------------------------------------------------------------- + +via: https://opensource.com/article/20/5/apache-cassandra + +作者:[Anil Inamdar][a] +选题:[lujun9972][b] +译者:[unigeorge](https://github.com/unigeorge) +校对:[wxy](https://github.com/wxy) + +本文由 [LCTT](https://github.com/LCTT/TranslateProject) 原创编译,[Linux中国](https://linux.cn/) 荣誉推出 + +[a]: https://opensource.com/users/anil-inamdar +[b]: https://github.com/lujun9972 +[1]: https://opensource.com/sites/default/files/styles/image-full-size/public/lead-images/data_metrics_analytics_desktop_laptop.png?itok=9QXd7AUr (Person standing in front of a giant computer screen with numbers, data) +[2]: https://opensource.com/sites/default/files/uploads/apache_cassandra_1_0.png (Cassandra data partition) +[3]: https://opensource.com/sites/default/files/uploads/apache_cassandra_2_0.png (Cassandra cluster with 3 nodes and token-based ownership) +[4]: https://www.instaclustr.com/cassandra-vnodes-how-many-should-i-use/ +[5]: https://www.instaclustr.com/resource/6-step-guide-to-apache-cassandra-data-modelling-white-paper/ diff --git a/published/202110/20201029 Managing resources with cgroups in systemd.md b/published/202110/20201029 Managing resources with cgroups in systemd.md new file mode 100644 index 0000000000..b897c6cd6a --- /dev/null +++ b/published/202110/20201029 Managing resources with cgroups in systemd.md @@ -0,0 +1,363 @@ +[#]: collector: (lujun9972) +[#]: translator: (YungeG) +[#]: reviewer: (wxy) +[#]: publisher: (wxy) +[#]: url: (https://linux.cn/article-13881-1.html) +[#]: subject: (Managing resources with cgroups in systemd) +[#]: via: (https://opensource.com/article/20/10/cgroups) +[#]: author: (David Both https://opensource.com/users/dboth) + +在 systemd 中使用控制组管理资源 +====== + +> 控制组可以按照应用管理资源,而不是按照组成应用的单个进程。 + +![](https://img.linux.net.cn/data/attachment/album/202110/14/114622by5jdu87u4vng272.jpg) + +作为一个系统管理员,没有事情比意外地耗尽计算资源让我更觉得沮丧。我曾不止一次填满了一个分区的所有可用磁盘空间、耗尽内存、以及没有足够的 CPU 时间在合理的时间内处理我的任务。资源管理是系统管理员最重要的工作之一。 + +资源管理的关键是保证所有的进程能够相对公平的访问需要的系统资源。资源管理还包括确保在需要时添加内存、硬盘驱动器空间、还有 CPU 处理能力;或者在无法添加时限制资源的使用。此外,应该阻止独占系统资源的用户,无论其是否有意。 + +系统管理员可以通过一些工具监控和管理不同的系统资源。例如,[top][2] 和类似的工具允许你监控内存、I/O、存储(磁盘、SSD 等)、网络、交换空间、CPU 的用量等。这些工具,尤其是那些以 CPU 为中心的工具,大部分基于以运行的进程为基本单位进行控制的模型。它们最多只是提供了一种方式来调整 `nice` 数字,从而修改优先级,或者杀死一个运行的进程。(要了解 `nice` 数字的信息,查看 [使用 Glances 监控 Linux 和 Windows 主机][3])。 + +SystemV 环境中基于传统的资源管理的其他工具,由 `/etc/security/limits.conf` 文件和 `/etc/security/limits.d` 中的本地配置文件控制。资源可以按照用户或组以一种相对粗糙但实用的方式限制。可以管理的资源包括内存的各个方面、每日的总 CPU 时间、数据总量、优先级、`nice` 数字、并发登录的数量、进程数、文件大小的最大值等。 + +### 使用控制组管理进程 + +[systemd 和 SystemV][4] 之间的一个主要差异是管理进程的方式。SystemV 将每个进程视作一个独立的实体。systemd 将相关的进程集中到一个控制组,简写做 [cgroup][5],并将控制组作为一个整体管理系统资源。这意味着资源能够基于应用管理,而不是由组成应用的各个进程来管理。 + +控制组的控制单元称作切片单元slice unit。切片是允许 systemd 以树状格式控制程序次序,从而简化管理的概念化。 + +### 查看控制组 + +我将从一些允许你查看不同类型控制组信息的命令开始。 `systemctl status ` 命令显示一个特定服务的切片信息,包括服务的切片。这个例子展示了 `at` 守护进程: + +``` +[root@testvm1 ~]# systemctl status atd.service +● atd.service - Deferred execution scheduler + Loaded: loaded (/usr/lib/systemd/system/atd.service; enabled; vendor preset: enabled) + Active: active (running) since Wed 2020-09-23 12:18:24 EDT; 1 day 3h ago + Docs: man:atd(8) + Main PID: 1010 (atd) + Tasks: 1 (limit: 14760) + Memory: 440.0K + CPU: 5ms + CGroup: /system.slice/atd.service + └─1010 /usr/sbin/atd -f + +Sep 23 12:18:24 testvm1.both.org systemd[1]: Started Deferred execution scheduler. +[root@testvm1 ~]# +``` + +这是一个我感到 systemd 比 SystemV 和旧的初始化程序更好用的原因的绝佳示例。这里的信息远比 SystemV 能够提供的丰富。`CGroup` 项包括的层级结构中,`system.slice` 是 systemd(PID 1),`atd.service` 在下一层,是 `system.slice` 的一部分。`CGroup` 项的第二行还显示了进程 ID(PID)和启动守护进程使用的命令。 + +`systemctl` 命令可以列出多个控制组项,`--all` 参数列出所有的切片,包括当前没有激活的切片: + +``` +[root@testvm1 ~]# systemctl -t slice --all + UNIT LOAD ACTIVE SUB DESCRIPTION + -.slice loaded active active Root Slice + system-getty.slice loaded active active system-getty.slice + system-lvm2\x2dpvscan.slice loaded active active system-lvm2\x2dpvscan.slice + system-modprobe.slice loaded active active system-modprobe.slice + system-sshd\x2dkeygen.slice loaded active active system-sshd\x2dkeygen.slice + system-systemd\x2dcoredump.slice loaded inactive dead system-systemd\x2dcoredump.slice + system-systemd\x2dfsck.slice loaded active active system-systemd\x2dfsck.slice + system.slice loaded active active System Slice + user-0.slice loaded active active User Slice of UID 0 + user-1000.slice loaded active active User Slice of UID 1000 + user.slice loaded active active User and Session Slice + +LOAD = Reflects whether the unit definition was properly loaded. +ACTIVE = The high-level unit activation state, i.e. generalization of SUB. +SUB = The low-level unit activation state, values depend on unit type. + +11 loaded units listed. +To show all installed unit files use 'systemctl list-unit-files'. +[root@testvm1 ~]# +``` + +关于这个数据,第一个需要注意的是数据显示了 UID 0(root)和 UID 1000 的用户切片,UID 1000 是我登录的用户。这里列出了组成每个切片的切片部分,而不是服务。还说明了每个用户登录时都会为其创建一个切片,这为将一个用户的所有任务作为单个控制组项进行管理提供了一种方式。 + +### 探索控制组的层次结构 + +目前为止一切顺利,但是控制组是分层的,所有的服务单元作为其中一个控制组的成员运行。要查看这个层次结构很简单,使用一个旧命令和 systemd 的一个新命令即可。 + +`ps` 命令可以用于映射进程的和其所处的控制组层次。注意使用 `ps` 命令时需要指明想要的数据列。我大幅削减了下面命令的输出数量,但是试图保留足够的数据,以便你能够对自己系统上的输出有所感受: + +``` +[root@testvm1 ~]# ps xawf -eo pid,user,cgroup,args + PID USER CGROUP COMMAND + 2 root - [kthreadd] + 3 root - \_ [rcu_gp] + 4 root - \_ [rcu_par_gp] + 6 root - \_ [kworker/0:0H-kblockd] + 9 root - \_ [mm_percpu_wq] + 10 root - \_ [ksoftirqd/0] + 11 root - \_ [rcu_sched] + 12 root - \_ [migration/0] + 13 root - \_ [cpuhp/0] + 14 root - \_ [cpuhp/1] +<删节> + 625406 root - \_ [kworker/3:0-ata_sff] + 625409 root - \_ [kworker/u8:0-events_unbound] + 1 root 0::/init.scope /usr/lib/systemd/systemd --switched-root --system --deserialize 30 + 588 root 0::/system.slice/systemd-jo /usr/lib/systemd/systemd-journald + 599 root 0::/system.slice/systemd-ud /usr/lib/systemd/systemd-udevd + 741 root 0::/system.slice/auditd.ser /sbin/auditd + 743 root 0::/system.slice/auditd.ser \_ /usr/sbin/sedispatch + 764 root 0::/system.slice/ModemManag /usr/sbin/ModemManager + 765 root 0::/system.slice/NetworkMan /usr/sbin/NetworkManager --no-daemon + 767 root 0::/system.slice/irqbalance /usr/sbin/irqbalance --foreground + 779 root 0::/system.slice/mcelog.ser /usr/sbin/mcelog --ignorenodev --daemon --foreground + 781 root 0::/system.slice/rngd.servi /sbin/rngd -f + 782 root 0::/system.slice/rsyslog.se /usr/sbin/rsyslogd -n +<删节> + 893 root 0::/system.slice/sshd.servi sshd: /usr/sbin/sshd -D [listener] 0 of 10-100 startups + 1130 root 0::/user.slice/user-0.slice \_ sshd: root [priv] + 1147 root 0::/user.slice/user-0.slice | \_ sshd: root@pts/0 + 1148 root 0::/user.slice/user-0.slice | \_ -bash + 1321 root 0::/user.slice/user-0.slice | \_ screen + 1322 root 0::/user.slice/user-0.slice | \_ SCREEN + 1323 root 0::/user.slice/user-0.slice | \_ /bin/bash + 498801 root 0::/user.slice/user-0.slice | | \_ man systemd.resource-control + 498813 root 0::/user.slice/user-0.slice | | \_ less + 1351 root 0::/user.slice/user-0.slice | \_ /bin/bash + 123293 root 0::/user.slice/user-0.slice | | \_ man systemd.slice + 123305 root 0::/user.slice/user-0.slice | | \_ less + 1380 root 0::/user.slice/user-0.slice | \_ /bin/bash + 625412 root 0::/user.slice/user-0.slice | | \_ ps xawf -eo pid,user,cgroup,args + 625413 root 0::/user.slice/user-0.slice | | \_ less + 246795 root 0::/user.slice/user-0.slice | \_ /bin/bash + 625338 root 0::/user.slice/user-0.slice | \_ /usr/bin/mc -P /var/tmp/mc-root/mc.pwd.246795 + 625340 root 0::/user.slice/user-0.slice | \_ bash -rcfile .bashrc + 1218 root 0::/user.slice/user-1000.sl \_ sshd: dboth [priv] + 1233 dboth 0::/user.slice/user-1000.sl \_ sshd: dboth@pts/1 + 1235 dboth 0::/user.slice/user-1000.sl \_ -bash +<删节> + 1010 root 0::/system.slice/atd.servic /usr/sbin/atd -f + 1011 root 0::/system.slice/crond.serv /usr/sbin/crond -n + 1098 root 0::/system.slice/lxdm.servi /usr/sbin/lxdm-binary + 1106 root 0::/system.slice/lxdm.servi \_ /usr/libexec/Xorg -background none :0 vt01 -nolisten tcp -novtswitch -auth /var/run/lxdm/lxdm-:0.auth + 370621 root 0::/user.slice/user-1000.sl \_ /usr/libexec/lxdm-session + 370631 dboth 0::/user.slice/user-1000.sl \_ xfce4-session + 370841 dboth 0::/user.slice/user-1000.sl \_ /usr/bin/ssh-agent /bin/sh -c exec -l bash -c "/usr/bin/startxfce4" + 370911 dboth 0::/user.slice/user-1000.sl \_ xfwm4 --display :0.0 --sm-client-id 2dead44ab-0b4d-4101-bca4-e6771f4a8ac2 + 370930 dboth 0::/user.slice/user-1000.sl \_ xfce4-panel --display :0.0 --sm-client-id 2ce38b8ef-86fd-4189-ace5-deec1d0e0952 + 370942 dboth 0::/user.slice/user-1000.sl | \_ /usr/lib64/xfce4/panel/wrapper-2.0 /usr/lib64/xfce4/panel/plugins/libsystray.so 6 23068680 systr +ay Notification Area Area where notification icons appear + 370943 dboth 0::/user.slice/user-1000.sl | \_ /usr/lib64/xfce4/panel/wrapper-2.0 /usr/lib64/xfce4/panel/plugins/libpulseaudio-plugin.so 8 2306 +8681 pulseaudio PulseAudio Plugin Adjust the audio volume of the PulseAudio sound system + 370944 dboth 0::/user.slice/user-1000.sl | \_ /usr/lib64/xfce4/panel/wrapper-2.0 /usr/lib64/xfce4/panel/plugins/libxfce4powermanager.so 9 2306 +8682 power-manager-plugin Power Manager Plugin Display the battery levels of your devices and control the brightness of your display + 370945 dboth 0::/user.slice/user-1000.sl | \_ /usr/lib64/xfce4/panel/wrapper-2.0 /usr/lib64/xfce4/panel/plugins/libnotification-plugin.so 10 2 +3068683 notification-plugin Notification Plugin Notification plugin for the Xfce panel + 370948 dboth 0::/user.slice/user-1000.sl | \_ /usr/lib64/xfce4/panel/wrapper-2.0 /usr/lib64/xfce4/panel/plugins/libactions.so 14 23068684 acti +ons Action Buttons Log out, lock or other system actions + 370934 dboth 0::/user.slice/user-1000.sl \_ Thunar --sm-client-id 2cfc809d8-4e1d-497a-a5c5-6e4fa509c3fb --daemon + 370939 dboth 0::/user.slice/user-1000.sl \_ xfdesktop --display :0.0 --sm-client-id 299be0608-4dca-4055-b4d6-55ec6e73a324 + 370962 dboth 0::/user.slice/user-1000.sl \_ nm-applet +<删节> +``` + +你可以使用 `systemd-cgls` 命令查看整个层次结构,这个命令不需要任何的复杂参数,更加简单。 + +我也大幅缩短了这个树状结构,但是保留了足够多的输出,以便你能够了解在自己的系统上执行这个命令时应该看到的数据总量和条目类型。我在我的一个虚拟机上执行了这个命令,输出大概有 200 行;我的主要工作站的输出大概有 250 行。 + +``` +[root@testvm1 ~]# systemd-cgls +Control group /: +-.slice +├─user.slice +│ ├─user-0.slice +│ │ ├─session-1.scope +│ │ │ ├─ 1130 sshd: root [priv] +│ │ │ ├─ 1147 sshd: root@pts/0 +│ │ │ ├─ 1148 -bash +│ │ │ ├─ 1321 screen +│ │ │ ├─ 1322 SCREEN +│ │ │ ├─ 1323 /bin/bash +│ │ │ ├─ 1351 /bin/bash +│ │ │ ├─ 1380 /bin/bash +│ │ │ ├─123293 man systemd.slice +│ │ │ ├─123305 less +│ │ │ ├─246795 /bin/bash +│ │ │ ├─371371 man systemd-cgls +│ │ │ ├─371383 less +│ │ │ ├─371469 systemd-cgls +│ │ │ └─371470 less +│ │ └─user@0.service … +│ │ ├─dbus-broker.service +│ │ │ ├─1170 /usr/bin/dbus-broker-launch --scope user +│ │ │ └─1171 dbus-broker --log 4 --controller 12 --machine-id 3bccd1140fca488187f8a1439c832f07 --max-bytes 100000000000000 --max-fds 25000000000000 --max-> +│ │ ├─gvfs-daemon.service +│ │ │ └─1173 /usr/libexec/gvfsd +│ │ └─init.scope +│ │ ├─1137 /usr/lib/systemd/systemd --user +│ │ └─1138 (sd-pam) +│ └─user-1000.slice +│ ├─user@1000.service … +│ │ ├─dbus\x2d:1.2\x2dorg.xfce.Xfconf.slice +│ │ │ └─dbus-:1.2-org.xfce.Xfconf@0.service +│ │ │ └─370748 /usr/lib64/xfce4/xfconf/xfconfd +│ │ ├─dbus\x2d:1.2\x2dca.desrt.dconf.slice +│ │ │ └─dbus-:1.2-ca.desrt.dconf@0.service +│ │ │ └─371262 /usr/libexec/dconf-service +│ │ ├─dbus-broker.service +│ │ │ ├─1260 /usr/bin/dbus-broker-launch --scope user +│ │ │ └─1261 dbus-broker --log 4 --controller 11 --machine-id +<删节> +│ │ └─gvfs-mtp-volume-monitor.service +│ │ └─370987 /usr/libexec/gvfs-mtp-volume-monitor +│ ├─session-3.scope +│ │ ├─1218 sshd: dboth [priv] +│ │ ├─1233 sshd: dboth@pts/1 +│ │ └─1235 -bash +│ └─session-7.scope +│ ├─370621 /usr/libexec/lxdm-session +│ ├─370631 xfce4-session +│ ├─370805 /usr/bin/VBoxClient --clipboard +│ ├─370806 /usr/bin/VBoxClient --clipboard +│ ├─370817 /usr/bin/VBoxClient --seamless +│ ├─370818 /usr/bin/VBoxClient --seamless +│ ├─370824 /usr/bin/VBoxClient --draganddrop +│ ├─370825 /usr/bin/VBoxClient --draganddrop +│ ├─370841 /usr/bin/ssh-agent /bin/sh -c exec -l bash -c "/usr/bin/startxfce4" +│ ├─370910 /bin/gpg-agent --sh --daemon --write-env-file /home/dboth/.cache/gpg-agent-info +│ ├─370911 xfwm4 --display :0.0 --sm-client-id 2dead44ab-0b4d-4101-bca4-e6771f4a8ac2 +│ ├─370923 xfsettingsd --display :0.0 --sm-client-id 261b4a437-3029-461c-9551-68c2c42f4fef +│ ├─370930 xfce4-panel --display :0.0 --sm-client-id 2ce38b8ef-86fd-4189-ace5-deec1d0e0952 +│ ├─370934 Thunar --sm-client-id 2cfc809d8-4e1d-497a-a5c5-6e4fa509c3fb --daemon +│ ├─370939 xfdesktop --display :0.0 --sm-client-id 299be0608-4dca-4055-b4d6-55ec6e73a324 +<删节> +└─system.slice + ├─rngd.service + │ └─1650 /sbin/rngd -f + ├─irqbalance.service + │ └─1631 /usr/sbin/irqbalance --foreground + ├─fprintd.service + │ └─303383 /usr/libexec/fprintd + ├─systemd-udevd.service + │ └─956 /usr/lib/systemd/systemd-udevd +<删节> + ├─systemd-journald.service + │ └─588 /usr/lib/systemd/systemd-journald + ├─atd.service + │ └─1010 /usr/sbin/atd -f + ├─system-dbus\x2d:1.10\x2dorg.freedesktop.problems.slice + │ └─dbus-:1.10-org.freedesktop.problems@0.service + │ └─371197 /usr/sbin/abrt-dbus -t133 + ├─sshd.service + │ └─893 sshd: /usr/sbin/sshd -D [listener] 0 of 10-100 startups + ├─vboxservice.service + │ └─802 /usr/sbin/VBoxService -f + ├─crond.service + │ └─1011 /usr/sbin/crond -n + ├─NetworkManager.service + │ └─765 /usr/sbin/NetworkManager --no-daemon + ├─switcheroo-control.service + │ └─787 /usr/libexec/switcheroo-control + <删节> +``` + +这个树状视图显示了所有的用户和系统切片,以及每个控制组内正在运行的服务和程序。注意叫作 `scope`(范围)的单元,它将相关的程序组成一个管理单元,在上面列出的结果中就是 `user-1000.slice`。`user-1000.slice/session-7.scope` 控制组包含了 GUI 桌面程序层次结构,以 LXDM 显示管理器会话和其所有的子任务开始,包括像 Bash 命令行解释器和 Thunar GUI 文件管理器之类的程序。 + +配置文件中不定义范围单元,而是作为启动相关程序组的结果程序化生成的。范围单元不创建或启动作为控制组的组成部分运行的进程。范围内的所有进程都是平等的,没有内部的层次结构。一个范围的生命周期在第一个进程创建时开始,在最后一个进程销毁时结束。 + +在你的桌面打开多个窗口,比如终端模拟器、LibreOffice、或者任何你想打开的,然后切换到一个可用的虚拟控制台,启动类似 `top` 或 [Midnight Commander][11] 的程序。在主机运行 `systemd-cgls` 命令,留意整体的层次结构和范围单元。 + +`systemd-cgls` 命令提供的控制组层次结构表示(以及组成控制组单元的细节),比我见过的其他任何指令都要完整。和 `ps` 命令提供的输出相比,我喜欢 `systemd-cgls` 命令更简洁的树形表示。 + +### 来自朋友们的一点帮助 + +介绍完这些基础知识后,我曾计划过深入研究控制组的更多细节,以及如何使用,但是我在 Opensource.com 的姐妹网站 [Enable Sysadmin][13] 上发现了一系列四篇优秀文章,由 Red Hat 公司的 [Steve Ovens][12] 所作。与其从头重写 Steve 的文章,我觉得倒不如通过链接到这些文章,利用他的控制组专业知识: + + 1. [一个 Linux 系统管理员对控制组的介绍][14] + 2. [如何用 CPUShares 管理控制组][15] + 3. [用更难的方式,手动管理控制组][16] + 4. [用 systemd 管理控制组][17] + +像我一样享受这些文章并从中汲取知识吧。 + +### 其他资源 + +互联网上充斥着大量关于 systemd 的信息,但大部分都简短生硬、愚钝、甚至令人误解。除了本文提到的资源,下面的网页提供了关于 systemd 启动更详细可靠的信息。自从我开始这一系列的文章来反映我所做的研究以来,这个的列表已经变长了。 + + * Fedora 项目有一个优质实用的 [systemd 指南][18],几乎有你使用 systemd 配置、管理、维护一个 Fedora 计算机需要知道的一切。 + * Fedora 项目还有一个好用的 [速查表][19],交叉引用了古老的 SystemV 命令和对应的 systemd 命令。 + * [systemd.unit(5) 手册页][20] 包含了一个不错的单元文件中各个节的列表,以及这些节的配置选项和简洁的描述。 + * Red Hat 文档包含了一个 [单元文件结构][21] 的有用描述,还有一些其他的重要信息。 + * 要获取 systemd 的详细技术信息和创立的原因,查看 Freedesktop.org 的 [systemd 描 +述][22]。这个使我发现过的最棒页面之一,因为其中包含了许多指向其他重要准确文档的链接。 + * Linux.com 上 “systemd 的更多乐趣” 提供了更高级的 systemd [信息和提示][23]。 + * 查看 [systemd.resource-control(5)][24] 的手册页 + * 查看 [_Linux 内核用户和管理员指南_][25] 中的 [控制组 v2 条目][26]。 + +还有一系列针对系统管理员的深度技术文章,由 systemd 的设计者和主要开发者 Lennart +Poettering 所作。这些文章写于 2010 年 4 月到 2011 年 9 月之间,但在当下仍然像当时一样有 +价值。关于 systemd 及其生态的许多其他优秀的作品都是基于这些文章的。 + + * [Rethinking PID 1][27] + * [systemd for Administrators, Part I][28] + * [systemd for Administrators, Part II][29] + * [systemd for Administrators, Part III][30] + * [systemd for Administrators, Part IV][31] + * [systemd for Administrators, Part V][32] + * [systemd for Administrators, Part VI][33] + * [systemd for Administrators, Part VII][34] + * [systemd for Administrators, Part VIII][35] + * [systemd for Administrators, Part IX][36] + * [systemd for Administrators, Part X][37] + * [systemd for Administrators, Part XI][38] + +-------------------------------------------------------------------------------- + +via: https://opensource.com/article/20/10/cgroups + +作者:[David Both][a] +选题:[lujun9972][b] +译者:[YungeG](https://github.com/YungeG) +校对:[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/lenovo-thinkpad-laptop-concentration-focus-windows-office.png?itok=-8E2ihcF (Woman using laptop concentrating) +[2]: https://en.wikipedia.org/wiki/Top_(software) +[3]: https://opensource.com/article/19/11/monitoring-linux-glances +[4]: https://opensource.com/article/20/4/systemd +[5]: https://en.wikipedia.org/wiki/Cgroups +[6]: mailto:user@0.service +[7]: mailto:user@1000.service +[8]: mailto:1.2-org.xfce.Xfconf@0.service +[9]: mailto:1.2-ca.desrt.dconf@0.service +[10]: mailto:1.10-org.freedesktop.problems@0.service +[11]: https://midnight-commander.org/ +[12]: https://www.redhat.com/sysadmin/users/steve-ovens +[13]: https://www.redhat.com/sysadmin/ +[14]: https://www.redhat.com/sysadmin/cgroups-part-one +[15]: https://www.redhat.com/sysadmin/cgroups-part-two +[16]: https://www.redhat.com/sysadmin/cgroups-part-three +[17]: https://www.redhat.com/sysadmin/cgroups-part-four +[18]: https://docs.fedoraproject.org/en-US/quick-docs/understanding-and-administering-systemd/index.html +[19]: https://fedoraproject.org/wiki/SysVinit_to_Systemd_Cheatsheet +[20]: https://man7.org/linux/man-pages/man5/systemd.unit.5.html +[21]: 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 +[22]: https://www.freedesktop.org/wiki/Software/systemd/ +[23]: https://www.linux.com/training-tutorials/more-systemd-fun-blame-game-and-stopping-services-prejudice/ +[24]: https://man7.org/linux/man-pages/man5/systemd.resource-control.5.html +[25]: https://www.kernel.org/doc/html/latest/admin-guide/index.html +[26]: https://www.kernel.org/doc/html/latest/admin-guide/cgroup-v2.html +[27]: http://0pointer.de/blog/projects/systemd.html +[28]: http://0pointer.de/blog/projects/systemd-for-admins-1.html +[29]: http://0pointer.de/blog/projects/systemd-for-admins-2.html +[30]: http://0pointer.de/blog/projects/systemd-for-admins-3.html +[31]: http://0pointer.de/blog/projects/systemd-for-admins-4.html +[32]: http://0pointer.de/blog/projects/three-levels-of-off.html +[33]: http://0pointer.de/blog/projects/changing-roots +[34]: http://0pointer.de/blog/projects/blame-game.html +[35]: http://0pointer.de/blog/projects/the-new-configuration-files.html +[36]: http://0pointer.de/blog/projects/on-etc-sysinit.html +[37]: http://0pointer.de/blog/projects/instances.html +[38]: http://0pointer.de/blog/projects/inetd.html diff --git a/published/202110/20210104 Learn Fortran by writing a -guess the number- game.md b/published/202110/20210104 Learn Fortran by writing a -guess the number- game.md new file mode 100644 index 0000000000..a39854453d --- /dev/null +++ b/published/202110/20210104 Learn Fortran by writing a -guess the number- game.md @@ -0,0 +1,130 @@ +[#]: collector: (lujun9972) +[#]: translator: (unigeorge) +[#]: reviewer: (wxy) +[#]: publisher: (wxy) +[#]: url: (https://linux.cn/article-13849-1.html) +[#]: subject: (Learn Fortran by writing a "guess the number" game) +[#]: via: (https://opensource.com/article/21/1/fortran) +[#]: author: (Jim Hall https://opensource.com/users/jim-hall) + +通过写“猜数字”游戏学习 Fortran +====== + +> Fortran 是在打孔卡时代编写的语言,因此它的语法非常有限。但你仍然可以用它编写有用和有趣的程序。 + +![](https://img.linux.net.cn/data/attachment/album/202110/04/125311k6uwzpybabayyoag.jpg) + +Fortran 77 是我学习的第一门编译型编程语言。一开始时,我自学了如何在 Apple II 上用 BASIC 编写程序,后来又学会在 DOS 上用 QBasic 编写程序。但是当我去大学攻读物理学时,我又学习了 [Fortran][2]。 + +Fortran 曾经在科学计算中很常见。曾几何时,所有计算机系统都有一个 Fortran 编译器。Fortran 曾经像今天的 Python 一样无处不在。因此,如果你是像我这样的物理学专业学生,在 1990 年代工作,那你肯定学习了 Fortran。 + +我一直认为 Fortran 与 BASIC 有点相似,所以每当我需要编写一个简短程序,来分析实验室数据或执行其他一些数值分析时,我都会很快想到 Fortran。我在空闲时用 Fortran 编写了一个“猜数字”游戏,其中计算机会在 1 到 100 之间选择一个数字,并让我猜这个数字。程序会一直循环,直到我猜对了为止。 + +“猜数字”程序练习了编程语言中的几个概念:如何为变量赋值、如何编写语句以及如何执行条件判断和循环。这是学习新编程语言时一个很好的的实践案例。 + +### Fortran 编程基础 + +虽然 Fortran 这些年来一直在更新,但我最熟悉的还是 Fortran 77,这是我多年前学习的实现版本。Fortran 是程序员还在打孔卡上编程的年代创建的,因此“经典” Fortran 仅限于处理可以放在打孔卡上的数据。这意味着你只能编写符合以下限制条件的经典 Fortran 程序(LCTT 译注:后来的 Fortran 95 等版本已经对这些限制做了很大的改进,如有兴趣**建议直接学习新版**): + + * 每张卡只允许一行源代码。 + * 仅识别第 1-72 列(最后八列,73-80,保留给卡片分类器)。 + * 行号(“标签”)位于第 1-5 列。 + * 程序语句在第 7-72 列。 + * 要表示跨行,请在第 6 列中输入一个连续字符(通常是 `+`)。 + * 要创建注释行,请在第 1 列中输入 `C` 或 `*`。 + * 只有字符 `A` 到`Z`(大写字母)、`0` 到`9`(数字)和特殊字符 `= + - * / ( ) , . $ ' :` 和空格能够使用。 + +虽然有这些限制,你仍然可以编写非常有用和有趣的程序。 + +### 在 Fortran 中猜数字 + +通过编写“猜数字”游戏来探索 Fortran。这是我的实现代码: + +``` +CCCCCCCCCCCCCCCCCCCCCCCCCCCCCCCCCCCCCCCCCCCCCCCCCCCCCCCCCCCCCCCCCCCCCCCC +C     PROGRAM TO GUESS A NUMBER 1-100 +CCCCCCCCCCCCCCCCCCCCCCCCCCCCCCCCCCCCCCCCCCCCCCCCCCCCCCCCCCCCCCCCCCCCCCCC +      PROGRAM GUESSNUM +      INTEGER SEED, NUMBER, GUESS + +      PRINT *, 'ENTER A RANDOM NUMBER SEED' +      READ *, SEED +      CALL SRAND(SEED) + +      NUMBER = INT( RAND(0) * 100 + 1 ) + +      PRINT *, 'GUESS A NUMBER BETWEEN 1 AND 100' + 10   READ *, GUESS + +      IF (GUESS.LT.NUMBER) THEN +         PRINT *, 'TOO LOW' +      ELSE IF (GUESS.GT.NUMBER) THEN +         PRINT *, 'TOO HIGH' +      ENDIF + +      IF (GUESS.NE.NUMBER) GOTO 10 + +      PRINT *, 'THATS RIGHT!' +      END +``` + +如果你熟悉其他编程语言,你大概可以通过阅读源代码来弄清楚这个程序在做什么。前三行是注释块,表示程序的功能。第四行 `PROGRAM GUESSNUM` 将其标识为一个 程序program,并由最后一行的 `END` 语句关闭。 + +定义变量后,程序会提示用户输入随机数种子。Fortran 程序无法从操作系统初始化随机数生成器,因此你必须始终使用“种子”值和 `SRAND` 子程序subroutine 启动随机数生成器。 + +Fortran 使用 `RAND(0)` 函数生成 0 到 0.999…… 之间的随机数。参数 `0` 告诉 `RAND` 函数生成一个随机数。将此随机数乘以 100 以生成 0 到 99.999…… 之间的数字,然后加 1 得到 1 到 100.999…… 之间的值。`INT` 函数将结果截断为整数;因此,变量 `NUMBER` 就是一个介于 1 到 100 之间的随机数。 + +程序会给出提示,然后进入一个循环。Fortran 不支持更现代的编程语言中可用的 `while` 或 `do-while` 循环(LCTT 译注:Fortran 95 等新版支持,也因此在一定程度上减少了 `GOTO` 的使用)。相反,你必须使用标签(行号)和 `GOTO` 语句来构建自己的循环。这就是 `READ` 语句有一个行号的原因:你可以在循环末尾使用 `GOTO` 跳转到此标签。 + +穿孔卡片没有 `<`(小于)和 `>`(大于)符号,因此 Fortran 采用了另一种语法来进行值比较。要测试一个值是否小于另一个值,请使用 `.LT.`(小于)。要测试一个值是否大于另一个值,请使用 `.GT.`(大于)。等于和不等于分别是 `.EQ.` 和 `.NE.`。 + +在每次循环中,程序都会验证用户的猜测值。如果用户的猜测值小于随机数,程序打印 `TOO LOW`,如果猜测大于随机数,程序打印 `TOO HIGH`。循环会一直持续,直到用户的猜测值等于目标随机数为止。 + +当循环退出时,程序打印 `THATS RIGHT!` 并立即结束运行。 + +``` +$ gfortran -Wall -o guess guess.f + +$ ./guess + ENTER A RANDOM NUMBER SEED +93759 + GUESS A NUMBER BETWEEN 1 AND 100 +50 + TOO LOW +80 + TOO HIGH +60 + TOO LOW +70 + TOO LOW +75 + TOO HIGH +73 + TOO LOW +74 + THATS RIGHT! +``` + +每次运行程序时,用户都需要输入不同的随机数种子。如果你总是输入相同的种子,程序给出的随机数也会一直不变。 + +### 在其他语言中尝试 + +在学习一门新的编程语言时,这个“猜数字”游戏是一个很好的入门程序,因为它以非常简单的方式练习了几个常见的编程概念。通过用不同的编程语言实现这个简单的游戏,你可以弄清一些核心概念以及比较每种语言的细节。 + +你有最喜欢的编程语言吗?如何用你最喜欢的语言来编写“猜数字”游戏?跟随本系列文章来查看你可能感兴趣的其他编程语言示例吧。 + +-------------------------------------------------------------------------------- + +via: https://opensource.com/article/21/1/fortran + +作者:[Jim Hall][a] +选题:[lujun9972][b] +译者:[unigeorge](https://github.com/unigeorge) +校对:[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/1980s-computer-yearbook.png?itok=eGOYEKK- (Person typing on a 1980's computer) +[2]: https://en.wikipedia.org/wiki/Fortran diff --git a/published/202110/20210607 Comparing Linux Mint and Fedora- Which One Should You Use.md b/published/202110/20210607 Comparing Linux Mint and Fedora- Which One Should You Use.md new file mode 100644 index 0000000000..a53b8aef60 --- /dev/null +++ b/published/202110/20210607 Comparing Linux Mint and Fedora- Which One Should You Use.md @@ -0,0 +1,186 @@ +[#]: subject: (Comparing Linux Mint and Fedora: Which One Should You Use?) +[#]: via: (https://itsfoss.com/linux-mint-vs-fedora/) +[#]: author: (Ankush Das https://itsfoss.com/author/ankush/) +[#]: collector: (lujun9972) +[#]: translator: (wxy) +[#]: reviewer: ( ) +[#]: publisher: ( ) +[#]: url: ( ) + +Linux Mint 和 Fedora:应该使用哪一个? +====== + +![](https://img.linux.net.cn/data/attachment/album/202110/04/123523kzzm3x4yr2ppmfj9.jpg) + +Linux Mint 是一个 [为初学者定制的流行的 Linux 发行版][1],同时为用户提供了与 Windows 类似的体验。事实上,它有 [一些地方比 Ubuntu 做的更好][2],这使它成为每一类用户的合适选择。 + +它是基于 Ubuntu 的,完全由社区所支持。 + +另一方面,Fedora 是一个尝鲜发行版,它专注于纳入令人兴奋的变化,最终使其成为红帽企业 Linux(RHEL)的一部分。 + +与 Linux Mint 不同,Fedora 并不完全专注于个人(或非开发者)使用。即使他们提供了一个工作站版本,其目标也是开发者和有经验的 Linux 用户。 + +### Fedora 或 Mint,应该根据什么选择? + +虽然我们知道 Fedora 并不是完全面向 Linux 新手的,但许多用户喜欢使用 Fedora 作为他们的日常系统。因此,在这篇文章中,我们将阐明两者之间的一些区别,以帮助你选择一个在你的台式机上使用的操作系统。 + +#### 系统要求 & 硬件兼容性 + +![][3] + +在选择任何 Linux 发行版之前,你都应该看一下它的系统要求,并检查硬件兼容性。 + +在这方面,Linux Mint 和 Fedora 都需要至少 2GB 的内存、20GB 的磁盘空间,以及 1024 x 768 分辨率的显示器来获得入门级的体验。 + +是的,官方文件可能提到 1GB 内存就可以起步,但要看实际使用情况。除非你有一台复古的电脑,想为一个特定的目的恢复它,否则它就不在考虑范围之内。 + +![Linux Mint 资源使用情况][4] + +在技术上,两者都支持现代的和陈旧的硬件,你只有在安装时才会知道软件/驱动是否支持它。除非你有一个特殊的外围设备或具有特殊功能的硬件组件,否则硬件支持可能不是什么大问题。 + +Linux Mint 19 系列仍然提供了对 32 位系统的支持,你可以使用它到 2023 年 4 月。而 Fedora 已经不支持 32 位系统了。 + +#### 软件更新周期 + +![Linux Mint 更新管理器][5] + +Linux Mint 专注于长期发布版(LTS),支持时间为五年。它的维护方式与 Ubuntu 相同。但没有像 Ubuntu 那样提供付费的扩展支持。 + +Fedora 不提供 LTS 版本,而是每 6 个月推送一次新的更新,每个版本都会得到 13 个月的软件支持。如果你愿意,你可以跳过一个版本。 + +如果你只是想安装一个可以使用多年的 Linux 发行版,而不在乎是不是最新的技术/功能,那么 Linux Mint 是个不错的选择。 + +但是,如果你想要最新的和最伟大的 Linux 技术(在一些罕见的情况下,这也可能破坏你的计算体验),并接受适应 Fedora 推动的重大变化,Fedora 可以是一个选择。 + +#### 桌面环境的选择 + +![Linux Mint Cinnamon 版][6] + +Linux Mint 提供三种不同的 [桌面环境][7]:MATE、Cinnamon 和 Xfce。它们有相同的更新周期,并从发布之日起支持 5 年。 + +尽管 Fedora 不提供 LTS 版本,但你可以通过 Fedora spins 的形式选择各种桌面。你可以得到 KDE、LXQt、MATE、Cinnamon、LXDE,以及一个内置 i3 平铺窗口管理器的版本。 + +![Fedora 34 with GNOME 40][8] + +所以,如果你想有更多的选择,Fedora 可以是一个相当令人激动的选择。 + +#### 软件可用性 + +![Linux Mint 的软件中心和软件包管理器][9] + +Linux Mint(或 Ubuntu)的默认软件库提供了大量可以安装的软件,而 Fedora 的默认软件库只坚持提供开源软件。 + +不仅仅限于此,Linux Mint 还配备了 [Synaptic 软件包管理器][10],这是一个令人印象深刻的安装软件的轻量级工具。 + +尽管你可以 [在 Fedora 中启用第三方软件库][11],但这又是一个额外的步骤。而且,RPM Fusion 存储库可能没有 Ubuntu 的 universe 存储库那么庞大。 + +![Fedora 34 软件中心][12] + +所以,对于 Linux Mint 来说,总的来说,你可以得到更多可安装的软件包和各种安装软件的方法,开箱即用。 + +#### 使用和安装的便利性 + +对于一个 Linux 的新嫩用户来说,Ubuntu 或任何基于 Ubuntu 的发行版通常都是一个很好的开端。 + +从 [Ubuntu 的安装体验][13],到 [安装软件][14] 的简便性,同时还可以选择 LTS 版本,这让初学者觉得很方便。 + +而且,借助 Ubiquity 安装程序,Linux Mint 自然也有与 Ubuntu 相同的好处,因此,它的学习曲线最小,易于安装,易于使用。 + +虽然从表面上看 Fedora 并不复杂,但安装选项、软件包管理器以及默认存储库中缺乏的软件可能是一个耗时的因素。 + +如果你没有尝试过,我建议你试试我们的 [VirtualBox 版的 Fedora 安装指南][15]。这是一个测试安装体验的好方法,然后再在你的任何生产系统上进行尝试。 + +#### 开箱即用的体验 + +最省事的体验通常是令人愉快的选择。嗯,对大多数人来说。 + +现在,你需要明白,根据硬件配置的不同,每个用户最终可能会有不同的“开箱即用”体验。 + +但是,作为参考,让我给你举个 Fedora 和 Linux Mint 的例子。 + +考虑到我的电脑上使用的是 NVIDIA GPU,我需要安装专有的驱动程序以获得最佳性能。 + +![][16] + +而且,当我启动 Linux Mint 时,使用“驱动程序管理器”应用程序,安装驱动程序相当容易。 + +但是,对于 Fedora,即使我按照我们的 [在 Fedora 中安装 Nvidia 驱动程序][17] 的指南,我在重启时还是出现了一个错误。 + +![在 Fedora 中安装 NVIDIA 驱动程序][18] + +不仅如此,由于某些原因,我的有线网络似乎没有被激活,因此,我没有互联网连接。 + +是的,当你遇到问题时,你总是可以尝试着去排除故障,但是对于 Linux Mint,我不需要这么做。所以,根据我的经验,我会推荐 Linux Mint,它有更好的开箱体验。 + +#### 文档 + +如果你依赖于文档资源并想在这个过程中挑战自己,获得不错的学习经验,我推荐你去看看 [Fedora 的文档][19]。 + +你会发现最近和最新的 Fedora 版本的最新信息,这是件好事。 + +另一方面,[Linux Mint 的文档][20] 没有定期更新,但在你想深入挖掘时很有用。 + +#### 社区支持 + +你会得到一个良好的社区支持。[Linux Mint 的论坛][21] 是一个很基础的平台,容易使用并能解决问题。 + +[Fedora 的论坛][22] 是由 Discourse 驱动的,它是最 [流行的现代开源论坛软件][23] 之一。 + +#### 企业与社区的角度 + +Fedora 得到了最大的开源公司 [红帽][24] 的支持 —— 因此你可以得到良好的持续创新和长期的支持。 + +然而,正因为 Fedora 并不是为日常电脑用户而建立的,每一个版本的选择都可能完全影响你的用户体验。 + +另一方面,Linux Mint 完全由一个充满激情的 Linux 社区所支持,专注于使 Linux 在日常使用中更加容易和可靠。当然,它依赖于 Ubuntu 作为基础,但如果社区不喜欢上游的东西,Linux Mint 也会做出大胆的改变。 + +例如,Linux Mint 与 Ubuntu 官方发行版不同,默认情况下禁用了 snap。所以,如果你想使用它们,你就必须 [在 Linux Mint 中启用 snap][25]。 + +### 总结 + +如果你想为你的家用电脑选择一个没有问题的、易于使用的操作系统,我的建议是 Linux Mint。但是,如果你想体验最新的、最伟大的 Linux 操作系统,同时在你的 Linux 学习经历中进行一次小小的冒险,Fedora 可以是一个不错的选择。 + +虽然每个操作系统都需要某种形式的故障排除,没有什么能保证你的硬件完全不出问题,但我认为 Linux Mint 对大多数用户来说可能没有问题。 + +在任何情况下,你可以重新审视上面提到的比较点,看看什么对你的电脑最重要。 + +你怎么看?你会选择 Fedora 而不是 Mint 吗?还有,为什么?请在下面的评论中告诉我。 + +-------------------------------------------------------------------------------- + +via: https://itsfoss.com/linux-mint-vs-fedora/ + +作者:[Ankush Das][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://itsfoss.com/author/ankush/ +[b]: https://github.com/lujun9972 +[1]: https://itsfoss.com/best-linux-beginners/ +[2]: https://itsfoss.com/linux-mint-vs-ubuntu/ +[3]: https://i2.wp.com/itsfoss.com/wp-content/uploads/2021/05/fedora-34-about.png?resize=1020%2C709&ssl=1 +[4]: https://i0.wp.com/itsfoss.com/wp-content/uploads/2021/05/linux-mint-resources.png?resize=800%2C293&ssl=1 +[5]: https://i0.wp.com/itsfoss.com/wp-content/uploads/2021/05/linux-mint-update-manager.png?resize=819%2C612&ssl=1 +[6]: https://i2.wp.com/itsfoss.com/wp-content/uploads/2021/05/linux-mint-cinnamon-desktop.png?resize=800%2C450&ssl=1 +[7]: https://itsfoss.com/best-linux-desktop-environments/ +[8]: https://i0.wp.com/itsfoss.com/wp-content/uploads/2021/05/fedora-34-desktop.png?resize=800%2C478&ssl=1 +[9]: https://i0.wp.com/itsfoss.com/wp-content/uploads/2021/05/linux-mint-software-sources.png?resize=800%2C385&ssl=1 +[10]: https://itsfoss.com/synaptic-package-manager/ +[11]: https://itsfoss.com/fedora-third-party-repos/ +[12]: https://i1.wp.com/itsfoss.com/wp-content/uploads/2021/05/fedora-34-software.png?resize=1055%2C691&ssl=1 +[13]: https://itsfoss.com/install-ubuntu/ +[14]: https://itsfoss.com/remove-install-software-ubuntu/ +[15]: https://itsfoss.com/install-fedora-in-virtualbox/ +[16]: https://i0.wp.com/itsfoss.com/wp-content/uploads/2021/03/linux-mint-driver-manager.jpg?resize=800%2C548&ssl=1 +[17]: https://itsfoss.com/install-nvidia-drivers-fedora/ +[18]: https://i2.wp.com/itsfoss.com/wp-content/uploads/2021/05/fedora-nvidia-driver-installation.png?resize=706%2C516&ssl=1 +[19]: https://docs.fedoraproject.org/en-US/docs/ +[20]: https://linuxmint.com/documentation.php +[21]: https://forums.linuxmint.com +[22]: https://ask.fedoraproject.org +[23]: https://itsfoss.com/open-source-forum-software/ +[24]: https://www.redhat.com/en +[25]: https://itsfoss.com/enable-snap-support-linux-mint/ diff --git a/published/202110/20210616 Top 5 Chrome-like Browsers That Are Better Than Google Chrome in 2021.md b/published/202110/20210616 Top 5 Chrome-like Browsers That Are Better Than Google Chrome in 2021.md new file mode 100644 index 0000000000..ea7ebdd97e --- /dev/null +++ b/published/202110/20210616 Top 5 Chrome-like Browsers That Are Better Than Google Chrome in 2021.md @@ -0,0 +1,180 @@ +[#]: subject: (Top 5 Chrome-like Browsers That Are Better Than Google Chrome in 2021) +[#]: via: (https://news.itsfoss.com/chrome-like-browsers-2021/) +[#]: author: (Jacob Crume https://news.itsfoss.com/author/jacob/) +[#]: collector: (lujun9972) +[#]: translator: (wxy) +[#]: reviewer: (wxy) +[#]: publisher: (wxy) +[#]: url: (https://linux.cn/article-13858-1.html) + +Linux 上 5 个基于 Chromium 的浏览器 +====== + +> 谷歌浏览器可能不是 Linux 用户的最佳浏览器。在这里,我们探讨了 Linux 平台的其他潜在选择。 + +![](https://i0.wp.com/news.itsfoss.com/wp-content/uploads/2021/06/chrome-alternatives-2021.png?w=1200&ssl=1) + +想摆脱谷歌?想为你的 Linux 系统寻找可能比谷歌浏览器(和类似的)更好的浏览器? + +幸运的是,有多个谷歌浏览器的替代品,你可以试试。 + +它们中的每一个都带来了一些有趣的东西,同时也保持了 Chrome 所特有的奇妙兼容性。请继续阅读,了解这些浏览器的更多信息。 + +### 比谷歌浏览器更好的选择 + +> 注:虽然 [自由和开源软件在取代科技巨头方面扮演着关键角色][1],但除了谷歌浏览器之外,Linux 上的任何选择都是一个好的开始。因此,你也会发现一些非 FOSS 的选择。 + +在我看来,Chrome 的最佳替代品是基于 Chromium 的浏览器,这意味着它们与 Chrome 共享相同的基因。这样做的好处是,它们已经拥有与 Chrome 相同的功能,同时有更多时间来增加自己的功能。 + +另外,如果你愿意,你可以了解一下不基于 Chromium 的 [Chrome 开源替代品][2]。 + +无论如何,即使谷歌浏览器的替代品对你来说并不优越,也值得尝试远离科技巨头。 + +我们收集了一些在各方面与 Chrome 相当或更好的浏览器。闲话少说,以下是我挑选的五款比 Chrome 本身更好的类似 Chrome 的浏览器: + + * UnGoogled Chromium + * Brave + * Edge + * Vivaldi + * Opera + +这份名单没有排名顺序。 + +### 1、UnGoogled Chromium + +![][13] + +特点: + + * 移除针对谷歌域名的功能 + * 在运行时阻止对 Google 的内部请求 + * 从源代码中剥离谷歌的二进制文件 + * 许多新的命令行开关和 `chrome://flags` 条目 + * 强制所有弹出式窗口为标签 + +对于那些隐私爱好者来说,[UnGoogled Chromium][4] 浏览器将是一个天赐良机。虽然它可能看起来与 Chrome 相同,但它有许多隐私方面的调整。 + +顾名思义,对于 Chrome 浏览器的用户来说,最大的倒退将是没有谷歌的服务集成。但这也意味着不再有对谷歌的内部请求、谷歌网址跟踪等等。 + +它没有吹嘘任何非凡的东西来保护你的隐私,但它应该比谷歌浏览器更好。 + +你也可以选择通过 `chrome://flags` 设置来探索和切换隐私设置。 + +总而言之,UnGoogled Chromium 提供了一种熟悉的浏览体验,同时还加入了一套隐私功能。它是可靠的,而且还与 Chrome 扩展程序庞大的生态系统兼容。 + +### 2、Brave + +![][14] + +特点: + + * 内置广告拦截器 + * 更快的页面加载时间 + * Brave 奖励计划 + * 能够在设备之间进行同步 + * 支持 Chrome Web 商店 + +当 [Brave][6] 在 2016 年首次登上舞台时,世界各地的人们都震惊于它的隐私和性能特点。在发布时,这包括了一个内置的广告屏蔽器和一个新的用户界面。 + +从那时起,该浏览器有了更多的功能,包括奖励计划和 [Tor][5] 整合。这使得它成为增长最快的浏览器之一。 + +### 3、Edge + +![][15] + +特点: + + * 支持 Chrome Web 商店 + * 儿童浏览模式(额外的保护和更简单的用户界面) + * 良好的 PDF 编辑工具 + * 内置优惠券搜索器 + * 阅读模式 + * 内置密码生成器 + +当微软 [Edge][7] 在 2015 年首次与 Windows 10 一起发布时,它因缓慢和有缺陷而被广泛批评。然而,在 2020 年初,它使用 Chromium Web 引擎完全重新制作了。 + +这也是 Chrome 浏览器所基于的引擎,这提供了现代和快速的浏览体验。这种转变的一个好处是 Web 浏览器能够在许多不同的平台上运行,从 Windows 7 和 macOS 到 Ubuntu 和其他基于 Linux 的发行版。 + +我知道,如果你因为某些原因讨厌微软,这可能不会吸引你 —— 但 Linux 版的微软 Edge 是谷歌 Chrome 浏览器的一个重要替代品。 + +### 4、Vivaldi + +![][16] + +特点: + + * 内置翻译器 + * Vivaldi Email(Beta) + * Feed 阅读器(Beta) + * Vivaldi 日历(Beta) + * 可高度定制的用户界面 + * 内置广告拦截器 + * 支持 Chrome Web 商店 + * 标签分组 + * 分屏标签 + +[Vivaldi][11] 于 2016 年首次发布,它在浏览器大战中迅速崛起。它最初是为对 [Presto][8] [布局引擎][9] 过渡不满的 Opera 用户设计的,它已经成功地重新实现了 Opera 过渡到 Chromium 期间失去的许多功能。 + +令人惊讶的是,它在基于 Chromium 的情况下还能做到这一点(正是 Opera 放弃这些功能的原因)。 + +最新的 [Vivaldi 4.0 版本][10] 也为高级用户提供了一些功能。 + +虽然它不是 100% 的自由软件,但其 93% 的源代码是可用的,只有用户界面是专有的。考虑到 Vivaldi 的开发团队积极关注着 Linux 用户的改进,Vivaldi 提供了大量的功能,这可能是一个值得权衡的结果。 + +### 5、Opera + +![][17] + +特点: + + * 内置虚拟专用网络 + * 轻松访问社交媒体 + * 内置加密货币钱包 + * 欺诈和恶意软件保护 + * 高度可见的网站安全徽章 + +虽然 [Opera][12] 从未成为 Web 浏览器之王,但它一直存在于关于使用何种浏览器的争论中。它最初是基于其内部的 Presto 布局引擎的,在 2013 年切换到 Chromium。 + +不幸的是,这一转换意味着 Opera 团队被迫放弃了其最知名的一些功能,为 Vivaldi 和 Firefox 等替代品填补 Opera 留下的空间铺平道路。 + +这并不是说 Opera 缺乏功能,它包含了许多功能。 + +### 总结 + +在这里,我们列出了为 Linux 桌面平台上用户量身定做的浏览器。 + +无论你是想要更多的功能、更好的用户界面,还是想要帮助你摆脱谷歌的束缚,都有一个选择适合你。 + +由于所有这些浏览器都是基于 Chromium 的,它们都能像 Chrome 一样提供良好的兼容性和用户体验。因此,请切换到这些类似 Chrome 的浏览器中,享受它们各自赋予的自由吧。 + +2021 年,你最喜欢的 Linux 上谷歌浏览器的替代品是什么?请在下面的评论中告诉我。 + +-------------------------------------------------------------------------------- + +via: https://news.itsfoss.com/chrome-like-browsers-2021/ + +作者:[Jacob Crume][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://news.itsfoss.com/author/jacob/ +[b]: https://github.com/lujun9972 +[1]: https://news.itsfoss.com/save-privacy-with-foss/ +[2]: https://itsfoss.com/open-source-browsers-linux/ +[4]: https://github.com/Eloston/ungoogled-chromium +[5]: https://itsfoss.com/tor-guide/ +[6]: https://brave.com +[7]: https://www.microsoftedgeinsider.com/en-us/download +[8]: https://en.wikipedia.org/wiki/Presto_(browser_engine) +[9]: https://en.wikipedia.org/wiki/Browser_engine +[10]: https://news.itsfoss.com/vivaldi-4-0-release/ +[11]: https://vivaldi.com +[12]: https://www.opera.com +[13]: https://i2.wp.com/news.itsfoss.com/wp-content/uploads/2021/05/ungoogled-chromium-screenshot.png?w=1366&ssl=1 +[14]: https://i1.wp.com/news.itsfoss.com/wp-content/uploads/2021/06/brave-homepage.png?w=1366&ssl=1 +[15]: https://i0.wp.com/news.itsfoss.com/wp-content/uploads/2021/06/edge-homepage.png?w=1366&ssl=1 +[16]: https://i0.wp.com/news.itsfoss.com/wp-content/uploads/2021/06/vivaldi-4.0-homepage.png?w=1366&ssl=1 +[17]: https://i1.wp.com/news.itsfoss.com/wp-content/uploads/2021/06/opera-homepage.png?w=1366&ssl=1 \ No newline at end of file diff --git a/published/202110/20210702 Creating a PKGBUILD to Make Packages for Arch Linux.md b/published/202110/20210702 Creating a PKGBUILD to Make Packages for Arch Linux.md new file mode 100644 index 0000000000..1303a2a5ee --- /dev/null +++ b/published/202110/20210702 Creating a PKGBUILD to Make Packages for Arch Linux.md @@ -0,0 +1,263 @@ +[#]: subject: (Creating a PKGBUILD to Make Packages for Arch Linux) +[#]: via: (https://itsfoss.com/create-pkgbuild/) +[#]: author: (Hunter Wittenborn https://itsfoss.com/author/hunter/) +[#]: collector: (lujun9972) +[#]: translator: (wxy) +[#]: reviewer: (wxy) +[#]: publisher: (wxy) +[#]: url: (https://linux.cn/article-13843-1.html) + +Arch Linux 软件包制作入门 +====== + +![](https://img.linux.net.cn/data/attachment/album/202110/02/130702ybexb5tsvkx1xbs1.jpg) + +`PKGBUILD` 文件是为 Arch Linux 及其衍生版(如 Manjaro)构建和创建软件包的方式。 + +如果你曾经使用过 [AUR][1](即 Arch Linux 的用户维护的 `PKGBUILD` 存储库),你甚至可能也遇到过它们。 + +但是,到底是如何从 `PKGBUILD` 到可安装软件包的呢?这两者之间到底发生了什么,如何把自己的软件制作成软件包呢?你将在这篇文章中了解这些。 + +### PKGBUILD 基础知识 + +对于那些熟悉 Bash 或其他 shell 的人来说,你可能知道,`PKGBUILD` 就是一个带有一些变量的 shell 脚本。 + +`PKGBUILD` 文件由变量和函数组成,所有这些都是用来定义软件包本身,以及如何构建它。 + +为了从 `PKGBUILD` 中创建一个软件包,需要使用 `makepkg` 命令行工具。在获得 `PKGBUILD` 文件后,你只需在包含 `PKGBUILD` 的目录中运行 `makepkg',就可以得到一个可安装的软件包了。 + +![][2] + +在本教程中,你将会看到我刚刚制作的软件包,它在运行时打印出 “Hello World!”。 + +![][3] + +### 准备 + +为了继续学习本教程,你需要创建几个文件。 + +首先,你需要创建一个名为 `PKGBUILD` 的文件,它将作为构建你的软件包的“配方”。 + +你需要做的另一个文件是一个叫 `hello-world.sh` 的文件。我稍后会解释它的用途。 + +你也可以用一个命令来创建这两个文件: + +``` +touch PKGBUILD hello-world.sh +``` + +你可以用 `ls` 命令检查这些文件是否被创建。 + +![][4] + +然后你就可以开始了! + +### 设置你的 PKGBUILD 文件 + +我不会让你复制粘贴整个文件,而是和你一起键入每一行,这样你就能更好地理解每一行的目的。如果你不喜欢这种学习方式,我强烈推荐 [Arch 维基][5] 中为 Arch Linux 创建软件包的文章。 + +这篇文章也没有介绍 `PKGBUILD` 中可以设置的每一个选项,只是介绍了一些常用的选项,以便你能尽快上手。 + +说完了这些,打开你的文本编辑器,让我们直接进入正题吧。 + +#### pkgname + +首先是 `pkgname` 变量。这是安装时定义软件包名称的东西,也是 [Arch Linux 的软件包管理器 pacman][6] 跟踪软件包的方式。 + +这个变量(以及其他一些变量)的格式是 `variable=value`,变量名在左边,变量的值在右边,用等号隔开。 + +要设置包的名称,请在 `PKGBUILD` 中输入以下内容: + +``` +pkgname="hello-world" +``` + + * 要设置一个不同的软件包名称,用你的软件包的名称替换 `hello-world`。 + * 这并不设置用于运行程序的命令,这将在下面的 `package()` 部分中处理。 + +#### pkgver + +正如变量名称本身所述,它设置了你的软件包的版本(即 `1.0.0`)。这在用户更新他们的系统时很有用,因为设置更高的版本会提示用户升级。 + +要设置版本号,请在 `PKGBUILD` 中输入以下内容(在前一行之后): + +``` +pkgver="1.0.0" +``` + +#### pkgrel + +这与 `pkgver` 变量有关,通常不需要知道。不过和 `pkgver` 变量一样,如果它被换到一个更高的数字,就将通知用户进行升级。 + +它适用于任何需要保持 `pkgver` 不变的情况下,例如 `PKGBUILD` 本身发生了变化。如果你为一个你使用的程序创建了一个 `PKGBUILD`(并希望保持软件包的版本相同),而你需要修复 `PKGBUILD` 本身的一个错误,这将是非常有用的。 + +要设置这个变量,请在 `PKGBUILD` 中输入以下内容: + +``` +pkgver="1" +``` + +这个变量应该 **总是** 从 `1` 开始,然后一次一次地向上移动。当 `pkgver` 本身向上移动时,这个变量可以(也应该)重置为 `1`,因为 `pkgver` 本身会通知用户升级。 + +#### pkgdesc + +这将设置软件包的描述,用于帮助更好地识别该软件包。 + +要设置它,只需将描述放在引号内: + +``` +pkgdesc="Hello world in your terminal!" +``` + +#### arch + +这个变量设置软件包所兼容的 [硬件架构][7]。如果你不明白什么是架构,那也没关系,因为在大多数情况下,这个变量几乎是无用的。 + +无论如何,`makepkg` 仍然需要设置它,这样它就知道这个软件包与我们的系统是兼容的。 + +这个变量支持设置多个值,所以 `makepkg` 需要一个不同的语法,如下所示。 + +要设置它,请在 `PKGBUILD` 中输入以下内容: + +``` +arch=("x86_64") +``` + +如果你要设置多个值,需要用空格和引号分隔每个值,像这样。`arch=(“x86_x64" "arm")`。 + +#### depends + +这列出了提供了我们的软件包所需功能的所有软件包。与 `arch` 一样,它也可以包含多个值,因此必须使用括号语法。 + +由于我们的软件包没有任何依赖关系,所以我们不需要在 `PKGBUILD` 中输入这个字段。然而,如果我们的软件包有依赖关系,我们就会使用与 `arch` 相同的语法。 + +#### optdepends + +这里列出了那些并不是提供所需功能而是额外功能的软件包。 + +这与 `depends` 的语法相同。 + +#### conflicts + +这告诉 `pacman` 哪些软件包会导致我们的软件包出现问题,或者以我们不希望的方式行事。 + +这里列出的任何软件包都会在我们的软件包被安装之前被卸载。 + +这与 `depends` 的语法相同。 + +#### license + +这定义了你的程序所采用的 [软件许可证][8]。如果你需要帮助你选择一个许可证,[Arch 维基][9] 提供了一些信息。如果你不知道该怎么设置,将其设置为 `custom` 也可以。 + +这与 `arch` 和 `depends` 的语法相同: + +``` +license=("custom") +``` + +#### source + +这就是 `makepkg` 如何知道要用什么文件来构建我们的软件包。它可以包含各种不同类型的源,包括本地文件和 URL。 + +在添加本地文件时,要输入相对于 `PKGBUILD` 文件的文件路径,比如以下目录布局: + +``` +PKGBUILD +file.txt +src/file.sh +``` + +如果你想在我们的 `PKGBUILD` 中包括 `file.sh`,你需要输入 `src/file.sh` 作为其名称。 + +当输入 URL 时,你只需输入完整的 URL,即 `https://mirrors.creativecommons.org/presskit/logos/cc.logo.large.png`。 + +你的这个软件包只需要 `hello-world.sh` 文件,由于它和 `PKGBUILD` 在同一个目录中,你只需输入它的名字作为 `source` 的值。 + +这个变量也使用与 `arch` 和 `depends` 相同的语法: + +``` +source=("hello-world.sh") +``` + +#### sha512sums + +这是用来验证 `source` 中的文件没有被修改或下载错误。如何获得这个值的信息可以在 [Arch 维基关于 PKGBUILD 的文章][10] 中找到。 + +如果你宁愿不设置这个(或者你只是不需要,例如对于本地文件),你可以为 `source` 变量中的每个文件输入 `SKIP`: + +``` +sha512sums=("SKIP") +``` + +#### package() + +这是最后一个,也是实际制作我们的包的最重要的部分。在处理这个问题时,知道两个变量很重要。 + + * `${srcdir}`:这是 `makepkg` 放置 `source` 变量中文件的地方。在这个目录中,你可以与这些文件进行交互,并对文件进行任何其他需要的修改。 + * `${pkgdir}`:这是我们放置将被安装在系统中的文件的地方。 +`${pkgdir}` 的文件夹结构是按照实际系统中的情况设置的(例如,使用 `pacman` 安装时,`${pkgdir}/usr/bin/hello-world` 会创建文件 `/usr/bin/hello-world`)。 + +`package()` 包含一个用于创建软件包的命令列表。 + +因此,如果(假设)你需要有个在 `/usr/share/motto.txt` 写着 “Linux is superior to Windows ”的文件,你会运行这样的东西: + +``` +package() { + mkdir -p "${pkgdir}/usr/share" + echo "Linux is superior to Windows" | tee "${pkgdir}/usr/share/motto.txt" +} +``` + +关于上述命令的一些说明: + + * `${pkgdir}` 里面最初是 **不包含** 目录的。如果你跳过了 [mkdir 命令][11],`tee` 会输出一个错误,说这个目录不存在。 + * 在指定目录时,**总是** 在它们前面加上 `${pkgdir}` 或 `${srcdir}` 变量。如果输入 `/usr/share/motto.txt`,就会按照字面意义指向你当前运行的系统中的 `/usr/share/motto.txt`。 + +对于你的 `PKGBUILD`,你将把 `hello-world.sh` 文件放在目标系统的 `/usr/bin/hello-world` 中。你还将使该文件在运行时说 “Hello to you!”。 + +要做到这一点,请在 `PKGBUILD` 中输入以下内容: + +``` +package() { + echo 'Hello to you!' > "${srcdir}/hello-world.sh" + mkdir -p "${pkgdir}/usr/bin" + cp "${srcdir}/hello-world.sh" "${pkgdir}/usr/bin/hello-world" + chmod +x "${pkgdir}/usr/bin/hello-world" +} +``` + +然后就完成了!用 `makepkg -si` 构建和安装软件包,然后在终端运行 `hello-world`,查看其输出。 + +![][12] + +### 总结 + +就这样,你已经制作了你的第一个 `PKGBUILD`!你走在了为自己甚至是为 AUR 制作实际的软件包的路上。 + +有什么问题,或者有什么地方不对吗?请随时在下面的评论区发表。 + +-------------------------------------------------------------------------------- + +via: https://itsfoss.com/create-pkgbuild/ + +作者:[Hunter Wittenborn][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://itsfoss.com/author/hunter/ +[b]: https://github.com/lujun9972 +[1]: https://itsfoss.com/aur-arch-linux/ +[2]: https://i0.wp.com/itsfoss.com/wp-content/uploads/2021/05/image.png?resize=748%2C689&ssl=1 +[3]: https://i2.wp.com/itsfoss.com/wp-content/uploads/2021/05/image-2.png?resize=682%2C260&ssl=1 +[4]: https://i1.wp.com/itsfoss.com/wp-content/uploads/2021/05/image-3.png?resize=682%2C265&ssl=1 +[5]: https://wiki.archlinux.org/title/Creating_packages +[6]: https://itsfoss.com/pacman-command/ +[7]: https://www.quora.com/What-is-CPU-architecture +[8]: https://en.wikipedia.org/wiki/Software_license +[9]: https://wiki.archlinux.org/title/PKGBUILD#license +[10]: https://wiki.archlinux.org/title/PKGBUILD#Integrity +[11]: https://linuxhandbook.com/mkdir-command/ +[12]: https://i1.wp.com/itsfoss.com/wp-content/uploads/2021/06/image-1.png?resize=561%2C281&ssl=1 diff --git a/published/202110/20210721 Run GitHub Actions on Fedora CoreOS.md b/published/202110/20210721 Run GitHub Actions on Fedora CoreOS.md new file mode 100644 index 0000000000..0a6ce8b4b6 --- /dev/null +++ b/published/202110/20210721 Run GitHub Actions on Fedora CoreOS.md @@ -0,0 +1,215 @@ +[#]: subject: (Run GitHub Actions on Fedora CoreOS) +[#]: via: (https://fedoramagazine.org/run-github-actions-on-fedora-coreos/) +[#]: author: (Clément Verna https://fedoramagazine.org/author/cverna/) +[#]: collector: (lujun9972) +[#]: translator: (wxy) +[#]: reviewer: (wxy) +[#]: publisher: (wxy) +[#]: url: (https://linux.cn/article-13846-1.html) + +在 Fedora CoreOS 上运行 GitHub Actions +====== + +![][1] + +[GitHub Actions][3] 是一项为快速建立持续集成和交付(CI/CD)工作流程而提供的服务。这些工作流程在被称为“运行器runner”的主机上运行。GitHub 提供的 [托管运行器][4] 的操作系统的选择是有限的(Windows Server、Ubuntu、MacOS)。 + +另一个选择是使用 [自托管][5] 的运行器,这让仓库管理员对运行器有更多控制。自托管的运行程序是专门为某个存储库或组织服务的。下面的文章介绍了使用 Fedora CoreOS 配置自托管运行程序的步骤。 + +### 入门 + +Fedora CoreOS 是一个精简的操作系统,旨在便于大规模的部署和维护。该操作系统会自动更新,并默认提供运行容器所需的工具。由于这些原因,Fedora CoreOS 是运行 CI/CD 工作流程的一个极佳选择。 + +配置和配备 Fedora CoreOS 机器的第一步是生成一个 [Ignition][6] 文件。[Butane][7] 允许你使用更友好的格式(YAML)生成 Ignition 文件。 + +#### 配置一个 Fedora CoreOS 运行器 + +要在 Fedora CoreOS 上执行 GitHub Actions,托管主机需要用于注册和运行该运行器的二进制文件和脚本。从 [Actions 运行器项目][8] 下载二进制文件和脚本,并部署在 `/usr/local/sbin/actions-runner` 下。 + +``` +version: "1.3.0" +variant: fcos +storage: + directories: + - path: /usr/local/sbin/actions-runner + mode: 0755 + user: + name: core + group: + name: core + files: + - path: /usr/local/sbin/actions-runner/actions-runner-linux.tar.gz + overwrite: true + contents: + source: https://github.com/actions/runner/releases/download/v2.278.0/actions-runner-linux-x64-2.278.0.tar.gz + mode: 0755 + user: + name: core + group: + name: core +``` + +#### 注册和删除令牌 + +为一个项目配置运行器需要一个“令牌token”。这可以防止在没有正确权限的情况下从项目中注册或删除自托管的运行器。GitHub 提供的令牌有一个小时的过期时间。如果运行器在这个时间之后重新启动,它将需要一个新的注册令牌。 + +该令牌可能出问题,特别是在 Fedora CoreOS 自动更新时。更新过程希望托管主机在收到新数据后至少每隔几周重启一次。 + +幸运的是,可以使用 GitHub REST API 来获取这些令牌,并在托管主机每次重启时自动配置运行器。下面的 `manage-runner.sh` 脚本使用 API 来获取令牌,删除任何已经配置好的运行器,并用新的令牌注册运行器。 + +``` +#!/bin/bash +# Handles the Github Action runner configuration. +# Remove and Registration token expires after 1 hour, if we want our runner +# to work after a reboot (auto update) we need to refresh the tokens. + +# First remove the runner with a fresh remove token +REMOVE_TOKEN=$(curl -u ${GITHUB_USER}:${GITHUB_TOKEN} -X POST -H "Accept: application/vnd.github.v3+json" https://api.github.com/repos/${GITHUB_USER}/${GITHUB_REPO}/actions/runners/remove-token | jq -r '.token') +/usr/local/sbin/actions-runner/config.sh remove --token ${REMOVE_TOKEN} + + +# Then register the runner with a fresh registration token +REGISTRATION_TOKEN=$(curl -u ${GITHUB_USER}:${GITHUB_TOKEN} -X POST -H "Accept: application/vnd.github.v3+json" https://api.github.com/repos/${GITHUB_USER}/${GITHUB_REPO}/actions/runners/registration-token | jq -r '.token') +/usr/local/sbin/actions-runner/config.sh --url https://github.com/cverna/fcos-actions-runner --token ${REGISTRATION_TOKEN} --labels fcos --unattended +``` + +上面的脚本使用了一些环境变量,包含 GitHub 用户名和用于验证 REST API 请求的 [个人访问令牌][9]Personal Access Token。个人访问令牌需要存储库权限,以便成功检索运行器的注册和移除令牌。该令牌是安全敏感信息,所以最好将其存储在一个具有更严格权限的不同文件中。在这个例子中,这个文件是 `actions-runner`。 + +``` +GITHUB_USER= +GITHUB_REPO= +GITHUB_TOKEN= +``` + +以下是创建这两个文件 `manage-runner.sh` 和 `actions-runner` 的 Butane 片段。 + +``` +- path: /usr/local/sbin/actions-runner/manage-runner.sh + contents: + local: manage-runner.sh + mode: 0755 + user: + name: core + group: + name: core + - path: /etc/actions-runner + contents: + local: actions-runner + mode: 0700 + user: + name: core + group: + name: core +``` + +### 在 Fedora CoreOS 上运行 Actions + +最后,创建用于配置和启动运行器的 systemd 服务。在 Butane 配置文件中定义这些服务。 + +``` +systemd: + units: + - name: github-runner-configure.service + enabled: true + contents: | + [Unit] + Description=Configure the github action runner for a repository + After=network-online.target boot-complete.target + Requires=boot-complete.target + [Service] + EnvironmentFile=/etc/actions-runner + Type=oneshot + RemainAfterExit=yes + User=core + WorkingDirectory=/usr/local/sbin/actions-runner + ExecStartPre=tar xvf actions-runner-linux.tar.gz --no-same-owner + ExecStart=/usr/local/sbin/actions-runner/manage-runner.sh + [Install] + WantedBy=multi-user.target + - name: github-runner.service + enabled: true + contents: | + [Unit] + Description=Run the github action runner + After=github-runner-configure.service + [Service] + WorkingDirectory=/usr/local/sbin/actions-runner + User=core + ExecStart=/usr/local/sbin/actions-runner/run.sh + [Install] + WantedBy=multi-user.target +``` + +这将创建两个服务:`github-runner-configure.service`(在主机启动完成后运行一次)和 `github-runner.service`(运行 Actions 运行器二进制文件并等待新的 CI/CD 作业)。 + +现在 Butane 配置已经完成,从中生成一个 Ignition 文件并配备一个 Fedora CoreOS Actions 运行器。 + +``` +$ podman run -i --rm -v $PWD:/code:z --workdir /code quay.io/coreos/butane:release --pretty --strict --files-dir /code config.yaml -o config.ignition +``` + +一旦 Ignition 文件生成,它就可以用来在 [支持][10] Fedora CoreOS 的平台上配备一个运行器。 + +### 配置一个 Action 来使用一个自托管的运行器 + +下面的测试 Action 工作流程将测试 FCOS 的自托管的运行器。在你的 git 存储库中创建以下文件 `.github/workflows/main.yml`。 + +``` +# This is a basic workflow to help you get started with Actions + +name: CI + +# Controls when the action will run. +on: + # Triggers the workflow on push or pull request events but only for the main branch + push: + branches: [ main ] + pull_request: + branches: [ main ] + + # Allows you to run this workflow manually from the Actions tab + workflow_dispatch: + +# A workflow run is made up of one or more jobs that can run sequentially or in parallel +jobs: + # This workflow contains a single job called "build" + build: + # The type of runner that the job will run on + runs-on: fcos + + # Steps represent a sequence of tasks that will be executed as part of the job + steps: + # Runs a single command using the runners shell + - name: Run a one-line script + run: podman run --rm fedora-minimal:34 echo Hello World ! +``` + +请注意,`runs-on` 的配置被设置为使用标签为 `fcos` 的运行器。 + +本文介绍的代码可以在 [这里][12] 中找到。 + +-------------------------------------------------------------------------------- + +via: https://fedoramagazine.org/run-github-actions-on-fedora-coreos/ + +作者:[Clément Verna][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://fedoramagazine.org/author/cverna/ +[b]: https://github.com/lujun9972 +[1]: https://fedoramagazine.org/wp-content/uploads/2021/07/modern-times-816x345.jpg +[2]: https://commons.wikimedia.org/wiki/File:Chaplin_-_Modern_Times.jpg +[3]: https://docs.github.com/en/actions +[4]: https://docs.github.com/en/actions/using-github-hosted-runners/about-github-hosted-runners +[5]: https://docs.github.com/en/actions/hosting-your-own-runners +[6]: https://github.com/coreos/ignition +[7]: https://github.com/coreos/butane +[8]: https://github.com/actions/runner +[9]: https://docs.github.com/en/github/authenticating-to-github/creating-a-personal-access-token +[10]: https://docs.fedoraproject.org/en-US/fedora-coreos/bare-metal/ +[11]: https://fedoramagazine.org/getting-started-with-fedora-coreos/ +[12]: https://github.com/cverna/fcos-actions-runner diff --git a/published/202110/20210728 Kernel tracing with trace-cmd.md b/published/202110/20210728 Kernel tracing with trace-cmd.md new file mode 100644 index 0000000000..1b4f6dfc9f --- /dev/null +++ b/published/202110/20210728 Kernel tracing with trace-cmd.md @@ -0,0 +1,354 @@ +[#]: subject: (Kernel tracing with trace-cmd) +[#]: via: (https://opensource.com/article/21/7/linux-kernel-trace-cmd) +[#]: author: (Gaurav Kamathe https://opensource.com/users/gkamathe) +[#]: collector: (lujun9972) +[#]: translator: (mengxinayan) +[#]: reviewer: (wxy) +[#]: publisher: (wxy) +[#]: url: (https://linux.cn/article-13852-1.html) + +使用 trace-cmd 追踪内核 +====== + +> trace-cmd 是一个易于使用,且特性众多、可用来追踪内核函数的命令。 + +![](https://img.linux.net.cn/data/attachment/album/202110/05/145818d2i9tgjetzj8itqg.jpg) + +在 [之前的文章][2] 里,我介绍了如何利用 `ftrace` 来追踪内核函数。通过写入和读出文件来使用 `ftrace` 会变得很枯燥,所以我对它做了一个封装来运行带有选项的命令,以启用和禁用追踪、设置过滤器、查看输出、清除输出等等。 + +[trace-cmd][3] 命令是一个可以帮助你做到这一点的工具。在这篇文章中,我使用 `trace-cmd` 来执行我在 `ftrace` 文章中所做的相同任务。由于会经常参考那篇文章,建议在阅读这篇文章之前先阅读它。 + +### 安装 trace-cmd + +本文中所有的命令都运行在 root 用户下。 + +因为 `ftrace` 机制被内置于内核中,因此你可以使用下面的命令进行验证它是否启用: + +``` +# mount | grep tracefs +none on /sys/kernel/tracing type tracefs (rw,relatime,seclabel) +``` + +不过,你需要手动尝试安装 `trace-cmd` 命令: + +``` +# dnf install trace-cmd -y +``` + +### 列出可用的追踪器 + +当使用 `ftrace` 时,你必须查看文件的内容以了解有哪些追踪器可用。但使用 `trace-cmd`,你可以通过以下方式获得这些信息: + +``` +# trace-cmd list -t +hwlat blk mmiotrace function_graph wakeup_dl wakeup_rt wakeup function nop +``` + +### 启用函数追踪器 + +在我 [之前的文章][2] 中,我使用了两个追踪器,在这里我也会这么做。用 `function` 启用你的第一个追踪器: + +``` +$ trace-cmd start -p function +  plugin 'function' +``` + +### 查看追踪输出 + +一旦追踪器被启用,你可以通过使用 `show` 参数来查看输出。这只显示了前 20 行以保持例子的简短(见我之前的文章对输出的解释): + +``` +# trace-cmd show | head -20 +## tracer: function +# +# entries-in-buffer/entries-written: 410142/3380032 #P:8 +# +# _-----=> irqs-off +# / _----=> need-resched +# | / _---=> hardirq/softirq +# || / _--=> preempt-depth +# ||| / delay +# TASK-PID CPU# |||| TIMESTAMP FUNCTION +# | | | |||| | | + gdbus-2606 [004] ..s. 10520.538759: __msecs_to_jiffies <-rebalance_domains + gdbus-2606 [004] ..s. 10520.538760: load_balance <-rebalance_domains + gdbus-2606 [004] ..s. 10520.538761: idle_cpu <-load_balance + gdbus-2606 [004] ..s. 10520.538762: group_balance_cpu <-load_balance + gdbus-2606 [004] ..s. 10520.538762: find_busiest_group <-load_balance + gdbus-2606 [004] ..s. 10520.538763: update_group_capacity <-update_sd_lb_stats.constprop.0 + gdbus-2606 [004] ..s. 10520.538763: __msecs_to_jiffies <-update_group_capacity + gdbus-2606 [004] ..s. 10520.538765: idle_cpu <-update_sd_lb_stats.constprop.0 + gdbus-2606 [004] ..s. 10520.538766: __msecs_to_jiffies <-rebalance_domains +``` + +### 停止追踪并清除缓冲区 + +追踪将会在后台继续运行,你可以继续用 `show` 查看输出。 + +要停止追踪,请运行带有 `stop` 参数的 `trace-cmd` 命令: + +``` +# trace-cmd stop +``` + +要清除缓冲区,用 `clear` 参数运行它: + +``` +# trace-cmd clear +``` + +### 启用函数调用图追踪器 + +运行第二个追踪器,通过 `function_graph` 参数来启用它。 + +``` +# trace-cmd start -p function_graph + Plugin 'function_graph' +``` + +再次使用 `show` 参数查看输出。正如预期的那样,输出与第一次追踪输出略有不同。这一次,它包括一个**函数调用**链: + +``` +# trace-cmd show | head -20 +## tracer: function_graph +# +# CPU DURATION FUNCTION CALLS +# | | | | | | | + 4) 0.079 us | } /* rcu_all_qs */ + 4) 0.327 us | } /* __cond_resched */ + 4) 0.081 us | rcu_read_unlock_strict(); + 4) | __cond_resched() { + 4) 0.078 us | rcu_all_qs(); + 4) 0.243 us | } + 4) 0.080 us | rcu_read_unlock_strict(); + 4) | __cond_resched() { + 4) 0.078 us | rcu_all_qs(); + 4) 0.241 us | } + 4) 0.080 us | rcu_read_unlock_strict(); + 4) | __cond_resched() { + 4) 0.079 us | rcu_all_qs(); + 4) 0.235 us | } + 4) 0.095 us | rcu_read_unlock_strict(); + 4) | __cond_resched() { +``` + +使用 `stop` 和 `clear` 命令来停止追踪和清除缓存区: + +``` +# trace-cmd stop +# trace-cmd clear +``` + +### 调整追踪以增加深度 + +如果你想在函数调用中看到更多的深度,你可以对追踪器进行调整: + +``` +# trace-cmd start -p function_graph --max-graph-depth 5 + plugin 'function_graph' +``` + +现在,当你将这个输出与你之前看到的进行比较时,你应该看到更多的嵌套函数调用: + +``` +# trace-cmd show | head -20 +## tracer: function_graph +# +# CPU DURATION FUNCTION CALLS +# | | | | | | | + 6) | __fget_light() { + 6) 0.804 us | __fget_files(); + 6) 2.708 us | } + 6) 3.650 us | } /* __fdget */ + 6) 0.547 us | eventfd_poll(); + 6) 0.535 us | fput(); + 6) | __fdget() { + 6) | __fget_light() { + 6) 0.946 us | __fget_files(); + 6) 1.895 us | } + 6) 2.849 us | } + 6) | sock_poll() { + 6) 0.651 us | unix_poll(); + 6) 1.905 us | } + 6) 0.475 us | fput(); + 6) | __fdget() { +``` + +### 了解可被追踪的函数 + +如果你想只追踪某些函数而忽略其他的,你需要知道确切的函数名称。你可以用 `list -f` 参数来得到它们。例如搜索常见的内核函数 `kmalloc`,它被用来在内核中分配内存: + +``` +# trace-cmd list -f | grep kmalloc +bpf_map_kmalloc_node +mempool_kmalloc +__traceiter_kmalloc +__traceiter_kmalloc_node +kmalloc_slab +kmalloc_order +kmalloc_order_trace +kmalloc_large_node +__kmalloc +__kmalloc_track_caller +__kmalloc_node +__kmalloc_node_track_caller +[...] +``` + +下面是我的测试系统中可被追踪的函数总数: + +``` +# trace-cmd list -f | wc -l +63165 +``` + +### 追踪内核模块相关的函数 + +你也可以追踪与特定内核模块相关的函数。假设你想追踪 `kvm` 内核模块相关的功能,你可以通过以下方式来实现。请确保该模块已经加载: + +``` +# lsmod | grep kvm_intel +kvm_intel 335872 0 +kvm 987136 1 kvm_intel +``` + +再次运行 `trace-cmd`,使用 `list` 参数,并从输出结果中,`grep` 查找以 `]` 结尾的行。这将过滤掉内核模块。然后 `grep` 内核模块 `kvm_intel` ,你应该看到所有与该内核模块有关的函数。 + +``` +# trace-cmd list -f | grep ]$ | grep kvm_intel +vmx_can_emulate_instruction [kvm_intel] +vmx_update_emulated_instruction [kvm_intel] +vmx_setup_uret_msr [kvm_intel] +vmx_set_identity_map_addr [kvm_intel] +handle_machine_check [kvm_intel] +handle_triple_fault [kvm_intel] +vmx_patch_hypercall [kvm_intel] + +[...] + +vmx_dump_dtsel [kvm_intel] +vmx_dump_sel [kvm_intel] +``` + +### 追踪特定函数 + +现在你知道了如何找到感兴趣的函数,请用一个例子把这些内容用于时间。就像前面的文章一样,试着追踪与文件系统相关的函数。我的测试系统上的文件系统是 `ext4`。 + +这个过程略有不同;你在运行命令时,不使用 `start` 参数,而是在 `record` 参数后面加上你想追踪的函数的“模式”。你还需要指定你想要的追踪器;在这种情况下,就是 `function_graph`。该命令会继续记录追踪,直到你用 `Ctrl+C` 停止它。所以几秒钟后,按 `Ctrl+C` 停止追踪: + +``` +# trace-cmd list -f | grep ^ext4_ + +# trace-cmd record -l ext4_* -p function_graph + plugin 'function_graph' +Hit Ctrl^C to stop recording +^C +CPU0 data recorded at offset=0x856000 + 8192 bytes in size +[...] +``` + +### 查看追踪记录 + +要查看你之前的追踪记录,运行带有 `report` 参数的命令。从输出结果来看,很明显过滤器起作用了,你只看到 `ext4` 相关的函数追踪: + +``` +# trace-cmd report | head -20 +[...] +cpus=8 + trace-cmd-12697 [000] 11303.928103: funcgraph_entry: | ext4_show_options() { + trace-cmd-12697 [000] 11303.928104: funcgraph_entry: 0.187 us | ext4_get_dummy_policy(); + trace-cmd-12697 [000] 11303.928105: funcgraph_exit: 1.583 us | } + trace-cmd-12697 [000] 11303.928122: funcgraph_entry: | ext4_create() { + trace-cmd-12697 [000] 11303.928122: funcgraph_entry: | ext4_alloc_inode() { + trace-cmd-12697 [000] 11303.928123: funcgraph_entry: 0.101 us | ext4_es_init_tree(); + trace-cmd-12697 [000] 11303.928123: funcgraph_entry: 0.083 us | ext4_init_pending_tree(); + trace-cmd-12697 [000] 11303.928123: funcgraph_entry: 0.141 us | ext4_fc_init_inode(); + trace-cmd-12697 [000] 11303.928123: funcgraph_exit: 0.931 us | } + trace-cmd-12697 [000] 11303.928124: funcgraph_entry: 0.081 us | ext4_get_dummy_policy(); + trace-cmd-12697 [000] 11303.928124: funcgraph_entry: 0.133 us | ext4_get_group_desc(); + trace-cmd-12697 [000] 11303.928124: funcgraph_entry: 0.115 us | ext4_free_inodes_count(); + trace-cmd-12697 [000] 11303.928124: funcgraph_entry: 0.114 us | ext4_get_group_desc(); +``` + +### 追踪一个特定的 PID + +假设你想追踪与一个进程(PID)有关的函数。打开另一个终端,注意运行中的 shell 的PID: + +``` +# echo $$ +10885 +``` + +再次运行 `record` 命令,用 `-P` 选项传递PID。这一次,让终端运行(也就是说,先不要按 `Ctrl+C` ): + +``` +# trace-cmd record -P 10885 -p function_graph + Plugin 'function_graph' +Hit Ctrl^C to stop recording +``` + +### 在 shell 上运行一些命令 + +移动到另一个终端,在那里你有一个以特定 PID 运行的 shell,并运行任何命令,例如,`ls` 命令用来列出文件: + +``` +# ls +Temp-9b61f280-fdc1-4512-9211-5c60f764d702 +tracker-extract-3-files.1000 +v8-compile-cache-1000 +[...] +``` + +移动到你启用追踪的终端,按 `Ctrl+C` 停止追踪: + +``` +# trace-cmd record -P 10885 -p function_graph + plugin 'function_graph' +Hit Ctrl^C to stop recording +^C +CPU1 data recorded at offset=0x856000 + 618496 bytes in size +[...] +``` + +在追踪的输出中,你可以看到左边是 PID 和 Bash shell,右边是与之相关的函数调用。这对于缩小你的追踪范围是非常方便的: + +``` +# trace-cmd report | head -20 + +cpus=8 + -0 [001] 11555.380581: funcgraph_entry: | switch_mm_irqs_off() { + -0 [001] 11555.380583: funcgraph_entry: 1.703 us | load_new_mm_cr3(); + -0 [001] 11555.380586: funcgraph_entry: 0.493 us | switch_ldt(); + -0 [001] 11555.380587: funcgraph_exit: 7.235 us | } + bash-10885 [001] 11555.380589: funcgraph_entry: 1.046 us | finish_task_switch.isra.0(); + bash-10885 [001] 11555.380591: funcgraph_entry: | __fdget() { + bash-10885 [001] 11555.380592: funcgraph_entry: 2.036 us | __fget_light(); + bash-10885 [001] 11555.380594: funcgraph_exit: 3.256 us | } + bash-10885 [001] 11555.380595: funcgraph_entry: | tty_poll() { + bash-10885 [001] 11555.380597: funcgraph_entry: | tty_ldisc_ref_wait() { + bash-10885 [001] 11555.380598: funcgraph_entry: | ldsem_down_read() { + bash-10885 [001] 11555.380598: funcgraph_entry: | __cond_resched() { +``` + +### 试一试 + +这些简短的例子显示了使用 `trace-cmd` 命令而不是底层的 `ftrace` 机制,是如何实现既容易使用又拥有丰富的功能,许多内容本文并没有涉及。要想了解更多信息并更好地使用它,请查阅它的手册,并尝试使用其他有用的命令。 + +-------------------------------------------------------------------------------- + +via: https://opensource.com/article/21/7/linux-kernel-trace-cmd + +作者:[Gaurav Kamathe][a] +选题:[lujun9972][b] +译者:[萌新阿岩](https://github.com/mengxinayan) +校对:[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/puzzle_computer_solve_fix_tool.png?itok=U0pH1uwj (Puzzle pieces coming together to form a computer screen) +[2]: https://linux.cn/article-13752-1.html +[3]: https://lwn.net/Articles/410200/ diff --git a/published/202110/20210809 NMState- A declarative networking config tool.md b/published/202110/20210809 NMState- A declarative networking config tool.md new file mode 100644 index 0000000000..2f15c78d84 --- /dev/null +++ b/published/202110/20210809 NMState- A declarative networking config tool.md @@ -0,0 +1,579 @@ +[#]: subject: "NMState: A declarative networking config tool" +[#]: via: "https://fedoramagazine.org/nmstate-a-declarative-networking-config-tool/" +[#]: author: "Maurizio Garcia https://fedoramagazine.org/author/malgnuz/" +[#]: collector: "lujun9972" +[#]: translator: "wxy" +[#]: reviewer: "wxy" +[#]: publisher: "wxy" +[#]: url: "https://linux.cn/article-13861-1.html" + +NMState:一个声明式网络配置工具 +====== + +![](https://img.linux.net.cn/data/attachment/album/202110/08/145714mqcyh6sshchomyot.jpg) + +这篇文章描述并演示了 NMState,这是一个使用声明式方法配置主机的网络管理器。这意味着你可以通过 API 定义所需的配置状态,而工具则通过提供者provider来应用配置。 + +### 配置方法:命令式与声明式 + +网络管理有时候是一项非常复杂的任务,这取决于环境的规模和多样性。在 IT 的早期,网络管理依赖于网络管理员在网络设备上手动执行命令。如今,基础设施即代码Infrastructure as Code(IaC)允许以不同的方式将这些任务自动化。z这基本上有两种方法:命令式或声明式。 + +在命令式方法中,你会定义“如何”达到所需的配置状态。而在声明式范式里则定义了“什么”是所需的配置状态,所以它不确定哪些步骤是必需的,也不确定它们必须以何种顺序执行。这种方法目前正在聚集更多的人员参与,你可以在目前使用的大多数管理和编排工具上找到它。 + +### NMState:一个声明式的工具 + +NMState 是一个网络管理器,允许你按照声明式方法配置主机。这意味着你通过一个北向的声明式 API 定义所需的配置状态,这个工具通过南向的提供者provider应用配置。 + +目前 NMState 支持的唯一的提供者是 NetworkManager,它是为 Fedora Linux 提供网络功能的主要服务。不过,NMState 的开发计划中将逐渐增加其他提供者。 + +关于 NMState 的进一步信息,请访问其项目 [站点][4] 或 GitHub [仓库][5]。 + +### 安装 + +NMState 在 Fedora Linux 29+ 上可用,需要在系统上安装并运行 NetworkManager 1.26 或更高版本。下面是在 Fedora Linux 34 上的安装情况: + +``` +$ sudo dnf -y install nmstate +... +输出节略 +... +Installed: + NetworkManager-config-server-1:1.30.4-1.fc34.noarch gobject-introspection-1.68.0-3.fc34.x86_64 nispor-1.0.1-2.fc34.x86_64 nmstate-1.0.3-2.fc34.noarch + python3-gobject-base-3.40.1-1.fc34.x86_64 python3-libnmstate-1.0.3-2.fc34.noarch python3-nispor-1.0.1-2.fc34.noarch python3-varlink-30.3.1-2.fc34.noarch + +Complete! +``` + +这样,你可以使用 `nmstatectl` 作为 NMState 的命令行工具。请参考 `nmstatectl -help` 或 `man nmstatectl` 以了解关于这个工具的进一步信息。 + +### 使用 NMstate + +首先要检查系统中安装的 NMState 版本: + +``` +$ nmstatectl version +1.0.3 +``` + +检查一个网络接口的当前配置,例如 `eth0` 的配置: + +``` +$ nmstatectl show eth0 +2021-06-29 10:28:21,530 root DEBUG NetworkManager version 1.30.4 +2021-06-29 10:28:21,531 root DEBUG Async action: Retrieve applied config: ethernet eth0 started +2021-06-29 10:28:21,531 root DEBUG Async action: Retrieve applied config: ethernet eth1 started +2021-06-29 10:28:21,532 root DEBUG Async action: Retrieve applied config: ethernet eth0 finished +2021-06-29 10:28:21,533 root DEBUG Async action: Retrieve applied config: ethernet eth1 finished +--- +dns-resolver: + config: {} + running: + search: [] + server: + - 192.168.122.1 +route-rules: + config: [] +routes: + config: [] + running: + - destination: fe80::/64 + metric: 100 + next-hop-address: '' + next-hop-interface: eth0 + table-id: 254 + - destination: 0.0.0.0/0 + metric: 100 + next-hop-address: 192.168.122.1 + next-hop-interface: eth0 + table-id: 254 + - destination: 192.168.122.0/24 + metric: 100 + next-hop-address: '' + next-hop-interface: eth0 + table-id: 254 +interfaces: +- name: eth0 + type: ethernet + state: up + ipv4: + enabled: true + address: + - ip: 192.168.122.238 + prefix-length: 24 + auto-dns: true + auto-gateway: true + auto-route-table-id: 0 + auto-routes: true + dhcp: true + ipv6: + enabled: true + address: + - ip: fe80::c3c9:c4f9:75b1:a570 + prefix-length: 64 + auto-dns: true + auto-gateway: true + auto-route-table-id: 0 + auto-routes: true + autoconf: true + dhcp: true + lldp: + enabled: false + mac-address: 52:54:00:91:E4:4E + mtu: 1500 +``` + +正如你在上面看到的,这个网络配置显示了四个主要部分: + + * `dns-resolver`:这部分是这个接口的名字服务器配置。 + * `route-rules`:它说明了路由规则。  + * `routes`:它包括动态和静态路由。 + * `interfaces`:这部分描述了 ipv4 和 ipv6 设置。 + +### 修改配置 + +你可以在两种模式下修改所需的配置状态: + + * 交互式:通过 `nmstatectl edit` 编辑接口配置。这个命令调用环境变量 `EDITOR` 定义的文本编辑器,因此可以用 yaml 格式编辑网络状态。完成编辑后,NMState 将应用新的网络配置,除非有语法错误。 + * 基于文件的:使用 `nmstatectl apply` 应用接口配置,它从先前创建的 yaml 或 json 文件中导入一个所需的配置状态。 + +下面几节告诉你如何使用 NMState 来改变网络配置。这些改变可能会对系统造成破坏,所以建议在测试系统或客户虚拟机上执行这些任务,直到你对 NMState 有更好的理解。 + +这里使用的测试系统有两个以太网接口,`eth0` 和 `eth1`: + +``` +$ ip -br -4 a +lo UNKNOWN 127.0.0.1/8 +eth0 UP 192.168.122.238/24 +eth1 UP 192.168.122.108/24 +``` + +#### 互动配置模式的例子 + +使用 `nmstatectl edit` 命令将 `eth0` 接口的 MTU 改为 9000 字节,如下所示: + +``` +$ sudo nmstatectl edit eth0 + +--- +dns-resolver: + config: {} + running: + search: [] + server: + - 192.168.122.1 +route-rules: + config: [] +routes: + config: [] + running: + - destination: fe80::/64 + metric: 100 + next-hop-address: '' + next-hop-interface: eth0 + table-id: 254 + - destination: 0.0.0.0/0 + metric: 100 + next-hop-address: 192.168.122.1 + next-hop-interface: eth0 + table-id: 254 + - destination: 192.168.122.0/24 + metric: 100 + next-hop-address: '' + next-hop-interface: eth0 + table-id: 254 +interfaces: +- name: eth0 + type: ethernet + state: up + ipv4: + enabled: true + address: + - ip: 192.168.122.123 + prefix-length: 24 + auto-dns: true + auto-gateway: true + auto-route-table-id: 0 + auto-routes: true + dhcp: true + ipv6: + enabled: true + address: + - ip: fe80::c3c9:c4f9:75b1:a570 + prefix-length: 64 + auto-dns: true + auto-gateway: true + auto-route-table-id: 0 + auto-routes: true + autoconf: true + dhcp: true + lldp: + enabled: false + mac-address: 52:54:00:91:E4:4E + mtu: 9000 +``` + +在保存并退出编辑器后,NMState 应用新的网络期望状态: + +``` +2021-06-29 11:29:05,726 root DEBUG Nmstate version: 1.0.3 +2021-06-29 11:29:05,726 root DEBUG Applying desire state: {'dns-resolver': {'config': {}, 'running': {'search': [], 'server': ['192.168.122.1']}}, 'route-rules': {'config': []}, 'routes': {'config': [], 'running': [{'destination': 'fe80::/64', 'metric': 102, 'next-hop-address': '', 'next-hop-interface': 'eth0', 'table-id': 254}, {'destination': '0.0.0.0/0', 'metric': 102, 'next-hop-address': '192.168.122.1', 'next-hop-interface': 'eth0', 'table-id': 254}, {'destination': '192.168.122.0/24', 'metric': 102, 'next-hop-address': '', 'next-hop-interface': 'eth0', 'table-id': 254}]}, 'interfaces': [{'name': 'eth0', 'type': 'ethernet', 'state': 'up', 'ipv4': {'enabled': True, 'address': [{'ip': '192.168.122.238', 'prefix-length': 24}], 'auto-dns': True, 'auto-gateway': True, 'auto-route-table-id': 0, 'auto-routes': True, 'dhcp': True}, 'ipv6': {'enabled': True, 'address': [{'ip': 'fe80::5054:ff:fe91:e44e', 'prefix-length': 64}], 'auto-dns': True, 'auto-gateway': True, 'auto-route-table-id': 0, 'auto-routes': True, 'autoconf': True, 'dhcp': True}, 'lldp': {'enabled': False}, 'mac-address': '52:54:00:91:E4:4E', 'mtu': 9000}]} +--- output omitted --- +2021-06-29 11:29:05,760 root DEBUG Async action: Update profile uuid:2bdee700-f62b-365a-bd1d-69d9c31a9f0c iface:eth0 type:ethernet started +2021-06-29 11:29:05,792 root DEBUG Async action: Update profile uuid:2bdee700-f62b-365a-bd1d-69d9c31a9f0c iface:eth0 type:ethernet finished +``` + +现在,使用 `ip` 命令和 `eth0` 的配置文件来检查 `eth0` 的 `MTU` 是不是 9000 字节。 + +``` +$ ip link show eth0 +2: eth0: mtu 9000 qdisc fq_codel state UP mode DEFAULT group default qlen 1000 + link/ether 52:54:00:91:e4:4e brd ff:ff:ff:ff:ff:ff + altname enp1s0 + +$ sudo cat /etc/NetworkManager/system-connections/eth0.nmconnection +[sudo] password for admin: +[connection] +id=eth0 +uuid=2bdee700-f62b-365a-bd1d-69d9c31a9f0c +type=ethernet +interface-name=eth0 +lldp=0 +permissions= + +[ethernet] +cloned-mac-address=52:54:00:91:E4:4E +mac-address-blacklist= +mtu=9000 + +[ipv4] +dhcp-client-id=mac +dhcp-timeout=2147483647 +dns-search= +method=auto + +[ipv6] +addr-gen-mode=eui64 +dhcp-duid=ll +dhcp-iaid=mac +dhcp-timeout=2147483647 +dns-search= +method=auto +ra-timeout=2147483647 + +[proxy] +``` + +#### 基于文件的配置模式的例子 + +让我们使用基于文件的方法来设置一个新的配置状态。这里我们禁用 `eth1` 接口的 IPv6 配置。 + +首先,创建一个 yaml 文件来定义 `eth1` 接口的期望状态。使用 `nmstatectl show` 来保存当前设置,然后使用 `nmstatectl edit` 来禁用 IPv6。 + +``` +$ nmstatectl show eth1 > eth1.yaml + +$ vi eth1.yaml +--- +dns-resolver: + config: {} + running: + search: [] + server: + - 192.168.122.1 +route-rules: + config: [] +routes: + config: [] + running: + - destination: fe80::/64 + metric: 101 + next-hop-address: '' + next-hop-interface: eth1 + table-id: 254 + - destination: 0.0.0.0/0 + metric: 101 + next-hop-address: 192.168.122.1 + next-hop-interface: eth1 + table-id: 254 + - destination: 192.168.122.0/24 + metric: 101 + next-hop-address: '' + next-hop-interface: eth1 + table-id: 254 +interfaces: +- name: eth1 + type: ethernet + state: up + ipv4: + enabled: true + address: + - ip: 192.168.122.108 + prefix-length: 24 + auto-dns: true + auto-gateway: true + auto-route-table-id: 0 + auto-routes: true + dhcp: true + ipv6: + enabled: false + address: + - ip: fe80::5054:ff:fe3c:9b04 + prefix-length: 64 + auto-dns: true + auto-gateway: true + auto-route-table-id: 0 + auto-routes: true + autoconf: true + dhcp: true + lldp: + enabled: false + mac-address: 52:54:00:3C:9B:04 + mtu: 1500 +``` + +保存新的配置后,用它来应用新的状态: + +``` +$ sudo nmstatectl apply eth1.yaml + +2021-06-29 12:17:21,531 root DEBUG Nmstate version: 1.0.3 +2021-06-29 12:17:21,531 root DEBUG Applying desire state: {'dns-resolver': {'config': {}, 'running': {'search': [], 'server': ['192.168.122.1']}}, 'route-rules': {'config': []}, 'routes': {'config': [], 'running': [{'destination': 'fe80::/64', 'metric': 101, 'next-hop-address': '', 'next-hop-interface': 'eth1', 'table-id': 254}, {'destination': '0.0.0.0/0', 'metric': 101, 'next-hop-address': '192.168.122.1', 'next-hop-interface': 'eth1', 'table-id': 254}, {'destination': '192.168.122.0/24', 'metric': 101, 'next-hop-address': '', 'next-hop-interface': 'eth1', 'table-id': 254}]}, 'interfaces': [{'name': 'eth1', 'type': 'ethernet', 'state': 'up', 'ipv4': {'enabled': True, 'address': [{'ip': '192.168.122.108', 'prefix-length': 24}], 'auto-dns': True, 'auto-gateway': True, 'auto-route-table-id': 0, 'auto-routes': True, 'dhcp': True}, 'ipv6': {'enabled': False}, 'lldp': {'enabled': False}, 'mac-address': '52:54:00:3C:9B:04', 'mtu': 1500}]} +--- output omitted --- +2021-06-29 12:17:21,582 root DEBUG Async action: Update profile uuid:5d7244cb-673d-3b88-a675-32e31fad4347 iface:eth1 type:ethernet started +2021-06-29 12:17:21,587 root DEBUG Async action: Update profile uuid:5d7244cb-673d-3b88-a675-32e31fad4347 iface:eth1 type:ethernet finished +--- output omitted --- +Desired state applied: +--- +dns-resolver: + config: {} + running: + search: [] + server: + - 192.168.122.1 +route-rules: + config: [] +routes: + config: [] + running: + - destination: fe80::/64 + metric: 101 + next-hop-address: '' + next-hop-interface: eth1 + table-id: 254 + - destination: 0.0.0.0/0 + metric: 101 + next-hop-address: 192.168.122.1 + next-hop-interface: eth1 + table-id: 254 + - destination: 192.168.122.0/24 + metric: 101 + next-hop-address: '' + next-hop-interface: eth1 + table-id: 254 +interfaces: +- name: eth1 + type: ethernet + state: up + ipv4: + enabled: true + address: + - ip: 192.168.122.108 + prefix-length: 24 + auto-dns: true + auto-gateway: true + auto-route-table-id: 0 + auto-routes: true + dhcp: true + ipv6: + enabled: false + lldp: + enabled: false + mac-address: 52:54:00:3C:9B:04 + mtu: 1500 +``` + +你可以检查看到 `eth1` 接口没有配置任何 IPv6: + +``` +$ ip -br a +lo UNKNOWN 127.0.0.1/8 ::1/128 +eth0 UP 192.168.122.238/24 fe80::5054:ff:fe91:e44e/64 +eth1 UP 192.168.122.108/24 + +$ sudo cat /etc/NetworkManager/system-connections/eth1.nmconnection +[connection] +id=eth1 +uuid=5d7244cb-673d-3b88-a675-32e31fad4347 +type=ethernet +interface-name=eth1 +lldp=0 +permissions= + +[ethernet] +cloned-mac-address=52:54:00:3C:9B:04 +mac-address-blacklist= +mtu=1500 + +[ipv4] +dhcp-client-id=mac +dhcp-timeout=2147483647 +dns-search= +method=auto + +[ipv6] +addr-gen-mode=eui64 +dhcp-duid=ll +dhcp-iaid=mac +dns-search= +method=disabled + +[proxy] +``` + +#### 临时应用改变 + +NMState 的一个有趣的功能允许你临时配置一个期望的网络状态。如果你对这个配置感到满意,你可以事后提交。否则,当超时(默认为 60 秒)过后,它将回滚。 + +修改前面例子中的 `eth1` 配置,使它有一个 IPv4 静态地址,而不是通过 DHCP 动态获得。 + +``` +$ vi eth1.yaml + +--- +dns-resolver: + config: {} + running: + search: [] + server: + - 192.168.122.1 +route-rules: + config: [] +routes: + config: [] + running: + - destination: fe80::/64 + metric: 101 + next-hop-address: '' + next-hop-interface: eth1 + table-id: 254 + - destination: 0.0.0.0/0 + metric: 101 + next-hop-address: 192.168.122.1 + next-hop-interface: eth1 + table-id: 254 + - destination: 192.168.122.0/24 + metric: 101 + next-hop-address: '' + next-hop-interface: eth1 + table-id: 254 +interfaces: +- name: eth1 + type: ethernet + state: up + ipv4: + enabled: true + address: + - ip: 192.168.122.110 + prefix-length: 24 + auto-dns: true + auto-gateway: true + auto-route-table-id: 0 + auto-routes: true + dhcp: false + ipv6: + enabled: false + lldp: + enabled: false + mac-address: 52:54:00:3C:9B:04 + mtu: 1500 +``` + +现在,使用选项 `no-commit` 临时应用这个配置,让它只在 30 秒内有效。这可以通过添加选项 `timeout` 来完成。同时,我们将运行 `ip -br a` 命令三次,看看配置在 `eth1` 接口的 IPv4 地址是如何变化的,然后配置就会回滚。 + +``` +$ ip -br a && sudo nmstatectl apply --no-commit --timeout 30 eth1.yaml && sleep 10 && ip -br a && sleep 25 && ip -br a +lo UNKNOWN 127.0.0.1/8 ::1/128 +eth0 UP 192.168.122.238/24 fe80::5054:ff:fe91:e44e/64 +eth1 UP 192.168.122.108/24 +2021-06-29 17:29:18,266 root DEBUG Nmstate version: 1.0.3 +2021-06-29 17:29:18,267 root DEBUG Applying desire state: {'dns-resolver': {'config': {}, 'running': {'search': [], 'server': ['192.168.122.1']}}, 'route-rules': {'config': []}, 'routes': {'config': [], 'running': [{'destination': 'fe80::/64', 'metric': 101, 'next-hop-address': '', 'next-hop-interface': 'eth1', 'table-id': 254}, {'destination': '0.0.0.0/0', 'metric': 101, 'next-hop-address': '192.168.122.1', 'next-hop-interface': 'eth1', 'table-id': 254}, {'destination': '192.168.122.0/24', 'metric': 101, 'next-hop-address': '', 'next-hop-interface': 'eth1', 'table-id': 254}]}, 'interfaces': [{'name': 'eth1', 'type': 'ethernet', 'state': 'up', 'ipv4': {'enabled': True, 'address': [{'ip': '192.168.122.110', 'prefix-length': 24}], 'dhcp': False}, 'ipv6': {'enabled': False}, 'lldp': {'enabled': False}, 'mac-address': '52:54:00:3C:9B:04', 'mtu': 1500}]} +--- output omitted --- +Desired state applied: +--- +dns-resolver: + config: {} + running: + search: [] + server: + - 192.168.122.1 +route-rules: + config: [] +routes: + config: [] + running: + - destination: fe80::/64 + metric: 101 + next-hop-address: '' + next-hop-interface: eth1 + table-id: 254 + - destination: 0.0.0.0/0 + metric: 101 + next-hop-address: 192.168.122.1 + next-hop-interface: eth1 + table-id: 254 + - destination: 192.168.122.0/24 + metric: 101 + next-hop-address: '' + next-hop-interface: eth1 + table-id: 254 +interfaces: +- name: eth1 + type: ethernet + state: up + ipv4: + enabled: true + address: + - ip: 192.168.122.110 + prefix-length: 24 + dhcp: false + ipv6: + enabled: false + lldp: + enabled: false + mac-address: 52:54:00:3C:9B:04 + mtu: 1500 +Checkpoint: NetworkManager|/org/freedesktop/NetworkManager/Checkpoint/7 +lo UNKNOWN 127.0.0.1/8 ::1/128 +eth0 UP 192.168.122.238/24 fe80::5054:ff:fe91:e44e/64 +eth1 UP 192.168.122.110/24 +lo UNKNOWN 127.0.0.1/8 ::1/128 +eth0 UP 192.168.122.238/24 fe80::5054:ff:fe91:e44e/64 +eth1 UP 192.168.122.108/24 +``` + +从上面可以看到,`eth1` 的 IP 地址从 `192.168.122.108` 暂时变成了 `192.168.122.110`,然后在超时结束后又回到了 `192.168.122.108`。 + +### 总结 + +NMState 是一个声明式的网络配置工具,目前可以通过 NetworkManager API 在主机中应用所需的网络配置状态。这种状态既可以用文本编辑器交互式地定义,也可以用基于文件的方法创建一个 yaml 或 json 文件。 + +这种工具提供了“基础设施即代码”,它可以自动化网络任务,也减少了使用传统配置方法可能出现的潜在错误配置或不稳定的网络情况。 + +-------------------------------------------------------------------------------- + +via: https://fedoramagazine.org/nmstate-a-declarative-networking-config-tool/ + +作者:[Maurizio Garcia][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://fedoramagazine.org/author/malgnuz/ +[b]: https://github.com/lujun9972 +[1]: https://fedoramagazine.org/wp-content/uploads/2021/07/magic-816x345.jpg +[2]: https://unsplash.com/@marigard?utm_source=unsplash&utm_medium=referral&utm_content=creditCopyText +[3]: https://unsplash.com/s/photos/magic?utm_source=unsplash&utm_medium=referral&utm_content=creditCopyText +[4]: https://nmstate.io/ +[5]: https://github.com/nmstate/nmstate diff --git a/published/202110/20210813 Code memory safety and efficiency by example.md b/published/202110/20210813 Code memory safety and efficiency by example.md new file mode 100644 index 0000000000..d962653d8f --- /dev/null +++ b/published/202110/20210813 Code memory safety and efficiency by example.md @@ -0,0 +1,666 @@ +[#]: subject: "Code memory safety and efficiency by example" +[#]: via: "https://opensource.com/article/21/8/memory-programming-c" +[#]: author: "Marty Kalin https://opensource.com/users/mkalindepauledu" +[#]: collector: "lujun9972" +[#]: translator: "unigeorge" +[#]: reviewer: "wxy" +[#]: publisher: "wxy" +[#]: url: "https://linux.cn/article-13845-1.html" + +实例讲解代码之内存安全与效率 +====== + +> 了解有关内存安全和效率的更多信息。 + +![](https://img.linux.net.cn/data/attachment/album/202110/03/101238cd0hgdrhamzab7hj.jpg) + +C 是一种高级语言,同时具有“接近金属close-to-the-metal”(LCTT 译注:即“接近人类思维方式”的反义词)的特性,这使得它有时看起来更像是一种可移植的汇编语言,而不像 Java 或 Python 这样的兄弟语言。内存管理作为上述特性之一,涵盖了正在执行的程序对内存的安全和高效使用。本文通过 C 语言代码示例,以及现代 C 语言编译器生成的汇编语言代码段,详细介绍了内存安全性和效率。 + +尽管代码示例是用 C 语言编写的,但安全高效的内存管理指南对于 C++ 是同样适用的。这两种语言在很多细节上有所不同(例如,C++ 具有 C 所缺乏的面向对象特性和泛型),但在内存管理方面面临的挑战是一样的。 + +### 执行中程序的内存概述 + +对于正在执行的程序(又名 _进程process_),内存被划分为三个区域:**stack**、**heap** 和 **静态区static area**。下文会给出每个区域的概述,以及完整的代码示例。 + +作为通用 CPU 寄存器的替补,_栈_ 为代码块(例如函数或循环体)中的局部变量提供暂存器存储。传递给函数的参数在此上下文中也视作局部变量。看一下下面这个简短的示例: + +``` +void some_func(int a, int b) { +   int n; +   ... +} +``` + +通过 `a` 和 `b` 传递的参数以及局部变量 `n` 的存储会在栈中,除非编译器可以找到通用寄存器。编译器倾向于优先将通用寄存器用作暂存器,因为 CPU 对这些寄存器的访问速度很快(一个时钟周期)。然而,这些寄存器在台式机、笔记本电脑和手持机器的标准架构上很少(大约 16 个)。 + +在只有汇编语言程序员才能看到的实施层面,栈被组织为具有 `push`(插入)和 `pop`(删除)操作的 LIFO(后进先出)列表。 `top` 指针可以作为偏移的基地址;这样,除了 `top` 之外的栈位置也变得可访问了。例如,表达式 `top+16` 指向堆栈的 `top` 指针上方 16 个字节的位置,表达式 `top-16` 指向 `top` 指针下方 16 个字节的位置。因此,可以通过 `top` 指针访问实现了暂存器存储的栈的位置。在标准的 ARM 或 Intel 架构中,栈从高内存地址增长到低内存地址;因此,减小某进程的 `top` 就是增大其栈规模。 + +使用栈结构就意味着轻松高效地使用内存。编译器(而非程序员)会编写管理栈的代码,管理过程通过分配和释放所需的暂存器存储来实现;程序员声明函数参数和局部变量,将实现过程交给编译器。此外,完全相同的栈存储可以在连续的函数调用和代码块(如循环)中重复使用。精心设计的模块化代码会将栈存储作为暂存器的首选内存选项,同时优化编译器要尽可能使用通用寄存器而不是栈。 + +**堆** 提供的存储是通过程序员代码显式分配的,堆分配的语法因语言而异。在 C 中,成功调用库函数 `malloc`(或其变体 `calloc` 等)会分配指定数量的字节(在 C++ 和 Java 等语言中,`new` 运算符具有相同的用途)。编程语言在如何释放堆分配的存储方面有着巨大的差异: + + * 在 Java、Go、Lisp 和 Python 等语言中,程序员不会显式释放动态分配的堆存储。 + + 例如,下面这个 Java 语句为一个字符串分配了堆存储,并将这个堆存储的地址存储在变量 `greeting` 中: + + ``` + String greeting = new String("Hello, world!"); + ``` + + Java 有一个垃圾回收器,它是一个运行时实用程序,如果进程无法再访问自己分配的堆存储,回收器可以使其自动释放。因此,Java 堆释放是通过垃圾收集器自动进行的。在上面的示例中,垃圾收集器将在变量 `greeting` 超出作用域后,释放字符串的堆存储。 + + * Rust 编译器会编写堆释放代码。这是 Rust 在不依赖垃圾回收器的情况下,使堆释放实现自动化的开创性努力,但这也会带来运行时复杂性和开销。向 Rust 的努力致敬! + * 在 C(和 C++)中,堆释放是程序员的任务。程序员调用 `malloc` 分配堆存储,然后负责相应地调用库函数 `free` 来释放该存储空间(在 C++ 中,`new` 运算符分配堆存储,而 `delete` 和 `delete[]` 运算符释放此类存储)。下面是一个 C 语言代码示例: + + ``` + char* greeting = malloc(14);       /* 14 heap bytes */ + strcpy(greeting, "Hello, world!"); /* copy greeting into bytes */ + puts(greeting);                    /* print greeting */ + free(greeting);                    /* free malloced bytes */ + ``` + + C 语言避免了垃圾回收器的成本和复杂性,但也不过是让程序员承担了堆释放的任务。 + +内存的 **静态区** 为可执行代码(例如 C 语言函数)、字符串文字(例如“Hello, world!”)和全局变量提供存储空间: + +``` +int n;                       /* global variable */ +int main() {                 /* function */ +   char* msg = "No comment"; /* string literal */ +   ... +} +``` + +该区域是静态的,因为它的大小从进程执行开始到结束都固定不变。由于静态区相当于进程固定大小的内存占用,因此经验法则是通过避免使用全局数组等方法来使该区域尽可能小。 + +下文会结合代码示例对本节概述展开进一步讲解。 + +### 栈存储 + +想象一个有各种连续执行的任务的程序,任务包括了处理每隔几分钟通过网络下载并存储在本地文件中的数字数据。下面的 `stack` 程序简化了处理流程(仅是将奇数整数值转换为偶数),而将重点放在栈存储的好处上。 + + +``` +#include +#include + +#define Infile   "incoming.dat" +#define Outfile  "outgoing.dat" +#define IntCount 128000  /* 128,000 */ + +void other_task1() { /*...*/ } +void other_task2() { /*...*/ } + +void process_data(const char* infile, +          const char* outfile, +          const unsigned n) { +  int nums[n]; +  FILE* input = fopen(infile, "r"); +  if (NULL == infile) return; +  FILE* output = fopen(outfile, "w"); +  if (NULL == output) { +    fclose(input); +    return; +  } + +  fread(nums, n, sizeof(int), input); /* read input data */ +  unsigned i; +  for (i = 0; i < n; i++) { +    if (1 == (nums[i] & 0x1))  /* odd parity? */ +      nums[i]--;               /* make even */ +  } +  fclose(input);               /* close input file */ + +  fwrite(nums, n, sizeof(int), output); +  fclose(output); +} + +int main() { +  process_data(Infile, Outfile, IntCount); +   +  /** now perform other tasks **/ +  other_task1(); /* automatically released stack storage available */ +  other_task2(); /* ditto */ +   +  return 0; +} +``` + +底部的 `main` 函数首先调用 `process_data` 函数,该函数会创建一个基于栈的数组,其大小由参数 `n` 给定(当前示例中为 128,000)。因此,该数组占用 `128000 * sizeof(int)` 个字节,在标准设备上达到了 512,000 字节(`int` 在这些设备上是四个字节)。然后数据会被读入数组(使用库函数 `fread`),循环处理,并保存到本地文件 `outgoing.dat`(使用库函数 `fwrite`)。 + +当 `process_data` 函数返回到其调用者 `main` 函数时,`process_data` 函数的大约 500MB 栈暂存器可供 `stack` 程序中的其他函数用作暂存器。在此示例中,`main` 函数接下来调用存根函数 `other_task1` 和 `other_task2`。这三个函数在 `main` 中依次调用,这意味着所有三个函数都可以使用相同的堆栈存储作为暂存器。因为编写栈管理代码的是编译器而不是程序员,所以这种方法对程序员来说既高效又容易。 + +在 C 语言中,在块(例如函数或循环体)内定义的任何变量默认都有一个 `auto` 存储类,这意味着该变量是基于栈的。存储类 `register` 现在已经过时了,因为 C 编译器会主动尝试尽可能使用 CPU 寄存器。只有在块内定义的变量可能是 `register`,如果没有可用的 CPU 寄存器,编译器会将其更改为 `auto`。基于栈的编程可能是不错的首选方式,但这种风格确实有一些挑战性。下面的 `badStack` 程序说明了这点。 + +``` +#include ; + +const int* get_array(const unsigned n) { +  int arr[n]; /* stack-based array */ +  unsigned i; +  for (i = 0; i < n; i++) arr[i] = 1 + 1; + +  return arr;  /** ERROR **/ +} + +int main() { +  const unsigned n = 16; +  const int* ptr = get_array(n); +   +  unsigned i; +  for (i = 0; i < n; i++) printf("%i ", ptr[i]); +  puts("\n"); + +  return 0; +} +``` + +`badStack` 程序中的控制流程很简单。`main` 函数使用 16(LCTT 译注:原文为 128,应为作者笔误)作为参数调用函数 `get_array`,然后被调用函数会使用传入参数来创建对应大小的本地数组。`get_array` 函数会初始化数组并返回给 `main` 中的数组标识符 `arr`。 `arr` 是一个指针常量,保存数组的第一个 `int` 元素的地址。 + +当然,本地数组 `arr` 可以在 `get_array` 函数中访问,但是一旦 `get_array` 返回,就不能合法访问该数组。尽管如此,`main` 函数会尝试使用函数 `get_array` 返回的堆栈地址 `arr` 来打印基于栈的数组。现代编译器会警告错误。例如,下面是来自 GNU 编译器的警告: + +``` +badStack.c: In function 'get_array': +badStack.c:9:10: warning: function returns address of local variable [-Wreturn-local-addr] +return arr;  /** ERROR **/ +``` + +一般规则是,如果使用栈存储实现局部变量,应该仅在该变量所在的代码块内,访问这块基于栈的存储(在本例中,数组指针 `arr` 和循环计数器 `i` 均为这样的局部变量)。因此,函数永远不应该返回指向基于栈存储的指针。 + +### 堆存储 + +接下来使用若干代码示例凸显在 C 语言中使用堆存储的优点。在第一个示例中,使用了最优方案分配、使用和释放堆存储。第二个示例(在下一节中)将堆存储嵌套在了其他堆存储中,这会使其释放操作变得复杂。 + +``` +#include +#include + +int* get_heap_array(unsigned n) { +  int* heap_nums = malloc(sizeof(int) * n);  +   +  unsigned i; +  for (i = 0; i < n; i++) +    heap_nums[i] = i + 1;  /* initialize the array */ +   +  /* stack storage for variables heap_nums and i released +     automatically when get_num_array returns */ +  return heap_nums; /* return (copy of) the pointer */ +} + +int main() { +  unsigned n = 100, i; +  int* heap_nums = get_heap_array(n); /* save returned address */ +   +  if (NULL == heap_nums) /* malloc failed */ +    fprintf(stderr, "%s\n", "malloc(...) failed..."); +  else { +    for (i = 0; i < n; i++) printf("%i\n", heap_nums[i]); +    free(heap_nums); /* free the heap storage */ +  } +  return 0;  +} +``` + +上面的 `heap` 程序有两个函数: `main` 函数使用参数(示例中为 100)调用 `get_heap_array` 函数,参数用来指定数组应该有多少个 `int` 元素。因为堆分配可能会失败,`main` 函数会检查 `get_heap_array` 是否返回了 `NULL`;如果是,则表示失败。如果分配成功,`main` 将打印数组中的 `int` 值,然后立即调用库函数 `free` 来对堆存储解除分配。这就是最优的方案。 + +`get_heap_array` 函数以下列语句开头,该语句值得仔细研究一下: + +``` +int* heap_nums = malloc(sizeof(int) * n); /* heap allocation */ +``` + +`malloc` 库函数及其变体函数针对字节进行操作;因此,`malloc` 的参数是 `n` 个 `int` 类型元素所需的字节数(`sizeof(int)` 在标准现代设备上是四个字节)。`malloc` 函数返回所分配字节段的首地址,如果失败则返回 `NULL` . + +如果成功调用 `malloc`,在现代台式机上其返回的地址大小为 64 位。在手持设备和早些时候的台式机上,该地址的大小可能是 32 位,或者甚至更小,具体取决于其年代。堆分配数组中的元素是 `int` 类型,这是一个四字节的有符号整数。这些堆分配的 `int` 的地址存储在基于栈的局部变量 `heap_nums` 中。可以参考下图: + +``` +                 heap-based + stack-based        / +     \        +----+----+   +----+ + heap-nums--->|int1|int2|...|intN| +              +----+----+   +----+ +``` + +一旦 `get_heap_array` 函数返回,指针变量 `heap_nums` 的栈存储将自动回收——但动态 `int` 数组的堆存储仍然存在,这就是 `get_heap_array` 函数返回这个地址(的副本)给 `main` 函数的原因:它现在负责在打印数组的整数后,通过调用库函数 `free` 显式释放堆存储: + +``` +free(heap_nums); /* free the heap storage */ +``` + +`malloc` 函数不会初始化堆分配的存储空间,因此里面是随机值。相比之下,其变体函数 `calloc` 会将分配的存储初始化为零。这两个函数都返回 `NULL` 来表示分配失败。 + +在 `heap` 示例中,`main` 函数在调用 `free` 后会立即返回,正在执行的程序会终止,这会让系统回收所有已分配的堆存储。尽管如此,程序员应该养成在不再需要时立即显式释放堆存储的习惯。 + +### 嵌套堆分配 + +下一个代码示例会更棘手一些。C 语言有很多返回指向堆存储的指针的库函数。下面是一个常见的使用情景: + +1、C 程序调用一个库函数,该函数返回一个指向基于堆的存储的指针,而指向的存储通常是一个聚合体,如数组或结构体: + +``` +SomeStructure* ptr = lib_function(); /* returns pointer to heap storage */ +``` + +2、 然后程序使用所分配的存储。 + +3、 对于清理而言,问题是对 `free` 的简单调用是否会清理库函数分配的所有堆分配存储。例如,`SomeStructure` 实例可能有指向堆分配存储的字段。一个特别麻烦的情况是动态分配的结构体数组,每个结构体有一个指向又一层动态分配的存储的字段。下面的代码示例说明了这个问题,并重点关注了如何设计一个可以安全地为客户端提供堆分配存储的库。 + +``` +#include +#include + +typedef struct { +  unsigned id; +  unsigned len; +  float*   heap_nums; +} HeapStruct; +unsigned structId = 1; + +HeapStruct* get_heap_struct(unsigned n) { +  /* Try to allocate a HeapStruct. */ +  HeapStruct* heap_struct = malloc(sizeof(HeapStruct)); +  if (NULL == heap_struct) /* failure? */ +    return NULL;           /* if so, return NULL */ + +  /* Try to allocate floating-point aggregate within HeapStruct. */ +  heap_struct->heap_nums = malloc(sizeof(float) * n); +  if (NULL == heap_struct->heap_nums) {  /* failure? */ +    free(heap_struct);                   /* if so, first free the HeapStruct */ +    return NULL;                         /* then return NULL */ +  } + +  /* Success: set fields */ +  heap_struct->id = structId++; +  heap_struct->len = n; + +  return heap_struct; /* return pointer to allocated HeapStruct */ +} + +void free_all(HeapStruct* heap_struct) { +  if (NULL == heap_struct) /* NULL pointer? */ +    return;                /* if so, do nothing */ +   +  free(heap_struct->heap_nums); /* first free encapsulated aggregate */ +  free(heap_struct);            /* then free containing structure */   +} + +int main() { +  const unsigned n = 100; +  HeapStruct* hs = get_heap_struct(n); /* get structure with N floats */ + +  /* Do some (meaningless) work for demo. */ +  unsigned i; +  for (i = 0; i < n; i++) hs->heap_nums[i] = 3.14 + (float) i; +  for (i = 0; i < n; i += 10) printf("%12f\n", hs->heap_nums[i]); + +  free_all(hs); /* free dynamically allocated storage */ +   +  return 0; +} +``` + +上面的 `nestedHeap` 程序示例以结构体 `HeapStruct` 为中心,结构体中又有名为 `heap_nums` 的指针字段: + +``` +typedef struct { +  unsigned id; +  unsigned len; +  float*   heap_nums; /** pointer **/ +} HeapStruct; +``` + +函数 `get_heap_struct` 尝试为 `HeapStruct` 实例分配堆存储,这需要为字段 `heap_nums` 指向的若干个 `float` 变量分配堆存储。如果成功调用 `get_heap_struct` 函数,并将指向堆分配结构体的指针以 `hs` 命名,其结果可以描述如下: + +``` +hs-->HeapStruct instance +        id +        len +        heap_nums-->N contiguous float elements +``` + +在 `get_heap_struct` 函数中,第一个堆分配过程很简单: + +``` +HeapStruct* heap_struct = malloc(sizeof(HeapStruct)); +if (NULL == heap_struct) /* failure? */ +  return NULL;           /* if so, return NULL */ +``` + +`sizeof(HeapStruct)` 包括了 `heap_nums` 字段的字节数(32 位机器上为 4,64 位机器上为 8),`heap_nums` 字段则是指向动态分配数组中的 `float` 元素的指针。那么,问题关键在于 `malloc` 为这个结构体传送了字节空间还是表示失败的 `NULL`;如果是 `NULL`,`get_heap_struct` 函数就也返回 `NULL` 以通知调用者堆分配失败。 + +第二步尝试堆分配的过程更复杂,因为在这一步,`HeapStruct` 的堆存储已经分配好了: + +``` +heap_struct->heap_nums = malloc(sizeof(float) * n); +if (NULL == heap_struct->heap_nums) {  /* failure? */ +  free(heap_struct);                   /* if so, first free the HeapStruct */ +  return NULL;                         /* and then return NULL */ +} +``` + +传递给 `get_heap_struct` 函数的参数 `n` 指明动态分配的 `heap_nums` 数组中应该有多少个 `float` 元素。如果可以分配所需的若干个 `float` 元素,则该函数在返回 `HeapStruct` 的堆地址之前会设置结构的 `id` 和 `len` 字段。 但是,如果尝试分配失败,则需要两个步骤来实现最优方案: + +1、 必须释放 `HeapStruct` 的存储以避免内存泄漏。对于调用 `get_heap_struct` 的客户端函数而言,没有动态 `heap_nums` 数组的 `HeapStruct` 可能就是没用的;因此,`HeapStruct` 实例的字节空间应该显式释放,以便系统可以回收这些空间用于未来的堆分配。 + +2、 返回 `NULL` 以标识失败。 + +如果成功调用 `get_heap_struct` 函数,那么释放堆存储也很棘手,因为它涉及要以正确顺序进行的两次 `free` 操作。因此,该程序设计了一个 `free_all` 函数,而不是要求程序员再去手动实现两步释放操作。回顾一下,`free_all` 函数是这样的: + +``` +void free_all(HeapStruct* heap_struct) { +  if (NULL == heap_struct) /* NULL pointer? */ +    return;                /* if so, do nothing */ +   +  free(heap_struct->heap_nums); /* first free encapsulated aggregate */ +  free(heap_struct);            /* then free containing structure */   +} +``` + +检查完参数 `heap_struct` 不是 `NULL` 值后,函数首先释放 `heap_nums` 数组,这步要求 `heap_struct` 指针此时仍然是有效的。先释放 `heap_struct` 的做法是错误的。一旦 `heap_nums` 被释放,`heap_struct` 就可以释放了。如果 `heap_struct` 被释放,但 `heap_nums` 没有被释放,那么数组中的 `float` 元素就会泄漏:仍然分配了字节空间,但无法被访问到——因此一定要记得释放 `heap_nums`。存储泄漏将一直持续,直到 `nestedHeap` 程序退出,系统回收泄漏的字节时为止。 + +关于 `free` 库函数的注意事项就是要有顺序。回想一下上面的调用示例: + +``` +free(heap_struct->heap_nums); /* first free encapsulated aggregate */ +free(heap_struct);            /* then free containing structure */ +``` + +这些调用释放了分配的存储空间——但它们并 _不是_ 将它们的操作参数设置为 `NULL`(`free` 函数会获取地址的副本作为参数;因此,将副本更改为 `NULL` 并不会改变原地址上的参数值)。例如,在成功调用 `free` 之后,指针 `heap_struct` 仍然持有一些堆分配字节的堆地址,但是现在使用这个地址将会产生错误,因为对 `free` 的调用使得系统有权回收然后重用这些分配过的字节。 + +使用 `NULL` 参数调用 `free` 没有意义,但也没有什么坏处。而在非 `NULL` 的地址上重复调用 `free` 会导致不确定结果的错误: + +``` +free(heap_struct);  /* 1st call: ok */ +free(heap_struct);  /* 2nd call: ERROR */ +``` + +### 内存泄漏和堆碎片化 + +“内存泄漏”是指动态分配的堆存储变得不再可访问。看一下相关的代码段: + +``` +float* nums = malloc(sizeof(float) * 10); /* 10 floats */ +nums[0] = 3.14f;                          /* and so on */ +nums = malloc(sizeof(float) * 25);        /* 25 new floats */ +``` + +假如第一个 `malloc` 成功,第二个 `malloc` 会再将 `nums` 指针重置为 `NULL`(分配失败情况下)或是新分配的 25 个 `float` 中第一个的地址。最初分配的 10 个 `float` 元素的堆存储仍然处于被分配状态,但此时已无法再对其访问,因为 `nums` 指针要么指向别处,要么是 `NULL`。结果就是造成了 40 个字节(`sizeof(float) * 10`)的泄漏。 + +在第二次调用 `malloc` 之前,应该释放最初分配的存储空间: + +``` +float* nums = malloc(sizeof(float) * 10); /* 10 floats */ +nums[0] = 3.14f;                          /* and so on */ +free(nums);                               /** good **/ +nums = malloc(sizeof(float) * 25);        /* no leakage */ +``` + +即使没有泄漏,堆也会随着时间的推移而碎片化,需要对系统进行碎片整理。例如,假设两个最大的堆块当前的大小分别为 200MB 和 100MB。然而,这两个堆块并不连续,进程 `P` 此时又需要分配 250MB 的连续堆存储。在进行分配之前,系统可能要对堆进行 _碎片整理_ 以给 `P` 提供 250MB 连续存储空间。碎片整理很复杂,因此也很耗时。 + +内存泄漏会创建处于已分配状态但不可访问的堆块,从而会加速碎片化。因此,释放不再需要的堆存储是程序员帮助减少碎片整理需求的一种方式。 + +### 诊断内存泄漏的工具 + +有很多工具可用于分析内存效率和安全性,其中我最喜欢的是 [valgrind][11]。为了说明该工具如何处理内存泄漏,这里给出 `leaky` 示例程序: + +``` +#include +#include + +int* get_ints(unsigned n) { +  int* ptr = malloc(n * sizeof(int)); +  if (ptr != NULL) { +    unsigned i; +    for (i = 0; i < n; i++) ptr[i] = i + 1; +  } +  return ptr; +} + +void print_ints(int* ptr, unsigned n) { +  unsigned i; +  for (i = 0; i < n; i++) printf("%3i\n", ptr[i]); +} + +int main() { +  const unsigned n = 32; +  int* arr = get_ints(n); +  if (arr != NULL) print_ints(arr, n); + +  /** heap storage not yet freed... **/ +  return 0; +} +``` + +`main` 函数调用了 `get_ints` 函数,后者会试着从堆中 `malloc` 32 个 4 字节的 `int`,然后初始化动态数组(如果 `malloc` 成功)。初始化成功后,`main` 函数会调用 `print_ints`函数。程序中并没有调用 `free` 来对应 `malloc` 操作;因此,内存泄漏了。 + +如果安装了 `valgrind` 工具箱,下面的命令会检查 `leaky` 程序是否存在内存泄漏(`%` 是命令行提示符): + +``` +% valgrind --leak-check=full ./leaky +``` + +绝大部分输出都在下面给出了。左边的数字 207683 是正在执行的 `leaky` 程序的进程标识符。这份报告给出了泄漏发生位置的详细信息,本例中位置是在 `main` 函数所调用的 `get_ints` 函数中对 `malloc` 的调用处。 + +``` +==207683== HEAP SUMMARY: +==207683==   in use at exit: 128 bytes in 1 blocks +==207683==   total heap usage: 2 allocs, 1 frees, 1,152 bytes allocated +==207683==  +==207683== 128 bytes in 1 blocks are definitely lost in loss record 1 of 1 +==207683==   at 0x483B7F3: malloc (in /usr/lib/x86_64-linux-gnu/valgrind/vgpreload_memcheck-amd64-linux.so) +==207683==   by 0x109186: get_ints (in /home/marty/gc/leaky) +==207683==   by 0x109236: main (in /home/marty/gc/leaky) +==207683==  +==207683== LEAK SUMMARY: +==207683==   definitely lost: 128 bytes in 1 blocks +==207683==   indirectly lost: 0 bytes in 0 blocks +==207683==   possibly lost: 0 bytes in 0 blocks +==207683==   still reachable: 0 bytes in 0 blocks +==207683==   suppressed: 0 bytes in 0 blocks +``` + +如果把 `main` 函数改成在对 `print_ints` 的调用之后,再加上一个对 `free` 的调用,`valgrind` 就会对 `leaky` 程序给出一个干净的内存健康清单: + +``` +==218462== All heap blocks were freed -- no leaks are possible +``` + +### 静态区存储 + +在正统的 C 语言中,函数必须在所有块之外定义。这是一些 C 编译器支持的特性,杜绝了在另一个函数体内定义一个函数的可能。我举的例子都是在所有块之外定义的函数。这样的函数要么是 `static` ,即静态的,要么是 `extern`,即外部的,其中 `extern` 是默认值。 + +C 语言中,以 `static` 或 `extern` 修饰的函数和变量驻留在内存中所谓的 **静态区** 中,因为在程序执行期间该区域大小是固定不变的。这两个存储类型的语法非常复杂,我们应该回顾一下。在回顾之后,会有一个完整的代码示例来生动展示语法细节。在所有块之外定义的函数或变量默认为 `extern`;因此,函数和变量要想存储类型为 `static` ,必须显式指定: + +``` +/** file1.c: outside all blocks, five definitions  **/ +int foo(int n) { return n * 2; }     /* extern by default */ +static int bar(int n) { return n; }  /* static */ +extern int baz(int n) { return -n; } /* explicitly extern */ + +int num1;        /* extern */ +static int num2; /* static */ +``` + +`extern` 和 `static` 的区别在于作用域:`extern` 修饰的函数或变量可以实现跨文件可见(需要声明)。相比之下,`static` 修饰的函数仅在 _定义_ 该函数的文件中可见,而 `static` 修饰的变量仅在 _定义_ 该变量的文件(或文件中的块)中可见: + +``` +static int n1;    /* scope is the file */ +void func() { +   static int n2; /* scope is func's body */ +   ... +} +``` + +如果在所有块之外定义了 `static` 变量,例如上面的 `n1`,该变量的作用域就是定义变量的文件。无论在何处定义 `static` 变量,变量的存储都在内存的静态区中。 + +`extern` 函数或变量在给定文件中的所有块之外定义,但这样定义的函数或变量也可以在其他文件中声明。典型的做法是在头文件中 _声明_ 这样的函数或变量,只要需要就可以包含进来。下面这些简短的例子阐述了这些棘手的问题。 + +假设 `extern` 函数 `foo` 在 `file1.c` 中 _定义_,有无关键字 `extern` 效果都一样: + +``` +/** file1.c **/ +int foo(int n) { return n * 2; } /* definition has a body {...} */ +``` + +必须在其他文件(或其中的块)中使用显式的 `extern` _声明_ 此函数才能使其可见。以下是使 `extern` 函数 `foo` 在文件 `file2.c` 中可见的声明语句: + +``` +/** file2.c: make function foo visible here **/ +extern int foo(int); /* declaration (no body) */ +``` + +回想一下,函数声明没有用大括号括起来的主体,而函数定义会有这样的主体。 + +为了便于查看,函数和变量声明通常会放在头文件中。准备好需要声明的源代码文件,然后就可以 `#include` 相关的头文件。下一节中的 `staticProg` 程序演示了这种方法。 + +至于 `extern` 的变量,规则就变得更棘手了(很抱歉增加了难度!)。任何 `extern` 的对象——无论函数或变量——必须 _定义_ 在所有块之外。此外,在所有块之外定义的变量默认为 `extern`: + +``` +/** outside all blocks **/ +int n; /* defaults to extern */ +``` + +但是,只有在变量的 _定义_ 中显式初始化变量时,`extern` 才能在变量的 _定义_ 中显式修饰(LCTT 译注:换言之,如果下列代码中的 `int n1;` 行前加上 `extern`,该行就由 _定义_ 变成了 _声明_): + +``` +/** file1.c: outside all blocks **/ +int n1;             /* defaults to extern, initialized by compiler to zero */ +extern int n2 = -1; /* ok, initialized explicitly */ +int n3 = 9876;      /* ok, extern by default and initialized explicitly */ +``` + +要使在 `file1.c` 中定义为 `extern` 的变量在另一个文件(例如 `file2.c`)中可见,该变量必须在 `file2.c` 中显式 _声明_ 为 `extern` 并且不能初始化(初始化会将声明转换为定义): + +``` +/** file2.c **/ +extern int n1; /* declaration of n1 defined in file1.c */ +``` + +为了避免与 `extern` 变量混淆,经验是在 _声明_ 中显式使用 `extern`(必须),但不要在 _定义_ 中使用(非必须且棘手)。对于函数,`extern` 在定义中是可选使用的,但在声明中是必须使用的。下一节中的 `staticProg` 示例会把这些点整合到一个完整的程序中。 + +### staticProg 示例 + +`staticProg` 程序由三个文件组成:两个 C 语言源文件(`static1.c` 和 `static2.c`)以及一个头文件(`static.h`),头文件中包含两个声明: + +``` +/** header file static.h **/ +#define NumCount 100               /* macro */ +extern int global_nums[NumCount];  /* array declaration */ +extern void fill_array();          /* function declaration */ +``` + +两个声明中的 `extern`,一个用于数组,另一个用于函数,强调对象在别处(“外部”)_定义_:数组 `global_nums` 在文件 `static1.c` 中定义(没有显式的 `extern`),函数 `fill_array` 在文件 `static2.c` 中定义(也没有显式的 `extern`)。每个源文件都包含了头文件 `static.h`。`static1.c` 文件定义了两个驻留在内存静态区域中的数组(`global_nums` 和 `more_nums`)。第二个数组有 `static` 修饰,这将其作用域限制为定义数组的文件 (`static1.c`)。如前所述, `extern` 修饰的 `global_nums` 则可以实现在多个文件中可见。 + +``` +/** static1.c **/ +#include +#include + +#include "static.h"             /* declarations */ + +int global_nums[NumCount];      /* definition: extern (global) aggregate */ +static int more_nums[NumCount]; /* definition: scope limited to this file */ + +int main() { +  fill_array(); /** defined in file static2.c **/ + +  unsigned i; +  for (i = 0; i < NumCount; i++) +    more_nums[i] = i * -1; + +  /* confirm initialization worked */ +  for (i = 0; i < NumCount; i += 10)  +    printf("%4i\t%4i\n", global_nums[i], more_nums[i]); +     +  return 0;   +} +``` + +下面的 `static2.c` 文件中定义了 `fill_array` 函数,该函数由 `main`(在 `static1.c` 文件中)调用;`fill_array` 函数会给名为 `global_nums` 的 `extern` 数组中的元素赋值,该数组在文件 `static1.c` 中定义。使用两个文件的唯一目的是凸显 `extern` 变量或函数能够跨文件可见。 + +``` +/** static2.c **/ +#include "static.h" /** declarations **/ + +void fill_array() { /** definition **/ +  unsigned i; +  for (i = 0; i < NumCount; i++) global_nums[i] = i + 2; +} +``` + +`staticProg` 程序可以用如下编译: + +``` +% gcc -o staticProg static1.c static2.c +``` + +### 从汇编语言看更多细节 + +现代 C 编译器能够处理 C 和汇编语言的任意组合。编译 C 源文件时,编译器首先将 C 代码翻译成汇编语言。这是对从上文 `static1.c` 文件生成的汇编语言进行保存的命令: + +``` +% gcc -S static1.c +``` + +生成的文件就是 `static1.s`。这是文件顶部的一段代码,额外添加了行号以提高可读性: + +``` +    .file    "static1.c"          ## line  1 +    .text                         ## line  2 +    .comm    global_nums,400,32   ## line  3 +    .local    more_nums           ## line  4 +    .comm    more_nums,400,32     ## line  5 +    .section    .rodata           ## line  6 +.LC0:                             ## line  7 +    .string    "%4i\t%4i\n"       ## line  8 +    .text                         ## line  9 +    .globl    main                ## line 10 +    .type    main, @function      ## line 11 +main:                             ## line 12 +... +``` + +诸如 `.file`(第 1 行)之类的汇编语言指令以句点开头。顾名思义,指令会指导汇编程序将汇编语言翻译成机器代码。`.rodata` 指令(第 6 行)表示后面是只读对象,包括字符串常量 `"%4i\t%4i\n"`(第 8 行),`main` 函数(第 12 行)会使用此字符串常量来实现格式化输出。作为标签引入(通过末尾的冒号实现)的 `main` 函数(第 12 行),同样也是只读的。 + +在汇编语言中,标签就是地址。标签 `main:`(第 12 行)标记了 `main` 函数代码开始的地址,标签 `.LC0:`(第 7 行)标记了格式化字符串开头所在的地址。 + +`global_nums`(第 3 行)和 `more_nums`(第 4 行)数组的定义包含了两个数字:400 是每个数组中的总字节数,32 是每个数组(含 100 个 `int` 元素)中每个元素的比特数。(第 5 行中的 `.comm` 指令表示 `common name`,可以忽略。) + +两个数组定义的不同之处在于 `more_nums` 被标记为 `.local`(第 4 行),这意味着其作用域仅限于其所在文件 `static1.s`。相比之下,`global_nums` 数组就能在多个文件中实现可见,包括由 `static1.c` 和 `static2.c` 文件翻译成的汇编文件。 + +最后,`.text` 指令在汇编代码段中出现了两次(第 2 行和第 9 行)。术语“text”表示“只读”,但也会涵盖一些读/写变量,例如两个数组中的元素。尽管本文展示的汇编语言是针对 Intel 架构的,但 Arm6 汇编也非常相似。对于这两种架构,`.text` 区域中的变量(本例中为两个数组中的元素)会自动初始化为零。 + +### 总结 + +C 语言中的内存高效和内存安全编程准则很容易说明,但可能会很难遵循,尤其是在调用设计不佳的库的时候。准则如下: + + * 尽可能使用栈存储,进而鼓励编译器将通用寄存器用作暂存器,实现优化。栈存储代表了高效的内存使用并促进了代码的整洁和模块化。永远不要返回指向基于栈的存储的指针。 + * 小心使用堆存储。C(和 C++)中的重难点是确保动态分配的存储尽快解除分配。良好的编程习惯和工具(如 `valgrind`)有助于攻关这些重难点。优先选用自身提供释放函数的库,例如 `nestedHeap` 代码示例中的 `free_all` 释放函数。 + * 谨慎使用静态存储,因为这种存储会自始至终地影响进程的内存占用。特别是尽量避免使用 `extern` 和 `static` 数组。 + +本文 C 语言代码示例可在我的网站()上找到。 + +-------------------------------------------------------------------------------- + +via: https://opensource.com/article/21/8/memory-programming-c + +作者:[Marty Kalin][a] +选题:[lujun9972][b] +译者:[unigeorge](https://github.com/unigeorge) +校对:[wxy](https://github.com/wxy) + +本文由 [LCTT](https://github.com/LCTT/TranslateProject) 原创编译,[Linux中国](https://linux.cn/) 荣誉推出 + +[a]: https://opensource.com/users/mkalindepauledu +[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 (Code going into a computer.) +[2]: http://www.opengroup.org/onlinepubs/009695399/functions/fopen.html +[3]: http://www.opengroup.org/onlinepubs/009695399/functions/fclose.html +[4]: http://www.opengroup.org/onlinepubs/009695399/functions/fread.html +[5]: http://www.opengroup.org/onlinepubs/009695399/functions/fwrite.html +[6]: http://www.opengroup.org/onlinepubs/009695399/functions/printf.html +[7]: http://www.opengroup.org/onlinepubs/009695399/functions/puts.html +[8]: http://www.opengroup.org/onlinepubs/009695399/functions/malloc.html +[9]: http://www.opengroup.org/onlinepubs/009695399/functions/fprintf.html +[10]: http://www.opengroup.org/onlinepubs/009695399/functions/free.html +[11]: https://www.valgrind.org/ diff --git a/published/202110/20210818 below- a time traveling resource monitor.md b/published/202110/20210818 below- a time traveling resource monitor.md new file mode 100644 index 0000000000..7212fecec1 --- /dev/null +++ b/published/202110/20210818 below- a time traveling resource monitor.md @@ -0,0 +1,110 @@ +[#]: subject: "below: a time traveling resource monitor" +[#]: via: "https://fedoramagazine.org/below-a-time-traveling-resource-monitor/" +[#]: author: "Daniel Xu https://fedoramagazine.org/author/dxuu/" +[#]: collector: "lujun9972" +[#]: translator: "wxy" +[#]: reviewer: "wxy" +[#]: publisher: "wxy" +[#]: url: "https://linux.cn/article-13854-1.html" + +Below:一个时间旅行的资源监控器 +====== + +![](https://img.linux.net.cn/data/attachment/album/202110/06/093522hdsb82nm1cb4b4b6.jpg) + +在这篇文章中,我们将介绍 `below`:一个用于现代 Linux 系统的 Apache 2.0 许可的资源监视器。`below` 可以让你重放以前记录的数据。 + +![][1] + +### 背景 + +内核的主要职责之一是调度对资源的访问。有时这可能意味着分配物理内存,使多个进程可以共享同一主机。其他时候,它可能意味着确保 CPU 时间的公平分配。在这些场景里,内核提供了机制,而将策略留给了“别人”。近来,这个“别人”通常是 systemd 或 dockerd 这样的运行时。运行时接受来自调度器或最终用户的输入(类似于运行什么和如何运行)并在内核上转动正确的旋钮和拉动正确的杠杆,从而使工作负载能够*好好*工作。 + +在一个完美的世界里,故事就到此结束了。然而,现实情况是,资源管理是一个复杂的、相当不透明的技术混合体,在几十年里计算技术不断发展。尽管其中一些技术有各种缺陷和死角,但最终的结果是,容器运作得比较好。虽然用户通常不需要关心这些细节,但对于基础设施运营商来说,对他们的技术架构拥有可见性是至关重要的。可见性和可调试性对于检测和调查错误的配置、问题和系统性故障至关重要。 + +让事情变得更加复杂的是,资源中断往往难以重现。经常需要花费数周时间等待一个问题重新出现,以便调查其根本原因。规模的扩大进一步加剧了这个问题:我们不能在*每台*主机上运行一个自定义脚本,希望在错误再次发生时记录下关键状态的片段。因此,需要更复杂的工具。这就出现了 `below`。 + +### 动机 + +历史上,Facebook 一直是 [atop][5] 的忠实用户。`atop` 是一个用于 Linux 的性能监视器,能够报告所有进程的活动以及各种系统级活动。与 `htop` 等工具相比,`atop` 最引人注目的功能之一是能够作为一个守护程序记录历史数据。这听起来是一个简单的功能,但在实践中,这使得调试无数的生产问题成为可能。有了足够长的数据保留,就有可能在时间上回溯,查看在问题或故障发生之前、期间和之后的主机状态。 + +不幸的是,随着时间的推移,人们发现`atop` 有某些不足之处。首先,[控制组][6]cgroup 已经成为控制和监视 Linux 机器上资源的实际方式。`atop` 仍然缺乏对这一基本构建模块的支持。第二,`atop` 用自定义的 delta 压缩方法在磁盘上存储数据。这在正常情况下运行良好,但在沉重的资源压力下,主机很可能会丢失数据点。由于使用了 delta 压缩,在数据最重要的时间段内,数据可能会大面积丢失。第三,用户体验有一个陡峭的学习曲线。我们经常听到 `atop` 的资深用户说,他们喜欢密集的布局和众多的键盘绑定。然而,这也是一把双刃剑。当一个刚进入这个领域的人想要调试一个生产问题时,他们现在要同时解决两个问题:手头的问题和如何使用 `atop`。 + +`below` 是由 Facebook 的资源控制团队为其设计和开发的,并得到了 `atop` 生产环境用户的支持。顾名思义,资源控制团队负责的是规模化的资源管理。该团队由内核开发人员、容器运行时开发人员和硬件人员组成。认识到下一代系统监控器的机会,我们在设计 `below` 时考虑到以下几点: + + * 易用性:`below` 必须既能为新用户提供直观的体验,又能为日常用户提供强大的功能。 + *有意义的统计数据:`below` 显示准确和有用的统计数据。即便可以,但我们尽量避免收集和倾倒统计数字。 + * 灵活性:当默认设置不合适时,我们允许用户自定义他们的体验。例如包括可配置的键绑定、可配置的默认视图,以及脚本界面(默认为终端用户接口)。 + +### 安装 + +安装该软件包: + +``` +# dnf install -y below +``` + +打开记录守护进程: + +``` +# systemctl enable --now below +``` + +### 快速介绍 + +`below` 最常用的模式是重放模式。顾名思义,重放模式是重放以前记录的数据。假设你已经启动了记录守护程序,那么通过运行以下程序启动一个会话: + +``` +$ below replay --time "5 minutes ago" +``` + +然后你会看到控制组视图: + +![][2] + +如果你不知道该怎么操作,或者忘记了一个键位,按 `?` 可以进入帮助菜单。 + +屏幕的最上方是状态栏。状态栏显示关于当前样本的信息。你可以通过按 `t` 和 `T` 分别向前和向后移动样本。中间的部分是系统概览。系统概览包含了关于整个系统的统计数据,一般来说,这些数据总是很有用的。第三部分也是最下面的部分是多用途视图。上面的图片显示了控制组视图。此外,还有进程和系统视图,分别通过按 `p` 和` s` 来访问。 + +按 `↑` 和 `↓` 来移动列表选择。按回车键来折叠和展开控制组。假设你发现了一个感兴趣的控制组,你想看看它里面有哪些进程在运行。要放大进程视图,选择控制组并按 `z`: + +![][3] + +再按 `z` 返回到控制组视图。这个视图有时会有点长。如果你对你要找的东西有一个模糊的概念,你可以通过按 `/` 并输入一个过滤器来过滤控制组名称。 + +![][4] + +在这一点上,你可能已经注意到了一个我们还没有探索过的标签系统。要在标签中向前和向后循环,可以分别按 `Tab` 和 `Shift` + `Tab`。我们把这个问题留给读者去做练习。 + +### 其他功能 + +在底层,`below` 有一个强大的设计和架构。Facebook 正在不断升级到更新的内核,所以我们从不假设数据源是可用的。这种默契的假设使得内核和 `below `版本之间能够完全向前和向后兼容。此外,每个数据点都用 zstd 压缩并完整地存储。这解决了我们看到的 `atop` 在大规模时的 delta 压缩问题。根据我们的测试,我们的每个样本压缩可以达到平均 5 倍的压缩率。 + +`below` 也使用 [eBPF][8] 来收集关于短暂进程(生存时间短于数据收集间隔的进程)的信息。相比之下,`atop` 使用 BSD 进程核算来实现这一功能,这是一个已知缓慢且容易发生优先级转换的内核接口。 + +对于用户来说,`below` 还支持实时模式和一个转储接口。实时模式将记录守护程序和 TUI 会话合并到一个进程中。这对于浏览系统状态是很方便的,不需要为数据存储投入长期运行的守护程序或磁盘空间。转储接口是一个可编写脚本的接口,用于所有的 `below` 数据存储。转储既强大又灵活,详细的数据以 CSV、JSON 和人类可读格式提供。 + +### 总结 + +`below` 是一个 Apache 2.0 许可的开源项目,我们(`below` 的开发者)认为它比资源监控领域的现有工具具有引人注目的优势。我们已经花了大量的精力来准备 `below`,以提供开源使用,所以我们希望读者和社区有机会尝试 `below`,并报告错误和功能要求。 + +-------------------------------------------------------------------------------- + +via: https://fedoramagazine.org/below-a-time-traveling-resource-monitor/ + +作者:[Daniel Xu][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://fedoramagazine.org/author/dxuu/ +[b]: https://github.com/lujun9972 +[1]: https://fedoramagazine.org/wp-content/uploads/2021/08/below_resource_monitor-816x345.jpg +[2]: https://fedoramagazine.org/wp-content/uploads/2021/08/image-1024x800.png +[3]: https://fedoramagazine.org/wp-content/uploads/2021/08/image-1-1024x800.png +[4]: https://fedoramagazine.org/wp-content/uploads/2021/08/image-2-1024x800.png +[5]: +[6]: +[7]: \ No newline at end of file diff --git a/published/202110/20210907 How to use BusyBox on Linux.md b/published/202110/20210907 How to use BusyBox on Linux.md new file mode 100644 index 0000000000..3b2744163a --- /dev/null +++ b/published/202110/20210907 How to use BusyBox on Linux.md @@ -0,0 +1,181 @@ +[#]: subject: "How to use BusyBox on Linux" +[#]: via: "https://opensource.com/article/21/8/what-busybox" +[#]: author: "Seth Kenlon https://opensource.com/users/seth" +[#]: collector: "lujun9972" +[#]: translator: "wxy" +[#]: reviewer: "wxy" +[#]: publisher: "wxy" +[#]: url: "https://linux.cn/article-13840-1.html" + +如何在 Linux 上使用 BusyBox +====== + +> BusyBox 是一个开源(GPL)项目,提供了近 400 个常用命令的简单实现。 + +![](https://img.linux.net.cn/data/attachment/album/202110/01/185208x6ckkmvi0silk3vk.jpg) + +我们很容易认为 Linux 的命令是理所当然的。当你安装 Linux 时,它们与系统捆绑在一起,而我们常常不问为什么它们会在那里。一些基本的命令,如 [cd][2]、[kill][3] 和 echo,并不总是独立的应用程序,而是实际上内置于你的 shell 中。其他如 [ls][4]、[mv][5] 和 [cat][6] 是核心工具包(通常是 GNU `coreutils`)的一部分。但在开源的世界里,总是有一些替代品,其中最有趣的是 [BusyBox][7]。 + +### Linux 中的 BusyBox 简介 + +BusyBox 是一个开源(GPL)项目,提供近 400 个常用命令的简单实现,包括 `ls`、`mv`、`ln`、`mkdir`、`more`、`ps`、`gzip`、`bzip2`、`tar` 和 `grep`。它还包含了编程语言 `awk`、流编辑器 `sed`、文件系统检查工具 `fsck`、`rpm` 和 `dpkg` 软件包管理器,当然还有一个可以方便的访问所有这些命令的 shell(`sh`)。简而言之,它包含了所有 POSIX 系统需要的基本命令,以执行常见的系统维护任务以及许多用户和管理任务。 + +事实上,它甚至包含一个 `init` 命令,可以作为 PID 1 启动,以作为所有其它系统服务的父进程。换句话说,BusyBox 可以作为 [systemd][8]、OpenRC、sinit、init 和其他初始化系统的替代品。 + +BusyBox 非常小。作为一个可执行文件,它不到 1MB,所以它在 [嵌入式][9]、[边缘计算][10] 和 [物联网][11] 领域很受欢迎,因为这些场景的存储空间是很宝贵的。在容器和云计算的世界里,它作为精简的 Linux 容器镜像的基础镜像也很受欢迎。 + +### 极简主义 + +BusyBox 的部分魅力在于它的极简主义。它的所有命令都被编译到一个二进制文件里(`busybox`),它的手册只有 81 页(根据我对 `man` 送到 `pr` 管道的计算),但它涵盖了近 400 条命令。 + +作为一个例子的比较,这是 “原版” 的 `useradd —help` 的输出: + +``` + -b, --base-dir BASE_DIR       base directory for home + -c, --comment COMMENT         GECOS field of the new account + -d, --home-dir HOME_DIR       home directory of the new account + -D, --defaults                print or change the default config + -e, --expiredate EXPIRE_DATE  expiration date of the new account + -f, --inactive INACTIVE       password inactivity + -g, --gid GROUP               name or ID of the primary group + -G, --groups GROUPS           list of supplementary groups + -h, --help                    display this help message and exit + -k, --skel SKEL_DIR           alternative skeleton dir + -K, --key KEY=VALUE           override /etc/login.defs + -l, --no-log-init             do not add the user to the lastlog + -m, --create-home             create the user's home directory + -M, --no-create-home          do not create the user's home directory + -N, --no-user-group           do not create a group with the user's name + -o, --non-unique              allow users with non-unique UIDs + -p, --password PASSWORD       encrypted password of the new account + -r, --system                  create a system account + -R, --root CHROOT_DIR         directory to chroot into + -s, --shell SHELL             login shell of the new account + -u, --uid UID                 user ID of the new account + -U, --user-group              create a group with the same name as a user +``` + +而这是是同一命令的 BusyBox 版本: + +``` + -h DIR    Home directory + -g GECOS  GECOS field + -s SHELL  Login shell + -G GRP    Group + -S            Create a system user + -D            Don't assign a password + -H            Don't create home directory + -u UID    User id + -k SKEL   Skeleton directory (/etc/skel) +``` + +这种差异是一种特性还是一种限制,取决于你是喜欢你的命令拥有 20 个选项还是 10 个选项。对于一些用户和某些用例来说,BusyBox 的极简主义刚刚满足所需。对于其他人来说,它是一个很好的最小化环境,可以作为一个后备工具,或者作为安装更强大的工具的基础,比如 [Bash][12]、[Zsh][13]、GNU [Awk][14] 等等。 + +### 安装 BusyBox + +在 Linux 上,你可以使用你的软件包管理器安装 BusyBox。例如,在 Fedora 及类似发行版: + +``` +$ sudo dnf install busybox +``` + +在 Debian 及其衍生版: + +``` +$ sudo apt install busybox +``` + +在 MacOS 上,可以使用 [MacPorts][15] 或 [Homebrew][16]。在 Windows 上,可以使用 [Chocolatey][17]。 + +你可以将 BusyBox 设置为你的 shell,使用 `chsh —shell` 命令,然后再加上 BusyBox `sh` 应用程序的路径。我把 BusyBox 放在 `/lib64` 中,但它的位置取决于你的发行版的安装位置。 + +``` +$ which busybox +/lib64/busybox/busybox +$ chsh --shell /lib64/busybox/sh +``` + +用 BusyBox 全盘替换所有常见的命令要复杂一些,因为大多数发行版都是“硬接线”,会在特定的软件包寻找特定的命令。换句话说,虽然技术上可以用 BusyBox 的 `init` 替换系统的 `init`,但你的软件包管理器可能会拒绝让你删除包含 `init` 的软件包,以免你担心删除会导致系统无法启动。有一些发行版是建立在 BusyBox 之上的,所以从新环境开始可能是体验 BusyBox 系统的最简单方法。 + +### 试试 BusyBox + +你不必为了尝试 BusyBox 而将你的 shell 永久改为 BusyBox。你可以从你当前的 shell 中启动一个 BusyBox shell。 + +``` +$ busybox sh +~ $ +``` + +不过你的系统仍然有安装的非 BusyBox 版本的命令,所以要体验 BusyBox 的工具,你必须把命令作为参数发给 `busybox` 可执行文件: + +``` +~ $ busybox echo $0 +sh +~ $ busybox ls --help +BusyBox vX.YY.Z (2021-08-25 07:31:48 NZST) multi-call binary. + +Usage: ls [-1AaCxdLHRFplinshrSXvctu] [-w WIDTH] [FILE]... + +List directory contents + + -1  One column output + -a  Include entries that start with . + -A  Like -a, but exclude . and .. + -x  List by lines +[...] +``` + +为了获得“完整”的 BusyBox 体验,你可以为每个命令创建一个 `busybox` 的符号链接。这很容易,只要你使用 [for 循环][18] 就行: + +``` +$ mkdir bbx +$ for i in $(bbx --list); do \ + ln -s /path/to/busybox bbx/$i \ +done +``` + +在你的 [路径][19] 的 _开头_ 添加这个符号链接目录,并启动 BusyBox: + +``` +$ PATH=$(pwd)/bbx:$PATH bbx/sh +``` + +### 用起来 + +BusyBox 是一个有趣的项目,也是一个可以实现 _极简_ 计算的例子。无论你是把 BusyBox 作为 [你唤醒的][21] [古老的计算机][20] 的轻量级环境,还是作为 [嵌入式设备][22] 的用户界面,抑或试用一个新的初始化系统,就算是为了好奇,让自己重新认识那些熟悉而又陌生的命令,都会很有意思。 + +-------------------------------------------------------------------------------- + +via: https://opensource.com/article/21/8/what-busybox + +作者:[Seth Kenlon][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/seth +[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/8/navigate-linux-directories +[3]: https://opensource.com/article/18/5/how-kill-process-stop-program-linux +[4]: https://opensource.com/article/19/7/master-ls-command +[5]: https://opensource.com/article/19/8/moving-files-linux-depth +[6]: https://opensource.com/article/19/2/getting-started-cat-command +[7]: https://www.busybox.net +[8]: https://opensource.com/article/20/4/systemd +[9]: https://opensource.com/article/21/3/rtos-embedded-development +[10]: https://opensource.com/article/17/9/what-edge-computing +[11]: https://opensource.com/article/21/3/iot-measure-raspberry-pi +[12]: https://opensource.com/article/20/4/bash-sysadmins-ebook +[13]: https://opensource.com/article/19/9/getting-started-zsh +[14]: https://opensource.com/article/20/9/awk-ebook +[15]: https://opensource.com/article/20/11/macports +[16]: https://opensource.com/article/20/6/homebrew-mac +[17]: https://opensource.com/article/20/3/chocolatey +[18]: https://opensource.com/article/19/10/programming-bash-loops +[19]: https://opensource.com/article/17/6/set-path-linux +[20]: https://opensource.com/article/20/2/restore-old-computer-linux +[21]: https://opensource.com/article/19/7/how-make-old-computer-useful-again +[22]: https://opensource.com/article/20/6/open-source-rtos diff --git a/published/202110/20210911 Play with model trains in OpenTTD.md b/published/202110/20210911 Play with model trains in OpenTTD.md new file mode 100644 index 0000000000..d07f1699f9 --- /dev/null +++ b/published/202110/20210911 Play with model trains in OpenTTD.md @@ -0,0 +1,200 @@ +[#]: subject: "Play with model trains in OpenTTD" +[#]: via: "https://opensource.com/article/21/9/model-trains-openttd" +[#]: author: "Seth Kenlon https://opensource.com/users/seth" +[#]: collector: "lujun9972" +[#]: translator: "unigeorge" +[#]: reviewer: "wxy" +[#]: publisher: "wxy" +[#]: url: "https://linux.cn/article-13924-1.html" + +在 OpenTTD 中玩模型火车 +====== + +> 想玩实体模型火车,却没有足够大的空间?试试 OpenTTD 中的虚拟火车吧。 + +![](https://img.linux.net.cn/data/attachment/album/202110/27/100255emc3x33icci0cacc.jpg) + +我父亲一直很喜欢火车模型,我记得我小时候,曾看着他在圣诞树周围建了一整条轨道。当 [乐高][2] 火车套装发布时,因其便利性和固有可扩展性,我们转而投向了乐高火车的怀抱。多年来,我们热衷于建造和改装乐高火车及单轨轨道。我经常想象,未来我会有一个车库或地下室,专门用于微型景观和电动汽笛火车。强调一下,我沉迷于另一个爱好的可能性非常低,所以当发现 _虚拟_ 模型铁路可以为我提供相同的满足感时,我很开心。我的虚拟爱好引擎是 [OpenTTD][3],这是一款基于名为 **Transport Tycoon Deluxe** 的 90 年代老游戏的开源模拟游戏。 + +### 安装 OpenTTD + +你可以在 [openttd.org/downloads][4] 下载适用于 Linux、macOS 和 Windows 的 OpenTTD。 + +如果你正使用 Debian Linux 或其衍生产品,甚至是[在使用 Chromebook][5],你可以下载 `.deb` 包。使用 `apt` 命令安装它: + +``` +$ sudo apt install ./openttd*deb +``` + +如果你在使用其他 Linux 发行版,请下载通用安装程序,并使用 [tar 命令][6]解压缩包: + +``` +$ tar xvf openttd-x.yy.z-linux*.tar.xz +``` + +OpenTTD 已经在 Linux、macOS 和 Windows 的 [Steam][7] 中上架(Steam 是一个非开源的,但是很常见的跨平台游戏客户端)。 + +### 启动 OpenTTD + +如果你安装了 OpenTTD,可以从应用程序菜单启动它。 + +如果你是下载了通用包,可以切换到游戏目录,使用本地的 `openttd` 命令启动游戏: + +``` +$ cd openttd* +$ ./openttd & +``` + +首次启动 OpenTTD 时,游戏会提示必须下载图像集,在 Steam 版中会自动安装,但在独立应用程序中需要单击一下鼠标。无论如何,因为 OpenTTD 是开源的,经过了很好的改进,所以在默认图像之外,你最终还会下载的还有很多其他图像。 + +下载图像集后,你会看到一个古色古香的小型界面。我觉得 640x480 的界面有点小,虽然旧图像界面确实更有年代感(那时计算能力还比较弱),但一些适配现代屏幕的轻度升级还是很好用的。因此,你的第一步操作就是点击“检查在线内容Check online content”按钮。 + +### 加载模组 + +“内容下载Content downloading”界面是一个查看已通过审查的 OpenTTD 模组mod的窗口,可以提供个性化的改进图像界面、全新音乐、火车模型和地图名称。我使用了新西兰全套配置,所以对我来说,生成的所有城市都很熟悉,尽管 2020 年我转而开始使用“辐射 3”套装了。模组 _非常多_,可以使用右上角的搜索栏来缩小选择范围。 + +下面是一些个人认为必备的模组: + + * **abase** - 高分辨率图像。将近 300 MB,这可能是你玩此游戏需要的最大一次下载(游戏本身只有 50 MB)。 + * **OpenSFX** - 一个声音合集。让你能听到城市中的交通声、船运的喇叭声以及很棒的火车汽笛声。 + * **Town names** - 城镇名称。默认的城市名称很有趣,但我认为记一些本地化的名称更容易。 + * **Trains** - 火车模组。OpenTTD 有一组运行良好的默认火车模型,但如果你已经是一名火车观察员,那你可能会喜欢下载一些额外的火车模型。我使用的是 NZR 火车合集,但还有很多火车也是可用的,包括来自英国、美国、奥地利、比利时、捷克共和国的车,以及按字母表顺序排列的许多其他火车。 + * **Beginner tutorial** - 新手教程。是一个帮你学习游戏及界面的引导场景。 + +### 游戏引擎默认值 + +下载新素材后,你需要将它们设置为默认值。有两个设置的地方:游戏引擎默认值、游戏内脚本与素材。 + +![OpenTTD main menu][8] + +*OpenTTD 菜单(Seth Kenlon, [CC BY-SA 4.0][9])* + +单击“游戏选项Game Options”按钮。 在游戏选项屏幕中,调整以下设置: + + * 将屏幕分辨率screen resolution设置为你喜欢的界面尺寸。 + * 将基础图像集 base graphics set设置为 **abase**。 + * 将基础声音设置base sounds set设置为 **OpenSFX**。 + +关闭游戏选项屏幕。你的改动会自动保存。 + +### 游戏选项 + +在主菜单界面,单击“NewGRF 设置NewGRF Settings”按钮。 + +![NewGRF settings window][10] + +*NewGRF 设置菜单(Seth Kenlon, [CC BY-SA 4.0][9])* + +未活动的模组显示在 NewGRF 设置窗口的下半部分。要激活一个未活动的模组,请选择它并单击左下角的“添加Add”按钮。选择要激活的模组后,再单击“应用Apply”按钮。 + +### 教程 + +如果你下载了“初学者教程Beginner tutorial”场景,可以通过它来学习 OpenTTD。开始教程请单击主菜单屏幕顶部附近的“播放场景Play scenario” 按钮,然后选择该教程并开始。 + +初学者教程有着游戏界面的完整浏览流程,全部完成需要花费一些时间。 + +### 快速开始 + +现在我们快速介绍一下,此处你要了解以下内容:车辆出自仓库,一切活动都需要时间表。记住这两条规则,你可以立即开始建造火车(以及道路、海港和机场)。 + +#### 建造车站 + +要在两个城市之间建立一条简单的铁路线,请单击顶部图标栏中的铁路轨道图标。 + +![New icon bar - railway option][11] + +*新建图标栏——铁路选项(Seth Kenlon, [CC BY-SA 4.0][9])* + +铁路以车站开始和结束,所以我通常在预定线路的两端各放置一个车站。单击火车站图标(将鼠标悬停在其上方可查看其标签)。一个火车站要服务于一个地区,其作用范围必须与该地区尽量多地重叠。要查看车站的覆盖范围,请通过单击车站对话框底部的“开启On”按钮以启用覆盖区域高亮Coverage area highlight功能。 + +![Station coverage window][12] + +*车站覆盖信息窗口(Seth Kenlon, [CC BY-SA 4.0][9])* + +黑色网格表示覆盖范围,而白色网格显示车站的物理占据范围。当你将鼠标悬停在一个区域上时,车站的覆盖范围所需耗材会在弹出窗口中列出。从简单的开始,创建一个单轨 4 辆车的站台。在地图上的两个城市之间重复执行此操作两次。 + +![create station menu][13] + +*创建车站菜单(Seth Kenlon, [CC BY-SA 4.0][9])* + +### 铺设铁轨 + +接下来,用铁轨连接车站。 OpenTTD 的等距视图需要一些时间来适应,但是在单击铁路图标并在地图上单击拖动之后,你就开始大概有所了解了。X-rail 图标提供了“自动轨道”模式,该模式会根据用户单击的方块位置对齐轨道。 + +铺设导轨时要细心。OpenTTD 是不可撤回的,所以一旦点击一个正方形,轨道就会被构造出来。你必须使用炸药图标来移除导轨。和现实生活中一样,没有撤消按钮。 + +### 火车车库 + +火车来自车库depot。因此,要在铁路上添加火车,必须在沿线的某处添加一个车库。单击车库图标并在现有铁路附近放置。将车库连接到现有轨道,以确保你的火车可以从车库到达适当线路的(在此简单示例中,线路是唯一的)。 + +![create depot menu][14] + +*建造车库菜单(Seth Kenlon, [CC BY-SA 4.0][9])* + +### 模型火车 + +终于,你可以将虚拟模型火车添加到虚拟铁路中了。要创建火车,请单击车库。 + +单击站点窗口底部的“新建车辆New Vehicle”按钮,会列出可用的火车引擎和汽车。列表会部分取决于你从可下载内容中添加的模型。一般来说,发动机分为三种:蒸汽发动机、柴油发动机和电动发动机。游戏内时间从 1950 年开始,所以早期你只有蒸汽可选。随着时间推进,你会获得可用于升级的创新型新模型。 + +![create train menu][15] + +*创建火车菜单(Seth Kenlon, [CC BY-SA 4.0][9])* + +现在创建一个简单的火车,其中包括一节引擎、一节客车和一节邮车。如果想添加其他类型的车厢,请单击站点以确认它们的可提供车型(由其覆盖区域决定) + +### 创建火车时刻表 + +现在有了铁路和火车,还需要创建一个火车时刻表。时间表与车辆关联,因此无论何时添加新车,都要记得添加时间表,以让新车投入使用。 + +要为火车添加时刻表,请单击其车库列表中列车左侧的编号。这样可以打开火车视口,窗口右侧会有按钮。单击箭头图标即可查看该列车的时刻表。 + +![create schedule menu][16] + +*创建时刻表菜单(Seth Kenlon, [CC BY-SA 4.0][9])* + +要创建时间表,请单击时间表窗口底部的“前往Go To”按钮,然后单击要设置成第一个目的地的车站。然后点击下一站。你可以在时间表中选择一个停靠点,浏览“满载Full load”和“卸载Unload”下拉菜单中的选项,以此调整装卸要求,并且可以在“无停靠Non-stop”下拉菜单中调整路线(如果开发了新路线)。选项有很多,随着城市发展和地图完善,你可能需要随时调整策略。 + +但是现在,单击火车视口底部的红色“已停止Stopped”按钮,让火车投入使用吧! + +![train moving from station to station][17] + +*在役中的火车(Seth Kenlon, [CC BY-SA 4.0][9])* + +### 试试 OpenTTD 吧 + +OpenTTD 是一个模拟器,同时也是一个游戏,所以确实会有一些限制,比如你可能想要优化的预算和参数。例如,你可以单击一个城市、农场或工厂,了解其可接受的进出口类型。你可以通过单击 OpenTTD 窗口右下角的预算按钮来借钱。它不仅仅是一个虚拟的火车集合游戏。你还可以建造道路、机场、海港等。记得所有车辆都需要车库和时间表,你就在实现虚拟企业的路上成功了一半。 + +OpenTTD 有着活跃而热情的社区,以及[详细的维基][18],并且有大量的资源和教程在线可用。下载游戏并试试吧! + +-------------------------------------------------------------------------------- + +via: https://opensource.com/article/21/9/model-trains-openttd + +作者:[Seth Kenlon][a] +选题:[lujun9972][b] +译者:[unigeorge](https://github.com/unigeorge) +校对:[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/train-plane-speed-big-machine.png?itok=f377dXKs (Old train) +[2]: https://opensource.com/article/20/6/open-source-virtual-lego +[3]: http://openttd.org +[4]: https://www.openttd.org/downloads/openttd-releases/latest.html +[5]: https://opensource.com/article/21/2/chromebook-linux +[6]: https://opensource.com/article/17/7/how-unzip-targz-file +[7]: https://store.steampowered.com/app/1536610/OpenTTD/ +[8]: https://opensource.com/sites/default/files/openttd-menu.jpg (OpenTTD menu) +[9]: https://creativecommons.org/licenses/by-sa/4.0/ +[10]: https://opensource.com/sites/default/files/openttd-newgrf.jpg (The NewGRF settings menu) +[11]: https://opensource.com/sites/default/files/openttd-iconbar-railway.jpg (The new icon bar - railway option) +[12]: https://opensource.com/sites/default/files/openttd-window-station.jpg (Station coverage information window) +[13]: https://opensource.com/sites/default/files/openttd-create-station.jpg (The create station menu) +[14]: https://opensource.com/sites/default/files/openttd-create-depot.jpg (Create depot menu) +[15]: https://opensource.com/sites/default/files/openttd-create-train.jpg (The create train menu) +[16]: https://opensource.com/sites/default/files/openttd-create-schedule.png (The create schedule menu) +[17]: https://opensource.com/sites/default/files/openttd-train.jpg (Train in service) +[18]: https://wiki.openttd.org/en/ diff --git a/published/202110/20210922 Install AnyDesk on Ubuntu Linux -GUI and Terminal Methods.md b/published/202110/20210922 Install AnyDesk on Ubuntu Linux -GUI and Terminal Methods.md new file mode 100644 index 0000000000..2820edd9a1 --- /dev/null +++ b/published/202110/20210922 Install AnyDesk on Ubuntu Linux -GUI and Terminal Methods.md @@ -0,0 +1,151 @@ +[#]: subject: "Install AnyDesk on Ubuntu Linux [GUI and Terminal Methods]" +[#]: via: "https://itsfoss.com/install-anydesk-ubuntu/" +[#]: author: "Abhishek Prakash https://itsfoss.com/author/abhishek/" +[#]: collector: "lujun9972" +[#]: translator: "geekpi" +[#]: reviewer: "wxy" +[#]: publisher: "wxy" +[#]: url: "https://linux.cn/article-13839-1.html" + +在 Ubuntu Linux 上安装 AnyDesk +====== + +> 这个初学者的教程讨论了在基于 Ubuntu 的 Linux 发行版上安装 AnyDesk 的 GUI 和终端方法。 + +![](https://img.linux.net.cn/data/attachment/album/202110/01/165758y9aaiix7yu88ayui.jpg) + +[AnyDesk][1] 是一个流行的远程桌面软件,可用于 Linux、Windows、BSD、macOS 和移动平台。 + +有了 AnyDesk,你可以用它远程访问其他电脑,或者让别人远程访问你的系统。不是每个人都可以访问它,因为需要两台设备都使用 AnyDesk。你必须接受传入的连接和/或提供一个安全连接的密码。 + +这对于向朋友、家人、同事甚至客户提供技术支持很有帮助。 + +在本教程中,我将向你展示在 Ubuntu 上安装 AnyDesk 的图形和命令行两种方法。你可以根据自己的喜好使用这两种方法。这两种方法都会在你的 Ubuntu 系统上安装相同的 AnyDesk 版本。 + +同样的方法应该适用于 Debian 和其他基于 Debian 和 Ubuntu 的发行版,如 Linux Mint,Linux Lite 等。 + +> **非 FOSS 警告!** +> +> AnyDesk 不是开源软件。这里涉及它是因为它在 Linux 上可用,而文章的重点是 Linux。 + +### 方法 1:使用终端在 Ubuntu 上安装 AnyDesk + +在你的系统上 [打开终端程序][2]。你需要一个像 `wget` 这样的工具来 [在终端下载文件][3],使用以下命令: + +``` +sudo apt update +sudo apt install wget +``` + +下一步是下载 AnyDesk 仓库的 GPG 密钥,并将其添加到你的系统的可信密钥中。这样,你的系统就会信任来自这个[外部仓库][4]的软件。 + +``` +wget -qO - https://keys.anydesk.com/repos/DEB-GPG-KEY | sudo apt-key add - +``` + +你可以暂时忽略关于 `apt-key` 命令的废弃警告。下一步是将 AnyDesk 仓库添加到系统的仓库源中: + +``` +echo "deb http://deb.anydesk.com/ all main" | sudo tee /etc/apt/sources.list.d/anydesk-stable.list +``` + +更新包缓存,这样你的系统就能通过新添加的仓库了解到新应用的可用性。 + +``` +sudo apt update +``` + +现在,你可以安装 AnyDesk 了: + +``` +sudo apt install anydesk +``` + +完成后,你可以从系统菜单或从终端本身启动 AnyDesk: + +``` +anydesk +``` + +你现在可以享受 AnyDesk 了。 + +![AnyDesk running in Ubuntu][5] + +### 方法 2:在 Ubuntu 上以图形方式安装 AnyDesk + +如果你不习惯使用命令行,不用担心。你也可以不进入终端安装 AnyDesk。 + +你可以从 AnyDesk 官网下载 Ubuntu 上的 AnyDesk: + +- [下载 Linux 上的 Anydesk][6] + +你会看到一个“Download Now”的按钮。点击它。 + +![Download AnyDesk][7] + +当你点击下载按钮时,它会给你提供各种 Linux 发行版的选项。选择 Ubuntu 的那个: + +![Download the appropriate file][8] + +它将下载 AnyDesk 的 DEB 文件。[安装 DEB 文件][9]很简单。要么双击它,要么右击并使用软件安装打开。 + +![Right click on deb file and open with software center][10] + +软件中心应用将被打开,你可以在那里安装它。 + +![Installing AnyDesk in Ubuntu software center][11] + +安装后,在系统菜单中搜索它并从那里开始。 + +![AnyDesk installed in Ubuntu][12] + +这就好了。不是太难,是吗? + +我不打算展示使用 AnyDesk 的步骤。我想你已经对这个问题有了一些了解。如果没有,请参考 [这篇文章][13]。 + +#### 故障排除提示 + +当我试图从系统菜单中运行 AnyDesk 时,它没有启动。于是,我从终端启动它,它显示了这个错误: + +``` +[email protected]:~$ anydesk +anydesk: error while loading shared libraries: libpangox-1.0.so.0: cannot open shared object file: No such file or directory +``` + +如果你看到 “[error while loading shared libraries][14]” 信息,你要安装它所报错的软件包。在我的例子中,我是这样做的: + +``` +sudo apt install libpangox-1.0-0 +``` + +这解决了我的问题,我希望它也能为你解决。 + +如果你有任何与此主题相关的问题,请在评论区告诉我。 + +-------------------------------------------------------------------------------- + +via: https://itsfoss.com/install-anydesk-ubuntu/ + +作者:[Abhishek Prakash][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/abhishek/ +[b]: https://github.com/lujun9972 +[1]: https://anydesk.com/en +[2]: https://itsfoss.com/open-terminal-ubuntu/ +[3]: https://itsfoss.com/download-files-from-linux-terminal/ +[4]: https://itsfoss.com/adding-external-repositories-ubuntu/ +[5]: https://i1.wp.com/itsfoss.com/wp-content/uploads/2021/09/anydesk-running-in-ubuntu.png?resize=800%2C418&ssl=1 +[6]: https://anydesk.com/en/downloads/linux +[7]: https://i1.wp.com/itsfoss.com/wp-content/uploads/2021/09/any-desk-ubuntu-download.webp?resize=800%2C312&ssl=1 +[8]: https://i2.wp.com/itsfoss.com/wp-content/uploads/2021/09/any-desk-ubuntu-download-1.webp?resize=800%2C427&ssl=1 +[9]: https://itsfoss.com/install-deb-files-ubuntu/ +[10]: https://i2.wp.com/itsfoss.com/wp-content/uploads/2021/09/install-anaydesk-ubuntu.png?resize=800%2C403&ssl=1 +[11]: https://i2.wp.com/itsfoss.com/wp-content/uploads/2021/09/installing-anydesk-in-ubuntu-software-center.png?resize=781%2C405&ssl=1 +[12]: https://i1.wp.com/itsfoss.com/wp-content/uploads/2021/09/anydesk-installed-in-ubuntu.png?resize=759%2C196&ssl=1 +[13]: https://support.anydesk.com/Access +[14]: https://itsfoss.com/solve-open-shared-object-file-quick-tip/ diff --git a/published/202110/20210923 Build your website with Jekyll.md b/published/202110/20210923 Build your website with Jekyll.md new file mode 100644 index 0000000000..b0b5ccd10d --- /dev/null +++ b/published/202110/20210923 Build your website with Jekyll.md @@ -0,0 +1,173 @@ +[#]: subject: "Build your website with Jekyll" +[#]: via: "https://opensource.com/article/21/9/build-website-jekyll" +[#]: author: "Ayush Sharma https://opensource.com/users/ayushsharma" +[#]: collector: "lujun9972" +[#]: translator: "perfiffer" +[#]: reviewer: "wxy" +[#]: publisher: "wxy" +[#]: url: "https://linux.cn/article-13875-1.html" + +使用 Jekyll 构建你的网站 +====== + +> Jekyll 是一个开源的静态网站生成器。你可以使用 Markdown 编写内容,使用 HTML/CSS 来构建和展示,Jekyll 会将其编译为静态的 HTML。 + +![](https://img.linux.net.cn/data/attachment/album/202110/12/145349rblj459naj74j5nr.jpg) + +近年来开始流行静态网站生成器和 JAMStack,而且理由很充分,它们不需要复杂的后端,只需要静态的 HTML、CSS 和 Javascript。没有后端意味着更好的安全性、更低的运营开销和更便宜的托管。双赢! + +在本文中,我将讨论 Jekyll。在撰写本文时,[我的个人网站使用的是 Jekyll][2]。Jekyll 使用 Ruby 引擎将用 Markdown 编写的文章转换成 HTML。[Sass][3] 可以将复杂的 CSS 规则应用到普通文本文件中。[Liquid][4] 允许对静态内容进行编程控制。 + +### 安装 Jekyll + +[Jekyll 网站][5] 提供了 Linux、MacOS 和 Windows 安装说明。安装完成之后,[快速引导][6] 将会安装一个基础的 Hello-World 项目。 + +现在在你的浏览器访问 `http://localhost:4000`,你可以看到你的默认“真棒”博客。 + +![Default "awesome" blog][7] + +### 目录结构 + +这个默认站点包含以下的文件和文件夹: + + * `_posts`: 你的博客文章。 + * `_site`: 最终编译成的静态网站文件。 + * `about.markdown`: “关于页”的内容。 + * `index.markdown`: “主页”的内容。 + * `404.html`: “404 页”的内容。 + * `_config.yml`: Jekyll 的全站配置文件。 + +### 创建新的博客帖子 + +创建帖子很简单。你需要做的就是在 `_post` 目录下使用正确的格式和扩展名创建一个新文件,这样就完成了。 + +有效的文件名像 `2021-08-29-welcome-to-jekyll.markdown` 这样。一个博客文件必须包含 Jekyll 所谓的 YAML 卷首块Front Matter。它是文件开头的一个包含元数据的特殊部分。如果你查看默认的帖子,你可以看到以下内容: + +``` +--- +layout: post +title: "Welcome to Jekyll!" +date:  2021-08-29 11:28:12 +0530 +categories: jekyll update +--- +``` + +Jekyll 会使用上面的元数据,你也可以自定义 `key: value` 键值对。如果你需要一些提示,[请查看我的网站的卷首][9]。除了前面的问题,你还可以 [使用内置的 Jekyll 变量][10] 来自定义你的网站。 + +让我们创建一个新的帖子。在 `_posts` 文件夹下创建 `2021-08-29-ayushsharma.markdown`。内容如下: + +``` +--- +layout: post +title:  "Check out ayushsharma.in!" +date:   2021-08-29 12:00:00 +0530 +categories: mycategory +--- +This is my first post. + +# This is a heading. + +## This is another heading. + +This is a [link]() + +This is my category: +``` + +如果 `jekyll serve` 命令仍在运行,刷新页面,你将看到下面的新帖子。 + +![New blog entry][11] + +恭喜你创建了你的第一篇帖子!这个过程看起来很简单,但是你可以通过 Jekyll 做很多事情。使用简单的 Markdown,你可以归档博客、高亮显示代码片段以及分类管理帖子。 + +### 草稿 + +如果你还没准备好发布你的内容,你可以创建一个 `_drafts` 文件夹。此文件夹中的 Markdown 文件仅通过传递 `--drafts--` 参数来呈现。 + +### 布局和包含 + +请注意 `_post` 文件夹中两篇文章的卷首块,你将在其中看到 `layout: post`。`_layout` 文件夹中包含所有布局。你不会在源代码中找到它们,因为 Jekyll 默认加载它们。Jekyll 使用的默认源代码在 [这里][12]。如果你点击该链接,你可以看到 `post` 的布局使用了默认(`default`)布局。默认布局包含的代码 `{{ content }}` 是注入内容的地方。布局文件还将包含 `include` 指令。它们从 [`include` 文件夹][14] 加载文件,并使用不同的组件组成页面。 + +总的来说,这就是布局的工作方式:你在卷首块定义它们并将你的内容注入其中。而包含则提供了页面的其它部分以组成整个页面。这是一种标准的网页设计技术:定义页眉、页脚、旁白和内容元素,然后在其中注入内容。这就是静态站点生成器的真正威力,完全以编程的方式控制,将你的网站组装起来并最终编译成静态的 HTML。 + +### 页面 + +你网站上的所有内容并不都是文章或博客。你需要“关于”页面、“联系”页面、“项目”页面或“作品”页面。这就是“页面”的用武之地。它们的工作方式与“帖子”完全一样,这意味着它们是带有卷首块的 Markdown 文件。但它们不会放到 `_posts` 目录。它们要么保留在你的项目根目录中,要么保留在它们自己的文件夹中。对于布局和包含,你可以使用与帖子相同的布局或创建新帖子。 Jekyll 非常灵活,你可以随心所欲地发挥你的创意!你的默认博客已经有 `index.markdown` 和 `about.markdown`。请随意自定义它们。 + +### 数据文件 + +数据文件位于 `_data` 目录中,可以是 `.yml`、`.json`、`.csv` 等格式的文件。例如,一个 `_data/members.yml` 文件可能包含: + +``` +- name: A + github: a@a + +- name: B + github: b@b + +- name: C + github: c@c +``` + +Jekyll 在网站生成的时候读取这些内容。你可以通过 `site.data.members` 访问它们。 + +``` + +``` + +### 永久链接 + +你的 `_config.yml` 文件定义了永久链接的格式。你可以使用各种默认变量来组合你自己的自定义永久链接。 + +### 构建你最终的网站 + +命令 `jekyll serve` 非常适合本地测试。但是一旦你完成了本地测试,你将需要构建要发布的最终工作。命令 `jekyll build --source source_dir --destination destination_dir` 将你的网站构建到 `_site` 文件夹中。请注意,此文件夹在每次构建之前都会被清理,所以不要将重要的东西放在那里。生成内容后,你可以将其托管在你的静态托管服务上。 + +你现在应该对 Jekyll 的功能以及主要部分的功能有一个全面的了解。如果你正在寻找灵感,官方 [JAMStack 网站上有一些很棒的例子][17]。 + +![Example Jekyll sites from JAMStack][18] + +编码快乐。 + +本文首发于 [作者个人博客][19],经授权改编。 + +-------------------------------------------------------------------------------- + +via: https://opensource.com/article/21/9/build-website-jekyll + +作者:[Ayush Sharma][a] +选题:[lujun9972][b] +译者:[perfiffer](https://github.com/perfiffer) +校对:[wxy](https://github.com/wxy) + +本文由 [LCTT](https://github.com/LCTT/TranslateProject) 原创编译,[Linux中国](https://linux.cn/) 荣誉推出 + +[a]: https://opensource.com/users/ayushsharma +[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://gitlab.com/ayush-sharma/ayushsharma-in +[3]: https://sass-lang.com/ +[4]: https://shopify.github.io/liquid/ +[5]: https://jekyllrb.com/docs/installation/ +[6]: https://jekyllrb.com/docs/ +[7]: https://opensource.com/sites/default/files/uploads/2016-08-15-introduction-to-jekyll-welcome-to-jekyll.png (Default "awesome" blog) +[8]: https://creativecommons.org/licenses/by-sa/4.0/ +[9]: https://gitlab.com/ayush-sharma/ayushsharma-in/-/blob/2.0/_posts/2021-07-15-the-evolution-of-ayushsharma-in.md +[10]: https://jekyllrb.com/docs/variables/ +[11]: https://opensource.com/sites/default/files/uploads/2016-08-15-introduction-to-jekyll-new-article.png (New blog entry) +[12]: https://github.com/jekyll/minima/blob/master/_layouts/post.html +[13]: https://github.com/jekyll/minima/blob/master/_layouts/default.html#L12 +[14]: https://github.com/jekyll/minima/tree/master/_includes +[15]: https://github.com/"\> +[16]: https://jekyllrb.com/docs/permalinks/ +[17]: https://jamstack.org/examples/ +[18]: https://opensource.com/sites/default/files/uploads/2016-08-15-introduction-to-jekyll-jamstack-examples.png (Example Jekyll sites from JAMStack) +[19]: https://notes.ayushsharma.in/2021/08/introduction-to-jekyll diff --git a/published/202110/20210927 Install Java from your Linux distribution-s repositories.md b/published/202110/20210927 Install Java from your Linux distribution-s repositories.md new file mode 100644 index 0000000000..f2de6c0c60 --- /dev/null +++ b/published/202110/20210927 Install Java from your Linux distribution-s repositories.md @@ -0,0 +1,117 @@ +[#]: subject: "Install Java from your Linux distribution's repositories" +[#]: via: "https://opensource.com/article/21/9/install-java-linux-repositories" +[#]: author: "Chris Hermansen https://opensource.com/users/clhermansen" +[#]: collector: "lujun9972" +[#]: translator: "geekpi" +[#]: reviewer: "wxy" +[#]: publisher: "wxy" +[#]: url: "https://linux.cn/article-13864-1.html" + +如何从 Linux 发行版的仓库中安装 Java +====== + +> 无论你喜欢哪个发行版和包管理器,都可以都很容易地在你的 Linux 系统上安装 Java。 + +![](https://img.linux.net.cn/data/attachment/album/202110/09/092717ean17be0alz10kt5.jpg) + +把 Java 安装到你的 Linux 桌面上有多种方法。一个明显的方式是使用你的 Linux 发行版中提供的软件包。请注意,这并不适合所有人。例如,有些用户可能需要一个非常具体的 Java 版本。 + +在你开始之前,你必须确定你需要“哪种 Java”。你是否只需要运行一些 `.class` 文件或 `.jar` 文件?还是你正在编写一些需要编译的代码? + +就我而言,我运行的大部分 Java 都是我自己(至少部分)编写的 Java,所以安装完整的 Java 开发工具包(或称 JDK)总是有意义的,它包含了 Java 编译器、库和一些非常有用的工具。当然,在这里,我们更倾向于使用开源的 JDK,称为 [OpenJDK][2]。 + +由于我主要在 Ubuntu Linux 发行版上工作,我的软件包管理器是 `apt`。我可以用 `apt` 来查找哪些 OpenJDK 包是可用的: + +``` +apt list OpenJDK\* +``` + +这个命令的输出看起来像这样: + +``` +Listing... Done +openjdk-11-dbg/hirsute-updates,hirsute-security 11.0.11+9-0ubuntu2 amd64 +openjdk-11-dbg/hirsute-updates,hirsute-security 11.0.11+9-0ubuntu2 i386 +openjdk-11-demo/hirsute-updates,hirsute-security 11.0.11+9-0ubuntu2 amd64 +openjdk-11-demo/hirsute-updates,hirsute-security 11.0.11+9-0ubuntu2 i386 +openjdk-11-doc/hirsute-updates,hirsute-updates,hirsute-security,hirsute-security 11.0.11+9-0ubuntu2 all +openjdk-11-jdk-headless/hirsute-updates,hirsute-security 11.0.11+9-0ubuntu2 amd64 +openjdk-11-jdk-headless/hirsute-updates,hirsute-security 11.0.11+9-0ubuntu2 i386 +openjdk-11-jdk/hirsute-updates,hirsute-security 11.0.11+9-0ubuntu2 amd64 +openjdk-11-jdk/hirsute-updates,hirsute-security 11.0.11+9-0ubuntu2 i386 +openjdk-11-jre-dcevm/hirsute 11.0.10+1-1 amd64 +openjdk-11-jre-headless/hirsute-updates,hirsute-security 11.0.11+9-0ubuntu2 amd64 +openjdk-11-jre-headless/hirsute-updates,hirsute-security 11.0.11+9-0ubuntu2 i386 +openjdk-11-jre-zero/hirsute-updates,hirsute-security 11.0.11+9-0ubuntu2 amd64 +openjdk-11-jre-zero/hirsute-updates,hirsute-security 11.0.11+9-0ubuntu2 i386 +openjdk-11-jre/hirsute-updates,hirsute-security 11.0.11+9-0ubuntu2 amd64 +openjdk-11-jre/hirsute-updates,hirsute-security 11.0.11+9-0ubuntu2 i386 +openjdk-11-source/hirsute-updates,hirsute-updates,hirsute-security,hirsute-security 11.0.11+9-0ubuntu2 all +openjdk-15-dbg/hirsute 15.0.3+3-1 amd64 +openjdk-15-dbg/hirsute 15.0.3+3-1 i386 +openjdk-15-demo/hirsute 15.0.3+3-1 amd64 +... +openjdk-8-jre/hirsute-updates,hirsute-security 8u292-b10-0ubuntu1 i386 +openjdk-8-source/hirsute-updates,hirsute-updates,hirsute-security,hirsute-security 8u292-b10-0ubuntu1 all +``` + +我在上面用 `...` 省略了不少行。 + +事实证明,即使限制在 OpenJDK 中,我仍然有很多选择: + + * 不同的架构(在我的例子中,i386 还是 amd64)。 + * 不同的 Java 版本(就我而言,有 8、11、15、16、17 等)。 + * 纯粹的 OpenJDK 或无头版本。 + * Java 运行时环境(JRE)。 + * 用于调试、演示,以及是否包含源代码等。 + +同样,在我的情况中,我主要对纯粹的普通 OpenJDK 感兴趣。 + +假设我想为我的 amd64 架构安装 Java 11 版本的普通 OpenJDK,我可以输入: + +``` +sudo apt install -a=amd64 openjdk-11-jdk +``` + +几分钟后,我就可以编译、运行、调试和打包我的 Java 代码了。 + +注意,很有可能需要同时安装多个版本的 Java,有时甚至是必要的。在 Ubuntu 中,有一个有用的工具,叫做 `update-java-alternatives`,它可以 [显示并配置在使用哪个 Java 环境][3]。 + +那些使用不同 Linux 发行版的人,一般来说,可以采取类似的方法。其他的几个发行版(如 Debian 和 Mint)也使用 `apt` ,尽管可用的软件包可能不同。发行版可能使用不同的软件包管理器。例如, [Fedora 安装 Java 的文档页面][4] 显示了如何使用 Fedora `dnf` 包管理器来处理安装。首先,为了显示可用的版本,输入: + +``` +dnf search openjdk +``` + +接下来,要安装完整的开发 x86_64 架构版本,请输入: + +``` +sudo dnf install java-11-openjdk-devel.x86_64 +``` + +同样地,Fedora 提供了 `alternatives` 工具来 [显示和配置 Java 环境][5]。 + +再比如,[很棒的 Arch Linux 维基][6] 显示对应的软件包是 `jdk11-openjdk`。该维基还解释了许多在 Arch 中使用 Java 的其他重要细节,比如使用 `archlinux-java` 工具来显示安装了哪些 Java 环境或选择一个不同的默认环境。Arch 使用一个叫 `pacman` 的包管理器,它也有文档 [在 Arch Linux 维基上][7]。 + +不管你喜欢哪个发行版和软件包管理器,在你的 Linux 系统上获得 Java 是很容易的。当然,在安装之前,要考虑版本和功能。还要记住,在同一台电脑上有管理两个或多个 Java 版本的方法。我的大多数例子都使用了 `apt`,但也要记得可以选择使用 `dnf`。 + +-------------------------------------------------------------------------------- + +via: https://opensource.com/article/21/9/install-java-linux-repositories + +作者:[Chris Hermansen][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/clhermansen +[b]: https://github.com/lujun9972 +[1]: https://opensource.com/sites/default/files/styles/image-full-size/public/lead-images/java-coffee-mug.jpg?itok=Bj6rQo8r (Coffee beans and a cup of coffee) +[2]: https://openjdk.java.net/ +[3]: http://manpages.ubuntu.com/manpages/hirsute/man8/update-java-alternatives.8.html +[4]: https://docs.fedoraproject.org/en-US/quick-docs/installing-java/ +[5]: https://tecadmin.net/install-java-on-fedora/ +[6]: https://wiki.archlinux.org/title/java#OpenJDK +[7]: https://wiki.archlinux.org/title/pacman#Querying_package_databases diff --git a/published/202110/20210929 Dialect- An Open-Source Translation App for Linux.md b/published/202110/20210929 Dialect- An Open-Source Translation App for Linux.md new file mode 100644 index 0000000000..073ad4a64f --- /dev/null +++ b/published/202110/20210929 Dialect- An Open-Source Translation App for Linux.md @@ -0,0 +1,100 @@ +[#]: subject: "Dialect: An Open-Source Translation App for Linux" +[#]: via: "https://itsfoss.com/dialect/" +[#]: author: "Ankush Das https://itsfoss.com/author/ankush/" +[#]: collector: "lujun9972" +[#]: translator: "geekpi" +[#]: reviewer: "wxy" +[#]: publisher: "wxy" +[#]: url: "https://linux.cn/article-13868-1.html" + +Dialect:Linux 下的开源翻译应用 +====== + +![](https://img.linux.net.cn/data/attachment/album/202110/10/115724t5xgx8agu8asag0u.jpg) + +> Dialect 是一个简单明了的应用,可以让你使用 Web 服务进行语言间的翻译。想要了解更多的话,让我们来一窥究竟。 + +虽然你可以启动 Web 浏览器并直接使用任何翻译服务来完成工作,但桌面应用有时会派上用场。 + +Dialect 是一个简单的翻译应用,可以利用 Web 服务进行翻译,同时给你一些额外的能力。 + +### 使用谷歌翻译和 LibreTranslate 的开源翻译应用 + +![][1] + +Dialect 是一个主要为 GNOME 桌面定制的应用,但它在其他桌面环境下也应该能正常工作。 + +它可以让你快速翻译语言,同时还有一些额外的选项。 + +在其核心部分,你可以选择谷歌翻译或 LibreTranslate 翻译服务。 + +尽管 LibreTranslate 达不到谷歌翻译的准确性,但把它作为一个选项来切换是一个很好的补充。至少,对于一些基本的用法,如果用户不想利用谷歌的服务,你的桌面上就有一个备选方案。 + +### Dialect 的特点 + +![][2] + +除了切换翻译服务外,你还能得到如下个功能: + + * 发音 + * 文本到语音(TTS)功能(谷歌) + * 黑暗模式 + * 翻译快捷方式 + * 实时翻译 + * 剪贴板按钮可快速复制/粘贴 + * 翻译历史(撤销/重做) + +正如你在截图中所注意到的,实时翻译功能可能会因为滥用 API 而使你的 IP 地址被禁止使用服务。 + +![][3] + +我试着使用 LibreTranslate(如上图所示)和谷歌翻译,并启用实时翻译功能,它工作得很好。 + +也许,如果你经常依赖翻译,你可能想避免这个实时翻译。但是,对于我的临时使用,在相当多的测试中,该服务并没有导致 IP 地址被禁止。 + +重要的是要注意,如果你想,你可以指定一个自定义的 LibreTranslate 实例。默认情况下,它使用 “translate.astian.org” 作为实例。 + +你可能找不到一个单独显示的翻译历史区域,但窗口左上角的箭头按钮会让你看到你以前的翻译,以及翻译设置。 + +所以,它也可以作为一个重做/撤销的功能。 + +### 在 Linux 中安装 Dialect + +[Dialect][7] 是以 [Flatpak][4] 的形式提供的。所以,你应该能够在你选择的任何 Linux 发行版上安装它。如果你是新手,你可能想看看我们的 [Flatpak 指南][5] 以获得帮助。 + +首先,添加 Flathub 仓库: + +``` +flatpak remote-add --if-not-exists flathub https://flathub.org/repo/flathub.flatpakrepo +``` + +然后安装应用: + +``` +flatpak install flathub com.github.gi_lom.dialect +``` + +安装后,在系统菜单中寻找它,并从那里启动它。 + +你也可以浏览它的 [GitHub 页面][6] 了解更多信息。 + +-------------------------------------------------------------------------------- + +via: https://itsfoss.com/dialect/ + +作者:[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/2021/09/dialect-screenshot.png?resize=800%2C331&ssl=1 +[2]: https://i0.wp.com/itsfoss.com/wp-content/uploads/2021/09/dialect-app-options.png?resize=800%2C470&ssl=1 +[3]: https://i0.wp.com/itsfoss.com/wp-content/uploads/2021/09/dialect-libretranslate.png?resize=800%2C326&ssl=1 +[4]: https://itsfoss.com/what-is-flatpak/ +[5]: https://itsfoss.com/flatpak-guide/ +[6]: https://github.com/dialect-app/dialect/ +[7]: https://flathub.org/apps/details/com.github.gi_lom.dialect diff --git a/published/202110/20210929 Install Java manually on Linux.md b/published/202110/20210929 Install Java manually on Linux.md new file mode 100644 index 0000000000..32ba846089 --- /dev/null +++ b/published/202110/20210929 Install Java manually on Linux.md @@ -0,0 +1,118 @@ +[#]: subject: "Install Java manually on Linux" +[#]: via: "https://opensource.com/article/21/9/install-java-manually-linux" +[#]: author: "Alan Formy-Duval https://opensource.com/users/alanfdoss" +[#]: collector: "lujun9972" +[#]: translator: "wxy" +[#]: reviewer: "wxy" +[#]: publisher: "wxy" +[#]: url: "https://linux.cn/article-13869-1.html" + +如何在 Linux 上手动安装 Java +====== + +> 手动安装可以让用户更好的控制 Java 运行时环境。 + +![](https://img.linux.net.cn/data/attachment/album/202110/10/143844wm2x4d18b1mb8md1.jpg) + +[使用 Linux 发行版的软件包管理工具来安装 Java 软件包][6] 是很容易的。然而,有时你需要手动安装 Java。这对基于 Java 的应用服务器(如 Tomcat 或 JBoss)的管理员特别重要。许多开源和专有软件产品都依赖于这些服务。 + +### 开发者或运行时套件? + +Java 虚拟机Java Virtual Machine(JVM)以两种不同的形式提供:Java 开发工具包Java Development Kit(JDK)或 Java 运行时环境Java Runtime Environment(JRE)。 + +软件开发人员通常需要 JDK。它包含编译、运行和测试源代码所需的二进制文件。部署一个预先建立的 Java 应用程序通常只需要 JRE。它不包括编译器和其他开发工具。由于安全性的提高和空间的限制,通常在生产环境中安装 JRE。 + +### 获取 Java + +你可以从网上下载开源的 Java 软件。你可以在 [Red Hat Developer][2]、[Adoptium.net][3] 下载 OpenJDK 打包文件,或从 Azul 下载 [Zulu 社区版][4] 。 + +### 安装 Java + +设置一个目录来存放 Java 文件。我喜欢创建一个简单的名为 `java` 的目录,这样我就可以在一个专门的目录中下载并解压打包文件: + +``` +$ mkdir -p java/jdk +``` + +让我们在这个例子中使用 JDK。将下载的文件保存到 `jdk` 目录下。然后换到该目录: + +``` +$ cd java/jdk +$ ls +OpenJDK11U-jdk_x64_linux_hotspot_11.0.12_7.tar.gz +``` + +提取该打包文件。注意,`tar` 会创建一个新的目录: + +``` +$ tar xvzf OpenJDK11U-jdk_x64_linux_hotspot_11.0.12_7.tar.gz +$ ls +jdk-11.0.12+7 OpenJDK11U-jdk_x64_linux_hotspot_11.0.12_7.tar.gz +``` + +使用 `-version` 选项确认新 JVM 的版本。 + +``` +$ cd jdk-11.0.12+7/bin +$ ./java -version +``` + +JVM 的版本输出看起来类似这样: + +``` +openjdk version "11.0.12" 2021-07-20 +OpenJDK Runtime Environment Temurin-11.0.12+7 (build 11.0.12+7) +OpenJDK 64-Bit Server VM Temurin-11.0.12+7 (build 11.0.12+7, mixed mode) +``` + +#### 环境变量 + +为了确保一个特定的应用程序能够正常工作,它需要确切地知道如何定位 JVM。有两个主要的变量需要设置:`JAVA_HOME` 和 `PATH`。 + +``` +$ echo $JAVA_HOME +$ echo $PATH +``` + +这些可以在用户的 `.bashrc` 文件中设置。确保这些变量出现在 [任何设置 PATH 的现有代码][5] 之后: + +``` +#Set the JAVA_HOME +export JAVA_HOME=~/java/jdk/jdk-11.0.12+7 +#Add the JAVA_HOME to the PATH +export PATH="$JAVA_HOME/bin:$PATH" +``` + +### 手动安装的情况 + +有几种情况需要手动安装 Java。请考虑以下三种情况: + +一种情况可能是要求使用不同的,也许是较早的,在你的 Linux 发行版的软件库中已经没有的 Java 版本。 + +另一个例子可能是由安全推动的决定,即 Java 不会被默认安装在操作系统上或在“根级别”上。 + +第三种情况是可能需要几个不同版本的 Java,通常是因为 J2EE Web 应用程序的多个实例在同一台服务器上运行。由于越来越多地使用虚拟机和容器来隔离进程,这种操作系统共享在今天已经不太常见了。然而,由于需要维护不同的容器镜像,对手动安装的理解仍然至关重要。 + +### 总结 + +我演示了我手动安装 Java 运行时环境的方式,但你可以制定一个最适合你需求的惯例。最终,手动安装让用户可以更好的控制 Java 运行时环境。 + +-------------------------------------------------------------------------------- + +via: https://opensource.com/article/21/9/install-java-manually-linux + +作者:[Alan Formy-Duval][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/alanfdoss +[b]: https://github.com/lujun9972 +[1]: https://opensource.com/sites/default/files/styles/image-full-size/public/lead-images/car-penguin-drive-linux-yellow.png?itok=twWGlYAc (Penguin driving a car with a yellow background) +[2]: https://developers.redhat.com/products/openjdk/download +[3]: https://adoptium.net/ +[4]: https://www.azul.com/downloads/zulu-community +[5]: https://opensource.com/article/17/6/set-path-linux +[6]: https://linux.cn/article-13864-1.html \ No newline at end of file diff --git a/published/202110/20210930 How I use Ansible and anacron for automation.md b/published/202110/20210930 How I use Ansible and anacron for automation.md new file mode 100644 index 0000000000..bde30f2bb5 --- /dev/null +++ b/published/202110/20210930 How I use Ansible and anacron for automation.md @@ -0,0 +1,129 @@ +[#]: subject: "How I use Ansible and anacron for automation" +[#]: via: "https://opensource.com/article/21/9/ansible-anacron-automation" +[#]: author: "Seth Kenlon https://opensource.com/users/seth" +[#]: collector: "lujun9972" +[#]: translator: "geekpi" +[#]: reviewer: "wxy" +[#]: publisher: "wxy" +[#]: url: "https://linux.cn/article-13879-1.html" + +我如何使用 Ansible 和 anacron 实现自动化 +====== + +> 有了 anacron,我可以把脚本和 Ansible 剧本放到合适的地方,以完成各种琐碎的任务。 + +![](https://img.linux.net.cn/data/attachment/album/202110/13/155036tc0c7th906cc96mm.jpg) + +自动化是伟大的 IT 和 DevOps 理想,但根据我的经验,可能根本不存在什么不方便的东西。有很多次,我为某些任务想出了一个很好的解决方案,我甚至会编写脚本,但我没有让它真正实现自动化,因为在我工作的机器上不存在易于自动化的基础设施。 + +我最喜欢的简易自动化工具曾经是 cron 系统,它古老、可靠、面向用户,而且简单(除了一个我永远无法记住的调度语法之外)。然而,cron 的问题是,它假定一台电脑每天 24 小时都在工作。在错过了太多预定的备份之后,我发现了 [anacron][2],一个基于时间戳而非预定时间的 cron 系统。如果你的电脑在通常情况下运行时处于关闭状态,anacron 会确保它在电脑重新开启时运行。创建一个作业只需要简单地把一个 shell 脚本放到三个目录中:`cron.day`、`cron.weekly` 或者 `cron.monthly` (如果你想的话,你可以定义更多)。有了 anacron,我发现自己把脚本和 Ansible 剧本用在了各种琐碎的任务中,包括弹出到期和事件提醒。 + +这是一个现代问题的简单而明显的解决方案,但如果 anacron 没有安装在电脑上,那它对我就没有用。 + +### 用 Ansible 进行软件设置 + +任何时候我设置一台新的计算机,无论是笔记本电脑、工作站还是服务器,我都会安装 anacron。这很简单,但是 anacron 的安装只提供了 `anacron` 命令。它并没有设置 anacron 的用户环境。所以我创建了一个 Ansible 剧本来设置用户需要什么来使用 anacron 并安装 `anacron` 命令。 + +首先,标准的 Ansible 模板: + +``` +--- +- hosts: localhost + tasks: +``` + +### 用 Ansible 创建目录 + +接下来,我创建了用于 Anacron 的目录树。你可以把它看成是一种透明的 crontab。 + +``` + - name: create directory tree + ansible.builtin.file: + path: "{{ item }}" + state: directory + with_items: + - '~/.local/etc/cron.daily' + - '~/.local/etc/cron.weekly' + - '~/.local/etc/cron.monthly' + - '~/.var/spool/anacron' +``` + +这个语法可能看起来有点奇怪,但它实际上是一个循环。`with_items:` 指令定义了四个要创建的目录,Ansible 在 `ansible.buildin.file:` 指令中为每个目录迭代一次(目录名填充了 `{{ item }}` 变量)。与 Ansible 中的一切一样,如果目录已经存在,不会有错误或冲突。 + +### 用 Ansible 复制文件 + +`ansible.buildin.copy` 模块将文件从一个地方复制到另一个地方。为了让它工作,我需要创建一个叫做 `anacrontab` 的文件。它不是 Ansible 剧本,所以我把它放在我的 `~/Ansible/data` 目录下,那里是我的剧本的支持文件。 + +``` + - name: copy anacrontab into place + ansible.builtin.copy: + src: ~/Ansible/data/anacrontab + dest: ~/.local/etc/anacrontab + mode: '0755' +``` + +我的 `anacrontab` 文件很简单,模仿了一些发行版默认安装在 `/etc/anacron` 中的文件: + +``` +SHELL=/bin/sh +PATH=/sbin:/bin:/usr/sbin:/usr/bin +1 0 cron.day run-parts $HOME/.local/etc/cron.daily/ +7 0 cron.wek run-parts $HOME/.local/etc/cron.weekly/ +30 0 cron.mon run-parts $HOME/.local/etc/cron.monthly/ +``` + +### 登录时运行 anacron + +大多数 Linux 发行版将 anacron 配置为从 `/etc/anacron` 读取作业。我主要是作为一个普通用户使用 anacron,所以我从我的登录账号 `~/.profile` 启动 anacron。我不想让自己记住这些配置,所以我让 Ansible 来做。我使用 `ansible.buildin.lineinfile` 模块,它会在 `~/.profile` 不存在时创建它,并插入 anacron 的启动行。 + +``` + - name: add local anacrontab to .profile + ansible.builtin.lineinfile: + path: ~/.profile + regexp: '^/usr/sbin/anacron' + line: '/usr/sbin/anacron -t ~/.local/etc/anacrontab' + create: true +``` + +### 用 Ansible 安装 anacron + +对于我的大多数系统来说,`dnf` 模块可以用来安装软件包,但我的工作站运行的是 Slackware(使用 `slackpkg`),有时不同的 Linux 发行版也会进入我的收藏。`ansible.buildin.package` 模块提供了一个安装软件包的通用接口,所以我把它用在这个剧本上。幸运的是,我还没有遇到一个名为 `anacron` 的仓库不是 `anacron`,所以现在,我不必考虑软件包名称的潜在差异。 + +这实际上是一个单独的剧本,因为软件包的安装需要权限升级,它由 `becomes: true` 指令提供。 + +``` +- hosts: localhost + become: true + tasks: + - name: install anacron + ansible.builtin.package: + name: anacron + state: present +``` + +### 使用 anacron 和 Ansible 实现轻松自动化 + +为了用 Ansible 安装 anacron,我运行该剧本: + +``` +$ ansible-playbook ~/Ansible/setup-anacron.yaml +``` + +从此,我就可以编写 shell 脚本来执行一些琐碎但重复的任务,然后把它复制到 `~/.local/etc/cron.daily`,让它每天自动运行一次(或者大约如此)。我还为诸如 [清理下载文件夹][3] 之类的任务编写了 Ansible 剧本。我把我的剧本放在 `~/Ansible` 里,这是我保存 Ansible 剧本的地方,然后在 `~/.local/etc/cron.daily` 里创建一个 shell 脚本来执行这个剧本。这很简单,不费吹灰之力,而且很快成为习惯。 + +-------------------------------------------------------------------------------- + +via: https://opensource.com/article/21/9/ansible-anacron-automation + +作者:[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/programming-code-keyboard-laptop-music-headphones.png?itok=EQZ2WKzy (Woman programming) +[2]: https://opensource.com/article/21/2/linux-automation +[3]: https://opensource.com/article/21/9/keep-folders-tidy-ansible diff --git a/published/202110/20210930 Make YAML as easy as it looks.md b/published/202110/20210930 Make YAML as easy as it looks.md new file mode 100644 index 0000000000..88330932b8 --- /dev/null +++ b/published/202110/20210930 Make YAML as easy as it looks.md @@ -0,0 +1,154 @@ +[#]: subject: "Make YAML as easy as it looks" +[#]: via: "https://opensource.com/article/21/9/yaml-cheat-sheet" +[#]: author: "Seth Kenlon https://opensource.com/users/seth" +[#]: collector: "lujun9972" +[#]: translator: "wxy" +[#]: reviewer: "wxy" +[#]: publisher: "wxy" +[#]: url: "https://linux.cn/article-13842-1.html" + +让 YAML 变得像它看起来一样简单 +====== + +> YAML 看起来很简单,为什么它这么难写呢?了解成功使用 YAML 的两个秘诀。 + +![](https://img.linux.net.cn/data/attachment/album/202110/02/101824shamurmpvldpu29a.jpg) + +如果你曾经尝试过写 YAML,你可能一开始会对它看起来很容易感到高兴。乍一看,经常用于配置文件、Ansible 剧本和普通文件数据库的 YAML 看起来就像购物清单一样直观。然而,YAML 的结构中有很多细微的差别,它隐藏着一个危险的秘密:YAML 实际上是一种高度精确、结构化和令人惊讶的严格语言。好消息是,你只需要了解两件事就可以知道 YAML 的工作原理。 + +关于 YAML 的真相是,YAML 中只有两种数据结构:序列sequence映射mapping。这是两个花哨的名字,你会发现它代表了你非常熟悉的概念。这篇文章解释了这两种结构,更重要的是,介绍了它们是如何协同工作,使 YAML 成为表示你所关心的数据的强大方式。 + +### YAML 序列 + +YAML 序列是一个列表。在其最简单的形式中,每行有一个项目,每行以破折号和空格开始。 + +下面是一个例子: + +``` +--- +- Linux +- BSD +- Illumos +``` + +不同的语言有不同的方式来表示这种数据。例如,在 Python 中,同一个列表可以写成 `['Linux', 'BSD', 'Illumos']`。当你在现实生活中写一个列表时,例如在你去买菜之前,你写的可能近似于 YAML 序列。 + +### YAML 映射 + +YAML 映射是一个关键术语与该术语的定义相结合。在其他语言中,映射被称为“键值对”或“词典”。 + +这里有一个例子: + +``` +--- +Kernel: Linux +CPU: AMD +RAM: '16 GB' +``` + +不同的语言有不同的方式来表示这种数据。[在 Python 中][2],例如,同样的数据可以写成 `{"Kernel": "Linux", "CPU": "AMD", "RAM": "16 GB"}`。在现实生活中,你可能会使用这种结构来计划,例如,与朋友的游戏之夜。一个朋友报名带零食,另一个报名带一副牌,另一个报名带一个棋盘游戏,等等。 + +### 组合序列和映射 + +你现在知道 YAML 的语法了。序列和映射是 YAML 中仅有的两种构件,你想在 YAML 中表示的任何东西都可以放在序列或映射中。 + +或者同时使用这二者! + +是的,序列和映射可以被组合和嵌套,这就是 YAML 看起来很直观,但同时又感觉很复杂的原因之一。不过,只有四种可能的组合,一旦你学会如何看它们,YAML 就会觉得像它看起来一样简单。 + +### 序列的映射 + +当你想让一个键项有许多值时,你可以使用一个序列的映射。也就是说,你从一个映射(键)开始,但是给值一个列表: + +``` +--- +Linux: +  - Fedora +  - Slackware +BSD: +  - FreeBSD +  - NetBSD +``` + +在这个示例代码中,`Linux` 是第一个键,它的值是一个序列,其中包含 `Fedora` 和 `Slackware`。第二个键是 `BSD`,它的值是一个序列,包含 `FreeBSD` 和 `NetBSD`。 + +### 映射的映射 + +当你想让一个键项的值中既有键又有值时,你可以使用映射的映射。也就是说,你从一个映射(键)开始,但是给值另一个映射。 + +这可能有点欺骗性,但它揭示了 YAML 中使用特定术语的原因:因为你只不过是创建了一个映射的列表,并不意味着你创建了一个序列。这里是一个映射的映射: + +``` +--- +Desktop: +  CPU: RISC-V +  RAM: '32 GB' +Laptop: +  CPU: AMD +  RAM: '16 GB' +``` + +对大多数人来说,这看起来像一个列表。而且从技术上讲,它是一个列表。但重要的是要认识到,它不是 YAML 序列。它是一个映射,其中包含映射。作为半个 YAML 专家,你可以从明显缺少破折号的地方看出区别。 + +在 Ansible 剧本的所有结构中,我发现这个结构最容易欺骗人。作为人类,我们喜欢列表,当我们看到一个数据结构 _在字面上_ 是列表时,大多数人会把它当成 YAML 序列。但是在 YAML 中,虽然序列是列表,但是列表并不总是序列。 + +### 序列的序列 + +就像你可以嵌套映射一样,你可以将一个序列嵌套到一个序列中: + +``` +--- +- [Linux, FreeBSD, Illumos] +- [YAML, XML, JSON] +``` + +这可能是我在 YAML 的实际使用中遇到的最不常见的数据结构,但有时你需要一个列表的列表。 + +### 映射的序列 + +你也可以创建一个包含映射的序列。对于人类排序数据的方式来说,这并不太常见,但对于计算机来说,这可能是一个重要的结构。 + +这里有一个例子: + +``` +--- +- +  CPU: AMD +  RAM: '16 GB' +- +  CPU: Intel +  RAM: '16 GB' +``` + +对于 YAML,这可能是最不直观的语法。我发现它在 Python 中呈现时更清晰: + +``` +[{"CPU": "AMD", "RAM": "16 GB"}, {"CPU": "Intel", "RAM": "16 GB"}] +``` + +方括号代表一个列表结构,这个列表包含两个字典。每个字典都包含键值对。 + +### 构建更好的 YAML + +现在你知道了 YAML 的两个组成部分,以及它们如何被组合起来以表示复杂的数据结构。问题是:你要用 YAML 构建什么? + +和很多人一样,我也使用 YAML 来编写 Ansible 剧本。我还用它作为一种简单的配置格式、作为 D&D 的角色表、表示项目组织所需的目录结构,等等。只要你能适应序列和映射的概念,你会发现 YAML 是一种很容易编写、阅读和(如果有合适的库)解析的格式。 + +如果你发现自己经常使用 YAML,请下载我们的 [YAML 速查表][3],以帮助你直观地了解基本数据结构及其组合,并帮助你记住一些额外的语法约定。通过一点点的练习,你会发现 YAML 真的和它看起来一样简单! + +-------------------------------------------------------------------------------- + +via: https://opensource.com/article/21/9/yaml-cheat-sheet + +作者:[Seth Kenlon][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/seth +[b]: https://github.com/lujun9972 +[1]: https://opensource.com/sites/default/files/styles/image-full-size/public/lead-images/laptop_screen_desk_work_chat_text.png?itok=UXqIDRDD (Person using a laptop) +[2]: https://opensource.com/article/21/3/dictionary-values-python +[3]: https://opensource.com/downloads/yaml-cheat-sheet diff --git a/published/202110/20211001 -e- cloud is a deGoogled Alternative to Google Drive.md b/published/202110/20211001 -e- cloud is a deGoogled Alternative to Google Drive.md new file mode 100644 index 0000000000..6234cfe8b9 --- /dev/null +++ b/published/202110/20211001 -e- cloud is a deGoogled Alternative to Google Drive.md @@ -0,0 +1,77 @@ +[#]: subject: "/e/ cloud is a deGoogled Alternative to Google Drive" +[#]: via: "https://news.itsfoss.com/e-cloud/" +[#]: author: "Ankush Das https://news.itsfoss.com/author/ankush/" +[#]: collector: "lujun9972" +[#]: translator: "geekpi" +[#]: reviewer: "wxy" +[#]: publisher: "wxy" +[#]: url: "https://linux.cn/article-13874-1.html" + +/e/ 云:一个去谷歌化的 Google Drive 替代方案 +====== + +![](https://img.linux.net.cn/data/attachment/album/202110/12/122933awf0z9vnqdzslv1q.jpg) + +> /e/ 云是 e.foundation 使用 Nextcloud 等开源工具创立的,以作为 Google Drive 和 Gmail 的替代品。 + +![](https://i0.wp.com/news.itsfoss.com/wp-content/uploads/2021/10/ecloud-ft.png?w=1200&ssl=1) + +Google Drive 是一种流行的云存储服务,在大多数情况下效果很好。 + +然而,它可能不是最关注隐私的选择。因此,要完全控制你的数据,最好的办法是启动一个 [Nextcloud][1] 实例,存储你的基本数据,并可以访问其他协作工具。 + +虽然这听起来不错,但不是每个人都能投入精力来创建和维护他们的实例。这就是 /e/ 云上场的时候了,它是由 [去谷歌化的安卓操作系统 /e/ 操作系统][2] 背后的同一个团队建立的。 + +/e/ 云主要将自己定位为一个新的 Google Drive 私人替代品,并提供一个取代 Gmail 的邮箱。 + +### /e/ 云:带有邮箱的 Nextcloud 及 OnlyOffice + +![][3] + +当你创建一个 /e/ 账户时,它会给你一个私人电子邮件地址 [xyz@e.email][4]。 + +而且,同邮箱地址一起,你会得到 1GB 的免费 /e/ 云存储空间和一个由 Nextcloud 和 OnlyOffice 为核心的协作平台。 + +因此,如果你想利用 Nextcloud 和 OnlyOffice 来取代谷歌的工具套件,而不需要自己全部设置,/e/ 云可以成为一个引人注目的以隐私为中心的选择。 + +![][5] + +除了 OnlyOffice 的文件存储和文档支持外,你还可以使用日历,存储笔记,并添加任务。 + +因此,它也可以成为一个正式的以隐私为中心的协作平台,你可以免费使用。 + +如果你想要更多的存储空间,你可以将你的订阅升级到付费计划,你可以根据需要选择 20 到 1TB 的存储空间,并按月/年计费。定价计划起价低至 3 美元/月。 + +毫无疑问,如果你在手机上使用 /e/ 操作系统或使用一个 /e/ 智能电话,这应该是一种无缝体验。 + +但是,你也可以使用第三方邮件客户端和 Nextcloud 移动应用在任何设备上使用它。 + +- [注册 /e/ 云][6] + +### 总结 + +考虑到它相对较新,正计划增加几个功能,包括端到端加密,从 Google Drive 迁移等。 + +你可以注册一个帐户并免费试用。 + +对于像 /e/ 云这样以 Nextcloud 为核心的主流解决方案,除了电子邮件和协作服务外,还能帮助你安全地管理/存储文件,你觉得怎么样? + +-------------------------------------------------------------------------------- + +via: https://news.itsfoss.com/e-cloud/ + +作者:[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://news.itsfoss.com/author/ankush/ +[b]: https://github.com/lujun9972 +[1]: https://itsfoss.com/nextcloud/ +[2]: https://itsfoss.com/e-os-review/ +[3]: https://i0.wp.com/news.itsfoss.com/wp-content/uploads/2021/10/ecloud.png?resize=1568%2C772&ssl=1 +[4]: mailto:xyz@e.email +[5]: https://i0.wp.com/news.itsfoss.com/wp-content/uploads/2021/10/ecloud-files.png?resize=1568%2C787&ssl=1 +[6]: https://e.foundation/e-email-invite/ diff --git a/published/202110/20211001 8 reasons why I learned Core Java.md b/published/202110/20211001 8 reasons why I learned Core Java.md new file mode 100644 index 0000000000..b7359fbbf1 --- /dev/null +++ b/published/202110/20211001 8 reasons why I learned Core Java.md @@ -0,0 +1,97 @@ +[#]: subject: "8 reasons why I learned Core Java" +[#]: via: "https://opensource.com/article/21/10/why-i-learned-core-java" +[#]: author: "Shantam Sahai https://opensource.com/users/shantam-sahai" +[#]: collector: "lujun9972" +[#]: translator: "wxy" +[#]: reviewer: "wxy" +[#]: publisher: "wxy" +[#]: url: "https://linux.cn/article-13855-1.html" + +学习 Core Java 的 8 个原因 +====== + +> 在学习建立在 Java 之上的所有相关工具时,了解 Core Java 会给你带来很大的优势。 + +![](https://img.linux.net.cn/data/attachment/album/202110/06/094720iax1d49c5sc0sd48.jpg) + +计算机编程(也被称为 *编码*)的重点不是使用哪种编程语言,而是发展编程逻辑和学习像程序员一样思考。你一开始使用的编程语言应该是在这一努力过程中对你帮助最大的语言。因此,你必须问自己一个问题,“作为一个程序员,你想开发什么?” + +例如,如果你想从事安卓应用开发、视频游戏开发、桌面 GUI 应用,或者只是一般的软件开发,我认为学习 Java 是一个很好的选择。我选择的语言是 Java,它为我提供了一个完整的编程世界。在我居住的印度,Java 程序员的平均工资约为每年 59 万印度卢比(LPA)(根据你的经验,可以高达 100 LPA)。 + +不过,Java 是一种庞大的语言,有很多框架和变体可供选择。Core Java 是科技行业发展出来的术语,指的是 Java 语言的中心组件,人们用它来编写框架,并围绕 Java 发展了丰富的产业。我认为,Core Java 是你能获得的最强大的技能之一,因为在学习建立在它之上的所有相关工具时,了解 Java 的基础知识会给你带来巨大的优势。 + +以下是我选择 Core Java 的八大理由,我想你也会认可: + +### 1、Java 是一种不断发展的编程语言 + +Java 有重要的企业支持,但 Java 开发中最重要的组成部分是 [OpenJDK][2],这是个开源的 Java 开发工具包。OpenJDK 社区以促进和维护开发源码、开放创新和开放标准为使命,致力于改进和维护 Java 及其工具链的开源实现。 + +它的每一个版本都会增加创新和便利,使 Java 对开发者和用户都更容易。例如,就在 Java 11 中,他们增加了运行 .java 文件的能力。现在,运行一个单文件的 Java 应用程序所需要的只是 `java` 命令,不需要进行编译: + +``` +$ java ./hello.java + +Hello world +``` + +你可以使用 Java 做 Web、移动或桌面的应用程序编程。它是一种高度通用的语言。它有许多有趣的特点,如动态编码、多种安全功能、平台无关的特点和以网络为中心的设计。 + +### 2、Java 锚定了安卓应用开发 + +你可以使用 Java 来创建安卓用程序。安卓市场巨大,对移动程序员的需求只会越来越大。即使你对成为一个专业的应用程序开发人员不感兴趣,定制你的移动体验的能力也是很强大的,而 Java 使之成为可能。 + +而且,这比你想象的要容易得多!学习 Core Java 可以让你轻松地掌握安卓开发工具包或可以输出到移动平台的框架,如 [Processing][3]。 + +### 3、丰富的 API 使得 Java 易于使用 + +Java 的 API(应用编程接口Application Programming Interface)包括类、包、接口等。Java 主要有三种类型的 API: + + * 官方的 Java Core API + * 最佳的官方 Java API + * 非官方的 API + +API 使编程更容易,因为你可以在不知道其内部实现的情况下构建应用程序。根据我的经验,许多公司喜欢用 Java 而不是其他选择,就是因为 Java API 的力量。 + +### 4、开源库 + +几乎有无穷无尽的 Java 开源库,包括 Maven、Guava、Apache Commons、Jhipster,等等。你可以复制、学习和分享这些库的资源。它们使编程更容易获得、更快、更便宜,也更有教育意义。 + +### 5、Java 有可靠的开发工具 + +Java 有一些我最喜欢的 IDE(集成开发环境Integrated Development Environments),包括 [Eclipse][4]、[NetBeans][5]、[BlueJ][6] 和 IntelliJ IDEA。它们提供了调试、语法高亮、代码补完、语言支持、自动重构等功能。简而言之,IDE 在 Java 的成功和你在 Java 学习中起着至关重要的作用! + +### 6、印度对 Java 开发人员的需求 + +谷歌、Netflix 和 Instagram 等巨头都使用 Java 进行后台开发。印度公司正在积极寻找雇用 Java 程序员来开发安卓应用程序、新的 API 和云上的微服务。这种需求转化为更多的工作机会。 + +### 7、Java 有庞大的编程社区 + +Java 程序员的社区庞大,囊括了从初学者到专家的所有人。我发现这个社区很热情待人,当你寻求支持的时候,他们会给予帮助。最重要的是,通过参与在线讨论,我学到了大量的新技巧。作为社区的一分子,这是我了解最新趋势、学习更多语言和跟上发展的重要途径。 + +### 8、Java 是独立于平台 + +Java 是平台无关的,这一点使它具有很高的价值。Java 源代码被编译成字节码,在 Java 虚拟机(JVM)上运行。任何运行 JVM 的平台(支持所有主要平台)都可以运行你的 Java 应用程序。你只需写一次,就可以在任何地方运行!这并不只是理论上的,Java 实际上已经实现了这一点。你可以在你开发的任何平台上编写 Java,并将其交付给你的所有目标平台。 + +网上有很多学习 Java 的资源,包括 Opensource.com 上有一个 [速查表][7]。还有一个很好的 [在线 Java 课程][8],可以用印地语免费学习。 + +-------------------------------------------------------------------------------- + +via: https://opensource.com/article/21/10/why-i-learned-core-java + +作者:[Shantam Sahai][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/shantam-sahai +[b]: https://github.com/lujun9972 +[1]: https://opensource.com/sites/default/files/styles/image-full-size/public/lead-images/studying-books-java-couch-education.png?itok=C9gasCXr (Learning and studying technology is the key to success) +[2]: https://developer.ibm.com/components/open-jdk/ +[3]: http://processing.org/ +[4]: https://opensource.com/article/20/12/eclipse +[5]: https://opensource.com/article/20/12/netbeans +[6]: https://opensource.com/article/20/7/ide-java#bluej +[7]: https://opensource.com/downloads/java-cheat-sheet +[8]: https://www.learnvern.com/course/core-java-programming-tutorial diff --git a/published/202110/20211001 How to Install Google Chrome on Debian and Kali Linux.md b/published/202110/20211001 How to Install Google Chrome on Debian and Kali Linux.md new file mode 100644 index 0000000000..8e49872ca7 --- /dev/null +++ b/published/202110/20211001 How to Install Google Chrome on Debian and Kali Linux.md @@ -0,0 +1,160 @@ +[#]: subject: "How to Install Google Chrome on Debian and Kali Linux" +[#]: via: "https://itsfoss.com/install-chrome-debian-kali-linux/" +[#]: author: "Abhishek Prakash https://itsfoss.com/author/abhishek/" +[#]: collector: "lujun9972" +[#]: translator: "geekpi" +[#]: reviewer: "wxy" +[#]: publisher: "wxy" +[#]: url: "https://linux.cn/article-13895-1.html" + +如何在 Debian 和 Kali Linux 上安装 Chrome 浏览器 +====== + +> Debian 和基于 Debian 的 Kali Linux 将 Firefox 作为默认的网页浏览器。但这并不意味着你不能在其中安装其他网页浏览器。 + +![](https://img.linux.net.cn/data/attachment/album/202110/18/175716cfvxnvf05b5je1ax.jpg) + +Chrome 浏览器非常流行,你可能已经在其他系统上使用它了。如果你想在 Debian 上安装 Chrome,你肯定可以这样做。 + +你在 Debian 的软件库中找不到 Chrome,因为它不是开源软件,但你可以从 Chrome 网站下载并安装它。 + +在本教程中,我将向你展示在 Debian 上安装 Chrome 的两种方法: + + * GUI 方法 + * 命令行方法 + +让我们先从 GUI 方法开始。 + +> 注意:我在这里的例子中使用的是 Debian,但由于 Kali Linux 是基于 Debian 的,所以同样的方法也适用于 Kali Linux。 + +### 方法 1: 在 Debian 上以图形方式安装 Chrome 浏览器 + +这是一个不费吹灰之力的方法。你去 Chrome 网站,下载 deb 文件,然后双击它来安装它。我将详细地展示这些步骤,这样你就能很容易地掌握了。 + +前往 Chrome 的网站。 + +[Get Google Chrome][1] + +你会看到下载 Chrome 的选项。 + +![Click on the Download Chrome button][2] + +当你点击下载按钮时,它会给你两个下载安装文件的选项。选择写着 Debian/Ubuntu 的那个。 + +![Download the Chrome installer file for Debian][3] + +**请注意,Chrome 浏览器不适用于 32 位系统。** + +接下来,你应该选择将文件保存到电脑中,而不是在软件中心打开进行安装。这样一来,下载的文件将被保存在下载文件夹中,而不是临时目录中。 + +![Save the downloaded DEB file for Google Chrome][4] + +进入下载文件夹,右击下载的 DEB 文件,选择用 “Software Install” 打开它。 + +![Right click on the downloaded DEB file and open with Software Install][5] + +它将打开软件中心,你应该看到现在安装 Chrome 浏览器的选项。点击安装按钮。 + +![Click on the install button][6] + +你会被要求输入账户的密码。这是你用来登录系统的同一密码。 + +![Enter your account’s password][7] + +在不到一分钟的时间里,Chrome 就会安装完毕。你现在应该看到一个删除选项,这表明软件已经安装完毕。 + +![Chrome is now installed][8] + +当 Chrome 在 Debian 上安装完毕,在系统菜单中搜索它并启动它。 + +![Start Google Chrome][9] + +它将要求成为你的默认浏览器,并将崩溃报告发送给谷歌。你可以取消勾选这两个选项。然后你就可以看到谷歌浏览器的窗口。 + +![][10] + +如果你登录了你的谷歌账户,你应该可以在这里同步你的密码、书签和其他浏览数据。好好体验吧! + +还有一点,安装完 Chrome 后,你可以从系统中删除下载的 DEB 文件。不再需要它了,甚至在卸载 Chrome 时也不需要。 + +### 方法 2:在 Debian 上从终端安装 Chrome + +你刚才看到的内容可以在终端中轻松实现。 + +首先,确保你的软件包缓存已经刷新,并且你已经安装了 `wget`,用于 [在终端中从网上下载文件][11]。 + +``` +sudo apt update && sudo apt install wget +``` + +接下来是下载 Chrome 的 .deb 文件。 + +``` +wget https://dl.google.com/linux/direct/google-chrome-stable_current_amd64.deb +``` + +下载后,你可以用 `apt` 命令 [在终端安装 deb 文件][12],像这样: + +``` +sudo apt install ./google-chrome-stable_current_amd64.deb +``` + +安装完成后,你就可以开始使用 Chrome 了。 + +### 额外提示:更新 Chrome + +这两种方法都会将谷歌的软件库添加到你的系统中。你可以在你的 `sources.list.d` 目录中看到它: + +``` +cat /etc/apt/sources.list.d/google-chrome.list +``` + +这意味着 Chrome 将与 Debian 和 Kali Linux 中的其他系统更新一起被更新。你知道 [如何在命令行中更新你的 Kali Linux][13] 或 Debian 系统么?只要使用这个命令: + +``` +sudo apt update && sudo apt upgrade -y +``` + +### 从你的系统中卸载 Chrome + +即使你选择用 GUI 方法在 Debian 上安装 Chrome,你也必须使用终端来删除它。 + +不要担心。这其实只是一个命令: + +``` +sudo apt purge google-chrome-stable +``` + +根据要求输入你的账户密码。当你输入密码时,屏幕上没有任何显示。这没关系。输入它并按回车键,确认删除。 + +![][14] + +好了,就这些了。我希望你觉得这个教程有帮助。 + +-------------------------------------------------------------------------------- + +via: https://itsfoss.com/install-chrome-debian-kali-linux/ + +作者:[Abhishek Prakash][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/abhishek/ +[b]: https://github.com/lujun9972 +[1]: https://www.google.com/chrome/ +[2]: https://i2.wp.com/itsfoss.com/wp-content/uploads/2021/09/download-chrome-on-debian.webp?resize=800%2C344&ssl=1 +[3]: https://i0.wp.com/itsfoss.com/wp-content/uploads/2021/09/downloading-google-chrome.webp?resize=800%2C512&ssl=1 +[4]: https://i2.wp.com/itsfoss.com/wp-content/uploads/2021/09/save-downloaded-chrome-installer-file-debian.webp?resize=800%2C430&ssl=1 +[5]: https://i0.wp.com/itsfoss.com/wp-content/uploads/2021/09/open-deb-file-with-software-install.webp?resize=800%2C419&ssl=1 +[6]: https://i2.wp.com/itsfoss.com/wp-content/uploads/2021/09/installing-chrome-debian.webp?resize=800%2C408&ssl=1 +[7]: https://i2.wp.com/itsfoss.com/wp-content/uploads/2021/09/enter-account-password-while-installing-deb-file.webp?resize=800%2C420&ssl=1 +[8]: https://i1.wp.com/itsfoss.com/wp-content/uploads/2021/09/chrome-installed-debian.webp?resize=800%2C384&ssl=1 +[9]: https://i0.wp.com/itsfoss.com/wp-content/uploads/2021/09/start-chrome-debian.webp?resize=800%2C276&ssl=1 +[10]: https://i1.wp.com/itsfoss.com/wp-content/uploads/2021/09/Chrom-in-Debian.webp?resize=800%2C450&ssl=1 +[11]: https://itsfoss.com/download-files-from-linux-terminal/ +[12]: https://itsfoss.com/install-deb-files-ubuntu/ +[13]: https://linuxhandbook.com/update-kali-linux/ +[14]: https://i0.wp.com/itsfoss.com/wp-content/uploads/2021/09/remove-google-chrome-ubuntu.webp?resize=800%2C450&ssl=1 diff --git a/published/202110/20211001 The Official Raspberry Pi 4 Case Sucks- Here-s What You Can do to Reduce the Overheating.md b/published/202110/20211001 The Official Raspberry Pi 4 Case Sucks- Here-s What You Can do to Reduce the Overheating.md new file mode 100644 index 0000000000..8b1b953f84 --- /dev/null +++ b/published/202110/20211001 The Official Raspberry Pi 4 Case Sucks- Here-s What You Can do to Reduce the Overheating.md @@ -0,0 +1,128 @@ +[#]: subject: "The Official Raspberry Pi 4 Case Sucks! Here’s What You Can do to Reduce the Overheating" +[#]: via: "https://itsfoss.com/raspberry-pi-case-overheating/" +[#]: author: "Avimanyu Bandyopadhyay https://itsfoss.com/author/avimanyu/" +[#]: collector: "lujun9972" +[#]: translator: "wxy" +[#]: reviewer: "wxy" +[#]: publisher: "wxy" +[#]: url: "https://linux.cn/article-13851-1.html" + +官方的树莓派 4 外壳很烂!怎么样减少过热? +====== + +![](https://img.linux.net.cn/data/attachment/album/202110/04/201826ghpecyb43cxehi4y.jpg) + +[树莓派 4][1] 绝对是数百万人的最爱,特别是在极客社区里,我也不例外。但是你知道树莓派在没有适当冷却的情况下会限制性能吗? + +在这里,我将介绍 [树莓派 4 官方外壳][2] 的一些严重缺点,同时也分享一些缓解这些缺点的方法。 + +![树莓派 4 官方外壳][3] + +在第一次启动后,我的安装在 [树莓派 4 官方外壳][2] 内的树莓派 4(8GB 内存版),在无人值守的升级启动时,会高达 80℃。我在 Ubuntu 上进行了所有的 [固件更新][4],显然是为了 [解决发热问题][5]。 + +就算在空闲时,这个烫手的香草和草莓蛋糕也绝不会低于 75℃。 + +我几乎无法使用它,直到我取下外壳顶部的白色盖子。它闲置时的温度降到只有 67℃ 左右 —— 你相信吗?即使是在我重新启动一段时间后再次检查也是这样。很明显,这仍然是不太可接受。如果我买了这个外壳并打算长期使用,我为什么要一直把盖子打开? + +为什么会发生这样的事情?这都是因为官方的树莓派外壳的设计非常糟糕。 + +### 官方的树莓派 4 外壳是一个发热怪物! + +简单地说,[热节流][6] 就是降低你的树莓派处理器(CPU)的性能,以使温度不超过极限高温(如 80℃)而 [导致损坏][7]。 + +这个外壳是由塑料制成的,它是热的不良导体(简单的 [传统物理学][8] 知识),因此无法将热量有效地散布到整个外壳和板子之外。因此,板上的处理器会发热,一旦温度达到惊人的程度,它的性能就会被降到一个极低的水平。我注意到,在第一次开机后,在**无人值守**的情况下进行升级时,CPU 的温度为 80℃,CPU 的使用率为 100%。 + +虽然这个官方的外壳看起来很美,但它对树莓派的性能造成了很大的影响。 + +如果你真的想让你的树莓派发挥最大的性能,你也必须负责它的冷却。这些发热问题不能被简单地忽视。 + +#### 热量被困在内部 + +一旦你把树莓派安装在这个外壳里,它甚至没有一个通风口可以让多余的热量排出。所以热量就一直在里面积累,直到达到那些疯狂的温度并触发了节流阀。 + +#### 没有风扇通风口(非常需要) + +顶部的白色盖子上可以有一个圆形的通风口,至少可以把 [树莓派 4 的官方风扇][9] 放在上面使用。 + +#### 没有被动冷却 + +如果外壳是金属的,它就可以作为散热器,有效地将树莓派板上的处理器的热量散发出去。 + +#### 除了发热问题之外,还有其他的缺点 + +树莓派 4 官方外壳还有一些缺点: + + 1. 不便于 SD 卡管理:将树莓派板子装入外壳内,并将 SD 卡端口放在正确的方向上,以便以后能够换卡,这不是很方便。 + 2. 没有螺丝钉系统:没有提供螺丝,也许是因为它可能会破坏机箱底座上的假支架,这些假支架看起来就像你可以用四颗螺丝把板子牢牢地固定在底座上。 + +### 你可以做什么来控制树莓派 4 的过热? + +在做了一些紧张的研究之后,我找到了市场上一些最好的冷却解决方案 —— 这一切都要归功于我们了不起的改装社区。 + +#### 使用冰塔式冷却器 + +我首先发现了 [Jeff Geerling's][10] 对各种树莓派散热器的深入性能评估,他在网上被称为 [geerlingguy][11]。在看完温度统计后,我直接选择了冰塔式散热器,并组装了它: + +![树莓派 4 冰塔冷却器][12] + +它空闲和低载时的温度下降到 30℃,现在保持在 45℃ 左右。我还没有为它改装一个合适的外壳。我准备找个给冷却器提供了足够的空间的现成外壳。也许可以在亚马逊或其他网上商店找到这种外壳。 + +但我没有找到这种产品。 + +#### 使用铝制散热器进行被动散热 + +网上也有一个关于 [被动冷却][17] 的出色视频,测评了一个用铝制散热片做的外壳。 + +它提供了一个热垫,它相当于台式机处理器上使用的散热膏。按照视频中显示的方式放置它,热量就会从树莓派板上的处理器散发到整个外壳内。这就是科学的神奇之处! + +#### 改装官方的树莓派外壳 + +如果你仍然想买官方的外壳,建议你至少要做一个风扇的改装。 + +### 潜在的制造解决方案 + +这里有一些解决方案,通过应用 [DevOps][21] 启发的改进,可以使整个制造过程更容易。 + + * 想一想,从外壳顶部切下的那块圆形塑料可以回收,用来制造更多的树莓派 4 外壳,不是吗?这显然会是一个双赢的局面,同时也降低了成本! + * 铝是地球上最丰富的金属,但 [全球供应中断][22] 可能是一个挑战。即使如此,还有其他的 [导电性解决方案][23] 来探索用于设计案例的材料! + +### 总结 + +希望这篇文章能帮助你从树莓派 4 中获得最大的收益。我很想知道你的想法、建议和经验,请在下面的评论中留言。请不要犹豫地分享。 + +-------------------------------------------------------------------------------- + +via: https://itsfoss.com/raspberry-pi-case-overheating/ + +作者:[Avimanyu Bandyopadhyay][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://itsfoss.com/author/avimanyu/ +[b]: https://github.com/lujun9972 +[1]: https://itsfoss.com/raspberry-pi-4/ +[2]: https://www.raspberrypi.org/products/raspberry-pi-4-case/ +[3]: https://i1.wp.com/itsfoss.com/wp-content/uploads/2021/09/raspberry-pi-4-official-case.webp?resize=800%2C533&ssl=1 +[4]: https://www.einfochips.com/blog/understanding-firmware-updates-the-whats-whys-and-hows/ +[5]: https://www.seeedstudio.com/blog/2019/11/29/raspberry-pi-4-firmware-update-pi-4-now-runs-cooler-than-ever/ +[6]: https://www.pcmag.com/encyclopedia/term/thermal-throttling +[7]: https://www.pcgamer.com/cpu-temperature-overheat/ +[8]: https://thermtest.com/stay-colder-for-longer-in-a-container-made-of-plastic-or-metal +[9]: https://www.raspberrypi.org/products/raspberry-pi-4-case-fan/ +[10]: https://www.jeffgeerling.com/blog/2019/best-way-keep-your-cool-running-raspberry-pi-4 +[11]: https://www.jeffgeerling.com/about +[12]: https://i0.wp.com/itsfoss.com/wp-content/uploads/2021/09/raspberry-pi-4-ice-tower-cooler.webp?resize=480%2C360&ssl=1 +[13]: https://i0.wp.com/m.media-amazon.com/images/I/51g9gQC9k7L._SL160_.jpg?ssl=1 +[14]: https://www.amazon.com/dp/B07V35SXMC?tag=chmod7mediate-20&linkCode=ogi&th=1&psc=1 (GeeekPi Raspberry Pi Cooling Fan, Raspberry Pi ICE Tower Cooler, RGB Cooling Fan with Raspberry Pi Heatsink for Raspberry Pi 4 Model B & Raspberry Pi 3B+ & Raspberry Pi 3 Model B) +[15]: https://www.amazon.com/gp/prime/?tag=chmod7mediate-20 (Amazon Prime) +[16]: https://www.amazon.com/dp/B07V35SXMC?tag=chmod7mediate-20&linkCode=ogi&th=1&psc=1 (Buy on Amazon) +[17]: https://buildabroad.org/2016/11/05/passive-cooling/ +[18]: https://i2.wp.com/m.media-amazon.com/images/I/41XGLQONCVS._SL160_.jpg?ssl=1 +[19]: https://www.amazon.com/dp/B07VD568FB?tag=chmod7mediate-20&linkCode=osi&th=1&psc=1 (Geekworm Raspberry Pi 4 Armor Case, Raspberry Pi 4 Computer Model B Armor Aluminum Alloy Passive Cooling Case Compatible with Raspberry Pi 4 Model B Only) +[20]: https://www.amazon.com/dp/B07VD568FB?tag=chmod7mediate-20&linkCode=osi&th=1&psc=1 (Buy on Amazon) +[21]: https://linuxhandbook.com/what-is-devops/ +[22]: https://www.reuters.com/article/global-metals-idUSL1N2Q90GA +[23]: https://news.mit.edu/2018/engineers-turn-plastic-insulator-heat-conductor-0330 diff --git a/published/202110/20211002 Monitor your Java on Linux with jconsole.md b/published/202110/20211002 Monitor your Java on Linux with jconsole.md new file mode 100644 index 0000000000..737b990907 --- /dev/null +++ b/published/202110/20211002 Monitor your Java on Linux with jconsole.md @@ -0,0 +1,104 @@ +[#]: subject: "Monitor your Java on Linux with jconsole" +[#]: via: "https://opensource.com/article/21/10/monitor-java-linux-jconsole" +[#]: author: "Alan Formy-Duval https://opensource.com/users/alanfdoss" +[#]: collector: "lujun9972" +[#]: translator: "wxy" +[#]: reviewer: "wxy" +[#]: publisher: "wxy" +[#]: url: "https://linux.cn/article-13860-1.html" + +用 jconsole 在 Linux 上监控你的 Java +====== + +> 如何使用 Java 开发工具包中的 Java 监控和管理控制台。 + +![](https://img.linux.net.cn/data/attachment/album/202110/08/131129bf3h3gv18388fl11.jpg) + +Java 开发工具包(JDK)提供了开发 Java 应用程序的二进制文件、工具和编译器。其中一个有用的工具是 `jconsole`。 + +为了演示,我将使用 WildFly J2EE 应用服务器,它是 JBOSS 开源应用服务器项目的一部分。首先,我启动了一个独立的实例。 + +``` +~/wildfly/24.0.1/bin$ ./standalone.sh +========================================================================= +  JBoss Bootstrap Environment +  JBOSS_HOME: /home/alan/wildfly/24.0.1 +  JAVA: /usr/lib/jvm/java-11-openjdk-11.0.11.0.9-5.fc34.x86_64/bin/java +``` + +现在,在另一个终端,输入 `jconsole`。 + +``` +$ jconsole +``` + +启动后,jconsole 会列出本地实例。选择“本地进程Local Process”,然后选择进程的名称并点击“连接Connect”。这就是连接并开始使用运行中的 Java 虚拟机(JVM)的 jconsole 的全部过程。 + +![jconsole 与本地进程的新连接屏幕][2] + +### 概述 + +这个 Java 监控和管理控制台在仪表板的顶部显示进程标识符(PID)。“概述Overview”标签有四个图表,显示“堆内存使用情况Heap Memory Usage”、“线程Threads”、“Classes”和“CPU 使用情况CPU Usage”的重要信息。 + +![jconsole 仪表板显示堆内存使用量、线程、类和 CPU 使用量][4] + +沿着顶部的标签提供每个区域的更详细的视图。 + +### 内存 + +“内存Memory”标签显示 JVM 所使用的内存的各个方面的图表。分配给 JVM 的服务器系统内存量被称为“Heap”。这个屏幕还提供了关于堆的内部组件使用情况的详细信息,例如 “伊甸园Eden Space”、“老年代Old Gen” 和 “幸存者区Survivor Space”。你也可以手动请求一个垃圾收集动作。 + +![jconsole 内存标签][5] + +### 线程 + +“线程Threads”标签显示有多少线程在运行。你也可以手动检查是否存在死锁。 + +![jconsole 线程仪表板显示了随时间变化的线程数量和滚动的线程列表][6] + +### 类 + +“Classes”标签告诉你有多少类被加载,有多少被卸载。 + +![jconsole 类标签显示随着时间推移加载的类数量][7] + +### 虚拟机摘要 + +“虚拟机摘要VM Summary”标签提供了许多关于应用程序和主机系统的细节。你可以了解你所处的操作系统和架构、系统内存总量、CPU 数量,甚至交换空间。 + +![jconsole 虚拟机摘要标签][8] + +摘要中显示的关于 JVM 的进一步细节,包括当前和最大的堆大小以及正在使用的垃圾收集器的信息。底部的窗格列出了传递给 JVM 的所有参数。 + +### MBeans + +最后一个标签,MBeans,让你通过所有的 MBeans 向下钻取,以查看每个 MBeans 的属性和值。 + +![MBeans 标签][9] + +### 总结 + +Java 已经存在了很长时间,它将继续为全球数百万的系统提供动力。有很多开发环境和监控系统可以使用,但像 `jconsole` 这样的包含在基本工具包中的工具非常有价值。 + +-------------------------------------------------------------------------------- + +via: https://opensource.com/article/21/10/monitor-java-linux-jconsole + +作者:[Alan Formy-Duval][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/alanfdoss +[b]: https://github.com/lujun9972 +[1]: https://opensource.com/sites/default/files/styles/image-full-size/public/lead-images/puzzle_computer_solve_fix_tool.png?itok=U0pH1uwj (Puzzle pieces coming together to form a computer screen) +[2]: https://opensource.com/sites/default/files/uploads/jconsole_new_connection_local.png (new connection) +[3]: https://creativecommons.org/licenses/by-sa/4.0/deed.ast +[4]: https://opensource.com/sites/default/files/uploads/jconsole_tab_overview.png (tab overview) +[5]: https://opensource.com/sites/default/files/uploads/jconsole_tab_memory.png (memory tab) +[6]: https://opensource.com/sites/default/files/uploads/jconsole_tab_threads.png (threads tab) +[7]: https://opensource.com/sites/default/files/uploads/jconsole_tab_classes.png (classes tab) +[8]: https://opensource.com/sites/default/files/uploads/jconsole_tab_vm-summary.png (VMsummary tab ) +[9]: https://opensource.com/sites/default/files/uploads/jconsole_tab_mbeans.png (MBeans tab) diff --git a/published/202110/20211003 Open Source Changed Linux Otherwise It Was Done- Linus Torvalds.md b/published/202110/20211003 Open Source Changed Linux Otherwise It Was Done- Linus Torvalds.md new file mode 100644 index 0000000000..792706a9e8 --- /dev/null +++ b/published/202110/20211003 Open Source Changed Linux Otherwise It Was Done- Linus Torvalds.md @@ -0,0 +1,57 @@ +[#]: subject: "Open Source Changed Linux Otherwise It Was Done: Linus Torvalds" +[#]: via: "https://news.itsfoss.com/open-source-changed-linux-torvalds/" +[#]: author: "Abhishek https://news.itsfoss.com/author/root/" +[#]: collector: "lujun9972" +[#]: translator: "zd200572" +[#]: reviewer: "wxy" +[#]: publisher: "wxy" +[#]: url: "https://linux.cn/article-13890-1.html" + +Linus Torvalds :开源改变了 Linux, 否则它就完了 +====== + +> Linux 本来会像其他业余项目一样被抛在后面,但开源改变了这一点。 + +![](https://i2.wp.com/news.itsfoss.com/wp-content/uploads/2021/10/torvalds-linux-kernel.png?w=1200&ssl=1) + +你可能已经知道这个故事,30 年前,芬兰学生 Linus Torvalds 开发了一个业余项目,创建了一个类 UNIX 操作系统。 + +你不知道的是,Torvalds 认为这个业余项目已经完成了,他本想把它抛在脑后,做一些新的、有趣的项目。 + +那么,是什么让他在这个“业余项目”上工作了 30 年呢?答案是开源。 + +### 开源改变了 Linux + +在最近结束的 [北美开源峰会][1] 上,Linus Torvalds 分享了一些关于 Linux 项目过去、现在和未来的见解。 + +当回忆起这个项目的最初情况时,[Torvalds 说][2] 他本以为会以“已完成的状态”抛下 Linux 这个项目,而去做些新的、有趣的事情。 + +> 显然是开源改变了这一切。这个项目,如果是由我来决定,我可能会把它抛在一边,但是突然间,我开始收到各种问题,最后还有人们提交的补丁,这使得我的动力不断持续。现在 30 年过去了,这仍然是动力所在。 + +Torvalds 还补充说,就他而言,Linux 在过去 29 年里已经完成了。以后添加的每一个其他的功能,都是其他人需要、想要或感兴趣的。 + +许多开发人员都会遇到这种情况。你在一个项目上工作,认为它已经达到“完成”的状态了,如果这个项目没有足够的吸引力,你就会对它失去兴趣,转而去做一些“新的、有趣的”事情。实际上继续这个项目的真正动力来自用户和认可。 + +当被问及 Linux 50 周年要做些什么时,Torvalds 说,他不认为自己在 70 岁的时候还能继续做内核编程。然后他还补充说,他也没想过自己在 50 岁还在做内核编程,但他现在却在做这个事情。 + +> “不知何故,我不认为我 70 岁还能做内核编程。但是另一方面,几年前,我也没想到自己 50 岁还在做内核编程,所以……我们拭目以待。” + +我们总是愿意听 Torvalds 谈论 Linux,作为一个热心的 Linux 用户,我们还有如此多需要学习和交流的东西! + +来源:[The News Stack][2] + +-------------------------------------------------------------------------------- + +via: https://news.itsfoss.com/open-source-changed-linux-torvalds/ + +作者:[Abhishek][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/root/ +[b]: https://github.com/lujun9972 +[1]: https://events.linuxfoundation.org/open-source-summit-north-america/ +[2]: https://thenewstack.io/linus-torvalds-on-community-rust-and-linuxs-longevity/ diff --git a/published/202110/20211005 Tools to explore BGP.md b/published/202110/20211005 Tools to explore BGP.md new file mode 100644 index 0000000000..5b9e728692 --- /dev/null +++ b/published/202110/20211005 Tools to explore BGP.md @@ -0,0 +1,364 @@ +[#]: subject: "Tools to explore BGP" +[#]: via: "https://jvns.ca/blog/2021/10/05/tools-to-look-at-bgp-routes/" +[#]: author: "Julia Evans https://jvns.ca/" +[#]: collector: "lujun9972" +[#]: translator: "wxy" +[#]: reviewer: "wxy" +[#]: publisher: "wxy" +[#]: url: "https://linux.cn/article-13857-1.html" + +由 Facebook 事故引发的 BGP 工具探索 +====== + +![](https://img.linux.net.cn/data/attachment/album/202110/07/093743krr8ftrpvgfrvffx.jpg) + +昨天,Facebook 发生了由 BGP 引起的离线事故。我对学习更多关于 BGP 的知识已经隐约感兴趣了很长时间,所以我阅读了一些文章。 + +我感到很沮丧,因为没有一篇文章告诉我如何在我的电脑上实际查找与 BGP 有关的信息,因此我 [写了一条询问有关工具的推特][1]。 + +我一如既往地得到了一堆有用的回复,所以这篇博文展示了一些你可以用来查询 BGP 信息的工具。这篇文章中可能会有较多的错误,因为我对 BGP 不是很了解。 + +### 我不能发布 BGP 路由 + +我从来没有了解过 BGP 的原因之一是,据我所知,我没有在互联网上发布 BGP 路由的权限。 + +对于大多数网络协议,如果需要,你可以非常轻松地自己实现该协议。例如,你可以: + + * 发行你自己的 TLS 证书 + * 编写你自己的 HTTP 服务器 + * 编写你自己的 TCP 实现 + * 为你的域名编写你自己的权威 DNS 服务器(我现在正在为一个小项目尝试这样做) + * 建立你自己的证书机构(CA) + +但是对于 BGP,我认为除非你拥有自己的 ASN,否则你不能自己发布路由(你*可以*在你的家庭网络上实现 BGP,但这对我来说有点无聊,当我做实验的时候,我希望它们真的在真正的互联网上)。 + +无论如何,尽管我不能用它做实验,但我仍然认为它超级有趣,因为我喜欢网络,所以我将向你展示我找到的一些用来学习 BGP 的工具。 + +首先我们来谈谈 BGP 的一些术语。我打算很快掠过,因为我对工具更感兴趣,而且网上有很多关于 BGP 的高水平解释(比如这篇 [cloudflare 的文章][2])。 + +### AS 是什么? + +我们首先需要了解的是 AS(“自治系统autonomous system”)。每个 AS: + + 1. 由一个组织拥有(通常是一个大型组织,如你的 ISP、政府、大学、Facebook 等)。 + 2. 控制一组特定的 IP 地址(例如,我的 ISP 的 AS 包括 247,808 个 IP 地址)。 + 3. 有一个编号 ASN(如 1403)。 + +下面是我通过做一些实验对 AS 的一些观察: + + * 一些相当大的科技公司并没有自己的 AS。例如,我在 BGPView 上查看了 Patreon,就我所知,他们没有自己的 AS,他们的主要网站(`patreon.com`,[104.16.6.49][3])在 Cloudflare 的 AS 中。 + * 一个 AS 可以包括许多国家的 IP。Facebook 的 AS([AS32934][4])肯定有新加坡、加拿大、尼日利亚、肯尼亚、美国和其他国家的 IP 地址。 + * 似乎 IP 地址可以在一个以上的 AS 中。例如,如果我查找 [209.216.230.240][5],它有 2 个 ASN 与之相关:`AS6130` 和 `AS21581`。显然,当这种情况发生时,更具体的路线会被优先考虑 —— 所以到该 IP 的数据包会被路由到 `AS21581`。 + +### 什么是 BGP 路由? + +互联网上有很多的路由器。例如,我的 ISP 就有路由器。 + +当我给我的 ISP 发送一个数据包时(例如通过运行 `ping 129.134.30.0`),我的 ISP 的路由器需要弄清楚如何将我的数据包实际送到 IP 地址 `129.134.30.0`。 + +路由器计算的方法是,它有一个**路由表**:这是个有一堆 IP 地址范围的列表(比如 `129.134.30.0/23`),以及它知道的到达该子网的路由。 + +下面是一个 `129.134.30.0/23` (Facebook 的一个子网)的真实路由的例子。这不是来自我的 ISP。 + +``` +11670 32934 + 206.108.35.2 from 206.108.35.254 (206.108.35.254) + Origin IGP, metric 0, valid, external + Community: 3856:55000 + Last update: Mon Oct 4 21:17:33 2021 +``` + +我认为这是在说通往 `129.134.30.0` 的一条路径是通过机器 `206.108.35.2`,这是在它的本地网络上。所以路由器接下来可能会把我的 ping 包发送到 `206.108.35.2`,然后 `206.108.35.2` 会知道如何把它送到 Facebook。开头的两个数字(`11670 32934`)是 ASN。 + +### BGP 是什么? + +我对 BGP 的理解非常浅薄,它是一个公司用来公布 BGP 路由的协议。 + +昨天发生在 Facebook 身上的事情基本上是他们发布了一个 BGP 公告,撤销了他们所有的 BGP 路由,所以世界上的每个路由器都删除了所有与 Facebook 有关的路由,没有流量可以到达那里。 + +好了,现在我们已经涵盖了一些基本的术语,让我们来谈谈你可以用来查看 AS 和 BGP 的工具吧! + +### 工具 1:用 BGPView 查看你的 ISP 的 AS + +为了使 AS 这个东西不那么抽象,让我们用一个叫做 [BGPView][6]的 工具来看看一个真实的 AS。 + +我的 ISP(EBOX)拥有 [AS 1403][7]。这是 [我的 ISP 拥有的 IP 地址][8]。如果我查找我的计算机的公共 IPv4 地址,我可以看到它是我的 ISP 拥有的IP地址之一:它在 `104.163.128.0/17` 块中。 + +BGPView 也有这个图,显示了我的 ISP 与其他 AS 的连接情况。 + +![][9] + +### 工具 2:traceroute -A 和 mtr -z + +好了,我们感兴趣的是 AS 。让我们看看我从哪些 AS 中穿过。 + +`traceroute` 和 `mtr` 都有选项可以告诉你每个 IP 的 ASN。其选项分别是 `traceroute -A` 和 `mtr -z`。 + +让我们看看我用 `mtr` 在去 `facebook.com` 的路上经过了哪些 AS! + +``` +$ mtr -z facebook.com + 1. AS??? LEDE.lan + 2. AS1403 104-163-190-1.qc.cable.ebox.net + 3. AS??? 10.170.192.58 + 4. AS1403 0.et-5-2-0.er1.mtl7.yul.ebox.ca + 5. AS1403 0.ae17.er2.mtl3.yul.ebox.ca + 6. AS1403 0.ae0.er1.151fw.yyz.ebox.ca + 7. AS??? facebook-a.ip4.torontointernetxchange.net + 8. AS32934 po103.psw01.yyz1.tfbnw.net + 9. AS32934 157.240.38.75 +10. AS32934 edge-star-mini-shv-01-yyz1.facebook.com +``` + +这很有意思,看起来我们直接从我的 ISP 的 AS(`1403`)到 Facebook 的 AS(`32934`),中间有一个“互联网交换”。 + +> 我不确定 [互联网交换][10]internet exchange(IX)是什么,但我知道它是互联网的一个极其重要的部分。不过这将是以后的事了。我猜是,它是互联网中实现“对等”的部分,就假设它是一个有巨大的交换机的机房,里面有无限的带宽,一堆不同的公司把他们的电脑放在里面,这样他们就可以互相发送数据包。 + +#### mtr 用 DNS 查找 ASN + +我对 `mtr` 如何查找 ASN 感到好奇,所以我使用了 `strace`。我看到它看起来像是在使用 DNS,所以我运行了 [dnspeep][11],然后就看到了! + +``` +$ sudo dnspeep +... +TXT 1.190.163.104.origin.asn.cymru.com 192.168.1.1 TXT: 1403 | 104.163.176.0/20 | CA | arin | 2014-08-14, TXT: 1403 | 104.163.160.0/19 | CA | arin | 2014-08-14, TXT: 1403 | 104.163.128.0/17 | CA | arin | 2014-08-14 +... +``` + +所以,看起来我们可以通过查找 `1.190.163.104.origin.asn.cymru.com` 上的 `txt` 记录找到 `104.163.190.1` 的 ASN,像这样: + +``` +$ dig txt 1.190.163.104.origin.asn.cymru.com +1.190.163.104.origin.asn.cymru.com. 13911 IN TXT "1403 | 104.163.160.0/19 | CA | arin | 2014-08-14" +1.190.163.104.origin.asn.cymru.com. 13911 IN TXT "1403 | 104.163.128.0/17 | CA | arin | 2014-08-14" +1.190.163.104.origin.asn.cymru.com. 13911 IN TXT "1403 | 104.163.176.0/20 | CA | arin | 2014-08-14" +``` + +这很好!让我们继续前进吧。 + +### 工具 3:数据包交换所的观察镜 + +PCH(“数据包交换所packet clearing house”)是运行大量互联网交换点的组织。“观察镜looking glass”似乎是一个通用术语,指的是让你从另一个人的计算机上运行网络命令的 Web 表单。有一些观察镜不支持 BGP,但我只对那些能显示 BGP 路由信息的观察镜感兴趣。 + +这里是 PCH 的观察镜: 。 + +在该网站的 Web 表单中,我选择了多伦多 IX(“TORIX”),因为 `mtr` 说我是用它来访问 `facebook.com` 的。 + +#### 操作 1:显示 ip bgp 摘要 + +下面是输出结果。我修改了其中的一些内容: + +``` +IPv4 Unicast Summary: +BGP router identifier 74.80.118.4, local AS number 3856 vrf-id 0 +BGP table version 33061919 +RIB entries 513241, using 90 MiB of memory +Peers 147, using 3003 KiB of memory +Peer groups 8, using 512 bytes of memory + +Neighbor V AS MsgRcvd MsgSent TblVer InQ OutQ Up/Down State/PfxRcd +... +206.108.34.248 4 1403 484672 466938 0 0 0 05w3d03h 50 +... +206.108.35.2 4 32934 482088 466714 0 0 0 01w6d07h 38 +206.108.35.3 4 32934 482019 466475 0 0 0 01w0d06h 38 +... + +Total number of neighbors 147 +``` + +我的理解是,多伦多 IX(“TORIX”)直接连接到我的 ISP (EBOX,AS 1403)和 Facebook(AS 32934)。 + +#### 操作 2:显示 ip bgp 129.134.30.0 + +这是筛选自 `show ip bgp` 对 `129.134.30.0`(Facebook 的一个 IP 地址)的输出: + +``` +BGP routing table entry for 129.134.30.0/23 +Paths: (4 available, best #4, table default) + Advertised to non peer-group peers: + 206.220.231.55 + 11670 32934 + 206.108.35.2 from 206.108.35.254 (206.108.35.254) + Origin IGP, metric 0, valid, external + Community: 3856:55000 + Last update: Mon Oct 4 21:17:33 2021 + + 11670 32934 + 206.108.35.2 from 206.108.35.253 (206.108.35.253) + Origin IGP, metric 0, valid, external + Community: 3856:55000 + Last update: Mon Oct 4 21:17:31 2021 + + 32934 + 206.108.35.3 from 206.108.35.3 (157.240.58.225) + Origin IGP, metric 0, valid, external, multipath + Community: 3856:55000 + Last update: Mon Oct 4 21:17:27 2021 + + 32934 + 206.108.35.2 from 206.108.35.2 (157.240.58.182) + Origin IGP, metric 0, valid, external, multipath, best (Older Path) + Community: 3856:55000 + Last update: Mon Oct 4 21:17:27 2021 +``` + +这似乎是在说,从该 IX 到 Facebook 有 4 条路线。 + +**魁北克 IX 似乎对 Facebook 一无所知**。 + +我也试过从魁北克 IX(“QIX”,它可能离我更近,因为我住在蒙特利尔而不是多伦多)做同样的事情。但 QIX 似乎对 Facebook 一无所知:当我输入`129.134.30.0` 时,它只是说 “% 网络不在表中”。 + +所以我想这就是为什么我被送到多伦多 IX 而不是魁北克的 IX。 + +#### 更多的 BGP 观察镜 + +这里还有一些带观察镜的网站,可以从其他角度给你类似的信息。它们似乎都支持相同的 `show ip bgp` 语法,也许是因为他们运行的是同一个软件?我不太确定。 + + * + * + * + +似乎有很多这样的观察镜服务,远不止这 3 个列表。 + +这里有一个与这个列表上的一个服务器进行会话的例子:`route-views.routeviews.org`。这次我是通过 telnet 连接的,而不是通过 Web 表单,但输出的格式看起来是一样的。 + +``` +$ telnet route-views.routeviews.org + +route-views>show ip bgp 31.13.80.36 + +BGP routing table entry for 31.13.80.0/24, version 1053404087 +Paths: (23 available, best #2, table default) + Not advertised to any peer + Refresh Epoch 1 + 3267 1299 32934 + 194.85.40.15 from 194.85.40.15 (185.141.126.1) + Origin IGP, metric 0, localpref 100, valid, external + path 7FE0C3340190 RPKI State valid + rx pathid: 0, tx pathid: 0 + Refresh Epoch 1 + 6939 32934 + 64.71.137.241 from 64.71.137.241 (216.218.252.164) + Origin IGP, localpref 100, valid, external, best + path 7FE135DB6500 RPKI State valid + rx pathid: 0, tx pathid: 0x0 + Refresh Epoch 1 + 701 174 32934 + 137.39.3.55 from 137.39.3.55 (137.39.3.55) + Origin IGP, localpref 100, valid, external + path 7FE1604D3AF0 RPKI State valid + rx pathid: 0, tx pathid: 0 + Refresh Epoch 1 + 20912 3257 1299 32934 + 212.66.96.126 from 212.66.96.126 (212.66.96.126) + Origin IGP, localpref 100, valid, external + Community: 3257:8095 3257:30622 3257:50001 3257:53900 3257:53904 20912:65004 + path 7FE1195AF140 RPKI State valid + rx pathid: 0, tx pathid: 0 + Refresh Epoch 1 + 7660 2516 1299 32934 + 203.181.248.168 from 203.181.248.168 (203.181.248.168) + Origin IGP, localpref 100, valid, external + Community: 2516:1030 7660:9001 + path 7FE0D195E7D0 RPKI State valid + rx pathid: 0, tx pathid: 0 +``` + +这里有几个路由的选择: + + * `3267 1299 32934` + * `6939 32934` + * `701 174 32934` + * `20912 3257 1299 32934` + * `7660 2516 1299 32934` + +我想这些都有不止一个 AS 的原因是,`31.13.80.36` 是 Facebook 在多伦多的 IP 地址,所以这个服务器(可能在美国西海岸,我不确定)不能直接连接到它,它需要先到另一个 AS。所以所有的路由都有一个或多个 ASN。 + +最短的是 `6939`(“Hurricane Electric”),它是一个 “全球互联网骨干”。他们也有自己的 [Hurricane Electric 观察镜][12] 页面。 + +### 工具 4:BGPlay + +到目前为止,所有其他的工具都只是向我们展示了 Facebook 路由的当前状态,其中一切正常,但这第四个工具让我们看到了这个 Facebook BGP 互联网灾难的历史。这是一个 GUI 工具,所以我将包括一堆屏幕截图。 + +该工具在 。我输入了 IP 地址 `129.134.30.12`(Facebook 的一个 IP),如果你想一起试试。 + +首先,让我们看看一切出错之前的状态。我点击了在 10 月 4 日 13:11:28 的时间线,得到了这个结果: + +![][13] + +我最初发现这很让人不知所措。发生了什么事?但后来有人在推特上指出,下一个要看的地方是点击 Facebook 灾难发生后的时间线(10 月 4 日 18 点 38 分)。 + +![][14] + +很明显,这张图有问题:所有的 BGP 路线都不见了!哦,不要! + +顶部的文字显示了最后一条 Facebook BGP 路由的消失: + +``` +Type: W > withdrawal Involving: 129.134.30.0/24 +Short description: The route 50869, 25091, 32934 has been withdrawn. +Date and time: 2021-10-04 16:02:33 Collected by: 20-91.206.53.12 +``` + +如果我再点击“快进fast forward”按钮,我们看到 BGP 路由开始回来了。 + +![][15] + +第一个宣告的是 `137409 32934`。但我不认为这实际上是第一个宣布的,在同一秒内有很多路由宣告(在 2021-10-04 21:00:40),我认为 BGPlay 内部的排序是任意的。 + +如果我再次点击“快进fast forward”按钮,越来越多的路由开始回来,路由开始恢复正常。 + +我发现在 BGPlay 里看这个故障真的很有趣,尽管一开始界面很混乱。 + +### 也许了解一下 BGP 是很重要的? + +我在这篇文章的开头说,你不能改变 BGP 路由,但后来我想起在 2016 年或 2017 年,有一个 [Telia 路由问题][16],给我们的工作造成了一些小的网络问题。而当这种情况发生时,了解为什么你的客户无法到达你的网站其实是很有用的,即使它完全不受你控制。当时我不知道这些工具,但我希望能知道! + +我认为对于大多数公司来说,应对由其他人的错误 BGP 路由造成的中断,你所能做的就是“什么都不做,等待它得到修复”,但能够_自信地_什么都不做是很好的。 + +### 一些发布 BGP 路由的方法 + +如果你想(作为一个业余爱好者)真正发布 BGP 路由,这里有一些评论中的链接: + + * [获取你自己的 ASN 的指南][17] + * [dn42][18] 似乎有一个 BGP 的实验场(它不在公共互联网上,但确实有其他人在上面,这似乎比自己在家里做 BGP 实验更有趣) + +### 目前就这些了 + +我想还有很多 BGP 工具(比如 PCH 有一堆 [路由数据的每日快照][19],看起来很有趣),但这篇文章已经很长了,而且我今天还有其他事情要做。 + +我对我作为一个普通人可以得到这么多关于 BGP 的信息感到惊讶,我一直认为它是一个“秘密的网络巫师”这样的东西,但显然有各种公共机器,任何人都可以直接 telnet 到它并用来查看路由表!没想到! + +-------------------------------------------------------------------------------- + +via: https://jvns.ca/blog/2021/10/05/tools-to-look-at-bgp-routes/ + +作者:[Julia Evans][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://jvns.ca/ +[b]: https://github.com/lujun9972 +[1]: https://twitter.com/b0rk/status/1445199475195236356 +[2]: https://blog.cloudflare.com/october-2021-facebook-outage/ +[3]: https://bgpview.io/ip/104.16.6.49 +[4]: https://bgpview.io/asn/32934#prefixes-v4 +[5]: https://bgpview.io/ip/209.216.230.240 +[6]: https://bgpview.io +[7]: https://bgpview.io/asn/1403 +[8]: https://bgpview.io/asn/1403#prefixes-v4 +[9]: https://jvns.ca/images/ebox-graph.png +[10]: https://en.wikipedia.org/wiki/Internet_exchange_point +[11]: https://github.com/jvns/dnspeep/ +[12]: https://lg.he.net/ +[13]: https://jvns.ca/images/bgplay-before.png +[14]: https://jvns.ca/images/bgplay-after.png +[15]: https://jvns.ca/images/bgplay-return.png +[16]: https://news.ycombinator.com/item?id=14246888 +[17]: https://labs.ripe.net/author/samir_jafferali/build-your-own-anycast-network-in-nine-steps/ +[18]: https://dn42.eu/Home +[19]: https://www.pch.net/resources/Routing_Data/IPv4_daily_snapshots/ diff --git a/published/202110/20211006 Check Java processes on Linux with the jps command.md b/published/202110/20211006 Check Java processes on Linux with the jps command.md new file mode 100644 index 0000000000..b43db9696d --- /dev/null +++ b/published/202110/20211006 Check Java processes on Linux with the jps command.md @@ -0,0 +1,70 @@ +[#]: subject: "Check Java processes on Linux with the jps command" +[#]: via: "https://opensource.com/article/21/10/check-java-jps" +[#]: author: "Alan Formy-Duval https://opensource.com/users/alanfdoss" +[#]: collector: "lujun9972" +[#]: translator: "unigeorge" +[#]: reviewer: "turbokernel" +[#]: publisher: "wxy" +[#]: url: "https://linux.cn/article-13871-1.html" + +在 Linux 上使用 jps 命令检查 Java 进程 +====== + +> 系统上运行着诸多进程,通过 `jps` 命令能够快速有效识别 Java 进程。 + +![](https://img.linux.net.cn/data/attachment/album/202110/11/102806lhhtyalq2lv2vbte.jpg) + +在 Linux 中,有一些用于查看系统上运行进程的命令。进程是指由内核管理的正在进行的事件。每启动一个应用程序时,就会产生一个进程,但也有许多在计算机后台运行的进程,如保持系统时间准确的进程、监听新文件系统的进程、索引化文件的进程等。有一些可以用来监测这些进程的实用程序,比如包含在 [procps-ng 包][2] 中的程序,但它们往往都是对各种进程通用的。它们会查看计算机上的所有进程,你可以根据需要过滤结果列表。 + +在 Linux 中,可以通过 `ps` 命令查看进程。这是查看当前系统上运行进程最简单的方法。 + +``` +$ ps +    PID TTY          TIME CMD +   4486 pts/0    00:00:00 bash +  66930 pts/0    00:00:00 ps +``` + +你也可以通过 `ps` 命令,并配合结果输出管道符进行 `grep`,从而查看系统上运行的 Java 进程,。 + +``` +$ ps ax |grep java + 67604 pts/1 Sl+ 0:18 /usr/lib/jvm/java-11-openjdk-11.0.12.0.7-4.fc34.x86_64/bin/java -D[Standalone] -server -Xms64m -Xmx512m -XX:MetaspaceSize=96M -XX:MaxMetaspaceSize=256m -Djava.net.preferIPv4Stack=true -Djboss.modules.system.pkgs=org.jboss.byteman -Djava.awt.headless=true --add-exports=java.desktop/sun.awt=ALL-UNNAMED --add-exports=java.naming/com.sun.jndi.ldap=ALL-UNNAMED --add-opens=java.base/java.lang=ALL-UNNAMED --add-opens=java.base/java.lang.invoke=ALL-UNNAMED --add-opens=java.base/java.io=ALL-UNNAMED --add-opens=java.base/java.security=ALL-UNNAMED --add-opens=java.base/java.util=ALL-UNNAMED --add-opens=java.management/javax.management=ALL-UNNAMED --add-opens=java.naming/javax.naming=ALL-UNNAMED -Dorg.jboss.boot.log.file=/home/alan/wildfly/24.0.1/standalone/log/server.log -Dlogging.configuration=file:/home/alan/wildfly/24.0.1/standalone/configuration/logging.properties -jar /home/alan/wildfly/24.0.1/jboss-modules.jar -mp /home/alan/wildfly/24.0.1/modules org.jboss.as.standalone -Djboss.home.dir=/home/alan/wildfly/24.0.1 -Djboss.server.base.dir=/home/alan/wildfly/24.0.1/standalone +``` + +然而,OpenJDK 有自己专属的进程监视器。Java 虚拟机进程状态Java Virtual Machine Process Status(jps)工具可以帮你扫描系统上所有运行的 Java 虚拟机(JVM)实例。 + +要想实现与 `ps` 命令类似的输出,可以使用 `-v` 选项。这很实用,这与 `ps` 相比,可以减少你的输入。 + +``` +$ jps -v +67604 jboss-modules.jar -D[Standalone] -Xms64m -Xmx512m -XX:MetaspaceSize=96M -XX:MaxMetaspaceSize=256m -Djava.net.preferIPv4Stack=true -Djboss.modules.system.pkgs=org.jboss.byteman -Djava.awt.headless=true --add-exports=java.desktop/sun.awt=ALL-UNNAMED --add-exports=java.naming/com.sun.jndi.ldap=ALL-UNNAMED --add-opens=java.base/java.lang=ALL-UNNAMED --add-opens=java.base/java.lang.invoke=ALL-UNNAMED --add-opens=java.base/java.io=ALL-UNNAMED --add-opens=java.base/java.security=ALL-UNNAMED --add-opens=java.base/java.util=ALL-UNNAMED --add-opens=java.management/javax.management=ALL-UNNAMED --add-opens=java.naming/javax.naming=ALL-UNNAMED -Dorg.jboss.boot.log.file=/home/alan/wildfly/24.0.1/standalone/log/server.log -Dlogging.configuration=file:/home/alan/wildfly/24.0.1/standalone/configuration/logging.properties +``` + +`jps` 命令的默认输出包含进程标识符,类名或 Jar 文件名。 + +``` +$ jps +67604 jboss-modules.jar +69430 Jps +``` + +**注意:** `jps` 的手册页指出此命令是试验性且不受支持的。尽管如此,它仍然是一个不错的选择,因为一个系统通常运行着许多进程,这种只识别 Java 进程的快速方法是很有用的。 + +当下的 Java 仍然是一种流行的语言,所以熟悉 Java 开发工具包和运行时环境仍然很重要。它们包含着许多适用于 Java 应用程序开发和维护的工具。 + +-------------------------------------------------------------------------------- + +via: https://opensource.com/article/21/10/check-java-jps + +作者:[Alan Formy-Duval][a] +选题:[lujun9972][b] +译者:[unigeorge](https://github.com/unigeorge) +校对:[turbokernel](https://github.com/turbokernel) + +本文由 [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/java-coffee-beans.jpg?itok=3hkjX5We (Coffee beans) +[2]: https://opensource.com/article/21/8/linux-procps-ng diff --git a/published/202110/20211006 DirectX 11-12 Games like Cyberpunk 2077 Can Use NVIDIA DLSS With Proton Experimental on Linux.md b/published/202110/20211006 DirectX 11-12 Games like Cyberpunk 2077 Can Use NVIDIA DLSS With Proton Experimental on Linux.md new file mode 100644 index 0000000000..6ae2ebe009 --- /dev/null +++ b/published/202110/20211006 DirectX 11-12 Games like Cyberpunk 2077 Can Use NVIDIA DLSS With Proton Experimental on Linux.md @@ -0,0 +1,94 @@ +[#]: subject: "DirectX 11/12 Games like Cyberpunk 2077 Can Use NVIDIA DLSS With Proton Experimental on Linux" +[#]: via: "https://news.itsfoss.com/nvidia-dlss-dx-11-12-proton/" +[#]: author: "Rishabh Moharir https://news.itsfoss.com/author/rishabh/" +[#]: collector: "lujun9972" +[#]: translator: "wxy" +[#]: reviewer: "wxy" +[#]: publisher: "wxy" +[#]: url: "https://linux.cn/article-13865-1.html" + +《赛博朋克 2077》等 DirectX 11/12 游戏可在 Linux 上体验 DLSS 了 +====== + +> 通过 Steam Proton 的实验版本,期待已久的 Nvidia DLSS 支持在 Linux 上的 DirectX 11/12 大作中出现。 + +![](https://i0.wp.com/news.itsfoss.com/wp-content/uploads/2021/10/nvidia-dlss-proton.png?w=1200&ssl=1) + +6 月,英伟达 [宣布][1] 通过 Steam Proton 支持 Linux 中的 DLSS,并为基于 Vulkan 的游戏提供了测试版驱动程序。 + +DLSS 是指深度学习超级采样Deep Learning Super Sampling。它利用由 RTX GPU 中的 Tensor 核心提供支持的深度学习算法来提升游戏中的图像。这将使图像更清晰、更锐利,并提高帧率。 + +![来源:英伟达][2] + +这种 [升级技术][3] 类似于 AMD 的 Fidelity FX,甚至更接近于英特尔即将推出的 XeSS,与 DLSS 不同的是这两者都是开源的。玩家已经可以通过 [GloriousEggroll][4] 的定制 Proton GE 版本体验到 Fidelity FX。 + +此外,英伟达还计划在今年秋天之前将支持范围扩大到 DirectX 游戏。 + +而且,随着最新的 Proton 实验性支持,这一切终于实现了。使用英伟达 GPU 的 Linux 游戏玩家现在可以用 DLSS 玩他们最喜欢的基于 DX11/12 的游戏。 + +考虑到我们很快就能在 Linux 上玩各种多人游戏,并且 [Proton 中添加了对 BattleEye & Easy-Anti Cheat 的支持][5],这是进行这项添加的最好时机。 + +### Steam Porton 的重大更新 + +几天前,伴随着 Proton 6.3-7 的一波改进,Valve 终于设法将 DLSS 支持添加到 Proton 的 DirectX 11/12 游戏实验分支中。 + +在此之前,需要一个测试版驱动程序才能将 DLSS 用于基于 Vulkan 的游戏,例如 DOOM Eternal。 + +但是,现在不再如此 —— 尽管推荐使用最新的驱动程序。 + +作为补充,DXVK 和 Steamworks SDK 也已经更新到最新的开发版本。此外,还修复了特定游戏的性能问题和其他错误。 + +你可以查看 Proton 的 [官方 GitHub 更新日志][6] 来了解到目前为止支持的所有游戏的改进列表。 + +### 为 DX11/12 游戏启用 DLSS + +启用 DLSS 是一个简单明了的过程。 + +首先,你必须确保你的 Windows 游戏可以在 Proton Experimental 上运行。 + +这可以通过右键点击游戏并选择“属性Properties”来完成。然后在“兼容性Compatibility”下,你需要勾选“强制使用特定的 Steam Play 兼容工具Force the use of a specific Steam Play compatibility tool”复选框。接下来,从下拉菜单中选择 “Proton Experimental”。 + +![][7] + +最后,你需要在“启动选项Launch Options”中插入命令:`PROTON_HIDE_NVIDIA_GPU=0 PROTON_ENABLE_NVAPI=1 %command%` 。 + +![][8] + +这就行了。你就可以用 DLSS 玩你的游戏了! + +### 总结 + +英伟达 DLSS 对于许多游戏来说是一个非常需要的功能,因为它的作用很大。 + +Linux 从一开始就没有对 DLSS 的全面支持。但是,看起来它很快就会在未来的 Proton 稳定版本中提供,并进行必要的改进。 + +Linux 玩家终于可以用基于 RTX 的 GPU 在许多游戏中体验到更好的帧率和视觉质量。 + +虽然我在 AMD 显卡上使用 Fidelity FX,但我仍然渴望在 RTX GPU 上尝试 DLSS! + +你对英伟达 DLSS 的到来有什么感觉?你会很快尝试它吗?欢迎在下面分享你的评论。 + +转自:[GamingOnLinux][9]。 + +-------------------------------------------------------------------------------- + +via: https://news.itsfoss.com/nvidia-dlss-dx-11-12-proton/ + +作者:[Rishabh Moharir][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://news.itsfoss.com/author/rishabh/ +[b]: https://github.com/lujun9972 +[1]: https://www.nvidia.com/en-us/geforce/news/june-2021-rtx-dlss-game-update/ +[2]: https://i0.wp.com/news.itsfoss.com/wp-content/uploads/2021/10/DLSS_RDD2.jpg?w=800&ssl=1 +[3]: https://news.itsfoss.com/intel-xess-open-source/ +[4]: https://github.com/GloriousEggroll/proton-ge-custom +[5]: https://news.itsfoss.com/easy-anti-cheat-linux/ +[6]: https://github.com/ValveSoftware/Proton/wiki/Changelog +[7]: https://i2.wp.com/news.itsfoss.com/wp-content/uploads/2021/10/Compatibility.png?w=836&ssl=1 +[8]: https://i2.wp.com/news.itsfoss.com/wp-content/uploads/2021/10/Commands-1.png?w=831&ssl=1 +[9]: https://www.gamingonlinux.com/2021/10/proton-experimental-expands-nvidia-dlss-support-on-linux-to-directx-11-titles diff --git a/published/202110/20211007 Rotate and archive logs with the Linux logrotate command.md b/published/202110/20211007 Rotate and archive logs with the Linux logrotate command.md new file mode 100644 index 0000000000..54fed8f9b4 --- /dev/null +++ b/published/202110/20211007 Rotate and archive logs with the Linux logrotate command.md @@ -0,0 +1,218 @@ +[#]: subject: "Rotate and archive logs with the Linux logrotate command" +[#]: via: "https://opensource.com/article/21/10/linux-logrotate" +[#]: author: "Ayush Sharma https://opensource.com/users/ayushsharma" +[#]: collector: "lujun9972" +[#]: translator: "perfiffer" +[#]: reviewer: "wxy" +[#]: publisher: "wxy" +[#]: url: "https://linux.cn/article-13909-1.html" + +使用 logrotate 命令轮转和归档日志 +====== + +> 使用此 Linux 命令保持日志文件更新。 + +![](https://img.linux.net.cn/data/attachment/album/202110/22/113833i6ikk4dzdm3y3hkk.jpg) + +日志非常适合找出应用程序在做什么或对可能的问题进行故障排除。几乎我们处理的每个应用程序都会生成日志,我们希望我们自己开发的应用程序也生成日志。日志越详细,我们拥有的信息就越多。但放任不管,日志可能会增长到无法管理的大小,反过来,它们可能会成为它们自己的问题。因此,最好将它们进行裁剪,保留我们需要的那些,并将其余的归档。 + +### 基本功能 + +`logrotate` 实用程序在管理日志方面非常出色。它可以轮转日志、压缩日志、通过电子邮件发送日志、删除日志、归档日志,并在你需要时开始记录最新的。 + +运行 `logrotate` 非常简单——只需要运行 `logrotate -vs state-file config-file`。在上面的命令中,`v` 选项开启详细模式,`s` 指定一个状态文件,最后的 `config-file` 是配置文件,你可以指定需要做什么。 + +### 实战演练 + +让我们看看在我们的系统上静默运行的 `logrotate` 配置,它管理我们在 `/var/log` 目录中找到的大量日志。查看该目录中的当前文件。你是否看到很多 `*.[number].gz` 文件?这就是 `logrotate` 正在做的。你可以在 `/etc/logrotate.d/rsyslog` 下找到此配置文件。我的配置文件如下: + +``` +/var/log/syslog +{ +        rotate 7 +        daily +        missingok +        notifempty +        delaycompress +        compress +        postrotate +                reload rsyslog > /dev/null 2>&1 || true +        endscript +} + +/var/log/mail.info +/var/log/mail.warn +/var/log/mail.err +/var/log/mail.log +/var/log/daemon.log +/var/log/kern.log +/var/log/auth.log +/var/log/user.log +/var/log/lpr.log +/var/log/cron.log +/var/log/debug +/var/log/messages + +{ +        rotate 4 +        weekly +        missingok +        notifempty +        compress +        delaycompress +        sharedscripts +        postrotate +                reload rsyslog > /dev/null 2>&1 || true +        endscript +} +``` + +该文件首先定义了轮转 `/var/log/syslog` 文件的说明,这些说明包含在后面的花括号中。以下是它们的含义: + + * `rotate 7`: 保留最近 7 次轮转的日志。然后开始删除超出的。 + * `daily`: 每天轮转日志,与 `rotate 7` 一起使用,这意味着日志将保留过去 7 天。其它选项是每周、每月、每年。还有一个大小参数,如果日志文件的大小增加超过指定的限制(例如,大小 10k、大小 10M、大小 10G 等),则将轮转日志文件。如果未指定任何内容,日志将在运行 `logrotate` 时轮转。你甚至可以在 cron 中运行 `logrotate` 以便在更具体的时间间隔内使用它。 + * `missingok`: 如果日志文件缺失也没关系。不要惊慌。 + * `notifempty`: 日志文件为空时不轮转。 + * `compress`: 开启压缩,使用 `nocompress` 关闭它。 + * `delaycompress`: 如果压缩已打开,则将压缩延迟到下一次轮转。这允许至少存在一个轮转但未压缩的文件。如果你希望昨天的日志保持未压缩以便进行故障排除,那么此配置会很有用。如果某些程序在重新启动/重新加载之前可能仍然写入旧文件,这也很有帮助,例如 Apache。 + * `postrotate/endscript`: 轮转后运行此部分中的脚本。有助于做清理工作。还有一个 `prerotate/endscript` 用于在轮转开始之前执行操作。 + +你能弄清楚下一节对上面配置中提到的所有文件做了什么吗?第二节中唯一多出的参数是 `sharedscripts`,它告诉 `logrotate` 在所有日志轮转完成之前不要运行 `postrotate/endscript` 中的部分。它可以防止脚本在每一次轮转时执行,只在最后一次轮转完成时执行。 + +### 看点新的东西 + +我使用下面的配置来处理我系统上的 `Nginx` 的访问和错误日志。 + +``` +/var/log/nginx/access.log +/var/log/nginx/error.log  { +        size 1 +        missingok +        notifempty +        create 544 www-data adm +        rotate 30 +        compress +        delaycompress +        dateext +        dateformat -%Y-%m-%d-%s +        sharedscripts +        extension .log +        postrotate +                service nginx reload +        endscript +} +``` + +上面的脚本可以使用如下命令运行: + +``` +logrotate -vs state-file /tmp/logrotate +``` + +第一次运行该命令会给出以下输出: + +``` +reading config file /tmp/logrotate +extension is now .log + +Handling 1 logs + +rotating pattern: /var/log/nginx/access.log +/var/log/nginx/error.log   1 bytes (30 rotations) +empty log files are not rotated, old logs are removed +considering log /var/log/nginx/access.log +  log needs rotating +considering log /var/log/nginx/error.log +  log does not need rotating +rotating log /var/log/nginx/access.log, log->rotateCount is 30 +Converted ' -%Y-%m-%d-%s' -> '-%Y-%m-%d-%s' +dateext suffix '-2021-08-27-1485508250' +glob pattern '-[0-9][0-9][0-9][0-9]-[0-9][0-9]-[0-9][0-9]-[0-9][0-9][0-9][0-9][0-9][0-9][0-9][0-9][0-9][0-9]' +glob finding logs to compress failed +glob finding old rotated logs failed +renaming /var/log/nginx/access.log to /var/log/nginx/access-2021-08-27-1485508250.log +creating new /var/log/nginx/access.log mode = 0544 uid = 33 gid = 4 +running postrotate script +* Reloading nginx configuration nginx +``` + +第二次运行它: + +``` +reading config file /tmp/logrotate +extension is now .log + +Handling 1 logs + +rotating pattern: /var/log/nginx/access.log +/var/log/nginx/error.log   1 bytes (30 rotations) +empty log files are not rotated, old logs are removed +considering log /var/log/nginx/access.log +  log needs rotating +considering log /var/log/nginx/error.log +  log does not need rotating +rotating log /var/log/nginx/access.log, log->rotateCount is 30 +Converted ' -%Y-%m-%d-%s' -> '-%Y-%m-%d-%s' +dateext suffix '-2021-08-27-1485508280' +glob pattern '-[0-9][0-9][0-9][0-9]-[0-9][0-9]-[0-9][0-9]-[0-9][0-9][0-9][0-9][0-9][0-9][0-9][0-9][0-9][0-9]' +compressing log with: /bin/gzip +renaming /var/log/nginx/access.log to /var/log/nginx/access-2021-08-27-1485508280.log +creating new /var/log/nginx/access.log mode = 0544 uid = 33 gid = 4 +running postrotate script +* Reloading nginx configuration nginx +``` + +第三次运行它: + +``` +reading config file /tmp/logrotate +extension is now .log + +Handling 1 logs + +rotating pattern: /var/log/nginx/access.log +/var/log/nginx/error.log   1 bytes (30 rotations) +empty log files are not rotated, old logs are removed +considering log /var/log/nginx/access.log +  log needs rotating +considering log /var/log/nginx/error.log +  log does not need rotating +rotating log /var/log/nginx/access.log, log->rotateCount is 30 +Converted ' -%Y-%m-%d-%s' -> '-%Y-%m-%d-%s' +dateext suffix '-2021-08-27-1485508316' +glob pattern '-[0-9][0-9][0-9][0-9]-[0-9][0-9]-[0-9][0-9]-[0-9][0-9][0-9][0-9][0-9][0-9][0-9][0-9][0-9][0-9]' +compressing log with: /bin/gzip +renaming /var/log/nginx/access.log to /var/log/nginx/access-2021-08-27-1485508316.log +creating new /var/log/nginx/access.log mode = 0544 uid = 33 gid = 4 +running postrotate script +* Reloading nginx configuration nginx +``` + +状态文件的内容如下所示: + +``` +logrotate state -- version 2 +"/var/log/nginx/error.log" 2021-08-27-9:0:0 +"/var/log/nginx/access.log" 2021-08-27-9:11:56 +``` + +- [下载 Linux logrotate 备忘单][2] + +本文首发于[作者个人博客][3],经授权改编。 + +-------------------------------------------------------------------------------- + +via: https://opensource.com/article/21/10/linux-logrotate + +作者:[Ayush Sharma][a] +选题:[lujun9972][b] +译者:[perfiffer](https://github.com/perfiffer) +校对:[wxy](https://github.com/wxy) + +本文由 [LCTT](https://github.com/LCTT/TranslateProject) 原创编译,[Linux中国](https://linux.cn/) 荣誉推出 + +[a]: https://opensource.com/users/ayushsharma +[b]: https://github.com/lujun9972 +[1]: https://opensource.com/sites/default/files/styles/image-full-size/public/lead-images/oliver-paaske-unsplash.jpg?itok=bv0sZSSB (Logs stacked up and to the right in front of a green tree forest) +[2]: https://opensource.com/downloads/logrotate-cheat-sheet +[3]: https://notes.ayushsharma.in/2017/01/fiddling-with-logrotate diff --git a/published/202110/20211008 3 new features of the latest OpenPGP.js version.md b/published/202110/20211008 3 new features of the latest OpenPGP.js version.md new file mode 100644 index 0000000000..6f0e1851a8 --- /dev/null +++ b/published/202110/20211008 3 new features of the latest OpenPGP.js version.md @@ -0,0 +1,72 @@ +[#]: subject: "3 new features of the latest OpenPGP.js version" +[#]: via: "https://opensource.com/article/21/10/openpgpjs" +[#]: author: "Daniel Huigens https://opensource.com/users/twiss" +[#]: collector: "lujun9972" +[#]: translator: "geekpi" +[#]: reviewer: "wxy" +[#]: publisher: "wxy" +[#]: url: "https://linux.cn/article-13888-1.html" + +最新 OpenPGP.js 版本的 3 个新功能 +====== + +> OpenPGP.js 是一个实现了 OpenPGP 标准的密码学库,最常用于电子邮件加密。 + +![](https://img.linux.net.cn/data/attachment/album/202110/16/115721k1vi1ekzip1kpqkg.jpg) + +[OpenPGP.js][2] 是一个实现了 [OpenPGP 标准][3] 的密码学库,最常用于电子邮件加密。ProtonMail、Mailvelope 和 FlowCrypt 都使用 OpenPGP.js,这还仅仅是其中一些。也就是说 OpenPGP.js 库对数百万用户的信息进行了加密。 + +OpenPGP 标准首次发布于 20 世纪 90 年代,像几乎任何东西一样,需要维护和更新,以保证安全和可用性。该标准的“加密刷新” [正在进行中][4],它增加了现代的加密算法并废除了过时的算法。为了提高可用性,各种电子邮件应用程序现在允许用户无缝加密他们的通信,用户无需管理他们的密钥或他们的联系人的密钥。 + +OpenPGP.js 于 2014 年首次发布,开始基于一个名为 GPG4Browsers 的早期原型,该原型基于 Herbert Hanewinkel(以及其他贡献者)的几个脚本。OpenPGP.js 的第二个版本于 2016 年发布,完全重新设计,使用 Uint8Arrays 而不是字符串(这大大增加了其性能),并在内部使用现代 ES6 模块而不是 CommonJS 模块。第 3 和第 4 版都是在 2018 年发布的,分别增加了对椭圆曲线加密法(ECC)和流的支持。 + +我和我的团队继续在 OpenPGP.js 上工作,以确保其发展为一个易于使用的强加密库。 + +### 1、默认的椭圆曲线加密 + +在 OpenPGP.js 第 4 版中,生成新密钥时默认使用 RSA。虽然 ECC 更快、更安全,但 Curve25519 还没有在 OpenPGP 规范中得到标准化。加密刷新草案包括了 Curve25519,并且预计它将“按原样”包含在下一版本的 OpenPGP 规范中,因此 OpenPGP.js 第 5 版现在默认使用 ECC 生成密钥。 + +### 2、只导入你需要的模块 + +同样,虽然 OpenPGP.js 内部使用 ES6 模块多年,但第 4 版仍然没有发布一个合适的 ES6 模块。相反,它只发布了一个通用模块定义Univeral Module Definition(UMD)模块,可以在浏览器和 Node.js 上运行。在第 5 版中,这种情况有所改变,为浏览器和 Node.js 发布了单独的模块(包括 ES6 和非 ES6),使库用户更容易在所有平台上导入 OpenPGP.js ,且(当使用 ES6 模块时)只导入他们需要的部分。这在很大程度上是通过将构建系统切换到 [rollup][5] 来实现的。 + +### 3、拒绝弱加密技术 + +还有许多其他的安全改进。例如,1024 位 RSA 密钥、ElGamal 和 DSA 密钥被认为是不安全的,并被默认拒绝。此外,第 4 版已经默认使用 AES 加密,第 5 版现在完全默认拒绝使用较弱的算法进行加密,即使公钥声称只支持较弱的算法。相反,它假定所有的 OpenPGP 实现都支持 AES(这种情况已经存在很长时间了)。 + +### OpenPGP.js 的下一步是什么? + +展望未来,有一些安全方面的改进要做。用于识别公钥的密钥指纹仍然使用 SHA-1,尽管在加密技术更新中计划对此进行修复。同时,建议使用不同的方法来确定用于加密的任何公钥的真实性,例如使用提议的 [网络密钥目录][6]Web Key Directory(WKD)标准直接从收件人的域中获取整个密钥,这已经由各种 [电子邮件提供商][7] 实现。WKD 支持内置于 OpenPGP.js 第 4 版,但在第 5 版中是一个单独的模块,以保持主库的精简。 + +同样,当用密码而不是公钥加密信息或文件时(例如:在使用 OpenPGP 进行电子邮件加密时不常见,但在用于加密备份时更常见),密码会使用相对较弱的密钥衍生函数Key Derivation Function(KDF)转换为对称密钥。因此,建议应用在将用户的密码传递给 OpenPGP.js 之前,先通过一个强大的 KDF,如 [Argon2][8] 或 [scrypt][9]。希望加密刷新草案会包括这些算法中的一种,以便在未来的 OpenPGP.js 版本中实现。 + +### 如何使用 OpenPGP.js 第 5 版 + +不过现在,OpenPGP.js 第 5 版已经 [发布][10] 到 npm 仓库。如果你喜欢,可以随时试用!欢迎在 GitHub 的 [讨论版][11] 中进行反馈。然而,请注意,虽然 OpenPGP.js 是一个通用的加密库,但它的主要使用情况是在需要与 OpenPGP 规范兼容的情况下(例如,在发送或接收 PGP 加密的电子邮件时)。对于其他的使用情况,不同的库可能是一个更合适或性能更好的选择。当然,总的来说,在尝试使用任何加密技术时都要小心。 + +感谢阅读,这里是保护电子邮件的未来! + +-------------------------------------------------------------------------------- + +via: https://opensource.com/article/21/10/openpgpjs + +作者:[Daniel Huigens][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/twiss +[b]: https://github.com/lujun9972 +[1]: https://opensource.com/sites/default/files/styles/image-full-size/public/lead-images/newsletter_email_mail_web_browser.jpg?itok=Lo91H9UH (email or newsletters via inbox and browser) +[2]: https://github.com/openpgpjs/openpgpjs +[3]: https://tools.ietf.org/html/rfc4880 +[4]: https://datatracker.ietf.org/doc/charter-ietf-openpgp/ +[5]: https://rollupjs.org/ +[6]: https://datatracker.ietf.org/doc/html/draft-koch-openpgp-webkey-service +[7]: https://wiki.gnupg.org/WKD#Mail_Service_Providers_offering_WKD +[8]: https://en.wikipedia.org/wiki/Argon2 +[9]: https://en.wikipedia.org/wiki/Scrypt +[10]: https://www.npmjs.com/package/openpgp +[11]: https://github.com/openpgpjs/openpgpjs/discussions diff --git a/published/202110/20211008 How to Install Vivaldi Browser on Ubuntu and Other Linux Distributions.md b/published/202110/20211008 How to Install Vivaldi Browser on Ubuntu and Other Linux Distributions.md new file mode 100644 index 0000000000..315ab7790f --- /dev/null +++ b/published/202110/20211008 How to Install Vivaldi Browser on Ubuntu and Other Linux Distributions.md @@ -0,0 +1,161 @@ +[#]: subject: "How to Install Vivaldi Browser on Ubuntu and Other Linux Distributions" +[#]: via: "https://itsfoss.com/install-vivaldi-ubuntu-linux/" +[#]: author: "Abhishek Prakash https://itsfoss.com/author/abhishek/" +[#]: collector: "lujun9972" +[#]: translator: "imgradeone" +[#]: reviewer: "wxy" +[#]: publisher: "wxy" +[#]: url: "https://linux.cn/article-13877-1.html" + +[初级] 如何在 Ubuntu 中安装 Vivaldi 浏览器 +====== + +![](https://img.linux.net.cn/data/attachment/album/202110/13/142545reotvtqgqpfvmmvp.jpg) + +> 你将在本篇新手教程中学习如何在 Ubuntu、Debian 及其他 Linux 发行版中安装 Vivaldi 网页浏览器,同时本教程也将介绍如何更新和卸载该软件。 + +[Vivaldi][1] 是一款日益流行的网页浏览器。它基于 Chromium 内核,因此它拥有和 Chrome 类似的功能,但它也新增了一些其他特色功能,让这款浏览器与众不同、更为直观。 + +它内置了标签组、广告拦截、鼠标手势、笔记管理,甚至还有命令连锁。你甚至可以借助切分视图来一次性浏览多个页面。当然,相比于 Chrome,Vivaldi 更加尊重你的隐私。 + +![标签平铺,一次性分割浏览多个页面][2] + +[Manjaro Linux 近期使用 Vivaldi 取代 Firefox 作为其部分变体的默认浏览器][3],你可以从这件事来了解 Vivaldi 浏览器的受欢迎程度。 + +如果你想尝试一下这款浏览器的话,接下来让我告诉你,如何在 Linux 上安装 Vivaldi。你将了解到: + + * 安装 Vivaldi 的 GUI 和命令行方式 + * 将 Vivaldi 更新到最新版本的技巧 + * 在 Ubuntu 中卸载 Vivaldi 的方式 + +> **非自由软件警告!** +> +> Vivaldi 并非完全的开源软件。它的 UI 界面是闭源的。之所以在这里介绍这款浏览器,是因为 Vivaldi 团队正努力让该软件在 Linux 平台上可用。 + +### 方式 1:在 Ubuntu 中安装 Vivaldi [GUI 方式] + +好消息是,Vivaldi 提供了预先构建好的安装包,包括 Ubuntu/Debian 的 DEB 文件,以及 Fedora、Red Hat、SUSE 的 RPM 文件。 + +它支持 32 位和 64 位平台,也支持 [像树莓派之类的 ARM 设备][4]。 + +![Vivaldi 为各类 Linux 发行版提供了安装包][5] + +安装过程非常简单。你只需要前往 Vivaldi 的官网下载正确的安装包文件,双击打开,然后安装,大功告成。 + +我将详细介绍在 Ubuntu/Debian 下的安装过程。对于其他类型的发行版,你可以使用类似的步骤。 + +#### 第 1 步:下载 Vivaldi + +前往 Vivaldi 的下载页面,下载支持 Ubuntu 的 DEB 格式安装包。 + +- [下载 Vivaldi][6] + +![下载支持 Ubuntu/Debian 的 DEB 安装包][7] + +#### 第 2 步:安装刚刚下载的 DEB 文件 + +前往你刚刚下载 DEB 文件的下载文件夹。[安装 DEB 文件][8] 非常简单,只需要双击打开,或者右键后使用软件中心打开即可。 + +![右键点击下载的 DEB 文件并用软件中心打开以安装][9] + +这将打开软件中心,在这里可以看到安装 Vivaldi 的选项。点击安装按钮即可。 + +![点击安装按钮][10] + +你将需要输入系统账户的密码,输入密码授权后,Vivaldi 很快就能完成安装,随后安装按钮也变成了移除按钮。这表明 Vivaldi 已经安装完成了。 + +#### 第 3 步:使用 Vivaldi + +按下 `Super`(`Windows`)键打开系统菜单,搜索 Vivaldi,然后单击 Vivaldi 的图标。 + +![在系统菜单中搜索 Vivaldi][11] + +首次启动时,你将看到如下界面。 + +![运行于 Ubuntu 的 Vivaldi][12] + +既然你已经知道了这个方法,那我接下来将展示在 Ubuntu/Debian 使用终端安装 Vivaldi 的方法。 + +### 方式 2:借助终端,在 Ubuntu/Debian 上安装 Vivaldi + +打开终端,确认你已经安装了用于 [在命令行下下载文件][13] 的 `wget`。 + +``` +sudo apt install wget +``` + +接下来,获取 Vivaldi 仓库的公钥并添加到系统,以让系统信任该来源的软件包。如果你感兴趣的话,你可以阅读 [关于在 Ubuntu 添加第三方软件仓库的文章][14]。 + +``` +wget -qO- https://repo.vivaldi.com/archive/linux_signing_key.pub | sudo apt-key add - +``` + +添加完该密钥后,再添加 Vivaldi 的仓库: + +``` +sudo add-apt-repository 'deb https://repo.vivaldi.com/archive/deb/ stable main' +``` + +现在距离完成也只有一步之遥了。更新软件仓库缓存并安装 Vivaldi。 + +``` +sudo apt update && sudo apt install vivaldi-stable +``` + +大功告成。现在,前往系统菜单搜索并启动 Vivaldi 吧。 + +### 在 Ubuntu 中更新 Vivaldi + +GUI 和命令行这两种方式都会在系统里添加 Vivaldi 的仓库。这意味着,只要 Vivaldi 发布了新版本,你就可以在系统更新中一并获取 Vivaldi 的更新。 + +![已添加到系统中的 Vivaldi 仓库][15] + +一般情况下,你更新 Ubuntu 系统时,如果 Vivaldi 发布了新版本,那么 Vivaldi 也同时会被更新。 + +![Vivaldi 浏览器会跟随系统更新][16] + +### 在 Ubuntu 中卸载 Vivaldi + +如果你不喜欢 Vivaldi 或者不再使用,你可以直接卸载。现在,如果你想 [在 Ubuntu 中卸载软件][17],你可能会想到软件中心,但软件中心不会查找到外部和第三方的软件包。 + +目前你必须使用终端卸载 Vivaldi,即便你是使用 GUI 方式安装的。其实这也很简单,打开终端,输入以下命令: + +``` +sudo apt remove vivaldi-stable +``` + +`sudo` 会 [在 Ubuntu 中给予你 root 权限][18]。你需要输入当前账户的密码。输入密码时,你可能不会在屏幕上看见输入密码的痕迹。这是正常现象,直接输入密码即可,随后 Vivaldi 将被卸载。 + +希望这篇关于如何在 Linux 安装 Vivaldi 的教程对你有用。 + +-------------------------------------------------------------------------------- + +via: https://itsfoss.com/install-vivaldi-ubuntu-linux/ + +作者:[Abhishek Prakash][a] +选题:[lujun9972][b] +译者:[imgradeone](https://github.com/imgradeone) +校对:[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://vivaldi.com/ +[2]: https://i2.wp.com/itsfoss.com/wp-content/uploads/2021/10/tab-tiling.webp?resize=800%2C448&ssl=1 +[3]: https://news.itsfoss.com/vivaldi-replaces-firefox-manjaro/ +[4]: https://itsfoss.com/raspberry-pi-alternatives/ +[5]: https://i2.wp.com/itsfoss.com/wp-content/uploads/2021/10/downloading-vivaldi-linux.webp?resize=800%2C541&ssl=1 +[6]: https://vivaldi.com/download/ +[7]: https://i2.wp.com/itsfoss.com/wp-content/uploads/2021/10/vivaldi-download-linux.webp?resize=800%2C438&ssl=1 +[8]: https://itsfoss.com/install-deb-files-ubuntu/ +[9]: https://i2.wp.com/itsfoss.com/wp-content/uploads/2021/10/installing-vivaldi-ubuntu.webp?resize=800%2C466&ssl=1 +[10]: https://i0.wp.com/itsfoss.com/wp-content/uploads/2021/10/install-vivaldi-ubuntu-software.png?resize=800%2C407&ssl=1 +[11]: https://i1.wp.com/itsfoss.com/wp-content/uploads/2021/10/running-vivaldi-in-ubuntu.png?resize=703%2C229&ssl=1 +[12]: https://i0.wp.com/itsfoss.com/wp-content/uploads/2021/10/Vivaldi-in-Ubuntu.webp?resize=800%2C450&ssl=1 +[13]: https://itsfoss.com/download-files-from-linux-terminal/ +[14]: https://itsfoss.com/adding-external-repositories-ubuntu/ +[15]: https://i2.wp.com/itsfoss.com/wp-content/uploads/2021/10/Vivaldi-repo-ubuntu.png?resize=800%2C403&ssl=1 +[16]: https://i0.wp.com/itsfoss.com/wp-content/uploads/2021/06/chrome-edge-update-ubuntu.png?resize=716%2C421&ssl=1 +[17]: https://itsfoss.com/uninstall-programs-ubuntu/ +[18]: https://itsfoss.com/root-user-ubuntu/ diff --git a/published/202110/20211010 Best Linux Distributions Based on KDE.md b/published/202110/20211010 Best Linux Distributions Based on KDE.md new file mode 100644 index 0000000000..3c4f2d2fe5 --- /dev/null +++ b/published/202110/20211010 Best Linux Distributions Based on KDE.md @@ -0,0 +1,193 @@ +[#]: subject: "Best Linux Distributions Based on KDE" +[#]: via: "https://itsfoss.com/best-kde-distributions/" +[#]: author: "Ankush Das https://itsfoss.com/author/ankush/" +[#]: collector: "lujun9972" +[#]: translator: "wxy" +[#]: reviewer: "wxy" +[#]: publisher: "wxy" +[#]: url: "https://linux.cn/article-13872-1.html" + +基于 KDE 的最佳 Linux 发行版 +====== + +![](https://img.linux.net.cn/data/attachment/album/202110/11/115436wngdi7vndoodjnfd.jpg) + +KDE 是目前最具定制性和最快速的桌面环境之一。虽然你可以随时安装 KDE,但最好选择一个 KDE 开箱即用的 Linux 发行版。 + +在这里,让我列出一些最好的基于 KDE 的 Linux 发行版。 + +无论你选择什么作为你的首选发行版,你都可以参考我们的 [KDE 定制指南][1] 来调整你的体验。 + +注意:该列表没有特定的排名顺序。 + +### 1、KDE Neon + +![][2] + +主要亮点: + + * 官方 KDE 发行版 + * 最新的 KDE Plasma 稳定版 + * 专注于最新的 KDE 软件 + * 不是桌面发行版的完美替代品 + +如果你想获得 KDE Plasma 的最新体验,[KDE Neon][4] 是最佳选择之一。 + +即使它是建立在稳定版的 Ubuntu LTS 基础之上,你也总是能在最新的 KDE 版本发布后立即得到交付。 + +与其他发行版不同,它不注重完整的桌面用户体验,而是重点关注在 KDE 软件包上。所以,它可能不是每个人的完美桌面替代品。然而,如果你希望使用最新的 KDE 软件,KDE Neon 是一个不错的选择。 + +其“用户版”应该是你需要的,但如果你愿意尝试预先发布的功能,你也可以选择尝试“测试版”或“不稳定版”。 + +如果你想知道它与 Kubuntu 有什么不同,你应该查看 [KDE Neon vs Kubuntu][3] 的比较来探索它。 + +### 2、Kubuntu + +![][5] + +主要亮点: + + * 基于 Ubuntu 的以桌面为重点的 Linux 发行版 + * 提供 LTS 和非 LTS 版本 + * 良好的硬件兼容性 + +如果 KDE 软件套件不是你关注的重点,那么 Kubuntu 应该是你可以作为 Linux 桌面使用的一个优秀发行版。 + +Kubuntu 是 Ubuntu 的一个官方版本,它为其 LTS 版本提供了三年的更新支持。与 KDE Neon 不同的是,你可以得到对各种应用程序更好的支持,而不仅仅是局限于 KDE 软件。 + +你可以选择 LTS 版或非 LTS 版来获得最新的 Ubuntu 功能。 + +与其他一些基于 KDE 的发行版相比,Kubuntu 具有更好的硬件兼容性。考虑到它可以为各种笔记本电脑提供动力,如 Kubuntu Focus、Slimbook 等,其硬件兼容性是你可以信赖的。 + +### 3、Manjaro KDE + +![][6] + +主要亮点: + + * 基于 Arch 的 Linux 发行版 + * 滚动式发布更新 + * 对于新的 Linux 用户来说学习难度不大 + +Manjaro 是一个基于 Arch Linux 的发行版,它使得使用 Arch 作为桌面 Linux 平台变得容易。 + +它按照滚动发布的时间表进行发布,这应该有助于你快速获得最新的软件包,而不必担心软件更新时间。 + +如果你是一个新的 Linux 用户,你可以考虑一直使用 Flatpak 或 Snaps 来安装各种应用程序。虽然 Manjaro 让你很容易使用 Arch,但它对新用户来说多多少少还是有一点学习曲线。所以,你可能需要查看 [Arch 维基][7] 来了解更多信息。 + +### 4、Fedora KDE Spin + +主要亮点: + + * 一个独特的基于 KDE 的 Linux 发行版(如果你不喜欢主流的 Ubuntu/Arch 发行版) + * 为工作站和服务器量身定做 + * 对于新的 Linux 用户来说可能需要适应 + * 硬件兼容性可能是个问题 + +Fedora 是一个独立的发行版(不基于 Ubuntu/Arch),作为 Red Hat Enterprise Linux 的上游。 + +而 Fedora Spin 版为用户提供了各种备用的桌面。如果你想要 KDE,你需要下载 Fedora 的 KDE Spin。 + +像 KDE Neon 一样,Fedora 并不专注于提供一个最佳的桌面体验,而是旨在实验对工作站或服务器有用的最新技术。 + +因此,如果你有信心解决 Linux 发行版上较新技术实现所带来的任何问题/挑战,[Fedora KDE Spin][8] 是一个不错的选择。 + +### 5、openSUSE + +![][9] + +主要亮点: + + * 适用于需要使用多种工具的系统管理员和开发人员 + * 有两个不同的版本,包括稳定版和滚动版 + +[openSUSE][10] 是另一个独立的 Linux 发行版,默认采用 KDE 桌面。虽然它把自己定位为桌面用户的选择之一,但我在过去曾遇到过硬件兼容性问题。 + +然而,对于想在桌面上使用 YaST、Open Build Service、Kiwi 等工具的系统管理员或开发者来说,它是一个很好的选择,开箱即用。 + +它提供了一个稳定版和一个滚动发布版。根据你的要求选择最适合你的。 + +### 6、Garuda Linux + +![][11] + +主要亮点: + + * 滚动发布的发行版 + * BTRFS 作为默认文件系统 + * 预装了基本的 GUI 工具,使 Arch Linux 的使用变得简单 + +[Garuda Linux][12] 是一个基于 Arch 的现代发行版,专注于开箱即用的定制体验。 + +KDE 版本(或 Dr460nized 版本)提供了漂亮的体验,同时可使用类似 macOS 的工作流程进行调整。 + +当然,如果你是一个有经验的 Linux 用户,你可以定制你现有的发行版来模仿同样的体验。 + +锦上添花的是,Garuda Linux 还提供了其 KDE 版本的不同变体,一个预装了游戏工具,一个用于渗透测试,另一个作为基本的 Linux 桌面系统。 + +### 7、Nitrux OS + +![][13] + +主要亮点: + + * 基于 Debian 的发行版,不同的风格 + * 独特的桌面体验 + +一个基于 Debian 的 Linux 发行版,具有开箱即用的 KDE。与 Kubuntu 不同,Nitrux 最终可能提供的是一个更快的 KDE Plasma 更新和较新的 Linux 内核升级。 + +[Nitrux OS][14] 在以其 NX 桌面为特色的同时,提供了一个美丽而独特的体验。 + +如果你想尝试一些不同的 KDE 搭载,Nitrux OS 将是一个不错的选择。 + +### 8、MX Linux KDE + +![][15] + +主要亮点: + + * 基于 Debian 的发行版 + * 轻量级 + * 预装了有用的 MX 工具 + +不在意外观,但想要一个简单的、可定制的、基于 Debian 的 KDE 桌面?[MX Linux KDE 版][16] 应该是一个很好的选择,因为它以迅捷的性能和预装的基本工具而闻名。 + +如果你想调整默认的用户体验,你还可以得到几个 KDE 主题。 + +### 总结 + +在这个列表之外,其他几个 Linux 发行版也将 KDE 桌面作为他们的首选。 + +总体来说,Nitrux OS 应该是一个独特的选择,如果你想远离基于 Ubuntu 的发行版,还有像 Garuda Linux 和 Manjaro 这样基于 Arch 的可靠发行版可以尝试。 + +你最喜欢的基于 KDE 的 Linux 发行版是什么?你是专注于开箱即用的定制,还是喜欢自己定制 KDE 体验? + +-------------------------------------------------------------------------------- + +via: https://itsfoss.com/best-kde-distributions/ + +作者:[Ankush Das][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://itsfoss.com/author/ankush/ +[b]: https://github.com/lujun9972 +[1]: https://itsfoss.com/kde-customization +[2]: https://i0.wp.com/itsfoss.com/wp-content/uploads/2020/08/kde-neon-information-20-04.jpg?resize=800%2C397&ssl=1 +[3]: https://itsfoss.com/kde-neon-vs-kubuntu/ +[4]: https://neon.kde.org/index +[5]: https://i0.wp.com/itsfoss.com/wp-content/uploads/2020/01/kubuntu-kde.jpg?resize=800%2C450&ssl=1 +[6]: https://i1.wp.com/itsfoss.com/wp-content/uploads/2020/11/manjaro-20-desktop.jpeg?resize=800%2C440&ssl=1 +[7]: https://wiki.archlinux.org +[8]: https://spins.fedoraproject.org/en/kde/ +[9]: https://i1.wp.com/itsfoss.com/wp-content/uploads/2021/10/opensuse-kde.png?resize=800%2C423&ssl=1 +[10]: https://www.opensuse.org +[11]: https://i2.wp.com/itsfoss.com/wp-content/uploads/2020/12/Garuda-Linux-review.png?resize=800%2C450&ssl=1 +[12]: https://garudalinux.org +[13]: https://i0.wp.com/itsfoss.com/wp-content/uploads/2021/10/nitrux-os-kde.png?resize=800%2C450&ssl=1 +[14]: https://nxos.org +[15]: https://i1.wp.com/itsfoss.com/wp-content/uploads/2020/08/mx-linux-19-2-kde.jpg?resize=800%2C452&ssl=1 +[16]: https://mxlinux.org diff --git a/published/202110/20211011 What is a hostname.md b/published/202110/20211011 What is a hostname.md new file mode 100644 index 0000000000..7088418f1d --- /dev/null +++ b/published/202110/20211011 What is a hostname.md @@ -0,0 +1,113 @@ +[#]: subject: "What is a hostname?" +[#]: via: "https://opensource.com/article/21/10/what-hostname" +[#]: author: "Alan Formy-Duval https://opensource.com/users/alanfdoss" +[#]: collector: "lujun9972" +[#]: translator: "geekpi" +[#]: reviewer: "wxy" +[#]: publisher: "wxy" +[#]: url: "https://linux.cn/article-13897-1.html" + +浅谈主机名 +====== + +> 主机名是人类用来指代特定计算机的标签。 + +![](https://img.linux.net.cn/data/attachment/album/202110/19/134329lwni9tlq9h3u4f4o.jpg) + +计算机有网络地址,但人类通常很难记住它们。主机名是帮助人类参考特定计算机的标签。例如,你可能不会导航到 `192.168.1.4`,而是导航到 `linuxlaptop` 或 `linuxlaptop.local`。 + +### 地址和名称 + +所有联网的计算机(也被称为主机host)都需要一个地址:一个与之相关的唯一数字,以使数据报文能够在它们之间进行正确的数据通信。这就是所谓的互联网协议Internet Protocol(IP)地址。数字 `54.204.39.132` 是一个互联网协议第四版Internet Protocol version 4(IPv4)地址。较新的 IPv6 地址要长得多,像这样:`2001:0db6:3c4d:0017:0000:0000:2a2f:1a2b`。 哇!这将是很难记住的! + +``` +$ ip addr show +``` + +计算机也可以被赋予标签。被称为主机名hostname,这些是友好的名称,便于参考。我可以把我的计算机的主机名设置为 `copperhead`。只要这个名字在网络上是唯一的,所有其他用户和计算机都可以把 `copperhead` 作为地址,而不是 IP 地址。 + +``` +$ hostname -s +``` + +你可以更新你的计算机的主机名。 + +阅读 Seth Kenlon 的文章 [如何在 Linux 上更改主机名][2],了解如何在 Linux 上这样做。 + +#### 完全限定域名 + +从技术上讲,主机名包括一个域名。如果我的域名是 `mycompany.com`,那么我的计算机的主机名是 `copperhead.mycompany.com`,以句点分隔。这就形成了一个完全限定域名fully qualified domain name(FQDN)。这很重要,因为 IP 地址可以解析为 FQDN。 + +``` +host.domain.topleveldomain +``` + +例如:`www.example.com` 是一个完全限定域名。 + +你的域名一般已经确定了,所以你只负责提供主机部分。本文的重点是主机。 + +#### 名称解析 + +将 IP 地址转换为相应的主机名的过程被称为名称解析。这个过程首先发生在本地主机表中。Linux 使用文件 `/etc/hosts` 来存储这个表。 + +``` +cat /etc/hosts +``` + +还有一个分层的、去中心化的基于网络的系统提供解析,称为域名系统Domain Name System(DNS)。这时 FQDN 变得非常重要。 + + +``` +$ dig www.opensource.com +``` + +### 名称的乐趣 + +为我们的计算机起名字可能很有趣。如果你有很多,你可以使用一个主题。我曾经为一家公司工作,该公司将所有的服务器都以蛇命名。 + +后来我工作的一家公司,我是一个数据中心经理,使用啤酒品牌。当我们收到一个新的服务器时,这很令人兴奋,因为我会给开发团队发邮件征求建议。我们大约有 100 台服务器。这些提供了一个有趣的清单,反映了公司的多样性。我们有从库尔斯和百威到阿姆斯特尔和浅粉象的一切。我们有虎牌啤酒、胜狮啤酒和札幌啤酒等等! + +我们认为这很酷!然后,想象一下,当你试图记住卢云堡是拥有最多内存的虚拟化服务器,佩罗尼是 SQL 数据库服务器,喜力是新的域控制器时,会发生什么,特别是对于一个快速发展的公司的新员工。 + +### 惯例 + +当然,主机名是所有者的选择,所以请尽情发挥。然而,根据环境的不同,使用容易记忆的名字或基于命名惯例的名字可能更有意义,因为这些名字有利于描述主机。 + +#### 有用的名字 + +如果你想放弃有趣的东西,并对你的系统进行有益的命名,也许可以考虑它们的功能。数据库服务器可以被命名为 `database1`、`database2`、`database3` 等等。Web 服务器可以命名为 `webserver1`、`webserver2` 等等。 + +#### 位置名称 + +我在许多客户那里使用了一种技术,用一组字符的位置来命名服务器主机,这些字符描述了该系统的一个方面,有助于识别。例如,如果我正在为内政部(DOI)开发一个业务流程管理(BPM)系统,我就会在命名规则中加入他们的缩写词。 + +此外,就像许多大型企业、金融机构和政府一样,他们可能有不同的数据中心,位于不同的地理位置,以达到性能或灾难恢复的目的。因此,比如说,位于北美大陆东海岸的数据中心被称为 ED(East Data center),而位于西海岸的数据中心则是 WD(West Data center)。 + +所有这些信息将汇集到一个名称中,如 `doibpm1ed` 或 `doibpm1wd`。因此,虽然这些名字看起来不长,但在这个项目上工作的人可以很容易地识别它们的目的和位置,而且这个名字甚至可以对潜在的恶意者混淆它们的用途。换句话说,业主可以选择只对内部人员有意义的命名方式 + +### 互联网标准 + +有几个标准管理着主机名。你可以在互联网工程任务组Internet Engineering Task Force(IETF)维护的意见征求Requests for Comment(RFC)中找到这些标准。由此,请遵守以下规定: + + * 主机名的长度应该在 1 到 63 个 ASCII 字符之间 + * 一个 FQDN 的最大长度为 253 个 ASCII 字符 + * 不区分大小写 + * 允许的字符:`a` 到 `z`,`0` 到 `9`,`-`(连字符),和 `_`(下划线)。 + +我希望这篇文章能帮助你澄清主机名。玩得开心,发挥创意。 + +-------------------------------------------------------------------------------- + +via: https://opensource.com/article/21/10/what-hostname + +作者:[Alan Formy-Duval][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/alanfdoss +[b]: https://github.com/lujun9972 +[1]: https://opensource.com/sites/default/files/styles/image-full-size/public/lead-images/browser_screen_windows_files.png?itok=kLTeQUbY (Computer screen with files or windows open) +[2]: https://opensource.com/article/21/10/how-change-hostname-linux diff --git a/published/202110/20211012 Seahorse- Manage Your Passwords - Encryption Keys in Linux.md b/published/202110/20211012 Seahorse- Manage Your Passwords - Encryption Keys in Linux.md new file mode 100644 index 0000000000..744568a383 --- /dev/null +++ b/published/202110/20211012 Seahorse- Manage Your Passwords - Encryption Keys in Linux.md @@ -0,0 +1,92 @@ +[#]: subject: "Seahorse: Manage Your Passwords & Encryption Keys in Linux" +[#]: via: "https://itsfoss.com/seahorse/" +[#]: author: "Ankush Das https://itsfoss.com/author/ankush/" +[#]: collector: "lujun9972" +[#]: translator: "geekpi" +[#]: reviewer: "wxy" +[#]: publisher: "wxy" +[#]: url: "https://linux.cn/article-13884-1.html" + +Seahorse:在 Linux 中管理你的密码和加密密钥 +====== + +![](https://img.linux.net.cn/data/attachment/album/202110/15/120409ltfmw33c5xpw5bcx.jpg) + +> Seahorse 是一个简洁的开源密码和加密密钥管理器,让我们来探讨一下它的功能和如何安装它。 + +我们经常倾向于忽视许多默认/预装的应用,尤其是在内置了大量工具和实用程序时。 + +你可以在各种 Linux 发行版上使用的这样一个有用的工具是 **GNOME 的 Seahorse**。 + +### Seahorse:GNOME 的密码及加密密钥管理器 + +![][1] + +主要来说,Seahorse 是一个预装在 GNOME 桌面的应用,并为其量身定做。 + +然而,你可以在你选择的任何 Linux 发行版上使用它。它是一个简单而有效的工具,可以在本地管理你的密码和加密密钥/钥匙环。 + +如果你是第一次使用,你可能想读一下 [Linux 中钥匙环的概念][2]。 + +如果你不喜欢基于云的密码管理器,Seahorse 可以很好地解决你的要求。尽管它看起来很简单,但有几个基本功能你可能会觉得很有用。 + +当然,如果你的不太涉及管理加密密钥(或本地存储),你也应该探索一些 [可用于 Linux 的最佳密码管理器][3] 。 + +### Seahorse 的特点 + +虽然你可以很容易地把它作为一个本地(离线)密码管理器,但在处理加密密钥时,你也可以用 Seahorse 做一些事情来加强你的安全管理。 + +![][4] + +一些关键的亮点是: + + * 能够存储 SSH 密钥(用于访问远程计算机/服务器) + * 存储用于保护电子邮件和文件的 GPG 密钥 + * 支持为应用和网络添加密码钥匙环 + * 安全地存储证书的私钥 + * 存储一个密码/密语 + * 能够导入文件并快速存储它们 + * 查找远程密钥 + * 同步和发布密钥 + * 能够查找/复制 VPN 密码 + +![][5] + +### 在 Linux 中安装 Seahorse + +如果你使用的是基于 GNOME 的发行版,你应该已经安装了它。你可以搜索 “Seahorse” 或者 “Passwords” 来找到它。 + +在其他情况下,你可以在软件中心搜索到它。根据我的快速测试,它在 KDE、LXQt 和不同的桌面环境下应该可以正常工作。 + +![][6] + +此外,你可以找到它的 [Flatpak 包][7]。所以,无论你使用的是哪种 Linux 发行版,都可以安装 Seahorse。 + +如果你使用的是 Arch Linux,你也应该在 [AUR][8] 中找到它。 + +- [Seahorse][9] + +你对使用 Seahorse 来取代其他密码管理器有何看法?你是否已经用它来管理加密密钥?请在下面的评论中告诉我你的想法。 + +-------------------------------------------------------------------------------- + +via: https://itsfoss.com/seahorse/ + +作者:[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://i1.wp.com/itsfoss.com/wp-content/uploads/2021/10/seahorse-password-keys.png?resize=800%2C613&ssl=1 +[2]: https://itsfoss.com/ubuntu-keyring/ +[3]: https://itsfoss.com/password-managers-linux/ +[4]: https://i2.wp.com/itsfoss.com/wp-content/uploads/2021/10/seahorse-login.png?resize=800%2C583&ssl=1 +[5]: https://i2.wp.com/itsfoss.com/wp-content/uploads/2021/10/seahorse-keys.png?resize=800%2C579&ssl=1 +[6]: https://i0.wp.com/itsfoss.com/wp-content/uploads/2021/10/seahorse-software.png?resize=800%2C508&ssl=1 +[7]: https://www.flathub.org/apps/details/org.gnome.seahorse.Application +[8]: https://itsfoss.com/aur-arch-linux/ +[9]: https://wiki.gnome.org/Apps/Seahorse/ diff --git a/published/202110/20211013 5 markdown editors I recommend trying.md b/published/202110/20211013 5 markdown editors I recommend trying.md new file mode 100644 index 0000000000..d107ec755a --- /dev/null +++ b/published/202110/20211013 5 markdown editors I recommend trying.md @@ -0,0 +1,83 @@ +[#]: subject: "5 markdown editors I recommend trying" +[#]: via: "https://opensource.com/article/21/10/markdown-editors" +[#]: author: "Don Watkins https://opensource.com/users/don-watkins" +[#]: collector: "lujun9972" +[#]: translator: "geekpi" +[#]: reviewer: "wxy" +[#]: publisher: "wxy" +[#]: url: "https://linux.cn/article-13904-1.html" + +我推荐尝试的 5 个 Markdown 编辑器 +====== + +> 每个人都有自己喜欢的 Markdown 编辑器。这里有几个我已经试过的。 + +![](https://img.linux.net.cn/data/attachment/album/202110/21/095837n8q1s3hqc1og1fsq.jpg) + +你可以用 Markdown 做任何事情:给网站排版、编写书籍和撰写技术文档只是它的一些用途。我喜欢它创建富文本文档可以如此简单。每个人都有自己喜欢的 Markdown 编辑器。在我的 Markdown 之旅中,我使用了好几个。下面是我考虑过的五个 Markdown 编辑器。 + +### Abricotine + +[Abricotine][2] 是一个在 [GPLv][3] 下发布的开源编辑器。你可以手动输入格式,或者使用菜单插入 [GitHub 风格的 Markdown][4]。Abricotine 允许你在输入时预览文本元素,如标题、图片、数学、嵌入式视频和待办事项。该编辑器只能将文件导出为 HTML。你可以在 Linux、macOS 和 Windows 上使用 Abricotine。 + +![Abricontine][5] + +### MarkText + +[MarkText][7] 是一个简单的 Markdown 编辑器。它有很多功能,而且在处理 Markdown 格式的文件方面做得很好。MarkText 也支持 GitHub 风格的 Markdown,它允许你添加表格和带有语法高亮的代码块。它支持实时预览,并且有一个简单的界面。MarkText 是在 [MIT][8] 下授权的。它支持 HTML 和 PDF 格式的输出。MarkText 可以在 Linux、macOS 和 Windows 上使用。 + +![MarkText][9] + +### Ghostwriter + +[Ghostwriter][10] 是一个用于 Linux 和 Windows 的 Markdown 编辑器。根据其网站用户的说法。“享受无干扰的写作体验,包括全屏模式和简洁的界面。有了 Markdown,你可以现在写,以后再格式化”。它有内置的默认的浅色和深色主题,或者你可以自己编写。你可以将文件实时按 HTML 预览,你可以直接复制和粘贴到博客中,或导出为其他格式。Ghostwriter 是在 [GPLv3][11] 下发布的。 + +![Ghostwriter][12] + +### Atom + +[Atom][13] 被称为 21 世纪的可自定义文本编辑器。它也可以作为一个 Markdown 编辑器使用。它可以在 Linux、Windows 和 macOS上运行,并以 [MIT][14] 许可证发布。它支持 GitHub 风格的 Markdown,并且按下 `Ctrl+Shift+M` 可以打开一个预览面板,这样你就可以轻松地看到 HTML 预览。你可以通过创建一个文件并以 `.md` 文件扩展名保存来轻松入门。这告诉 Atom 它是一个 Markdown 文件。Atom 会自动应用正确的包和语法高亮。 + +![Atom][15] + +### VSCodium + +[VSCodium][16] 是微软的 VSCode 编辑器的自由开源版本,没有内置在微软产品中的遥测技术。它以 [MIT][17] 许可证发布,并提供了 VSCode 的所有功能,而没有专有特性。除了其他功能外,VSCodium 还可以作为一个 Markdown 编辑器。创建一个新文件,点击 “选择一个语言”,选择 “Markdown”,然后开始写你的代码。通过按 `Ctrl-Shift+V` 轻松预览文本,然后再切换回编辑器。你也可以通过添加一个扩展来轻松地扩展 Markdown 编辑器。我最喜欢的插件是 [Markdown editor][18],它是 [MIT][19] 许可证。 + +![VSCodium][20] + +你最喜欢的 Markdown 编辑器是什么? 让我们在评论中知道。 + +-------------------------------------------------------------------------------- + +via: https://opensource.com/article/21/10/markdown-editors + +作者:[Don Watkins][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/don-watkins +[b]: https://github.com/lujun9972 +[1]: https://opensource.com/sites/default/files/styles/image-full-size/public/lead-images/osdc-docdish-typewriter-pink.png?itok=OXJBtyYf (A pink typewriter) +[2]: https://abricotine.brrd.fr/ +[3]: https://github.com/brrd/abricotine/blob/develop/LICENSE +[4]: https://guides.github.com/features/mastering-markdown/ +[5]: https://opensource.com/sites/default/files/uploads/1_abricontine.png (Abricontine) +[6]: https://creativecommons.org/licenses/by-sa/4.0/ +[7]: https://marktext.app/ +[8]: https://github.com/marktext/marktext/blob/develop/LICENSE +[9]: https://opensource.com/sites/default/files/uploads/2_marktext.png (MarkText) +[10]: https://wereturtle.github.io/ghostwriter/ +[11]: https://github.com/wereturtle/ghostwriter/blob/master/COPYING +[12]: https://opensource.com/sites/default/files/uploads/3_ghostwriter.png (Ghostwriter) +[13]: https://atom.io/ +[14]: https://github.com/atom/atom/blob/master/LICENSE.md +[15]: https://opensource.com/sites/default/files/uploads/4_atom.png (Atom) +[16]: https://vscodium.com/ +[17]: https://github.com/VSCodium/vscodium/blob/master/LICENSE +[18]: https://github.com/zaaack/vscode-markdown-editor +[19]: https://github.com/zaaack/vscode-markdown-editor/blob/master/LICENSE +[20]: https://opensource.com/sites/default/files/uploads/5_vscodium.png (VSCodium) diff --git a/published/202110/20211014 5 common bugs in C programming and how to fix them.md b/published/202110/20211014 5 common bugs in C programming and how to fix them.md new file mode 100644 index 0000000000..e7023e39e7 --- /dev/null +++ b/published/202110/20211014 5 common bugs in C programming and how to fix them.md @@ -0,0 +1,405 @@ +[#]: subject: "5 common bugs in C programming and how to fix them" +[#]: via: "https://opensource.com/article/21/10/programming-bugs" +[#]: author: "Jim Hall https://opensource.com/users/jim-hall" +[#]: collector: "lujun9972" +[#]: translator: "unigeorge" +[#]: reviewer: "wxy" +[#]: publisher: "wxy" +[#]: url: "https://linux.cn/article-13894-1.html" + +C 语言编程中的 5 个常见错误及对应解决方案 +====== + +> 增强 C 语言程序的弹性和可靠性的五种方法。 + +![](https://img.linux.net.cn/data/attachment/album/202110/18/174123p4cz99skp9zz4nf4.jpg) + +即使是最好的程序员也无法完全避免错误。这些错误可能会引入安全漏洞、导致程序崩溃或产生意外操作,具体影响要取决于程序的运行逻辑。 + +C 语言有时名声不太好,因为它不像近期的编程语言(比如 Rust)那样具有内存安全性。但是通过额外的代码,一些最常见和严重的 C 语言错误是可以避免的。下文讲解了可能影响应用程序的五个错误以及避免它们的方法: + +### 1、未初始化的变量 + +程序启动时,系统会为其分配一块内存以供存储数据。这意味着程序启动时,变量将获得内存中的一个随机值。 + +有些编程环境会在程序启动时特意将内存“清零”,因此每个变量都得以有初始的零值。程序中的变量都以零值作为初始值,听上去是很不错的。但是在 C 编程规范中,系统并不会初始化变量。 + +看一下这个使用了若干变量和两个数组的示例程序: + +``` +#include +#include + +int +main() +{ + int i, j, k; + int numbers[5]; + int *array; + + puts("These variables are not initialized:"); + + printf(" i = %d\n", i); + printf(" j = %d\n", j); + printf(" k = %d\n", k); + + puts("This array is not initialized:"); + + for (i = 0; i < 5; i++) { + printf(" numbers[%d] = %d\n", i, numbers[i]); + } + + puts("malloc an array ..."); + array = malloc(sizeof(int) * 5); + + if (array) { + puts("This malloc'ed array is not initialized:"); + + for (i = 0; i < 5; i++) { + printf(" array[%d] = %d\n", i, array[i]); + } + + free(array); + } + + /* done */ + + puts("Ok"); + return 0; +} +``` + +这个程序不会初始化变量,所以变量以系统内存中的随机值作为初始值。在我的 Linux 系统上编译和运行这个程序,会看到一些变量恰巧有“零”值,但其他变量并没有: + +``` +These variables are not initialized: + i = 0 + j = 0 + k = 32766 +This array is not initialized: + numbers[0] = 0 + numbers[1] = 0 + numbers[2] = 4199024 + numbers[3] = 0 + numbers[4] = 0 +malloc an array ... +This malloc'ed array is not initialized: + array[0] = 0 + array[1] = 0 + array[2] = 0 + array[3] = 0 + array[4] = 0 +Ok +``` + +很幸运,`i` 和 `j` 变量是从零值开始的,但 `k` 的起始值为 32766。在 `numbers` 数组中,大多数元素也恰好从零值开始,只有第三个元素的初始值为 4199024。 + +在不同的系统上编译相同的程序,可以进一步显示未初始化变量的危险性。不要误以为“全世界都在运行 Linux”,你的程序很可能某天在其他平台上运行。例如,下面是在 FreeDOS 上运行相同程序的结果: + +``` +These variables are not initialized: + i = 0 + j = 1074 + k = 3120 +This array is not initialized: + numbers[0] = 3106 + numbers[1] = 1224 + numbers[2] = 784 + numbers[3] = 2926 + numbers[4] = 1224 +malloc an array ... +This malloc'ed array is not initialized: + array[0] = 3136 + array[1] = 3136 + array[2] = 14499 + array[3] = -5886 + array[4] = 219 +Ok +``` + +永远都要记得初始化程序的变量。如果你想让变量将以零值作为初始值,请额外添加代码将零分配给该变量。预先编好这些额外的代码,这会有助于减少日后让人头疼的调试过程。 + +### 2、数组越界 + +C 语言中,数组索引从零开始。这意味着对于长度为 10 的数组,索引是从 0 到 9;长度为 1000 的数组,索引则是从 0 到 999。 + +程序员有时会忘记这一点,他们从索引 1 开始引用数组,产生了“大小差一”off by one错误。在长度为 5 的数组中,程序员在索引“5”处使用的值,实际上并不是数组的第 5 个元素。相反,它是内存中的一些其他值,根本与此数组无关。 + +这是一个数组越界的示例程序。该程序使用了一个只含有 5 个元素的数组,但却引用了该范围之外的数组元素: + +``` +#include +#include + +int +main() +{ + int i; + int numbers[5]; + int *array; + + /* test 1 */ + + puts("This array has five elements (0 to 4)"); + + /* initalize the array */ + for (i = 0; i < 5; i++) { + numbers[i] = i; + } + + /* oops, this goes beyond the array bounds: */ + for (i = 0; i < 10; i++) { + printf(" numbers[%d] = %d\n", i, numbers[i]); + } + + /* test 2 */ + + puts("malloc an array ..."); + + array = malloc(sizeof(int) * 5); + + if (array) { + puts("This malloc'ed array also has five elements (0 to 4)"); + + /* initalize the array */ + for (i = 0; i < 5; i++) { + array[i] = i; + } + + /* oops, this goes beyond the array bounds: */ + for (i = 0; i < 10; i++) { + printf(" array[%d] = %d\n", i, array[i]); + } + + free(array); + } + + /* done */ + + puts("Ok"); + return 0; +} +``` + +可以看到,程序初始化了数组的所有值(从索引 0 到 4),然后从索引 0 开始读取,结尾是索引 9 而不是索引 4。前五个值是正确的,再后面的值会让你不知所以: + +``` +This array has five elements (0 to 4) +  numbers[0] = 0 +  numbers[1] = 1 +  numbers[2] = 2 +  numbers[3] = 3 +  numbers[4] = 4 +  numbers[5] = 0 +  numbers[6] = 4198512 +  numbers[7] = 0 +  numbers[8] = 1326609712 +  numbers[9] = 32764 +malloc an array ... +This malloc'ed array also has five elements (0 to 4) +  array[0] = 0 +  array[1] = 1 +  array[2] = 2 +  array[3] = 3 +  array[4] = 4 +  array[5] = 0 +  array[6] = 133441 +  array[7] = 0 +  array[8] = 0 +  array[9] = 0 +Ok +``` + +引用数组时,始终要记得追踪数组大小。将数组大小存储在变量中;不要对数组大小进行硬编码hard-code。否则,如果后期该标识符指向另一个不同大小的数组,却忘记更改硬编码的数组长度时,程序就可能会发生数组越界。 + +### 3、字符串溢出 + +字符串只是特定类型的数组。在 C 语言中,字符串是一个由 `char` 类型值组成的数组,其中用一个零字符表示字符串的结尾。 + +因此,与数组一样,要注意避免超出字符串的范围。有时也称之为 _字符串溢出_。 + +使用 `gets` 函数读取数据是一种很容易发生字符串溢出的行为方式。`gets` 函数非常危险,因为它不知道在一个字符串中可以存储多少数据,只会机械地从用户那里读取数据。如果用户输入像 `foo` 这样的短字符串,不会发生意外;但是当用户输入的值超过字符串长度时,后果可能是灾难性的。 + +下面是一个使用 `gets` 函数读取城市名称的示例程序。在这个程序中,我还添加了一些未使用的变量,来展示字符串溢出对其他数据的影响: + +``` +#include +#include + +int +main() +{ + char name[10]; /* Such as "Chicago" */ + int var1 = 1, var2 = 2; + + /* show initial values */ + + printf("var1 = %d; var2 = %d\n", var1, var2); + + /* this is bad .. please don't use gets */ + + puts("Where do you live?"); + gets(name); + + /* show ending values */ + + printf("<%s> is length %d\n", name, strlen(name)); + printf("var1 = %d; var2 = %d\n", var1, var2); + + /* done */ + + puts("Ok"); + return 0; +} +``` + +当你测试类似的短城市名称时,该程序运行良好,例如伊利诺伊州的 `Chicago` 或北卡罗来纳州的`Raleigh`: + +``` +var1 = 1; var2 = 2 +Where do you live? +Raleigh + is length 7 +var1 = 1; var2 = 2 +Ok +``` + +威尔士的小镇 `Llanfairpwllgwyngyllgogerychwyrndrobwllllantysiliogogogoch` 有着世界上最长的名字之一。这个字符串有 58 个字符,远远超出了 `name` 变量中保留的 10 个字符。结果,程序将值存储在内存的其他区域,覆盖了 `var1` 和 `var2` 的值: + +``` +var1 = 1; var2 = 2 +Where do you live? +Llanfairpwllgwyngyllgogerychwyrndrobwllllantysiliogogogoch + is length 58 +var1 = 2036821625; var2 = 2003266668 +Ok +Segmentation fault (core dumped) +``` + +在运行结束之前,程序会用长字符串覆盖内存的其他部分区域。注意,`var1` 和 `var2` 的值不再是起始的 `1` 和 `2`。 + +避免使用 `gets` 函数,改用更安全的方法来读取用户数据。例如,`getline` 函数会分配足够的内存来存储用户输入,因此不会因输入长值而发生意外的字符串溢出。 + +### 4、重复释放内存 + +“分配的内存要手动释放”是良好的 C 语言编程原则之一。程序可以使用 `malloc` 函数为数组和字符串分配内存,该函数会开辟一块内存,并返回一个指向内存中起始地址的指针。之后,程序可以使用 `free` 函数释放内存,该函数会使用指针将内存标记为未使用。 + +但是,你应该只使用一次 `free` 函数。第二次调用 `free` 会导致意外的后果,可能会毁掉你的程序。下面是一个针对此点的简短示例程序。程序分配了内存,然后立即释放了它。但为了模仿一个健忘但有条理的程序员,我在程序结束时又一次释放了内存,导致两次释放了相同的内存: + +``` +#include +#include + +int +main() +{ + int *array; + + puts("malloc an array ..."); + + array = malloc(sizeof(int) * 5); + + if (array) { + puts("malloc succeeded"); + + puts("Free the array..."); + free(array); + } + + puts("Free the array..."); + free(array); + + puts("Ok"); +} +``` + +运行这个程序会导致第二次使用 `free` 函数时出现戏剧性的失败: + +``` +malloc an array ... +malloc succeeded +Free the array... +Free the array... +free(): double free detected in tcache 2 +Aborted (core dumped) +``` + +要记得避免在数组或字符串上多次调用 `free`。将 `malloc` 和 `free` 函数定位在同一个函数中,这是避免重复释放内存的一种方法。 + +例如,一个纸牌游戏程序可能会在主函数中为一副牌分配内存,然后在其他函数中使用这副牌来玩游戏。记得在主函数,而不是其他函数中释放内存。将 `malloc` 和 `free` 语句放在一起有助于避免多次释放内存。 + +### 5、使用无效的文件指针 + +文件是一种便捷的数据存储方式。例如,你可以将程序的配置数据存储在 `config.dat` 文件中。Bash shell 会从用户家目录中的 `.bash_profile` 读取初始化脚本。GNU Emacs 编辑器会寻找文件 `.emacs` 以从中确定起始值。而 Zoom 会议客户端使用 `zoomus.conf` 文件读取其程序配置。 + +所以,从文件中读取数据的能力几乎对所有程序都很重要。但是假如要读取的文件不存在,会发生什么呢? + +在 C 语言中读取文件,首先要用 `fopen` 函数打开文件,该函数会返回指向文件的流指针。你可以结合其他函数,使用这个指针来读取数据,例如 `fgetc` 会逐个字符地读取文件。 + +如果要读取的文件不存在或程序没有读取权限,`fopen` 函数会返回 `NULL` 作为文件指针,这表示文件指针无效。但是这里有一个示例程序,它机械地直接去读取文件,不检查 `fopen` 是否返回了 `NULL`: + +``` +#include + +int +main() +{ + FILE *pfile; + int ch; + + puts("Open the FILE.TXT file ..."); + + pfile = fopen("FILE.TXT", "r"); + + /* you should check if the file pointer is valid, but we skipped that */ + + puts("Now display the contents of FILE.TXT ..."); + + while ((ch = fgetc(pfile)) != EOF) { + printf("<%c>", ch); + } + + fclose(pfile); + + /* done */ + + puts("Ok"); + return 0; +} +``` + +当你运行这个程序时,第一次调用 `fgetc` 会失败,程序会立即中止: + +``` +Open the FILE.TXT file ... +Now display the contents of FILE.TXT ... +Segmentation fault (core dumped) +``` + +始终检查文件指针以确保其有效。例如,在调用 `fopen` 打开一个文件后,用类似 `if (pfile != NULL)` 的语句检查指针,以确保指针是可以使用的。 + +人都会犯错,最优秀的程序员也会产生编程错误。但是,遵循上面这些准则,添加一些额外的代码来检查这五种类型的错误,就可以避免最严重的 C 语言编程错误。提前编写几行代码来捕获这些错误,可能会帮你节省数小时的调试时间。 + +-------------------------------------------------------------------------------- + +via: https://opensource.com/article/21/10/programming-bugs + +作者:[Jim Hall][a] +选题:[lujun9972][b] +译者:[unigeorge](https://github.com/unigeorge) +校对:[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/bug_software_issue_tracking_computer_screen.jpg?itok=6qfIHR5y (Bug tracking magnifying glass on computer screen) +[2]: http://www.opengroup.org/onlinepubs/009695399/functions/puts.html +[3]: http://www.opengroup.org/onlinepubs/009695399/functions/printf.html +[4]: http://www.opengroup.org/onlinepubs/009695399/functions/malloc.html +[5]: http://www.opengroup.org/onlinepubs/009695399/functions/free.html +[6]: http://www.opengroup.org/onlinepubs/009695399/functions/gets.html +[7]: http://www.opengroup.org/onlinepubs/009695399/functions/strlen.html +[8]: http://www.opengroup.org/onlinepubs/009695399/functions/fopen.html +[9]: http://www.opengroup.org/onlinepubs/009695399/functions/fgetc.html +[10]: http://www.opengroup.org/onlinepubs/009695399/functions/fclose.html diff --git a/published/202110/20211014 KDE Plasma 5.23 Release Marks its 25th Anniversary With Exciting Improvements.md b/published/202110/20211014 KDE Plasma 5.23 Release Marks its 25th Anniversary With Exciting Improvements.md new file mode 100644 index 0000000000..d8df723097 --- /dev/null +++ b/published/202110/20211014 KDE Plasma 5.23 Release Marks its 25th Anniversary With Exciting Improvements.md @@ -0,0 +1,126 @@ +[#]: subject: "KDE Plasma 5.23 Release Marks its 25th Anniversary With Exciting Improvements" +[#]: via: "https://news.itsfoss.com/kde-plasma-5-23-release/" +[#]: author: "Jacob Crume https://news.itsfoss.com/author/jacob/" +[#]: collector: "lujun9972" +[#]: translator: "wxy" +[#]: reviewer: "wxy" +[#]: publisher: "wxy" +[#]: url: "https://linux.cn/article-13885-1.html" + +纪念 25 周年:KDE Plasma 5.23 发布 +====== + +![](https://i0.wp.com/news.itsfoss.com/wp-content/uploads/2021/10/kde-plasma-5-23-ft.png?w=1200&ssl=1) + +多年来,KDE Plasma 一直是最常用的桌面环境之一。这是因为它似乎有无穷无尽的定制选项、华丽的外观和有料的更新。 + +随着 KDE Plasma 5.23 的发布,这个桌面环境已经工作了 25 年。因此,这个版本也被称为 “Plasma 25 周年版”。 + +让我们回想一下,1996 年 10 月 14 日,KDE 的创始人 Matthias Ettrich [向一个新闻组][1] 发出了呼唤,为他的 “Kool 桌面环境Kool Desktop Environment(KDE)” 项目寻求其他程序员的帮助。 + +而你看,KDE 现在呢? + +在这次更新中,我们可以看到包括 Plasma 内部和第三方应用程序在内的一些重大 UI 改进。 + +### KDE Plasma 5.23: 有什么新东西? + +这次更新带来了许多改进,包括: + + * 桌面重点颜色 + * 新的 Breeze 主题 + * 新的电源管理快速控制 + * 应用程序启动器有更多的自定义选项 + * 数以百计的错误修复 + +在这里,我们将看到所有这些新的改进: + +![视频](https://youtu.be/RMXViPlehAo) + +#### 桌面重点颜色 + +![][3] + +在系统设置中,你会发现有一个可以改变你的桌面重点颜色的选项,你可以选择一个你喜欢的自定义颜色或与默认应用的主题相融合的颜色。 + +#### 新的 Breeze 主题 + +![][4] + +这次更新带来了全新的 Breeze 主题:Breeze - Blue Ocean。默认主题经过多年的改进,这一次,它侧重于使视觉效果更加清晰和易于识别。 + +总的来说,新的主题提供了顺滑的外观。除了主题之外,图标也变得更加突出;增加了一个加载齿轮图标。而且,许许多多这样的细微变化已经进入了 KDE Plasma 5.23,以增强桌面的外观和感觉。 + +正如开发者 Nate Graham 在测试版发布时所说: + +> 还有很多时间可以根据需要调整最终的外观,但总的来说,我认为它真的很棒了,我希望你和我一样喜欢它。 + +#### 系统设置中增强的搜索功能 + +为了更容易找到你要找的东西,KDE Plasma 5.23 增加了更多的关键词组合,以使你使用搜索栏寻找时可以快速提示你相关设置。 + +#### 系统托盘的改进 + +![][5] + +虽然系统托盘已经提供了许多控制,但现在监控你连接的网络以及访问剪贴板有了更精细的选项。 + +系统托盘也改进了显示正在播放的活动媒体时的整体外观。 + +#### 新的电源管理快速控制 + +随着 Linux 5.12 的发布,增加了一个电源管理功能。现在,KDE 引入了一种简单的调整方式,它出现在新的快速控制中。 + +它有三个选项:节电、平衡和性能。只需要一次点击就可以节省电池电力并根据需要调整性能。 + +#### 应用程序启动器的改进 + +![][6] + +在 Plasma 5.21 中,KDE 引入了一个新的应用程序启动器,叫做 Kickoff。虽然它受到了普遍欢迎,但一些用户也抱怨与旧的启动器相比,自定义选项较少。 + +好在 Plasma 5.23 解决了这个问题,为 Kickoff 引入了一些全新的自定义选项。这些选项包括以下能力: + + * 图标化电源和用户控件 + * 所有项目都采用选择列表或网格视图,而不仅仅是收藏夹菜单 + * 新的键盘快捷键 `CTRL+F` 可以快速聚焦到搜索栏 + * 在右上角添加了一个新的按针状按钮,以保持应用程序启动器处于活动状态 + +总的来说,我预计用户会相当受欢迎这些新选项,特别是那些因为它有如此之多的定制选项而使用 KDE 的用户。 + +### 其他改进措施 + +其他的常规改进包括: + + * 优化了 Wayland 会话 + * 通过“反馈”程序提高了数据透明度 + * 改进了 KDE 的 Discover(应用中心)的性能 + +要探索更多关于该版本的信息,你可以查看 [官方公告][7] 及其 [更新日志][8]。 + +### 总结 + +虽然不是有史以来最大的版本,但这是一个重要的版本,具有纪念其 25 周年的宝贵补充。像往常一样,你应该在未来几个月内的某个时候收到更新,这取决于你的发行版。 + +你对 KDE Plasma 5.23 的改进有什么看法?请在下面的评论中告诉我。 + +-------------------------------------------------------------------------------- + +via: https://news.itsfoss.com/kde-plasma-5-23-release/ + +作者:[Jacob Crume][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://news.itsfoss.com/author/jacob/ +[b]: https://github.com/lujun9972 +[1]: https://groups.google.com/g/de.comp.os.linux.misc/c/SDbiV3Iat_s/m/zv_D_2ctS8sJ?pli=1 +[2]: https://i0.wp.com/i.ytimg.com/vi/RMXViPlehAo/hqdefault.jpg?w=780&ssl=1 +[3]: https://i2.wp.com/news.itsfoss.com/wp-content/uploads/2021/10/system-settings-accent-colour.png?w=743&ssl=1 +[4]: https://i1.wp.com/news.itsfoss.com/wp-content/uploads/2021/10/breeze-application-style.png?w=368&ssl=1 +[5]: https://i1.wp.com/news.itsfoss.com/wp-content/uploads/2021/10/plasma-nm.png?w=466&ssl=1 +[6]: https://i0.wp.com/news.itsfoss.com/wp-content/uploads/2021/10/kickoff.png?w=699&ssl=1 +[7]: https://kde.org/announcements/plasma/5/5.23.0/ +[8]: https://kde.org/announcements/changelogs/plasma/5/5.22.5-5.23.0/ diff --git a/published/202110/20211014 Ubuntu 21.10 is Available Now- Finally Brings the Much Awaited GNOME 40 With Ubuntu Twist.md b/published/202110/20211014 Ubuntu 21.10 is Available Now- Finally Brings the Much Awaited GNOME 40 With Ubuntu Twist.md new file mode 100644 index 0000000000..e211dcafa9 --- /dev/null +++ b/published/202110/20211014 Ubuntu 21.10 is Available Now- Finally Brings the Much Awaited GNOME 40 With Ubuntu Twist.md @@ -0,0 +1,135 @@ +[#]: subject: "Ubuntu 21.10 is Available Now! Finally Brings the Much Awaited GNOME 40 With Ubuntu Twist" +[#]: via: "https://news.itsfoss.com/ubuntu-21-10-release/" +[#]: author: "Ankush Das https://news.itsfoss.com/author/ankush/" +[#]: collector: "lujun9972" +[#]: translator: "wxy" +[#]: reviewer: "wxy" +[#]: publisher: "wxy" +[#]: url: "https://linux.cn/article-13887-1.html" + +Ubuntu 21.10 版现已发布!终于带来了 Ubuntu 特色的 GNOME 40 +====== + +![](https://i1.wp.com/news.itsfoss.com/wp-content/uploads/2021/10/ubuntu-21-10-release-date.png?w=1200&ssl=1) + +> Ubuntu 21.10 是一个激动人心的版本,包含了 GNOME 40 和几个显著的变化。准备已经驶向了 Ubuntu 22.04 LTS 吗? + +Ubuntu 21.10 是下一个大型 LTS 更新之前的最后一个非 LTS 版本。代号为 Impish Indri 的 Ubuntu 21.10 将被支持**九个月,直到 2022 年 7 月**。 + +除非你想尝试最新和最棒的功能,否则你应该坚持使用 Ubuntu 20.04 LTS 并等待 Ubuntu 22.04 LTS。 + +现在你可以下载 Ubuntu 21.10 并在你的系统上安装,让我重点介绍一下这次更新的几个亮点。 + +### Ubuntu 21.10 “Impish Indri” 有何新变化? + +![][1] + +Ubuntu 21.10 出炉时有几个重大变化。一些最有影响的改进包括: + + * 新的安装程序 + * 增加了 GNOME 40 + * 抛弃了混合主题,选择了浅色/深色主题 + * 包括 Linux 内核 5.13 + * 加入了支持蓝牙 LDAC 的 PulseAudio 15 + * 带有 Nvidia 专有驱动程序的 Wayland 会话 + +GNOME 40 可以说是 Ubuntu 中令人耳目一新的变化,但你只有在体验之后才能知道。为了让你快速感受一下,下面是这个版本中你可以期待的所有变化。 + +#### 粉饰一新的安装程序 + +![][2] + +虽然 Ubuntu 的安装程序很容易使用,对新手也很友好,但 Canonical 希望通过对安装程序进行视觉和技术上的改造,使其更上一层楼。 + +开发团队利用 Flutter 使安装程序在所有其他 Ubuntu 口味和系统配置中保持一致。 + +![][3] + +#### GNOME 40 + +![][5] + +Ubuntu 的桌面体验与 GNOME 40 融为一体,没有提供任何混乱的布局。停靠区依然存在,水平活动概览也与之无缝衔接。 + +当然,[GNOME 40][4] 中的所有改进,如核心应用程序的更新、工作区的改变等等,都会延续到 Ubuntu 21.10 中,只是 Canonical 做了一些改动。 + +就我个人而言,我并不喜欢 GNOME 40 的工作流程,但你可能会想体验一下。 + +#### 主题的变化 + +![][9] + +我喜欢改进后的颜色方案,其目的是为了更好地与 Canonical 的 Ubuntu 品牌相融合。 + +然而,当涉及到与应用程序和整体主题选择的一致性时,混合(标准)主题是有点问题的。 + +在 Ubuntu 21.10 中,你会看到深色和浅色主题,而浅色是开箱即用的默认选择。如果你想进一步了解,你可以阅读我们的 [过去的报道以更多了解这一变化][6]。 + +#### Linux 内核 5.13 + +Linux 内核 5.13 的加入增加了对未来的英特尔和 AMD 芯片的支持,以及对苹果 M1 的初步支持。 + +你可以就一步了解 [Linux 内核 5.13][7] 的信息,但总的来说,它应该给你更好的硬件兼容性。 + +#### PulseAudio 15 支持蓝牙 LDAC + +考虑到现在有更多的蓝牙耳机支持 LDAC,当你在桌面上使用 Ubuntu 21.10 时,你可以利用这一功能。 + +别担心,如果你不想尝试非 LTS 版本,Ubuntu 22.04 LTS 将包括同样的改进。所以,你必须耐心等待,直到明年才能利用这一点。 + +除此之外,PulseAudio 15 还带来了一系列的改进,你可以参考它的 [官方更新日志以了解更多信息][8] 。 + +#### Wayland 会话与 NVIDIA 专有驱动程序 + +现在,即使你使用 NVIDIA 专有的驱动程序,如果你需要也可以切换到 Wayland 会话。 + +#### Ubuntu 21.10 中的其他变化 + +![][14] + +Ubuntu 21.10 版本为其云镜像、树莓派支持和安全性带来了一系列高质量的变化。 + +其中一些值得注意的变化包括: + + * [Firefox 默认采用 Snap][10] + * LibreOffice、Thunderbird 更新 + * Ubuntu Sever 的改进 + * 新的 PHP 默认为 8.0.8 + +如果你想探索所有的技术细节,你可能想参考一下 [官方发布说明][11]。 + +### 下载并升级到 Ubuntu 21.10 + +你可以选择全新安装或使用软件升级器 [从 Ubuntu 21.04 升级][12] 到 Ubuntu 21.10。 + +请注意,如果你正在使用 Ubuntu 20.04 LTS,建议等待下一个 LTS 版本,除非你知道自己在做什么。 + +- [下载Ubuntu 21.10][13] + +-------------------------------------------------------------------------------- + +via: https://news.itsfoss.com/ubuntu-21-10-release/ + +作者:[Ankush Das][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://news.itsfoss.com/author/ankush/ +[b]: https://github.com/lujun9972 +[1]: https://i1.wp.com/news.itsfoss.com/wp-content/uploads/2021/10/ubuntu-21-10-full.png?w=1200&ssl=1 +[2]: https://i1.wp.com/news.itsfoss.com/wp-content/uploads/2021/02/new-ubuntu-installer.png?w=1012&ssl=1 +[3]: https://i1.wp.com/news.itsfoss.com/wp-content/uploads/2021/10/ubuntu-new-installer.png?w=960&ssl=1 +[4]: https://news.itsfoss.com/gnome-40-release/ +[5]: https://i0.wp.com/news.itsfoss.com/wp-content/uploads/2021/10/ubuntu-21-10-new-gnome-40.png?resize=1568%2C776&ssl=1 +[6]: https://news.itsfoss.com/ubuntu-21-10-theme-change/ +[7]: https://news.itsfoss.com/linux-kernel-5-13-release/ +[8]: https://www.freedesktop.org/wiki/Software/PulseAudio/Notes/15.0/ +[9]: https://i1.wp.com/news.itsfoss.com/wp-content/uploads/2021/10/ubuntu-21-10-appearance.png?w=1062&ssl=1 +[10]: https://news.itsfoss.com/ubuntu-firefox-snap-default/ +[11]: https://discourse.ubuntu.com/t/impish-indri-release-notes/21951 +[12]: https://itsfoss.com/upgrade-ubuntu-to-newer-version/ +[13]: https://releases.ubuntu.com/21.10/ +[14]: https://i2.wp.com/news.itsfoss.com/wp-content/uploads/2021/10/ubuntu-21-10-about.png?w=1054&ssl=1 \ No newline at end of file diff --git a/published/202110/20211015 How to Find and Kill Zombie Process in Linux.md b/published/202110/20211015 How to Find and Kill Zombie Process in Linux.md new file mode 100644 index 0000000000..a3a8dd3f29 --- /dev/null +++ b/published/202110/20211015 How to Find and Kill Zombie Process in Linux.md @@ -0,0 +1,123 @@ +[#]: subject: "How to Find and Kill Zombie Process in Linux" +[#]: via: "https://itsfoss.com/kill-zombie-process-linux/" +[#]: author: "Marco Carmona https://itsfoss.com/author/marco/" +[#]: collector: "lujun9972" +[#]: translator: "zengyi1001" +[#]: reviewer: "wxy" +[#]: publisher: "wxy" +[#]: url: "https://linux.cn/article-13919-1.html" + +如何找到并杀掉 Linux 系统中的僵尸进程 +====== + +![][5] + +> 这是一个关于如何寻找 Linux 系统僵尸进程并杀死它们的小知识。你也可以从中了解到关于进程和僵尸进程的一些知识。 + +在了解僵尸进程之前,让我们来复习一下什么是 Linux 进程。 + +简而言之,[进程][1] 是一个程序的运行实例。它可能运行在前端(比如有交互的进程),也可能运行在后端(比如无交互或自动运行的进程)。它可能是一个父进程(运行期间创建了其他进程),也可能是一个子进程(由其他进程所创建)。 + +在 Linux 系统中,除 PID 为 0 的第一个 `init` 进程(或 `systemd`)外,其余进程都有父进程。进程也可以拥有自己的子进程。 + +不相信?可以试试在终端中使用 `pstree` 命令查看进程的树型结构,你能看到系统各个进程的“家族树”。 + +### Linux系统里的僵尸进程是什么? + +子进程死亡后,它的父进程会接收到通知去执行一些清理操作,如释放内存之类。然而,若父进程并未察觉到子进程死亡,子进程就会进入到“僵尸zombie”状态。从父进程角度看,子进程仍然存在,即使子进程实际上已经死亡。这就是“僵尸进程zombie process”(也被称为“已消失进程defunct process”)是如何产生并存在于系统中的。 + +这里有一个来自 [Turnoff.us](https://turnoff.us/geek/zombie-processes/) 的关于僵尸进程的非常有趣的看法: + +![Image credit: Turnoff.us][2] + +### 你真的需要关心僵尸进程吗? + +重点要说的是,僵尸进程并没有像它的名称那样看起来可怕。 + +但如果系统的内存已经所剩不多或者有太多的僵尸进程在吃掉内存,问题会变得糟糕。同样,大部分 Linux 系统进程最大 PID 设置为 32768,如果过多僵尸进程导致其他重要任务没有 PID 可用,你的系统会发生崩溃。 + +这是真实可能发生的,它有一定的概率,特别当存在一个编码糟糕的程序开始大量产生僵尸进程的时候。 + +在这种情况下,找到并杀死僵尸进程是一个明智的做法。 + +### 如何找到僵尸进程 + +Linux 系统中的进程可能处于如下状态中的一种: + + * `D` = 不可中断的休眠 + * `I` = 空闲 + * `R` = 运行中 + * `S` = 休眠 + * `T` = 被调度信号终止 + * `t` = 被调试器终止 + * `Z` = 僵尸状态 + +那如何查看进程和它的当前状态呢?一个简单的方法是在终端中使用 [top 命令][3]。 + +![Top command show processes and their status][4] + +正如你在上面截图中看到的,截图中共有 250 个任务(进程),其中 1 个处在 “运行中running” 状态,248 个进程处于 “休眠sleep” 状态,还有一个处于 “僵尸zombie” 状态。 + +现在问题进入下一步,如何杀死 “僵尸” 进程? + +### 如何找到并杀死一个僵尸进程?僵尸进程能被杀死吗? + +僵尸进程已经死了,要如何才能杀死一个已经死亡的进程呢? + +在僵尸电影中,你可以射击僵尸的头部或烧掉它们,但在这里是行不通的。你可以一把火烧了系统来杀死僵尸进程,但这并不是一个可行的方案。 + +一些人建议发送 `SIGCHLD` 给父进程,但这个信号很可能会被忽略。还有一个方法是杀死父进程来杀死僵尸进程,这听起来很野蛮,但它却是唯一能确保杀死僵尸进程的方法。 + +首先,通过在终端中 [使用 ps 命令][6] 我们列举僵尸进程,得到它们的进程 ID: + +``` +ps ux | awk '{if($8=="Z+") print}' +``` + +`ps ux` 命令输出的第 8 列显示了进程状态。上述命令只会打印所有处在 Z+ 状态(表示僵尸状态)的进程。 + +确认了进程 ID 后,我们可以得到它的父进程 ID: + +``` +ps -o ppid= -p +``` + +你也可以将上述两个命令结合在一起,直接得到僵尸进程的 PID 及其父进程的 PID: + +``` +ps -A -ostat,pid,ppid | grep -e '[zZ]' +``` + +现在你得到了父进程 ID,使用命令行和得到的 ID 号 [终于可以杀死进程了][7]: + +``` +kill -9 +``` + +![Killing parent process][8] + +再次运行 `ps` 命令或 `top` 命令,你可以验证僵尸进程是否已经被杀死。 + +恭喜!现在你知道怎么清理僵尸进程了。 + +-------------------------------------------------------------------------------- + +via: https://itsfoss.com/kill-zombie-process-linux/ + +作者:[Marco Carmona][a] +选题:[lujun9972][b] +译者:[zengyi1001](https://github.com/zengyi1001) +校对:[wxy](https://github.com/wxy) + +本文由 [LCTT](https://github.com/LCTT/TranslateProject) 原创编译,[Linux中国](https://linux.cn/) 荣誉推出 + +[a]: https://itsfoss.com/author/marco/ +[b]: https://github.com/lujun9972 +[1]: https://tldp.org/LDP/tlk/kernel/processes.html +[2]: https://i2.wp.com/itsfoss.com/wp-content/uploads/2021/10/zombies-turnoff.webp?resize=800%2C467&ssl=1 +[3]: https://linuxhandbook.com/top-command/ +[4]: https://i1.wp.com/itsfoss.com/wp-content/uploads/2021/10/top-command-view.png?resize=800%2C474&ssl=1 +[5]: https://i1.wp.com/itsfoss.com/wp-content/uploads/2021/10/kill-zombie-process-linux.jpg?resize=800%2C450&ssl=1 +[6]: https://linuxhandbook.com/ps-command/ +[7]: https://itsfoss.com/how-to-find-the-process-id-of-a-program-and-kill-it-quick-tip/ +[8]: https://i1.wp.com/itsfoss.com/wp-content/uploads/2021/10/killing-parent-process.png?resize=800%2C180&ssl=1 diff --git a/published/202110/20211015 How to Upgrade to Ubuntu 21.10 Right Now.md b/published/202110/20211015 How to Upgrade to Ubuntu 21.10 Right Now.md new file mode 100644 index 0000000000..dd8a75ea34 --- /dev/null +++ b/published/202110/20211015 How to Upgrade to Ubuntu 21.10 Right Now.md @@ -0,0 +1,67 @@ +[#]: subject: "How to Upgrade to Ubuntu 21.10 Right Now" +[#]: via: "https://itsfoss.com/upgrade-ubuntu-to-newer-version/" +[#]: author: "Abhishek Prakash https://itsfoss.com/author/abhishek/" +[#]: collector: "lujun9972" +[#]: translator: "geekpi" +[#]: reviewer: "wxy" +[#]: publisher: "wxy" +[#]: url: "https://linux.cn/article-13902-1.html" + +如何现在就升级到 Ubuntu 21.10 +====== + +[Ubuntu 21.10 “Impish Indri” 刚刚发布][1]。如果你正在使用 Ubuntu 21.04,你应该有升级到 Ubuntu 21.10 的选项。 + +![](https://img.linux.net.cn/data/attachment/album/202110/20/105035l6ig4lkjnk5cipuw.jpg) + +然而,这种推出将是逐步的。这意味着不是每个人都会立即得到新版本可用的通知。在你看到升级选项之前,可能需要几周的时间。 + +但是,如果你迫不及待地想获得带有 GNOME 40 和其他新功能的 Ubuntu 21.10 呢?你真的需要等待吗?不用。 + +### 现在就从 Ubuntu 21.04 升级到 Ubuntu 21.10 + +以下是你要做的。打开“软件和更新Software & Updates”应用: + +![Start the Software & Updates application][3] + +并确保你在“更新Updates”标签下将“通知我新的 Ubuntu 版本Notify me of a new Ubuntu version”设置为“任何新版本For any new version”。 + +![Make sure that settings are right for new Ubuntu version notification][4] + +现在打开终端,输入以下命令,以确保你的系统已经更新: + +``` +sudo apt update && sudo apt upgrade +``` + +当你的 Ubuntu 21.04 系统安装了所有的更新,运行更新管理器来寻找开发版本(本例中为 Ubuntu 21.10)。 + +``` +update-manager -d +``` + +它将打开寻找更新的“更新管理器Update Manager”。由于你已经更新了系统,它不会找到新的更新来安装。然而,它将看到 Ubuntu 21.10 现在已经可用。 + +![Hit the upgrade button][2] + +你可以点击“升级Upgrade”按钮,按照屏幕上的选项开始升级程序。你需要有良好的网络速度来下载 2GB 的更新。确保你的系统在升级过程中保持与电源的连接。 + +享受 Ubuntu 21.10! + +-------------------------------------------------------------------------------- + +via: https://itsfoss.com/upgrade-ubuntu-to-newer-version/ + +作者:[Abhishek Prakash][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/abhishek/ +[b]: https://github.com/lujun9972 +[1]: https://linux.cn/article-13887-1.html +[2]: https://i1.wp.com/itsfoss.com/wp-content/uploads/2021/10/upgrade-to-Ubuntu-21-10.webp?resize=797%2C287&ssl=1 +[3]: https://i2.wp.com/itsfoss.com/wp-content/uploads/2021/10/software-and-updates.webp?resize=800%2C166&ssl=1 +[4]: https://i2.wp.com/itsfoss.com/wp-content/uploads/2021/10/ubuntu-upgrade-settings.webp?resize=800%2C338&ssl=1 diff --git a/published/202110/20211016 helloSystem, the Mac-like FreeBSD OS, Takes Another Step Towards Full Release.md b/published/202110/20211016 helloSystem, the Mac-like FreeBSD OS, Takes Another Step Towards Full Release.md new file mode 100644 index 0000000000..7aecb41222 --- /dev/null +++ b/published/202110/20211016 helloSystem, the Mac-like FreeBSD OS, Takes Another Step Towards Full Release.md @@ -0,0 +1,111 @@ +[#]: subject: "helloSystem, the Mac-like FreeBSD OS, Takes Another Step Towards Full Release" +[#]: via: "https://news.itsfoss.com/hellosystem-towards-first-release/" +[#]: author: "John Paul Wohlscheid https://news.itsfoss.com/author/john/" +[#]: collector: "lujun9972" +[#]: translator: "wxy" +[#]: reviewer: "wxy" +[#]: publisher: "wxy" +[#]: url: "https://linux.cn/article-13915-1.html" + +helloSystem:一款类似 Mac 的 FreeBSD 系统 +====== + +![](https://i1.wp.com/news.itsfoss.com/wp-content/uploads/2021/10/hello-system-bsd.jpg?w=1200&ssl=1) + +最近,helloSystem 的开发者发布了他们操作系统的最新版本。helloSystem 是一个较新的项目,希望以 FreeBSD 为基础创建一个简单易用的操作系统。让我们来看看这对你我意味着什么。 + +### helloSystem 简介 + +![helloSystem 的关于屏幕][1] + +你们中的大多数人可能以前从未听说过 [helloSystem][2]。该项目是由 [AppImage 的创建者][3] [Simon Peter][4] 在去年年初启动的。Simon 的目标是创建一个“友好的 [自由桌面][5] 操作系统,重点是简单、简约优雅和可用性。” + +Simon 从上世纪 80 、90 年代更为简单的操作系统中获得了灵感,特别是 **早期的 MacOS**,比如 [System 1][6]。如果你只是看一下系统运行的截图,你可能会想说,“我不明白这有什么好大惊小怪的。有一堆 Linux 发行版或主题,看起来就像 MacOS。” + +该项目不仅仅是看起来像 MacOS,它想回归到更简单、更容易使用的设计。据 [其网站][7] 上讲,“helloSystem 是一个面向创作者的桌面系统,注重简单、优雅和实用性。它的设计遵循 ‘少而精’ 的理念。它的目的是为 ‘普通人’ 提供一个系统,欢迎从 Mac 切换过来的人”。你可以通过观看 Simon 在 [FOSDEM 21][8] 上的演讲,了解更多关于他对 helloSystem 计划的想法。 + +就像 [Suckless 项目][9] 一样,Simon 创建了一个 “[欢迎和不欢迎的技术][10]” 列表。被批准的技术清单包括: + + * Qt + * mDNSResponder + * Python + * Go + +![helloSystem 的欢迎屏幕][12] + +“不受欢迎的技术”清单包括 Simon 认为“太复杂或被认为不美观”的东西。这些技术包括: + + * 触摸 + * btrfs + * Gnome + * GTK + * 客户端窗口装饰 + * Wayland + * Pipewire + * XDG 桌面规范 + * 与原始字体在度量上兼容的字体,但不试图在视觉上与原始字体相似 + * 最终用户应用程序的包管理器 + * 配置文件、IP 地址 + * D-Bus + * 通过限制用户或应用程序可以做的事情而提供的安全性 + * Polkit + * 大写锁定键 + * 本地文件的 URI + +![在 helloSystem 上安装 Inkscape][13] + +### helloSystem 如何工作 + +我最好解释一下 helloSystem 的工作方式。就像 MacOS 一样,桌面在屏幕顶部有一个全局菜单,底部有一个 Dock。与 MacOS 的 Finder 一样,helloSystem 也有一个文件管理器(名为 Filer),它也负责窗口管理。 + +在左上方,你会发现一个 “系统System” 菜单,你可以用它来访问应用程序。(你也可以在左上角的搜索框中输入应用程序的名称。)helloSystem 只安装了几个开箱即用的基本应用程序。如果你点击一个未安装的应用程序,helloSystem 会下载并安装该应用程序的 AppImage。 + +helloSystem 基于 FreeBSD 12.2。它默认启用了 ZFS。它没有密码或用户账户系统,但这并不意味着他们无视安全。据 [其网站][10] 讲,“这并不是说一般的安全问题不重要。而是说它需要以一种不会限制设备的合法用户(所有者)真正 ‘拥有’ 该设备的方式来实现。” + +### 最新版本中的新功能 + +![helloSystem 的实用程序窗口][14] + +最新版本的 helloSystem 包括不少图形方面的更新和小的变化,包括: + + * 从 Openbox 切换到 KWin 窗口管理器 + * 合理的窗口标题居中 + * 当窗口被拖到屏幕边缘时,会缩放到一定大小,类似于 “Aero Snap”。 + * 简化了 “桌面设置Desktop Settings” 的用户界面;现在更改会立即应用 + * 移除文件管理器中的标签以简化用户界面 + * 为菜单添加新的电池小程序,以显示电池充电量 + * 桌面上的垃圾箱图标不再有 “移动到垃圾箱Move to Trash” 的上下文菜单项 + * 最小化窗口和取消最小化窗口时的动画 + * 窗口大小调整时的动画 + * 调整内核配置以优化声音 + * 简化了文件管理器中的 “获取信息Get Info” 对话框 + +你可以在 [这里][11] 看到其余的变化。你也可以从同一个链接下载最新的 .iso 文件。试一试,让我们知道你的想法。 + +-------------------------------------------------------------------------------- + +via: https://news.itsfoss.com/hellosystem-towards-first-release/ + +作者:[John Paul Wohlscheid][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://news.itsfoss.com/author/john/ +[b]: https://github.com/lujun9972 +[1]: https://i2.wp.com/news.itsfoss.com/wp-content/uploads/2021/10/hello-about.jpg?w=850&ssl=1 +[2]: https://github.com/helloSystem/hello +[3]: https://itsfoss.com/appimage-interview/ +[4]: https://github.com/probonopd +[5]: https://medium.com/@probonopd/bring-back-the-ease-of-80s-and-90s-personal-computing-393738c5e2a1 +[6]: https://github.com/helloSystem/hello/wiki#design-principles +[7]: https://hellosystem.github.io/docs/ +[8]: https://fosdem.org/2021/schedule/event/hello_bsd/ +[9]: https://suckless.org/sucks/ +[10]: https://github.com/helloSystem/hello/wiki/Welcome-and-unwelcome-technologies +[11]: https://github.com/helloSystem/ISO/releases/tag/r0.6.0 +[12]: https://i0.wp.com/news.itsfoss.com/wp-content/uploads/2021/10/hello-welcome.jpg?w=850&ssl=1 +[13]: https://i0.wp.com/news.itsfoss.com/wp-content/uploads/2021/10/hello-install.jpg?w=850&ssl=1 +[14]: https://i0.wp.com/news.itsfoss.com/wp-content/uploads/2021/10/hello-utillities.jpg?w=850&ssl=1 \ No newline at end of file diff --git a/published/202110/20211018 4 Linux tools to erase your data.md b/published/202110/20211018 4 Linux tools to erase your data.md new file mode 100644 index 0000000000..2d6147082a --- /dev/null +++ b/published/202110/20211018 4 Linux tools to erase your data.md @@ -0,0 +1,116 @@ +[#]: subject: "4 Linux tools to erase your data" +[#]: via: "https://opensource.com/article/21/10/linux-tools-erase-data" +[#]: author: "Don Watkins https://opensource.com/users/don-watkins" +[#]: collector: "lujun9972" +[#]: translator: "geekpi" +[#]: reviewer: "wxy" +[#]: publisher: "wxy" +[#]: url: "https://linux.cn/article-13913-1.html" + +4 个用来擦除数据的 Linux 工具 +====== + +> 用这些开源工具从你的硬盘驱动器中擦除数据。 + +![](https://img.linux.net.cn/data/attachment/album/202110/23/113918sdojp6sj0odgis16.jpg) + +保持数据安全的最好方法之一是只向加密的硬盘驱动器写入数据。在一个标准的硬盘上,只要把硬盘挂载就可以查看数据,就像 U 盘一样,甚至可以用 [Scalpel][2] 和 [Testdisk][3] 等工具显示和恢复已删除的数据。但是在一个加密的驱动器上,如果没有解密密钥(通常是你在挂载驱动器时输入的密码),数据是无法被读取的。 + +加密可以在你安装操作系统时建立,有些操作系统甚至可以在安装后的任何时候激活加密功能。 + +但是,当你卖掉一台电脑或更换一个一开始就没有被加密的驱动器时,你该怎么办呢? + +与从一开始就加密你的数据相比,最好的办法是在你用完硬盘后删除数据。 + +### 负责任的看管者 + +我经常被要求帮助客户升级一台旧电脑。无一例外,他们更愿意帮助我回收它们,使它们能被别人使用。我很乐意翻新这些旧电脑,用较新的固态驱动器来改装它们,极大地提高性能。 + +然而,把一个旧驱动器扔进垃圾桶并不是一个好主意。它需要被擦除,然后被妥善处理。我没有把硬盘留在原来的电脑里,而是把它们取出来,放在一个硬盘盒里,然后把它们连接到我的 Linux 电脑上。有几个 Linux 工具可以很容易地完成这个任务。其中一个是 **Gnu Shred**。 + +### GNU Shred + +``` +$ sudo shred -vfz /dev/sdX +``` + +Shred 有许多选项: + + * `-n` - 覆盖的次数。默认是三次。 + * `-u` - 覆盖并删除。 + * `-s` - 要粉碎的字节数。 + * `-v` - 显示扩展信息。 + * `-f` - 必要时强制改变权限以允许写入。 + * `-z` - 最后用 0 覆盖来隐藏粉碎。 + +使用 `shred --help` 获取更多信息 + +### ShredOS + +ShredOS 是一个即用Live Linux 发行版,它的唯一目的是清除驱动器的全部内容。它是在一个名为 DBAN 的类似发行版停止维护后开发的。它使用 `nwipe` 应用,它是 DBAN 的 `dwipe` 的一个分叉。你可以通过下载 32 位或 64 位镜像,并在 Linux 和 macOS 上使用 `dd` 命令将其写入驱动器来制作一个可启动的 USB 驱动器: + +``` +$ sudo dd if=shredos.img of=/dev/sdX bs=4M status=progress +``` + +另外,你可以在 Linux、macOS 和 Windows 上使用 [Etcher][4] 工具烧录。 + +### dd 命令 + +清除驱动器的一个常见方法是使用 Linux 的 `dd` 命令。几乎所有的 Linux 安装都安装了 `dd` 工具。确保该驱动器没有被挂载。 + +``` +$ sudo umount /dev/sdXY -l +``` + +如果你想在整个目标磁盘上写零,执行以下命令。这可能需要一个整个通宵。 + +``` +$ sudo dd if=/dev/urandom of=/dev/sdX bs=10M +``` + +**警告**:请确保你知道你在系统中的位置,并以正确的驱动器为目标,这样你就不会意外地删除自己的数据。 + +### Nvme-cli + +如果你的计算机包含一个较新的 NVMe 驱动器,你可以安装 [nvme-cli][5] 程序,并使用 `sanitize` 选项来清除你的驱动器。 + +`nvme sanitize help` 命令提供了选项列表: + + * `--no-dealloc`、`-d` - 净化后不解除分配。 + * `--oipbp`、`-i` - 每次覆写后反转模式。 + * `--owpass=`、`-n` - 覆写次数。 + * `--ause`、`-u` - 允许无限制净化退出。 + * `--sanact=`、`-a` - 净化动作。 + * `--ovrpat=`、`-p` - 覆写模式。 + +下面是我使用的命令: + +``` +$ sudo nvme sanitize /dev/nvme0nX +``` + +这里的警告与格式化过程相同:首先备份重要的数据,因为这个命令会擦除这些数据! + +### 信息管理 + +你保存在计算机上的信息是很重要的。它属于你,也属于其他任何人。当你卖掉一台电脑或处理一个硬盘时,确保你已经用这些很棒的工具之一清除了你的数据。 + +-------------------------------------------------------------------------------- + +via: https://opensource.com/article/21/10/linux-tools-erase-data + +作者:[Don Watkins][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/don-watkins +[b]: https://github.com/lujun9972 +[1]: https://opensource.com/sites/default/files/styles/image-full-size/public/lead-images/cloud_tools_hardware.png?itok=PGjJenqT (Tools in a cloud) +[2]: https://www.redhat.com/sysadmin/find-lost-files-scalpel +[3]: https://www.redhat.com/sysadmin/recover-partition-files-testdisk +[4]: https://opensource.com/article/18/7/getting-started-etcherio +[5]: https://opensource.com/article/21/9/nvme-cli diff --git a/published/202110/20211018 Get memory use statistics with this Linux command-line tool.md b/published/202110/20211018 Get memory use statistics with this Linux command-line tool.md new file mode 100644 index 0000000000..be81b26066 --- /dev/null +++ b/published/202110/20211018 Get memory use statistics with this Linux command-line tool.md @@ -0,0 +1,113 @@ +[#]: subject: "Get memory use statistics with this Linux command-line tool" +[#]: via: "https://opensource.com/article/21/10/memory-stats-linux-smem" +[#]: author: "Tomasz Waraksa https://opensource.com/users/tomasz" +[#]: collector: "lujun9972" +[#]: translator: "geekpi" +[#]: reviewer: "wxy" +[#]: publisher: "wxy" +[#]: url: "https://linux.cn/article-13918-1.html" + +用 smem 命令获取内存使用统计信息 +====== + +> smem 命令允许你快速查看你的网页应用的内存使用情况。 + +![](https://img.linux.net.cn/data/attachment/album/202110/25/101843emjjkmvk88gvyqgv.jpg) + +在我的编程工作中,我经常需要了解网页应用的内存使用情况。在深入研究细节和浏览器剖析工具之前,一个粗略的估计通常就足够了。 + +为了了解 Linux 或 macOS 上的内存使用情况,人们通常使用 [top][2] 或 [htop][3]。我很想看到一个单一的数字:一个进程占用了多少内存。但这些工具所显示的统计数据可能很难理解。对于网页浏览器来说,它甚至更加复杂,因为它们经常运行许多独立的进程。它们在 `top` 输出中显示为一个长长的列表,每一个都有自己的单独指标。 + +![Memory usage using htop][4] + +### smem 命令 + +幸运的是有 [smem][6],另一个用于查看内存使用统计的命令行工具。用你选择的包管理器安装它,例如: + +``` +sudo apt install smem +``` + +要获得 [Firefox][7] 的总内存使用量,请执行: + +``` +smem -c pss -P firefox -k -t | tail -n 1 +``` + +这些开关做了什么? + + * `-c` 开关指定要显示的列。我只对 `pss` 列感兴趣,它显示一个进程分配的内存。 + * `-P` 开关过滤进程,只包括那些名字里有 `firefox` 的进程。 + * `-k` 开关显示以 MB/GB 为单位的内存使用情况,而不是单纯的字节数。 + * `-t` 开关显示总数。 + * `tail -n 1` 过滤器只输出最后一行,也就是总数的地方。 + +输出是非常简单的: + +``` +$ smem -t -k -c pss -P firefox | tail -n 1 +4.9G +``` + +开门见山!而且,经过又一天忙碌的工作,打开了 50 多个选项卡,Firefox 仍然只使用 5 GB。看看吧,Google Chrome。 + +#### 用一个脚本更容易 + +为了方便起见,我创建一个名为 `memory-use` 的小脚本,它将进程名称作为参数。我把所有的脚本都放在 `~/bin` 里,所以: + +``` +echo 'smem -c pss -P "$1" -k -t | tail -n 1' > ~/bin/memory-use && chmod +x ~/bin/memory-use +``` + +现在我可以很容易地测量任何应用的内存使用: + +``` +memory-use firefox +memory-use chrome +memory-use slack +``` + +#### 还有更多! + +该工具不仅可以显示总的内存使用情况。它甚至可以生成图形输出。 + +比如: + +``` +smem --pie name -c pss +``` + +显示类似这样的内容: + +![Pie chart output from smem][8] + +关于更多的细节,我建议查看 [smem 手册页][6]。 + +你可以在 上找到另一个很棒的教程。 + +希望你喜欢! + +本文最初发表在[作者的博客][9]上,并经许可转载。 + +-------------------------------------------------------------------------------- + +via: https://opensource.com/article/21/10/memory-stats-linux-smem + +作者:[Tomasz Waraksa][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/tomasz +[b]: https://github.com/lujun9972 +[1]: https://opensource.com/sites/default/files/styles/image-full-size/public/lead-images/programming_code_keyboard_orange_hands.png?itok=G6tJ_64Y (Programming at a browser, orange hands) +[2]: https://linux.die.net/man/1/top +[3]: https://linux.die.net/man/1/htop +[4]: https://opensource.com/sites/default/files/uploads/1_htop.png (Memory usage using htop) +[5]: https://creativecommons.org/licenses/by-sa/4.0/ +[6]: https://linux.die.net/man/8/smem +[7]: https://www.mozilla.org/en-US/firefox/ +[8]: https://opensource.com/sites/default/files/uploads/2_smem-pie-chart.png (Pie chart output from smem) +[9]: https://letsdebug.it/post/26-measure-application-memory-use-on-linux/ diff --git a/published/202110/20211018 PinePhone Pro is an Affordable Linux Flagship Smartphone That Could Replace Your Android.md b/published/202110/20211018 PinePhone Pro is an Affordable Linux Flagship Smartphone That Could Replace Your Android.md new file mode 100644 index 0000000000..ab6426afea --- /dev/null +++ b/published/202110/20211018 PinePhone Pro is an Affordable Linux Flagship Smartphone That Could Replace Your Android.md @@ -0,0 +1,114 @@ +[#]: subject: "PinePhone Pro is an Affordable Linux Flagship Smartphone That Could Replace Your Android" +[#]: via: "https://news.itsfoss.com/pinephone-pro-introduced/" +[#]: author: "Jacob Crume https://news.itsfoss.com/author/jacob/" +[#]: collector: "lujun9972" +[#]: translator: "wxy" +[#]: reviewer: "wxy" +[#]: publisher: "wxy" +[#]: url: "https://linux.cn/article-13901-1.html" + +PinePhone Pro:一款价位适中的 Linux 旗舰智能手机 +====== + +> 售价 399 美元的 PinePhone Pro 是一款 Linux 智能手机,或许有潜力取代一些预算相当的 Android 设备。但作为消费者,还需要等待几个月。 + +![](https://i2.wp.com/news.itsfoss.com/wp-content/uploads/2021/10/PinePhone-Pro-ft.png?w=1200&ssl=1) + +早在 2019 年,当 Pine64 宣布推出 PinePhone 时,没有人想到它会变得如此受欢迎。在短短两年间,Pine64 已经成功建立了一个由数万名开发者和用户组成的社区,大家一起努力使 Linux 完美地跑在了手机上。 + +现在,随着 PinePhone Pro 的宣布,Pine64 正在扩大 Linux 手机的受众范围。这个设备有许多令人难以置信的新功能,所有这些都使它可以与许多中档 Android 手机相提并论。 + +- [视频](https://img.linux.net.cn/static/video/Meet%20the%20PinePhone%20Pro%20_%20PINE64-wP2-6Z74W44.mp4) + +### PinePhone Pro 功能 + +![][1] + +与原来的 PinePhone 相比,PinePhone Pro 带来了巨大的升级。这些升级中最值得注意的是使用了 Rockchip 的六核 RK3399S SoC 芯片,这应该能显著地提升性能。其他一些值得注意的功能和升级还有: + + * 4GB LPDDR4 内存 + * 128GB 存储 + microSD 卡插槽 + * 6 英寸 IPS 显示屏,采用 **大猩猩 4 号玻璃**。 + * 1300 万像素(后置)+ 500 万像素(前置)的摄像头 + +让我们来探讨一下这方面的更多细节。 + +#### 性能更好 + +![][2] + +到目前为止,最重要的升级是 RK3399S SoC 的加入,它是 Pine64 和 Rockchip 合作的结果。这个令人印象深刻的强大 SoC 包含 6 个 CPU 核心,以及一个四核 Mali T860 GPU。 + +这一组合带来了显著的性能提升,使得 PinePhone Pro 的性能与大多数中档安卓手机相当。这带来了一个更快的系统,能够运行许多桌面级应用程序,如用于照片编辑的 GIMP 和用于仿真游戏的 RetroArch。 + +总的来说,这次升级将大大改善开发者和消费者的用户体验。 + +#### 内存更多 + +考虑到智能手机已经开始提供 6GB 内存作为基本变体时,Linux 智能手机也应该使用更多的内存来保持流畅。虽然在优化方面已经做了很多工作,但更多的内存总是有益的。 + +PinePhone Pro 提供了 4GB 的内存,当放在基座上时可以有更大的通用性,当作为手机使用时可以多打开几个应用程序。我对此感到非常兴奋,因为它应该能够模拟更多的游戏,增加 PinePhone Pro 作为娱乐设备的吸引力。 + +#### 存储空间升级 + +我的原版的 PinePhone 面临的最大挑战之一是存储空间不足。从看电影到玩仿真游戏,我不得不不断地删除文件以获得足够的存储空间。 + +然而,在 PinePhone Pro 上,Pine64 已经解决了这个问题,它提供了 128GB 的闪存,这对任何人来说都足够了。 + +#### 显示屏改进 + +![][4] + +虽然这并不是原版 PinePhone 的痛点,但 PinePhone Pro 的显示屏已经升级,变得更大,采用了大猩猩 4 号玻璃。这是非常值得欢迎的,这款手机现在应该可以提供明显改善的防刮伤性能和更多可用的屏幕空间。 + +虽然 AMOLED 面板会很好,但这在一定程度上会提高价格,可能会降低设备的吸引力。总的来说,我对这次升级很满意,我相信许多用户也是这样。 + +#### 相机升级 + +至少对我来说,原版的 PinePhone 的摄像头是一个相当大的痛点。主摄像头只有 500 万像素,还有一个小小的 200 万像素的前置摄像头,这两个摄像头都不能拍出非常高质量的图像。 + +原版的 PinePhone 的主摄像头已被移到 PinePhone Pro 的前面。它与一个 1300 万像素的索尼摄像头传感器相配,能够录制 4K 视频和提供更高的图像质量。 + +用户终于可以用他们的 Linux 智能手机来拍摄照片,在社交媒体平台上分享了。 + +### 你可以升级你的原版 PinePhone 吗? + +这是我看到该公告时问的第一个问题。不幸的是,将你的 PinePhone 升级到 PinePhone Pro 主板是不可行的。我认为 Pine64 解释得很好: + +> 虽然 PinePhone Pro 的主板尺寸适合 PinePhone,但机框、IPS 显示面板、摄像头、子板和散热系统都不同。例如,PinePhone Pro 的摄像头就不适合 PinePhone 的机框,而且与 PinePhone Pro 的主板在电气上不兼容。散热是另一个重要的考虑因素,因为在原来的 PinePhone 的机框中,较高的热量输出可能不能简单地忽略,这需要克服解决。 + +虽然 Pine64 不建议升级你原来的 PinePhone 的主板,但我认为尝试一下还是很有意思的。虽然令人失望,但也应该注意到,Pine64 并不打算停止原来的 PinePhone 开发,因为它对于想要一个便宜的 Linux 手机作为基本用途的人来说是完美的。 + +### 总结 + +总的来说,我非常兴奋地看到又一个设备进入 Linux 手机市场,尤其是像 PinePhone Pro 这样将得到良好支持(希望是这样)的设备。尽管其价格是 399 美元,但我认为很多人都会蜂拥而至购买这款手机。 + +如果你认为你可能是这些人中的一员,但你得等待几个月后的正式发布。 + +然而,想要获得早期设备的开发者现在可以点击下面的按钮来预购 PinePhone Pro。 + +- [预购PinePhone Pro][6] + +关于 PinePhone Pro 的可用性和规格的更多细节,你应该去他们的 [官方网站][5] 看看。 + +你要买 PinePhone Pro 吗?请在下面的评论中告诉我! + +-------------------------------------------------------------------------------- + +via: https://news.itsfoss.com/pinephone-pro-introduced/ + +作者:[Jacob Crume][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://news.itsfoss.com/author/jacob/ +[b]: https://github.com/lujun9972 +[1]: https://i2.wp.com/news.itsfoss.com/wp-content/uploads/2021/10/pinephone-pro.png?w=1024&ssl=1 +[2]: https://i0.wp.com/news.itsfoss.com/wp-content/uploads/2021/10/pinephoneProMainBoard.jpg?w=1024&ssl=1 +[3]: https://i0.wp.com/i.ytimg.com/vi/pCxDcMdr_fo/hqdefault.jpg?w=780&ssl=1 +[4]: https://i0.wp.com/news.itsfoss.com/wp-content/uploads/2021/10/PinePhonePro.png?w=465&ssl=1 +[5]: https://www.pine64.org/pinephonepro/ +[6]: https://preorder.pine64.org/ diff --git a/published/202110/20211019 Dash to Dock is Finally Available for GNOME 40.md b/published/202110/20211019 Dash to Dock is Finally Available for GNOME 40.md new file mode 100644 index 0000000000..a4a68bb887 --- /dev/null +++ b/published/202110/20211019 Dash to Dock is Finally Available for GNOME 40.md @@ -0,0 +1,69 @@ +[#]: subject: "Dash to Dock is Finally Available for GNOME 40" +[#]: via: "https://news.itsfoss.com/dash-to-dock-gnome-40/" +[#]: author: "Ankush Das https://news.itsfoss.com/author/ankush/" +[#]: collector: "lujun9972" +[#]: translator: "wxy" +[#]: reviewer: "wxy" +[#]: publisher: "wxy" +[#]: url: "https://linux.cn/article-13905-1.html" + +Dash to Dock 终于可以在 GNOME 40 上使用了 +====== + +> Dash to Dock v70 增加了对 GNOME 40 的支持,并放弃了对较旧版本的 GNOME Shell 的支持。但是,你可以继续使用旧版本。 + +![](https://i2.wp.com/news.itsfoss.com/wp-content/uploads/2021/10/ubuntu-dock.png?w=1200&ssl=1) + +Dash to Dock 是多年来最 [有用的 GNOME 扩展][1] 之一。随着 [GNOME 40][2] 的引入,很多人都没能让这个扩展在它上面工作起来。 + +当然,作为一个流行的扩展,对 GNOME 40 的支持预计很快就会被加入。终于,它来了! + +如果你不知道,GNOME 40 包括一个水平工作区视图,这影响了一些人的工作流程,但 Ubuntu 即使在 GNOME 40 中也没有移动 Dock 的打算。 + +所以,你仍然可以使用 Dash to Dock 来从概览区得到一个水平的 Dock。 + +### Dash to Dock v70 放弃了对旧的 GNOME Shell 的支持 + +![][3] + +Dash to Dock v70,对 GNOME 40 和特定的 3.34 版的 GNOME Shell 提供了支持。 + +然而,为了支持 GNOME 40 而对扩展所做的技术修改也意味着新版本的扩展不能再与旧版本的 GNOME Shell 一起工作。 + +如果你没有运行 GNOME 40,你仍然可以使用旧的 v69,它应该可以很好地工作。而且,除了增加了对 GNOME 40 的支持,在功能上也没有什么不同。 + +该扩展的未来发展可能很有趣,他们是否会考虑为不同的 GNOME Shell 版本而增加不同的扩展软件包,并提供新的功能?让我们拭目以待。 + +### 安装 Dash to Dock 的方法 + +![][4] + +你可以从 [GNOME 扩展网站][5] 中通过简单的切换按钮来安装这个扩展。如果你是新手,我建议通过我们的 [GNOME 扩展安装指南][6] 来开始。 + +- [Dash to Dock GNOME 扩展][5] + +值得注意的是,你需要使用一个兼容的网页浏览器来安装这个扩展。虽然它应该可以在大多数浏览器上使用([基于 Chromium 的浏览器][7] 应该可以),但正如 [OMG! Ubuntu][8] 最初报道的那样,Ubuntu 21.10 中 Snap 打包的 Firefox 浏览器可能无法使用。 + +你试过这个扩展了吗?欢迎在下面的评论中告诉我你的想法。 + +-------------------------------------------------------------------------------- + +via: https://news.itsfoss.com/dash-to-dock-gnome-40/ + +作者:[Ankush Das][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://news.itsfoss.com/author/ankush/ +[b]: https://github.com/lujun9972 +[1]: https://itsfoss.com/best-gnome-extensions/ +[2]: https://news.itsfoss.com/gnome-40-release/ +[3]: https://i2.wp.com/news.itsfoss.com/wp-content/uploads/2021/10/dash-to-dock.jpeg?w=1366&ssl=1 +[4]: https://i2.wp.com/news.itsfoss.com/wp-content/uploads/2021/10/gnome-dash-dock-extension.png?w=1259&ssl=1 +[5]: https://extensions.gnome.org/extension/307/dash-to-dock/ +[6]: https://itsfoss.com/gnome-shell-extensions/ +[7]: https://news.itsfoss.com/chrome-like-browsers-2021/ +[8]: https://www.omgubuntu.co.uk/2021/10/dash-to-dock-official-gnome-40-support? diff --git a/published/202110/20211019 Linux Tablets- What are Your Options.md b/published/202110/20211019 Linux Tablets- What are Your Options.md new file mode 100644 index 0000000000..1c4f39b903 --- /dev/null +++ b/published/202110/20211019 Linux Tablets- What are Your Options.md @@ -0,0 +1,114 @@ +[#]: subject: "Linux Tablets: What are Your Options?" +[#]: via: "https://itsfoss.com/linux-tablets/" +[#]: author: "Abhishek Prakash https://itsfoss.com/author/abhishek/" +[#]: collector: "lujun9972" +[#]: translator: "wxy" +[#]: reviewer: "wxy" +[#]: publisher: "wxy" +[#]: url: "https://linux.cn/article-13929-1.html" + +有哪些 Linux 平板电脑可供选择 +====== + +![](https://img.linux.net.cn/data/attachment/album/202110/28/180114mism33m44sibmsc9.jpg) + +有很多 [基于 Linux 的笔记本电脑][1],也有 [预装了 Linux 的迷你 PC][2],而市场上还有一些 [基于 Linux 的智能手机][3]。 + +那平板电脑呢?有没有一些不错的基于 Linux 的平板电脑?这可能不能用一句话说清楚。 + +许多仅使用 Linux 的系统制造商专注于制造台式电脑。这主要是由于触摸设备上的 Linux 体验与安卓和 iOS 提供的体验相距甚远。 + +但这是否意味着你不能在平板电脑上使用 Linux?并非如此。对于早期尝试用户和 DIY 爱好者来说,还有一些选择的。让我们来看看在这些 Linux 平板电脑中,你有哪些选择。 + +### Ubuntu Touch + +![BQ 平板电脑上的 Ubuntu Touch 操作系统][4] + +好吧!这不是一个平板电脑,而是一个操作系统。但它确实让你可以在一些旧的安卓平板电脑上安装一个适合触摸操作的 Ubuntu 版本。 + +注意“一些”这个词。Ubuntu Touch 官方 [支持][5] Nexus 7、联想 M10、Xperia Z4 和 BQ Aquaris 平板。你甚至可以尝试在你的其他平板电脑上安装 Ubuntu Touch。它可能无法 100% 工作,但仍然非常有用。 + +[Ubuntu Touch][8] 是 Ubuntu 团队的一个项目,但是他们 [在 2017 年中止了它][6]。[UBports][7] 承担了继续这个项目的责任,他们在有限的资源下做的很棒。 + +总而言之,如果你喜欢各种实验,想让你的旧安卓平板电脑获得新生,Ubuntu Touch 可能是你的周末项目。 + +### PineTab + +![PineTab][9] + +Pine64 始于其单板计算机 Pine A64,以作为 [树莓派的替代品][10]。随着时间的推移,它推出了几个 Pine 品牌的产品。这份名单里包括低调的 [PineTime 智能手表][11]、PineBook 笔记本电脑、PinePhone 智能手机和 PineTab 平板电脑。 + +这些 Pine 设备通常价格低廉,并允许用户对这些小设备进行完全控制。这种可魔改的特性帮助它聚集了一大批开源 DIY 爱好者的粉丝。 + +[PineTab][12] 基本上使用了与带有触摸屏和键盘的 Pine64 单板计算机相同的组件。它不是看起来最漂亮的平板电脑,也不打算成为这样的。 + +它的规格很一般,有一个高清 IPS 电容式触摸屏、全志 A64 芯片组、四核 CPU 和 2GB 内存。 + +它无法与 iPad 或 Galaxy Tab 竞争,但它允许你安装你选择的发行版,并按你的要求进行配置。 + +请记住,Pine 的库存有限,所以如果你能看到这个设备可以购买,那你很幸运。 + +### PineNote + +![PineNote][13] + +另一个 Pine 设备,与你在上一节看到的 PineTab 略有不同。 + +PineTab 是一款用于浏览互联网、使用应用程序和玩游戏的 Linux 平板电脑,而 [PineNote][14] 是用来做笔记和阅读书籍和文件的。 + +它有一个电子墨水显示屏,你可能在 Kindle 等电子书阅读器上见过。除了电子书阅读器之外,PineNote 还可以你用 Wacom 笔做笔记。 + +PineNote 拥有四核 Rockchip、多点触控电子墨水面板、4GB 内存和 128GB eMMC 存储。它也是为数不多的价格高于通常的 399 美元的平板点之一。 + +请记住,PineNote 正处于早期开发阶段,只接受开发者的订单。 + +### RasPad + +![RasPad][18] + +[RasPad][19] 是一个用于树莓派设备的套件,可以把它变成一个基于触摸功能的设备。与普通的平板不同,这不是一个扁平的设备,而是有一个楔形的身体。这使得它更容易在办公桌上使用。 + +RasPad 是专门为树莓派设备创建的,你可以轻松使用它的大部分端口。它有一个专门的 RasPad 操作系统,但你可以自由使用常规的树莓派操作系统或 Ubuntu 或任何其他适合树莓派的操作系统。在选择操作系统时请考虑触控友好性。 + +请记住,树莓派设备不包括在套件中。你必须要单独购买。 + +### 你的选择是什么? + +我知道我们离一个优秀的 Linux 平板电脑还很远,但它们至少可以和市场上的安卓平板电脑竞争。至少我们有一些可用的选择,这也是一线希望。 + +你是否已经拥有以上列出的设备之一了?你的体验如何? + +如果你只能选择其中之一,那么你选择哪一款 Linux 平板电脑? + +-------------------------------------------------------------------------------- + +via: https://itsfoss.com/linux-tablets/ + +作者:[Abhishek Prakash][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://itsfoss.com/author/abhishek/ +[b]: https://github.com/lujun9972 +[1]: https://linux.cn/article-13672-1.html +[2]: https://itsfoss.com/linux-based-mini-pc/ +[3]: https://linux.cn/article-13711-1.html +[4]: https://i1.wp.com/itsfoss.com/wp-content/uploads/2021/10/ubuntu-touch.jpg?resize=755%2C537&ssl=1 +[5]: https://devices.ubuntu-touch.io/ +[6]: https://itsfoss.com/ubuntu-unity-shutdown/ +[7]: https://ubports.com/ +[8]: https://ubuntu-touch.io/ +[9]: https://i1.wp.com/itsfoss.com/wp-content/uploads/2021/10/PineTab.jpg?resize=800%2C742&ssl=1 +[10]: https://itsfoss.com/raspberry-pi-alternatives/ +[11]: https://itsfoss.com/pinetime-linux-smartwatch/ +[12]: https://pine64.com/product/pinetab-10-1-linux-tablet-with-detached-backlit-keyboard/?v=0446c16e2e66 +[13]: https://i2.wp.com/itsfoss.com/wp-content/uploads/2021/10/PineNote-tab.jpg?resize=800%2C615&ssl=1 +[14]: https://www.pine64.org/pinenote/ +[15]: https://i1.wp.com/itsfoss.com/wp-content/uploads/2021/09/jingpad-keyboard-angle.webp?resize=800%2C600&ssl=1 +[16]: https://itsfoss.com/jingpad-a1-review/ +[17]: https://en.jingos.com/jingpad-a1/ +[18]: https://i0.wp.com/itsfoss.com/wp-content/uploads/2021/10/raspad.webp?resize=800%2C614&ssl=1 +[19]: https://raspad.com/products/raspadv3 diff --git a/published/202110/20211019 Why Mark Text is my favorite markdown editor.md b/published/202110/20211019 Why Mark Text is my favorite markdown editor.md new file mode 100644 index 0000000000..847c4ceb2c --- /dev/null +++ b/published/202110/20211019 Why Mark Text is my favorite markdown editor.md @@ -0,0 +1,92 @@ +[#]: subject: "Why Mark Text is my favorite markdown editor" +[#]: via: "https://opensource.com/article/21/10/mark-text-markdown-editor" +[#]: author: "Don Watkins https://opensource.com/users/don-watkins" +[#]: collector: "lujun9972" +[#]: translator: "wxy" +[#]: reviewer: "wxy" +[#]: publisher: "wxy" +[#]: url: "https://linux.cn/article-13926-1.html" + +Mark Text:我最喜欢的 Markdown 编辑器 +====== + +> Mark Text 拥有的工具使得撰写 Markdown 变得容易,同时又提供了一个不会打扰我的简单的界面。 + +![](https://img.linux.net.cn/data/attachment/album/202110/27/141244m9os557ss7au6oas.jpg) + +几年前,当我开始使用 Jupyter 笔记本时,我接触到了 Markdown 格式。许多作者都知道 Markdown,但这是我不熟悉的一种技能。 + +Markdown 是一种标准的文本写作方式,在这种方式中,你可以用精简的符号来标记你想要的文本样式。例如,你不用点击一个按钮来使一个词变粗体,而是用两个星号(`**word**`)包围这个词。这有两种效果: + + * 当作为纯文本查看时,视觉上显示出强调的文本 + * 如果有一个好的文本转换器或渲染器(如 Pandoc 或一个好的 Markdown 文本编辑器),就会显示为加粗。 + +Markdown 最大的优点之一是它的大部分符号都是直观的,并且来自我们大多数人已有的习惯。它使得用星号强调单词,用字符标记标题以区分它们等等变得很自然。 + +每个人都对它评价很高,但我不确定为什么我需要学习和使用 Markdown。然而,我是一个好奇的人,我开始探索 Markdown,以及它如何在我的写作中发挥作用。 + +### 学习 Markdown + +我很喜欢在学习时使用 [Markdown 速查表][2]。我发现 Markdown 是一个很好的工具,可以写任何内容,而且我很喜欢甚至不需要一个专门的 Markdown 编辑器这一点。任何文本编辑器都可以写 Markdown,因为 Markdown 使用标准文本来表示样式。我开始使用简单的编辑器,如 Vim 或 gedit(或任何其他编辑器),并查阅这个速查表以记住简单的格式化规则。 + +今年我一直在写日记,作为组织我的想法和学习更多关于 Markdown 的方法。我最近尝试了 [Ghostwriter][3] 文本编辑器,这是一个优秀的编辑器,有一些额外的 Markdown 特定功能。Markdown 现在已经变得非常流行了,许多编辑器都加入了语法高亮、提示和其他使 Markdown 编写变得容易的功能,或者将其作为重点。它们不是必须的功能,但当你拥有它们时,还是很好的。  + +### 尝试 Mark Text + +在阅读一个博客时,我发现了 [Mark Text][4]。Mark Text 使写 Markdown 变得很容易,同时提供了一个简单的界面,而且又不影响我。Mark Text 有六个主题,三个浅色和三个深色主题。深色主题对我来说更容易使用。它的 [用户文档][5] 非常好,而且也提供了 Markdown 的 [语法帮助][6]。  + +### Markdown 的实时预览 + +Mark Text 以简洁的界面提供了实时预览功能。它支持 [Commonmark][7] 规范、Github 风格的 Markdown 规范,以及 Pandoc Markdown。据其网站说,Mark Text 还支持 KaTex、front matter 和 emoji 等 Markdown 扩展。它还可以输出 HTML 和 PDF 文件。  + +Mark Text 有各种编辑模式,如打字模式、源代码模式和专注模式。添加图片是一件很容易的事,因为你可以简单地从剪贴板上复制和粘贴它们。 + +在 Mark Text 窗口的左上方有一个弹出窗口,显示迄今为止输入的字符和段落数量。作为一个作家,这真的很有帮助。 + +从 Mark Text 窗口左上方的菜单或使用 `Ctrl+S` 保存文件很容易。事实上,Mark Text 的菜单对任何习惯于基本文本编辑器或文字处理器的人来说都是友好和熟悉的。 + +![Mark Text 文件菜单][8] + +我喜欢 Mark Text 用简单的快捷键支持各种格式,包括表格块、图表、行内格式、数学公式块和其他代码块。 + +你可以从以下链接中为你的操作系统下载 Mark Text: + + * [Linux][10] + * [macOS][11] + * [Windows][12] + +Mark Text 以 [MIT][13] 许可证开源。你可以随时 [下载][14] 最新的版本。 + +另外,你可以用 `brew install --cask mark-text` 在 macOS 上安装 Mark Text,在 Windows 上用 [Chocolatey][15] 输入 `choco install marktext` 来安装它。 + +Mark Text 一直在寻找赞助商和开发者。该项目有一个给贡献者的 [指南][16]。此外,你可以在 Patreon 和 Open Collective 上支持该项目。 + +-------------------------------------------------------------------------------- + +via: https://opensource.com/article/21/10/mark-text-markdown-editor + +作者:[Don Watkins][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/don-watkins +[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://opensource.com/downloads/cheat-sheet-markdown +[3]: https://wereturtle.github.io/ghostwriter/ +[4]: https://marktext.app/ +[5]: https://github.com/marktext/marktext/blob/master/docs/README.md +[6]: https://github.com/marktext/marktext/blob/master/docs/MARKDOWN_SYNTAX.md +[7]: https://commonmark.org/ +[8]: https://opensource.com/sites/default/files/uploads/mark-test-file-menu.png (Mark Text file menu) +[9]: https://creativecommons.org/licenses/by-sa/4.0/ +[10]: https://github.com/marktext/marktext/releases/latest/download/marktext-x86_64.AppImage +[11]: https://github.com/marktext/marktext/releases/latest/download/marktext.dmg +[12]: https://github.com/marktext/marktext/releases/latest/download/marktext-setup.exe +[13]: https://github.com/marktext/marktext/blob/develop/LICENSE +[14]: https://github.com/marktext/marktext/releases +[15]: https://chocolatey.org/ +[16]: https://github.com/marktext/marktext/blob/develop/CONTRIBUTING.md diff --git a/published/202110/20211020 GitUI- A Blazing Fast Terminal Client for Git Written in Rust.md b/published/202110/20211020 GitUI- A Blazing Fast Terminal Client for Git Written in Rust.md new file mode 100644 index 0000000000..51e442a5d6 --- /dev/null +++ b/published/202110/20211020 GitUI- A Blazing Fast Terminal Client for Git Written in Rust.md @@ -0,0 +1,102 @@ +[#]: subject: "GitUI: A Blazing Fast Terminal Client for Git Written in Rust" +[#]: via: "https://itsfoss.com/gitui/" +[#]: author: "Marco Carmona https://itsfoss.com/author/marco/" +[#]: collector: "lujun9972" +[#]: translator: "geekpi" +[#]: reviewer: "wxy" +[#]: publisher: "wxy" +[#]: url: "https://linux.cn/article-13922-1.html" + +GitUI: 用 Rust 编写的 Git 的快速命令行客户端 +====== + +![](https://img.linux.net.cn/data/attachment/album/202110/26/111605achvngqr6ix6vv0p.jpg) + +[基本的 Git 命令][1] 对于通常的克隆、添加、提交推送已经足够好了。 + +但如果你在一个有多个贡献者的大型项目上工作,你可能需要将事情可视化。GUI 工具可以让你更好地了解 `diff`、`stash` 和 `blame` 的情况。 + +但是,如果你常用终端,又想要 Git 的舒适性,我为你准备了一个好工具。 + +它叫 GitUI,它提供了类似于 Git GUI 的用户体验和舒适度,但就在你的终端中。它是可移植的、快速的、自由而开源的。 + +### GitUI:一个基于终端的 Git 工具 + +[GitUI][2] 并不是第一个用于 Linux 终端的 Git 客户端。那么,是什么让 GitUI 与其他类似项目如 [lazygit][3] 或 [tig][4] 不同? + +GitUI 的开发者在项目的 README 文件中分享了一些基准数据。 + +名称 | 时间 |内存(GB)| 二进制(MB)| 冻结 | 崩溃 +---|---|---|---|---|--- +gitui | 24 s | 0.17 | 1.4 | 否 | 否 +lazygit | 57 s | 2.6 | 16 | 是 | 有时 +tig | 4 m 20 s | 1.3 | 0.6 | 有时 | 否 + +*GitUI、LazyGit 和 Tig 之间的比较。* + +这种优化大部分来自于 Rust 语言的使用。 + +**注意:该程序处于早期开发阶段,还没有为生产做好准备。** + +### 在 Linux 上安装 GitUI + +不用说,你应该已经 [在你的系统上安装了 Git][5]。 + +要使用 GitUI,首先需要 [为你的 Linux 发行版安装 Rust 支持][6]。 + +在终端中,使用以下命令: + +``` +curl --proto '=https' --tlsv1.2 -sSf https://sh.rustup.rs | sh +``` + +![Installing Rust on Linux][7] + +当你被要求选择时,请选择选项 1。当脚本完成安装后,用这个命令正确设置配置: + +``` +source $HOME/.cargo/env +``` + +现在你已经安装了 Rust 和它的包管理器 Cargo,使用 Cargo 命令来安装 GitUI: + +``` +cargo install gitui +``` + +然后你就可以使用 GitUI了,只需在终端输入 `gitui` 就可以运行了。我做了一些示例文件来测试 Git 和 GitUI。 + +![Starting gitui on terminal][8] + +值得一提的是,这个界面有一个快速而直观的纯键盘控制。一切都很简单,只需输入正确的字母即可将文件暂存、提交、分支或推送到 git 仓库中。 + +真正让我兴奋的是,你不仅可以做之前的四个动作,还可以**编辑**每个文件,**拉取**它,**追溯** 它,在其中**导航**等等,这一切都无需退出界面。 很棒,不是吗? + +![More functions inside the interface][9] + +祝贺你! 现在你知道了如何安装 GitUI 以及它在你的终端中的样子。 + +如果你喜欢这个项目,请在 [GitHub][2] 上点赞它的仓库。如果你使用其他工具来管理 Git,请在评论区提出你的建议。 + +-------------------------------------------------------------------------------- + +via: https://itsfoss.com/gitui/ + +作者:[Marco Carmona][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/marco/ +[b]: https://github.com/lujun9972 +[1]: https://itsfoss.com/basic-git-commands-cheat-sheet/ +[2]: https://github.com/Extrawurst/gitui +[3]: https://github.com/jesseduffield/lazygit +[4]: https://jonas.github.io/tig/ +[5]: https://itsfoss.com/install-git-ubuntu/ +[6]: https://itsfoss.com/install-rust-cargo-ubuntu-linux/ +[7]: https://i0.wp.com/itsfoss.com/wp-content/uploads/2021/10/Installing-Rust-step-1.png?resize=800%2C471&ssl=1 +[8]: https://i0.wp.com/itsfoss.com/wp-content/uploads/2021/10/Starting-GitUI-on-terminal.png?resize=800%2C471&ssl=1 +[9]: https://i0.wp.com/itsfoss.com/wp-content/uploads/2021/10/More-functions-inside-the-interface.png?resize=800%2C471&ssl=1 diff --git a/published/202110/20211020 How to Install Rust and Cargo on Ubuntu and Other Linux Distributions.md b/published/202110/20211020 How to Install Rust and Cargo on Ubuntu and Other Linux Distributions.md new file mode 100644 index 0000000000..a202318931 --- /dev/null +++ b/published/202110/20211020 How to Install Rust and Cargo on Ubuntu and Other Linux Distributions.md @@ -0,0 +1,174 @@ +[#]: subject: "How to Install Rust and Cargo on Ubuntu and Other Linux Distributions" +[#]: via: "https://itsfoss.com/install-rust-cargo-ubuntu-linux/" +[#]: author: "Abhishek Prakash https://itsfoss.com/author/abhishek/" +[#]: collector: "lujun9972" +[#]: translator: "perfiffer" +[#]: reviewer: "wxy" +[#]: publisher: "wxy" +[#]: url: "https://linux.cn/article-13938-1.html" + +如何在 Ubuntu 和其它的 Linux 发行版安装 Rust 和 Cargo +====== + +> 了解在 Linux 上安装 Rust 编程语言及其包管理器 Cargo 的各种方法。 + +![](https://img.linux.net.cn/data/attachment/album/202110/31/150031j9e0xgeg9jpxeip0.jpg) + +自从 Mozilla 贡献了 [Rust][1] 语言之后,它就获得了更加突出和受欢迎的地位。口说无凭。[Rust 将被使用在 Linux 内核中][2],它是继 C 语言之后的第二种编程语言。 + +许多开发人员也开始使用 Rust 语言制作很棒的基于命令行的工具。这些工具通常可以通过 [Cargo 包管理器][3] 获得。 + +这就是为什么在 Linux 中安装 Rust 支持对程序员和最终用户都很重要的原因。 + +官方 Rust 文档建议通过以下这种方式下载并执行安装程序脚本在 Linux 中安装 Rust: + +``` +curl --proto '=https' --tlsv1.2 -sSf https://sh.rustup.rs | sh +``` + +这是可行的。但是,你的发行版可能已经打包了 Rust。使用你的发行版的 [包管理器][4] 也是一种选择。 + +让我向你介绍官方 Rust 方式和包管理器方式的 Rust 安装步骤。 + +### 方法1:使用官方方法在任意的 Linux 上安装 Rust + +这种方法有几个优点: + + * 你可以获取最新的 Rust 和 Cargo 版本 + * Rust 仅仅是为当前的用户安装,并不是所有用户 + * 你并不需要 root 用户或者 `sudo` 权限就可以为自己安装 Rust + +一些人不喜欢从互联网下载并 [运行 shell][5] 脚本,即使它来自官方。但是,由于它不需要 root 访问权限并且脚本来自官方,因此以这种方式安装它应该是安全的。 + +首先,确保你已经安装了 `curl`。如果没安装,使用你的发行版的包管理器安装它。你可以使用 `apt` 命令在 [Ubuntu 和 Debian 上安装 Curl][6]。 + +``` +sudo apt install curl +``` + +接下来,使用这条命令下载脚本并运行它: + +``` +curl --proto '=https' --tlsv1.2 -sSf https://sh.rustup.rs | sh +``` + +![][7] + +它会询问你输入所需的安装类型。选择选项 `1`: + +![][8] + +脚本完成安装后,你需要获取配置文件的来源,以使更改应用于你的 shell。 + +![][9] + +应用文件: + +``` +source $HOME/.cargo/env +``` + +完成后,通过检查已安装的版本来验证 Rust 是否可用: + +``` +rustc --version +``` + +![Verifying Rust installation][10] + +太酷了。如果 Rust 发布了新版本,你可以使用如下命令更新已安装的版本: + +``` +rustup update +``` + +在你看到其它安装方法之前,让我快速展示如何移除以这种方式安装的 Rust。 + +#### 删除以官方方式安装的 Rust + +在终端中,使用如下的命令从系统中移除 Rust: + +``` +rustup self uninstall +``` + +询问时按 `Y`,你将从系统中删除 Rust。 + +![Removing Rust from Linux][11] + +官方方式安装已经完成。让我们看看如何使用 `apt` 命令在 Ubuntu 上安装 Rust。 + +### 方法2:使用 apt 命令在 Ubuntu 上安装 Rust + +为什么要使用包管理器? + + * 它在整个系统范围内安装 Rust,可供系统上的所有用户使用 + * 它与其它系统更新一起集中更新(如果你的发行版添加了新版本的 Rust) + +Ubuntu 中有两个主要的 Rust 包: + + * `rustc`:用于 Rust 编程语言的 Rust 编译器 + * `cargo`:Cargo 是 Rust 的包管理器,它会自动安装 `rustc` + +作为一个普通用户,你将使用 Cargo 来安装基于 Rust 的应用程序。作为程序员,你需要 Cargo 来获取其它 Rust 包或创建自己的包。 + +由于 `cargo` 包含 `rustc`,所以我建议安装它,以便一次性安装所有必需的软件包。 + +``` +sudo apt install cargo +``` + +系统会要求你输入账号密码。 + +![][12] + +当然,你可以自由使用 `apt install rustc`,只安装 Rust。这取决于你的选择。 + +你可以验证是否为你和所有其他用户安装了 Rust(如果你愿意): + +![][13] + +很好。让我也快速展示卸载步骤。 + +#### 使用 apt remove 移除 Rust + +要移除 Rust,你可以先移除 Cargo,然后使用 `autoremove` 命令移除随它安装的依赖项。 + +``` +sudo apt remove cargo +``` + +现在运行 `autoremove`: + +``` +sudo apt autoremove +``` + +就是这样。你现在了解了在 Ubuntu 和其它 Linux 发行版上安装 Rust 的所有基本知识。随时欢迎提出问题和建议。 + +-------------------------------------------------------------------------------- + +via: https://itsfoss.com/install-rust-cargo-ubuntu-linux/ + +作者:[Abhishek Prakash][a] +选题:[lujun9972][b] +译者:[perfiffer](https://github.com/perfiffer) +校对:[wxy](https://github.com/wxy) + +本文由 [LCTT](https://github.com/LCTT/TranslateProject) 原创编译,[Linux中国](https://linux.cn/) 荣誉推出 + +[a]: https://itsfoss.com/author/abhishek/ +[b]: https://github.com/lujun9972 +[1]: https://www.rust-lang.org/ +[2]: https://www.zdnet.com/article/rust-in-the-linux-kernel-why-it-matters-and-whats-happening-next/ +[3]: https://crates.io/ +[4]: https://itsfoss.com/package-manager/ +[5]: https://itsfoss.com/run-shell-script-linux/ +[6]: https://itsfoss.com/install-curl-ubuntu/ +[7]: https://i1.wp.com/itsfoss.com/wp-content/uploads/2021/10/installing-rust-linux-1.png?resize=800%2C448&ssl=1 +[8]: https://i1.wp.com/itsfoss.com/wp-content/uploads/2021/10/installing-rust-linux-2.png?resize=800%2C448&ssl=1 +[9]: https://i2.wp.com/itsfoss.com/wp-content/uploads/2021/10/installing-rust-linux-3.png?resize=800%2C448&ssl=1 +[10]: https://i2.wp.com/itsfoss.com/wp-content/uploads/2021/10/verify-rust-version.png?resize=800%2C236&ssl=1 +[11]: https://i1.wp.com/itsfoss.com/wp-content/uploads/2021/10/remove-rust-linux.png?resize=800%2C378&ssl=1 +[12]: https://i0.wp.com/itsfoss.com/wp-content/uploads/2021/10/install-rust-using-apt-ubuntu.png?resize=759%2C481&ssl=1 +[13]: https://i1.wp.com/itsfoss.com/wp-content/uploads/2021/10/verify-rust-install-ubuntu.png?resize=741%2C329&ssl=1 diff --git a/published/202110/20211021 How to Convert a Webpage to PDF in Linux.md b/published/202110/20211021 How to Convert a Webpage to PDF in Linux.md new file mode 100644 index 0000000000..aa2a32d884 --- /dev/null +++ b/published/202110/20211021 How to Convert a Webpage to PDF in Linux.md @@ -0,0 +1,133 @@ +[#]: subject: "How to Convert a Webpage to PDF in Linux" +[#]: via: "https://itsfoss.com/convert-webpage-pdf-linux/" +[#]: author: "Ankush Das https://itsfoss.com/author/ankush/" +[#]: collector: "lujun9972" +[#]: translator: "geekpi" +[#]: reviewer: "wxy" +[#]: publisher: "wxy" +[#]: url: "https://linux.cn/article-13928-1.html" + +如何在 Linux 下将网页转换为 PDF 文件 +====== + +![](https://img.linux.net.cn/data/attachment/album/202110/28/111738tncncbml6jwcz6s8.jpg) + +当你将某些资源存档或用于教育目的时,将网页保存为 PDF 是很方便的。 + +但是,你如何在 Linux 中把一个网页转换成 PDF? + +你可以选择使用每个 Linux 发行版上的网页浏览器(GUI),或者使用终端将网页变成 PDF 文件。 + +在这里,我将提到这两种方法来帮助你完成工作。 + +### 方法 1:使用网页浏览器将网页转换为 PDF 文件 + +尽管我在本教程中使用的是 Mozilla Firefox,但你也可以用任何 [可用于 Linux 的最佳浏览器][1] 做同样的事情。 + +![][2] + +1、加载你想转换的网页。 + +2、在浏览器菜单中找到“**打印**”选项,或使用键盘快捷键 `Ctrl + P`。 + +3、默认情况下,它应该让你把它保存为 PDF。你需要点击“保存”,然后选择目的地并保存网页。 + +![Save webpage as PDF in Mozilla Firefox][3] + +这种简单方法的一个主要问题是,它包括页面上的所有元素。这可能包括评论、页脚等。你可以用一个 PDF 编辑器来删除部分内容,但这是一个额外的任务。 + +更好的选择是利用一个浏览器扩展,如 [Print Friendly][4]。它允许你在下载 PDF 之前编辑和删除网页的部分内容。 + +### 方法 2:使用终端将网页转换为 PDF 或图片 + +你可能已经知道,你可以 [在 Linux 终端浏览互联网][5],甚至 [使用命令行下载文件][6]。这并不奇怪,因为你可以在终端中做更多的事情,包括将网页下载为 PDF。 + +一个灵巧的开源命令行工具 `wkhtmltopdf` 和 `wkhtmltoimage` 可以帮到你,让你把任何 HTML 网页转换成 PDF 或图像文件。 + +它使用 Qt WebKit 渲染引擎来完成这个任务。你可以浏览它的 [GitHub页面][7] 了解更多信息。 + +你应该能够从你的 Linux 发行版的默认仓库中安装它。对于基于 Ubuntu 的发行版,你可以输入以下命令: + +``` +sudo apt install wkhtmltopdf +``` + +无论你想把它转换为 PDF 还是图像文件,它的使用都是非常直接的: + +![][8] + +要将一个网页转换成 PDF,请输入: + +``` +wkhtmltopdf URL/domain filename.pdf +``` + +比如,类似于这样: + +``` +wkhtmltopdf linuxmint.com mint.pdf +``` + +你可以选择使用 `https://linuxmint.com` 这样完整的 URL 或使用域名,如上面的例子所示。 + +默认情况下,生成的文件将保存在主目录下。 + +在转换网页时,你还可以得到一些好玩的选项。 + +例如,你可以**对 PDF 文件应用灰度过滤器**,在同一文件中**制作多个页面副本**,以及在转换过程中**排除**图像。 + +灰度过滤器不一定对每个网页都有效,但你可以用命令试试: + +``` +wkhtmltopdf -g google.com googlepage.pdf +``` + +要在同一个 PDF 文件中复制多个页面,命令是: + +``` +wkhtmltopdf --copies 2 linuxmint.com mint.pdf +``` + +而且,如果你想排除网页中的图像,只需输入: + +``` +wkhtmltopdf --no-images linuxmint.com mint.pdf +``` + +此外,如果你想把一个网页转换为图像,命令是这样的: + +``` +wkhtmltoimage linuxmint.com mint.png +``` + +注意,与使用浏览器的 GUI 方法不同,通过终端使用这些工具有其局限性。它似乎不能成功转换利用任何 `