如何从 Windows 上用 SSH 连接到 Linux

>
> 使用开源的 PuTTY 工具，从 Windows 建立到 Linux 的 SSH 连接。
>
>
>

![](/data/attachment/album/202207/23/110039pjbd9jbbc84gbz2f.jpg "clouds in windows")

在 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)，然后安装并打开它。你应看到一个像这样的窗口：

![PuTTY configuration screen](/data/attachment/album/202207/23/110048szd6dh4pfhdd7zmm.png "PuTTY configuration screen")

在“<ruby> 主机名（或 IP 地址） <rt>  Host Name (or IP address) </rt></ruby>”输入框，键入你的 Linux 系统的连接信息。本文设置了一个 Fedora 33 虚拟机，它使用桥接网络适配器，使我可以由 IP 地址 `192.168.1.60` 连接这个系统。点击“<ruby> 打开 <rt>  Open </rt></ruby>”，应会如图示的打开一个窗口：

![PutTTY security alert](/data/attachment/album/202207/23/110048gnyjeahjzynsspe5.png "PutTTY security alert")

这是 SSH 的安全措施之一，是为了防止<ruby> <a href="https://en.wikipedia.org/wiki/Man-in-the-middle_attack">  中间人攻击 </a> <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

```

输入正确的登录凭证，然后你应该进入控制台了，位置在你的用户主目录。

![Logged in to SSH](/data/attachment/album/202207/23/110049q1v4tgcov47dvoob.png "Logged in to SSH")

### 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`

![Port forwarding in PuTTY](/data/attachment/album/202207/23/110049jm4rapms266sc7z6.png "Port forwarding in PuTTY")

然后返回 “<ruby> 会话 <rt>  Session </rt></ruby>” 部分，并像之前那样建立一个 SSH 链接。打开网页浏览器，然后转到 `http://localhost:7000`；你应该看见像这样的窗口：

![Pythonic](/data/attachment/album/202207/23/110049jhw6cd6mbk67dgwk.png "Pythonic")

你成功的设置了端口转发！

**警告**: 如果你选择在公网上暴露 TCP 端口 22 ，不要使用易于猜测的登录凭证。你将接受来自全世界的登录请求，它们使用常见的、标准的登录凭证以尝试登录你的 Linux 机器。相反，只允许已知的用户登录。这种登录限制可以通过 [公钥加密](https://opensource.com/article/21/4/encryption-decryption-openssl) 来实现，它使用一个密钥对，其中公钥存储在 SSH 主机上，而私钥保留在客户端。

### 调试

如果你难以连接你的 Linux 机器，你可以跟踪你的 SSH 守护进程的处理过程：

```
journalctl -f -u sshd

```

这是一个普通的登录进程，但是其日志级别为 DEBUG，它看起来是这样的 :

![LogLevel DEBUG output](/data/attachment/album/202207/23/110050lizdhug1zr2ghaz1.png "LogLevel DEBUG output")

### 了解更多

这篇文章几乎没有涉及到使用 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/) 荣誉推出


如何在 Manjaro 和其他 Arch Linux 衍生品上安装 Discord 客户端

Summary: 它在游戏玩家和主播中非常流行。虽然，许多开源项目已经开始使用它来主持他们的社区讨论。你可以找到这类开源社区的 官方 Discord 服务器。

![](/data/attachment/album/202207/23/181625i62zdef7iufup2e6.jpg)

[Discord](https://discord.com/) 是一个跨平台的应用，可用于语音通话、视频通话、文本消息，以及分享媒体和文件。

它在游戏玩家和主播中非常流行。虽然，许多开源项目已经开始使用它来主持他们的社区讨论。你可以找到这类开源社区的 [官方 Discord 服务器](https://discord.com/open-source)。

Discord 可以直接从你的网页浏览器访问。安装官方桌面客户端可以让你获得系统通知和集中交流，而不是在多个打开的标签中摸索 Discord 标签。

虽然 Discord 为 Ubuntu 提供了 Deb 文件，但在 Arch Linux 上却没有这样的即用型软件包。

别担心。在本教程中，我将向你展示两种在 [Arch Linux](https://archlinux.org/) 及其衍生版本上安装 Discord 的方法。

* 通过 [Pacman](https://archlinux.org/pacman/) 安装 Discord（命令行方法，对所有基于 Arch 的发行版有效）。
* 通过 [Pamac](https://gitlab.manjaro.org/applications/pamac) 安装 Discord（GUI 方法，对 Manjaro 和其他一些使用 Pamac 工具的基于 Arch 的发行版有效）。

### 方法 1: 通过 pacman 命令安装 Discord

首先，更新你的系统，因为它是一个滚动发布的版本，[不支持部分升级](https://wiki.archlinux.org/title/System_maintenance#Partial_upgrades_are_unsupported)。

在终端输入以下 [pacman 命令](https://itsfoss.com/pacman-command/) 来 [更新你的 Arch Linux 系统](https://itsfoss.com/update-arch-linux/)。

```
sudo pacman -Syu

```

现在你可以通过以下命令安装 Discord 包。

```
sudo pacman -S discord

```

安装后，只需从应用菜单中启动应用，然后登录就可以开始使用 Discord。

![Discord client in Arch Linux](/data/attachment/album/202207/23/181648ug9aa8d14dizja0g.png)

**如果你想安装 Discord 的每日构建版本** 来测试即将到来的新功能，请使用以下命令。请注意，它可能并不稳定，所以如果你想要这个版本，请再考虑一下。

```
sudo pacman -S discord-canary

```

#### 删除 Discord

如果你想删除 Discord，使用下面的命令来删除它以及它的依赖关系和配置文件：

```
sudo pacman -Rns discord

```

如果你选择的是每日构建版本，请使用以下命令将其删除：

```
sudo pacman -Rns discord-canary

```

这很不错。现在对于不喜欢使用终端的人来说，有一个替代方案。我将在下一节讨论这个问题。

### 方法 2：通过 Pamac 安装 Discord

如果你使用 Arch Linux 的衍生产品，如 [Manjaro Linux](https://manjaro.org/)、[Garuda Linux](https://garudalinux.org/) 等，你就有一个叫做 Pamac 的图形化软件中心。

有了这个图形化的工具，你可以轻松地安装新的应用程序或删除现有的应用，而不必进入终端。

从应用程序菜单中启动 Pamac（添加/删除软件）。

![pamac menu](/data/attachment/album/202207/23/181648wc3vvbzj3xahkvh2.png)

点击“<ruby> 更新 <rt>  Updates </rt></ruby>”来更新你的系统。

![pamac update](/data/attachment/album/202207/23/181648bnegc9ffcq0rrxc0.png)

现在点击“<ruby> 浏览 <rt>  Browse </rt></ruby>”，使用左上方的搜索按钮搜索 “discord”。然后，选择软件包并点击“<ruby> 应用 <rt>  Apply </rt></ruby>”来安装。

![Installing Discord from Pamac](/data/attachment/album/202207/23/181649e1hfz1z8wwlw61ff.png)

你可以用 Pamac 来卸载软件包，就像你安装它一样。

我希望这个关于在基于 Arch 的 Linux 发行版上安装 Discord 的快速技巧对你有帮助。如果你有任何问题或建议，请告诉我。

---

via: <https://itsfoss.com/install-discord-arch-manjaro/>

作者：[Anuj Sharma](https://itsfoss.com/author/anuj/) 选题：[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/) 荣誉推出


硬核观察 #706 openKylin 发布首个体验版，目标“每一行代码都自主创新”

Summary: • openKylin 发布首个体验版，目标“每一行代码都自主创新” • Apache OpenOffice 发布了一个微不足道的更新 • 英特尔提交了一行改进百倍的图形驱动补丁

如果真要“每一行代码都自主创新”，那你自己开发另一种编程语言，那你不要使用linux内核。都是大人了，别说话像小孩子似的。

来自广东广州的 Chrome Mobile 71.0|Android 7.0 用户

这种牛逼有人爱听。

什么时候停止面向上级吹逼，改为面向用户编程，我们就前进了一大步。

来自湖北武汉武汉大学测绘学院的 Chrome 103.0|Windows 10 用户

什么时候停止面向上级吹逼，改为面向用户编程，我们就前进了一大步。

![](/data/attachment/album/202207/23/210322cpevxegbbmf9dcd5.jpg)

![](/data/attachment/album/202207/23/210356xk6xsk3kkrx6xuis.jpg)

### openKylin 发布首个体验版，目标“每一行代码都自主创新”

一个月前，openKylin 社区宣布成立“中国首个桌面操作系统根社区”，其旨在在开源、自愿、平等、协作的基础上，通过开源、开放的社区合作，构建桌面操作系统顶级开源社区。但当时并未发布正式可用的操作系统软件。昨天，他们发布了 openKylin 的首个体验版：openKylin 0.7。它是基于 Linux 5.15 内核和其他开源组件进行构建，目标是“每一行代码都自主创新”。其默认搭载 UKUI 3.1 桌面环境，支持 Wayland，支持 PC、平板双模式。openKylin 社区计划每年发布一个操作系统版本，并不定期推送更新。

>
> **[消息来源：openKylin](https://openkylin.top/news/1765-cn.html)**
>
>
>

>
> 老王点评：在我看来，是不是首个桌面操作系统根社区根本不重要，是不是能做到“每一行代码都自主创新”也不重要，能发布一个广受好评的桌面操作系统才是最重要的。另外一点，这个 0.7 版本号颇具开源软件传统美德。
>
>
>

![](/data/attachment/album/202207/23/210333e4gzgfkl3g18mqnc.jpg)

### Apache OpenOffice 发布了一个微不足道的更新

Apache OpenOffice 于 2011 年创建后，几乎停滞不前。从 [OpenOffice.org](http://openoffice.org/) 分支出来的 LibreOffice 已经成为主导性的开源办公套件，而捐给 Apache 软件基金会的 Apache OpenOffice 只是时不时发布一些安全更新和错误修改。今天它发布了 v4.1.13 版本，可以看的出来，这是最早发布于 2014 年的 4.1 版的第 13 个错误修订版本，几乎没有什么值得一提的新特性。都 2022 年了，Apache OpenOffice 还运行在 Java 8 32 位的底层上。

>
> **[消息来源：Phoronix](https://www.phoronix.com/news/Apache-OpenOffice-4.1.13)**
>
>
>

>
> 老王点评：我觉得 OpenOffice 都快成了 Apache 之耻了，何不放弃转而支持 LibreOffice 呢？难道自家的再破也是家当么？
>
>
>

![](/data/attachment/album/202207/23/210413p631ozsxyjjgj0yr.jpg)

### 英特尔提交了一行改进百倍的图形驱动补丁

开源的英特尔 Mesa Vulkan 驱动并入了一个光线追踪的重点修复，产生“近 100 倍（不是开玩笑）的改进”。更为重要的是，这只是一行代码带来的大幅改进。这是最初编写代码时的一个简单疏忽，但由于这一疏忽，意味着性能的巨大损失，还好它现在被发现了，而且是在英特尔 Arc 图形卡出现在大众面前之前。

>
> **[消息来源：Phoronix](https://www.phoronix.com/news/Intel-Vulkan-RT-100x-Improve)**
>
>
>

>
> 老王点评：所以，官方驱动有时候也挺拉胯的。
>
>
>

### 回音

* 谷歌 [解雇](https://www.theverge.com/2022/7/22/23274958/google-ai-engineer-blake-lemoine-chatbot-lamda-2-sentience) 了报告“AI 具备自我意识”的 [工程师](/article-14705-1.html)，该工程师认为谷歌的 “LaMDA 已经形成了自我意识，表达了对死亡的担忧，对保护的渴望，并确信它能感受到快乐和悲伤等情绪。”
* 在月初 [暂时撤回](/article-14824-1.html) 之后，微软 Office 还是即将于本周迎来 [一项更新](https://techcrunch.com/2022/07/22/microsoft-office-macros-blocked-default/)，以阻止在下载的文档上启用 VBA 宏。


用 nftwatch 监控你的 Linux 防火墙

Summary: 我创建了 Linux nftwatch 命令来观察防火墙的流量统计。

我创建了 Linux nftwatch 命令来观察防火墙的流量统计。

>
> 我创建了 Linux nftwatch 命令来观察防火墙的流量统计。
>
>
>

![](/data/attachment/album/202207/24/070724d542rvbbg3af3o9p.jpg)

Netfilter 表（[nftables](https://developers.redhat.com/blog/2016/10/28/what-comes-after-iptables-its-successor-of-course-nftables?extIdCarryOver=true&sc_cid=701f2000001OH79AAG#getting_started)）是现代 Linux 发行版中的默认防火墙。它在 Fedora 和 RHEL 8、最新的 Debian 和许多其他版本上都有。它取代了早期发行版中捆绑的旧版 iptables。它是一个强大的、值得的 iptables 替代品，作为一个广泛使用它的人，我欣赏它的能力和功能。

nftables 的一个特点是能够为许多元素添加计数器，例如规则。这些都是按需启用的。你需要使用 `counter` 参数，在每一行明确地要求它。我为我的防火墙中的特定规则启用了这些计数器，这使我能够看到这些规则。

这让我开始思考。我怎样才能实时查看这些计数器？一开始我尝试了 `watch`，它允许诸如刷新率之类的东西，但我不喜欢默认格式，而且它不能滚动。我发现使用 `head` 和 `tail` 以及 `awk` 也不理想，并不存在一个用户友好的解决方案。所以我自己写了一个，我想与开源社区分享。

### Linux 上的 nftwatch 介绍

我的解决方案，我称之为 `nftwatch`，做了几件事：

* 它对 nftables 的输出进行重新排序和改写，使其更具有可读性。
* 它允许向上或向下滚动输出。
* 可以由用户定义的刷新率（可以实时改变）。
* 它可以暂停显示。

你得到的不是一个表格的转储，而是显示每个规则活动的输出。

![Image of nftwatch](/data/attachment/album/202207/24/070806e66aw8ab0v9f5r99.jpg)

你可以从它的 [Git 仓库](https://github.com/flyingrhinonz/nftwatch)下载它。

它是 100% 的 Python 代码，100% 的开源，100% 的免费。它满足了所有免费的高质量程序的要求。

### 在 Linux 上安装 nftwatch

以下是手动安装说明：

1. 克隆或从 git 仓库下载该项目。
2. 将 `nftwatch.yml` 复制到 `/etc/nftwatch.yml`。
3. 将 `nftwatch` 复制到 `/usr/local/bin/nftwatch` 并使用 `chmod a+x` 授予其可执行权限。
4. 使用 `nftwatch`，不带任何参数来运行它。
5. 参见 `nftwatch -m` 的手册。

你也可以在没有 [YAML](https://opensource.com/article/21/9/yaml-cheat-sheet) 配置文件的情况下运行 nftwatch，在这种情况下它使用内置的默认值。

### 使用

`nftwatch` 命令显示 nftables 规则。大多数控制都是为此目的而设计的。

箭头键和等效的 Vim 的按键控制滚动。使用 `F` 或 `S` 键来改变刷新速度。使用 `P` 键来暂停显示。

运行 `nftwatch -m` 以获得完整的说明，以及交互式按键控制的列表。

### 防火墙的新观点

即使你花费了时间去配置防火墙，它也会显得晦涩难懂和模糊不清。除了从日志条目中推断指标外，很难判断你的防火墙实际看到的活动类型。 使用 `nftwatch`，你可以看到你的防火墙在工作，并且可以更好地了解你的网络每天需要处理的流量类型。

*（文内图片来自 Kenneth Aaron，CC BY-SA 4.0）*

---

via: <https://opensource.com/article/22/7/nftwatch-linux-firewall>

作者：[Kenneth Aaron](https://opensource.com/users/flyingrhino) 选题：[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/) 荣誉推出


我如何使用开源玩 RPG 游戏

Summary: 为角色扮演游戏的所有元素找到一个开源工具。

为角色扮演游戏的所有元素找到一个开源工具。

>
> 为角色扮演游戏的所有元素找到一个开源工具。
>
>
>

![](/data/attachment/album/202207/24/075445ymf5nvigh4t4htfd.jpg "Dice as a random number generator")

我玩过很多桌面角色扮演游戏（RPG），无论是从频率还是种类来说。一般来说，我更喜欢和朋友一起玩 RPG，但在过去的 2 年里，我一直在玩网络游戏。（LCTT 校注：这里的 RPG 游戏指的是那种“传统”的面对面的桌面游戏，而非很多人最初接触的 RPG 电子游戏。）

起初，我不确定如何在线长期的进行游戏。我知道有很多的工具可以实现，但直到我发现在线桌面游戏的开源世界之前，这些工具没有一个引起我的兴趣。通过一小部分开源应用程序，我已经能够在开源平台上进行我的所有游戏。

这也是一年中的好时机，因为最近是 [免费 RPG 日](https://www.freerpgday.com/)（LCTT 校注：今年的这个节日在 7 月 23 日举办）。在免费 RPG 日，桌面角色扮演游戏行业的发行商们会免费发放游戏，鼓励玩家尝试新游戏和新冒险。尽管它在 2020 年被取消了，但今年它又作为现场活动回归，并通过 [Dungeon Crawl Classics](https://goodman-games.com/blog/2021/10/06/pdf-previews-of-our-free-rpg-day-releases/) 和 [Paizo](https://paizo.com/community/blog/v5748dyo6shte) 的免费 RPG 示例下载提供了一些虚拟支持。

如果这个活动提供的虚拟产品还不够，我还整理了一份 [你可能尚未尝试过的 5 个开源桌面 RPG 游戏列表](https://opensource.com/article/21/10/rpg-tabletop-games)。

当你准备好开始玩游戏时，请尝试其中一些开源工具，看看它们能在多大程度上增强你的游戏体验。

### 聊天

在线 RPG 游戏最基本的（从技术上讲，也是唯一的）要求是交流。这是游戏的媒介：玩家需要一种说话的途径。

有几个不错的选择。我发现 [Mumble](http://mumble.info/) 是对带宽需求最低的工具。这是一个纯语音聊天应用程序，可以使用非常高效的 Opus 编解码器让每个人一次交谈数小时而不会中断。

![Mumble client](/data/attachment/album/202207/24/075500e414ong865oo00qq.png "Mumble client")

它在世界各地都运行有公共实例，所以下载 Mumble 客户端后，你可以加入其中任何一个开放的实例，并使用它来在线运行游戏。有一个“按下通话”设置，你可以用此来消除背景噪音，当你的其他家庭成员在进行其它工作而不想被你的桌面会话打扰时，这个功能将会非常实用。

还有一个文本聊天客户端。我的游戏组通常使用它来发布与游戏相关的链接，但你也可以将其用于其它无关内容的交谈，而让口头游戏保持在主题上。

如果你的玩家更喜欢看到面部表情，或者只是习惯于视频聊天网页应用。那么 [Jitsi](https://jitsi.org/) 是面对面围坐在桌子旁聚会的绝佳替代品。Jitsi 和你曾经使用过的其它视频聊天软件几乎一样，甚至更简单。你可以设置一个“房间”，邀请朋友，将陌生人拒之门外，并玩上几个小时。静音和关闭摄像都很直观，界面很吸引人，并且还定期开发和推出了新功能。

![Jitsi](/data/attachment/album/202207/24/075500g0mksrk4gknmmr4m.jpg "Jitsi")

Mumble 和 Jitsi 都有适用于台式机和移动设备的客户端，因此任何人都可以在任何设备上使用。

### 角色表

我发布了我的 [数字角色表](https://opensource.com/article/21/10/3-ways-manage-your-character-sheets-open-source) 解决方案，但任何 RPG 玩家都知道管理角色不仅仅是统计数据。

在延续多个会话的在线游戏中，我发现每次游戏之间有很长的停止时间。我突然想到，虽然我发现要求我的玩家在现场纸笔游戏中计算损耗是不合理的，但当一切都是数字化时，要求他们跟踪损耗很容易。

网上有很多可用的电子表格，但开源的选择是 [Ethercalc](http://ethercalc.net/)。由于其实例遍布世界各地，因此很容易找到免费的 Ethercalc 主机。或者，你可以使用 Podman 或者 Docker 轻松安装和运行你自己的实例。

![Ethercalc spreadsheet of inventory](/data/attachment/album/202207/24/075500np1zft0dp302fclz.jpg "Ethercalc")

Etherclac 提供了一些基本要素：一个共享的账本，这样玩家就可以跟踪他们的团队所携带的物品（以及在任何给定的时间持有该物品的人）、每件物品的重量和价值。当队伍在游戏过程中收集到战利品时，就会输入该物品，所以他们知道什么自己何时会因为负担过重而无法拿起新物品。

在不同的游戏会话之间，可以引用和整理这份共享的电子表格，以便玩家（PC）知道哪些物品可以卖掉，哪些物品可以放入储物袋，哪些物品可以在下一次会话发现更好的战利品时安全的丢弃。

### 地图

Mythic Table 是一款开源的桌面游戏共享地图系统。这意味着你可以加载图片作为游戏地图，并在地图上移动数字标记以表示玩家角色所在的位置。

自从 [上次我介绍了关于 Mythic Table](https://opensource.com/article/20/11/open-source-battle-maps) 以来，它已经在 Kickstarter 上成功地进行了一次众筹，以确保它的持续发展。它还增加了一些新功能，其中最引人注目的是“战争迷雾”功能，它允许地下城主掩盖地图并仅显示玩家探索过的部分。

![A dungeon map rendered by Mythic Table and user interface choices for chat, maps, and characters](/data/attachment/album/202207/24/075501yj4m4ntiz6sx4355.jpg "Mythic Table")

在过去的几个月里，我一直在 Mythic Table 上运行两款游戏，这是一款优秀且直观的地图系统。它还提供了一个数字骰子筒，所以如果你的玩家没有骰子，或者你更喜欢在公开场合掷骰子，你就可以用它作为共享的骰子池。

你可以在 [mythictable.com](http://mythictable.com/) 上试用 Mythic Table，或者访问他们在 [Github](https://gitlab.com/mythicteam/mythictable) 上的代码库。

### 开源的开放游戏

我使用的开源工具是通用的，因此它们适用于你想玩的任何游戏系统。因为它们都是开源的，所以无论你的玩家使用什么操作系统，他们都可以在线使用，并且它们都可以自托管。

如果你既是程序员又是游戏玩家，请访问他们的 Git 代码仓库，看看是否有任何你可以贡献的东西。如果你是游戏玩家或者游戏管理员，在下次坐在数字版的游戏桌前请尝试使用一下这些工具。你可能会惊讶于你只需要很少的在线账户就可以使用一些可用于游戏的最佳应用程序。

*（文内图片来自：Seth Kenlon，CC-BY-SA 4.0）*

---

via: <https://opensource.com/article/21/10/open-source-rpgs>

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

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


硬核观察 #707 Linux x86_32 架构易受 Retbleed 漏洞影响，但没人关心

Summary: • Linux x86_32 架构易受 Retbleed 漏洞影响，但没人关心 • T2 SDE Linux 发布第一个 AI 超过人类贡献总和的版本 • 荷兰教育部要求学校暂停使用 Chrome

有GDPR限制总好过没有，虽然已经没多少隐私了

![](/data/attachment/album/202207/24/122420z54cuc9ym1kcc1sc.jpg)

![](/data/attachment/album/202207/24/122429sllgikbuzabk54ga.jpg)

### Linux x86\_32 架构易受 Retbleed 漏洞影响，但没人关心

虽然相关的英特尔和AMD处理器已经对最近影响老一代处理器的 Retbleed 安全漏洞提供了缓解措施，但这些缓解措施目前只适用于 x86\_64 内核，如果在受影响的硬件上运用传统的 32 位 x86 内核，则这些安全措施无法发挥作用。事实证明，32 位的 Debian 即使打了补丁的内核，i386 部分仍然容易受到 Retbleed 攻击。Linux 稳定版内核维护负责人 GKH 说，“我不认为这是一个应该关心的有效组合。”英特尔的工程师补充说，“是的，到目前为止没有人关心修复 32 位架构。但如果有人真正关心并想投入精力，我想我会审查这些补丁，但说真的，没人会也不应该在基于 Skylake/Zen 的系统上运行 32 位内核，这太傻了。”

>
> **[消息来源：phoronix](https://www.phoronix.com/news/Linux-x86-Retbleed)**
>
>
>

>
> 老王点评：过时的硬件连厂商和开源操作系统都不想管，虽然确实是老了点。
>
>
>

![](/data/attachment/album/202207/24/122444au3gpy539ujmem4l.jpg)

### T2 SDE Linux 发布第一个 AI 超过人类贡献总和的版本

T2 SDE Linux 发布了 22.6 版本，其公告中称，它不仅仅是一个普通的 Linux发行版，而是一个“元发行版”。T2 允许用最先进的技术、最新的软件包和对交叉编译的集成支持来创建定制的发行版。T2 以其复杂的交叉编译支持而闻名，并支持几乎所有现有的 CPU 架构，并在嵌入式系统中广泛使用。在这个新的版本中，为 25 种 CPU 架构、变体和 C 库提供了全面支持。这也是第一个由 AI 驱动的软件包更新机器人 “data” 贡献的修改比人类贡献者加起来还要多的重要版本。（AI ：164，人类：141）

>
> **[消息来源：T2 SDE](https://t2sde.org/)**
>
>
>

>
> 老王点评：看来以后各种 AI 会接过更多开发工作。
>
>
>

![](/data/attachment/album/202207/24/122506ampx4kb6y10pzop1.jpg)

### 荷兰教育部要求学校暂停使用 Chrome

出于对数据隐私的担忧，荷兰教育部决定在 2023 年 8 月前暂停使用谷歌的 ChromeOS 以及 Chrome 浏览器。官员们担心，谷歌服务收集学生数据，并将其提供给大型广告网络，而这些广告网络使用这些数据的目的超出了对教育的帮助。由于国家监督机构不知道学生的个人数据在哪里被存储和处理，人们担心会违反欧盟的 GDPR。谷歌承诺在明年之前准备好新版本的 Chrome 浏览器和 ChromeOS，因此临时禁令适用到那时，荷兰监管机构将作出新的评估。

>
> **[消息来源：Bleeping Computer](https://www.bleepingcomputer.com/news/security/chrome-use-subject-to-restrictions-in-dutch-schools-over-data-security-concerns/)**
>
>
>

>
> 老王点评：ChromeOS 本来就是主要为学校环境设计的，却因为欧洲的数据法案不能在学校使用了。
>
>
>


在 Ubuntu 中使用 apt 命令列出可升级的软件包

Summary: apt 还提供了一些额外的功能，其中之一是能够查看系统上所有可升级的软件包。

apt 还提供了一些额外的功能，其中之一是能够查看系统上所有可升级的软件包。

![](/data/attachment/album/202207/24/230954qjko0c0sn55ohjf0.jpg)

[apt 命令](https://itsfoss.com/apt-command-guide/) 用于 Debian 和 Ubuntu 中的包管理。虽然你可能已经熟悉安装和删除选项，但 `apt` 还提供了一些额外的功能。

其中之一是能够查看系统上所有可升级的软件包。要显示它们，你所要做的就是在终端中使用以下命令：

```
apt list --upgradable

```

如你所见，你甚至不需要使用 `sudo` 来列出可更新的包。它只是列出了可以更新的包，而不会更新它们。

实际上，当你运行 `sudo apt update` 命令更新本地包仓库缓存时，`apt` 命令会添加此提示。

```
Fetched 1,243 kB in 17s (71.4 kB/s)
Reading package lists... Done
Building dependency tree... Done
Reading state information... Done
30 packages can be upgraded. Run 'apt list --upgradable' to see them.

```

我不记得在旧的 `apt-get` 命令中有任何类似的直接选项来列出所有可升级的包。这是 `apt` 在旧的 `apt-get` 命令之上添加的几个新功能之一。

让我们更详细地讨论一下。

### 列出所有可升级的包

你在这里应该知道的是**你只能列出通过 APT 包管理器可用的更新**。因此，如果你已将 PPA 或 [外部仓库](https://itsfoss.com/adding-external-repositories-ubuntu/) 添加到系统的 `sources.list`，你也将看到来自它们的更新。

但是你不会在这里获得 AppImage、Flatpak、Snap 或一些其他打包格式的更新。

换句话说，它只适用于 APT 包。

因此，要列出 Ubuntu 或 Debian 系统上的所有可升级包，你应该首先更新本地包缓存：

```
sudo apt update

```

然后你的系统将知道可用的软件包更新。`apt` 命令告诉你在 update 命令结束时可以升级多少个软件包：

![The apt command shows the number of upgradable packages at the bottom of the apt update command output](/data/attachment/album/202207/24/231221a8i85r8zvn4z8xbe.png)

要查看可以升级的软件包，请运行以下命令：

```
apt list --upgradable

```

你应该看到这样的输出：

```
~$ apt list --upgradable
Listing... Done
apparmor/jammy-updates 3.0.4-2ubuntu2.1 amd64 [upgradable from: 3.0.4-2ubuntu2]
brave-browser/stable 1.40.113 amd64 [upgradable from: 1.40.107]
evolution-data-server-common/jammy-updates,jammy-updates 3.44.2-0ubuntu1 all [upgradable from: 3.44.1-0ubuntu2]
evolution-data-server/jammy-updates 3.44.2-0ubuntu1 amd64 [upgradable from: 3.44.1-0ubuntu2]

```

![Listing all the upgradable packages](/data/attachment/album/202207/24/231248le90whaikrr0r600.jpg)

它**按字母顺序列出所有可升级的软件包**以及有关当前安装版本和新可用软件包版本的信息。

```
brave-browser/stable 1.40.113 amd64 [upgradable from: 1.40.107]

```

例如，这显示我系统上安装了 Brave 浏览器，版本 1.40.107，并且版本 1.40.113 可用。

你能用这些信息做什么？让我分享一些我能想到的事情。

### 升级所有包

这可能是大多数普通 Ubuntu 用户所做的。你可以使用以下命令升级所有可升级包：

```
sudo apt upgrade

```

它列出了将要升级的软件包，然后要求按回车或 `Y` 确认升级。

![Upgrade all packages](/data/attachment/album/202207/24/231300l7adqi7j3kd77ham.jpg)

如果你确定要升级所有软件包，则可以通过在命令中添加 `-y` 来跳过 “Do you want to continue” 部分。

```
sudo apt upgrade -y

```

### 模拟升级（但不升级任何包）

这是人们在 `apt list` 命令之前所做的。使用模拟选项，你实际上不会进行任何更改。它仅显示运行升级时将安装或升级的软件包。

```
apt -s upgrade

```

你不需要使用 `sudo`（即使我在下面的截图中使用了它）。

![Running an upgrade simulation with apt command](/data/attachment/album/202207/24/231336xtkp8p772zr61kl6.jpg)

### 仅升级选定的包

如果你正在管理一个 Ubuntu 服务器，并且你不想升级所有软件包，而只想升级少数选定的软件包中的一个（如 MySQL/Ngnix），你可以使用 `apt` 命令轻松完成。

```
sudo apt --only-upgrade install package_name

```

实际上，如果你在已安装且有可用更新的软件包上运行 `apt install` 命令，它将升级该软件包。

使用 `--only-upgrade` 标志，你可以确保**仅升级**软件包（如果已安装）。如果尚未安装，它将不会安装给定的包。

你还可以通过提供名称来升级选定的几个包：

```
sudo apt --only-upgrade install package1 package2

```

你也可以做相反的事情，[升级时保留选定的软件包](https://itsfoss.com/prevent-package-update-ubuntu/)。

```
sudo apt-mark hold package_name

```

这样，当你升级所有系统包时，将不会升级给定的包。

你可以使用以下命令删除保留设置：

```
sudo apt-mark unhold package_name

```

### 是否显示内核升级？

这有点棘手。

当你运行 `apt list –upgradable` 命令时，它会显示所有可以升级的包。

但是如果有新的内核版本可用，它们可能不会显示，因为内核包名称以 `linux-headers-x-y` 开头。这是因为系统将它们视为新包，而不是对已安装的包 `linux-headers-a-b` 的升级。

但是，你仍然会在可升级包列表中看到 `linux-generic-hwe` 类型的包，因为该软件包将被升级（使用较新的内核）。

### 总结

列出可升级包的能力是 `apt` 命令为旧的 `apt-get` 命令带来的几个新功能之一。有关此主题的更多信息，你可以阅读我 [解释 apt 和 apt-get 命令之间的区别](https://itsfoss.com/apt-vs-apt-get-difference/) 的文章。

作为桌面用户，我并不总是检查可以升级的软件包。我直接去升级。但是，当我管理服务器时，我更喜欢查看可用的更新，然后决定是否进行升级。

你呢？你觉得这个功能对你自己有用吗？

---

via: <https://itsfoss.com/apt-list-upgradable/>

作者：[Abhishek Prakash](https://itsfoss.com/author/abhishek/) 选题：[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/) 荣誉推出


Java 的七种垃圾收集器

Summary: 了解 Java 中的内存管理。

了解 Java 中的内存管理。

![](/data/attachment/album/202207/25/075744nw0c9c4vtvkgiuct.jpg)

>
> 了解 Java 中的内存管理。
>
>
>

用 C 或 C++ 这样的编程语言写一个应用时，需要编写代码来销毁内存中不再需要的对象。当应用程序扩展得越来越复杂时，未使用对象被忽略释放的可能性就越大。这会导致内存泄露，最终内存耗尽，在某个时刻将没有更多的内存可以分配。结果就是应用程序运行失败并出现 OutOfMemoryError 错误。但在 Java 中，<ruby> 垃圾收集器 <rt>  Garbage Collection </rt></ruby>（GC）会在程序执行过程中自动运行，减轻了手动分配内存和可能的内存泄漏的任务。

垃圾收集器并不只有一种，Java 虚拟机（JVM）有七种不同的垃圾收集器，了解每种垃圾收集器的目的和优点是很有用的。

### 1、Serial 收集器

![Serial threaded garbage collection](/data/attachment/album/202207/25/075857m2b4wp1hbwt1ubx9.png)

垃圾收集器的原始实现，使用单线程。当垃圾收集器运行时，会停止应用程序（通常称为“stop the world”事件）。适用于能够承受短暂停顿的应用程序。该垃圾收集器占用内存空间比较小，因此这是嵌入式应用程序的首选垃圾收集器类型。在运行时使用以下命令启用该垃圾收集器：

```
$ java -XX:+UseSerialGC

```

### 2、Parallel 收集器

![Parallel garbage collection](/data/attachment/album/202207/25/075906mkddaddkkvdf4qwr.png)

像 Serial 收集器一样，Parallel 收集器也使用“stop the world”方法。这意味着，当垃圾收集器运行时，应用程序线程会停止。但是不同的是，Parallel 收集器运行时有多个线程执行垃圾收集操作。这种类型的垃圾收集器适用于在多线程和多处理器环境中运行中到大型数据集的应用程序。

这是 JVM 中的默认垃圾收集器，也被称为*吞吐量收集器*。使用该垃圾收集器时可以通过使用各种合适的 JVM 参数进行调优，例如吞吐量、暂停时间、线程数和内存占用。如下：

* 线程数：`-XX:ParallelGCThreads=<N>`
* 暂停时间：`-XX:MaxGCPauseMillis=<N>`
* 吞吐量（垃圾收集花费的时间与实际应用程序执行的时间相比）：`-XX:GCTimeRatio=<N>`
* 最大堆内存：`-Xmx<N>`

Parallel 收集器可以使用该命令显式启用：`java -XX:+UseParallelGC` 。使用这个命令，指定在新生代中通过多个线程进行垃圾回收，而老年代中的垃圾收集和内存压缩仍使用单个线程完成的。

还有一个版本的的 Parallel 收集器叫做 “Parallel Old GC”，它对新生代和老年代都使用多线程，启用命令如下：

```
$ java -XX:+UseParallelOldGC

```

### 3、Concurrent Mark Sweep（CMS）收集器

![Concurrent garbage collection](/data/attachment/album/202207/25/075915c68icjz88wsn2tzq.png)

Concurrent Mark Sweep（CMS）垃圾收集器与应用程序并行运行。对于新生代和老年代都使用了多线程。在 CMS 垃圾收集器删除无用对象后，不会对存活对象进行内存压缩。该垃圾收集器和应用程序并行运行，会降低应用程序的响应时间，适用于停顿时间较短的应用程序。这个收集器在 Java8 已过时，并在 Java14 中被移除。如果你仍在使用有这个垃圾收集器的 Java 版本，可以使用如下命令启用：

```
$ java -XX:+UseConcMarkSweepGC

```

在 CMS 垃圾收集器使用过程中，应用程序将暂停两次。首次暂停发生在标记可直接访问的存活对象时，这个暂停被称为*初始标记*。第二次暂停发生在 CMS 收集器结束时期，来修正在并发标记过程中，应用程序线程在 CMS 垃圾回收完成后更新对象时被遗漏的对象。这就是所谓的*重新标记*。

### 4、G1 收集器

![Garbage first](/data/attachment/album/202207/25/075755ex2g94148qxqkch2.png)

G1 垃圾收集器旨在替代 GMS。G1 垃圾收集器具备并行、并发以及增量压缩，且暂停时间较短。与 CMS 收集器使用的内存布局不同，G1 收集器将堆内存划分为大小相同的区域，通过多个线程触发全局标记阶段。标记阶段完成后，G1 知道哪个区域可能大部分是空的，并首选该区域作为清除/删除阶段。

在 G1 收集器中，一个对象如果大小超过半个区域容量会被认为是一个“大对象” 。这些对象被放置在老年代中，在一个被称为“humongous region”的区域中。 启用 G1 收集器的命令如下：

```
$ java -XX:+UseG1GC

```

### 5、Epsilon 收集器

该垃圾收集器是在 Java11 中引入的，是一个 *no-op*（无操作）收集器。它不做任何实际的内存回收，只负责管理内存分配。Epsilon 只在当你知道应用程序的确切内存占用情况并且不需要垃圾回收时使用。启用命令如下：

```
$ java -XX:+UnlockExperimentalVMOptions -XX:+UseEpsilonGC

```

### 6、Shenandoah 收集器

Shenandoah 是在 JDK12 中引入的，是一种 CPU 密集型垃圾收集器。它会进行内存压缩，立即删除无用对象并释放操作系统的空间。所有的这一切与应用程序线程并行发生。启用命令如下：

```
$ java -XX:+UnlockExperimentalVMOptions -XX:+UseShenandoahGC

```

### 7、ZGC 收集器

ZGC 为低延迟需要和大量堆空间使用而设计，允许当垃圾回收器运行时 Java 应用程序继续运行。ZGC 收集器在 JDK11 引入，在 JDK12 改进。在 JDK15，ZGC 和 Shenandoah 都被移出了实验阶段。启用 ZGC 收集器使用如下命令：

```
$ java -XX:+UnlockExperimentalVMOptions -XX:+UseZGC

```

### 灵活的垃圾收集器

Java 为我们提供了灵活的内存管理方式，熟悉不同的可用方法有助于为正在开发或运行的应用程序选择最合适的内存管理方式。

---

via: <https://opensource.com/article/22/7/garbage-collection-java>

作者：[Jayashree Huttanagoudar](https://opensource.com/users/jayashree-huttanagoudar) 选题：[lkxed](https://github.com/lkxed) 译者：[Veryzzj](https://github.com/Veryzzj) 校对：[wxy](https://github.com/wxy)

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


当你在终端上按下一个键时会发生什么？

Summary: 当你在终端中按下键盘上的一个键（比如 Delete，或 Escape，或 a），发送了哪些字节？

![](/data/attachment/album/202207/25/110217dlbzqvm9lltkq244.jpg)

我对<ruby> 终端 <rt>  Terminal </rt></ruby>是怎么回事困惑了很久。

但在上个星期，我使用 [xterm.js](https://xtermjs.org/) 在浏览器中显示了一个交互式终端，我终于想到要问一个相当基本的问题：当你在终端中按下键盘上的一个键（比如 `Delete`，或 `Escape`，或 `a`），发送了哪些字节？

像往常一样，我们将通过做一些实验来回答这个问题，看看会发生什么 : )

### 远程终端是非常古老的技术

首先，我想说的是，用 `xterm.js` 在浏览器中显示一个终端可能看起来像一个新事物，但它真的不是。在 70 年代，计算机很昂贵。因此，一个机构的许多员工会共用一台电脑，每个人都可以有自己的 “终端” 来连接该电脑。

例如，这里有一张 70 年代或 80 年代的 VT100 终端的照片。这看起来像是一台计算机（它有点大！），但它不是 —— 它只是显示实际计算机发送的任何信息。

[![DEC VT100终端](/data/attachment/album/202207/25/110221ize6ezvaehez2za6.jpg)](https://commons.wikimedia.org/wiki/File:DEC_VT100_terminal.jpg "Jason Scott, CC BY 2.0 <https://creativecommons.org/licenses/by/2.0>, via Wikimedia Commons")

当然，在 70 年代，他们并没有使用 Websocket 来做这个，但来回发送的信息的方式和当时差不多。

（照片中的终端是来自西雅图的 <ruby> <a href="https://livingcomputers.org/">  活电脑博物馆 </a> <rt>  Living Computer Museum </rt></ruby>，我曾经去过那里，并在一个非常老的 Unix 系统上用 `ed` 编写了 FizzBuzz，所以我有可能真的用过那台机器或它的一个兄弟姐妹！我真的希望活电脑博物馆能再次开放，能玩到老式电脑是非常酷的。）

### 发送了什么信息？

很明显，如果你想连接到一个远程计算机（用 `ssh` 或使用 `xterm.js` 和 Websocket，或其他任何方式），那么需要在客户端和服务器之间发送一些信息。

具体来说：

**客户端** 需要发送用户输入的键盘信息（如 `ls -l`）。 **服务器** 需要告诉客户端在屏幕上显示什么。

让我们看看一个真正的程序，它在浏览器中运行一个远程终端，看看有哪些信息会被来回发送！

### 我们将使用 goterm 来进行实验

我在 GitHub 上发现了这个叫做 [goterm](https://github.com/freman/goterm) 的小程序，它运行一个 Go 服务器，可以让你在浏览器中使用 `xterm.js` 与终端进行交互。这个程序非常不安全，但它很简单，很适合学习。

我 [复刻了它](https://github.com/jvns/goterm)，使它能与最新的 `xterm.js` 一起工作，因为它最后一次更新是在 6 年前。然后，我添加了一些日志语句，以打印出每次通过 WebSocket 发送/接收的字节数。

让我们来看看在几个不同的终端交互过程中的发送和接收情况吧!

### 示例：ls

首先，让我们运行 `ls`。下面是我在 `xterm.js` 终端上看到的情况：

```
~:/play$ ls
file
~:/play$

```

以下是发送和接收的内容：（在我的代码中，我记录了每次客户端发送的字节：`sent: [bytes]`，每次它从服务器接收的字节：`recv: [bytes]`）

```
sent: "l"
recv: "l"
sent: "s"
recv: "s"
sent: "\r"
recv: "\r\n\x1b[?2004l\r"
recv: "file\r\n"
recv: "\x1b[~:/play$ "

```

我在这个输出中注意到 3 件事：

1. 回显：客户端发送 `l`，然后立即收到一个 `l` 发送回来。我想这里的意思是，客户端真的很笨 —— 它不知道当我输入`l` 时，我想让 `l` 被回显到屏幕上。它必须由服务器进程明确地告诉它来显示它。
2. 换行：当我按下回车键时，它发送了一个 `\r'（回车）符号，而不是`\n'（换行）。
3. 转义序列：`\x1b` 是 ASCII 转义字符，所以 `\x1b[?2004h` 是告诉终端显示什么或其他东西。我想这是一个颜色序列，但我不确定。我们稍后会详细讨论转义序列。

好了，现在我们来做一些稍微复杂的事情。

### 示例：Ctrl+C

接下来，让我们看看当我们用 `Ctrl+C` 中断一个进程时会发生什么。下面是我在终端中看到的情况：

```
~:/play$ cat
^C
~:/play$

```

而这里是客户端发送和接收的内容。

```
sent: "c"
recv: "c"
sent: "a"
recv: "a"
sent: "t"
recv: "t"
sent: "\r"
recv: "\r\n\x1b[?2004l\r"
sent: "\x03"
recv: "^C"
recv: "\r\n"
recv: "\x1b[?2004h"
recv: "~:/play$ "

```

当我按下 `Ctrl+C` 时，客户端发送了 `\x03`。如果我查 ASCII 表，`\x03` 是 “文本结束”，这似乎很合理。我认为这真的很酷，因为我一直对 `Ctrl+C` 的工作原理有点困惑 —— 很高兴知道它只是在发送一个 `\x03` 字符。

我相信当我们按 `Ctrl+C` 时，`cat` 被中断的原因是服务器端的 Linux 内核收到这个 `\x03` 字符，识别出它意味着 “中断”，然后发送一个 `SIGINT` 到拥有伪终端的进程组。所以它是在内核而不是在用户空间处理的。

### 示例：Ctrl+D

让我们试试完全相同的事情，只是用 `Ctrl+D`。下面是我在终端看到的情况：

```
~:/play$ cat
~:/play$

```

而这里是发送和接收的内容：

```
sent: "c"
recv: "c"
sent: "a"
recv: "a"
sent: "t"
recv: "t"
sent: "\r"
recv: "\r\n\x1b[?2004l\r"
sent: "\x04"
recv: "\x1b[?2004h"
recv: "~:/play$ "

```

它与 `Ctrl+C` 非常相似，只是发送 `\x04` 而不是 `\x03`。很好！`\x04` 对应于 ASCII “传输结束”。

### Ctrl + 其它字母呢？

接下来我开始好奇 —— 如果我发送 `Ctrl+e`，会发送什么字节？

事实证明，这只是该字母在字母表中的编号，像这样。

* `Ctrl+a` => 1
* `Ctrl+b` => 2
* `Ctrl+c` => 3
* `Ctrl+d` => 4
* ...
* `Ctrl+z` => 26

另外，`Ctrl+Shift+b` 的作用与 `Ctrl+b` 完全相同（它写的是`0x2`）。

键盘上的其他键呢？下面是它们的映射情况：

* `Tab` -> 0x9（与 `Ctrl+I` 相同，因为 I 是第 9 个字母）
* `Escape` -> `\x1b`
* `Backspace` -> `\x7f`
* `Home` -> `\x1b[H`
* `End` -> `\x1b[F`
* `Print Screen` -> `\x1b\x5b\x31\x3b\x35\x41`
* `Insert` -> `\x1b\x5b\x32\x7e`
* `Delete` -> `\x1b\x5b\x33\x7e`
* 我的 `Meta` 键完全没有作用

那 `Alt` 呢？根据我的实验（和一些搜索），似乎 `Alt` 和 `Escape` 在字面上是一样的，只是按 `Alt` 本身不会向终端发送任何字符，而按 `Escape` 本身会。所以：

* `alt + d` => `\x1bd`（其他每个字母都一样）
* `alt + shift + d` => `\x1bD`（其他每个字母都一样）
* 诸如此类

让我们再看一个例子！

### 示例：nano

下面是我运行文本编辑器 `nano` 时发送和接收的内容：

```
recv: "\r\x1b[~:/play$ "
sent: "n" [[]byte{0x6e}]
recv: "n"
sent: "a" [[]byte{0x61}]
recv: "a"
sent: "n" [[]byte{0x6e}]
recv: "n"
sent: "o" [[]byte{0x6f}]
recv: "o"
sent: "\r" [[]byte{0xd}]
recv: "\r\n\x1b[?2004l\r"
recv: "\x1b[?2004h"
recv: "\x1b[?1049h\x1b[22;0;0t\x1b[1;16r\x1b(B\x1b[m\x1b[4l\x1b[?7h\x1b[39;49m\x1b[?1h\x1b=\x1b[?1h\x1b=\x1b[?25l"
recv: "\x1b[39;49m\x1b(B\x1b[m\x1b[H\x1b[2J"
recv: "\x1b(B\x1b[0;7m  GNU nano 6.2 \x1b[44bNew Buffer \x1b[53b \x1b[1;123H\x1b(B\x1b[m\x1b[14;38H\x1b(B\x1b[0;7m[ Welcome to nano.  For basic help, type Ctrl+G. ]\x1b(B\x1b[m\r\x1b[15d\x1b(B\x1b[0;7m^G\x1b(B\x1b[m Help\x1b[15;16H\x1b(B\x1b[0;7m^O\x1b(B\x1b[m Write Out   \x1b(B\x1b[0;7m^W\x1b(B\x1b[m Where Is    \x1b(B\x1b[0;7m^K\x1b(B\x1b[m Cut\x1b[15;61H"

```

你可以看到一些来自用户界面的文字，如 “GNU nano 6.2”，而这些 `\x1b[27m` 的东西是转义序列。让我们来谈谈转义序列吧！

### ANSI 转义序列

上面这些 `nano` 发给客户端的 `\x1b[` 东西被称为“转义序列”或 “转义代码”。这是因为它们都是以 “转义”字符 `\x1b` 开头。它们可以改变光标的位置，使文本变成粗体或下划线，改变颜色，等等。[维基百科介绍了一些历史](https://en.wikipedia.org/wiki/ANSI_escape_code)，如果你有兴趣的话可以去看看。

举个简单的例子：如果你在终端运行

```
echo -e '\e[0;31mhi\e[0m there'

```

它将打印出 “hi there”，其中 “hi” 是红色的，“there” 是黑色的。[本页](https://misc.flogisoft.com/bash/tip_colors_and_formatting) 有一些关于颜色和格式化的转义代码的例子。

我认为有几个不同的转义代码标准，但我的理解是，人们在 Unix 上使用的最常见的转义代码集来自 VT100（博客文章顶部图片中的那个老终端），在过去的 40 年里没有真正改变。

转义代码是为什么你的终端会被搞乱的原因，如果你 `cat` 一些二进制数据到你的屏幕上 —— 通常你会不小心打印出一堆随机的转义代码，这将搞乱你的终端 —— 如果你 `cat` 足够多的二进制数据到你的终端，那里一定会有一个 `0x1b` 的字节。

### 可以手动输入转义序列吗？

在前面几节中，我们谈到了 `Home` 键是如何映射到 `\x1b[H` 的。这 3 个字节是 `Escape + [ + H`（因为 `Escape` 是`\x1b`）。

如果我在 `xterm.js` 终端手动键入 `Escape` ，然后是 `[`，然后是 `H`，我就会出现在行的开头，与我按下 `Home` 完全一样。

我注意到这在我的电脑上的 Fish shell 中不起作用 —— 如果我键入 `Escape`，然后输入 `[`，它只是打印出 `[`，而不是让我继续转义序列。我问了我的朋友 Jesse，他写过 [一堆 Rust 终端代码](https://github.com/doy/vt100-rust)，Jesse 告诉我，很多程序为转义代码实现了一个 **超时** —— 如果你在某个最小的时间内没有按下另一个键，它就会决定它实际上不再是一个转义代码了。

显然，这在 Fish shell 中可以用 `fish_escape_delay_ms` 来配置，所以我运行了 `set fish_escape_delay_ms 1000`，然后我就能用手输入转义代码了。工作的很好！

### 终端编码有点奇怪

我想在这里暂停一下，我觉得你按下的键被映射到字节的方式是非常奇怪的。比如，如果我们今天从头开始设计按键的编码方式，我们可能不会把它设置成这样：

* `Ctrl + a` 和 `Ctrl + Shift + a` 做的事情完全一样。
* `Alt` 与 `Escape` 是一样的
* 控制序列（如颜色/移动光标）使用与 `Escape` 键相同的字节，因此你需要依靠时间来确定它是一个控制序列还是用户只是想按 `Escape`。

但所有这些都是在 70 年代或 80 年代或什么时候设计的，然后需要永远保持不变，以便向后兼容，所以这就是我们得到的东西 :smiley:

### 改变窗口大小

在终端中，并不是所有你能做的事情都是通过来回发送字节发生的。例如，当终端被调整大小时，我们必须以不同的方式告诉 Linux 窗口大小已经改变。

下面是 [goterm](https://github.com/freman/goterm/blob/a644c10e180ce8af789ea3e4e4892dcf078e97e2/main.go#L110-L115) 中用来做这件事的 Go 代码的样子：

```
syscall.Syscall(
    syscall.SYS_IOCTL,
    tty.Fd(),
    syscall.TIOCSWINSZ,
    uintptr(unsafe.Pointer(&resizeMessage)),
)

```

这是在使用 `ioctl` 系统调用。我对 `ioctl` 的理解是，它是一个系统调用，用于处理其他系统调用没有涉及到的一些随机的东西，通常与 IO 有关，我猜。

`syscall.TIOCSWINSZ` 是一个整数常数，它告诉 `ioctl` 我们希望它在本例中做哪件事（改变终端的窗口大小）。

### 这也是 xterm 的工作方式。

在这篇文章中，我们一直在讨论远程终端，即客户端和服务器在不同的计算机上。但实际上，如果你使用像 xterm 这样的终端模拟器，所有这些工作方式都是完全一样的，只是很难注意到，因为这些字节并不是通过网络连接发送的。

### 文章到此结束啦

关于终端，肯定还有很多东西要了解（我们可以讨论更多关于颜色，或者原始与熟化模式，或者 Unicode 支持，或者 Linux 伪终端界面），但我将在这里停止，因为现在是晚上 10 点，这篇文章有点长，而且我认为我的大脑今天无法处理更多关于终端的新信息。

感谢 [Jesse Luehrs](https://github.com/doy/) 回答了我关于终端的十亿个问题，所有的错误都是我的 :smiley:

---

via: <https://jvns.ca/blog/2022/07/20/pseudoterminals/>

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

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


硬核观察 #708 程序员奶爸用 AI 解决婴儿喂奶难题

Summary: • 程序员奶爸用 AI 解决婴儿喂奶难题 • 国内 Go 语言爱好者发起新编程语言：凹语言 • 大多数开源开发者都在关注新的工作机会

![](/data/attachment/album/202207/25/121844ftj322dt00a3oajd.jpg)

![](/data/attachment/album/202207/25/121856pkrwoqowe21o1zpq.jpg)

### 程序员奶爸用 AI 解决婴儿喂奶难题

国外一位程序员喜得贵子之后，颇受婴儿喂奶之苦 —— 我想养过孩子的人都有过这种体验。但是作为 AI 工程师，他花费了 50 个小时开发了一套 AI 系统，通过识别婴儿状态来判断是否该喂奶了，并通过手机发送通知给他去喂奶 —— 而不是给他老婆，从而可以让老婆有个良好睡眠。甚至，他还进一步开发了一套全自动喂奶装置，虽然还不太尽如人意，但是已经让全世界奶爸们感到了希望，纷纷催促他开源。

>
> **[消息来源：Reddit](https://www.reddit.com/r/programming/comments/w58xyn/built_a_hungry_baby_alarm/)**
>
>
>

>
> 老王点评：真是技术解救程序员，如果你觉得你的编程技术没帮到你，那只是你的技术还不够好。
>
>
>

![](/data/attachment/album/202207/25/121906cjjfi60ad0amfffm.jpg)

### 国内 Go 语言爱好者发起新编程语言：凹语言

国内三位 Go 语言爱好者发起了一种实验性的新编程语言：[凹语言™](https://github.com/wa-lang/wa)（读作“Wa”）。但从其官网看，这个语言似乎从 2019 年就开始设计了。目前代码已经发布在 Github，并且提供了简单可执行的示例，不过该项目采用了“保留所有权利”的版权声明（可能是还没来得及确定许可证）。在语言设计中遵循了 Go 语言克制的风格，大量借鉴了 Go 的设计思想和具体实现。比较有趣的特性包括：披着 Go 和 Rust 语法外衣的 C++ 语言；其 WaGo 语法是 Go 的真子集；支持中文/英文双语关键字，任一关键字均有等价的中文及英文版。

>
> **[消息来源：凹语言](https://github.com/wa-lang/wa)**
>
>
>

>
> 老王点评：一个好玩的业余项目，不够最让我印象深刻的反而是这个语言的名字。
>
>
>

![](/data/attachment/album/202207/25/121924ye36vhkl9dadax9u.jpg)

### 大多数开源开发者都在关注新的工作机会

根据一份基于面向全球 1400 名应用开发者、IT 管理人员、运营和业务管理专业人才的问卷报告显示，尽管还算满意，但 44% 的开发者仍在关注工作选择；另外 10% 的受访者对他们目前的工作不满意。2/3 的受访者声称分配给他们的工作量增加。调查还显示，1/3 的受访者会考虑离开目前的职位，以便有机会使用更尖端的技术，比 2021 年仅 16% 的比例高出一倍。

>
> **[消息来源：Info World](https://www.infoworld.com/article/3668248/majority-of-open-source-developers-eyeing-job-change-edb-survey.html)**
>
>
>

>
> 老王点评：程序员嘛，要么少干活多拿钱，要么可以学技术，你总的至少满足一样。
>
>
>


在 Linux 上使用 Rhythmbox 听音乐

标题Rhythbox中hb之间少打一个m

谢谢！！

![](/data/attachment/album/202207/25/234644f4rgrx1vrpgfk86n.jpg)

>
> 下面我将介绍我是如何在 Linux 的 GNOME 桌面上使用 Rhythmbox 听在线音乐和 MP3 列表的。
>
>
>

对我来说，在完全安静的环境下工作是很困难的。我需要某种背景音，最好是一些熟悉的音乐。我在音乐上的需求很简单：我只需要一个音乐播放器，可以播放我的 MP3 音乐库和少数几个我喜欢的网站的在线音乐。

我在 Linux 上尝试了多个音乐播放器，最终我还是选择了 Rhythmbox。 Rhythmbox 是一个 GNOME 桌面音乐播放器。如果你的 Linux 发行版使用的是 GNOME 桌面，很可能已经安装了 Rhythmbox。它很简单，用来播放我本地的音乐库和广播网站的在线音乐。我很乐意在 Linux 上使用 Rhythmbox 收听在线音乐和我自己的音乐库。

### 在 Linux 上收听在线音乐

Rhythmbox 支持多个在线音乐服务商。如果你拥有一个 [Last.fm](http://Last.fm) 或者 [Libre.fm](http://Libre.fm) 的帐号，你可以点击左侧的标签登录。或者，你想收听在线广播，点击左侧的“<ruby> 广播 <rt>  Radio </rt></ruby>”标签，在预设的广播网站中选择一个。在我写代码的时候我通常喜欢听迷幻舞曲，HBR1 Tranceponder 是我最喜欢的一个在线广播网站。

![Streaming HBR1 Traceponder](/data/attachment/album/202207/25/234651q8h87gngmhgzn46g.png)

### 在 Linux 上播放我的音乐库

在过去的几年中，我收集了大量的 MP3 音乐。由于几年前 MP3 的专利在美国已经到期，它在 Linux 是一种很好用的开放的音乐格式。

我把我 20GB 的 MP3 音乐保存在我的主目录之外，在 `/usr/local/music` 。要把音乐导入 Rhythmbox，点击 “<ruby> 导入 <rt>  Import </rt></ruby>” 按钮，选择 `usr/local/music` 目录，或者任何你保存音乐的目录，让 Rhythmbox 去识别 MP3 音乐。结束以后点击 “<ruby> 导入列出的曲目 <rt>  Import listed tracks </rt></ruby>” 按钮导入就完成了。

![Use the Import button to add music to Rhythmbox](/data/attachment/album/202207/25/234651s0b3p3d7zrkb3353.png)

![Rhythmbox identifies new music files](/data/attachment/album/202207/25/234652kajlc4wmmll0lljj.png)

Rhythmbox 可以播放我的音乐，并通过类型，艺术家和专辑组织歌曲，所以我可以很容易找到我想听的音乐。

![Listening to a music library in Rhythmbox](/data/attachment/album/202207/25/234652nfi4fzbj4caaq04r.png)

### 旋律永存

我愿意在 Linux 上使用 Rhythmbox 作为我的音乐播放器，它是如此简洁，不会影响到我。而且听音乐可以帮我和谐掉日常的噪音，让我每一天都可以过的快一点。

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

---

via: <https://opensource.com/article/22/7/listen-music-rhythmbox-linux>

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

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


硬核观察 #709 字节跳动提交补丁将内核重启时间降低高达半秒

Summary: • 字节跳动提交补丁将内核重启时间降低高达半秒 • 实时 Linux 内核支持接近进入主线 • 统信 UOS 的软硬件生态适配数量突破 50 万

![](/data/attachment/album/202207/26/070907htgiq7pe3ydbzbiz.jpg)

![](/data/attachment/album/202207/26/070923i1lzh5fstz9vhmls.jpg)

### 字节跳动提交补丁将内核重启时间降低高达半秒

通过使用 Kexec，可以避免了服务器加电重启等任务带来的停机时间。但是，即使使用 Kexec 来切换到一个新的内核，仍然可能需要太多的停机时间。通过字节跳动提交的新补丁，这些时间可以被优化掉 500ms，从而使启动内核功能的时间降低到只有 15ms。像许多其他大型组织一样，字节跳动依靠 Kexec 重启来转移到新的内核。

>
> **[消息来源：Phoronix](https://www.phoronix.com/news/Bytedance-Faster-Kexec-Reboot)**
>
>
>

>
> 老王点评：随着中国科技公司对 Linux 的重视，对 Linux 的贡献也越来越多，越来越重要。我认为，这才是取得在 Linux 和开源领域话语权的重要方式。
>
>
>

![](/data/attachment/album/202207/26/070937dpt6b127v1gq573h.jpg)

### 实时 Linux 内核支持接近进入主线

多年来，一直有关于 PREEMPT\_RT “即将” 进入主线的说法，但限于资金而最终没有实现。PREEMPT\_RT 支持是构建实时 Linux 内核的两个“路障”之一。今年的变化是英特尔收购了 Linutronix 公司，该公司是参与 PREEMPT\_RT 补丁的主要公司之一。如果在下周的合并窗口前及时审查/签署了最后几个剩余部分，那么对 PREEMPT\_RT 支持可能最终会在即将到来的 Linux 5.20 周期中被主线化。

>
> **[消息来源：Phoronix](https://www.phoronix.com/news/520-Maybe-Real-Time-PREEMPT_RT)**
>
>
>

>
> 老王点评：一旦 Linux 对实时内核的支持能进入主线，Linux 的疆域将又扩大一大块。
>
>
>

![](/data/attachment/album/202207/26/070957rooqh2kz99qqa223.jpg)

### 统信 UOS 的软硬件生态适配数量突破 50 万

统信软件宣布，统信 UOS 软硬件兼容适配认证总数达 529903 款，其中包括：应用软件兼容适配组合数约 30 万，外设兼容适配组合数约 19 万。统信软件已经搭建了北京、武汉、广州三大适配中心，成立了 AI 信创联合攻关适配实验室。同时，统信与 4800 家厂商达成合作，统信生态社区累计注册 23 万用户。

>
> **[消息来源：统信](https://mp.weixin.qq.com/s/YLuyjn_QmS0deMSvd1WzAA)**
>
>
>

>
> 老王点评：统信发力企业级操作系统以来，取得的进步也是有目共睹的。我已经感觉到了国内企业级操作系统战国群雄并起的形势了。
>
>
>


如何在 Arch Linux 中安装深度桌面（DDE）

Deepin确实很好看，好想换

![](/data/attachment/album/202207/26/170414x01pmevoo8o8b6ob.jpg)

>
> 在本指南中，我们将解释在 Arch Linux 中安装漂亮的深度桌面（DDE）所需的步骤。
>
>
>

指南的第一部分解释了安装 Arch 基本系统的步骤。第二部分是在 Arch Linux 的基础上安装完整的深度桌面。

### 什么是深度桌面（DDE）？

[深度操作系统](https://www.debugpoint.com/2020/09/deepin-20-review/) 是一个基于 Debian 稳定分支的、功能丰富且漂亮的桌面环境。深度桌面环境（DDE）是深度操作系统自主开发的桌面环境。它由它自己的 dde-kwin 窗口管理器驱动。深度桌面带有漂亮的停靠区和许多预装的深度原生的应用程序。

这个令人眼花缭乱的桌面环境 [可在 Arch 仓库中找到](https://archlinux.org/groups/x86_64/deepin/)；这篇文章介绍了如何在 Arch Linux 中安装深度桌面。

本指南安装深度桌面环境 20.1。然而，其他版本的步骤也应该是类似的。

### 第一部分：安装 Arch Linux

如果你已经安装了 Arch Linux，你可以跳过这一步，直接进入安装深度桌面部分。

要快速安装基本的 Arch Linux，请按照以下步骤进行。你也可以访问 [本指南](https://www.debugpoint.com/2020/11/install-arch-linux/) 了解以双启动或在虚拟机上安装 Arch Linux 的完整教程。

#### 下载 Arch Linux

从下面的链接下载 Arch Linux 的 .iso 文件。这里有磁力链和 BT 链接。一旦你下载好了，就把 ISO 写入 U 盘。然后从该驱动器启动。

>
> **[下载 Arch Linux](https://www.archlinux.org/download/)**
>
>
>

如果你打算通过 [GNOME Boxes](https://www.debugpoint.com/2020/05/install-use-gnome-boxes/)、[virt-manager](https://www.debugpoint.com/2020/11/virt-manager/) 将其安装为虚拟机镜像 —— 那么你不需要将其写入 U 盘。

#### 启动和配置分区

从 Arch Linux ISO 启动后，你必须运行一系列的命令来安装基本系统。

首先，运行下面的命令，找出设备的标识符。

```
fdisk -l

```

![fdisk -l 之前的分区](/data/attachment/album/202207/26/170929t9118s5snyvavqa2.jpg)

然后用此设备标识符，运行下面的命令，开始对你的磁盘进行分区。请确保根据你的系统而修改下面的 `/dev/sda` 参数。

```
cfdisk /dev/sda

```

在下一个提示中选择 `label type = dos`。

选择可用空间，并从底部选择 “NEW” 选项。在这个例子中，我将创建三个分区，如下所示：

```
/dev/sda1 - 1G - for /boot
/dev/sda2 - 5G - for root
/dev/sda3 - 1G - for swap

```

![cfdisk](/data/attachment/album/202207/26/170939tj4bff1kljhntwtw.jpg)

在下一个屏幕中，提供启动分区（`/boot`）的大小（在这个例子中，我给出了 1GB）。选择它作为主分区。

对 5GB 大小的主根分区（`/`）重复同样的步骤。

![改变交换分区的类型](/data/attachment/album/202207/26/170949hof4l3od2wi4rodf.jpg)

用同样的步骤创建一个大小为 1G 的交换分区（你可以根据你的需要改变大小）。创建交换分区后，确保在底部选择类型，并将其标记为 “Linux Swap/Solaris” 选项的交换分区。

![cfdisk 的最终分区列表](/data/attachment/album/202207/26/170958aicrmxnfojhjzvpn.jpg)

完成后，用底部的 “Write” 选项将变化写到磁盘上。确保你在写之前做一个备份，因为这是你系统中的一个永久性的改变。

在你继续之前，运行下面的命令来检查。在这个例子中，你可以看到，列出了三个分区。

```
fdisk -l

```

![fdisk 中的最终分区列表](/data/attachment/album/202207/26/171010zilzhsuydagtg9su.jpg)

依次运行下面的命令，在上面新创建的分区中格式化并创建一个 ext4 文件系统。确保你根据你的需要改变 `/dev/sda1` 和 `/dev/sda2` 参数。

```
mkfs.ext4 /dev/sda1
mkfs.ext4 /dev/sda2
mkswap /dev/sda3
swapon /dev/sda3

```

完成后，挂载系统并创建必要的目录。

```
mount /dev/sda2 /mnt
mkdir /mnt/boot /mnt/var /mnt/home
mount /dev/sda1 /mnt/boot

```

同样，确保你根据你的系统改变 `/dev/sda1`、`/dev/sda2` 和 `/dev/sda3` 参数。

![准备文件系统](/data/attachment/album/202207/26/171040p4sv8442f4n18zx5.jpg)

#### 安装基本系统

我希望你已经连接到互联网了。如果没有，请尝试使用 USB 网卡或有线网络连接，Arch 安装程序会自动配置和检测。如果你没有可用的有线连接，请按照本指南使用 Arch Linux 安装程序配置无线 Wi-Fi 网络。

依次运行下面的命令，将基本系统安装到挂载的分区中。下载的大小约为 400MB。

```
pacman -Syy
pacstrap /mnt base base-devel linux linux-firmware nano dhcpcd net-tools grub

```

![安装基本系统](/data/attachment/album/202207/26/171055jxlf9hxawrxlz9et.jpg)

一旦完成，生成一个文件系统表，没有这个表你就无法启动系统。

```
genfstab -U /mnt >> /mnt/etc/fstab

```

#### 配置基本系统

依次按照下面的命令来配置基本系统。这包括设置你的地区和语言，添加一个登录用户，以及设置互联网。

```
arch-chroot /mnt
nano /etc/locale.gen

```

去掉开头的 `#`，取消对你选择的语言环境的注释。在本指南中，我选择了 `en_US.UTF-8 UTF-8`。按 `CTRL+O`、回车和 `CTRL+X` 退出 nano。

![改变语言环境](/data/attachment/album/202207/26/171120ke1ppzhp5ph1qwq0.jpg)

使用以下方法生成语言环境数据。

```
locale-gen

```

使用下面的命令设置语言。

```
echo LANG=en_US.UTF-8 > /etc/locale.conf
export LANG=en_US.UTF-8

```

设置本地时区。

```
ln -s /usr/share/zoneinfo/America/New_York /etc/localtime

```

同样，你可以根据你的需要来选择它们。你可以通过以下命令列出本地时区。

```
ls /usr/share/zoneinfo
ls /usr/share/zoneinfo/America

```

依次使用下面的命令设置硬件时钟、创建主机名并启用互联网的 DHCP。你可以根据你的想法把 `debugpoint-pc` 改为任何主机名。

```
hwclock --systohc --utc
echo debugpoint-pc > /etc/hostname
systemctl enable dhcpcd

```

下一步是设置 `root` 用户的密码、创建一个管理员用户，并将该用户添加到 `sudoers` 文件中。

按照下面的命令依次进行。确保根据你的需要将用户名`debugpoint` 改为其他名称。

```
passwd rootuseradd -m -g users -G wheel -s /bin/bash debugpointpasswd debugpoint

```

![创建用户](/data/attachment/album/202207/26/171226wixiu5ifxfwwiiff.jpg)

打开 `sudoers` 文件，添加以下几行。

```
nano /etc/sudoers

```

添加下面几行。由于你已经创建了 `root` 用户，该条目应该已经有了。

```
root ALL=(ALL) ALL
debugpoint ALL=(ALL) ALL

```

![更新 sudoers 文件](/data/attachment/album/202207/26/171239oi4vkqr3v4o7v3x3.jpg)

安装 GRUB，建立初始的 Ramdisk 环境，并使用下面的命令卸载系统。

```
grub-install /dev/sda
grub-mkconfig -o /boot/grub/grub.cfg
mkinitcpio -p linux
exit

```

![配置 GRUB](/data/attachment/album/202207/26/171251tv8k51b8vkz81ktv.jpg)

然后重新启动你的系统。

```
umount /mnt/boot
umount /mnt
reboot

```

现在你已经成功地安装了 Arch Linux 基本系统。现在是安装完整的深度桌面的时候了。

### 第二部分：在 Arch Linux 中安装深度桌面

重新启动后，从 GRUB 中选择 Arch Linux。在 Arch Linux 的提示符下，开始依次运行以下命令。这些命令安装 Xorg 服务器、Lightdm 显示管理器和深度桌面组件。

对于所有的命令，使用默认的包版本，即在询问时按回车。

安装 Xorg 和显示管理器。大约安装大小为 80 MB。

```
sudo pacman -S --need xorg lightdm

```

安装额外的组件和应用程序（约 550 MB）。

```
sudo pacman -S --need deepin deepin-extra

```

安装完成后，通过修改 Lightdm 配置文件启用深度欢迎页。按照下面的命令。

```
nano /etc/lightdm/lightdm.conf

```

并添加下面这一行。保存该文件（`CTRL+O`、`CTRL+X`）。

```
greeter-session=lightdm-deepin-greeter

```

![在 Lightdm 登录页中添加深度欢迎欢迎页](/data/attachment/album/202207/26/171304fqrip72eqq2mfqdd.jpg)

现在是时候把显示管理器和网络管理器作为服务启用了。这样，下次登录时，它们就可以由 systemd 自动运行。

```
systemctl enable lightdm
systemctl enable NetworkManager

```

![启用 Lightdm 和网络](/data/attachment/album/202207/26/171322qpr5op32i7oziixr.jpg)

使用 `reboot` 命令重新启动系统。

```
reboot

```

如果一切顺利，你应该看到深度桌面的登录提示。使用你刚刚在上面的步骤中创建的凭证登录。你应该会看到最新的深度桌面环境。

![Arch Linux 中的深度 20.1 登录屏幕](/data/attachment/album/202207/26/171407h03v3z608861sj9z.jpg)

![Arch Linux中的深度桌面 20.1](/data/attachment/album/202207/26/171417ci1hrzrawv96ra4p.jpg)

### 总结

我希望这个指南能帮助你在 Arch Linux 中安装深度桌面。虽然它不是我的日常环境，我觉得深度的桌面在本质上有些慢。可能是因为有太多的颜色渲染和动画，而且尽管它是建立在 Qt 上的，但没有为深度桌面进行适当的优化。

---

via: <https://www.debugpoint.com/deepin-arch-linux-install-20/>

作者：[Arindam](https://www.debugpoint.com/author/admin1/) 选题：[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/) 荣誉推出


如何编写 C 程序在 Linux 上创建音乐播放列表

Summary: 使用我在 Linux 上制作的这个 C 程序在旅途中聆听你喜爱的歌曲。

啊。。。。这。。。。。。。

使用我在 Linux 上制作的这个 C 程序在旅途中聆听你喜爱的歌曲。

![](/data/attachment/album/202207/26/223349t4yiqd1yikb9k117.jpg)

>
> 使用我在 Linux 上制作的这个 C 程序在旅途中聆听你喜爱的歌曲。
>
>
>

我最近在 Linux 中编写了一个 C 程序，从我广泛的 MP3 库中创建一个较小的随机 MP3 文件选集。该程序会遍历一个包含我的 MP3 库的目录，然后创建一个包含随机的、较小的歌曲选集的目录。然后我将这些 MP3 文件复制到我的智能手机上，以便随时随地收听。

瑞典是一个人口稀少的国家，有许多农村地区没有完整的手机覆盖。这就是在智能手机上拥有 MP3 文件的原因之一。另一个原因是我并不总是有钱购买流媒体服务，所以我喜欢拥有自己喜欢的歌曲的副本。

你可以从它的 [Git 仓库](https://github.com/rikardgn/learnC/blob/main/randMp3Copy.c) 下载我的应用。我专门为 Linux 编写了它，部分原因是在 Linux 上很容易找到经过良好测试的文件 I/O 例程。多年前，我尝试使用专有的 C 库在 Windows 上编写相同的程序，但在尝试文件复制时遇到了困难。Linux 使用户可以轻松直接地访问文件系统。

本着开源的精神，我没费多少力气就找到了 Linux 的文件 I/O 代码来激发我的灵感。我还发现了一些启发了我的分配内存的代码。我编写了随机数生成的代码。

该程序的工作方式如下所述：

1. 询问源目录和目标目录。
2. 询问存放 MP3 文件的目录下的文件个数。
3. 搜索你希望复制的收藏的百分比（从 1.0% 到 88.0%）。如果你有 1000 个文件的集合，并希望从你的集合中复制 125 个文件而不是 120 个文件，你也可以输入 12.5% 之类的数字。我将上限设置为 88%，因为复制超过 88% 的库将基本生成与你的基础库相似的库。当然，代码是开源的，因此你可以根据自己的喜好自由修改。
4. 使用指针和 `malloc` 分配内存。一些操作需要内存，包括代表音乐收藏中文件的字符串列表。还有一个列表来保存随机生成的数字。
5. 生成所有文件范围内的随机数列表（例如，如果集合有 1000 个文件，则为 1 到 1000）。
6. 复制文件。

其中一些部分比其他部分更简单，但代码只有大约 100 行：

```
#include <dirent.h>
#include <stdio.h>
#include <string.h>
#include <sys/types.h> /* include necessary header files */
#include <fcntl.h>
#include <stdlib.h>
#include <unistd.h>
#include <time.h>

#define BUF_SIZE 4096 /* use buffer of 4096 bytes */
#define OUTPUT_MODE 0700 /*protect output file */
#define MAX_STR_LEN 256

int main(void) {
  DIR *d;
  struct dirent *dir;
  char strTemp[256], srcFile[256],
  dstFile[256], srcDir[256], dstDir[256];
  char **ptrFileLst;

  char buffer[BUF_SIZE];
  int nrOfStrs=-1, srcFileDesc,
  dstFileDesc, readByteCount,
  writeByteCount, numFiles;
  int indPtrFileAcc, q;

  float nrFilesCopy;
  // vars for generatingRandNumList
  int i, k, curRanNum, curLstInd,
  numFound, numsToGen, largNumRange;
  int *numLst;

  float procFilesCopy;
  printf("Enter name of source Directory\n");
  scanf("%s", srcDir);
  printf("Enter name of destionation Directory\n");
  scanf("%s", dstDir);
  printf("How many files does the directory with mp3 files contain?\n");
  scanf("%d", &numFiles);
  printf("What percent of the files do you wish to make a random selection of\n");
  printf("enter a number between 1 and 88\n");
  scanf("%f", &procFilesCopy);

  // allocate memory for filesList, list of random numbers
  ptrFileLst= (char**) malloc(numFiles * sizeof(char*));

  for (i = 0; i < numFiles; i++) {
    ptrFileLst[i] = (char*)malloc(MAX_STR_LEN * sizeof(char));
  }

  largNumRange = numFiles;
  nrFilesCopy = (procFilesCopy / 100) * numFiles;

  numsToGen = (int)((procFilesCopy / 100) * numFiles);
  printf("nrFilesCopy=%f", nrFilesCopy);
  printf("NumsToGen=%d", numsToGen);
  numLst = malloc(numsToGen * sizeof(int));
  srand(time(0));

  numLst[0] = rand() % largNumRange + 1;
  numFound=0;
  do {
    curRanNum = (int)rand() % largNumRange + 1;
    if (numLst[0] == curRanNum) {
      numFound=1;
    }
  } while(numFound == 1);

  numLst[1] = curRanNum;
  getchar();
  curLstInd = 1;
  i = 0;
  while(1) {
    do {
      numFound = 0;
      curRanNum = (int)rand() % largNumRange + 1;
      for (int k = 0; k <= curLstInd; k++){
        if (numLst[k] == curRanNum)
        numFound = 1;
      }
    } while(numFound == 1);
    numLst[curLstInd+1] = curRanNum;
    curLstInd++;
    i++;
    // numsToGen=Total numbers to generate minus two
    // already generated by the code above this loop
    if (i == (numsToGen-2))
      break;
    }

    d = opendir(srcDir);
    if (d) {
      while ( (dir = readdir(d)) != NULL ) {
      strcpy(strTemp, dir->d_name);

      if (strTemp[0] != '.') {
        nrOfStrs++;
        strcpy(ptrFileLst[nrOfStrs], strTemp);
      }
    }
    closedir(d);
  }

  for (q = 0; q <= curLstInd; q++) {
    indPtrFileAcc = numLst[q];
    strcpy(srcFile, srcDir);
    strcat(srcFile, "/");
    strcat(srcFile, ptrFileLst[indPtrFileAcc]);
    strcpy(dstFile, dstDir);
    strcat(dstFile, "/");
    strcat(dstFile, ptrFileLst[indPtrFileAcc]);

    srcFileDesc = open(srcFile, O_RDONLY);
    dstFileDesc = creat(dstFile, OUTPUT_MODE);

    while(1) {
      readByteCount = read(srcFileDesc, buffer, BUF_SIZE);
      if (readByteCount <= 0)
        break;

      writeByteCount = write(dstFileDesc, buffer, readByteCount);
      if(writeByteCount <= 0)
        exit(4);
    }

    //close the files
    close(srcFileDesc);
    close(dstFileDesc);
  }
}

```

这段代码可能是最复杂的：

```
while(1) {
  readByteCount = read(srcFileDesc, buffer, BUF_SIZE);
  if (readByteCount <= 0)
    break;

  writeByteCount = write(dstFileDesc, buffer, readByteCount);
  if (writeByteCount <= 0)
      exit(4);
}

```

这将从指定的文件中读取多个字节（`readByteCount`）到字符缓冲区中。该函数的第一个参数是文件名（`srcFileDesc`）。第二个参数是一个指向字符缓冲区的指针，这之前在程序中声明过。该函数的最后一个参数是缓冲区的大小。

程序返回读取的字节数（在本例中为 4 个字节）。如果返回的数字为 0 或更少，则第一个 `if` 子句会跳出循环。

如果读取字节数为 0，则所有写入完成，循环中断以写入下一个文件。如果读取的字节数小于 0，则发生错误并退出程序。

当读取 4 个字节时，它会写入它们。`write` 函数接受三个参数。第一个是要写入的文件，第二个是字符缓冲区，第三个是要写入的字节数（4 个字节） .该函数返回写入的字节数。

如果写入了 0 个字节，则发生了写入错误，因此第二个 `if` 子句退出程序。

`while` 循环读取并复制文件，一次 4 个字节，直到文件被复制。复制完成后，你可以将随机生成的 mp3 文件的目录复制到你的智能手机。

复制和写入例程相当有效，因为它们使用 Linux 中的文件系统调用。

### 改进代码

该程序很简单，可以在用户界面和灵活性方面进行改进。例如，你可以实现一个计算源目录中文件数量的函数，这样你就不必手动输入它。你可以添加选项，这样你就可以非交互地传递百分比和路径。但是代码做了我需要它做的事情，它是 C 编程语言简单效率的演示。

---

via: <https://opensource.com/article/22/7/c-linux-mp3>

作者：[Rikard Grossman-Nielsen](https://opensource.com/users/rikardgn) 选题：[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/) 荣誉推出


在 Linux 上学习 C 语言的五种方式

![](/data/attachment/album/202207/26/232122wc4c5g55363bgj5g.jpg)

>
> 请下载我们的电子书获得在 Linux 和 FreeDOS 上 C 语言编程的提示和技巧。
>
>
>

有许多关于为什么 C 语言能够经久不衰的说法。或许是因为它语法简单明了。又或许是因为它常被认为是实用的语言，因为它不基于其他高级语言，可以在任何平台上编译运行。C 显然是一种强大的语言，并且我认为它经久不衰与它作为其他技术的基础的方式相关。这里有 5 项我喜爱的基于 C 语言的技术，希望它们能够帮助你更多的了解 C 语言。

### 1、GObject 和 GTK

C 语言不是面向对象编程的语言。它没有 `class` 关键字。 一些人用 C++ 进行面向对象编程，但是还有一些人坚持用 C 和 GObject 库。GObject 库为 C 语言提供了一个 `class` 结构体，GTK 项目以提供可通过 C 访问的工具包而闻名。没有 GTK ，就没有 GIMP （GTK 就是为此开发的）、GNOME 和其他成千上百流行的开源应用。

#### 了解更多

GObject 和 GTK 是使用 C 开始进行 GUI 编程的绝佳方式。它们“装备精良”，可以让你用 C 语言进行图形应用的编程，因为开发者为你做了许多“繁重工作”。他们定义了类和数据类型，创建了工具包，你所要做的就是将所有东西放在一起。

### 2、Ncurses

如果 GTK 超过了你的需求，你或许认为一个<ruby> 终端用户界面 <rt>  terminal user interface </rt></ruby>（TUI）更适合你。Ncurses 库可以在终端创建“小部件”，创建一种在终端窗口上绘制图形的应用程序。你可以使用方向键控制界面，选择按钮和元素，就像不用鼠标来使用 GUI 应用一样。

#### 了解更多

利用 Ncurses 库使用 C 语言写一个 [猜数字](https://opensource.com/article/21/8/guess-number-game-ncurses-linux) 游戏。

### 3、Lua 和 Moonscript

Lua 是一种脚本语言，它可以使用内置的 C API 访问 C 语言库。它十分精巧、快捷以及简单，拥有约 30 个函数和少量内置库。你可以使用 Lua 进行系统自动化、游戏修改和脚本编写、使用 LÖVE 之类的前端进行游戏开发，或者使用 GTK 进行一般应用程序开发（例如 [Howl 文本编辑器](https://opensource.com/article/20/12/howl)）。

#### 了解更多

Lua 十分好的一点是你可以从它开始学习掌握基本的编程理念，然后当你有足够勇气直面基础编程语言时，再探索它的 C 语言 API 。另一方面，如果你只会 Lua ，那也没事儿。Lua 有很多的 [外部库](https://opensource.com/article/19/11/getting-started-luarocks) ，使其成为各种开发方式的绝佳选择。

### 4、Cython

Lua 不是唯一带有 C 接口的编程语言。[Cython](http://cython.org) 是一种编译器和编程语言，旨在使为 Python 编写 C 扩展就像编写 Python 代码一样容易。本质上，你可以编写 Python 并最终得到 C 语言程序。最简单的示例：

```
print("hello world")

```

创建一个 `setup.py` 脚本:

```
from setuptools import setup
from Cython.Build import cythonize

setup(
    ext_modules = cythonize("hello.pyx")
)

```

运行该 `setup` 脚本:

```
$ python3 ./setup.py

```

最后你会在同一个目录中得到一个 `hello.c` 和 `hello.cpython-39-x86_64-linux-gnu.so` 文件。

#### 了解更多

[Cython](https://opensource.com/article/21/4/cython) 是 Python 的一个超集，支持 C 语言的函数和数据类型。它不可能帮你直接学习 C 语言，但它为希望学习 C 代码并将其集成到 Python 中的 Python 开发人员开辟了新的可能性。

### 5、FreeDOS

了解更多 C 语言的最好方式是编写 C 代码，没有什么比写你可以真正使用的代码更令人激动的了。FreeDOS 项目是 DOS 的开源实现， 而 DOS 是 Windows 的前身。或许你已经用过 FreeDOS 了，或者作为运行 BIOS 更新程序的便捷开源方法，或者在模拟器中玩经典的计算机游戏。你可以用 FreeDOS 做更多事情。它是学习 C 语言的理想平台，其中包含一系列工具，鼓励你编写自己的命令和简单（或不那么简单，如果你愿意）的应用程序。当然你可以在任何系统上写 C 代码，但是 FreeDOS 的便利可能会让你感到耳目一新。天空有极限，但即使在地面上，你也可以用 C 做一些非常有趣的事情。

### 下载电子书

你可以从我们编写的新 [电子书](https://opensource.com/downloads/guide-c-programming) 中学到更多 C 语言，并在我们的电子书中了解有关 FreeDOS 上 C 语言的更多信息。这些是编程文章的集合，可帮助你学习 C 语言，并演示如何以有用的方式用 C 写一些代码。

>
> **[下载电子书](https://opensource.com/downloads/guide-c-programming)**
>
>
>

---

via: <https://opensource.com/article/22/7/learn-c-linux>

作者：[Alan Smithee](https://opensource.com/users/alansmithee) 选题：[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/) 荣誉推出


硬核观察 #710 前谷歌 CEO 将 AI 比作核武器

Summary: • 前谷歌 CEO 将 AI 比作核武器 • 流行的 KDE 桌面停靠区 Latte Dock 停止开发 • 科技公司们倡议废除闰秒

![](/data/attachment/album/202207/27/065547uthhudhuouzwkhpq.jpg)

![](/data/attachment/album/202207/27/065555pdhzzd8gdnjxwnlg.jpg)

### 前谷歌 CEO 将 AI 比作核武器

前谷歌 CEO Eric Schmidt 将 AI 比作核武器，呼吁建立类似相互保证毁灭的威慑制度，防止世界最强大的国家率先发动攻击。在上个世纪的五六十年代，美国和苏联这两个超级大国最终达成了核武器试验条约，以防止核试验粉尘扩散。Schmidt 认为中美可能需要在 AI 领域达成类似的条约。

>
> **[消息来源：VICE](https://www.vice.com/en/article/3adbwy/eric-schmidt-thinks-ai-is-as-powerful-as-nukes)**
>
>
>

>
> 老王点评：或许有一天 AI 武器化，真的需要到了各个 AI 大国坐下来制定一些规则，但是目前这个论调显然是针对性的攻击而已。
>
>
>

![](/data/attachment/album/202207/27/065603gjm99m9kdmkpfa91.jpg)

### 流行的 KDE 桌面停靠区 Latte Dock 停止开发

在过去的几年里，Latte Dock 一直是 KDE Plasma 桌面上流行的类似 macOS 的桌面停靠区。它去年发布了 0.10。昨天，它的作者宣布已经结束了在这个项目上的工作，“我正在退出 Latte 的开发。主要是我没有时间、动力或兴趣了……我希望我能够发布 Latte v0.11，但不幸的是我做不到。”他也希望有其他开发者接手开发这个已经有 6 年之久的流行软件。

>
> **[消息来源：Phoronix](https://www.phoronix.com/news/Latte-Dock-Ends)**
>
>
>

>
> 老王点评：虽然很可惜，不过我想以开源社区的生命力，很快就会有人接手或出现它的复刻版。
>
>
>

![](/data/attachment/album/202207/27/065619cr1i26abyz871ppz.jpg)

### 科技公司们倡议废除闰秒

谷歌、微软、Meta 和亚马逊周一发起了一项旨在废除闰秒的公共行动，美国和法国计时当局已对此举表示赞同。1972 年以来，已经增加了 27 次闰秒。在增加闰秒时，23:59:59 的下一秒并非变成 00:00:00，而是会额外增加一个 23:59:60 的计时，也就是最后一分钟变成 61 秒。这就会给计算机造成很大的困扰，尤其是那些需要依赖精确的计时服务器的服务，它曾在 2012 年引发了 Reddit 的大规模宕机。谷歌率先提出了“闰秒弥补”的解决方案，即在一天的过程中以许多微小的步进来弥补闰秒的变化。

>
> **[消息来源：CNET](https://www.cnet.com/tech/computing/tech-giants-try-banishing-the-leap-second-to-stop-internet-crashes/)**
>
>
>

>
> 老王点评：1972 年制定闰秒政策时，并没有考虑当时刚刚开始的互联网服务，但是现在互联网已经空前强大，应该采取更好的解决闰秒问题的方法。
>
>
>


如何在 Ubuntu 22.04 LTS 中安装 Docker 和 Docker Compose

太牛逼了真谢谢你

按照博主的步骤，学下来，安装成功。感谢！

高质量教程，一句废话都没有，赞！

nb

很细，实用

牛皮plus

感谢，安装非常顺利！

牛逼！！！

点赞点赞

博主太厉害了

博主太厉害了

简介明了，完美！！tql

非常棒的教程

来自上海上海交通大学农业与生物学院的 Chrome 119.0|GNU/Linux 用户

![](/data/attachment/album/202207/28/142549iwrj25mw9turhc9o.jpg)

>
> 在 Ubuntu 中使用 Docker Compose 安装 Docker 引擎的分步指导。
>
>
>

在这篇文章中，我们将会明白 Docker 是什么，如何 **在 Ubuntu 中安装 Docker 引擎** 。此外，我们也将会明白如何 **安装 Docker Compose** ，它是一个定义并运行多容器的 Docker 应用。

我们已经在 Ubuntu 22.04 LTS 中正式的测试了这份指南。然而，它也应该对旧版本如 20.04 LTS 和 18.04 LTS 有效。为了更好的安全性和稳定性，我推荐你使用最新的版本 —— Ubuntu 22.04 LTS 。

### 什么是 Docker ？

**Docker** 是一个快捷、轻便的系统级虚拟化技术，开发者和系统管理员可以使用它构建具备所有必要依赖项的应用程序，并将其作为一个包发布。

Docker 与其他如 VMWare 、Xen 、以及 VirtualBox 等工具的虚拟化方式不同，每个虚拟机不需要单独的客户操作系统。

所有的 Docker 容器有效地共享同一个主机系统内核。每个容器都在同一个操作系统中的隔离用户空间中运行。

Docker 容器可以在任何 Linux 版本上运行。比如说你使用 Fedora ，我用 Ubuntu 。我们能相互开发、共享并分发 Docker 镜像。

你无需担心操作系统、软件以及自定义设置，任何事都不用担心。只要我们的主机安装了 Docker ，就能持续开发。简言之，Docker 能够在任何地方运行！

前文中你读到了两个词：**Docker 镜像** 和 **Docker 容器** ，或许你在想它们的区别。

通俗地说，Docker 镜像是一个描述容器应该如何表现的文件，而 Docker 容器是 Docker 镜像的运行（或停止）状态。

希望你能够理解 Docker 的基础概念。更多细节，你可以参考文章末尾的 Docker 官方指导手册。

### Docker 依赖项

为了安装并配置 Docker ，你的系统必须满足下列最低要求：

1. 64 位 Linux 或 Windows 系统
2. 如果使用 Linux ，内核版本必须不低于 3.10
3. 能够使用 `sudo` 权限的用户
4. 在你系统 BIOS 上启用了 VT（虚拟化技术）支持 on your system BIOS（参考: [如何查看 CPU 支持 虚拟化技术（VT）](https://ostechnix.com/how-to-find-if-a-cpu-supports-virtualization-technology-vt/)）
5. 你的系统应该联网

在 Linux ，在终端上运行以下命令验证内核以及架构详细信息：

```
$ uname -a

```

输出样例：

```
Linux Ubuntu22CT 5.15.35-3-pve #1 SMP PVE 5.15.35-6 (Fri, 17 Jun 2022 13:42:35 +0200) x86_64 x86_64 x86_64 GNU/Linux

```

正如上面你看到的那样，我的 Ubuntu 系统内核版本是 **5.15.35-3-pve** 并且系统架构是 **64 位**（**x86\_64 x86\_64 x86\_64 GNU/Linux**）。

>
> **注意：** 这里，我在 [Proxmox](https://ostechnix.com/install-proxmox-ve/) 中使用 Ubuntu 22.04 容器。这是你看到上方内核版本中有 “pve” 字符的原因。如果你正在使用 Ubuntu 实体（或者虚拟）机，你将看到系统版本为 **5.15.35-3-generic** 。
>
>
>

内核版本需要不低于最低要求的版本，并且是 64 位机器。这样不会有任何问题，我们能顺利安装并使用 Docker 。

请注意你使用哪一个 Ubuntu 系统不重要。并且你使用 Ubuntu 桌面或服务器版本，亦或者其他 Ubuntu 变种如 Lubuntu 、Kubuntu 、Xubuntu ，都不重要。

只要你的系统内核版本不低于 3.10 ，并且是 64 位系统，Docker 都会正常运行。

### 在 Ubuntu 22.04 LTS 中安装 Docker

首先，更新你的 Ubuntu 系统。

#### 1、更新 Ubuntu

打开终端，依次运行下列命令：

```
$ sudo apt update
$ sudo apt upgrade
$ sudo apt full-upgrade

```

#### 2、添加 Docker 库

首先，安装必要的证书并允许 apt 包管理器使用以下命令通过 HTTPS 使用存储库：

```
$ sudo apt install apt-transport-https ca-certificates curl software-properties-common gnupg lsb-release

```

然后，运行下列命令添加 Docker 的官方 GPG 密钥：

```
$ curl -fsSL https://download.docker.com/linux/ubuntu/gpg | sudo gpg --dearmor -o /usr/share/keyrings/docker-archive-keyring.gpg

```

添加 Docker 官方库：

```
$ echo "deb [arch=$(dpkg --print-architecture) signed-by=/usr/share/keyrings/docker-archive-keyring.gpg] https://download.docker.com/linux/ubuntu $(lsb_release -cs) stable" | sudo tee /etc/apt/sources.list.d/docker.list > /dev/null

```

使用命令更新 Ubuntu 源列表：

```
$ sudo apt update

```

#### 3、安装 Docker

最后，运行下列命令在 Ubuntu 22.04 LTS 服务器中安装最新 Docker CE：

```
$ sudo apt install docker-ce docker-ce-cli containerd.io docker-compose-plugin

```

![Install Docker In Ubuntu](/data/attachment/album/202207/28/142618qannlvznwnvwuzai.png)

当然你也可以安装其他版本 Docker 。运行下列命令检查可以安装的 Docker 版本：

```
$ apt-cache madison docker-ce

```

输出样例：

```
docker-ce | 5:20.10.17~3-0~ubuntu-jammy | https://download.docker.com/linux/ubuntu jammy/stable amd64 Packages
docker-ce | 5:20.10.16~3-0~ubuntu-jammy | https://download.docker.com/linux/ubuntu jammy/stable amd64 Packages
docker-ce | 5:20.10.15~3-0~ubuntu-jammy | https://download.docker.com/linux/ubuntu jammy/stable amd64 Packages
docker-ce | 5:20.10.14~3-0~ubuntu-jammy | https://download.docker.com/linux/ubuntu jammy/stable amd64 Packages
docker-ce | 5:20.10.13~3-0~ubuntu-jammy | https://download.docker.com/linux/ubuntu jammy/stable amd64 Packages

```

你可以挑选上面列表中的任何版本进行安装。例如，安装 **5:20.10.16~ 3-0 ~ubuntu-jammy** 这个版本，运行：

```
$ sudo apt install docker-ce=5:20.10.16~3-0~ubuntu-jammy docker-ce-cli=5:20.10.16~3-0~ubuntu-jammy containerd.io

```

安装完成后，运行如下命令验证 Docker 服务是否在运行：

```
$ systemctl status docker

```

你会看到类似下面的输出：

```
* docker.service - Docker Application Container Engine
     Loaded: loaded (/lib/systemd/system/docker.service; enabled; vendor preset: enabled)
     Active: active (running) since Mon 2022-06-27 13:07:43 UTC; 3min 4s ago
TriggeredBy: * docker.socket
       Docs: https://docs.docker.com
   Main PID: 2208 (dockerd)
      Tasks: 8
     Memory: 29.6M
        CPU: 126ms
     CGroup: /system.slice/docker.service
             `-2208 /usr/bin/dockerd -H fd:// --containerd=/run/containerd/containerd.sock

Jun 27 13:07:43 Ubuntu22CT dockerd[2208]: time="2022-06-27T13:07:43.071453522Z" level=info msg="ccResolverWrapper: sending update to cc: {[{unix:>
Jun 27 13:07:43 Ubuntu22CT dockerd[2208]: time="2022-06-27T13:07:43.071459974Z" level=info msg="ClientConn switching balancer to \"pick_first\"" >
Jun 27 13:07:43 Ubuntu22CT dockerd[2208]: time="2022-06-27T13:07:43.130989294Z" level=info msg="Loading containers: start."
Jun 27 13:07:43 Ubuntu22CT dockerd[2208]: time="2022-06-27T13:07:43.187439756Z" level=info msg="Default bridge (docker0) is assigned with an IP a>
Jun 27 13:07:43 Ubuntu22CT dockerd[2208]: time="2022-06-27T13:07:43.235966874Z" level=info msg="Loading containers: done."
Jun 27 13:07:43 Ubuntu22CT dockerd[2208]: time="2022-06-27T13:07:43.240149866Z" level=warning msg="Not using native diff for overlay2, this may c>
Jun 27 13:07:43 Ubuntu22CT dockerd[2208]: time="2022-06-27T13:07:43.240281966Z" level=info msg="Docker daemon" commit=a89b842 graphdriver(s)=over>
Jun 27 13:07:43 Ubuntu22CT dockerd[2208]: time="2022-06-27T13:07:43.240386856Z" level=info msg="Daemon has completed initialization"
Jun 27 13:07:43 Ubuntu22CT systemd[1]: Started Docker Application Container Engine.
Jun 27 13:07:43 Ubuntu22CT dockerd[2208]: time="2022-06-27T13:07:43.276336600Z" level=info msg="API listen on /run/docker.sock"

```

好极了！Docker 服务已启动并运行！

如果没有运行，运行以下命令运行 Docker 服务：

```
$ sudo systemctl start docker

```

使 Docker 服务在每次重启时自动启动：

```
$ sudo systemctl enable docker

```

可以使用以下命令查看已安装的 Docker 版本：

```
$ sudo docker version

```

输出样例：

```
Client: Docker Engine - Community
  Version:           20.10.17
  API version:       1.41
  Go version:        go1.17.11
  Git commit:        100c701
  Built:             Mon Jun  6 23:02:46 2022
  OS/Arch:           linux/amd64
  Context:           default
  Experimental:      true

Server: Docker Engine - Community
  Engine:
    Version:          20.10.17
    API version:      1.41 (minimum version 1.12)
    Go version:       go1.17.11
    Git commit:       a89b842
  Built:            Mon Jun  6 23:00:51 2022
    OS/Arch:          linux/amd64
    Experimental:     false
  containerd:
    Version:          1.6.6
    GitCommit:        10c12954828e7c7c9b6e0ea9b0c02b01407d3ae1
  runc:
    Version:          1.1.2
    GitCommit:        v1.1.2-0-ga916309
  docker-init:
    Version:          0.19.0
    GitCommit:        de40ad0

```

![Check Docker Version](/data/attachment/album/202207/28/142619u89goqxeb9mqz9gl.png)

#### 4、测试 Docker

让我们继续，测试 Docker 是否运行正常：

运行：

```
$ sudo docker run hello-world

```

上述命令会下载一个 Docker 测试镜像，并在容器内执行一个 “hello\_world” 样例程序。

如果你看到类似下方的输出，那么祝贺你！Docker 正常运行在你的 Ubuntu 系统中了。

```
Unable to find image 'hello-world:latest' locally
latest: Pulling from library/hello-world
2db29710123e: Pull complete
Digest: sha256:13e367d31ae85359f42d637adf6da428f76d75dc9afeb3c21faea0d976f5c651
Status: Downloaded newer image for hello-world:latest

Hello from Docker!
This message shows that your installation appears to be working correctly.

To generate this message, Docker took the following steps:
 1. The Docker client contacted the Docker daemon.
 2. The Docker daemon pulled the "hello-world" image from the Docker Hub.
    (amd64)
 3. The Docker daemon created a new container from that image which runs the
    executable that produces the output you are currently reading.
 4. The Docker daemon streamed that output to the Docker client, which sent it
    to your terminal.

To try something more ambitious, you can run an Ubuntu container with:
 $ docker run -it ubuntu bash

Share images, automate workflows, and more with a free Docker ID:
 https://hub.docker.com/

For more examples and ideas, visit:
 https://docs.docker.com/get-started/

```

![Run Hello World Docker Container](/data/attachment/album/202207/28/142620d055vugtrk55k02n.png)

很好！可以使用 Docker 了。

#### 5、作为非 root 用户运行 Docker （选做）

默认情况下，Docker 守护进程绑定到 Unix 套接字而不是 TCP 端口。由于 **Unix 套接字由 root 用户拥有**，Docker 守护程序将仅以 root 用户身份运行。因此，普通用户无法执行大多数 Docker 命令。

如果你想要在 Linux 中作为非 root 用户运行 Docker ，参考下方链接：

* [如何在 Linux 中作为非 root 用户运行 Docker](https://ostechnix.com/how-to-run-docker-as-non-root-user-in-linux/)

我个人不这样做也**不推荐**你这么做。如果你不会在互联网上暴露你的系统，那没问题。然而，不要在生产系统中以非 root 用户身份运行 Docker 。

### 在 Ubuntu 中安装 Docker Compose

**Docker Compose** 是一个可用于定义和运行多容器 Docker 应用程序的工具。使用 Compose，你可以使用 Compose 文件来配置应用程序的服务。然后，使用单个命令，你可以从配置中创建和启动所有服务。

下列任何方式都可以安装 Docker Compose 。

#### 方式 1、使用二进制文件安装 Docker Compose

从 [这里](https://github.com/docker/compose/releases) 下载最新 Docker Compose 。

当我在写这篇文章时，最新版本是 **2.6.1** 。

运行下列命令安装最新稳定的 Docker Compose 文件：

```
$ sudo curl -L "https://github.com/docker/compose/releases/download/v2.6.1/docker-compose-$(uname -s)-$(uname -m)" -o /usr/local/bin/docker-compose

```

如果有更新版本，只需要将上述命令中的 **v2.6.1** 替换为最新的版本号即可。请不要忘记数字前的 **"v"** 。

最后，使用下列命令赋予二进制文件可执行权限：

```
$ sudo chmod +x /usr/local/bin/docker-compose

```

运行下列命令检查安装的 Docker Compose 版本：

```
$ docker-compose version
Docker Compose version v2.6.1

```

#### 方式 2、使用 Pip 安装 Docker Compose

或许，我们可以使用 **Pip** 安装 Docker Compose 。Pip 是 Python 包管理器，用来安装使用 Python 编写的应用程序。

参考下列链接安装 Pip 。

* [如何使用 Pip 管理 Python 包](https://ostechnix.com/manage-python-packages-using-pip/)

安装 Pip 后，运行以下命令安装 Docker Compose。下列命令对于所有 Linux 发行版都是相同的！

```
$ pip install docker-compose

```

安装 Docker Compose 后，使用下列命令检查版本：

```
$ docker-compose --version

```

你将会看到类似下方的输出：

```
docker-compose version 2.6.1, build 8a1c60f6

```

恭喜你！我们已经成功安装了 Docker 社区版和 Docker Compose 。

安装了 Docker，然后呢？查看本系列的下一篇文章，了解 Docker 基础知识。

* [开始使用 Docker](https://ostechnix.com/getting-started-with-docker/)

要在基于 RPM 的系统（例如 RHEL、Fedora、CentOS、AlmaLinux、Rocky Linux 和 openSUSE）中安装 Docker，请参考以下链接。

* [在 CentOS 中安装 Docker](https://ostechnix.com/install-docker-centos/)

### 总结

在这篇教程中，我们讨论了 Docker 是什么，如何在 Ubuntu 22.04 LTS Jammy Jellyfish 中安装 Docker 。然后学习了如何通过运行 hello-world Docker 镜像测试 Docker 是否成功安装。最后，我们通过使用两种不同的方式安装 Docker Compose 作为本教程的结尾。

### 资料

* [Docker 主页](https://www.docker.com/)

---

via: <https://ostechnix.com/install-docker-ubuntu/>

作者：[sk](https://ostechnix.com/author/sk/) 选题：[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/) 荣誉推出


硬核观察 #711 谷歌已经干砸了 267 款硬件

Summary: • 谷歌已经干砸了 267 款硬件 • 漏洞披露 15 分钟后黑客就开始扫描 • 华为正式发布 HarmonyOS 3

什么时候才能出一款 自主指令集、便宜、能持续更新、开放 的手机啊？已经几年没换手机了，好怕撑不到那时候啊。

你的追求太高了，我只希望两点：1.linux完全转向wayland 2.chrome支持视频硬解。现在好多wayland应用不支持中文输入法，或支持的很差，10年内希望能支持，并且完全废除对x11的兼容；chrome硬解功能，希望google大发慈悲。

![](/data/attachment/album/202207/28/152423fw0ybm5w55mqzbn5.jpg)

![](/data/attachment/album/202207/28/152432ouvy7ddzkrg5zjbb.jpg)

### 谷歌已经干砸了 267 款硬件

据一家国外网站不完全统计，预计到明年 3 月（按照谷歌的预告），谷歌画上句号的硬件产品有 267 款。其中包括 Nexus 手机（2012-2015）、谷歌眼镜（2012-2015）、谷歌 Cardboard VR 纸盒（2014-2019）等等。

>
> **[消息来源：Tech Going](https://www.techgoing.com/over-the-years-google-has-done-a-smashing-267-hardware/)**
>
>
>

>
> 老王点评：看来谷歌还需要在硬件上证明自己，不过似乎这些只有苹果在硬件上一直保持不错的成绩，其它软件大厂大多在硬件上的成功不如其软件。
>
>
>

![](/data/attachment/album/202207/28/152443aoz37pqy3x637zp7.jpg)

### 漏洞披露 15 分钟后黑客就开始扫描

最近发布的一份事故响应报告称，黑客一直在监视安全公司的新漏洞披露报告，通常在 CVE 公布 15 分钟后就开始扫描漏洞，在数小时内就能观察到首次漏洞利用尝试。以 2022 年 5 月 4 日披露的 F5 BIG-IP 远程执行漏洞 CVE-2022-1388 为例，在 CVE 公布 10 小时内就记录到了 2552 次扫描和漏洞利用尝试。据该报告，2022 年上半年利用最多的漏洞是 ProxyShell 占 55%，其次是 Log4Shell 占 14%，SonicWall 7%，ProxyLogon 5%。

>
> **[消息来源：Bleeping Computer](https://www.bleepingcomputer.com/news/security/hackers-scan-for-vulnerabilities-within-15-minutes-of-disclosure/)**
>
>
>

>
> 老王点评：从 CVE 公布之时，就是安全专家和黑客赛跑的发令枪。我觉得作为安全专家，真是太难了。
>
>
>

![](/data/attachment/album/202207/28/152457nxprspivvkrjg9io.jpg)

### 华为正式发布 HarmonyOS 3

27 日，华为正式发布了 HarmonyOS 3，将于 9 月启动规模升级。用户已经可以申请测试版尝鲜，支持多达 14 款设备。截止今年 7 月，搭载 HarmonyOS 2 的华为设备突破 3 亿台。此次的 HarmonyOS 3，升级主要围绕超级终端、鸿蒙智联、万能卡片、流畅性能、隐私安全和信息无障碍六大方面。

>
> **[消息来源：鸿蒙](https://mp.weixin.qq.com/s/kHVPO15k8w8o8oMcGsviAA)**
>
>
>

>
> 老王点评：期待了很久的鸿蒙 3 终于发布了，你准备升级你的华为手机吗？
>
>
>


Debian 可能会考虑在官方版本中包含非自由固件

先以自由包的标准创建一个非官方的测试包，专用于管理自由/非自由固件之间的顺利切换；可以解决许多用户的实际问题，不外乎就是显卡网卡驱动；但不必把它包含在官方镜像里，许多用户就是看重官方自由镜像，并愿意在此基础上加装个别闭源驱动的，只要简化这个需求的学习成本就好。

>
> Debian 会考虑在官方版本中添加非自由固件吗？如果他们想解决 Debian 开发人员重点提出的问题，这似乎是一种可能性。
>
>
>

![debian](/data/attachment/album/202207/29/075143o0jogujivuigw05s.jpg)

由于 Debian 的稳定性和新功能之间的平衡，它是最受欢迎的 Linux 发行版之一。

此外，它不附带任何非自由固件。

但是，对于想要在较新硬件上使用 Debian 的用户来说，这已成为一个问题。

大多数最新的设备和配置都需要非自由固件才能正常工作，其中包括 Wi-Fi、图形等。

为了解决这个问题，Debian 开发人员、前 Debian 项目负责人 Steve McIntyre 已经积极讨论了一段时间。

正如 [Geeker's Digest](https://www.geekersdigest.com/debian-on-the-verge-to-include-non-free-firmware-in-official-releases/) 所发现的，在 DebConf 22 会议上，Steve 最近向用户和开发人员着重谈到了修复固件混乱这件事。

### 在官方版本中包含非自由固件

至于目前的情况，你可以找到带有非自由固件的非官方 Debian 镜像。

然而，并不是每个用户都知道它，即使它在 Debian 的下载页面上被宣传，“非官方”也不是用户更喜欢推荐的镜像的东西。

此外，当用户可以选择 Ubuntu 或任何基于 Ubuntu 的发行版作为替代方案时，期望用户安装非自由固件也是违反直觉的。

不仅限于这些问题，Steve 在他的 [博客](https://blog.einval.com/2022/04/19#firmware-what-do-we-do) 中还提到了其他一些问题，包括：

* 维护单独的非自由镜像非常耗时。
* 由于缺乏非自由固件，许多用户不喜欢官方镜像。

如果我们希望更多用户在通用硬件上使用 Debian，Steve 建议尽早解决这个问题。

可能会通过安装程序中的提示让用户安装非自由固件，类似于 Ubuntu 所做的。

此外，在他在 DebConf 22 的演讲中，似乎大多数开发人员投票支持在官方 Debian 镜像中添加非自由固件。

随着他重点提出这件事，Steve 得到了寻找解决这个问题的社区用户/开发人员的更多关注。

**简单/方便的出路**：在官方发布的镜像中添加非自由固件。

那么，Debian 最终会在其新版本中添加对非自由固件的支持吗？ Debian 12 会让这成为现实吗？

在下面的评论中分享你的想法。

---

via: <https://news.itsfoss.com/debian-non-free/>

作者：[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/) 荣誉推出


学习 ReactJS 之前，你需要了解多少 JavaScript？

![](/data/attachment/album/202207/29/082104d5zn1xn77r1n8p1n.jpg)

>
> 最主要的是要精通 JavaScript，这样你就可以减少 ReactJS 之旅的复杂性。
>
>
>

React 是一个建立在 HTML、CSS 和 JavaScript 之上的 UI 框架，其中 JavaScript（JS）负责大部分的逻辑。如果你对变量、数据类型、数组函数、回调、作用域、字符串方法、循环和其他 JS DOM 操作相关的主题有一定了解，这些将极大地加快学习 ReactJS 的步伐。

你对现代 JavaScript 的概念将决定你能多快地掌握 ReactJS 的步伐。你不需要成为一个 JavaScript 专家来开始你的 ReactJS 之旅，但就像对食材的了解是任何希望掌握烹饪的厨师所必须的一样，学习 ReactJS 也是如此。它是一个现代的 JavaScript UI 库，所以你需要了解一些 JavaScript。问题是，需要多少？

### 示例解释

假设我被要求用英语写一篇关于“牛”的文章，但我对这种语言一无所知。在这种情况下，为了让我成功地完成任务，我不仅要对主题有概念，还要对指定的语言有概念。

假设我获得了一些关于主题（牛）的知识，我如何计算我需要知道多少英语才能写出规定的主题？如果我必须用英语写一篇关于其他复杂话题的文章呢？

这很难搞清楚，不是吗？我不知道我要写关于这个话题的什么东西，但它可能是任何东西。所以要想开始，我必须要有适当的英语知识，但还不止于此。

### 极端现实

在开始使用 ReactJS 之前，所需的 JavaScript 数量也是如此。根据我的例子情景，ReactJS 是话题“牛”，而 JavaScript 是英语。要想在 ReactJS 中获得成功，对 JavaScript 的掌握很重要。如果没有适当的 JavaScript 基础，一个人是很难专业地掌握 ReactJS 的。无论我对这个主题有多少知识，如果我不知道语言的基础，我就不能正确地表达自己。

### 多少才算够？

根据我的经验，当你开始你的 ReactJS 之旅时，你应该已经熟悉了：

* 变量
* 数据类型
* 字符串方法
* 循环
* 条件式

你应该对这些具体的 JavaScript 熟悉。但这些只是最基本的先决条件。当你试图创建一个简单的 React 应用时，你将不可避免地需要处理事件。所以，普通函数、函数表达式、语句、箭头函数的概念，箭头函数和普通函数的区别，以及这两类函数中 `this` 关键字的词义范围，这确实很重要。

但问题是，如果我必须使用 ReactJS 创建一个复杂的应用怎么办？

### 获得启发

在 JavaScript 中处理事件、传播操作符、解构、命名导入和默认导入将帮助你理解 React 代码的工作机制。

最重要的是，你必须了解 JavaScript 本身背后的核心概念。JavaScript 在设计上是异步的。当出现在文件底部的代码在文件顶部的代码之前执行时，不要惊讶。像 promise、callback、async-await、map、filter 和 reduce 这样的结构，是 ReactJS 中最常见的方法和概念，尤其是在开发复杂的应用时。

最主要的是要精通 JavaScript，这样你可以减少 ReactJS 之旅的复杂性。

### 越来越好

我很容易说出你需要知道的东西，但你去学习它完全是另一回事。大量练习 JavaScript 是必不可少的，但你可能会感到惊讶，我认为这并不意味着你必须等到掌握它。有些概念事先很重要，但你可以在学习过程中学到很多东西。练习的一部分是学习，所以你可以开始使用 JavaScript，甚至是 React 的一些基础知识，只要你以舒适的速度移动并理解在你尝试任何严肃的事情之前做你的“家庭作业”是一个要求。

### 立即开始使用 JavaScript

不要费心等到你了解了 JavaScript 的所有方面。那永远不会发生。如果这样做，你将陷入学习 JavaScript 的永远循环中。你们都知道技术领域是如何不断发展和迅速变化的。如果你想开始学习 JavaScript，请尝试阅读 Mandy Kendall 的介绍性文章 [通过编写猜谜游戏学习 JavaScript](https://opensource.com/article/21/1/learn-javascript)。这是一种快速入门的好方法，当你看到了可能的情况，我认为你可能会发现很难停下来。

---

via: <https://opensource.com/article/22/7/learn-javascript-before-reactjs>

作者：[Sachin Samal](https://opensource.com/users/sacsam005) 选题：[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/) 荣誉推出


硬核观察 #712 UEFI 攻击对我们来说是几乎是不可见的

Summary: • UEFI 攻击对我们来说是几乎是不可见的 • DeepMind 发布几乎所有已知蛋白质的预测结构 • 新版 GB18030 字符集标准发布

GB 18030-2022 发布了，宋体、仿宋、楷体、黑体 什么时候能从国家的网站下载和任意免费使用呢

字体和字符集标准不是等价物。那些字体的版权又不在国家手中，你还不如说国家什么时候开发一套免费的字体。

免费的字体早就有了，比如思源、花园明朝等

![](/data/attachment/album/202207/29/104752sxsw4xudwux1z9wu.jpg)

![](/data/attachment/album/202207/29/104812ptpk8xdxx9edddzd.jpg)

### UEFI 攻击对我们来说是几乎是不可见的

安全研究人员发现 UEFI 的 Rootkit 并不罕见，而且难以检测。卡巴斯基研究人员在对一种复杂的 UEFI Rootkit 研究后表示：“这种 UEFI 植入物似乎自 2016 年底以来就已经在野外使用，这甚至早在 UEFI 攻击开始被公开描述之前。”

>
> **[消息来源：ARS Technica](https://arstechnica.com/information-technology/2022/07/researchers-unpack-unkillable-uefi-rootkit-that-survives-os-reinstalls/)**
>
>
>

>
> 老王点评：这说明很可能在我们都毫不知情的情况下，已经被偷偷入侵和窃取了很多信息。
>
>
>

![](/data/attachment/album/202207/29/104827jhd8bbq5hh527d26.jpg)

### DeepMind 发布几乎所有已知蛋白质的预测结构

蛋白质由氨基酸链组成，折叠成复杂的形状，这在很大程度上决定了它们的功能。一旦你知道蛋白质是如何折叠的，你就可以开始了解它是如何工作的，以及如何改变它的行为。2020 年 11 月，DeepMind 宣布已开发出一个名为 AlphaFold 的程序，可以使用算法快速预测其结构。去年，DeepMind 发布了 20 个物种的蛋白质结构——包括人类表达的几乎所有 20,000 种蛋白质。现在它已经完成了这项工作，并发布了超过 2 亿种蛋白质的预测结构。基本上，你可以认为它涵盖了整个蛋白质宇宙。

>
> **[消息来源：卫报](https://www.theguardian.com/technology/2022/jul/28/deepmind-uncovers-structure-of-200m-proteins-in-scientific-leap-forward)**
>
>
>

>
> 老王点评：这才是 AI 应该造福人类的地方，而不是用在监控、深度伪造这种地方。
>
>
>

![](/data/attachment/album/202207/29/104845x8omsftbu8pkkzkn.jpg)

### 新版 GB18030 字符集标准发布

市场监管总局标准委发布了最新的 GB 18030 中文编码字符集。GB 18030 首次发布于 2000 年，2005 年第一次修订，这是第二次修订。2022 标准将于 2023 年 8 月 1 日正式实施，共收录汉字 87887 个，比上一版增加录入了 1.7 万余个生僻汉字。除了汉字，还包括了 10 种我国的少数民族语言的文字。

>
> **[消息来源：新华网](http://www.news.cn/politics/2022-07/28/c_1128872370.htm)**
>
>
>

>
> 老王点评：这是十多年来又一次修订，不过现在更多用的是 Unicode 了。
>
>
>


是时候抛弃 32 位的 Linux，改用 64 位的了

Summary: 如果你想获得安全的体验，你可能不会再继续使用 32 位 Linux 内核。

如果你想获得安全的体验，你可能不会再继续使用 32 位 Linux 内核。

>
> 如果你想获得安全的体验，你可能不会再继续使用 32 位 Linux 内核。
>
>
>

![](/data/attachment/album/202207/29/222603u6ueeeevz7i7e3c3.jpg)

我们有很多 [为 32 位系统定制的 Linux 发行版](https://itsfoss.com/32-bit-linux-distributions/)。

那么，为什么我想要不鼓励使用 32 位，而升级到 64 位 Linux 呢？

有几个原因，其中一个最大的原因，在本周引发了很多关注。

### 32 位：古老的电子垃圾硬件？

没错，与其他操作系统不同的是，Linux 发行版允许你重新利用旧硬件。

你能够将一个老机器转换为 [媒体服务器](https://itsfoss.com/best-linux-media-server/)、存储服务器，等等。

在这里，我并不是要给你一些如何贡献更多的电子垃圾的思路。尽可能长地利用你的硬件，而不更换它们总是好的。

然而，不使用 32 位系统的理由可能比以往更有说服力。关键的问题是在安全和维护方面。

### 利用 64 位 Linux 提高安全性

2018 年，危险的处理器安全问题 Spectre 漏洞引发了热议。虽然英特尔和 AMD 对这个漏洞进行了修复，但情况并不乐观。

不幸的是，一个新的漏洞 Retbleed，它是 Spectre 的一个变种，正在影响英特尔和 AMD 芯片。

你可以在下面由发现它的研究人员分享的视频中看到它的情况。

因此，我们自然需要适当的措施来解决这个新的安全漏洞的修复问题。

**令人震惊的事情来了**。64 位 Linux 内核已经收到了对它的修复，以保护有关的英特尔/AMD 的处理器。但是，正如 [Phoronix](https://www.phoronix.com/news/Linux-x86-Retbleed) 所报道的，Linux 32 位内核仍然容易受到 Retbleed 漏洞的影响。

英特尔的 Pawan Gupta 在 [内核邮件列表](https://lore.kernel.org/lkml/20220715221901.xm3c4w4idqt67uja@desk/) 中回应了这些担忧，他提到：

>
> 英特尔不知道还有谁在 Skylake 那一代的 CPU 上使用 32 位模式的生产环境。所以这不应该是一个问题。
>
>
>

另外，很少看到为 32 位维护所做的任何努力。所以，这应该不算什么意外。

因此，如果你使用你的系统进行任何可能受到安全问题影响的任务，你应该避开 32 位内核。

当然，如果你有一个完全离线的环境可以算做例外。所以，你可以这样做，但不建议这样做。

### 不关心安全问题？

即使你认为得不到像 Retbleed 这样的关键安全修复没有关系，2022 年的 32 位系统也会有更多的麻烦。

软件维护者们最终会放弃对 32 位系统上的工具和 Linux 发行版的更新。

因此，你的 32 位 Linux 系统可能很快就不会再有积极维护的程序了。

因此，现在进行转换（和升级）将是一个好主意。

*你还在使用 32 位的 Linux 吗？你对此有什么看法？在下面的评论中分享你的想法。*

---

via: <https://news.itsfoss.com/64-bit-linux/>

作者：[Ankush Das](https://news.itsfoss.com/author/ankush/) 选题：[lujun9972](https://github.com/lujun9972) 译者：[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/) 荣誉推出


修复 Ubuntu Linux 中 “Command ‘python’ not found” 的错误

Summary: 如果你注意这个错误信息，它说明了很多东西。这里的 python 命令实际上是 python3。

牛逼

![](/data/attachment/album/202207/30/071627r176w1k1y5dkkw6w.jpg)

如何在 Linux 终端中运行一个 Python 程序？像这样，对吗？

```
python program.py

```

然而，如果你试图在 Ubuntu（和其他一些发行版）中使用 `python` 命令，它会抛出一个错误。

```
command ‘python’ not found, did you mean:
command ‘python3’ from deb python3
command ‘python’ from deb python-is-python3

```

如果你注意这个错误信息，它说明了很多东西。**这里的 `python` 命令实际上是 `python3`**。

如果你不理解，不用担心。我将在这里详细解释。

### 为什么在 Ubuntu 上没有发现 python 命令？

这是因为 Python 语言不是以 `python` 的形式安装的，而是以 `python3` 或 `python2` 的形式安装的（在一些老的 Ubuntu 版本中）。

在遥远的过去的某个时间点，Python 实际上是作为 `python` 包/可执行文件提供的。当 Python 发布第二版时，Ubuntu 和其他发行版不得不同时支持 Python 1.x 和 2.x 版本。

因此，他们将较新的 Python 版本命名为 `python2`，以区分这两个版本。其他应用或库也在其代码中指定 `python` 或 `python2`。

最终，Python 1 版本被完全停用，但软件包继续被命名为 `python2`。

类似地，当 Python 3 版本发布时，发行版开始同时提供 `python2` 和 `python3` 包。

Python 2 不再被支持，Python 3.x 是你在 Ubuntu 上安装的版本。该软件包仍被命名为 `python3`。

**总结一下，你已经在 Ubuntu 上安装了 Python。它是以 `python3` 软件包方式使用的。**

那么，当你 [在 Ubuntu 上看到 “Python command not found” 的错误](https://itsfoss.com/bash-command-not-found/) 时，你有什么选择？让我来介绍一下。

### 确保你的系统中已经安装了 Python

它应该已经安装了，但仔细检查一下也无妨。

Ubuntu 18.04 也有 Python 2，但 20.04 及更高版本只有 Python 3。不过，你有哪个版本：

```
type python python2 python3

```

正如你在下面的截图中看到的，我的系统上安装了 Python 3 版本。

![Checking Python version in Ubuntu](/data/attachment/album/202207/30/071649t3b6wbzcavyk267t.png)

如果你没有安装任何 Python 版本，你可以用以下命令安装 Python 3 版本。

```
sudo apt install python3

```

### 使用 python3 而不是 python

如果对你来说不是太麻烦，在需要的地方使用 `python3` 命令而不是 `python`。

想检查已安装的 Python 版本吗？请这样输入：

```
python3 --version

```

然后你会在输出中得到版本的详细信息：

```
~$ python3 --version
Python 3.10.4

```

如果你必须运行一个 Python 程序，请像这样执行它：

```
python3 program.py

```

这在大多数情况下应该对你有用。但是，如果你使用的是一些（旧的）Python 应用，期望在其代码中运行 Python 可执行文件，你就会有问题。别担心，你也可以绕过它。

### 将 python3 链接为 python

你可以在你的 `.bashrc` 文件中创建一个永久别名，像这样：

```
alias python='python3'

```

这样，你可以运行 `python` 命令，而你的系统运行 `python3`。

这在大多数情况下都会起作用，除非某些程序期望运行 `/usr/bin/python`。现在，你可以在 `/usr/bin/python` 和 `/usr/bin/python3` 之间建立符号链接，但对于 Ubuntu 用户来说，存在一个更简单的选择。

对于 Ubuntu 20.04 和更高版本，如果你安装了 `python-is-python3` 软件包，你有一个软件包可以自动完成所有链接创建。这也是原始错误信息所提示的。

```
sudo apt install python-is-python3

```

![install python is python3 ubuntu](/data/attachment/album/202207/30/071649fitwdowttttdhutu.png)

你可以看到符号链接已经被创建，你可以使用 `python` 命令（实际上是运行 `python3`），没有任何问题。

![checking python ubuntu](/data/attachment/album/202207/30/071650elcug2c4olqolalp.png)

我希望这能澄清 Ubuntu 中 Python 软件包的问题。如果你有任何问题或建议，请告诉我。

---

via: <https://itsfoss.com/python-not-found-ubuntu/>

作者：[Abhishek Prakash](https://itsfoss.com/author/abhishek/) 选题：[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/) 荣誉推出


硬核观察 #713 量子计算在 6 分钟内解决了 3854 个变量的宝马优化问题

Summary: • 量子计算在 6 分钟内解决了 3854 个变量的宝马优化问题 • 亚马逊将关闭其网盘存储服务 • QEMU 7.1 将带来龙芯架构支持

国产量子来一段，打打他们滴脸。

![](/data/attachment/album/202207/30/151616p96nbsfu2rl3lbdd.jpg)

![](/data/attachment/album/202207/30/151623hx5e47874qc4qq4t.jpg)

### 量子计算在 6 分钟内解决了 3854 个变量的宝马优化问题

在汽车尤其是自动驾驶汽车上安放传感器涉及大量的变量，如底盘设计，有没有障碍物（不同位置提供了不同视野），风阻和重量平衡等等，这需要大量的试错，不同的车型还需要重新制定不同的方案。宝马汽车的问题涉及到了 3854 个变量和 500 个约束条件，经典计算机解决这个问题需要大量的时间。量子计算公司 QCI 使用的是其新量子硬件，在 6 分钟内解决了该问题，提供了一个由 15 个传感器构成的方案。

>
> **[消息来源：Tom's Hardware](https://www.tomshardware.com/news/quantum-computing-company-solves-3854-variable-problem-for-bmw-in-six-minutes)**
>
>
>

>
> 老王点评：居然可以解决某种具体问题了？那说明量子计算步入实用更进一步了。
>
>
>

![](/data/attachment/album/202207/30/151635xu2bzjlepdzb35n2.jpg)

### 亚马逊将关闭其网盘存储服务

亚马逊周五早上发送电子邮件通知用户，将于 2023 年 12 月 31 日关闭其已运营 11 年的网盘存储服务，以更充分地将精力集中在“亚马逊照片”上。亚马逊表示，用户帐户中的照片和视频已自动保存到亚马逊照片中。如果你依靠该服务进行文件存储，则需要在结束服务日期之前访问并下载文件。

>
> **[消息来源：Geek Wire](https://www.geekwire.com/2022/amazon-is-shutting-down-its-cloud-storage-service-amazon-drive/)**
>
>
>

>
> 老王点评：看来网盘服务盈利前景堪忧啊，有这个风向标，国内的网盘服务会如何呢？
>
>
>

![](/data/attachment/album/202207/30/151649soppe8hr7or1itp7.jpg)

### QEMU 7.1 将带来龙芯架构支持

QEMU 7.1-rc0 已经发布，其稳定版本将在几周后发布。QEMU 7.1 将初始支持 64 位龙芯架构的 3A5000 系列 SoC。QEMU 7.1 也将支持更多的 RISC-V 特性，如 RISC-V 特权规格 1.12 版，改进的 PMU 实现，Zmmul 扩展等。对于 QEMU 迁移，它现在支持 Linux 上的零拷贝发送，以减少源主机上的 CPU 使用率。

>
> **[消息来源：Phoronix](https://www.phoronix.com/news/QEMU-7.1-rc0-Released)**
>
>
>

>
> 老王点评：龙芯不断地将各种驱动提交到上游，可见其发展速度在加快。
>
>
>


Pop!_OS 22.04 Linux 发行版现在支持树莓派 4 了

Summary: System76 终于为其最新的 Pop!_OS 22.04 LTS 增加了对树莓派 4 的支持。

>
> System76 终于为其最新的 Pop!\_OS 22.04 LTS 增加了对树莓派 4 的支持。
>
>
>

![Pop os](/data/attachment/album/202207/31/082153jgeo87wcn869w6cc.jpg)

Pop!\_OS 是 [最好的初学者友好的 Linux 发行版](https://itsfoss.com/best-linux-beginners/) 之一。

它基于 Ubuntu，显然，Pop!\_OS 22.04 LTS 是基于 [Ubuntu 22.04 LTS](https://news.itsfoss.com/ubuntu-22-04-release/) 的。

然而，与 Ubuntu 不同，Pop!\_OS 22.04 在发布时并没有正式支持树莓派。

因此，期待 [Pop!\_OS 22.04 LTS](https://news.itsfoss.com/pop-os-22-04-release/) 版本对树莓派的支持是合理的。

如果你还记得，System76 在 **Pop!\_OS 21.10** 中首次增加了对树莓派的支持。我们在测试时也 [报道过](https://news.itsfoss.com/pop-os-raspberry-pi-coming-soon/)。

而且，据 System76 的首席工程师 Jeremy Soller 透露， System76 最新的 Pop!\_OS 版本现在正准备支持树莓派 4。

### Pop!\_OS 22.04 LTS for Raspberry Pi 4

如果你一直在你的树莓派 4 上使用 Pop!\_OS 21.10，这对你来说是个好消息。

而且，对于任何想在树莓派 4 上尝试 Pop!\_OS 的人来说，它终于有了一个 LTS 版本。

截至目前，该 ISO 是作为技术预览版提供的。因此，如果你想试试它，你应该有出现错误和可用性问题的心理预期。请注意，目前还 **只限于树莓派 4**，不支持其他树莓派设备，这是个遗憾。

我们不知道 System76 是否计划在这个 LTS 版本中支持其他树莓派板，或者他们是否坚持只支持树莓派 4。

然而，考虑到树莓派 4 现在相当流行，对于许多寻求替代 Ubuntu 的 [树莓派的替代操作系统](https://itsfoss.com/raspberry-pi-os/) 的爱好者们来说，这应该是一个很好的进展。

有了 Pop!\_OS 22.04 LTS，树莓派 4 的用户应该能够体验到一些最令人兴奋的升级，以及更新的 [Linux 内核 5.15 LTS](https://news.itsfoss.com/linux-kernel-5-15-release/)。

要下载该技术预览版，请前往 Pop!\_OS 的 [官方网站](https://pop.system76.com/)，点击下载按钮，找到该选项。

![Pop OS](/data/attachment/album/202207/31/082154ajec7j73iqd7d976.png)

你对树莓派 4 上的 Pop!\_OS 22.04 有什么期望？请在下面的评论中告诉我们你的想法。

---

via: <https://news.itsfoss.com/pop-os-22-04-raspberry-pi-4/>

作者：[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/) 荣誉推出


为地铁站构建一个智能停车系统

有类似于树梅派这样的硬件，再加块便宜的触控大屏搞成一个整体的模组，即使公交站拆迁也就是重新布线的问题。我觉得有这么个产品全国的公交站普及了那是多大的市场，我要是能有这么个产品场，一年挣200万应该可以实现！！！

多大了

来自陕西西安的 Chrome Mobile 101.0|Android 11 用户

>
> 本文将帮助你设计一个基于 Web 的应用程序，使用 Node-RED 为地铁站的汽车提供一个自动智能停车系统。
>
>
>

![Smart car parking](/data/attachment/album/202207/31/091533bzrq0a55qus8at3z.jpg)

Web 应用程序是在 Web 服务器上运行的软件。终端用户通过 Web 浏览器访问 Web 应用程序。Web 应用程序使用客户端—服务器（C/S）架构进行编程，该架构是用户（客户端）通过远程服务器（可能由第三方托管）提供服务。Web API（应用程序编程接口）在整个 Web 上是可用的，用户可以通过 HTTP 协议访问该接口，如图 1 所示。

![Figure 1: Web API](/data/attachment/album/202207/31/091533dglh35gg4g9g53gz.jpg)

本文将演示如何为地铁设计一个基于 Web 的汽车自动智能停车系统。 它是使用开源的 Node-RED 设计。该系统使用模板节点创建了一个交互式的、时尚的用户登录表单，用 HTML 和 CSS 编码以获取车主的详细信息，从而实现停车系统的自动化。我们可以在图 2 和图 3 看到登录表单和提交表单的流程图。

使用的节点如下：

![table function](/data/attachment/album/202207/31/091533f6qlbo6zah6zplpc.jpg)

### 地铁智能停车节点流程设计

Node-RED 由 `node-red` 命令激活。访问网址 `http://127.0.0.1:1880/` 可以看到 Node-RED 用户界面流程浏览器已经启用，可以认为 Node-RED 设置已完成，可以正常工作了。

按照下面给出的步骤创建登录表单和提交表单。

![Figure 2: Login form flow diagram](/data/attachment/album/202207/31/091534gwk1tjkczwqd1qoj.jpg)

![Figure 3: Submission form flow diagram](/data/attachment/album/202207/31/091534il6bnbk6ymobbkex.jpg)

### 登录表单

1、在节点画布中，拖放 <ruby> http 输入 <rt>  http in </rt></ruby> 节点，这会为创建 Web 服务创建一个 HTTP 访问点。

2、将 <ruby> http 输入 <rt>  http in </rt></ruby> 节点连接到 <ruby> 函数 <rt>  function </rt></ruby> 节点。函数节点有助于编写 JavaScript 函数处理节点接收到的消息。

![Figure 4: Login form for smart parking for cars](/data/attachment/album/202207/31/091534pjejfgptatd5gugj.jpg)

3、将 <ruby> 函数 <rt>  function </rt></ruby> 节点连接到 <ruby> 模板 <rt>  template </rt></ruby> 节点，模板节点基于提供的模板创建一个 Web API。

4、将 <ruby> 模板 <rt>  template </rt></ruby> 节点连接到 <ruby> http 响应 <rt>  http response </rt></ruby> 节点，它将响应 <ruby> http 输入 <rt>  http in </rt></ruby> 节点的请求。

![Figure 5: Submission form for smart parking for cars](/data/attachment/album/202207/31/091534rxsjt334i1m1igzm.jpg)

### 提交表单

1、拖放 <ruby> http 输入 <rt>  http in </rt></ruby> 节点并将其连接到 json 节点，json 节点将数据转换为 JSON 字符串进行通信。

2、将 <ruby> http 输入 <rt>  http in </rt></ruby> 节点连接到 <ruby> 调试 <rt>  debug </rt></ruby> 节点，调试节点的调试监控器会输出结果。

3、将 json 节点放置并连接到 <ruby> 函数 <rt>  function </rt></ruby> 节点，将后者连接到 <ruby> http 响应 <rt>  http response </rt></ruby> 节点。

创建完整流程后，单击 Node-RED 窗口右上角的 <ruby> 部署 <rt>  Deploy </rt></ruby> 按钮。访问 `http://127.0.0.1:1880/ui/` 这个链接查看用户界面。

输入链接然后单击 <ruby> 提交 <rt>  Submit </rt></ruby> 后，该链接会跳转到下一页，你可以在该页面阅读所有新闻。

### Node-RED 工作流程

在单个 Node-RED 流程中，你可以创建登录表单和提交表单，如图 4 和图 5 所示。

现在我们将配置节点属性。

#### 登录表单

编辑 <ruby> http 输入 <rt>  http in </rt></ruby> 属性：

* <ruby> 方法 <rt>  method </rt></ruby> 选择 “Get”
* <ruby> 网址 <rt>  URL </rt></ruby> 设为 `/MetroStation`
* <ruby> 名称 <rt>  name </rt></ruby> 配置为 “<ruby> 智能停车系统 <rt>  Smart Parking </rt></ruby>”。

（LCTT 译注：下文 http 响应节点的名称为 Smart parking，p 字母小写，为了区分，此处中文翻译成智能停车系统。）

![Figure 6: Http in node property configurations](/data/attachment/album/202207/31/091535h4sj69t5m5515pvy.jpg)

>
> 注意：URL 可以使用任何用户定义的本地变量。
>
>
>

现在选择 <ruby> 函数 <rt>  function </rt></ruby> 节点，编辑函数节点属性：输入代码 `msg.url = project` ，并配置代码 <ruby> 名称 <rt>  name </rt></ruby> 字段为 “<ruby> 项目提交 <rt>  Project Submission </rt></ruby>”。

![Figure 7: Function node property configurations](/data/attachment/album/202207/31/091535bya2f2d69brltrlw.jpg)

在 <ruby> 模板 <rt>  template </rt></ruby> 节点的属性窗口，为登录表单配置相应的 HTML 代码，并将代码 <ruby> 名称 <rt>  name </rt></ruby> 命名为 “<ruby> 显示面板 <rt>  Display panel </rt></ruby>”。在此流程使用了 Mustache 模板格式（LCTT 译注：Mustache 是胡子的意思，因为它的嵌入标记 `{{ }}` 非常像胡子）。Mustache 是一个简单的 Web 模板系统，被描述为无逻辑的模板引擎。Mustache 没有任何显式的控制流语句，例如 `if` 和 `else` 条件和 `for` 循环。可以通过使用块标签处理列表和lambdas 来实现循环和条件评估。

![Figure 8: Template node property configurations](/data/attachment/album/202207/31/091535t3y3858j53838x88.jpg)

配置编辑 <ruby> http 响应 <rt>  http response </rt></ruby> 节点的属性，<ruby> 名称 <rt>  name </rt></ruby> 设为 “<ruby> 智能停车 <rt>  Smart parking </rt></ruby>”（图 9） 。

![Figure 9: Http response node property configurations](/data/attachment/album/202207/31/091535cjav29vftyvyrywv.jpg)

#### 提交表单

在 <ruby> http 输入 <rt>  http in </rt></ruby> 节点的编辑属性窗口，<ruby> 方法 <rt>  method </rt></ruby> 选择 “POST” ，<ruby> 网址 <rt>  URL </rt></ruby> 设为 `/project`。

![Figure 10: Http in node property configurations](/data/attachment/album/202207/31/091535rtzv6r4avxare6ep.jpg)

在 JSON 节点的编辑窗口，<ruby> 操作 <rt>  Action </rt></ruby>设为 “<ruby> JSON字符串与对象互转 <rt>  Convert between JSON String & Object </rt></ruby>”，参考图 11。

![Figure 11: JSON node property configurations](/data/attachment/album/202207/31/091536zp0xxpdgficm0oco.jpg)

<ruby> 函数 <rt>  function </rt></ruby> 节点的配置如图 12 所示。

![Figure 12: Function node property configurations](/data/attachment/album/202207/31/091536gvu919hmixm1mlhv.jpg)

在 <ruby> http 响应 <rt>  http response </rt></ruby> 节点，编辑属性 <ruby> 名称 <rt>  name </rt></ruby> 为 “<ruby> 已提交项目 <rt>  Project Submitted </rt></ruby>”。

![Figure 13: Http response node property configurations](/data/attachment/album/202207/31/091536jmqaa0gsjscsi4vz.jpg)

>
> 注意：添加带有评论的评论节点作为 “登录表单” 和 “提交表单”。
>
>
>

![Figure 14: Debug node property configurations](/data/attachment/album/202207/31/091536gn5uh0zwvn2wxnw3.jpg)

### 用户界面的控制面板

当用户单击 <ruby> 提交 <rt>  Submit </rt></ruby>，给出的数据将显示在用户界面和调试节点。如果单击 <ruby> 重置 <rt>  Reset </rt></ruby>，详细信息将被清除，允许用户输入新的详细信息（图15）。

![Figure 15: User login UI](/data/attachment/album/202207/31/091537lx2l9k6628kffopf.jpg)

地铁停车费率通过超链接提供，收费表在用户界面显示。因此，汽车智能停车系统通过适当的超链接实现自动化，展示地铁站的停车费。该自动化系统的最终输出可以在 Node-RED 控制面板的用户界面和调试监控器调取和展示。

![Figure 16: Metro parking tariff](/data/attachment/album/202207/31/091537ket74ab3le3bddtb.jpg)

---

via: <https://www.opensourceforu.com/2022/06/build-a-smart-parking-system-for-a-metro-station/>

作者：[Dr Maheswari R.](https://www.opensourceforu.com/author/dr-maheswari-r/) 选题：[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/) 荣誉推出


在 Linux 中使用组合键输入隐藏的字形

Summary: 使用组合键，你不会被键盘所限制住。

使用组合键，你不会被键盘所限制住。

>
> 使用组合键，你不会被键盘所限制住。
>
>
>

![](/data/attachment/album/202207/31/095532p72762ekberw7eb6.jpg)

典型的键盘只有约 100 个键位。

由于 `Shift` 键，许多键得以有两个字符（也称之为 <ruby> 字形 <rt>  glyph </rt></ruby>）。字形常用于键入带有重音和变音符号的字母，生成数学公式或者货币中的符号，或者添加有趣的表情符号。在一些地区，有些键甚至有三个字形。

然而，不论你身处何处，有一些字形不会出现在你的键盘上。幸运的是，Linux 提供了使用 <ruby> 组合键 <rt>  Compose Key </rt></ruby> 来获取这些字形。

在你的键盘上没有组合键这个键，至少默认情况下没有，但是你可以设定一个你不用的键作为组合键。我在电脑上使用空格键旁边的 `Alt` 键，而在平板上使用菜单键，来作为组合键。

>
> **[下载 Linux 组合键速查表](https://opensource.com/downloads/linux-compose-key-cheat-sheet)**
>
>
>

### 在 GNOME 中设置组合键

![A screenshot shows the keyboard and mouse options visible. The "Compose Key" option is set to Right Alt.](/data/attachment/album/202207/31/095607afy1i18xwx5etvke.jpg)

在 GNOME 桌面，从软件库中安装 <ruby> 优化 <rt>  Tweaks </rt></ruby> 应用。你也可以从终端安装（基于 Debian 发行版用 `apt` 命令，Fedora 用 `dnf`）：

```
$ sudo dnf install gnome-tweaks

```

启动优化应用后：

1. 单击左侧栏中的 <ruby> 键盘和鼠标 <rt>  Keyboard & Mouse </rt></ruby>类别
2. 找到 <ruby> 组合键 <rt>  Compose key </rt></ruby> 设置并指定一个键
3. 关闭优化应用

### 在 KDE Plasma 桌面设置组合键

![A screenshot shows the advanced options threaded under Keyboard settings. "Configure keyboard options" is checked, "Position of Compose Key" is checked within that menu, and "Right Alt" is checked within that menu.](/data/attachment/album/202207/31/095607pqxfxv99r2xx20sj.jpg)

在 KDE Plasma 桌面上，打开 <ruby> 系统设置 <rt>  System Settings </rt></ruby>，找到 <ruby> 输入设备 <rt>  Input Devices </rt></ruby> 控制界面。然后：

1. 在 <ruby> 输入设备 <rt>  Input Devices </rt></ruby> 界面，点击 “<ruby> 高级 <rt>  Advanced </rt></ruby>” 标签
2. 找到 <ruby> 组合键 <rt>  Compose key </rt></ruby> 列表项并指定一个键
3. 点击右下角 “<ruby> 应用 <rt>  Apply </rt></ruby>” 按钮，然后关闭 <ruby> 系统设置 <rt>  System Settings </rt></ruby>

### 使用组合序列

为了输入隐藏字符，需要按下组合键后松开。这样就可以进入组合模式。处于组合模式，你按下然后松开键，然后再按下一个键来组合字符。

例如：

1. 按下组合键并释放，你会进入组合模式
2. 按下单引号（`'`）并松开
3. 按下 `E` 并松开，这是一个有效的组合，所以现在退出了组合模式

你输入了一个字符：`É`！

一些组合序列只需要两个键的组合，然而还有一些需要三个键，并且至少有一个特殊字符要按四次键。

### 变音字符

这是一个很小众的世界，所以你的朋友的名字很有可能使用的字形不是你的键盘原生的字形。你现在可以跳过变音符号并使用适当的修饰符输入名字。

以下是常见变音符号的组合序列示例：

* `' + <字母>` = `á é í ó ú ć ń ý j́́ ẃ ź`
* `` + <字母>` = `à è ì ò ù ǹ ỳ ẁ`
* `~ + <字母>` = `ã ẽ ĩ õ ũ ñ ỹ`
* `^ + <字母>` = `â ê î ô û ĉ ŷ ĵ ŵ ẑ`
* `u + <字母>` = `ă ĕ ĭ ŏ ŭ`
* `c + c` = `č`
* `- + <字母>` = `ā ē ī ō ū đ`
* `, + <字母>` = `ą ę į ǫ ų ç ḑ ţ`

这里仅仅罗列了常见的几个，并不是所有的组合。

#### 货币符号

得益于组合键，国际银行业务也变得容易：

* `- + Y` = `¥`
* `- + L` = `£`
* `= + E` = `€`
* `= + L` = `₤`
* `= + N` = `₦`
* `= + R` = `₹`
* `= + W` = `₩`
* `/ + m` = `₥`
* `R + s` = `₨`
* `C + r` = `₢`
* `F + r` = `₣`

重申，这不是完整的列表，但是一个好的开始。

#### 有趣的字形

变音符号和货币符号具有实用性，但是组合键也可以用来娱乐：

* `< + 3` = `♥`
* `< + >` = `⋄`
* `# + q` = `♩`
* `: + )` = `☺`
* `: + (` = `☹`
* `p + o + o` = `?`

#### 长寿和繁荣

在 Linux 中我最喜欢的“秘密”字形是传统的 Vulcan 称呼，“长寿和繁荣”。

* `L + L + A + P` = `?`

### 找到所有的字形

通过组合键可以使用更多字形，你可以通过按随机组合序列来发现新的字形。查找字形的一种更有条理的方法是参考位于 `/usr/share/X11/locale/en_US.UTF-8` 中的 `Compose` 文件（需要根据你键盘使用的语言环境调整绝对路径）。

这个文件令人崩溃，因为它包含超过 6000 行的组合序列，其中许多是 ASCII 和 Unicode 的复杂组合。要快速轻松地参考常见和基础序列，你可以 [下载我们的组合键速查表](https://opensource.com/downloads/linux-compose-key-cheat-sheet)。它提供涵盖数学、排版、音乐、箭头、变音符号、货币等的序列。

现在你知道了这个秘密，你可以表达更多内容了。

*（图片源自：Seth Kenlon, CC BY-SA 4.0）*

---

via: <https://opensource.com/article/22/7/linux-compose-key-cheat-sheet>

作者：[Seth Kenlon](https://opensource.com/users/seth) 选题：[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/) 荣誉推出


硬核观察 #714 世界上第一个电子游戏《太空战！》在掌上游戏机上复活

Summary: • 世界上第一个电子游戏《太空战！》在掌上游戏机上复活 • 诺基亚宣布一同打造太空宽带 • 一少年向上万人出售远程访问间谍软件，赚取 30 万美元

![](/data/attachment/album/202207/31/171555ur40bbomd4cmbm2r.jpg)

![](/data/attachment/album/202207/31/171559bmxciezijqpaabyh.jpg)

### 世界上第一个电子游戏《太空战！》在掌上游戏机上复活

Analogue 宣布将在其 Pocket 游戏机上推出《太空战！》游戏，这是一款最初为 PDP-1 小型机设计的游戏，比《Pong》整整早了十年。《太空战！》最初由 MIT 的工程师们于 1962 年创作，使用了一台 PDP-1 小型机和 1024x1024 像素的 CRT 显示器。游戏中，两个飞船在一颗恒星的引力井中进行对决。重新发布该游戏的第三方开发商使用了 OpenFPGA 和已经属于公共领域的 PDP-1 和《太空战！》的源代码。

>
> **[消息来源：The Verge](https://www.theverge.com/2022/7/29/23282660/analogue-pocket-spacewar-1962)**
>
>
>

>
> 老王点评：虽然很原始，但是这可是第一个电子游戏啊！
>
>
>

![](/data/attachment/album/202207/31/171619mrwcdcpcaregupac.jpg)

### 诺基亚宣布一同打造太空宽带

诺基亚公司表示，将提供设备将 SpaceMobile 公司的卫星连接到全球电信网络，为计划中的天基宽带网络建立一个关键环节，使之可以与移动电话一起使用。他们表示，该网络旨在为没有数字服务的人和地方提供连接。与 SpaceX 不同，SpaceMobile 的服务旨在连接到标准的、未经修改的手机，不需要特殊的软件、地面终端或硬件。

>
> **[消息来源：彭博社](https://www.bloomberg.com/news/articles/2022-07-28/nokia-ast-spacemobile-join-forces-for-broadband-from-space)**
>
>
>

>
> 老王点评：诺基亚时不时出来秀一下存在感，否则真忘记了这个公司了。不过我觉得这种天基宽带挺好的，尤其是还不需要专门的设备。
>
>
>

![](/data/attachment/album/202207/31/171632vld0hlbn14ebxx9x.jpg)

### 一少年向上万人出售远程访问间谍软件，赚取 30 万美元

现年 24 岁的一位澳大利亚人基恩据称在其 15 岁时开发了一个远程访问间谍软件，允许用户远程控制其受害者的电脑。一旦安装了该工具，就可以用来窃取受害者的个人信息，通过网络摄像头和麦克风监视他们，并跟踪他们在电子邮件或文件中输入的内容。据称，基恩在一个黑客论坛上以 35 美元的价格出售该工具，向 128 个国家的 14500 多人出售该工具，赚取了 30 万至 40 万美元。现在他和他的母亲已经被指控多项罪名。

>
> **[消息来源：卫报](https://www.theguardian.com/australia-news/2022/jul/30/brisbane-teenager-built-spyware-used-by-domestic-violence-perpetrators-across-world-police-allege)**
>
>
>

>
> 老王点评：无知无畏啊，往往年轻时啥都敢干，啥钱也都敢收，殊不知这些都记在小本本上呢。
>
>
>


期待已久的 Linux Mint 21 发布

刚刚完成升级，体验还不错!

>
> Linux Mint 终于发布了基于 Ubuntu 22.04 LTS 的 “Vanessa”，并带来了很多有用的改进。
>
>
>

![linux mint 21](/data/attachment/album/202208/01/170846fro18rokho1jrok2.jpg)

Linux Mint 是 [最受欢迎的 Linux 发行版之一](https://itsfoss.com/best-linux-distributions/)。它使用 Ubuntu 作为其基础，特别是它基于 [长期支持](https://itsfoss.com/long-term-support-lts/) 的 Ubuntu 版本，以获得长达 5 年的软件支持。

现在，我们有一个新的版本升级，即 **Linux Mint 21 “Vanessa”**，它基于 4 月份最新发布的 [Ubuntu 22.04 LTS 版本](https://news.itsfoss.com/ubuntu-22-04-release/)。因此，用户可以预期它的安全更新可以支持到 2027 年。

让我们来看看这个版本的亮点。

### Linux Mint 21 Vanessa 的新亮点

![](/data/attachment/album/202208/01/170846eggyv99cvj7333bc.jpg)

它采用了稳定的、改进的 [Linux 5.15 LTS 内核](https://news.itsfoss.com/linux-kernel-5-15-release/)，Linux Mint 21 带来了一系列新的增加、变化和完善。

#### 现有用户的升级工具

![](/data/attachment/album/202208/01/170925g1ke5rjqmqremege.png)

现有的 Mint 20.3 用户可以使用新的基于 GUI 的升级工具轻松更新他们的系统。

用户会看到一个需要安装或升级的新软件包的列表，这也包括了对你可能手动添加的第三方 PPA 库的检查。

#### 新的蓝牙管理器

![](/data/attachment/album/202208/01/170847mo5bq05oq5mmmk6g.png)

Blueman 现在取代了图形界面的 GNOME 蓝牙管理器 Blueberry。

之所以这样做，主要是因为 Blueman 提供了更多的功能和连接选项，以及对多种桌面环境的更好支持。此外，Blueman 的用户界面与 Linux Mint 完美地融合在一起。

Blueman 包括一些高级选项，可能大多数用户用不到，但它是一个好工具。

#### 新的进程监控托盘图标

![](/data/attachment/album/202208/01/170847bw7fw7749hf4z7v3.png)

不管是对于资深用户还是初级用户来说，一个非常有用的功能是引入了一个新的托盘图标，可以监控进程！

这个托盘图标将通知用户是否有任何自动化进程（如更新和系统快照）在后台运行。

当系统变得缓慢时，Mint 用户将很容易知道该去哪里找到问题！

#### 增强的缩略图支持

![](/data/attachment/album/202208/01/170847zrvg0470xgvjumz6.png)

以前，一些文件类型没有任何缩略图显示，这样的用户体验不是很好。

为了解决这个问题，这个版本引入了一个新的项目 *xapp-thumbnails*，并为包括 AppImage、ePub、MP3、RAW 图片和 WebP 在内的文件类型带来了缩略图支持。

#### XApp 的改进

以前的 Timeshift 备份工具现在成为了一个 XApp，并由 Mint 团队正式维护。此外，在 rsync 模式下，如果快照导致磁盘上的可用空间少于 1GB，则会计算出下一次快照所需的空间并跳过下一次快照。

Xviewer、Warpinator、Thingy 和 WebApp 管理器也有了其他改进。

#### Cinnamon 5.4.2

Linux Mint 的旗舰桌面环境 Cinnamon 得到了良好的内部升级。

默认的窗口管理器 Muffin 现在重新基于较新的 Mutter 3.36 代码库开发。

窗口 UI 也有一些细微的改进，包括主题和动画。

![](/data/attachment/album/202208/01/170848hz5fhu2rhxx0dccd.png)

### 其他增加的功能和改进

其他一些变化包括：

* 改进了对 AppImage 的支持，这与 Ubuntu 22.04 不同
* 目录中出现了一组新的漂亮的壁纸

你可以在我们专门的 [Linux Mint 21 功能](https://itsfoss.com/linux-mint-21-features/) 文章中探索更多关于它的新亮点。

### 获取 Linux Mint 21

如果你正在使用 Mint 20.3，你应该能在几天内升级到 Mint 21。图形化的更新过程应该会在几天后出现。

你可以选择从 Linux Mint 的下载页面下载 ISO，进行全新安装。

>
> **[获取 Linux Mint 21](https://linuxmint.com/download.php)**
>
>
>

如果你的网络速度慢或不稳定，你也可以 [用这个种子链接](https://linuxmint.com/torrents/)。

享受新鲜的 Mint 吧 ?

---

via: <https://news.itsfoss.com/linux-mint-21-release/>

作者：[Rishabh Moharir](https://news.itsfoss.com/author/rishabh/) 选题：[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/) 荣誉推出


如何在 Ubuntu 中卸载 deb 包

Summary: 删除 .deb 文件的最简单和最可靠的方法是使用 apt remove 命令。

删除 .deb 文件的最简单和最可靠的方法是使用 apt remove 命令。

![](/data/attachment/album/202208/01/180906afaqifcsqqsfsxyq.jpg)

[从 .deb 文件安装应用](https://itsfoss.com/install-deb-files-ubuntu/) 非常简单。双击它，它会在软件中心中打开，然后从那里安装它。

但是如何在 Ubuntu 或 Debian 中卸载 deb 包呢？如何删除一段时间前安装的软件包呢。

虽然这有几个如果和但是，但删除 .deb 文件的最简单和最可靠的方法是使用 `apt remove` 命令。

```
sudo apt remove program_name

```

如你所见，**你需要在这里知道确切的包名称**。这可能并不总是显而易见的。例如，如果你在 Ubuntu 上安装 Google Chrome，则该程序在命令行中称为 “google-chrome-stable”。你已经知道了吗？我猜你不知道。

在本教程中，我将详细介绍如何找到确切的包名称，然后使用它来删除应用。我还将讨论使用图形方法删除 deb 包。

### 从 Ubuntu 中删除通过 .deb 文件安装的软件包

在我向你展示如何从命令行删除 deb 包之前，让我们在软件中心应用中快速查看它。

#### 方法 1：检查应用是否可以从软件中心移除

Ubuntu 有软件中心 GUI 应用，允许搜索、安装和删除应用。

搜索时，软件中心可能不会显示已安装的应用。

![Searching for installed applications may not show any results in Ubuntu Software Center](/data/attachment/album/202208/01/180927dejleni4nlmuxiui.png)

但是，如果向下滚动，你仍可能在“已安装”部分下找到它。外部应用通常不带徽标显示。

![Some installed applications can be found in the ‘installed’ tab of the Software Center](/data/attachment/album/202208/01/181108cbnzu7my5fl4imqx.png)

如果找到它，你可以通过单击“垃圾桶”图标或“删除”按钮来删除该应用。

![Removing applications from the Ubuntu software center](/data/attachment/album/202208/01/181641dum4hesbfhe5e55o.jpg)

**一句话：检查是否可以从软件中心删除应用。**

#### 方法 2：使用 apt 命令删除应用

我假设你不知道该应用命令的确切名称。你可能不知道 Google Chrome 安装为 google-chrome-stable 而 Edge 安装为 microsoft-edge-stable，这很正常。

如果你知道前几个字母，那么 tab 补全可能会有所帮助。否则，你可以 [使用 apt 命令列出已安装的应用](https://itsfoss.com/list-installed-packages-ubuntu/) 并使用 `grep` 搜索应用程序名称：

```
apt list --installed | grep -i possible_package_name

```

例如，你可以智能地猜测 Google Chrome 包的名称中应该包含 chrome。你可以这样搜索：

```
apt list --installed | grep -i chrome

```

在某些情况下，你可能会得到多个结果。

![check if google chrome installed in ubuntu](/data/attachment/album/202208/01/180928wxkzzarxss2xjtsz.png)

如果你不确定这些软件包的作用，你可以随时通过以下方式获取它们的详细信息：

```
apt info exact_package_name

```

获得确切的软件包名称后，你可以使用 `apt remove` 命令将其删除。

```
sudo apt remove exact_package_name

```

你还可以使用 `apt-get remove` 或 `dpkg uninstall` 命令来删除。

![Removing applications installed via .deb files using the apt command](/data/attachment/album/202208/01/180929veyrxe2eyxtfvprh.png)

#### 方法 3：使用 Synaptic 包管理器删除 deb 应用

另一种方法是使用 [Synaptic 包管理器](https://itsfoss.com/synaptic-package-manager/)。在 GNOME 以“软件中心”的形式创建其图形包管理器之前，Synaptic 是 Ubuntu 和许多其他发行版中的默认 GUI 包管理器。

它仍然是 [Xfce 桌面环境](https://www.xfce.org/) 上的推荐工具。

首先安装它：

```
sudo apt install synaptic

```

打开 Synaptic 并搜索包名称。查找标记为绿色的已安装软件包。右键单击它们，然后单击“标记为删除”。之后点击应用。

![Removing Deb packages using Synaptic package manager](/data/attachment/album/202208/01/181657f2uoah8nigewun3e.jpg)

### 对你有帮助吗？

我非常乐意使用 `apt` 命令删除从 .deb 文件中安装的软件包。但我可以理解，并不是每个人都喜欢使用命令行。

在删除从外部 .deb 文件安装的应用时，我发现软件中心中找不到它。软件中心还可以做的更好一些。

我希望你现在对删除 deb 包有更好的了解。如果你有任何问题，请告诉我。

---

via: <https://itsfoss.com/uninstall-deb-ubuntu/>

作者：[Abhishek Prakash](https://itsfoss.com/) 选题：[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/) 荣誉推出