如何从 Linux 终端发送桌面通知与提醒

Summary: 这篇教程演示如何使用脚本命令来发送自己的桌面通知与提醒。

这篇教程演示如何使用脚本命令来发送自己的桌面通知与提醒。

# 如何从 Linux 终端发送桌面通知与提醒

>
> 这篇教程演示如何使用脚本命令来发送自己的桌面通知与提醒。
>
>
>

有时候，来自脚本的视觉回馈是很有用的。例如，当一个脚本或计划任务完成时，一个长期运行的构建任务失败时，或者当脚本执行中出现了紧急问题时。桌面应用程序可以通过弹出通知来做到这一点，但脚本也可以做到这一点！你可以使用脚本命令来给自己发送桌面通知与提醒。

下面的代码是在 Linux 上编写和测试的。它也可以在 macOS 上运行，只需花点功夫。请参见最后一节 [提示与技巧](https://opensource.com/article/22/1/linux-desktop-notifications/#script-notifications-on-macOS)。

### 从 Linux 终端发送通知

要从 Linux 终端发送通知，请使用 [notify-send](https://manpages.ubuntu.com/manpages/xenial/man1/notify-send.1.html) 命令。运行 `which notify-send` 命令来查看它是否在于你的系统中。如果没有，请使用包管理器来安装它。

在 Fedora 上，输入：

```
$ sudo dnf install notify-send

```

在基于 Debian 的发行版上，输入：

```
$ sudo apt install notify-send

```

几个简单的通知示例：

```
$ notify-send "Dinner ready!"
$ notify-send "Tip of the Day" "How about a nap?"

```

你可以用紧急程度、自定义图标等选项来自定义通知。过 `man notify-send` 了解更多。你也可以在通知正文中使用一小组 HTML 标记，以使消息有一个棒的视觉感受。最重要的是，URL 被呈现为可点击的。例如：

```
$ notify-send -u critical \
  "Build failed!" \
  "There were <b>123</b> errors. Click here to see the results: http://buildserver/latest"

```

发送的通知会被桌面环境接收，并像其他通知一样显示。它们将具有相同的外观、交互和行为。

### 将 notify-send 与 at 结合使用

计划任务通常被用来定期安排命令。`at` 命令安排在一个指定的时间执行一条命令。如果你像这样运行它，它会以交互模式启动，你可以在其中输入要在指定时间执行的命令：

```
$ at 12:00

```

这对脚本来说并不有用。幸运的是 `at` 接受来自标准输入的参数，所以我们可以这样使用它：

```
$ echo "npm run build" | at now + 1 minute
$ echo "backup-db" | at 13:00

```

有许多指定时间的方法。 从绝对时间，如 `10:00`，到相对时间，如 `now + 2 hours` ，再特殊时间，如`noon` 或 `midnight`。我们可以把它和 `notify-send` 结合起来，在未来的某个时间向自己发送提醒。例如：

```
$ echo "notify-send 'Stop it and go home now?' 'Enough work for today.' -u critical" | at now

```

### 提醒的命令

现在，建立一个自定义的 Bash 命令来给自己发送提醒信息。像这样简单且人性化的命令：

```
$ remind "I'm still here" now
$ remind "Time to wake up!" in 5 minutes
$ remind "Dinner" in 1 hour
$ remind "Take a break" at noon
$ remind "It's Friday pints time!" at 17:00

```

这比 Alexa 更好！该怎样做？

请看下面的代码。它定义了一个名为 `remind` 的函数，它支持上述语法。实际工作是在最后两行完成的。其余的部分负责显示帮助信息、参数校验等，这与任何大型应用程序中有用的代码与必要的白噪声的比例大致相同。

把代码保存在某个地方，例如，在 `~/bin/remind` 文件中，并在你的 `.bashrc` 配置文件写入该函数，以便在你登录时加载它：

```
$ source ~/bin/remind

```

重新打开终端，然后输入 `remind` 来查看语法。尽情享受吧！

```
#!/usr/bin/env bash
function remind () {
  local COUNT="$#"
  local COMMAND="$1"
  local MESSAGE="$1"
  local OP="$2"
  shift 2
  local WHEN="$@"
  # Display help if no parameters or help command
  if [[ $COUNT -eq 0 || "$COMMAND" == "help" || "$COMMAND" == "--help" || "$COMMAND" == "-h" ]]; then
    echo "COMMAND"
    echo "    remind <message> <time>"
    echo "    remind <command>"
    echo
    echo "DESCRIPTION"
    echo "    Displays notification at specified time"
    echo
    echo "EXAMPLES"
    echo '    remind "Hi there" now'
    echo '    remind "Time to wake up" in 5 minutes'
    echo '    remind "Dinner" in 1 hour'
    echo '    remind "Take a break" at noon'
    echo '    remind "Are you ready?" at 13:00'
    echo '    remind list'
    echo '    remind clear'
    echo '    remind help'
    echo
    return
  fi
  # Check presence of AT command
  if ! which at >/dev/null; then
    echo "remind: AT utility is required but not installed on your system. Install it with your package manager of choice, for example 'sudo apt install at'."
    return
  fi
  # Run commands: list, clear
  if [[ $COUNT -eq 1 ]]; then
    if [[ "$COMMAND" == "list" ]]; then
      at -l
    elif [[ "$COMMAND" == "clear" ]]; then
      at -r $(atq | cut -f1)
    else
      echo "remind: unknown command $COMMAND. Type 'remind' without any parameters to see syntax."
    fi
    return
  fi
  # Determine time of notification
  if [[ "$OP" == "in" ]]; then
    local TIME="now + $WHEN"
  elif [[ "$OP" == "at" ]]; then
    local TIME="$WHEN"
  elif [[ "$OP" == "now" ]]; then
    local TIME="now"
  else
    echo "remind: invalid time operator $OP"
    return
  fi
  # Schedule the notification
  echo "notify-send '$MESSAGE' 'Reminder' -u critical" | at $TIME 2>/dev/null
  echo "Notification scheduled at $TIME"
}

```

### 简单的提醒

通过这几个简单的开源命令，你可以将你自己的脚本、应用程序和任务与你的桌面结合起来。试一试吧！

---

（文内图片来自 Tomasz Waraksa, CC BY-SA 4.0）

本文经作者许可改编自 [原文](https://letsdebug.it/post/30-linux-desktop-notifications/)。

---

via: <https://opensource.com/article/22/1/linux-desktop-notifications>

作者：[Tomasz Waraksa](https://opensource.com/users/tomasz) 选题：[lujun9972](https://github.com/lujun9972) 译者：[mcfd](https://github.com/mcfd) 校对：[wxy](https://github.com/wxy)

本文由 [LCTT](https://github.com/LCTT/TranslateProject) 原创编译，[Linux中国](https://linux.cn/) 荣誉推出


massCode：一个自由开源的代码片段管理器

# massCode：一个自由开源的代码片段管理器

>
> massCode 是一个开源的代码片段管理器，使你能够涉足代码，提高生产力，并节省时间。
>
>
>

如果一个工具能让事情变得更快、更有效率，那对许多开发者来说就是救命稻草。

虽然有各种服务和平台试图使编码体验更快，但你仍然有其他几个选择可以考虑。

例如，代码片段管理器。使用代码片段管理器，你的目的是保存你想快速访问的代码片段。它更像是指定快捷方式，在你的程序中添加所需的代码。

这不是一个新的概念，但可用于这项工作的工具可能不完全是开源的。

幸运的是，我偶然发现了一个不错的项目，它为你提供了一个自由开源的片段管理器，即 massCode。

### massCode：跨平台的开源片段管理器

massCode 是一个有用的代码片段管理器，具有一些基本功能。

它支持广泛的编程语言，还包括对 Markdown 的支持。你可以使用文件夹组织你的代码片段，添加标签等。

massCode 可用于 Linux、Windows 或 macOS。让我们来看看一些主要功能。

### massCode 的特点

massCode 包括许多有用的功能。其中一些是：

* 多层次的文件夹结构
* 每个片段都可以存储在片段（标签）中
* 集成的编码编辑器 [Ace](https://github.com/ajaxorg/ace)
* 代码格式化或高亮显示
* 支持带预览的 Markdown
* 能够搜索片段
* 给你的代码段添加描述，以了解它的用途
* 各种深色/浅色主题可用
* 能够从 [SnippetsLab](https://apps.apple.com/us/app/snippetslab/id1006087419?mt=12) 迁移
* 自动保存以帮助你保留你的工作
* 将其与云同步文件夹整合
* 支持 VSCode、Raycast 和 Alfred 的扩展

除了上述所有功能外，你还可以轻松地复制保存代码片段，只需点击一下。

对于自定义，你可以调整字体大小和系列、切换自动换行、高亮显示行、使用单引号或添加尾随命令，这要归功于 [Prettier](https://prettier.io/)。

此外，一份片段可以有多个分片。因此，它使你有机会将其用于各种用例。

如前所述，你也可以通过改变同步文件夹的存储位置将其与你的任何云同步服务整合。

总的来说，它工作得很好，有一些局限性，比如缺乏将嵌套文件夹从 SnippetsLab 迁移到 masCode 的能力。

### 在 Linux 上安装 massCode

massCode 有 [Snap 包](https://itsfoss.com/install-snap-linux/)，但不在 Snap 商店中。你可以直接下载该软件包，并使用以下命令来安装它：

```
sudo snap install --dangerous ~/Downloads/masscode_2.6.1_amd64.snap

```

我们的一份故障排除指南可以帮助你了解 [snap 的 dangerous 选项](https://itsfoss.com/snap-metadata-signature-error/)。

你可以通过其 [官方网站](https://masscode.io/) 或 [GitHub 发布区](https://github.com/massCodeIO/massCode/releases/tag/v2.6.1) 下载 Windows/MacOS 版。

>
> **[massCode](https://masscode.io/)**
>
>
>

你试过 massCode 吗？还有其他可用于 Linux 的代码片段管理器吗？请在下面的评论中告诉我你的想法。

---

via: <https://itsfoss.com/masscode/>

作者：[Ankush Das](https://itsfoss.com/author/ankush/) 选题：[lkxed](https://github.com/lkxed) 译者：[geekpi](https://github.com/geekpi) 校对：[wxy](https://github.com/wxy)

本文由 [LCTT](https://github.com/LCTT/TranslateProject) 原创编译，[Linux中国](https://linux.cn/) 荣誉推出


硬核观察 #697 谷歌披露其内部使用的 Linux 滚动发行版

Summary: • 谷歌披露其内部使用的 Linux 滚动发行版 • 谷歌云宣布采用 ARM 芯片 • 去年几乎整个工业行业都受到过攻击

arm哪里买到芯片

# 硬核观察 #697 谷歌披露其内部使用的 Linux 滚动发行版

### 谷歌披露其内部使用的 Linux 滚动发行版

谷歌早期使用的内部 Linux 发行版是基于 Ubuntu LTS 的 Goobuntu。Ubuntu LTS 需要每隔两年更新一次，这对于需要升级几十万台计算机的谷歌来说并非易事。因此谷歌转向了滚动更新发行版，它没有使用著名的滚动更新发行版，如 Arch Linux，而是基于 Debian 测试分支构建了自己的滚动发行版。它将新发行版称为 gLinux Rodete（是 Rolling Debian Testing 的缩写）。Debian 测试分支是滚动更新的。谷歌引入了名为 Sieve 的工作流系统，使用虚拟化测试套装确保软件包新版本不会破坏核心组件和开发者的工作流程。谷歌于 2018 年底完成迁移，次年关闭了剩余的 Goobuntu。

>
> **[消息来源：谷歌](https://cloud.google.com/blog/topics/developers-practitioners/how-google-got-to-rolling-linux-releases-for-desktops)**
>
>
>

>
> 老王点评：谷歌的这个经验其实可以供其它的大型 IT 企业参考。
>
>
>

### 谷歌云宣布采用 ARM 芯片

谷歌云周三宣布，他们将开始采用基于 ARM 技术的芯片。随着谷歌加入 ARM 阵营，几乎所有大型云服务提供商现在都已经开始提供基于 ARM 的云计算服务。谷歌云的新服务将基于 Ampere 公司的 Altra 芯片，该公司还向微软和甲骨文等企业出售芯片。另外一些云计算提供商，如甲骨文、阿里云则在设计自己的 ARM 架构芯片，并且已经委托工厂进行生产。

>
> **[消息来源：Tech Crunch](https://techcrunch.com/2022/07/13/google-cloud-launches-its-first-arm-based-vms/)**
>
>
>

>
> 老王点评：ARM 和 RISC-V 大行其道，我想英特尔和 AMD 感受到压力了吧。
>
>
>

### 去年几乎整个工业行业都受到过攻击

《2022 年工业安全状况报告》调查了 800 名负责这些工业系统的高级 IT 和安全负责人。报告发现，94% 的受访者在过去 12 个月里，其工业物联网（IIoT）或运营技术（OT）系统经历了某种形式的攻击。关键基础设施是网络犯罪分子的一个有吸引力的目标，但不幸的是，IIoT/OT 安全项目往往被其他安全举措所取代，或者由于成本或复杂性而失败，使组织处于风险之中。

>
> **[消息来源：CSO Online](https://www.csoonline.com/article/3666523/barracuda-report-almost-everyone-faced-an-industrial-attack-in-the-last-year.html)**
>
>
>

>
> 老王点评：其实工业互联网真没体验过互联网那么疯狂的攻击力度。至少互联网企业大多都有网络安全相关人员，工业互联网很少有专门配置的网络安全人员。
>
>
>


为何要使用树莓派为你的业务提供动力

Summary: 为何小小的单板机是智能工作以及小型办公室的未来。

为何小小的单板机是智能工作以及小型办公室的未来。

# 为何要使用树莓派为你的业务提供动力

>
> 为何小小的单板机是智能工作以及小型办公室的未来。
>
>
>

<img src="content_image/album_202207_15_152016pcjh4heez4q0oof6.jpg" alt="" title="A chair in a field.">

随着疫情的大流行，我们的工作方式也正在发生着改变。工作的分散化正在成为所有公司需要面临的一项重要挑战。

### 智能办公室

即使工厂认为智能办公仅仅是通过虚拟私有网络来对员工的笔记本电脑进行远程控制，再稍微增加一点进化也可以让一些基本的办公服务离人们更近一点，这些都能够极大降低数据中心的负载，并且提高人们的工作体验。这个方案还有一个额外的影响就是从信息和通信技术（ICT）上来说消除了许多单点故障。

与其在公司外部有成百上千的工作场地，不如在世界范围内有着成百上千的小型办公室/分支，这就是所谓的“智能办公室”。

这种表述可能会让许多 ICT 专家感到恐慌，因为这种文化使得每个办公室都与一台大机器（即服务器）联系在一起，即使分散计算资源的优势非常明显。

### 一个不同的角度

如果你能用一块 50 美元的小开发板提供一个大服务器的服务会怎么样？如果这个小板子只需要一张 SD 卡和一个普通的 USB 电源支持，那又会怎么样呢？这就是 [树莓派](https://opensource.com/resources/raspberry-pi) 是最灵活的解决方案的原因所在。

树莓派开发板是尺寸非常小的运行 Linux 的计算机。它有一个由树莓派基金会提供和维护的操作系统：<ruby> 树莓派操作系统 <rt>  Raspberry Pi OS </rt></ruby>。它基于 Debian，并与这个最知名的 Linux 发行版共享许多软件包。此外，许多树莓派的开发板能够完美运行最知名的 Ubuntu 服务器，它涵盖了 ARM 处理器支持，提供了对低功耗处理器的支持。

但树莓派开发板对小公司来说也是一个很好的机会，以能够承担得起的代价获得大量的（开源）服务。但这种情况下，你必须考虑数据丢失的风险，因为你把所有的服务运行在一个小的、消费级的硬件上。不过设置正确的备份/恢复程序能够降低这些风险。

### 你能从树莓派开发板上提供什么服务？

大多数服务通常由更昂贵的服务器提供。这里的“大多数”取决于一些限制：

* **ARM 处理器：** 一些软件包只支持 x86/x64 处理器。这是最难克服的挑战之一。但另一方面，ARM 处理器的市场份额不断增长，使得程序员为他们的软件开发了兼容 ARM 处理器的版本。
* **内存容量：** 这是一个仅限于在复杂应用以复杂的方式进行复杂的计算的情况下讨论的问题。很多时候，这只不过是关于重新审查代码、拆分步骤，并保持简单高效的问题。此外，如果一个服务虽然只服务少数几个用户，但需要大量的内存/CPU，这大概也意味着此服务没有正常工作。这可能是你消除浪费资源的旧问题的一个机会。最后，最新的树莓派开发板把内存容量升级到了 8GB，这是一个很大的提升。
* **对服务器没有经验的用户：** 这是另一个问题，你可以在基础镜像所在的树莓派的 micro-SD 卡中存储系统和运行数据。

也就是说，你能够用树莓派做很多有趣的事情。在 [我的博客](https://peppe8o.com) 里，我通过运行各种服务进行了测试 —— 从基本的 LAMP 服务器到复杂的 CRM。从简单到复杂系统，全部都是开源的，例如：

* 代理服务器（也能够添加广告拦截服务）
* 电子邮件服务器
* 打印服务器
* [酒店管理](https://opensource.com/article/20/4/qloapps-raspberry-pi)
* 联系关系管理（CRM）
* [私人社交网络](https://opensource.com/article/20/3/raspberry-pi-open-source-social)
* 私人论坛
* 私有 Git 门户网站
* 网络监控服务器
* [许多其他有用的服务](https://peppe8o.com/category/raspberrypi/)

对树莓派来说，另一个有趣的用法是在你的远程办公室获得提供高级服务的 Wi-Fi 热点，并且可以从它的以太网端口进行控制。

最后，[树莓派也能够运行容器](https://opensource.com/article/20/8/kubernetes-raspberry-pi)，这是一个额外的工具，从这个不可思议的开发板中获得一个可用的服务世界。

---

via: <https://opensource.com/article/22/1/raspberry-pi-business>

作者：[Giuseppe Cassibba](https://opensource.com/users/peppe8o) 选题：[lujun9972](https://github.com/lujun9972) 译者：[void-mori](https://github.com/void-mori) 校对：[wxy](https://github.com/wxy)

本文由 [LCTT](https://github.com/LCTT/TranslateProject) 原创编译，[Linux中国](https://linux.cn/) 荣誉推出


R 语言绘制数据：图表篇

Summary: R 语言有非常多的绘图和数据可视化的包

R 语言有非常多的绘图和数据可视化的包

# R 语言绘制数据：图表篇

R 语言有非常多的绘图和数据可视化的包，比如 `graphics`、`lattice`、`ggplot2` 等。这是 R 语言系列的第 9 篇文章，我们会介绍 R 中用来绘图的各种函数。

本文使用的 R 是 4.1.2 版本，运行环境为 Parabola GNU/Linux-libre (x86-64)。

```
$ R --version

R version 4.1.2 (2021-11-01) -- "Bird Hippie"
Copyright (C) 2021 The R Foundation for Statistical Computing
Platform: x86_64-pc-linux-gnu (64-bit)

```

R 是自由软件，没有任何担保责任。只要遵守 GNU 通用公共许可证的版本 2 或者版本 3，你就可以对它进行（修改和）再分发。详情见 <https://www.gnu.org/licenses/>。

### 折线图

我们以印度全境消费者物价指数（CPI -- 乡村/城市）数据集为研究对象，它可以从 <https://data.gov.in/catalog/all-india-consumer-price-index-ruralurban-0> 下载。选择“截止到 2021 年 11 月” 的版本，用 `read.csv` 函数读取下载好的文件，如下所示：

```
> cpi <- read.csv(file="CPI.csv", sep=",")

> head(cpi)
Sector Year Name Andhra.Pradesh Arunachal.Pradesh Assam Bihar
1 Rural 2011 January 104 NA 104 NA
2 Urban 2011 January 103 NA 103 NA
3 Rural+Urban 2011 January 103 NA 104 NA
4 Rural 2011 February 107 NA 105 NA
5 Urban 2011 February 106 NA 106 NA
6 Rural+Urban 2011 February 105 NA 105 NA
Chattisgarh Delhi Goa Gujarat Haryana Himachal.Pradesh Jharkhand Karnataka
1 105 NA 103 104 104 104 105 104
2 104 NA 103 104 104 103 104 104
3 104 NA 103 104 104 103 105 104
4 107 NA 105 106 106 105 107 106
5 106 NA 105 107 107 105 107 108
6 105 NA 104 105 106 104 106 106
...

```

以 Punjab 州为例，对每年各月份的 CPI 值求和，然后用 `plot` 函数画一张折线图：

```
> punjab <- aggregate(x=cpi$Punjab, by=list(cpi$Year), FUN=sum)

> head(punjab)
Group.1 x
1 2011 3881.76
2 2012 4183.30
3 2013 4368.40
4 2014 4455.50
5 2015 4584.30
6 2016 4715.80

> plot(punjab$Group.1, punjab$x, type="l", main="Punjab Consumer Price Index upto November 2021", xlab="Year", ylab="Consumer Price Index")

```

`plot` 函数可以传入如下参数：

| 参数 | 描述 |
| --- | --- |
| `x` | 向量类型，用于绘制 x 轴的数据 |
| `y` | 向量或列表类型，用于绘制 y 轴的数据 |
| `type` | 设置绘图类型：`p` 画点；`l` 画线；`o` 同时画点和线，且相互重叠；`s` 画阶梯线；`h` 画铅垂线 |
| `xlim` | x 轴范围 |
| `ylim` | y 轴范围 |
| `main` | 标题 |
| `sub` | 副标题 |
| `xlab` | x 轴标题 |
| `ylab` | y 轴标题 |
| `axes` | 逻辑型，是否绘制坐标轴 |

结果如图 1。

### 自相关图

自相关图能在时序分析中展示一个变量是否具有自相关性，可以用 R 中的 `acf` 函数绘制。`acf` 函数可以设置三种自相关类型：`correlation`、`covariance` 或 `partial`。图 2 是 Punjab 州 CPI 值的自相关图，x 表示 CPI。

```
acf(punjab$x,main='x')

```

`acf` 函数可以传入以下参数：

| 参数 | 描述 |
| --- | --- |
| `x` | 一个单变量或多变量的时序对象，或者一个数值向量或数值矩阵 |
| `lag.max` | 最大滞后阶数 |
| `type` | 字符型，设置所计算的自相关类型：`correlation`、`covariance` 或 `partial` |
| `plot` | 逻辑性，若 `TRUE` 则绘制图像，若 `FALSE` 则打印传入数据的描述信息 |
| `i` | 一组要保留的时差滞后 |
| `j` | 一组要保留的名称或数字 |

### 柱状图

R 中画柱状图的函数是 `barplot`。下面的代码用来画 Punjab 州 CPI 的柱状图，如图3：

```
> barplot(punjab$x, main="Punjab Consumer Price Index", sub="Upto November 2021", xlab="Year", ylab="Consumer Price Index", col="navy")

```

`barplot` 函数的使用方法非常灵活，可以传入以下参数：

| 参数 | 描述 |
| --- | --- |
| `height` | 数值向量或数值矩阵，包含用于绘图的数据 |
| `width` | 数值向量，用于设置柱宽 |
| `space` | 柱间距 |
| `beside` | 逻辑型，若 `FALSE` 则绘制堆积柱状图，若 `TRUE` 则绘制并列柱状图 |
| `density` | 数值型，设置阴影线的填充密度（条数/英寸），默认为 `NULL`，即不填充阴影线 |
| `angle` | 数值型，填充线条的角度，默认为 45 |
| `border` | 柱形边缘的颜色 |
| `main` | 标题 |
| `sub` | 副标题 |
| `xlab` | x 轴标题 |
| `ylab` | y 轴标题 |
| `xlim` | x 轴范围 |
| `ylim` | y 轴范围 |
| `axes` | 逻辑型，是否绘制坐标轴 |

用 `help` 命令可以查看 `barplot` 函数的详细信息：

```
> help(barplot)

barplot                package:graphics                R Documentation

Bar Plots

Description:

     Creates a bar plot with vertical or horizontal bars.

Usage:

     barplot(height, ...)

     ## Default S3 method:
     barplot(height, width = 1, space = NULL,
             names.arg = NULL, legend.text = NULL, beside = FALSE,
             horiz = FALSE, density = NULL, angle = 45,
             col = NULL, border = par("fg"),
             main = NULL, sub = NULL, xlab = NULL, ylab = NULL,
             xlim = NULL, ylim = NULL, xpd = TRUE, log = "",
             axes = TRUE, axisnames = TRUE,
             cex.axis = par("cex.axis"), cex.names = par("cex.axis"),
             inside = TRUE, plot = TRUE, axis.lty = 0, offset = 0,
             add = FALSE, ann = !add && par("ann"), args.legend = NULL, ...)

     ## S3 method for class 'formula'
     barplot(formula, data, subset, na.action,
             horiz = FALSE, xlab = NULL, ylab = NULL, ...)

```

### 饼图

绘制饼图时要多加注意，因为饼图不一定能展示出各扇形间的区别。（LCTT 译注：根据统计学家和一些心理学家的调查结果，这种以比例展示数据的统计图形 [实际上是很糟糕的可视化方式](https://bookdown.org/xiangyun/msg/gallery.html#sec:pie)，因此，R 关于饼图的帮助文件中清楚地说明了并不推荐使用饼图，而是使用条形图或点图作为替代。） 用 `subset` 函数获得 Gujarat 州在 2021 年 1 月 Rural、Urban、Rurual+Urban 的 CPI 值：

```
> jan2021 <- subset(cpi, Name=="January" & Year=="2021")

> jan2021$Gujarat
[1] 153.9 151.2 149.1

> names <- c('Rural', 'Urban', 'Rural+Urban')

```

使用 `pie` 函数为 Gujarat 州的 CPI 值生成饼图，如下所示：

```
> pie(jan2021$Gujarat, names, main="Gujarat CPI Rural and Urban Pie Chart")

```

`pie` 函数可以传入以下参数：

| 参数 | 描述 |
| --- | --- |
| `x | 元素大于 0 的数值向量 |
| `label` | 字符向量，用于设置每个扇形的标签 |
| `radius` | 饼图的半径 |
| `clockwise` | 逻辑型，若 `TRUE` 则顺时针绘图，若 `FALSE` 则逆时针绘图 |
| `density` | 数值型，设置阴影线的填充密度（条数/英寸），默认为 `NULL`，即不填充阴影线 |
| `angle` | 数值型，填充线条的角度，默认为 45 |
| `col` | 数值向量，用于设置颜色 |
| `lty` | 每个扇形的线条类型 |
| `main` | 标题 |

### 箱线图

（LCTT 译注：箱线图主要是 [从四分位数的角度出发](https://bookdown.org/xiangyun/msg/gallery.html#sec:boxplot) 描述数据的分布，它通过最大值（Q4）、上四分位数（Q3）、中位数（Q2）、下四分位数（Q1） 和最小值（Q0）五处位置来获取一维数据的分布概况。我们知道，这五处位置之间依次包含了四段数据，每段中数据量均为总数据量的 1/4。通过每一段数据占据的长度，我们可以大致推断出数据的集中或离散趋势。长度越短，说明数据在该区间上越密集，反之则稀疏。）

箱线图能够用“<ruby> 须线 <rt>  whisker </rt></ruby>” 展示一个变量的<ruby> 四分位距 <rt>  Interquartile Range </rt></ruby>（简称 IQR=Q3-Q1）。用上下四分位数分别加/减内四分位距，再乘以一个人为设定的倍数 `range`（见下面的参数列表），得到 `range * c(Q1-IQR, Q3+IQR)`，超过这个范围的数据点就被视作离群点，在图中直接以点的形式表示出来。

`boxplot` 函数可以传入以下参数：

| 参数 | 描述 |
| --- | --- |
| `data` | 数据框或列表，用于参数类型为公式的情况 |
| `x` | 数值向量或者列表，若为列表则对列表中每一个子对象依次作出箱线图 |
| `width` | 设置箱子的宽度 |
| `outline` | 逻辑型，设置是否绘制离群点 |
| `names` | 设置每个箱子的标签 |
| `border` | 设置每个箱子的边缘的颜色 |
| `range` | 延伸倍数，设置箱线图末端（须）延伸到什么位置 |
| `plot` | 逻辑型，设置是否生成图像，若 TRUE 则生成图像，若 FALSE 则打印传入数据的描述信息 |
| `horizontal` | 逻辑型，设置箱线图是否水平放置 |

用 `boxplot` 函数绘制部分州的箱线图：

```
> names <- c ('Andaman and Nicobar', 'Lakshadweep', 'Delhi', 'Goa', 'Gujarat', 'Bihar')
> boxplot(cpi$Andaman.and.Nicobar, cpi$Lakshadweep, cpi$Delhi, cpi$Goa, cpi$Gujarat, cpi$Bihar, names=names)

```

### QQ 图

<ruby> QQ 图 <rt>  Quantile-Quantile plot </rt></ruby>可以用来对比两个数据集，也可以用来检查数据是否服从某种理论分布。`qqnorm` 函数能绘制正态分布 QQ 图，可以检验数据是否服从正态分布，用下面的代码绘制 Punjab 州 CPI 数据的 QQ 图：

```
> qqnorm(punjab$x)

```

`qqline` 函数可以向正态分布 QQ 图上添加理论分布曲线，它可以传入以下参数：

| 参数 | 描述 |
| --- | --- |
| `x` | 第一个数据样本 |
| `y` | 第二个数据样本 |
| `datax` | 逻辑型，设置是否以 x 轴表示理论曲线的值，默认为 `FALSE` |
| `probs` | 长度为 2 的数值向量，代表概率 |
| `xlab` | x 轴标题 |
| `ylab` | y 轴标题 |
| `qtype` | `[1,9]` 内的整数，设置分位计算类型，详情见 `help(quantile)` 的类型小节 |

### 等高图

等高图可以描述三维数据，在 R 中对应的函数是 `contour`，这个函数也可以用来向已有的图表添加等高线。等高图常与其他图表一起使用。我们用 `contour` 对 R 中的 `volcano` 数据集（奥克兰的火山地形信息）绘制等高图，代码如下：

```
> contour(volcano)

```

`contour` 函数的常用参数如下：

| 参数 | 描述 |
| --- | --- |
| `x,y` | z 中数值对应的点在平面上的位置 |
| `z` | 数值向量 |
| `nlevels` | 设置等高线的条数，调整等高线的疏密 |
| `labels` | 等高线上的标记字符串，默认是高度的数值 |
| `xlim` | 设置 x 轴的范围 |
| `ylim` | 设置 y 轴的范围 |
| `zlim` | 设置 z 轴的范围 |
| `axes` | 设置是否绘制坐标轴 |
| `col` | 设置等高线的颜色 |
| `lty` | 设置线条的类型 |
| `lwd` | 设置线条的粗细 |
| `vfont` | 设置标签字体 |

等高线之间的区域可以用颜色填充，每种颜色表示一个高度范围，如下所示：

```
> filled.contour(volcano, asp = 1)
# asp 为图形纵横比，即 y 轴上的 1 单位长度和 x 轴上 1 单位长度的比率

```

填充结果见图 8。

掌握上述内容后，你可以尝试 R 语言 `graphics` 包中的其他函数和图表（LCTT 译注：用 `help(package=graphics)` 可以查看 graphics 包提供的函数列表）。

---

via: <https://www.opensourceforu.com/2022/05/plotting-data-in-r-graphs/>

作者：[Shakthi Kannan](https://www.opensourceforu.com/author/shakthi-kannan/) 选题：[lkxed](https://github.com/lkxed) 译者：[tanloong](https://github.com/tanloong) 校对：[wxy](https://github.com/wxy)

本文由 [LCTT](https://github.com/LCTT/TranslateProject) 原创编译，[Linux中国](https://linux.cn/) 荣誉推出


Summary: • 谷歌正式推出可装在普通电脑的 ChromeOS Flex 操作系统 • 尼康停止单反相机的开发 • 谷歌高管认为 Instagram 和 TikTok 在侵蚀该公司核心产品

# 硬核观察 #698 谷歌正式推出可装在普通电脑的 ChromeOS Flex 操作系统

### 谷歌正式推出可装在普通电脑的 ChromeOS Flex 操作系统

ChromeOS Flex 是一个基于 ChromeOS、兼容大部分硬件的操作系统，谷歌官方表示经过验证的设备已经“超过 400 款”。ChromeOS Flex 可以下载到 USB 设备中，然后在 Mac 或者 Windows 设备上进行安装。它于今年 2 月推出，主要基于谷歌在 2020 年收购的 CloudReady 的技术。它最大的优势就是能够让老旧设备“焕发生机”，尤其是那些原生系统已经无法再获得软件更新的设备。在未经谷歌认证的设备上同样可以安装 ChromeOS Flex，只要这些设备符合官方的最低要求。

>
> **[消息来源：谷歌](https://cloud.google.com/blog/products/chrome-enterprise/chromeos-flex-ready-to-scale-to-pcs-and-macs)**
>
>
>

>
> 老王点评：不知道是不是和 ChromeOS 一样，需要那种不一样的网络？
>
>
>

### 尼康停止单反相机的开发

配备高清摄像头的智能手机正在侵蚀相机市场，尼康表示今后将专注于开发逐渐在市场上成为主流的、引进人工智能和图像处理技术的无反相机。尼康在 1959 年推出首款单反相机 Nikon F，自 2020 年 6 月推出面向专业人士的旗舰机型 D6 后，再未推出过单反相机的新产品。单反相机的优势是可以根据被拍摄物体和摄影环境更换镜头。尼康在单反相机的销量份额上仅次于佳能，排在世界第 2 位。佳能也计划在数年内结束单反相机的旗舰机型的开发。

>
> **[消息来源：日经中文网](https://cn.nikkei.com/industry/itelectric-appliance/49179-2022-07-13-08-55-20.html)**
>
>
>

>
> 老王点评：单反相机估计没想到它的敌人是智能手机吧。
>
>
>

### 谷歌高管认为 Instagram 和 TikTok 在侵蚀该公司核心产品

TikTok 对谷歌业务的威胁不限于视频服务 YouTube，谷歌公司高管承认 Instagram 和 TikTok 危及到了公司核心产品：搜索和地图。新一代的用户的搜索习惯和以前的用户不同，他们不是输入查询词，而是倾向于通过更沉浸的方式发现内容。比如在搜寻餐馆时，四成的年轻人不是打开谷歌地图或搜索，而是打开 TikTok 或 Instagram。

>
> **[消息来源：Tech Crunch](https://techcrunch.com/2022/07/12/google-exec-suggests-instagram-and-tiktok-are-eating-into-googles-core-products-search-and-maps/)**
>
>
>

>
> 老王点评：和单反的情况类似，打败搜索的不是更好的搜索，反而是其它的产品。
>
>
>


gedit 深色模式下高亮文本不可见？以下是你能做的

Summary: 我发现了一个 gedit 文本编辑器的小麻烦，如果你在深色模式下使用它，你也许也会遇到。

# gedit 深色模式下高亮文本不可见？以下是你能做的

我喜欢 [在 Ubuntu 中使用深色模式](https://itsfoss.com/dark-mode-ubuntu/)。在我看来深色模式能够缓解视觉疲劳，让系统看起来更加的赏心悦目。

我发现了一个 [gedit](https://wiki.gnome.org/Apps/Gedit) 文本编辑器的小麻烦，如果你在深色模式下使用它，你也许也会遇到。

默认情况下 gedit 高亮当前光标所在的行。这是一个非常有用的功能，但是如果你在 Linux 系统中开启了深色模式，那么你将会感到痛苦。为什么？因为被高亮的文本将不再变得可读。你自己看吧：

如果你选择文本，它将变得可读，但这并不是一个让人感到有多么愉快的阅读或者编辑体验。（LCTT 校注：在新的 Ubuntu 22.04 中，这一情况已经有所改善，“高亮当前行”已被取消勾选）

好消息是你不需要再忍受它。我将演示几个步骤让你能够同时享受 gedit 以及系统的深色模式。

### 让 gedit 在深色模式下阅读体验友好

你基本上有两个选择：

1. 禁用高亮当前行，但也同时意味着你必须清楚地知道你在哪一行。
2. 改变默认的颜色设置，但编辑器的颜色会变得稍微有些不同，而且如果你更改系统主题，它不会自动切换到浅色模式。

在 gedit 或者 GNOME 的开发者解决这个问题之前，这是你必须要做的应变和妥协。

#### 选项1： 禁止高亮当前行

当你打开 gedit 后，点击汉堡菜单然后选择“<ruby> 首选项 <rt>  Preferences </rt></ruby>”。

在查看选项卡，你应该看到在 “<ruby> 高亮 <rt>  Highlighting </rt></ruby>” 区域的下方的 “<ruby> 高亮当前行 <rt>  Highlight current line </rt></ruby>” 选项。取消勾选这个选项，马上就可以看到效果。

“高亮当前行”是一个有用的功能，如果你想继续使用它，请选择第二个选项。

#### 选项2： 更改编辑器的颜色主题

在“<ruby> 首选项 <rt>  Preferences </rt></ruby>”窗口，找到 “字体与颜色Font & Colors” 标签页，然后将颜色主题更改为 “Oblivion”、“Solarized Dark”，或者 “Cobalt”。

正如我前面所提到的，缺点就是当你把系统主题切换为浅色模式时，编辑器将不会自动切换到浅色模式。

### 开发者应该修复的一个 bug

这里 [有几个 Linux 可用的文本编辑器](https://itsfoss.com/best-modern-open-source-code-editors-for-linux/) ，但是为了快速阅读或编辑文本文件，我更推荐使用 gedit。尽管如此，小烦恼仍旧是小烦恼。开发者应该在将来的版本中为这个很好的文本编辑器修复这个问题，让我们不再求助于这些应对办法。

你呢？你在你的系统上使用深色模式还是浅色模式？你注意到 gedit 的这个问题了吗？你有使用什么方法去解决它吗？欢迎分享你的经验。

---

via: <https://itsfoss.com/gedit-dark-mode-problem/>

作者：[Abhishek Prakash](https://itsfoss.com/author/abhishek/) 选题：[lujun9972](https://github.com/lujun9972) 译者：[void-mori](https://github.com/void-mori) 校对：[wxy](https://github.com/wxy)

本文由 [LCTT](https://github.com/LCTT/TranslateProject) 原创编译，[Linux中国](https://linux.cn/) 荣誉推出


在 VirtualBox 安装 Arch Linux 的新手操作指南

# 在 VirtualBox 安装 Arch Linux 的新手操作指南

[Arch Linux 在桌面 Linux 世界中非常流行](https://itsfoss.com/why-arch-linux/)。受欢迎的原因之一是 [安装 Arch Linux](https://itsfoss.com/install-arch-linux/) 本身就是一项复杂的任务。

我没有夸大其词。安装 [Ubuntu 或 Debian](https://itsfoss.com/debian-vs-ubuntu/) 比 Arch Linux 容易得多，因为官方没给后者提供图形界面的安装程序。

这时虚拟机就派上用场了。

你可以先在 VirtualBox 中尝试安装 Arch Linux，看看它是否是你想在实际硬件上运行的系统。通过这种方式，你可以在不弄乱当前操作系统的情况下体验 Arch Linux。

在本文，我将一步一步指导你完成一个实用的 Arch Linux 虚拟机的安装过程。

### 在 VirtualBox 上安装 Arch Linux

毫无疑问，你需要先 [在 Linux 上安装 VirtualBox](https://itsfoss.com/install-virtualbox-ubuntu/)（或在 Windows 上）。在 Windows 上，只需访问 Oracle 的网站并下载 VirtualBox。

>
> **[下载 VirtualBox](https://www.virtualbox.org/wiki/Downloads)**
>
>
>

如果你使用的是 Windows 10 或更高版本，请确保你的系统已启用虚拟化。

完成后，你需要到 [Arch Linux 官方网站](https://archlinux.org/download/) 下载 ISO 文件。你应该找到 [使用 torrent 下载](https://itsfoss.com/best-torrent-ubuntu/) 或直接下载文件的选项。

你可以保留 ISO 文件以备不时之需，安装成功后也可以将其删除以 [释放系统上的空间](https://itsfoss.com/free-up-space-ubuntu-linux/)。

现在，让我们开始在 VirtualBox 上安装 Arch Linux 吧。

#### 第一部分 创建虚拟机

**第一步**：首先，你需要在 VirtualBox 中设置一下。启动 VirtualBox 并单击 “<ruby> 新建 <rt>  New </rt></ruby>” 来创建一个虚拟机。

注意，你可以使用 “<ruby> 向导模式 <rt>  guided mode </rt></ruby>” 继续创建虚拟机，但使用 “<ruby> 专家模式 <rt>  expert mode </rt></ruby>” 可以一目了然地获得更多选项。

因此，我推荐使用专家模式来创建虚拟机。

不用担心，专家模式同样简单，只是多了一些额外的可选项，无需担心其他任何事情。

**第二步**：输入你的虚拟机名称。当你在 “<ruby> 名称 <rt>  Name </rt></ruby>” 字段中输入 “Arch Linux” 时，它会分别自动检测 “<ruby> 类型 <rt>  Type </rt></ruby>” 和 “<ruby> 版本 <rt>  Version </rt></ruby>”。

你应该增加内存大小以舒适地使用虚拟机。如果只是用于小型测试，你可以继续使用默认设置。

我在这个例子中分配了 **4 GB 左右的内存**。

另外，请确保在 “<ruby> 硬盘 <rt>  Hard disk </rt></ruby>”选项下选择 “<ruby> 现在创建虚拟硬盘 <rt>  create a virtual hard disk </rt></ruby>”。它应该是默认选项。

现在，继续设置虚拟硬盘大小。

**第三步**：你可以选择虚拟硬盘的存放位置，并根据你的需求调整大小。最小分配大小（8 GB）对于安装系统应该不是问题，但安全起见，你可能得分配至少 10 到 15 GB。

接下来，你需要将硬盘硬盘文件类型选择为 “VDI（VirtualBox Disk Image）” ，将存储选择为 “<ruby> 动态分配 <rt>  Dynamically assigned </rt></ruby>”，如上图所示。

VDI 是虚拟硬盘最常见的硬盘类型。

当你为硬盘存储选择 “<ruby> 动态分配 <rt>  Dynamically allocated </rt></ruby>” 选项时，这意味着存储空间将根据使用情况进行使用。换言之，当创建虚拟机后，并不会立即将这 15 GB 的空间从你的磁盘中锁定。

现在，你所要做的就是点击 “<ruby> 创建 <rt>  Create </rt></ruby>” 来添加虚拟机。

#### 第二部分 添加 ISO 文件以开始安装 Arch Linux

当虚拟机在左侧列表中出现后，你可以查看其配置并在 “<ruby> 存储 <rt>  Storage </rt></ruby>” 选项下选择 ISO 文件作为磁盘驱动。

你也可以单独前往虚拟机设置以探索更多内容并选择 ISO 文件。

为此，你需要导航至虚拟机设置的 “<ruby> 存储 <rt>  Storage </rt></ruby>” 标签页。

在这里，你必须单击 “<ruby> 控制器 <rt>  Controller </rt></ruby>” 下的 “<ruby> 没有盘片 <rt>  Empty </rt></ruby>”，然后继续选择 Arch Linux ISO 文件作为磁盘文件（如上图所示）。

完成选择后，点击 “OK” 以保存设置的变更。

将 ISO 设置为要引导的磁盘时，虚拟机设置应如下所示：

现在，点击 “<ruby> 启动 <rt>  Start </rt></ruby>” 启动虚拟机并开始安装。

#### 第三部分 使用引导式安装程序安装 Arch Linux

使用 [介绍一个引导式安装程序](https://news.itsfoss.com/arch-linux-easy-install/) 的方法使安装 Arch Linux 变得更容易，也就是说，它为你提供了设置成熟的 Arch Linux 系统所需的所有选项。

因此，在引导式安装程序的帮助下，你不必单独安装桌面环境和其他基本软件包。你所要做的就是按照屏幕上的说明选择适合你的选项。

在本文中，我们将重点介绍引导式安装程序。如果你想自己做，你应该遵循我们的 [Arch 安装指南](https://itsfoss.com/install-arch-linux/)。

继续安装流程，当你启动虚拟机时，将看到以下屏幕：

第一个选项是理想的处理方式。如果你有特定的要求，可以选择其他选项来启动 Arch Linux。

现在，你应该正在查看一个终端窗口。以下是如何开始：

**第一步**：输入 `archinstall` 以使用引导式安装程序启动安装。

**第二步**：根据你的要求选择键盘布局，美式布局应该是最常见的选择。简单地输入一个数字即可进行选择，如下图所示（例如，26）：

**第三步**：接下来，你需要选择一个区域来下载包。

选择首选地区而不是 “<ruby> 全球 <rt>  Worldwide </rt></ruby>”。这至关重要，因为如果你选择 **全球** 作为你的地区，它会下载许多不必要的包。

**第四步**：选择区域后，它会要求你选择驱动器进行安装。在这个例子中，我们已经创建了一个大约 15 GB 的虚拟驱动器，显示为 `/dev/sda`。

类似的，根据大小检查你创建的驱动器，然后选择该磁盘继续。在这里，我输入 `1` 作为输入；你的可能会有所不同。

**第五步**：接下来，你将被询问以下内容：

* 选择文件系统类型
* 加密密码（可选的）
* 主机名
* 创建 root 密码（可选的）
* 创建超级用户
* 选择一个预编程的配置文件

在我的测试中，我选择了 btrfs 作为文件系统，没有设置任何磁盘加密密码。

主机名可随心所欲的设置，但我建议保持简短。

你可以选择创建一个 root 密码，即使不这么做也应该没什么问题。不过，你需要创建一个具有 sudo 权限的超级用户。

我使用 `admin`/`pass` 作为用户名和密码。不过，如果你不想让其他人访问你计算机上的虚拟机，则不应使用易于猜测的密码。

然后，你将看到一个选择配置文件的选项。在这种情况下，我们需要一个成熟的 Arch Linux 桌面。因此，我们通过输入 `0` 来选择 “<ruby> 桌面 <rt>  desktop </rt></ruby>”。

**第六步**：接下来，你将被要求选择桌面环境。我决定使用 KDE。你可以选择任何你喜欢的。

**第七步**：最后，你将被要求选择显卡驱动程序。由于我们是在 VirtualBox 上安装的 Arch Linux，你可以选择选项 4：VMware/VirtualBox，如下图所示：

你可能还会被要求输入“是（`y`）或否（`n`）”选择 pipewire 而不是 PulseAudio 作为音频服务。选任何一个都应该都可以。

**第八步**：接下来是重要的一步。在这里，如果你需要内核的 LTS 版本，你可以选择使用 “linux-lts”，或者继续使用默认值。

安装程序会提示你输入想安装的软件包。在这里，我们没有任何特殊要求，因此我们将其留空并按回车键跳过。

**第九步**：你将被要求选择所需的网络适配器以启用互联网访问。你必须选择以下选项：

“<ruby> 使用网络管理器来控制和管理你的互联网连接 <rt>  Use network manager to control and manage your internet connection </rt></ruby>”

**第十步**：下一步需要定义时区。选择适用于你的时区，或继续使用默认选项。

**第十一步**：完成后，它将显示你选择的大部分选项以供确认。按回车键继续。

**第十二步**：安装完成需要花费几分钟时间，这取决于你的互联网连接速度。

安装完成后，它会要求你 “chroot 进入新创建的安装以进行安装后配置”，但我们不需要。因此输入 `N` 以完成安装。

**第十三步**：最后，你应该会再次看到终端窗口。输入：

```
shutdown now

```

这将安全地退出安装并关闭虚拟机。

一切就绪！在启动安装了 Arch 的虚拟机之前，你还需要做一件事 —— **移除选择作为光驱的 ISO 磁盘**。与添加启动 ISO 的方式类似，你可以前往虚拟机设置并将其删除，如下所示：

到此为止你已在 VirtualBox 上安装了 Arch Linux。

你所要做的就是启动虚拟机，在我的例子中它是这样的：

尽管浏览这些选项需要一些时间，但 Arch Linux 上新的引导式安装程序可以节省大量时间使必填项配置正确。

同样的步骤也适用于在你的计算机上安装 Arch Linux。你需要用 Arch Linux ISO 文件 [使用 Etcher 制作单独的可启动 USB 盘](https://itsfoss.com/install-etcher-linux/)。

### 总结

[Arch Linux 成为一种流行的选择](https://itsfoss.com/why-arch-linux/) 有多种原因。但是，如果这是你第一次安装，或者你想对其进行测试，那么虚拟机是在不打乱主机的情况下体验它的最佳方式。

我希望这可以帮助你在 VirtualBox 上安装 Arch Linux。在下面的评论中让我知道你的想法。

---

via: <https://itsfoss.com/install-arch-linux-virtualbox/>

作者：[Ankush Das](https://itsfoss.com/author/ankush/) 选题：[lujun9972](https://github.com/lujun9972) 译者：[hanszhao80](https://github.com/hanszhao80) 校对：[wxy](https://github.com/wxy)

本文由 [LCTT](https://github.com/LCTT/TranslateProject) 原创编译，[Linux中国](https://linux.cn/) 荣誉推出


用 ranger 在 Linux 终端管理你的文件

Summary: 试试这个轻量级的开源工具，不用离开终端就可以预览文件。

“除非 Vim 用户另有配置，否则下面的键绑定工作良好。”<br />
这是人说的话？你机翻可以，能不能看一看审核一下翻译出来的文字啊。翻译的三要素信达雅，你只做到了信，连达都做不到

试试这个轻量级的开源工具，不用离开终端就可以预览文件。

# 用 ranger 在 Linux 终端管理你的文件

>
> 试试这个轻量级的开源工具，不用离开终端就可以预览文件。
>
>
>

查看你的文件和文件夹的最基本方法是使用命令 `ls` 和 `ll`。但是有时候，我不仅想看到文件的元数据，还想一目了然地看到文件的内容。为此，我使用 ranger。

如果你喜欢在控制台中工作，并使用 [Vim](https://opensource.com/tags/vim) 或 Vi，而且你不想因为任何原因离开你的终端，那么 ranger 就是你最好的新朋友。ranger 是一个精简的文件管理器，它不仅可以让你浏览文件，还可以预览它们。ranger 与 rifle 捆绑在一起，rifle 是一个文件执行器，可以有效地选择与特定文件类型相关的程序。

### 在 Linux 上安装 ranger

ranger 可以在 Fedora 或任何基于 RPM 的发行版中安装，方法是运行：

```
$ sudo dnf install ranger

```

ranger 也可以用于 [其他发行版和 macOS](https://opensource.com/article/20/3/ranger-file-navigator)。

### 第一次使用 ranger

作为一个用户，你可以在你喜欢的终端上简单地输入 `ranger` 来启动 ranger。可以用方向键浏览。这张截图是一个很好的例子，我可以预览存储在 `Kernel-tests` 中的 `config.example` 文件的代码。

选中任何文件并按下 `F4` 键，就可以打开你的默认编辑器，让你立即编辑这些文件！

### 图像和视频怎么办？

使用 [rifle](https://www.systutorials.com/docs/linux/man/1-rifle/) 和 ranger 可以让你快速找到与某一文件相关的程序。将鼠标悬停在图片上，然后试图打开它是非常简单的，只要点击回车即可。下面是它的样子：

在一个图像文件上点击 `i` 会给用户提供所有的 EXIF 数据。点击 `Shift+Enter` 将打开这个 PDF 文件。

同样的组合键将在系统默认的支持该编解码器的视频播放器中打开并开始播放视频。下面的例子是一个 mp4 视频，它在 [VLC](https://opensource.com/article/21/2/linux-media-players) 上播放得很好。

### 文件操作

除非 Vim 用户另有配置，否则下面的键绑定工作良好。

* `j`：下移
* `k`：上移
* `h`: 移动到父目录
* `gg`：移到列表的顶部
* `i`：预览文件
* `r`：打开文件
* `zh`：查看隐藏文件
* `cw`：重命名当前文件
* `yy`：复制文件
* `dd`：剪切文件
* `pp`：粘贴文件
* `u`：撤销
* `z`：改变设置
* `dD`：删除文件

### 控制台命令

有时我在起草文章时，有一个文件夹包含某个软件的截图。通过点击空格选择或标记文件，然后输入 `:bulkrename`，可以帮助我把所有奇怪的时间戳变成如：lorax1、lorax2 等等。下面是一个例子。

其他有用的控制台命令包括：

* `:openwith`：用你选择的程序打开一个选择的文件
* `:touch FILENAME`：创建一个文件
* `:mkdir FILENAME`：创建一个目录
* `:shell <command>`：在 shell 中运行一个命令
* `:delete`：删除文件

### 在 tty2/3/4 中能工作吗？

作为一个从事质量保证（QA）工作的人，我发现搜索日志和阅读日志从未如此简单。即使我的 Gnome 显示管理器崩溃了，我也可以切换到我的 tty2，用我的用户名和密码登录，并以超级用户权限启动 ranger，然后我就可以尽情地探索了！

ranger 是一个很好的工具，可以在不离开终端的情况下处理文件。ranger 是精简的，也是可定制的，所以不妨一试吧！

*图片来源：（Sumantro Mukherjee，CC BY-SA 4.0）*

---

via: <https://opensource.com/article/22/7/manage-files-linux-terminal-ranger>

作者：[Sumantro Mukherjee](https://opensource.com/users/sumantro) 选题：[lkxed](https://github.com/lkxed) 译者：[geekpi](https://github.com/geekpi) 校对：[wxy](https://github.com/wxy)

本文由 [LCTT](https://github.com/LCTT/TranslateProject) 原创编译，[Linux中国](https://linux.cn/) 荣誉推出


硬核观察 #699 谷歌从安卓中移除大量 Fuchsia 代码

Summary: • 谷歌从安卓中移除大量 Fuchsia 代码 • openSUSE 率先对 Nim 语言提供支持 • Rocky Linux 9.0 发布

fuchsia从15年等到现在22年，等到我都送外卖了

# 硬核观察 #699 谷歌从安卓中移除大量 Fuchsia 代码

### 谷歌从安卓中移除大量 Fuchsia 代码

本周，谷歌从安卓开源项目（AOSP）中移除了大量关于 Fuchsia 设备的代码。在谷歌的设想中，Fuchsia 设备可以运行来自安卓和 Linux 等其他系统的应用程序。想要达成这个目标有多种途径，谷歌最早尝试的是在一个虚拟机上运行完整的安卓系统实例，但这存在一些潜在的性能问题。另一种方式就是增强 Fuchsia 和安卓运行时环境的直接关系，在 2019 年时谷歌在 AOSP 里创建了一个项目，能够为 Fuchsia 设备创建安卓运行时。这次这些代码的移除，正式标志着这种方式的终结。在留下的 TODO 信息里，表明谷歌正在创建一个新的 “Starnix” 项目，让 Fuchsia 能够“原生”运行为 Linux/安卓开发的应用和库，即一个从 Linux 的底层内核架构到 Fuchsia 的 Zircon 内核的翻译层。

>
> **[消息来源：9to5google](https://9to5google.com/2022/07/15/android-removes-fuchsia-code-starnix/)**
>
>
>

>
> 老王点评：其实，谷歌在操作系统方面的野心很大，只是一直被掩盖在 Windows 和 Mac 下面没那么引人注意。
>
>
>

### openSUSE 率先对 Nim 语言提供支持

[Nim 语言](https://nim-lang.org/) 是一种新兴的语言，创建于 2005 年。这种经过编译的静态类型的编程语言有一个外部函数接口，可以与 C/C++、JavaScript 和其他语言交互。Nim 自称“结合了 Python、Ada 和 Modula 等成熟语言的成功概念”，以前曾被称为像 C 一样快，又像 Python 一样具有表现力、像 Lisp 编程语言一样可扩展。openSUSE 不仅宣布为 Nim 语言提供最新的软件包，而且对这个静态类型、命令式编程语言的提供一级支持。Nim 的作者及社区对 openSUSE 提供一级支持表示欢欣鼓舞。

>
> **[消息来源：Phoronix](https://www.phoronix.com/scan.php?page=news_item&px=openSUSE-First-Class-Nim)**
>
>
>

>
> 老王点评：很多新兴语言都雄心勃勃，但是一种编程语言要成功，真有时候有很多侥幸的地方。
>
>
>

### Rocky Linux 9.0 发布

Rocky Linux 9.0 建立在 RHEL 9.0 的基础上，并计划支持近十年，直到 2032 年 5 月。现有的Rocky Linux 8 将继续被支持到 2029 年 5 月。Rocky Linux 渴望成为 CentOS Stream 之前的 CentOS。由于使用了红帽企业 Linux 9.0 的源代码，它的所有功能与 5 月份达到 GA 的那个 RHEL 发行版相同。

>
> **[消息来源：Phoronix](https://www.phoronix.com/scan.php?page=news_item&px=Rocky-Linux-9.0-Released)**
>
>
>

>
> 老王点评：从目前看起来，Rocky Linux 和 Alma Linux 是最肖似 CentOS 的继承者了。
>
>
>


诺基亚勒令一个开源 Linux 手机项目 “NOTKIA” 改名字

# 诺基亚勒令一个开源 Linux 手机项目 “NOTKIA” 改名字

>
> 有一个想要为你带来一款诺基亚风格的 Linux 手机的开源项目，但诺基亚似乎并不喜欢这个项目的名字。
>
>
>

近期，一个旨在打造经典诺基亚（小型）的 Linux 手机的开源项目，遭到了诺基亚的抨击。

该项目的名称最初是 “**Notkia**”，然而，诺基亚认为该名称与自己相似，可能会影响自己的品牌声誉，并侵犯到自己的权利。

虽然这样做可以保护公司的业务，但这些公司向在当前状态下甚至对他们构不成威胁的项目发送侵权通知是怎么回事？

### Notkia：开发一款袖珍 Linux 手机

不过还得 *感谢* 诺基亚的这个侵权通知，我们才能了解到这个有趣的项目：开发一款满足基本使用、注重隐私的小型 Linux 手机。

该项目的目标是设计一个完全适合诺基亚经典手机外壳的 PCB。

到目前为止，该项目已经支持许多硬件相关的功能，包括蓝牙和 Wi-Fi。

该项目不基于安卓，而是基于主线 Linux 内核。

你可以在他们的 [官方博文](https://hackaday.io/project/185645-notkia-name-change-planned) 中，了解有关该项目和计划中的手机规格。

目前，该项目正在等待筹款，以便可以单独购买早期原型机。

### 灵感来自诺基亚，并受到诺基亚的关注

嗯，该项目清楚地表明他们受到诺基亚经典手机的启发，他们并没有试图误导任何贡献者和潜在客户。

该项目的创建者在推特上分享了诺基亚的电子邮件，同时他提到，诺基亚在将此类通知发送给以社区利益为主导的项目之前，应该更谨慎一些才对。

>
> 再次阅读 [@Nokia](https://twitter.com/nokia?ref_src=twsrc%5Etfw) 的邮件后，我开始感到愤怒。这无非是一场精心策划的演出。既然它是一个协作项目，并且得到了世界各地的人们的贡献，因此，我将把完整的电子邮件发布给它的“预期收件人”。
>
>
>
>
>
>

**此外，他们确认该项目将更名。**

当然，作为一个开源项目，它应该和诺基亚是扯不上关系的，除非他们使用诺基亚的品牌名称销售他们的原型/手机。

但是，在目前的状态下，这更像是一个激情项目，是开源爱好者社区协作努力的成果。因此，向他们发出侵犯诺基亚权利的通知，听起来实在有些牵强。

*对吗？*

当然，对于一般企业来说，这并不奇怪；但对于诺基亚来说，这未免有点过于谨慎和反竞争了。

更何况，我们可以肯定地说，诺基亚的最新的智能手机的表现，并没有达到用户的预期。

有趣的是，一位推特用户发现，还有一家名为 “Notkia” 的 [IT 公司](https://www.linkedin.com/company/notkia-it/)。他们是否也收到了诺基亚的通知？呵呵，谁知道呢。

*那么，你如何看待这个基于 Linux 的袖珍手机的开源项目呢？在下面的评论中分享你的看法吧！*

消息来源：[Vice](https://www.vice.com/en/article/93awjz/nokia-asks-open-source-notkia-phone-project-to-change-its-name)

---

via: <https://news.itsfoss.com/nokia-notkia/>

作者：[Ankush Das](https://news.itsfoss.com/author/ankush/) 选题：[lkxed](https://github.com/lkxed) 译者：[lkxed](https://github.com/lkxed) 校对：[wxy](https://github.com/wxy)

本文由 [LCTT](https://github.com/LCTT/TranslateProject) 原创编译，[Linux中国](https://linux.cn/) 荣誉推出


手动续订 SSL 证书的简单指南

# 手动续订 SSL 证书的简单指南

<img src="content_image/album_202207_17_190358hylhj5yly5rh5pe5.jpg" alt="" title="">

*在本杂志 2022 年 4 月号中，我们了解了不同类型的 SSL 证书及其应用。本文介绍如何手动更新现有 SSL 证书，以使其保持最新的安全要求。*

当访问者与你的网站互动并分享信用卡号码等关键细节时，他们相信他们的信息已得到保护，不会被滥用。因此，你有责任尊重这种信任并为你网站上的所有访问者提供全面保护。不这样做不仅会使你失去客户的忠诚度，而且还可能使你陷入法律困境。在许多情况下，无法保护客户数据免遭泄露、盗窃或滥用的网站被迫支付巨额罚款，同时也失去了声誉。

#### SSL 证书如何保护客户的数据？

保护敏感客户信息的最佳方法之一是使用 SSL（安全套接字层）证书保护你的站点。用不涉及技术细节的话来说，SSL 证书对 Web 服务器和访问者浏览器之间的通信进行加密，从而使黑客或威胁参与者在技术上不可能窃取传输中的数据。 SSL 建立了一个安全的握手过程来解密加密的信息，这个过程太复杂了，人类甚至软件都无法破解。（LCTT 校注：此处言过其实，SSL 加密传输的信息并不是绝对不可截获和破解的，比如中间人攻击等。）

#### 为什么需要更新 SSL 证书？

虽然 SSL 证书提供了防止数据盗窃或滥用的安全性，但你需要定期更新它以确保最有效的安全性以抵御最新的威胁。本文将列出以正确方式更新 SSL 证书的分步说明。

更新 SSL 证书有很多好处：

* 及时更新验证你的网站的身份。
* 获得更新的安全性。
* 一年有效期促进定期更新/升级保护范围的健康实践，从而消除与过时版本相关的风险。

>
> 注意：最佳做法是选择一种自动续订方式，以减轻你记住续订日期或手动执行相关步骤的压力。
>
>
>

#### 有点跑题了，构建你自己的 SSL 证书的纯开源方式

是的，这绝对是真的！通过一些简化和紧凑的步骤，你实际上可以从头开始构建自己的 SSL 证书！虽然整个过程超出了本文的范围，但这里有一些可用于创建 SSL 证书的关键开源组件和工具。

* OpenSSL：这是实现 TLS 和加密库的高度可信的工具。
* EasyRSA：此命令行工具使你能够构建 PKI CA 并有效地管理它。
* CFSSL：Cloudflare 终于为 PKI 和 TLS 构建了一个多用途、多功能的工具。
* Lemur：由 Netflix 开发的还不错的 TLS 生成器。

### 如何更新你的 SSL 证书

虽然 [SSL](https://www.google.com/url?sa=t&rct=j&q=&esrc=s&source=web&cd=&cad=rja&uact=8&ved=2ahUKEwitou7xjv_3AhWLRmwGHVZ2BWwQFnoECB0QAQ&url=https%3A%2F%2Fgithub.com%2Fopenssl%2Fopenssl&usg=AOvVaw0niwMRCpb4nN_PtJFMQwWP) 更新的一般过程保持不变，但可能会有一些细微的调整和变化，具体取决于你的特定 SSL 提供商。

更新过程遵循三个主要步骤：CSR（证书签名请求）生成、证书激活，最后是证书安装。

**生成 CSR：** 对于 cPanel 托管面板，你可以单击“<ruby> 安全 <rt>  Security </rt></ruby>”选项卡并搜索 *SSL/TLS* 选项。它将显示一个页面，在 CSR 选项下方有一个链接。这里可以帮助你为所需的域名生成新的 CSR。

系统将询问你详细的联系信息，以确认你是真正的域所有者。填写表格后，你将获得证书重新激活所需的 CSR 代码。

**激活 SSL 证书：** 在你的仪表板中，你可以快速查看拥有的 SSL 证书、域和其他数字基础设施产品。单击该按钮开始 SSL 续订过程。输入之前生成的 CSR，确认信息的准确性。你现在可以验证 SSL 续订过程。

**验证 SSL 证书：** 系统将再次提示你确认域所有权 —— 输入与域相关的电子邮件；在需要安装证书的 Web 服务器上上传文件；借助 CNAME 记录验证 SSL 证书等等。虽然有多种选择，但最好和最简单的方法是通过电子邮件进行验证。输入与该域关联的电子邮件后，你将收到一封包含特定链接的电子邮件，然后是另一封邮件，其中包含带有 `.crt` 扩展名的新证书文件。

**安装 SSL 证书：** 你的主机托管商将为你提供与支持团队沟通的方式，以安装更新文件，或为你提供有关如何通过 cPanel 手动执行此操作的详细说明。请记住，不同的主机提供不同的续订方式。也就是说，如果你是非技术人员，那么联系支持团队将是你的最佳选择。

如需手动更新，请访问 cPanel 的 “SSL/TLS” 页并找到 “<ruby> 管理 SSL 站点 <rt>  Manage SSL sites </rt></ruby>”选项。它包含了你拥有的整个域列表。对应每个域名，你可以看到证书更新选项。

在旁边的页面中，使用“<ruby> 按域自动填写 <rt>  Autofill by Domain </rt></ruby>”选项输入“<ruby> 私钥 <rt>  Private Key </rt></ruby>”的详细信息。在 “<ruby> 证书 <rt>  Certificate </rt></ruby>” 选项下，填写你的 `.crt` 文件的详细信息。离完成就剩一步了。只需单击显示“<ruby> 安装证书 <rt>  Install Certificate </rt></ruby>”的按钮。

除了保存用户的关键数据和敏感信息外，SSL 证书还通过重申你网站上共享的数据是安全的来建立信任。由于谷歌认为 SSL 认证是一种健康的做法，因此它也会对你的 SEO 产生积极影响。但是，要继续享受此证书的最佳安全性，你需要定期更新它。这可以确保你的网站根据最新的安全要求，充分防止数据传输中的攻击。

---

via: <https://www.opensourceforu.com/2022/07/manual-renewal-of-ssl-certificates-a-simple-guide/>

作者：[Jitendra Bhojwani](https://www.opensourceforu.com/author/jitendra-bhojwani/) 选题：[lkxed](https://github.com/lkxed) 译者：[geekpi](https://github.com/geekpi) 校对：[wxy](https://github.com/wxy)

本文由 [LCTT](https://github.com/LCTT/TranslateProject) 原创编译，[Linux中国](https://linux.cn/) 荣誉推出


硬核观察 #700 美国军方摸底开源代码的可信度

Summary: • 美国军方摸底开源代码的可信度 • IE 团队收到来自 Mozilla 的谢幕祝贺蛋糕 • 谷歌应用商店将由开发者来编写应用的权限描述

# 硬核观察 #700 美国军方摸底开源代码的可信度

### 美国军方摸底开源代码的可信度

开源代码几乎在地球上的每一台计算机上运行，当今世界重度依赖于 Linux 内核。这也意味着任何人都能够参与到代码的编写、阅读和使用过程中，这点让美国军方内部的网络安全专家感到十分担心。“关键的开源软件以我们仍然几乎不了解的方式，暴露于恶意的操纵之下。”美国国防部高级研究计划局（DARPA）设立了一个计划长达 18 个月、耗资数百万美元的 SocialCyber 项目。最终目标是检测并抵御任何恶意活动、提交有缺陷的代码、介入干预、阻止开发，甚至接管整个开源项目。为此研究人员将使用情绪分析等工具，来分析开源社区内的社交互动 —— 比如 Linux 内核邮件列表。这将有助于确定谁在积极参与建设，同时谁又在消极怠工或悄悄搞破坏。

>
> **[消息来源：Tech Review](https://www.technologyreview.com/2022/07/14/1055894/us-military-sofware-linux-kernel-open-source/)**
>
>
>

>
> 老王点评：开源软件已经庞大到不能不依赖，而又非常警惕的规模了。
>
>
>

### IE 团队收到来自 Mozilla 的谢幕祝贺蛋糕

微软的 IE 浏览器已于 6 月正式退役，这对科技行业的几乎所有人来说都是一个快乐的时刻。按照互相送蛋糕的悠久传统，Mozilla 的 Firefox 团队给微软 IE 团队送了最后一个蛋糕，以庆祝历史悠久的 IE 浏览器的落幕。蛋糕上面有一个巨大的 IE 标志。蛋糕上写着：“you were the ie6ing on the cake”。浏览器开发团队互相赠送蛋糕是一个可以追溯到十多年前的传统。微软在 2006 年Firefox 2.0 发布时给 Firefox 团队送了一个蛋糕，并在后来大多数的 Firefox 主要版本发布时都延续了这一传统。尽管随着浏览器发布周期的加快，这些蛋糕最终变成了杯子蛋糕。在 2012 年 IE 10 到来之后，Mozilla 向微软送了一个蛋糕，然后谷歌的 Chrome 团队也开始加入向对手送蛋糕的行列。

>
> **[消息来源：Howtogeek](https://www.howtogeek.com/817409/mozilla-sent-microsoft-a-cake-for-internet-explorers-death/)**
>
>
>

>
> 老王点评：还好，这次的蛋糕比较大，够团队分着吃了。
>
>
>

### 谷歌应用商店将由开发者来编写应用的权限描述

谷歌正在关闭独立的“应用权限”部分，新的数据安全部分显示了开发者提供的隐私注意事项清单，比如一个应用程序收集哪些数据，这些数据是如何存储的，以及这些数据与谁共享。开发者可以解释如何以及为什么要收集每一点数据。旧的应用程序权限列表可以保证是真实的，因为它是由谷歌通过扫描应用程序自动建立的。而数据安全系统则是在荣誉系统上运行的。谷歌称，“谷歌应用商店审查所有政策要求的应用；但是，我们不能代表开发者对他们如何处理用户数据做出判断。……当谷歌意识到你的应用行为与你的声明之间存在差异时，我们可能会采取适当的行动，包括执法行动。”

>
> **[消息来源：ARS Technica](https://arstechnica.com/gadgets/2022/07/google-plays-new-privacy-section-actually-hides-app-permissions/)**
>
>
>

>
> 老王点评：话虽如此，我还是觉得应该保留独立的“应用权限”部分。
>
>
>


如何监测微型的网站服务

Summary: 我希望网站大部分时间都能正常工作，但我也希望不用在持续的运营上花费时间。

我希望网站大部分时间都能正常工作，但我也希望不用在持续的运营上花费时间。

# 如何监测微型的网站服务

<img src="content_image/album_202207_18_105829gzviausw5wg7wwxb.jpg" alt="" title="">

你好! 我最近又开始运行一些服务器（[nginx playground](https://nginx-playground.wizardzines.com)、[mess with dns](https://messwithdns.net)、[dns lookup](https://dns-lookup.jvns.ca)），所以我一直在考虑监控问题。

最初我并不完全清楚如何监控这些网站，所以我想快速写下我是如何做到的。

我根本不打算谈如何监控大型的、严肃的关键任务网站，只谈微型的不重要的网站。

### 目标：在操作上几乎不花时间

我希望网站大部分时间都能正常工作，但我也希望不用在持续的运营上花费时间。

我最初对运行服务器非常警惕，因为在我的上一份工作中，我是 24/7 轮流值班，负责一些关键的服务，在我的印象中，“负责服务器”意味着“在凌晨 2 点被叫起来修理服务器”和“有很多复杂的仪表盘”。

所以有一段时间我只做静态网站，这样我就不用考虑服务器的问题。

但最终我意识到，我所要写的任何服务器的风险都很低，如果它们偶尔宕机 2 小时也没什么大不了的，我只需设置一些非常简单的监控来帮助它们保持运行。

### 没有监控很糟糕

起初，我根本没有为我的服务器设置任何监控。这样做的结果是非常可预见的：有时网站坏了，而我却没有发现，直到有人告诉我！

### 步骤 1：uptime 检查器

第一步是建立一个 uptime 检查器。外面有很多这样的东西，我现在使用的是 [updown.io](https://updown.io/) 和 [uptime robot](https://uptimerobot.com/)。我更喜欢 updown 的用户界面和 [定价](https://updown.io/#pricing) 结构（它是按请求而不是按月收费），但 uptime 机器人有一个更慷慨的免费套餐。

它们会：

1. 检查网站是否正常
2. 如果出现故障，它会给我发电子邮件

我发现电子邮件通知对我来说是一个很好的通知级别，如果网站宕机，我会很快发现，但它不会吵醒我或做其它的什么打扰。

### 步骤 2：端到端的健康检查

接下来，让我们谈谈“检查网站是否正常”到底是什么意思。

起初，我只是把我的健康检查端点之一变成一个函数，无论如何都会返回 `200 OK`。

这倒是挺有用的 – 它告诉我服务器是启动着的！

但不出所料，我遇到了问题，因为它没有检查 API 是否真的在 *工作* – 有时健康检查成功了，尽管服务的其他部分实际上已经进入了一个糟糕的状态。

所以我更新了它，让它真正地发出 API 请求，并确保它成功了。

我所有的服务都只做了很少的事情（nginx playground 只有一个端点），所以设置一个健康检查是非常容易的，它实际上贯穿了服务应该做的大部分动作。

下面是 nginx playground 的端到端健康检查处理程序的样子。它非常基本：它只是发出一个 POST 请求（给自己），并检查该请求是成功还是失败。

```
    func healthHandler(w http.ResponseWriter, r *http.Request) {
        // make a request to localhost:8080 with `healthcheckJSON` as the body
        // if it works, return 200
        // if it doesn't, return 500
        client := http.Client{}
        resp, err := client.Post("http://localhost:8080/", "application/json", strings.NewReader(healthcheckJSON))
        if err != nil {
            log.Println(err)
            w.WriteHeader(http.StatusInternalServerError)
            return
        }
        if resp.StatusCode != http.StatusOK {
            log.Println(resp.StatusCode)
            w.WriteHeader(http.StatusInternalServerError)
            return
        }
        w.WriteHeader(http.StatusOK)
    }

```

### 健康检查频率：每小时一次

现在，我大部分健康检查每小时运行一次，有些每 30 分钟运行一次。

我每小时运行一次，因为 [updown.io](http://updown.io) 的定价是按健康检查次数计算的，我正在监控 18 个不同的 URL，而且我想把我的健康检查预算保持在 5 美元/年的最低水平。

花一个小时来发现这些网站中的一个出现故障，对我来说是可以的 – 如果有问题，我也不能保证能很快修复它。

如果可以更频繁地运行它们，我可能会每 5-10 分钟运行一次。

### 步骤 3：第三步：如果健康检查失败，自动重新启动

我的一些网站在 [fly.io](http://fly.io) 上，fly 有一个相当标准的功能，我可以为一个服务配置一个 HTTP 健康检查，如果健康检查失败，就重新启动服务。

“经常重启”是一个非常有用的策略来弥补我尚未修复的 bug，有一段时间，nginx playground 有一个进程泄漏，`nginx` 进程没有被终止，所以服务器的内存一直在耗尽。

通过健康检查，其结果是，每隔一天左右就会发生这样的情况：

* 服务器的内存用完了
* 健康检查开始失败
* 它被重新启动
* 一切又正常了
* 几个小时后再次重复整个传奇

最终，我开始实际修复进程泄漏，但很高兴有一个解决方法可以在我拖延修复 bug 时保持运行。

这些用于决定是否重新启动服务的运行状况检查更频繁地运行：每 5 分钟左右。

### 这不是监控大型服务的最佳方式

这可能很明显，我在一开始就已经说过了，但是“编写一个 HTTP 健康检查”并不是监控大型复杂服务的最佳方法。 但我不会深入讨论，因为这不是这篇文章的主题。

### 到目前为止一直运行良好！

我最初在 3 个月前的四月写了这篇文章，但我一直等到现在才发布它以确保整个设置正常工作。

这带来了很大的不同 – 在我遇到一些非常愚蠢的停机问题之前，现在在过去的几个月里，网站的运行时间达到了 99.95%！

---

via: <https://jvns.ca/blog/2022/07/09/monitoring-small-web-services/>

作者：[Julia Evans](https://jvns.ca/) 选题：[lujun9972](https://github.com/lujun9972) 译者：[geekpi](https://github.com/geekpi) 校对：[wxy](https://github.com/wxy)

本文由 [LCTT](https://github.com/LCTT/TranslateProject) 原创编译，[Linux中国](https://linux.cn/) 荣誉推出


10 大必备 Ubuntu 应用：必备篇

Summary: 本文列出了 2022 年可以用于日常工作的 10 个 Ubuntu 必备应用。

非常棒！

本文列出了 2022 年可以用于日常工作的 10 个 Ubuntu 必备应用。

# 10 大必备 Ubuntu 应用：必备篇

>
> 本文列出了 2022 年可以用于日常工作的 10 个 Ubuntu 必备应用。
>
>
>

我们经常忘记，有成千上万的、可以与同类商业产品相媲美的自由开源应用。此外，若你是 Windows 用户，并考虑完全摆脱 Windows ，你也应该事先了解此类应用程序。

因此，在这篇“必备的 Ubuntu 应用”文章中，我们为急需这些信息的 Linux 用户列举了 10 款应用。

这是这个系列的第三篇文章，如果你错过了之前的文章，可以通过以下链接阅读：

* [第一篇](https://www.debugpoint.com/essential-ubuntu-apps-2022-part-1/)
* [第二篇](https://www.debugpoint.com/best-ubuntu-apps-2022-part2/)

### Guake

你是否想要在处理重要工作时使用快捷键打开一个终端？这款下拉式的终端程序 Guake 能够帮你实现。如果你正忙于写文章、剪辑视频、在你最喜欢的代码编辑器中写代码，并想要快速用终端检查一些东西并返回到工作中，Guake 能够帮助你。只用按 `F12` 终端就会立即出现，再次按 `F12` 它会消失，不用打开或关闭不同的终端。

在 Ubuntu 或其他发行版，你可以使用以下命令安装。如需更多下载选项，请访问 [此页面](https://guake.readthedocs.io/en/latest/user/installing.html#system-wide-installation)。

```
sudo apt install guake

```

浏览以下链接了解 Guake 的更多信息：

* [主页](http://guake-project.org/)
* [源码](https://github.com/Guake/guake)

### Safe Eyes

眼睛很宝贵，如果你是长时间使用平板或电脑的用户，你应该保护好眼睛。这里有一款可以帮助你保护眼睛的应用 —— Safe Eyes ，能够帮你减少并预防用眼过度。

Safe Eyes 这款应用会在你的工作期间为你提供“顺时针转动眼睛 10 秒”等活动的弹出式指令。

我认为它是每个人都应该尝试使用的一款 Ubuntu 应用。

通过 PPA 可以很容易在 Ubuntu 上安装 Safe Eyes 。你可以打开终端并使用以下命令安装这款应用。

```
sudo add-apt-repository ppa:slgobinath/safeeyessudo apt updatesudo apt install safeeyes

```

更多下载选项，请访问 [此页面](https://slgobinath.github.io/SafeEyes/)。

浏览以下链接了解 Safe Eyes 的更多信息：

* [主页](https://slgobinath.github.io/SafeEyes/)
* [源码](https://github.com/slgobinath/SafeEyes)

### Tusk

笔记应用有很多。虽然，包括 Ubuntu 在内的所有 Linux 发行版，都带有一个基础文本编辑器，但是想要高级的笔记功能，你需要一个专业应用。

Tusk 是适用于 Ubuntu/Linux 的新款印象笔记式桌面应用程序。它带有大量主题，例如浅色、深褐色和深色。它具有以下功能：

* 本地和全局自定义快捷键
* 更新通知
* 基于 Electron 的跨平台应用
* 可伸缩的界面（放大和缩小）
* 浅色、深褐色和深色主题
* 聚焦模式和自动夜间模式
* 将笔记导出为 HTML、PDF 和 Markdown 格式

该应用有用于 Linux 发行版的 AppImage 、Deb 和 RPM 文件等格式。你可以从以下链接下载 deb 文件并运行它以在 Ubuntu 中安装它。有关其他下载选项，请访问 [此页面](https://github.com/klaussinani/tusk/releases/)。

>
> **[下载 Tusk](https://github.com/klaussinani/tusk/releases/download/v0.23.0/tusk_0.23.0_amd64.deb)**
>
>
>

浏览以下链接了解 Tusk 的更多信息：

* [主页](https://klaussinani.github.io/tusk/)
* [源码](https://github.com/klaussinani/tusk)

### Krita

如果你是一个艺术家并想在 Linux 上学习绘画，那你一定要用 Krita 。Krita 拥有众多绘画工具，包含诸如压感式绘画等高级模式。此外，你也可以在触屏设备上使 Krita 。它包含一些独特的功能：

* 自定义工具栏和停靠栏
* 将工作区另存为文件
* 深浅主题
* 内置矢量引擎，海量画笔
* 带稳定功能的画笔引擎
* 支持 PhotoShop 文件（PSD）
* 支持全色系
* 支持 Python 脚本扩展

在所有的 Linux 发行版的官方仓库都有 Krita ，所以很容易安装。在 Ubuntu 中，你可以在应用商店里搜索并安装。如果你更喜欢使用终端安装，可以运行如下指令：

```
sudo apt install krita

```

浏览以下链接了解 Krita 的更多信息：

* [主页](https://krita.org/en/)
* [学习文件](https://docs.krita.org/en/)
* [源码](https://invent.kde.org/graphics/krita)

### Foliate

当你想到电子书阅读器时，总是会想到 Calibre 。不过还有一款杰出的 GNOME 应用 —— Foliate 。Foliate 是用 GTK 编写的新颖的电子书阅读器，它带来了令人赞叹的功能，例如自定义页面的颜色、亮度、多栏支持等等。此外，它还支持 Epub、Amazon Kindle、FictionBook、CBA 和 Mobipocket 格式，让你完全控制自己的收藏。

如果你想要一个漂亮而优美的电子书阅读器，非它莫属。

使用 Linux 发行版的 Flatpak 安装 Foliate 很容易。首先，你需要 [设置 Flatpak](https://www.debugpoint.com/how-to-install-flatpak-apps-ubuntu-linux/) 并单击下方链接进行安装。

>
> **[下载 Foliate](https://dl.flathub.org/repo/appstream/com.github.johnfactotum.Foliate.flatpakref)**
>
>
>

浏览以下链接了解 Foliate 的更多信息：

* [主页](https://johnfactotum.github.io/foliate/)
* [源码](https://github.com/johnfactotum/foliate)

### Bitwarden

平均而言，每个人至少有十几个在线账号和密码。你越是精通技术，那么你管理密码的数量就会越多。使用密码管理器能够更好的保护你的数据以及密码。那么接下来这款应用，Bitwarden，是当今最好的管理密码的应用。

Bitwarden 是一款自由开源的密码管理器，能够轻松帮助你生成、存储并保存密码。在 AES-256 加密的支持下，Bitwarden 能够在不同设备，比如手机和平板自动同步密码。

你可以从 [此页面](https://bitwarden.com/download/) 下载可执行安装包文件。此外，如果你打算在你最喜欢的浏览器中使用它，也可以在该页面中获取扩展。

浏览以下链接了解 Bitwarden 更多信息：

* [主页](https://bitwarden.com/help/)
* [帮助文档](https://bitwarden.com/help/)

### Brave Browser

Brave 是一款基于 Chromium 的以隐私为中心的浏览器。它非常适合希望完全控制其在线活动的用户。Brave 带有内置广告拦截器、隐身浏览、VPN 和 Tor 模式，可实现更多匿名浏览。

最近，Brave 还推出了电子邮件服务，你可以直接从浏览器访问邮件。此外，它具备一些 Firefox 、 Chrome 以及 Safari 所没有的优点。

在 Ubuntu 终端上安装这款浏览器需要额外的命令。你可以 [在此](https://brave.com/linux/#release-channel-installation) 找到相信的下载教程。

更多详细信息，请浏览官方 [主页](https://brave.com) 。

### Mailspring

如果你在找一款好用并高效的 Linux 桌面电子邮件客户端，并且想要它支持所有的电子邮件协议，那你应该试试 Mailspring 。

Mailspring 支持多个账户、统一邮箱，并且支持触控和手势。它还支持微软 Office 365 ，这是此电子邮件客户端在 Linux 系统中的最大优势之一。此外，它具有快速检索、翻译、取消发送（邮件召回）以及内置的拼写检查等特征，使得它成为最好的邮件客户端之一。

它还有一个付费版本，只需要每月付出少量费用，即可得到更多功能，例如创建公司简介、链接跟踪、阅读回执、模板和洞察力功能。专业版中的洞察力功能提供了你在一天中何时收到更多电子邮件的详细信息。

这款应用可以通过 Snap 和 Deb 文件在 Ubuntu 或其他相关 Linux 上安装。

访问官方 [Snapcraft 页面](https://snapcraft.io/mailspring) 获取 Snap 包并安装。

点击 [这里](https://updates.getmailspring.com/download?platform=linuxDeb) 下载 deb 包。下载后，你可以双击 deb 文件通过 Ubuntu 应用商店程序安装。

浏览以下链接了解 Mailspring 更多信息：

* [主页](https://getmailspring.com/)
* [其他下载选项](https://getmailspring.com/download)（Fedora Linux、Windows 以及 macOS）

### Blender

我肯定你听说过 Blender 。 Blender 是一款自由开源的专业级图形设计软件，几乎可以完成你的图形项目的一切需求。

你可以创建动画电影、视觉效果、艺术作品、3D 打印模型、动态图形、交互式 3D 应用程序和计算机游戏。 Blender 的功能包括 3D 建模、UV 展开、贴图、光栅图形编辑、套索和蒙皮、流体和烟雾模拟、粒子模拟、柔体模拟、雕刻、动画、匹配移动、渲染、运动图形、视频编辑和合成。

它是一个专业级的应用程序，还是自由开源的。

想要在 Ubuntu 中轻松安装，打开应用商店，搜索 Blender，然后点击安装。或者，你也可以打开终端窗口并运行以下命令进行安装。

```
sudo apt install blender

```

该软件适用于 Windows、macOS 和其他平台。你可以访问 [官方下载页面](https://www.blender.org/download/) 了解更多详情。

浏览以下链接了解 Blender 更多信息：

* [主页](https://www.blender.org/)
* [详细功能亮点](https://www.blender.org/features/)
* [文档](https://www.blender.org/get-involved/documenters/)

### Ungoogled Chromium

如果你想要一个没有谷歌的应用和服务的干净浏览器，你应该试试 Ungoogled Chromium 浏览器。它是一个没有谷歌集成服务的，提供了原装 Chromium 体验的替代品。

例如，它去除了代码中的所有预编译二进制文件和所有谷歌集成，并且还禁用了需要手动启用的功能，以获得更好控制。

或许一个合适的浏览器，才会有最好的 Chromium 体验。

使用 Flatpak 安装 Ungoogled Chromium 很容易。首先设置 [Flatpak](https://www.debugpoint.com/how-to-install-flatpak-apps-ubuntu-linux/) 然后使用下列命令安装该浏览器：

```
flatpak install flathub com.github.Eloston.UngoogledChromium

```

浏览 [官方 GitHub 页面](https://github.com/ungoogled-software/ungoogled-chromium#feature-overview) 获取该浏览器更多信息。

### Tilix

必备 Ubuntu 应用程序列表中的最后一个应用程序是 Tilix 。Tilix 是一个基于 GTK 的，平铺式的终端仿真器。它带有自定义标题、以及通知支持（用于命令补完）和透明背景图像支持。此外，Tilix 还允许你在终端窗口中添加自定义图像背景。最后，你可以在一个窗口中并排创建多个终端窗口。

这是一个用 GTK 编写的高级终端，你可能会发现它很有用。

所有 Linux 发行版上都有它的安装包。在 Ubuntu 或相关发行版，运行以下命令进行安装：

```
sudo apt install tilix

```

更多信息请浏览 Tilix [主页](https://gnunn1.github.io/tilix-web/) 。

### 结语

这是 2022 年 5 篇系列的必备 Ubuntu 应用程序的第 3 篇。我希望你能够在 Ubuntu 或者其他 Linux 发行版上安装，并在你的日常工作中使用这些应用程序。同时，欢迎在下方评论，让我知道你最喜欢哪一款应用。

最后，请继续关注本 Ubuntu 应用程序系列的第 4 部分。

干杯！

*一些图片来源：令人尊敬的应用开发人员或团队*

---

via: <https://www.debugpoint.com/necessary-ubuntu-apps-2022>

作者：[Arindam](https://www.debugpoint.com/author/admin1/) 选题：[lkxed](https://github.com/lkxed) 译者：[Donkey](https://github.com/Donkey-Hao) 校对：[wxy](https://github.com/wxy)

本文由 [LCTT](https://github.com/LCTT/TranslateProject) 原创编译，[Linux中国](https://linux.cn/) 荣誉推出


硬核观察 #701 FSF 仍坚持使用古老而自由的服务器硬件

Summary: • FSF 仍坚持使用古老而自由的服务器硬件 • 各国程序员平均年薪，美国第一，中国仅相当于美国的 1/5 • Fedora 37 有望装备基于网页的全新 Anaconda 安装程序

1美元=6.75 人民币

# 硬核观察 #701 FSF 仍坚持使用古老而自由的服务器硬件

### FSF 仍坚持使用古老而自由的服务器硬件

自由硬件日益稀缺，但自由软件基金会（FSF）仍然在坚持其理念，它的服务器配置都相当古老，因为新一代的硬件都含有非自由的私有固件。FSF 最近表示它更换了最后一台运行非自由 BIOS 的机器。目前它有两个数据中心和逾百个虚拟机。英特尔和 AMD 在 2013 年之后发售的 CPU 都不支持自由 BIOS。这些 CPU 都会在 BIOS 中安装私有固件，如英特尔管理引擎（IME）。这些 CPU 也会拒绝运行未经过 AMD 和英特尔私钥加密签名的固件，而他们只会签名自己的非自由固件。

>
> **[消息来源：FSF](https://www.fsf.org/blogs/sysadmin/closing-in-on-fully-free-bioses-with-the-fsf-tech-team)**
>
>
>

>
> 老王点评：从自由软件和开源软件两个略有分歧的路线开始，现在看起来开源软件越来越广泛，而自由软件面临的局面越来越艰难了。因为，那些“拥抱”开源的企业发现，开源对他们是有利的，而自由软件则不是。
>
>
>

### 各国程序员平均年薪，美国第一，中国仅相当于美国的 1/5

一家招聘平台统计分析了 20 多个国家的软件开发者在 2022 年的薪资状况，并列出了排名数据。据统计，2022 年年薪最高的三个国家为：美国（11 万美元）、瑞士（9.8 万美元）和以色列（7.2 万美元）。而中国为 2.4 万美元，约折合人民币 16 万，仅相当于美国程序员平均收入的 21.6%。就全球使用的编程语言而言，Golang 和 Python 语言薪酬最高，PHP、JavaScript 语言最低。

>
> **[消息来源：Code Submit](https://codesubmit.io/blog/software-engineer-salary-by-country/)**
>
>
>

>
> 老王点评：今天正好在朋友圈看到一位朋友的信息，曾经的一位专业的 IT 女工程师，去跳槽到一家做减肥的微商公司。不由得感慨，在中国做 IT 真是艰难啊。不过，之前我们发过的另外一个消息显示，美国对 IT 专家的缺口很大，以至于业界要求政府加强计算机教育。
>
>
>

### Fedora 37 有望装备基于网页的全新 Anaconda 安装程序

在今年早些时候，红帽公司宣布正在为 RHEL/Fedora 的 Anaconda 安装器开发全新基于网页的用户界面。即将于今年秋季发布的 Fedora 37 虽然会保留基于 GTK 的 Anaconda 安装器，但也会提供下一代基于网页的 Anaconda 安装器，带来全新的界面和安装体验。全新的界面更加现代化，未来将会彻底替代现有基于 GTK 的 Anaconda 安装器。

>
> **[消息来源：Phoronix](https://www.phoronix.com/scan.php?page=news_item&px=Fedora-37-WebUI-Install-Preview)**
>
>
>

>
> 老王点评：这倒是不错，其实采用网页可以有更丰富的表现力和功能。
>
>
>


如何默认启动到 Linux 系统的旧内核

Summary: 高兴之余你会觉得有点儿不爽。因为你不得不在每次启动时手动选择较旧的内核。

高兴之余你会觉得有点儿不爽。因为你不得不在每次启动时手动选择较旧的内核。

# 如何默认启动到 Linux 系统的旧内核

这是一个可能的情景。你的系统收到了内核更新，但不知何故，事情不像以前那样顺利。

你意识到，如果你启动到较旧的内核（是的，你可以降级内核），一切都会恢复正常。

高兴之余你会觉得有点儿不爽。因为你不得不在每次启动时手动选择较旧的内核。

一位年长的读者遇到了这个问题。[Linux Mint](https://linuxmint.com/) 中的新内核更新没有按预期工作。启动到较旧的内核“修复”了问题，但麻烦的是在每次启动时要去手动选择较旧的内核。

删除新内核而使用旧内核不是一个好主意，因为新内核将会在下一次系统更新时被安装使用。

因此，我建议设置成默认启动到较旧的 Linux 内核。怎么做？这就是我将在本教程中向你展示的内容。

### 启动至较旧的 Linux 内核

你可能不了解，你的 Linux 发行版会在你的系统上安装多个 Linux 内核。不信？使用以下命令 [列出 Ubuntu 中已安装的内核](https://learnubuntu.com/list-installed-kernels/)：

```
apt list --installed | grep linux-image

```

当你升级系统时会获得一个新版本的内核，这时你的系统会自动选择启动至最新的可用内核。

在 [grub](https://itsfoss.com/what-is-grub/) 屏幕中，你可以转到<ruby> 高级选项 <rt>  Advanced option </rt></ruby>（较旧的 Linux 版本）：

在这里，你可以看到要启动的可用内核。选择较旧的（不带<ruby> 恢复选项 <rt>  recovery option </rt></ruby> 的条目）：

你不会注意到任何显示的差异。你的文件和应用程序保持不变。

现在你已经启动到旧内核，是时候让你的系统自动启动到它了。

### 使旧内核成为默认启动项

如果你乐于使用 Linux 终端和命令，你可以修改 `/etc/default/grub` 文件并在其中添加以下行：

```
GRUB_DEFAULT=saved
GRUB_SAVEDEFAULT=true

```

然后使用如下命令 [更新 GRUB](https://itsfoss.com/update-grub/)：

```
sudo update-grub

```

你在这里所做的是告诉你的系统将当前使用的启动项保存为将来运行 GRUB 的默认启动项。

然而，并不是每个人都善于使用命令行，因此我将专注于一个名为 [Grub Customizer](https://itsfoss.com/customize-grub-linux/) 的 GUI 工具。

#### 安装 Grub Customizer

使用官方 PPA [在基于 Ubuntu 的发行版中安装 Grub Customizer](https://itsfoss.com/install-grub-customizer-ubuntu/)：

```
sudo add-apt-repository ppa:danielrichter2007/grub-customizer
sudo apt update
sudo apt install grub-customizer

```

对于其他发行版，请使用你的包管理器来安装此工具。

#### 使用 Grub Customizer 更改默认启动项

当你运行 Grub Customizer 时，它会显示可用的启动项。

在这里你有两个选择。

**选择一：** 选择所需的内核项并使用箭头按钮（显示在顶部菜单上）将其向上移动。

**选择二：** 将<ruby> 先前的启动项 <rt>  previously booted entry </rt></ruby>设为<ruby> 默认启动项 <rt>  default entry </rt></ruby>。

我建议使用第二个选择，因为即使有新的内核更新它也可以工作。

这样你就可以在 Ubuntu 或其他发行版中降级内核，甚至无需删除新内核版本。

请注意，像 Ubuntu 这样的发行版大部分一次只保留两个内核版本。因此，最终你首选的旧内核将在新的内核版本释出时被删除。

这个巧妙的技巧曾助我脱困。当时我 [在 Ubuntu 中安装最新的 Linux 内核](https://itsfoss.com/upgrade-linux-kernel-ubuntu/) ，由于某种原因它与我的音频系统有些兼容问题。

无论是什么原因，你现在都知道如何自动启动到旧内核。

如果有问题或建议，请在评论区留言。

---

via: <https://itsfoss.com/boot-older-kernel-default/>

作者：[Abhishek Prakash](https://itsfoss.com/author/abhishek/) 选题：[lkxed](https://github.com/lkxed) 译者：[hanszhao80](https://github.com/hanszhao80) 校对：[wxy](https://github.com/wxy)

本文由 [LCTT](https://github.com/LCTT/TranslateProject) 原创编译，[Linux中国](https://linux.cn/) 荣誉推出


自由软件基金会执行董事 Zoë Kooyman 专访

Summary: 了解一下自由软件基金会（FSF）。

了解一下自由软件基金会（FSF）。

# 自由软件基金会执行董事 Zoë Kooyman 专访

<img src="content_image/album_202207_19_151615wnr8m4l8yotr6hp8.jpg" alt="" title="">

>
> 了解一下自由软件基金会（FSF）。
>
>
>

早在 1985 年，[自由软件基金会](https://www.fsf.org/)（FSF）就开始提倡源代码共享的理念，并从此打响了为计算机用户和开发者捍卫权利的斗争。FSF 认为，用“<ruby> 开放 <rt>  Open </rt></ruby>”和“<ruby> 封闭 <rt>  Closed </rt></ruby>”这两个词来划分软件，十分具有局限性；于是，在为程序分类时，转而使用了以下词语：*尊重自由*（这个“<ruby> 自由 <rt>  free </rt></ruby>”或这个“<ruby> 自由 <rt>  Libre </rt></ruby>”）或*践踏自由*（“<ruby> 非自由 <rt>  non-free </rt></ruby>”或“<ruby> 专有 <rt>  proprietary </rt></ruby>”）。不管用语如何，关键之处在于，计算机必须受用户控制，而不是任由开发了计算机软件的公司来摆布。正因如此，GNU 工程、Linux 内核、[Freedesktop.org](http://Freedesktop.org) 等众多自由软件项目，才会如此重要。

最近，FSF 新上任了一位执行董事，她叫 Zoë Kooyman。我初见 Zoë 时，是在 2019 年的一个 [All Things Open](https://www.allthingsopen.org/) 大会上。当然，那个时候她还不是 FSF 的执行董事，不过已经在管理 FSF 不断增长的重大活动了 —— 包括 [LibrePlant](https://libreplanet.org)。她之前递给我了一份自由软件作者的名单，名单长得一眼望不尽，而且那些软件都是我*每天*在用的。由此，我也很受她那充沛的精力和诚恳的态度所打动。我只是偶然参加了一次 FSF 的聚会，但最后却和那些人成了朋友。是他们让我的数字生活有了意义，是他们保障了我能够拥有 Zoë 和 FSF 所说的 [四项基本自由](https://www.gnu.org/philosophy/free-sw.en.html)：

* 无论用户出于何种目的，用户必须可以按照自己的意愿，自由地运行该软件（自由之零）。
* 用户可以自由地学习并修改该软件，使它按照你的意愿进行计算（自由之一）。作为前提，用户必须可以得到该软件的源代码。
* 用户可以自由地分发该软件的副本，这样就可以帮助别人（自由之二）。
* 用户可以自由地分发该软件修改后的副本（自由之三）。借此，用户可以把改进后的软件分享给整个社区，令他人也从中受益。作为前提，用户必须可以得到该软件的源代码。

听说了 Zoë 受任为执行董事后，我给她发了一封邮件，提出想和她进行一次采访。她十分热心，在百忙之中抽出了一点时间来和我畅谈。

**Seth Kenlon：你当上 FSF 的执行董事了！你是怎么走到今天的呢？**

**Zoë Kooyman：** 在我的工作生涯中，我最开始是一位活动组织者。我环游世界，举办着一些世界上最大的音乐节目。在不断变更的地点、各具特色的文化中工作，是十分有趣的，因为不管是演出、技艺还是别的现场元素，所有各异的制作元素都结合在一起了。让一切事物都在恰当时候安排到位，就像是耍杂技一样。很多时候，我都是在不同的国家生活和工作。多亏了我的工作，我才能学到这么多的组织和交流的技巧。我也对不同形式的媒体有过研究和工作，了解它们的体验，以及它们与社会的关系。

大学时期，我第一次了解到了“<ruby> 左版 <rt>  copyleft </rt></ruby>”（LCTT 译注：与<ruby> 版权 <rt>  copyright </rt></ruby>相对。是一种分享软件的思想和方法；简而言之，其目的是保障一款软件对其每一位接收者来说都是自由的），它是关于我们如何才能使用现有的结构来造福自己，并推动变革的。也正是在那时，媒体（以及互联网和软件）的格局开始迅速变化，而这种变化却是以自由为代价的。搬到美国后，我的生活变了许多。在美国，我对社会责任问题有了更加强烈的紧迫感，因此我决定为此付诸行动。我很感激 John Sullivan（时任 FSF 执行董事），他根据我对自由软件的了解以及我在活动组织方面的经验聘任了我，由此我也得以把这两方面的能力结合到一起。

**Seth：你是如何了解到自由软件的？**

**Zoë：** 我们常常会觉得，自由软件主要影响的是懂技术的人。但是，自由软件运动的目的是捍卫每一位计算机用户的自由。其实，软件自由影响着边缘化社区（LCTT 译注：因条件受限或受到排斥等，落后于主流社会的发展，而被置于社会边缘的群体）的成员，他们很少有机会使用计算机。而软件也塑造了他们的生活。

GNU 工程和左版的概念所取得的成就是十分卓越的。去真正观察社会发展的方向，然后说：“不一定非得那样才行，我们可以把事情掌握在自己手中。”这在早期改变了我的人生观。我开始有了一种想法，把现有的材料用起来，再把它重新引入不同的亚文化之中。在娱乐行业，这已是家常便饭。从他人的作品中得到灵感，并基于此创造新的作品，其结果就是对我们所处时代的反映，同时也是对历史的致敬。没有这般自由，也不会有真正的进步。

谈谈我对电影版权的看法吧。我曾经与荷兰电影研究所合作，做了一个由许多“孤立的电影片段”组合而成的混剪。然后，在一次有几千名年轻人参加的大型舞蹈活动中，那个混剪就在一个 170 米的全景屏幕上播放了，而且还有现场 DJ 在配合演奏。他们之后也经常在别的活动中播放它，比如说荷兰的 <ruby> 博物馆之夜 <rt>  Museumnacht </rt></ruby>。

我并不懂技术，于是我通过文化来表达了这些观点。但这些年来，我越来越多地接触到了自由软件的思想。我于是意识到，随着软件不断融入我们的生活（有时还是身体），为自由软件而战的重要性正日益凸显。在当今的世界，专有软件处于称霸地位，我们社会的发展呈现出以利益驱动、为少数人着想的趋势，而这种趋势是以多数人的自由为代价的。如果没有自由软件，生活中的许多方面、社会的许多重要事业，就不可能真正取得成功。

**Seth：** 你是什么时候加入 FSF 的？

**Zoë：** 在 2019 年初，LibrePlanet 最后一期现场版的前一周（LCTT 译注：LibrePlant 之后因为疫情而改成了线上活动）。

**Seth：** 是什么吸引了你去担任执行董事这一职位？

**Zoë：** FSF 只是一个致力于让社会更加公平、更加协作、更加理解软件的组织，但它长期以来一直是这场运动的核心。社会正在迅速变化，而许多人却还没准备好如何应对当今社会的数字产物，例如软件。这是一项十分重要的工作，但是去做这项工作的人还是太少了。能有一个组织来应对未来的各种挑战，这是十分重要的。

执行董事这一职位，在某种程度上，不过是辅助工作人员和社区的角色，好让他们为自由软件作出关键的改变。我相信，我们继续传播自由软件的思想，是非常重要的；并且，有了 FSF 的团队协助，我也相信，我能利用好工作在不同文化和人群中的经验，以及组织高挑战性的全球项目的经验，来使我们发挥出最大的潜能。我的这项决定，得到了来自工作人员、管理层和社区和董事会的支持，由此我相信，这个决定是正确的。

**Seth：** 你认为当今的软件自由，面临的最大的挑战是什么？FSF 在应对这些挑战的时候，应该承担怎样的使命？

**Zoë：** 随着软件越来越多地融入了社会的基本结构，软件也更加无形了。如今，软件的存在是如此的广泛，我们却习惯性地忽视它。我们只关注着程序的功能，却无视了实现这种功能的手段，更别说它尊不尊重你作为一位用户的自由了。而与此同时，软件又比以往任何时候都更快的扩散。如果人们无法理解程序是如何构成的，而只是整天地用着这些程序，那我们该怎么向他们解释，他们正遭受着不公呢？

FSF 的职责就是，让每个人重新谈起用户自由，并提醒人们，我们所使用的工具并没有那么好。因此，教育行业和政府的认可是十分重要的。如果我们让人们关注软件自由在这些领域的问题，那我们必将取得成效。通过教育，我们可以确保后代也有选择自由的权利；而政府采用自由软件，可以保护公民免遭专有软件的不正影响（维护数字主权）。

我们可以告诉人们，当今社会给我们灌输了错误的观点：你的自由受到侵犯是正常的，毕竟事情“太复杂，你理解不了”。如果你想要图个便利，想要相互联系，或者就是想要满足你的需求，那你就得相信这些组织，按照他们的意愿来。这是不对的。我们整个社区都相信，我们能构建一个无需抛弃自由也能处在其中的社会。并且我们也有这样的法律框架来支持我们的观点。每天，不同背景、不同能力的人都加入我们的对话，越来越多的人关心自己的自由，并且每个人都是出于真心的。我们每天都在学习如何去保护自己以及他人，并且我也希望，未来能够更加自由。

---

via: <https://opensource.com/article/22/7/meet-fsf-executive-director-zoe-kooyman>

作者：[Seth Kenlon](https://opensource.com/users/seth) 选题：[lkxed](https://github.com/lkxed) 译者：[Peaksol](https://github.com/TravinDreek) 校对：[wxy](https://github.com/wxy)

本文由 [LCTT](https://github.com/LCTT/TranslateProject) 原创编译，[Linux中国](https://linux.cn/) 荣誉推出


Summary: • Cutefish OS 倒下几个月之后，被全球开源社区注意到了 • 因无法找到合适的供应商，字节跳动考虑自研芯片 • 新一代龙芯 3 号配套桥片发布，内部集成自研 GPU

cutefish是真的漂亮。注册过论坛，但没怎么逛。

很好奇现在的龙芯是哪家厂子制造的？是中芯国际吗？

# 硬核观察 #702 Cutefish OS 倒下几个月之后，被全球开源社区注意到了

### Cutefish OS 倒下几个月之后，被全球开源社区注意到了

4 月份的时候，ZDNet 称其测试版为“你将使用的最可爱的 Linux 发行版”，称赞这个精雕细琢的基于 Debian 的 Cutefish OS “难以置信的优雅”，带有类似于 MacOS 的整洁的桌面。而我们 [早已知道](/article-14613-1.html)，这个由国内团队开发的桌面，已经失联一段时间了。有一些爱好者发起了复刻 Cutefish DE 的行动。而现在，国际开源社区也注意到了这一情况，并已经有一些社区在努力了。比如 OpenMandriva 试图给他们的发行版增加一个 Cutefish DE 桌面环境；Arch Linux 社区也有了独立的 Cutefish DE 软件包。

>
> **[消息来源：Debug Point](https://www.debugpoint.com/cutefish-os-development-halts/)**
>
>
>

>
> 老王点评：希望可以有一个正式的继承者可以接管 Cutefish DE 的遗产，让更多的贡献者可以加入其中。
>
>
>

### 因无法找到合适的供应商，字节跳动考虑自研芯片

字节跳动公司发言人今天证实，该公司正在探索可供自身在专业领域使用的芯片设计，因为该公司无法找到能够满足其要求的供应商。这些芯片将用来处理该公司在多个业务领域的相关工作负荷，包括视频平台、信息和娱乐应用。此举标志着字节跳动将加入一系列研发半导体的中国互联网巨头行列。过去几年，包括百度、阿里巴巴在内的许多公司都发布了自己设计的芯片。不过，他们仍需要台积电等代工商来帮助其生产芯片。字节跳动还表示，不会将其芯片销售给其他公司。

>
> **[消息来源：凤凰网科技](https://tech.ifeng.com/c/8HlsVxd9dPn)**
>
>
>

>
> 老王点评：似乎所有到了一定规模的 IT 公司，都需要将触角延伸到更深入的基础架构里，才能保持竞争力。不过，我觉得可能他们的计划更深远。
>
>
>

### 新一代龙芯 3 号配套桥片发布，内部集成自研 GPU

龙芯中科宣布，新一代龙芯 3 号系列处理器的配套桥片龙芯 7A2000 正式发布！相较于前一代产品，该芯片的高速 I/O 接口达到市场主流水平，并内置自研 GPU 核心，可形成独显方案，极大降低系统成本。“桥片”是板卡中连接 CPU 与外围接口/外设扩展接口的芯片，一侧与 CPU 直接进行数据交换，另一侧与硬盘、网络、显示等外设进行通讯。龙芯 7A2000 集成了 PCIE 3.0、SATA 3.0、USB 3.0/2.0 等接口，可为龙芯处理器提供丰富的南北桥功能。

>
> **[消息来源：通信世界网](http://www.cww.net.cn/article?id=565499)**
>
>
>

>
> 老王点评：龙芯的进步还是值得点赞的。
>
>
>


初级：如何在 Arch Linux 中安装 Yay AUR 助手

我还是喜欢用paru，感觉比yay更强大~

没有全组件软件包的本地源系统，很让人在没有网络的时候（被QIANG）抓狂！！！

没有全组件软件包的本地源系统，很让人在没有网络的时候（被QIANG）抓狂！！！

没有全组件软件包的本地源系统，很让人在没有网络的时候（被QIANG）抓狂！！！

pacman -Syyu

pacman -S yay

这个要分两行写的，虽然是小错误，但是对新手太不友好了。

谢谢，是笔误。

# 初级：如何在 Arch Linux 中安装 Yay AUR 助手

>
> 这个初学者指南解释了在 Arch Linux 中安装 Yay AUR 助手的步骤。
>
>
>

Yay 是 “Yet Another Yogurt” 的缩写（LCTT 校注：Yogurt 是另外一个已经停止维护的 AUR 助手）。从技术上讲，它是用 [Go 编程语言](https://golang.org/) 编写的 [pacman](https://wiki.archlinux.org/index.php/pacman) 封装器和 AUR 助手。它是当今最流行的 [Arch 用户仓库（AUR）](https://wiki.archlinux.org/index.php/Arch_User_Repository) 助手。使用 Yay，你可以利用庞大的 Arch 用户软件包库并轻松编译和安装任何软件。

它可以自动执行许多包管理任务，例如搜索、动态解决依赖关系、编译和构建包，当然还有在 AUR 发布包。

让我们看看如何在 Arch Linux 或任何基于 Arch 的发行版（如 Manjaro）中安装 Yay。安装 Arch Linux 后，你可以通过 pacman 包管理器从三个主要的 Arch 官方仓库安装包。但是在全新的 Arch Linux 安装后，默认情况下不会安装 Yay。因此，你需要手动安装它以利用 AUR。

本指南涵盖以下主题：

* 在 Arch Linux 中安装 Yay
* 在 Manjaro 中安装 Yay
* 如何在 Arch Linux 和 Manjaro 中使用 Yay 安装包
* 一些 Yay 的技巧

### 在 Arch Linux 中安装 Yay

#### 先决条件

打开终端并运行以下命令。出现提示时提供管理员密码。这些步骤需要 [base-devel](https://aur.archlinux.org/packages/meta-group-base-devel/) 包和 git 包进行编译和安装。

```
sudo pacman -S base-devel

```

```
sudo pacman -S git

```

#### 安装 Yay

`yay` 包在 Arch 仓库中有两个版本，如下所示。

* [yay](https://aur.archlinux.org/packages/yay/) – 稳定版
* [yay-git](https://aur.archlinux.org/packages/yay-git/)– 开发版

对于本指南，我使用了稳定版。现在，进入 `/opt` 目录并克隆 git 仓库。

```
cd /opt
sudo git clone https://aur.archlinux.org/yay.git

```

更改源目录的所有者。将 `debugpoint` 替换为你的用户名。

```
sudo chown -R debugpoint:users ./yay

```

如果你不知道用户或组，可以使用以下示例查找用户和组。

```
id debugpoint

```

进入目录并编译。

```
cd yay

```

```
makepkg -si

```

这样就完成了 Arch Linux 中 Yay 的安装。

### 在 Manjaro 中安装 Yay

如果你使用 Manjaro Linux，`yay` 包可以在社区仓库中找到。你可以在 Manjaro 中使用以下命令轻松安装。

```
pacman -Syyu
pacman -S yay

```

现在，让我们看看如何使用 Yay 安装任何软件包，以及一些基本的 `yay` 用法。

### 如何使用 Yay 安装包

首先在 AUR 网站上搜索安装任何应用以获取包名。例如，要安装 [featherpad](https://aur.archlinux.org/packages/featherpad-git/) 文本编辑器，请运行以下命令。

```
yay -S featherpad

```

安装后，你可以在应用菜单中找到应用启动器。

### 一些 Yay 的技巧

你还可以使用 yay 进行许多调整和系统操作。下面是一些示例。

**刷新系统包并升级**：

```
yay -Syu

```

**使用包的开发版本并升级（运行此命令时要小心）**：

```
yay -Syu --devel --timeupdate

```

**删除任何包（例如，featherpad）**：

```
yay -Rns featherpad

```

**快速获取系统统计信息**：

```
yay -Ps

```

我希望这个初学者指南能帮助你在 [Arch Linux](https://www.debugpoint.com/tag/arch-linux/) 中安装 Yay，然后使用 Yay 安装包，并执行不同的系统操作。

---

via: <https://www.debugpoint.com/install-yay-arch/>

作者：[Arindam](https://www.debugpoint.com/author/admin1/) 选题：[lkxed](https://github.com/lkxed) 译者：[geekpi](https://github.com/geekpi) 校对：[wxy](https://github.com/wxy)

本文由 [LCTT](https://github.com/LCTT/TranslateProject) 原创编译，[Linux中国](https://linux.cn/) 荣誉推出


如何使用 FreeDOS Edit

# 如何使用 FreeDOS Edit

>
> FreeDOS 提供了一个叫做 FreeDOS Edit 的用户友好的文本编辑器。
>
>
>

在任何操作系统中，编辑文件都是一项常有的任务。当你想去做一个某事的笔记、写封信给朋友或升级一个系统配置 —— 你需要一个文本编辑器。FreeDOS 提供了一个用户友好的文本编辑器（也许没啥想象力）叫做 “FreeDOS Edit”。

### 编辑文件

最简单的启用 FreeDOS Edit 的方式就就是输入 `EDIT`。它提供一个空的编辑器窗口。图案背景显示为一个空的“桌面”——提醒你没有编辑任何文件。

就像多数 DOS 应用程序一样，你可以按下你键盘上的 `Alt` 键来访问 Edit 的菜单。这就激活了这个菜单。在你按下 `Alt` 后，Edit 将切换到“菜单”访问方式，并高亮 “<ruby> 文件 <rt>  File </rt></ruby>” 菜单。如果你想要访问菜单栏上的一个不同的菜单，可以使用左右方向键。按向下的方向键并按下回车键来“进入”菜单。

你注意到所有菜单标题的第一个字母是不同的颜色么？这种高亮字母显示了一种快捷方式。例如，“<ruby> 文件 <rt>  File </rt></ruby>”菜单的“F”高亮为红色。所以你可以按下 `Alt+F`（`Alt` 和 `F` 同时按下），Edit 会显示“<ruby> 文件 <rt>  File </rt></ruby>”菜单。

你可以使用“<ruby> 文件 <rt>  File </rt></ruby>”菜单来开始一个新的（空）文件，或打开一个存在的文件。让我们开始一个新文件，使用方向键移动到“<ruby> 新建 <rt>  New </rt></ruby>“然后按下回车键。你也可以用 `Ctrl+N` （`Ctrl` 和 `N` 同时按下）打开一个新文件。

此后，编辑文件应该非常简单。大多数熟悉的快捷键都可以在 FreeDOS Edit 中使用：`Ctrl+C` 复制文本，`Ctrl+X` 剪贴文本，和 `Ctrl+V` 将复制的或剪贴的文本粘贴到新的地方。如果你需要在一个长文档中寻找一个特殊文本，按下 `Ctrl+F`。保存你的工作成果，请使用 `Ctrl+S` 以将变更提交到硬盘。

### 在 Edit 中编程

如果你是个程序员，你也许会发现扩展的 ASCII 表是一个有用的工具。DOS 系统支持“拓展的” ASCII字符集，通常被称之为“代码页 437”。0 到 127 的标准字符包括字母 A 到 Z（大写和小写）、数字和特殊字符，如标点符号。但是，从 128 到 255 的 DOS 拓展字符包括其它语言字符和“画线”元素。DOS 程序员有时需要使用这些拓展 ASCII 字符，所以 FreeDOS Edit 可以很容易地查看所有 ASCII 码和它们的相关字符的表格。

要查看这个 ASCII 表，请使用“<ruby> 工具 <rt>  Utilities </rt></ruby>”菜单，选择“<ruby> ASCII 表 <rt>  ASCII Table </rt></ruby>”菜单项，这将显示一个包含该表格的窗口。

沿着左边，这张表显示十六进制值“00”到“F0”，顶部展示了单一值“0”到“F”。这些为每个字符的十六进制代码提供了一个快速参考。例如，第一行（00）和第一列（0）中的项目具有十六进制值 00 + 0，即0x00（“NULL”值）。而第五行（40）和第二列（1）中的字符，其数值为 40 + 1，即 0x41（字母 “A”）。

当你在表格内移动光标高亮不同的字符时，你会看到表格底部的值发生变化，展示了字符的十进制、十六进制和八进制编码。例如，移动光标以高亮在 C0 行和第 5 列的“行交叉”字符，显示这个扩展字符的代码为 197（十进制）、0xc5（十六进制）和 305（八进制）。在一个程序中，你可以通过输入十六进制值 0xc5 或八进制“转义代码” \305 来引用这个扩展字符。

请随意浏览 Edit 中的菜单，以发现其他不错的功能。例如，“<ruby> 选项 <rt>  Options </rt></ruby>”菜单允许你更改 Edit 的行为和外观。如果你喜欢使用更密集的显示，可以使用“<ruby> 显示 <rt>  Display </rt></ruby>”菜单（在“<ruby> 选项 <rt>  Options </rt></ruby>”下）将 Edit 设置为 25、43 或 50 行。你还可以强制 Edit 以单色（黑底白字）或反转模式（白底黑字）显示。

（文内图片来自 Jim Hall，CC-BY SA 4.0）

---

via: <https://opensource.com/article/21/6/freedos-text-editor>

作者：[Jim Hall](https://opensource.com/users/jim-hall) 选题：[lujun9972](https://github.com/lujun9972) 译者：[yjacks](https://github.com/yjacks) 校对：[wxy](https://github.com/wxy)

本文由 [LCTT](https://github.com/LCTT/TranslateProject) 原创编译，[Linux中国](https://linux.cn/) 荣誉推出


硬核观察 #703 Firefox 将支持在地址栏上直接输入命令

Summary: • Firefox 将支持在地址栏上直接输入命令 • 微软再次调整销售开源软件的商店政策 • 谷歌和甲骨文的云服务因英国高温天气而下线

# 硬核观察 #703 Firefox 将支持在地址栏上直接输入命令

### Firefox 将支持在地址栏上直接输入命令

Firefox 浏览器即将引入名为 “Quick Actions” 的功能。用户可以在地址栏上直接输入命令，例如“查看页面源代码”、“打开浏览器设置”等等。Quick Actions 可以加速 Firefox 的某些操作，协助用户通过地址栏执行各项任务。而谷歌在 2020 年就为 Chrome 浏览器引入了该功能，用户可以直接在地址栏上输入并执行“管理密码”、“清除浏览数据”、“翻译页面”等命令。

>
> **[消息来源：gHacks](https://www.ghacks.net/2022/07/19/mozilla-is-testing-quick-actions-in-firefoxs-address-bar/)**
>
>
>

>
> 老王点评：我居然不知道 Chrome 早有这样的功能？不知道你们有没有感觉，Chrome 很多功能和特性都是悄悄出现的，悄悄消失的，很多时候我们都并不知道。或许每次浏览器升级时给个几秒钟的快速指引比较好。
>
>
>

### 微软再次调整销售开源软件的商店政策

微软上个月更新了它的应用商店规则，加入了一条“不要试图从开源或其他通常免费提供的软件中获利，也不要试图相对于产品提供的特性和功能定价过高”。微软的初衷被认为是善意的，旨在遏制重新打包免费的自由及开源软件将其变成付费软件的行为。然而自由及开源软件许可证并没有禁止此类行为，微软的规定将会影响其应用商店内的所有自由及开源软件。本周微软再次调整了应用商店政策，允许销售可免费获取的自由及开源软件，同时允许用户报告欺诈。

>
> **[消息来源：Solidot](https://www.solidot.org/story?sid=72193)**
>
>
>

>
> 老王点评：这件事上，我想微软或许是善意的，但是动作有点冒失，文案也不够妥当。现在的解决方案比较合适，既允许开源软件卖钱，也允许对冒名者加以管理。
>
>
>

### 谷歌和甲骨文的云服务因英国高温天气而下线

周二英国多地的温度突破了 40 摄氏度，谷歌和甲骨文在英国的数据中心发生了冷却相关的故障。根据 谷歌云的状态报告，其在伦敦的一个数据中心当天 10:13 PDT 发生了冷却故障，十个小时后才完全解决。该故障导致部分虚拟机停止工作，受到影响的网站下线。甲骨文在英国南部的数据中心也因为高温而关闭部分机器，导致客户无法访问或使用托管在当地的云基础设施。

>
> **[消息来源：The Register](https://www.theregister.com/2022/07/19/google_oracle_cloud/)**
>
>
>

>
> 老王点评：这种超乎预料的高温，IDC 这种耗能大户估计建设时就没想到会热的这么离谱。
>
>
>


Linux 下的 Docker 入门教程

Summary: 面向初学者的 Docker 基本命令指南。

太棒了，学到很多！

面向初学者的 Docker 基本命令指南。

# Linux 下的 Docker 入门教程

>
> 面向初学者的 Docker 基本命令指南。
>
>
>

这篇详细的 Docker 教程覆盖了核心的 **Docker 命令**，比如，如何创建新容器、运行容器、删除容器等。另外，这篇教程也解释了如何从已有的容器构建你自己的 Docker 镜像，如何移除容器和镜像。言归正传，现在开始 Docker 的基本用法。

### Docker 安装步骤

大多数现代 Linux 操作系统都可以安装 Docker。如果还没安装过 Docker，请参考下面的步骤：

* 在 AlmaLinux、CentOS、Rocky Linux 上 [安装 Docker Engine 和 Docker Compose](https://ostechnix.com/install-docker-almalinux-centos-rocky-linux/)
* 如何在 Ubuntu 上 [安装 Docker 和 Docker Compose](https://ostechnix.com/install-docker-ubuntu/)

### 什么是 Docker 镜像和 Docker 容器？

在开始 Docker 之前，我先说明一下 Docker 镜像和 Docker 容器是什么。

Docker 镜像是一个描述容器如何运行的的文件，Docker 容器是 Docker 镜像在运行或被终止时的一个阶段。

容器和主机上的其他文件是隔离的。

当我们运行一个 Docker 容器的时候，它会使用一个被隔离出来的文件系统，这个文件系统是由一个 Docker 镜像提供的。Docker 镜像包含了运行应用程序所需要的一切东西 - 所有的依赖、配置、脚本、二进制文件等等。

镜像也包含容器所需要的其他配置项，比如说环境变量、默认运行的命令，以及其他元数据。

### Linux 下的 Docker 入门

下面的所有步骤都已在 Ubuntu 22.04、20.04 以及 18.04 LTS 服务器版本中测试通过。后续小节中提供的步骤对于所有 Linux 平台都是通用的。比如，在基于 RHEL 的系统中（比如 AlmaLinux）可以运行相同的命令。

#### 1、搜索 Docker 镜像

我们可以从叫做 [Docker hub](https://hub.docker.com/) 的 Docker 官方库获得镜像，或者我们也可以制作自己的镜像。

有些人可能不清楚，Docker hub 是一个线上的中心化仓库，Docker 用户们在上面构建、测试、然后保存他们的 Docker 镜像。Docker hub 有数以万计的 Docker 镜像，而且这个数字还在每天增长。

你可以从命令行通过 ``docker search` 命令搜索任意 Docker 镜像。

比如要搜索基于 **Alpine** Linux 的 Docker 镜像，运行：

```
$ sudo docker search alpine

```

输出结果：

搜索基于 **Ubuntu** 的镜像，运行：

```
$ sudo docker search ubuntu

```

你还可以搜索其他任意的应用，比如 **Nginx**，像下面这样：

```
$ sudo docker search nginx

```

Docker hub 有各种各样的镜像。你能在 Docker hub 上找到各种已构建好的 Docker 镜像，比如说操作系统、应用，或者多个应用的合体（比如 LAMP 栈）。

如果你找的东西不在上面，你还可以构建一个镜像，然后通过 Docker hub 向其他人开放，或者只是自己用。

#### 2、下载 Docker 镜像

从终端运行下面的命令可以下载 Ubuntu OS 的 Docker 镜像：

```
$ sudo docker pull ubuntu

```

上面的这个命令会从 Docker hub 下载最新的 Ubuntu 镜像。

输出结果：

```
Using default tag: latest
latest: Pulling from library/ubuntu
405f018f9d1d: Pull complete
Digest: sha256:b6b83d3c331794420340093eb706a6f152d9c1fa51b262d9bf34594887c2c7ac
Status: Downloaded newer image for ubuntu:latest
docker.io/library/ubuntu:latest

```

你也可以用下面的命令下载指定版本的 Ubuntu 镜像：

```
$ sudo docker pull ubuntu:20.04

```

Docker 允许我们下载任何镜像，并且在那个镜像上创建容器，这些操作与主机的操作系统无关。

比如要下载 Alpine 系统的镜像，运行：

```
$ sudo docker pull alpine

```

#### 3、列出 Docker 镜像

所有已下载的 Docker 镜像都保存在 `/var/lib/docker` 路径下。

要查看所有已下载的 Docker 镜像，运行：

```
$ sudo docker images

```

输出结果：

```
REPOSITORY   TAG       IMAGE ID       CREATED       SIZE
ubuntu       latest    27941809078c   3 weeks ago   77.8MB
ubuntu       20.04     20fffa419e3a   3 weeks ago   72.8MB
alpine       latest    e66264b98777   5 weeks ago   5.52MB

```

从上面可以看出来，我已经下载了三个 Docker 镜像 - Ubuntu latest、Ubuntu 20.04 和 Alpine Linux。

现在，我们看一下接下来如何从下载的镜像启动或者运行容器。

#### 4、运行 Docker 容器

有两种方法我们可以启动一个容器 - 使用 Docker 镜像的<ruby> 标签 <rt>  TAG </rt></ruby> 或者 <ruby> 镜像 ID <rt>  Image ID </rt></ruby>。

标签指的是一个特定的镜像快照，<ruby> 镜像 ID <rt>  Image ID </rt></ruby> 是那个镜像对应的唯一识别码。

可以查看下面这个截图：

从上面的解脱可以看到，标签是 `latest` 和 `20.04`。

* `27941809078c` 是 Ubuntu latest 的 Docker 镜像的镜像 ID，
* `20fffa419e3a` 是 Ubuntu 20.04 的 Docker 镜像的镜像 ID，
* 而 `e66264b98777` 是 Alpine latest 的 Docker 镜像的镜像 ID。

##### 4.1、使用标签运行容器

下载选择好的 Docker 镜像后，运行下面的命令来启动 Docker 容器，并且通过它的标签进行连接。

```
$ sudo docker run -t -i ubuntu:latest /bin/bash

```

或者，

```
$ sudo docker run -it ubuntu:latest /bin/bash

```

这里，

* `-t`：在 Ubuntu 容器内分配一个伪终端。
* `-i`：通过从容器获取一个标准输入（STDIN），允许我们创建一个可交互的连接。
* `ubuntu:latest`：标签为 `latest` 的 Ubuntu Docker 镜像。
* `/bin/bash`：新容器的 BASH shell。这个是可选项。如果你不加 shell 的话，会分配默认的 shell 给容器。

启动容器后，会自动进入容器的 shell（命令行）：

基于最新 Ubuntu 镜像的容器现在已经启动了。所有的新容器都会被赋予一个名字和唯一的 ID。从上面的输出可以看到，那个 Ubuntu 容器的 ID 是 `2f2a5b826762`。一会儿我们会看到从哪找到容器的名字。

现在就可以在容器里面工作了。当你完成容器内的工作后，你可以回到主机操作系统的终端（在我这个例子中，操作系统是 Ubuntu 22.04 LTS）而不需要关掉容器（客户机）。

##### 4.2、从运行中的容器中脱离

使用 `CTRL+P` 然后 `CTRL+Q` 就可以从运行中的容器脱离（不需要关闭）。

现在，你就回到了你原来的主机的终端窗口。请注意，容器还在后台运行中，我们并没有关掉它。

##### 4.3、使用镜像 ID 运行容器

另一种启动容器并且连接进去的方式是通过使用镜像 ID，像下面这样：

```
$ sudo docker run -it 20fffa419e3a /bin/bash

```

这里，

* `20fffa419e3a` - 镜像 ID

按 `CTRL+P` 然后 `CTRL+Q` 可以从当前容器中脱离回到主机系统的终端。我们只是从容器中脱离，但是没有让它停止。容器仍然在后台运行中。

##### 4.4. 在脱离模式中运行容器

在前面的小结中，我们启动了一个容器并且立刻连接了进去。然后当容器中的工作结束后，我们从容器中脱离了出来。

你也可以在脱离模式（不需要自动连接进去）中启动容器。

在后台运行一个容器，输入命令：

```
$ sudo docker run -it -d alpine:latest

```

输出结果：

```
d74f2ceb5f3ad2dbddb0b26e372adb14efff91e75e7763418dbd12d1d227129d

```

上面输出结果的前 12 字符代表的是容器的 ID。

通过 `docker ps` 命令，你可以验证容器是否在运行：

```
$ sudo docker ps
CONTAINER ID   IMAGE           COMMAND     CREATED         STATUS         PORTS     NAMES
d74f2ceb5f3a   alpine:latest   "/bin/sh"   3 seconds ago   Up 2 seconds             zen_pascal

```

从上面个的输出结果中可以看到，我们创建了一个 Alpine 容器，但是还没有连接进去。

如果你想连接进去，很简单，运行：

```
$ sudo docker attach d74f2ceb5f3a

```

#### 5、查看运行中的容器

查看运行中的容器，运行下面的命令：

```
$ sudo docker ps

```

输出结果：

```
CONTAINER ID   IMAGE           COMMAND       CREATED          STATUS          PORTS     NAMES
f7e04eed577e   20fffa419e3a    "/bin/bash"   6 minutes ago    Up 6 minutes              brave_mclean
2f2a5b826762   ubuntu:latest   "/bin/bash"   18 minutes ago   Up 18 minutes             hungry_leavitt

```

这里，

* `f7e04eed577e` 是由镜像 `2f2a5b826762` 创建的 Ubuntu 容器的 ID。并且，`brave_mclean` 是这个容器的名字。
* `2f2a5b826762` 是由镜像 “ubuntu：latest” 创建的 Ubuntu 容器的 ID。并且，`hungry_leavitt` 是这个容器的名字。

当一个新容器被创建后，会赋给它一个唯一的 ID 和名字，这样我们就能通过它的 ID 和名字来连接它。

**注意：请注意容器 ID 和 Docker 镜像 ID 是不同的**。

列出所有可用的（运行或者停止）容器，运行：

```
$ sudo docker ps -a

```

#### 6、从运行中的容器脱离或连接

首先，通过 `docker ps` 命令找到容器的 ID。

```
$ sudo docker ps

```

然后，运行 `docker attach` 命令连接到运行中的容器。

```
$ sudo docker attach <container-id>

```

比如像下面这样，我要连接到 ID 为 `f7e04eed577e` 的容器：

```
$ sudo docker attach f7e04eed577e

```

你也可以通过使用它的名字连接到一个容器。

```
$ sudo docker attach brave_mclean

```

现在你就登录到这个容器了。

想要从容器脱离，只要按 `CTRL+P` 然后 `CTRL+Q`。

#### 7、启动、重启、暂停和终止容器

你可以使用容器的名字或 ID 来启动，重启，暂停或者终止一个 Docker 容器。

首先，通过 `docker ps -a` 命令找到容器的名字或 ID。

现在，通过使用 `docker start` 命令，加上名字或 ID，你可以启动一个容器，像下面这样：

```
$ sudo docker start modest_cray

```

```
$ sudo docker start 10615254bb45

```

用空格隔开，就可以**启动多个容器**，像下面这样：

```
$ sudo docker start 24b5ee8c3d3a 56faac6d20ad d74f2ceb5f3a

```

优雅的重启一个运行中的容器，运行：

```
$ sudo docker start 10615254bb45

```

暂停一个运行中的容器：

```
$ sudo docker pause 10615254bb45

```

把暂停的容器恢复过来：

```
$ sudo docker unpause 10615254bb45

```

直到其它容器都停止前，阻塞一个容器：

```
$ sudo docker wait 10615254bb45

```

我们可以很容易地通过使用它的名字或 ID 来终止一个容器。如果你已经在容器的 shell 里了，只需要运行下面的命令就可以非常简单的终止：

```
# exit

```

你也可以使用下面的命令从 Docker 的主机系统中终止（关闭容器）容器：

```
$ sudo docker stop 10615254bb45

```

用空格隔开，你可以退出多个容器，像下面这样。

```
$ sudo docker stop 35b5ee8c3d3a 10615254bb45

```

在退出容器之后，通过列出所有容器的命令来确保它确实被终止了：

```
$ sudo docker ps

```

#### 8、强行关闭 Docker 容器

`docker stop` 命令可以非常优雅的关掉运行中的容器。有时候，你可能卡在一个没有响应的容器，或者你想强制关掉容器。

通过给一个运行中的容器发送 `SIGKILL` 来强行关闭容器，运行：

```
$ sudo docker kill 10615254bb45

```

#### 9、在关闭容器后自动删除他们

也许你想测试一个容器，然后当你完成在容器中的工作就把它删掉。如果是这样，通过使用 `--rm` 标签在关闭后自动删掉容器：

```
$ sudo docker run -it --rm debian:latest

```

当你从容器中退出，它会自动被删掉。

从上面的结果可以看到，我先创建了一个新的 Debian 容器。当我退出这个容器的时候，它就被自动删掉了。`docker ps -a` 命令的输出结果显示，Debian 容器现在不存在。

#### 10、给容器命名

如果你再看一下之前命令的输出结果，当你启动一个容器的时候，每个容器都被赋予了一个随机的名字。如果你不命名你的容器，Docker 会自动替你给他们命名。

现在看一下下面的例子：

```
$ sudo docker run -it -d alpine:latest
2af79e97a825c91bf374b4862b9e7c22fc22acd1598005e8bea3439805ec335d

```

```
$ sudo docker run -it -d alpine:latest
80b53b7e661d33696b65c78267fc3f067b6100799c925910db4721963e3fae0a

```

```
$ sudo docker ps
CONTAINER ID   IMAGE           COMMAND     CREATED         STATUS         PORTS     NAMES
80b53b7e661d   alpine:latest   "/bin/sh"   3 seconds ago   Up 2 seconds             bold_margulis
2af79e97a825   alpine:latest   "/bin/sh"   6 seconds ago   Up 5 seconds             recursing_taussig

```

从上面的结果可以看到，尽管我用同一个 Docker 镜像创建了两个容器，它们获得了不同的 ID 和名字。

如果你想给容器赋一个不变的名字，使用 `--name` 标签，像下面这样：

```
$ sudo docker run -it -d --name ostechnix_alpine alpine:latest

```

上面的命令会在脱离模式中创建一个叫做 `ostechnix_alpine` 的新容器。

我们看一下当前运行的容器列表：

```
$ sudo docker ps

```

输出结果：

```
CONTAINER ID   IMAGE           COMMAND     CREATED         STATUS         PORTS     NAMES
397111fac537   alpine:latest   "/bin/sh"   2 seconds ago   Up 2 seconds             ostechnix_alpine
80b53b7e661d   alpine:latest   "/bin/sh"   7 minutes ago   Up 7 minutes             bold_margulis
2af79e97a825   alpine:latest   "/bin/sh"   7 minutes ago   Up 7 minutes             recursing_taussig

```

注意到上面输出结果中的第一个容器的名字了吗？对了，我们给这个容器分配了一个自定义的名字（也就是 `ostechnix_alpine`）。

给容器分配自定义的名字可以给我们带来其他好处。只要看一下容器的名字，我们就能很容易的确定那个容器里面安装了什么。

#### 11、构建自定义 Docker 镜像

Docker 不仅仅是下载和使用已存在的容器。你也可以创建自己的自定义 Docker 镜像。

现在我们开始一个 Ubuntu 容器：

```
$ sudo docker run -it ubuntu:latest

```

现在，你会进入到容器的 shell。

然后，在容器中，你可以安装任何的软件或者做你想做的事情。

比如，我们在容器中安装 Apache Web 服务器。

```
# apt update
# apt install apache2

```

相似地，在容器中，可以根据自己的需要安装和测试软件。

完成以后，从容器脱离（不要退出）回到主机系统的 shell。不要终止或者关闭容器。使用 `CTRL+P` 然后 `CTRL+Q` 从容器中脱离，这样不会关闭容器。

在你的 Docker 主机的终端，运行下面的命令来找到容器 ID：

```
$ sudo docker ps

```

最后，创建一个当前运行中的容器的 Docker 镜像，使用命令：

```
$ sudo docker commit 377e6d77ebb5 ostechnix/ubuntu_apache

```

输出结果：

```
sha256:bc5e5f95ca592a3585fda2c5a40ec30c98e292046ef70390a2c3b7863cc6f7c1

```

这里，

* `377e6d77ebb5` – Ubuntu 容器的 ID。
* `ostechnix` – 创建容器的用户的名字。
* `ubuntu_apache` – 用户 `ostechnix` 创建的 Docker 镜像的名字。

现在我们查看一下新的 Docker 镜像是否被创建了，使用下面的命令：

```
$ sudo docker images

```

输出结果：

```
ostechnix/ubuntu_apache

```

从上面给的结果中可以看到，从运行中的容器创建的新 Docker 镜像已经在我们的 Docker 主机系统中了。

现在你就可以从这个新的 Docker 镜像创建行容器了，用之前的命令：

```
$ sudo docker run -it ostechnix/ubuntu_apache

```

#### 12、移除容器

当你在 Docker 容器中完成所有开发后，如果你不需要它们了，你可以删掉它们。

为此，首先我们需要终止（关闭）运行中的容器。

用这个命令来看一下运行中的容器：

```
$ sudo docker ps

```

输出结果：

```
CONTAINER ID   IMAGE           COMMAND   CREATED         STATUS         PORTS     NAMES
377e6d77ebb5   ubuntu:latest   "bash"    7 minutes ago   Up 7 minutes             elegant_beaver

```

通过使用它的 ID 来终止运行中的容器：

```
$ sudo docker stop 377e6d77ebb5

```

现在，使用这个命令删除容器：

```
$ sudo docker rm 377e6d77ebb5

```

同样，如果不再需要所有的容器，关闭并删除它们。

一个一个的删除多个容器会是一项繁琐的工作。所以，我们可以把所有停止的容器一次性删掉，运行：

```
$ sudo docker container prune

```

敲 `Y` 然后回车键，这些容器就被删掉了。

```
WARNING! This will remove all stopped containers.
Are you sure you want to continue? [y/N] y
Deleted Containers:
397111fac5374921b974721ee646b2d5fbae61ca9c6e8b90fbf47952f382a46b
80b53b7e661d33696b65c78267fc3f067b6100799c925910db4721963e3fae0a
[...]
Total reclaimed space: 176B

```

这个命令只有在最新版中有效。

使用下面的命令来验证是否所有容器都被删除了：

```
$ sudo docker ps -a

```

如果看不到任何结果，说明所有容器被删掉了。

#### 13、删除 Docker 镜像

记住，在删除所有镜像之前，首先要删掉所有从那些镜像创建的容器。

当你删掉容器后，你可以删掉你不需要的 Docker 镜像。

列出所有下载的 Docker 镜像：

```
$ sudo docker images

```

输出结果：

```
REPOSITORY                TAG       IMAGE ID       CREATED          SIZE
ostechnix/ubuntu_apache   latest    bc5e5f95ca59   14 minutes ago   229MB
debian                    latest    d2780094a226   11 days ago      124MB
ubuntu                    latest    27941809078c   3 weeks ago      77.8MB
ubuntu                    20.04     20fffa419e3a   3 weeks ago      72.8MB
alpine                    latest    e66264b98777   5 weeks ago      5.52MB

```

从上面可以看到，在我们的主机上有 5 个 Docker 镜像。

通过使用镜像 ID 来删掉它们：

```
$ sudo docker rmi ce5aa74a48f1

```

输出结果：

```
Untagged: ostechnix/ubuntu_apache:latest
Deleted: sha256:bc5e5f95ca592a3585fda2c5a40ec30c98e292046ef70390a2c3b7863cc6f7c1
Deleted: sha256:a8e4797160a2b2d33d8bd1bd67e008260c022b3a53fbcc198b2b74d9eae5961d

```

同样，删除其他所有 Docker 镜像。

删掉所有未运行的容器、所有镜像、构建的缓存、所有网络，运行：

```
$ sudo docker system prune -a

```

使用这个命令的时候要注意，它会删掉所有没有使用的容器、网络、镜像（包括 <ruby> 挂起 <rt>  dangling </rt></ruby>和<ruby> 未使用 <rt>  unreferenced </rt></ruby> 的）

默认情况下，即使当前没有容器在使用<ruby> 磁盘卷 <rt>  volumes </rt></ruby>，为防止重要数据被删除，磁盘卷也不会被删除。

如果你想删掉所有东西，包括分配的卷，使用 `--volumes` 标签。

```
$ sudo docker system prune -a --volumes

```

### Docker 问题汇总

如果 Docker 镜像正在被运行或停止的容器使用，Docker 不会允许你删除这些镜像。

比如，当我尝试从一个以前的 Ubuntu 服务器上删除 ID 为 `b72889fa879c` 的 Docker 镜像。我会得到下面的错误：

```
Error response from daemon: conflict: unable to delete b72889fa879c (must be forced) - image is being used by stopped container dde4dd285377

```

这是因为你想删除的 Docker 镜像正在被另一个容器使用。

所以，我们先查看一下运行中的容器，使用命令：

```
$ sudo docker ps

```

输出结果：

噢，没有运行中的容器。

我们在看一下所有的容器（运行和停止的），用这个命令：

```
$ sudo docker ps -a

```

输出结果：

可以看到，仍然有停止的容器在使用其中一个 Docker 镜像。所以，我们先把所有容器删掉。

比如：

```
$ sudo docker rm 12e892156219

```

类似地，向上面那样，用对应容器的 ID 将它们都删除。

当把所有容器删掉后，移除掉 Docker 镜像。

比如：

```
$ sudo docker rmi b72889fa879c

```

就这么简单。现在确认是否还有其他 Docker 镜像在主机上，使用命令：

```
$ sudo docker images

```

你现在应该不再有任何 docker 镜像了。

### 总结

在这篇全面的 Docker 入门教程中，我们解释了 Docker 的基本操作，比如创建、运行、搜索、删除容器，还有从 Docker 镜像构建你自己的容器。同时，我们也解释了如何在不需要 Docker 容器和镜像的时候删除它们。

希望你现在对 **Docker 的使用** 有一个基本的了解。

更多细节，请参考这篇教程最下面的官方资源链接，或者在下面的评论区进行评论。

### 相关资料

* [Docker 官网](https://www.docker.com/)
* [Docker 文档](https://docs.docker.com/)

---

via: <https://ostechnix.com/getting-started-with-docker/>

作者：[sk](https://ostechnix.com/author/sk/) 选题：[lkxed](https://github.com/lkxed) 译者：[MCGA](https://github.com/Yufei-Yan) 校对：[wxy](https://github.com/wxy)

本文由 [LCTT](https://github.com/LCTT/TranslateProject) 原创编译，[Linux中国](https://linux.cn/) 荣誉推出


如何在 Ubuntu/Linux 和 Windows 之间共享文件夹

Summary: 本初学者指南解释了如何在 Ubuntu/Linux 中快速共享一个文件夹。

本初学者指南解释了如何在 Ubuntu/Linux 中快速共享一个文件夹。

# 如何在 Ubuntu/Linux 和 Windows 之间共享文件夹

>
> 本初学者指南解释了如何在 Ubuntu/Linux 中快速共享一个文件夹。
>
>
>

在 Ubuntu/Linux 中共享一个文件夹并在其他操作系统（如 Windows）中通过网络访问并不难。默认情况下，Ubuntu 并没有安装所需的软件包。但是，你可以打开安装向导来自动安装所需的软件。

本 [指南](https://www.debugpoint.com/category/tutorials/) 适用于所有 Ubuntu 版本（包括 [22.04](https://www.debugpoint.com/web-stories/ubuntu-22-04-review/)、20.04、18.04、19.10 以及即将发布的版本 —— 除非此功能的设计发生重大的变化）。

### Ubuntu 中共享文件夹的步骤

**步骤 1：** 打开文件管理器，右键单击共享的文件夹。点击上下文菜单中的“本地网络共享”选项。

**步骤 2：** 在文件夹共享对话框中点击共享文件夹复选框。

这将在你的系统中安装 [Samba](https://en.wikipedia.org/wiki/Samba_(software)) 软件包。Samba 用于在 Windows 和 Unix 系统之间通过网络共享文件和打印机。

**步骤 3：** 安装 Samba 后，执行以下操作共享文件夹或目录。

* 选中共享文件夹复选框。
* 输入共享名称。这将是你从另一个系统（如 Windows）看到的名称。尽量不要使用任何带有空格的名称。
* （可选）通过勾选相应选项，你可以控制共享文件夹的写入权限，以及允许访客访问。
* 如果你允许访客访问，则没有凭据的人可以访问共享文件夹。所以要谨慎。
* 如果你希望用户输入用户名和密码，打开终端并运行以下命令。

```
sudo smbpasswd -a 用户名

```

`用户名` 应该是对应 Ubuntu 系统的有效用户。

现在，你应该已经设置好了共享的文件夹或目录。

### 如何访问共享文件夹

从 Ubuntu/Linux 系统中访问共享文件夹，你需要系统的 IP 地址或主机名。为此，打开“<ruby> 系统设置 <rt>  System Settings </rt></ruby> -> Wi-Fi -> <ruby> 获取 IP 地址 <rt>  Get the IP address </rt></ruby>”。

如果你运行的是 Linux 发行版不是 Ubuntu，此步骤略有不同。你可能想运行 `ip addr` 来获取 IP 地址，如下所示：

一旦你获得 IP 地址，就可以在 Ubuntu/Linux 系统中打开文件管理器，然后在地址栏中输入以下内容。注意：你应该修改为你系统的 IP 地址。

你现在可以看到共享文件夹上面显示了一个小共享图标，表示网络共享文件夹。

要在 **Windows 系统** 访问共享文件夹，打开运行（按下 `Windows + R`）或打开资源管理器，输入以下地址。注意：你应该修改为你系统的 IP 地址和文件夹名称。

```
\\192.168.43.19\Folder

```

你应该能够查看共享文件夹的内容，并根据授予的权限修改它。

### 总结

我已经向你展示了如何从 Ubuntu 共享一个件夹，并通过 IP 地址在 Windows 系统中访问。对于其他 Linux 发行版，你也可以执行相同的步骤。如果本文对你有帮助，在下面的评论框中告诉我。

---

via: <https://www.debugpoint.com/guide-how-share-folder-between-ubuntu-linux-windows/>

作者：[Arindam](https://www.debugpoint.com/author/admin1/) 选题：[lkxed](https://github.com/lkxed) 译者：[MjSeven](https://github.com/MjSeven) 校对：[wxy](https://github.com/wxy)

本文由 [LCTT](https://github.com/LCTT/TranslateProject) 原创编译，[Linux中国](https://linux.cn/) 荣誉推出


硬核观察 #704 谷歌发布开源开发语言 Carbon，准备替代 C++

Summary: • 谷歌发布开源开发语言 Carbon，准备替代 C++ • 谷歌开始公开测试其 AR 眼镜 • 亚马逊自研云计算处理器可节省多达 40% 成本

但我们老师说c++难以改进是因为在制定c++标准和函数的时候优先考虑到的是一个东西能不能高效的实现，如果不能就不会进入标准。不知道carbon在这方面怎么样

go的时候Google就在吹要代替c++了，目前看来rust也许有可能，有Linux内核支持开发者会更积极加入到rust阵营

# 硬核观察 #704 谷歌发布开源开发语言 Carbon，准备替代 C++

### 谷歌发布开源开发语言 Carbon，准备替代 C++

在近日举行的 CppNorth 开发者大会上，谷歌工程师宣布了名为“[Carbon](https://github.com/carbon-language/carbon-lang)” 的全新开源编程语言，并称它将是 C++ 的渐进式的继任者。Carbon 的目标是实现与 C++ 相当的性能、与 C++ 无缝的双向互操作性、为 C++ 开发者提供更容易的学习曲线、可比较的表达性，和可扩展的迁移。Carbon 团队称，“虽然 C++ 现在依旧是主导性的编程语言，并有着庞大的代码库，但由于数十年的技术积累，想要持续改进 C++ 已经是极其困难的一件事。而 Carbon 则不同，它在继承了 C++ 现有特性与生态的基础上，足够年轻，也足够‘现代化’，拥有更为广阔的优化空间，潜力更大。”

>
> **[消息来源：Phoronix](https://www.phoronix.com/scan.php?page=news_item&px=Carbon-Successor-To-CPP)**
>
>
>

>
> 老王点评：这一点我同意 Carbon 团队的看法，C++ 的历史包袱太重了，也越来越复杂了。但是是否 Carbon 能走在正确的道路上，我们还只能拭目以待，毕竟编程语言这种事情，不是一朝一夕就能成功的。
>
>
>

### 谷歌开始公开测试其 AR 眼镜

谷歌眼镜十年后，谷歌又开始在公共场合测试智能眼镜。谷歌要求 AR 眼镜原型测试人员不得在学校、政府大楼、医疗保健场所、学校和游乐场等地方，或在开车和运动时测试该 AR 眼镜。谷歌强调，该眼镜不会拍照或录像，而是将图像数据用于辅助 AI。谷歌承诺“除非图像数据将用于分析和调试，否则将会被删除。而且会首先清除敏感内容，如面部和车牌，然后将其存储在安全的服务器，限制少数谷歌人员访问分析和调试。”

>
> **[消息来源：CNET](https://www.cnet.com/tech/computing/google-begins-publicly-testing-its-ar-glasses/)**
>
>
>

>
> 老王点评：虽然十年前谷歌眼镜失败了，但是智能眼镜必然是个趋势，只是这里有很多伦理、技术的问题需要解决。目前看起来，AR 眼镜似乎是比较靠近成功的方向。
>
>
>

### 亚马逊自研云计算处理器可节省多达 40% 成本

Graviton 处理器由 AWS 自主开发，于 2018 年推出，致力于为互联网上的应用程序提供动力，或帮助客户训练机器学习模型。今年 5 月，亚马逊又推出了更具成本效益的第三代 Graviton 处理器。AWS 的几家客户向媒体表示，与基于英特尔和 AMD 处理器的服务器相比，使用 Graviton 处理器的云服务器的能耗更低，运算速度更快。这些客户称，通过租用 Graviton 服务器，他们节省了 10% 到 40% 的计算成本。Twitter、Snap、Adobe 和 SAP 等公司均已成为 Graviton 服务器的客户。

>
> **[消息来源：The Information](https://www.theinformation.com/articles/aws-server-chip-becomes-a-not-so-secret-weapon-against-microsoft-google)**
>
>
>

>
> 老王点评：虽然这条消息像是软文，不过昨天我们刚刚听说了字节跳动自研芯片，而之前阿里云也发布消息自研云服务芯片，看来云服务商和主流应用公司自研芯片，已经成为一种趋势，甚至是必要性。
>
>
>


# 戴尔 XPS 13 Plus 开发者版获得 Ubuntu 22.04 LTS 认证

>
> 戴尔的 XPS 13 Plus 开发者版可能是第一款为 Ubuntu 22.04 LTS 认证的笔记本电脑。
>
>
>

戴尔 XPS 是一个适合专业人士和商业用户的高端笔记本电脑系列。

而且它也是运行 Linux 的最受欢迎的笔记本电脑之一。如果你一直想得到一台为最新的 Ubuntu 量身定做的戴尔 XPS 笔记本电脑，那么 **戴尔 XPS 13 Plus 开发者版** 就是为你准备的。

13 英寸 XPS 笔记本电脑的开发者版现在已经通过认证，可以使用 Ubuntu 22.04 LTS 完美工作。

这些经过认证的设备都经过了测试，以获得最佳体验，确保每台笔记本电脑的功能都能按预期工作。

换句话说，你可以找到预装 [Ubuntu 22.04 LTS](https://news.itsfoss.com/ubuntu-22-04-release/) 的优质笔记本电脑，不必担心其开箱即用的体验。而且，如果你已经有一台 XPS 13 Plus 笔记本电脑，你也可以手动安装 Ubuntu 22.04 来获得同样的优化体验。

这款笔记本应该是 [TUXEDO Pulse 15](https://news.itsfoss.com/tuxedo-pulse-gen-2/) 和 [HP Dev One](https://news.itsfoss.com/hp-dev-one-system76/) 的绝佳替代品。

### 戴尔的高级笔记本电脑拥有顺滑的 Ubuntu 体验

虽然我们可以在任何笔记本电脑上安装 Linux 发行版，但可能并不总是一种方便的体验。

从 Wi-Fi 兼容性问题到指纹认证，任何事情都可能出错。除非一个设备与一个操作系统正式兼容，否则你只能带着失败的几率去尝试。

然而，戴尔在 Ubuntu 领域是非常有名的，它提供的笔记本电脑在 Ubuntu 的最新版本中完全可以正常工作。戴尔的 XPS 13 Plus 开发者版运行的是经 Canonical 认证的最新推出的 Ubuntu 22.04 LTS。

你可以查看我们的 [Ubuntu 22.04 LTS 特色](https://itsfoss.com/ubuntu-22-04-release-features/) 文章，探索你可以从它那里得到什么。

戴尔的产品经理就他们与 Canonical 的长期合作分享了一些见解。

>
> “XPS 是戴尔的创新门户 —— 从对尖端技术的应用，到新用户界面和体验式设计的实验。”戴尔技术公司的 Linux 操作系统产品经理 Jaewook Woo 说：“通过将 Ubuntu 22.04 LTS 的增强性能和电源管理功能引入我们最先进的高端笔记本电脑，戴尔和 Canonical 加强了我们的共同承诺，即继续为使用 Ubuntu 的开发者提供最佳的计算体验。”
>
>
>

戴尔 XPS 13 Plus 开发者版提供了令人兴奋的规格，包括：

* 四扬声器设计
* 高达 4K+ 分辨率的 OLED 显示屏
* M.2 PCIe Gen 4 NVMe SSD
* 高达 32GB、LPDDR5 5200MHz 内存

这款笔记本电脑将于 2022 年 8 月在美国、加拿大和部分欧洲国家预装 Ubuntu 22.04 LTS 发售。如果你想买一台，你可能想关注一下 [戴尔的 XPS 13 Plus 产品页面](https://www.dell.com/en-us/shop/dell-laptops/xps-13-plus-laptop/spd/xps-13-9320-laptop)。

>
> **[Dell XPS 13 Plus](https://www.dell.com/en-us/shop/dell-laptops/xps-13-plus-laptop/spd/xps-13-9320-laptop)**
>
>
>

---

via: <https://news.itsfoss.com/dell-xps-13-plus-dev-ubuntu-certified/>

作者：[Ankush Das](https://news.itsfoss.com/author/ankush/) 选题：[lkxed](https://github.com/lkxed) 译者：[wxy](https://github.com/wxy) 校对：[wxy](https://github.com/wxy)

本文由 [LCTT](https://github.com/LCTT/TranslateProject) 原创编译，[Linux中国](https://linux.cn/) 荣誉推出


手把手教你使用 GNU 调试器

Summary: GNU 调试器是一个发现程序缺陷的强大工具。

GNU 调试器是一个发现程序缺陷的强大工具。

# 手把手教你使用 GNU 调试器

>
> GNU 调试器是一个发现程序缺陷的强大工具。
>
>
>

如果你是一个程序员，想在你的软件增加某些功能，你首先考虑实现它的方法：例如写一个方法、定义一个类，或者创建新的数据类型。然后你用编译器或解释器可以理解的编程语言来实现这个功能。但是，如果你觉得你所有代码都正确，但是编译器或解释器依然无法理解你的指令怎么办？如果软件大多数情况下都运行良好，但是在某些环境下出现缺陷怎么办？这种情况下，你得知道如何正确使用调试器找到问题的根源。

<ruby> GNU 调试器 <rt>  GNU Project Debugger </rt></ruby>（[GDB](https://www.gnu.org/software/gdb/)）是一个发现项目缺陷的强大工具。它通过追踪程序运行过程中发生了什么来帮助你发现程序错误或崩溃的原因。（LCTT 校注：GDB 全程是“GNU Project Debugger”，即 “GNU 项目调试器”，但是通常我们简称为“GNU 调试器”）

本文是 GDB 基本用法的实践教程。请跟随示例，打开命令行并克隆此仓库：

```
git clone https://github.com/hANSIc99/core_dump_example.git

```

### 快捷方式

GDB 的每条命令都可以缩短。例如：显示设定的断点的 `info break` 命令可以被缩短为 `i break`。你可能在其他地方看到过这种缩写，但在本文中，为了清晰展现使用的函数，我将所写出整个命令。

### 命令行参数

你可以将 GDB 附加到每个可执行文件。进入你克隆的仓库（`core_dump_example`），运行 `make` 进行编译。你现在能看到一个名为 `coredump` 的可执行文件。（更多信息，请参考我的文章《[创建和调试 Linux 的转储文件](https://opensource.com/article/20/8/linux-dump)》。）

要将 GDB 附加到这个可执行文件，请输入: `gdb coredump`。

你的输出应如下所示：

返回结果显示没有找到调试符号。

调试信息是<ruby> 目标文件 <rt>  object file </rt></ruby>（可执行文件）的组成部分，调试信息包括数据类型、函数签名、源代码和操作码之间的关系。此时，你有两种选择：

* 继续调试汇编代码（参见下文“无符号调试”）
* 使用调试信息进行编译，参见下一节内容

### 使用调试信息进行编译

为了在二进制文件中包含调试信息，你必须重新编译。打开 `Makefile`，删除第 9 行的注释标签（`#`）后重新编译：

```
CFLAGS =-Wall -Werror -std=c++11 -g

```

`-g` 告诉编译器包含调试信息。运行 `make clean`，接着运行 `make`，然后再次调用 GDB。你得到如下输出后就可以调试代码了：

新增的调试信息会增加可执行文件的大小。在这种情况下，执行文件增加了 2.5 倍（从 26,088 字节 增加到 65,480 字节）。

输入 `run -c1`，使用 `-c1` 开关启动程序。当程序运行到达 `State_4` 时将崩溃：

你可以检索有关程序的其他信息，`info source` 命令提供了当前文件的信息：

* 101 行代码
* 语言: C++
* 编译器（版本、调优、架构、调试标志、语言标准）
* 调试格式：[DWARF 2](http://dwarfstd.org/)
* 没有预处理器宏指令（使用 GCC 编译时，宏仅在 [使用 -g3 标志编译](https://sourceware.org/gdb/current/onlinedocs/gdb/Compilation.html#Compilation) 时可用）。

`info shared` 命令打印了动态库列表机器在虚拟地址空间的地址，它们在启动时被加载到该地址，以便程序运行：

如果你想了解 Linux 中的库处理方式，请参见我的文章 [在 Linux 中如何处理动态库和静态库](https://opensource.com/article/20/6/linux-libraries)。

### 调试程序

你可能已经注意到，你可以在 GDB 中使用 `run` 命令启动程序。`run` 命令接受命令行参数，就像从控制台启动程序一样。`-c1` 开关会导致程序在第 4 阶段崩溃。要从头开始运行程序，你不用退出 GDB，只需再次运行 `run` 命令。如果没有 `-c1` 开关，程序将陷入死循环，你必须使用 `Ctrl+C` 来结束死循环。

你也可以一步一步运行程序。在 C/C++ 中，入口是 `main` 函数。使用 `list main` 命令打开显示 `main` 函数的部分源代码：

`main` 函数在第 33 行，因此可以输入 `break 33` 在 33 行添加断点:

输入 `run` 运行程序。正如预期的那样，程序在 `main` 函数处停止。输入 `layout src` 并排查看源代码：

你现在处于 GDB 的文本用户界面（TUI）模式。可以使用键盘向上和向下箭头键滚动查看源代码。

GDB 高亮显示当前执行行。你可以输入 `next`（`n`）命令逐行执行命令。如果你没有指定新的命令，GBD 会执行上一条命令。要逐行运行代码，只需按回车键。

有时，你会发现文本的输出有点显示不正常：

如果发生这种情况，请按 `Ctrl+L` 重置屏幕。

使用 `Ctrl+X+A` 可以随时进入和退出 TUI 模式。你可以在手册中找到 [其他的键绑定](https://sourceware.org/gdb/onlinedocs/gdb/TUI-Keys.html#TUI-Keys) 。

要退出 GDB，只需输入 `quit`。

### 设置监察点

这个示例程序的核心是一个在无限循环中运行的状态机。`n_state` 变量枚举了当前所有状态：

```
while(true){
        switch(n_state){
        case State_1:
                std::cout << "State_1 reached" << std::flush;
                n_state = State_2;
                break;
        case State_2:
                std::cout << "State_2 reached" << std::flush;
                n_state = State_3;
                break;

        (.....)

        }
}

```

如果你希望当 `n_state` 的值为 `State_5` 时停止程序。为此，请在 `main` 函数处停止程序并为 `n_state` 设置监察点：

```
watch n_state == State_5

```

只有当所需的变量在当前上下文中可用时，使用变量名设置监察点才有效。

当你输入 `continue` 继续运行程序时，你会得到如下输出：

如果你继续运行程序，当监察点表达式评估为 `false` 时 GDB 将停止：

你可以为一般的值变化、特定的值、读取或写入时来设置监察点。

### 更改断点和监察点

输入 `info watchpoints` 打印先前设置的监察点列表：

#### 删除断点和监察点

如你所见，监察点就是数字。要删除特定的监察点，请先输入 `delete` 后输入监察点的编号。例如，我的监察点编号为 2；要删除此监察点，输入 `delete 2`。

*注意：* 如果你使用 `delete` 而没有指定数字，*所有* 监察点和断点将被删除。

这同样适用于断点。在下面的截屏中，我添加了几个断点，输入 `info breakpoint` 打印断点列表：

要删除单个断点，请先输入 `delete` 后输入断点的编号。另外一种方式：你可以通过指定断点的行号来删除断点。例如，`clear 78` 命令将删除第 78 行设置的断点号 7。

#### 禁用或启用断点和监察点

除了删除断点或监察点之外，你可以通过输入 `disable`，后输入编号禁用断点或监察点。在下文中，断点 3 和 4 被禁用，并在代码窗口中用减号标记：

也可以通过输入类似 `disable 2 - 4` 修改某个范围内的断点或监察点。如果要重新激活这些点，请输入 `enable`，然后输入它们的编号。

### 条件断点

首先，输入 `delete` 删除所有断点和监察点。你仍然想使程序停在 `main` 函数处，如果你不想指定行号，可以通过直接指明该函数来添加断点。输入 `break main` 从而在 `main` 函数处添加断点。

输入 `run` 从头开始运行程序，程序将在 `main` 函数处停止。

`main` 函数包括变量 `n_state_3_count`，当状态机达到状态 3 时，该变量会递增。

基于 `n_state_3_count` 的值添加一个条件断点，请输入：

```
break 54 if n_state_3_count == 3

```

继续运行程序。程序将在第 54 行停止之前运行状态机 3 次。要查看 `n_state_3_count` 的值，请输入：

```
print n_state_3_count

```

#### 使断点成为条件断点

你也可以使现有断点成为条件断点。用 `clear 54` 命令删除最近添加的断点，并通过输入 `break 54` 命令添加一个简单的断点。你可以输入以下内容使此断点成为条件断点：

```
condition 3 n_state_3_count == 9

```

`3` 指的是断点编号。

#### 在其他源文件中设置断点

如果你的程序由多个源文件组成，你可以在行号前指定文件名来设置断点，例如，`break main. cpp:54`。

#### 捕捉点

除了断点和监察点之外，你还可以设置捕获点。捕获点适用于执行系统调用、加载共享库或引发异常等事件。

要捕获用于写入 STDOUT 的 `write` 系统调用，请输入：

```
catch syscall write

```

每当程序写入控制台输出时，GDB 将中断执行。

在手册中，你可以找到一整章关于 [断点、监察点和捕捉点](https://sourceware.org/gdb/current/onlinedocs/gdb/Breakpoints.html#Breakpoints) 的内容。

### 评估和操作符号

用 `print` 命令可以打印变量的值。一般语法是 `print <表达式> <值>`。修改变量的值，请输入：

```
set variable <variable-name> <new-value>.

```

在下面的截屏中，我将变量 `n_state_3_count` 的值设为 `123`。

`/x` 表达式以十六进制打印值；使用 `&` 运算符，你可以打印虚拟地址空间内的地址。

如果你不确定某个符号的数据类型，可以使用 `whatis` 来查明。

如果你要列出 `main` 函数范围内可用的所有变量，请输入 `info scope main` :

`DW_OP_fbreg` 值是指基于当前子程序的堆栈偏移量。

或者，如果你已经在一个函数中并且想要列出当前堆栈帧上的所有变量，你可以使用 `info locals` :

查看手册以了解更多 [检查符号](https://sourceware.org/gdb/current/onlinedocs/gdb/Symbols.html) 的内容。

### 附加调试到一个正在运行的进程

`gdb attach <进程 ID>` 命令允许你通过指定进程 ID（PID）附加到一个已经在运行的进程进行调试。幸运的是，`coredump` 程序将其当前 PID 打印到屏幕上，因此你不必使用 [ps](https://man7.org/linux/man-pages/man1/ps.1.html) 或 [top](https://man7.org/linux/man-pages/man1/top.1.html) 手动查找 PID。

启动 `coredump` 应用程序的一个实例：

```
./coredump

```

操作系统显示 PID 为 `2849`。打开一个单独的控制台窗口，移动到 `coredump` 应用程序的根目录，然后用 GDB 附加到该进程进行调试：

```
gdb attach 2849

```

当你用 GDB 附加到进程时，GDB 会立即停止进程运行。输入 `layout src` 和 `backtrace` 来检查调用堆栈：

输出显示在 `main.cpp` 第 92 行调用 `std::this_thread::sleep_for<...>(. ..)` 函数时进程中断。

只要你退出 GDB，该进程将继续运行。

你可以在 GDB 手册中找到有关 [附加调试正在运行的进程](https://sourceware.org/gdb/current/onlinedocs/gdb/Attach.html#Attach) 的更多信息。

#### 在堆栈中移动

在命令窗口，输入 `up` 两次可以在堆栈中向上移动到 `main.cpp` :

通常，编译器将为每个函数或方法创建一个子程序。每个子程序都有自己的栈帧，所以在栈帧中向上移动意味着在调用栈中向上移动。

你可以在手册中找到有关 [堆栈计算](https://sourceware.org/gdb/current/onlinedocs/gdb/Stack.html#Stack) 的更多信息。

#### 指定源文件

当调试一个已经在运行的进程时，GDB 将在当前工作目录中寻找源文件。你也可以使用 [目录命令](https://ftp.gnu.org/old-gnu/Manuals/gdb/html_node/gdb_48.html#SEC49) 手动指定源目录。

### 评估转储文件

阅读 [创建和调试 Linux 的转储文件](https://opensource.com/article/20/8/linux-dump) 了解有关此主题的信息。

参考文章太长，简单来说就是：

1. 假设你使用的是最新版本的 Fedora
2. 使用 `-c1` 开关调用 coredump：`coredump -c1`

3. 使用 GDB 加载最新的转储文件：`coredumpctl debug`
4. 打开 TUI 模式并输入 `layout src`

`backtrace` 的输出显示崩溃发生在距离 `main.cpp` 五个栈帧之外。回车直接跳转到 `main.cpp` 中的错误代码行：

看源码发现程序试图释放一个内存管理函数没有返回的指针。这会导致未定义的行为并引起 `SIGABRT`。

### 无符号调试

如果没有源代码，调试就会变得非常困难。当我在尝试解决逆向工程的挑战时，我第一次体验到了这一点。了解一些 [汇编语言](https://en.wikipedia.org/wiki/Assembly_language) 的知识会很有用。

我们用例子看看它是如何运行的。

找到根目录，打开 `Makefile`，然后像下面一样编辑第 9 行：

```
CFLAGS =-Wall -Werror -std=c++11 #-g

```

要重新编译程序，先运行 `make clean`，再运行 `make`，最后启动 GDB。该程序不再有任何调试符号来引导源代码的走向。

`info file` 命令显示二进制文件的内存区域和入口点：

`.text` 区段始终从入口点开始，其中包含实际的操作码。要在入口点添加断点，输入 `break *0x401110` 然后输入 `run` 开始运行程序：

要在某个地址设置断点，使用取消引用运算符 `*` 来指定地址。

#### 选择反汇编程序风格

在深入研究汇编之前，你可以选择要使用的 [汇编风格](https://en.wikipedia.org/wiki/X86_assembly_language#Syntax)。 GDB 默认是 AT&T，但我更喜欢 Intel 语法。变更风格如下：

```
set disassembly-flavor intel

```

现在输入 `layout asm` 调出汇编代码窗口，输入 `layout reg` 调出寄存器窗口。你现在应该看到如下输出：

#### 保存配置文件

尽管你已经输入了许多命令，但实际上还没有开始调试。如果你正在大量调试应用程序或尝试解决逆向工程的难题，则将 GDB 特定设置保存在文件中会很有用。

该项目的 GitHub 存储库中的 [gdbinit](https://github.com/hANSIc99/core_dump_example/blob/master/gdbinit) 配置文件包含最近使用的命令：

```
set disassembly-flavor intel
set write on
break *0x401110
run -c2
layout asm
layout reg

```

`set write on` 命令使你能够在程序运行期间修改二进制文件。

退出 GDB 并使用配置文件重新启动 GDB ： `gdb -x gdbinit coredump`。

#### 阅读指令

应用 `c2` 开关后，程序将崩溃。程序在入口函数处停止，因此你必须写入 `continue` 才能继续运行：

`idiv` 指令进行整数除法运算：`RAX` 寄存器中为被除数，指定参数为除数。商被加载到 `RAX` 寄存器中，余数被加载到 `RDX` 中。

从寄存器角度，你可以看到 `RAX` 包含 `5`，因此你必须找出存储堆栈中位置为 `rbp-0x4` 的值。

#### 读取内存

要读取原始内存内容，你必须指定比读取符号更多的参数。在汇编输出中向上滚动一点，可以看到堆栈的划分：

你最感兴趣的应该是 `rbp-0x4` 的值，因为它是 `idiv` 的存储参数。你可以从截图中看到`rbp-0x8` 位置的下一个变量，所以 `rbp-0x4` 位置的变量是 4 字节宽。

在 GDB 中，你可以使用 `x` 命令*查看*任何内存内容：

>
> `x/` < 可选参数 `n`、`f`、`u` > < 内存地址 `addr` >
>
>
>

可选参数：

* `n`：单元大小的重复计数（默认值：1）
* `f`：格式说明符，如 [printf](https://en.wikipedia.org/wiki/Printf_format_string#Type_field)
* `u`：单元大小
	+ `b`：字节
	+ `h`：半字（2 个字节）
	+ w: 字（4 个字节）（默认）
	+ g: 双字（8 个字节）

要打印 `rbp-0x4` 的值，请输入 `x/u $rbp-4` :

如果你能记住这种模式，则可以直接查看内存。参见手册中的 [查看内存](https://sourceware.org/gdb/current/onlinedocs/gdb/Memory.html) 部分。

#### 操作汇编

子程序 `zeroDivide()` 发生运算异常。当你用向上箭头键向上滚动一点时，你会找到下面信息：

```
0x401211 <_Z10zeroDividev>              push   rbp
0x401212 <_Z10zeroDividev+1>            mov    rbp,rsp

```

这被称为 [函数前言](https://en.wikipedia.org/wiki/Function_prologue)：

1. 调用函数的基指针（`rbp`）存放在栈上
2. 栈指针（`rsp`）的值被加载到基指针（`rbp`）

完全跳过这个子程序。你可以使用 `backtrace` 查看调用堆栈。在 `main` 函数之前只有一个堆栈帧，所以你可以用一次 `up` 回到 `main` :

在你的 `main` 函数中，你会找到下面信息:

```
0x401431 <main+497>     cmp    BYTE PTR [rbp-0x12],0x0
0x401435 <main+501>     je     0x40145f <main+543>
0x401437 <main+503>     call   0x401211<_Z10zeroDividev>

```

子程序 `zeroDivide()` 仅在 `jump equal (je)` 为 `true` 时进入。你可以轻松地将其替换为 `jump-not-equal (jne)` 指令，该指令的操作码为 `0x75`（假设你使用的是 x86/64 架构；其他架构上的操作码不同）。输入 `run` 重新启动程序。当程序在入口函数处停止时，设置操作码：

```
set *(unsigned char*)0x401435 = 0x75

```

最后，输入 `continue` 。该程序将跳过子程序 `zeroDivide()` 并且不会再崩溃。

### 总结

你会在许多集成开发环境（IDE）中发现 GDB 运行在后台，包括 Qt Creator 和 VSCodium 的 [本地调试](https://github.com/WebFreak001/code-debug) 扩展。

了解如何充分利用 GDB 的功能很有用。一般情况下，并非所有 GDB 的功能都可以在 IDE 中使用，因此你可以从命令行使用 GDB 的经验中受益。

---

via: <https://opensource.com/article/21/1/gnu-project-debugger>

作者：[Stephan Avenwedde](https://opensource.com/users/hansic99) 选题：[lkxed](https://github.com/lkxed) 译者：[Maisie-x](https://github.com/Maisie-x) 校对：[wxy](https://github.com/wxy)

本文由 [LCTT](https://github.com/LCTT/TranslateProject) 原创编译，[Linux中国](https://linux.cn/) 荣誉推出


硬核观察 #705 微软商店新规禁止上架苹果的浏览器

Summary: • 微软商店新规禁止上架苹果的浏览器 • 谷歌应用商店将恢复应用权限列表 • SUSE 也发布了基于网页的 Linux 发行版安装程序

苹果已经不是乔布斯那个时代的苹果，没什么技术优势了还在定规则，规则还贼自私，早该弄它了

# 硬核观察 #705 微软商店新规禁止上架苹果的浏览器

### 微软商店新规禁止上架苹果的浏览器

在大家都关注微软商店针对开源软件售卖的 [新规定](/article-14848-1.html) 的时候，这批新条款中还有专门针对苹果的 WebKit 浏览器内核的限制：如果要想在微软商店提交浏览器产品的话，只能使用 Chromium 内核和 Gecko 内核，其他内核例如 WebKit 等都是不被允许的。微软给出的解释是平台兼容性和安全性考虑。WebKit 主要是苹果的 Safari 浏览器所使用的引擎，而 Chromium 是微软 Edge 和谷歌 Chrome 所使用的内核，Gecko 是 Firefox 使用的内核。这和苹果在在 iOS 和 iPadOS 上的政策如出一辙，苹果也禁止第三方浏览器内核，所有苹果商店上架的浏览器都必须使用 WebKit，所以 iPhone 上的 Chrome 只是个套皮版本，内核并非 Chromium。

>
> **[消息来源：The Register](https://www.theregister.com/2022/07/08/microsoft_store_open_source_webkit/)**
>
>
>

>
> 老王点评：你做得了初一，就别怪我做十五。我想微软是等着看欧盟对苹果 iOS 上的 WebKit 独占的裁决结果吧。
>
>
>

### 谷歌应用商店将恢复应用权限列表

正如我们之前 [报道](/article-14839-1.html) 的，谷歌应用商店新增加了由开发者提供的“数据安全”部分，并删除了旧的“应用程序权限列表”。我当时认为此举不妥，应该保留这个权限列表，它是根据应用安装时申请的权限自动扫描生成的。现在，看起来谷歌收到了大家的反馈，安卓的开发人员在推特上表示，“你认为谷歌商店中的应用权限部分很有用，我们决定恢复它。”权限列表代表一个应用程序访问特定数据的能力，而数据安全的重点是一个应用程序收集和与第三方分享的内容。谷歌警告那些没有完全填写数据安全表格的应用尽快更新，否则将无法更新应用，甚至会被删除。

>
> **[消息来源：9to5google](https://9to5google.com/2022/07/21/google-play-permissions-list/)**
>
>
>

>
> 老王点评：这么简单的事情，都需要社区提醒。不过能够从善如流还是不错的。
>
>
>

### SUSE 也发布了基于网页的 Linux 发行版安装程序

之前我们 [报道](/article-14842-1.html) 过，红帽正在开发基于网页的 Anaconda 安装程序。而 SUSE 的工程师们也在做类似的工作。这个名为 D-Installer 的安装程序建立在 YaST 之上，最近发布了 0.4 版。D-Installer 是今年年初宣布的，并于 3 月份发布了一个实验性版本。这个安装程序有一个多进程架构，可以支持安装多个产品，因此用户可以在安装时选择 openSUSE Tumbleweed / Leap Micro / Leap 等不同形态，并简化工作流程。

>
> **[消息来源：Phoronix](https://www.phoronix.com/scan.php?page=news_item&px=D-Installer-0.4)**
>
>
>

>
> 老王点评：明明是 SUSE 先搞的，怎么就被红帽抢了戏了呢。:smile:
>
>
>


如何从 Windows 上用 SSH 连接到 Linux

# 如何从 Windows 上用 SSH 连接到 Linux

>
> 使用开源的 PuTTY 工具，从 Windows 建立到 Linux 的 SSH 连接。
>
>
>

在 Linux 世界中，<ruby> 安全外壳 <rt>  secure shell </rt></ruby>（SSH）协议是最为常用的、通过命令行控制远程计算机的方式。SSH 是真正的 Linux 原创，但是它在 Windows 世界中也越来越流行。甚至有了一份官方的 [Windows 的 SSH 文档](https://docs.microsoft.com/en-us/windows-server/administration/openssh/openssh_overview)，那篇文档阐述了使用 [OpenSSH](https://www.openssh.com/) 控制 Windows 的方法。

这篇文章展示了如何使用了流行的开源工具 [PuTTY](https://www.putty.org/)，建立一个从 Windows 到 Fedora 33 Linux 系统的 SSH 连接。

### 使用 SSH 的方法

SSH 使用客户端-服务器模式，即 SSH 客户端会创建到 SSH 服务端的连接。SSH 服务器通常会作为<ruby> 守护进程 <rt>  Daemon </rt></ruby>运行，所以它常被称为 SSHD。你很难找到一个不自带 SSH 守护进程的 Linux 发行版。在 Fedora 33 中，已安装了 SSH 守护进程，但是并未激活。

你可以使用 SSH 控制几乎所有的 Linux 机器，无论它是作为虚拟机还是作为网络上的物理设备运行。一个常见的用例是<ruby> 无头 <rt>  headless </rt></ruby>配置的嵌入式设备，如树莓派。SSH 也可以用做一个其它网络服务的隧道。因为 SSH 连接是加密的，所以你可以使用 SSH 作为一个任何默认不提供加密的协议的传输层。

在这篇文章中，我将解释使用 SSH 的四个方式：1、如何在 Linux 端配置 SSH 守护进程；2、如何设置远程控制台连接；3、如何通过网络复制文件，4. 如何将 SSH 作为某些协议的隧道。

### 1、配置 SSHD

将 Linux 系统（文中是 Fedora 33）作为 SSH 服务器，允许 PuTTY SSH 客户端进行连接。首先，检查守护进程的 SSH 配置。配置文件放在 `/etc/ssh/sshd_config`，它包含了许多选项，通过取消掉相关行的注释就可以激活：

```
#       $OpenBSD: sshd_config,v 1.100 2016/08/15 12:32:04 naddy Exp $

# This is the sshd server system-wide configuration file.  See
# sshd_config(5) for more information.

# This sshd was compiled with PATH=/usr/local/sbin:/usr/sbin:/sbin:/usr/local/bin:/usr/bin:/bin

# The strategy used for options in the default sshd_config shipped with
# OpenSSH is to specify options with their default value where
# possible, but leave them commented.  Uncommented options override the
# default value.

Include /etc/ssh/sshd_config.d/*.conf

#Port 22
#AddressFamily any
#ListenAddress 0.0.0.0
#ListenAddress ::

```

没有取消任何注释的默认配置在这个示例中应该是可以工作的。要检查 SSH 守护进程是否已经运行，输入 `systemctl status sshd`：

```
$ systemctl status sshd
● sshd.service - OpenSSH server daemon
   Loaded: loaded (/usr/lib/systemd/system/sshd.service; enabled; vendor preset: enabled)
   Active: active (running) since Fri 2018-06-22 11:12:05 UTC; 2 years 11 months ago
     Docs: man:sshd(8)
           man:sshd_config(5)
 Main PID: 577 (sshd)
    Tasks: 1 (limit: 26213)
   CGroup: /system.slice/sshd.service
           └─577 /usr/sbin/sshd -D -oCiphers=[aes256-gcm@openssh.com][5],chacha20-[...]

```

如果它处于<ruby> 未激活 <rt>  inactive </rt></ruby>状态，使用 `systemctl start sshd` 命令启动它。

### 2、设置远程控制台

在 Windows 下 [下载 PuTTY 安装程序](https://www.chiark.greenend.org.uk/~sgtatham/putty/latest.html)，然后安装并打开它。你应看到一个像这样的窗口：

在“<ruby> 主机名（或 IP 地址） <rt>  Host Name (or IP address) </rt></ruby>”输入框，键入你的 Linux 系统的连接信息。本文设置了一个 Fedora 33 虚拟机，它使用桥接网络适配器，使我可以由 IP 地址 `192.168.1.60` 连接这个系统。点击“<ruby> 打开 <rt>  Open </rt></ruby>”，应会如图示的打开一个窗口：

这是 SSH 的安全措施之一，是为了防止<ruby>   中间人攻击  <rt>  man-in-the-middle attack </rt></ruby>。消息中的指纹应该匹配 Linux 系统中放在 `/etc/ssh/ssh_host_ed25519_key.pub` 的密钥。PuTTY 将这个密钥以 [MD5 哈希值](https://en.wikipedia.org/wiki/MD5) 的方式打印出来。要检查它的真实性，切换到 Linux 系统并打开一个控制台，然后输入：

```
ssh-keygen -l -E md5 -f /etc/ssh/ssh_host_ed25519_key.pub

```

输出应该和 PuTTY 展示的指纹一致：

```
$ ssh-keygen -l -E md5 -f /etc/ssh/ssh_host_ed25519_key.pub
256 MD5:E4:5F:01:05:D0:F7:DC:A6:32 no comment (ED25519)

```

点击“<ruby> 是 <rt>  Yes </rt></ruby>”以确认 PuTTY 的安全提示。主机系统的指纹现在存储在 PuTTY 的信任列表中，其位于 Windows 的注册表中的：

```
HKEY_CURRENT_USER\SOFTWARE\SimonTatham\PuTTY\SshHostKeys

```

输入正确的登录凭证，然后你应该进入控制台了，位置在你的用户主目录。

### 3、通过网络复制文件

除了远程控制台，你同样可以使用 PuTTY 通过 SSH 来传输文件。PuTTY 的安装目录在 `C:\Program Files (x86)\PuTTY`，在该目录下寻找 `ppscp.exe`。你既可以使用它从 Linux 系统复制文件，也可以复制文件到 Linux 系统。

使用 `Windows + R` 然后输入 `cmd` 来打开命令提示符，从你的 Linux 用户主目录复制 `MYFile.txt` 到你的 Windows 主目录，输入：

```
C:\"Program Files (x86)"\PuTTY\pscp.exe stephan@192.168.1.60:/home/stephan/MyFile.txt .

```

要从 Windows 主目录复制文件到 Linux 用户主目录，输入：

```
C:\"Program Files (x86)"\PuTTY\pscp.exe MyFile.txt stephan@192.168.1.60:/home/stephan/

```

就像你也许已经发现的那样，复制的命令通常构造为：

```
pscp.exe <source> <target>

```

### 4、隧道化一个协议

假设你拥有一个 Linux 机器，为某些特别的应用运行一个基于 HTTP 的服务。你想从你的 Windows 机器通过互联网访问这个 HTTP 服务。而且，你不能将相关的 TCP 端口暴露在公网，因为：

1. 这个服务通过 HTTP 而非 HTTPS 运行
2. 根本没有用户管理和登录系统

乍一看，建立这种架构不产生可怕的漏洞似乎是不可能的。但是 SSH 可简单的为这种情况建立一个安全的解决方案。

我将用我的软件项目 [Pythonic](https://github.com/hANSIc99/Pythonic) 来演示这个过程。在容器中运行。Pythonic 作为容器运行，开放两个 TCP 端口：TCP 端口 7000（主要编辑器）和 TCP 端口 8000（[code-server](https://github.com/cdr/code-server) 代码编辑器）。

要在一个 Linux 机器上安装 Pythonic ，运行：

```
podman pull pythonicautomation/pythonic
podman run -d -p 7000:7000 -p 8000:8000 pythonic

```

转向你的 Windows 机器，打开 PuTTy，转到 “<ruby> 连接 <rt>  Connection </rt></ruby> -> SSH -> <ruby> 隧道 <rt>  Tunnels </rt></ruby>”。加入你要转发的两个 TCP 端口：

* 源：`7000` / 目标：`localhost:7000`
* 源：`8000` / 目标：`localhost:8000`

然后返回 “<ruby> 会话 <rt>  Session </rt></ruby>” 部分，并像之前那样建立一个 SSH 链接。打开网页浏览器，然后转到 `http://localhost:7000`；你应该看见像这样的窗口：

你成功的设置了端口转发！

**警告**: 如果你选择在公网上暴露 TCP 端口 22 ，不要使用易于猜测的登录凭证。你将接受来自全世界的登录请求，它们使用常见的、标准的登录凭证以尝试登录你的 Linux 机器。相反，只允许已知的用户登录。这种登录限制可以通过 [公钥加密](https://opensource.com/article/21/4/encryption-decryption-openssl) 来实现，它使用一个密钥对，其中公钥存储在 SSH 主机上，而私钥保留在客户端。

### 调试

如果你难以连接你的 Linux 机器，你可以跟踪你的 SSH 守护进程的处理过程：

```
journalctl -f -u sshd

```

这是一个普通的登录进程，但是其日志级别为 DEBUG，它看起来是这样的 :

### 了解更多

这篇文章几乎没有涉及到使用 SSH 的方法。如果你正在寻找一个特定用例的信息，你也许可以在互联网中找到无数的教程。我在工作中使用 PuTTY ，因为它易于设置，在两个操作系统间又具有良好的可操作性，使得它成为连接解决方案里的瑞士军刀。

（文内图片来自：Stephan Avenwedde，[CC BY-SA 4.0](https://creativecommons.org/licenses/by-sa/4.0/)）

---

via: <https://opensource.com/article/21/6/ssh-windows>

作者：[Stephan Avenwedde](https://opensource.com/users/hansic99) 选题：[lujun9972](https://github.com/lujun9972) 译者：[yjacks](https://github.com/yjacks) 校对：[wxy](https://github.com/wxy)

本文由 [LCTT](https://github.com/LCTT/TranslateProject) 原创编译，[Linux中国](https://linux.cn/) 荣誉推出