硬核观察 #653 上古电子表格 Lotus 1-2-3 被移植到 Linux

Summary: • 上古电子表格 Lotus 1-2-3 被移植到 Linux • 谷歌悄悄禁止了 Colab 上的深度伪造训练项目 • 法国禁止英语的游戏术语以保护语言的纯洁性

![](/data/attachment/album/202205/31/173919d9dih1v1t4144ols.jpg)

![](/data/attachment/album/202205/31/173929r6d3y6dcocard9pd.png)

### 上古电子表格 Lotus 1-2-3 被移植到 Linux

古老的电子表格程序 Lotus-1-2-3 问世于 1983 年，那时候甚至 Linux 都没有出现，它可以说是使得 IBM PC 获得成功的唯一应用。一位爱好者成功地将该程序移植到了 Linux 上。需要强调的是，这不是一个模拟的程序，而是原始的 1990 年的 Lotus 1-2-3，它原本运行在 x86 Unix 上，现在可以原生地运行在现代 x86 Linux 上。

>
> **[消息来源：theregister](https://www.theregister.com/2022/05/25/lotus_123_for_linux_appears/)**
>
>
>

>
> 老王点评：真是极客的乐趣，不过，在 Linux 上试试上个世纪的字符界面的电子表格也挺有趣的。有没有用过 Lotus-1-2-3 的人？来举个手。
>
>
>

![](/data/attachment/album/202205/31/173947rwsysy323b5hwj3j.jpg)

### 谷歌悄悄禁止了 Colab 上的深度伪造训练项目

谷歌的 Colab 是一个在线计算资源，允许研究人员直接通过浏览器运行 Python 代码，同时免费使用包括 GPU 在内的计算资源。因而它成为训练机器学习项目（如深度伪造模型）或进行数据分析的理想选择。深度伪造可以被训练成在视频片段上替换人脸，添加逼真的面部表情，使结果看起来很真实，但是，它们的使用缺乏道德限制，一直是争议和担忧的来源。

>
> **[消息来源：bleepingcomputer](https://www.bleepingcomputer.com/news/google/google-quietly-bans-deepfake-training-projects-on-colab/)**
>
>
>

>
> 老王点评：不过我觉得重要的是，应该有一种可以快捷地识别深度伪造视频的工具。
>
>
>

![](/data/attachment/album/202205/31/174007v4a2fggl12fplaaf.jpg)

### 法国禁止英语的游戏术语以保护语言的纯洁性

法国官员正在继续他们长达几个世纪的战斗，以保护语言的纯洁性，全面修改了关于使用英语电子游戏术语的规则。法国文化部说，电子游戏领域充斥着英语，可能成为非游戏玩家的“理解障碍”。新规则规定，政府官员必须用经批准的法语版本取代“e-sports”和“streaming”等词汇。有着数百年历史的语言监管机构法国学院在 2 月份曾警告称，“（语言）退化绝不能被视为不可避免”。

>
> **[消息来源：卫报](https://www.theguardian.com/world/2022/may/31/france-bans-english-gaming-tech-jargon-in-push-to-preserve-language-purity)**
>
>
>

>
> 老王点评：法国人对自己文字和文化重视得很，这让我想起了《最后一课》，而我们的互联网上到处混杂着中文和英语。
>
>
>

### 回音

* 前两天我们提及了 Perl 7 还遥遥无期，而事实上 Perl 并没有止步，在上个版本发布一年后，[Perl 发布了 5.36.0](https://metacpan.org/release/RJBS/perl-5.36.0/view/pod/perldelta.pod) ，其中包含了 82 位作者的约 25 万行代码的变更。


基于 TypeScript 的无头内容管理系统 “Payload” 现已开源

Summary: 开源的无头（Headless）内容管理系统（CMS）列表中添加了一个新选项。它会是一个更好的无头 WordPress 替代品吗？

>
> 开源的<ruby> 无头 <rt>  Headless </rt></ruby>内容管理系统（CMS）列表中添加了一个新选项。它会是一个更好的无头 WordPress 替代品吗？
>
>
>

![Payload](/data/attachment/album/202206/01/094052pkuu72zs22hrosvu.jpg)

自从一年多前发布首个测试版以来，作为无头内容管理系统（CMS），Payload 已经逐渐在 Web 开发社区中给人们留下了深刻印象。先做一些背景介绍，Payload 是专门为更简单地开发网站、Web 应用或<ruby> 原生 <rt>  native </rt></ruby>应用而量身定制的内容管理系统。

最近，他们决定完全开源，现在，它已跻身 [可用的最佳开源内容管理系统](https://itsfoss.com/open-source-cms/) 之一。

然而，这也带来了一些问题：他们会采用怎么样的商业模式？Payload 内容管理系统的计划是什么？下面，就让我们简要地看一下吧！

### Payload 为什么要开源？

自 2021 年首次发布以来，Payload 已经收到了来自开源社区的许多贡献。正如 Payload 在他们 [最近的公告](https://payloadcms.com/blog/open-source) 中所说，开源是一个重要的决定，它能够使项目能够达到的更高的高度，这是闭门造车做不到的。

![](/data/attachment/album/202206/01/094053rsv7b4nyyx1gsssc.png)

此外，这种开放性通常会增加开发者社区的信任。这种信任也会延伸到商业，自然而然地转而成为开发者最支持、最信任的平台。

因此，Payload 正在切换到 MIT 许可证。这将允许任何人免费且不受限制地修改、分发和使用 Payload。

然而，Payload 仍然需要资金流入才能持续运营。那么，这就引出了一个问题，Payload 将如何盈利呢？

### Payload 将如何盈利?

与往常一样，Payload 需要一些财务支持才能维持运营。团队拿出了一个由两部分组成的计划，该计划既要为用户提供更多 <ruby> 以便利为中心 <rt>  convenience-focused </rt> <ruby>  的功能，又要为  <ruby>   自托管   <rt>    self-hosted   </rt>  </ruby>  客户提供难以置信的灵活性。 </ruby></ruby>

![](/data/attachment/album/202206/01/094053z4kykx5mzsox5f00.jpg)

#### 企业许可证

此选项与其他开源 CMS 的软件服务极为相似。这些许可证将提供更高级的 SSO 选项，并为开发者保证 Payload 核心团队的响应时间。

这些许可证应该对大公司有吸引力，尤其是那些需要最大程度可靠性的公司。

#### 云主机

这个选项非常有吸引力，因为它结合了多种服务来创造最方便的体验。尽管传统托管仍然相当容易，但只要你为 Node 应用程序添加数据库、持久文件存储和其他基础设施，你就会面对四五个不同的服务，而这些服务都需要无缝协同工作。

应该注意的是，这不是必需的，Payload 仍然鼓励用户托管他们的实例。这项服务只是消除了与托管相关的大量费用和挑战而已。

截至目前，事情还没有敲定。但是，你可以关注 [GitHub](https://github.com/payloadcms/payload) 上的讨论来跟踪事情的进展。

### 总结

作为一个新兴的 CMS 选项，很高兴看到 Payload 迈出了这一步，成为 WordPress 和其他选项的流行替代品。此外，在我看来，Payload 团队对他们的新业务模式充满信心，或许这预示着一个光明的未来（希望如此）。

>
> **[Payload 内容管理系统](https://payloadcms.com/)**
>
>
>

---

via: <https://news.itsfoss.com/payload-open-source/>

作者：[Jacob Crume](https://news.itsfoss.com/author/jacob/) 选题：[lkxed](https://github.com/lkxed) 译者：[lkxed](https://github.com/lkxed) 校对：[wxy](https://github.com/wxy)

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


Ubuntu 22.04 之 KVM 安装手札

我记得有一个web工具可以用来管理虚拟机的

还是别翻译成“手札”吧。<br />
百度搜下“手札”到底啥意思，非要这样翻译，合适吗？

还有启用libvirtd的话只要一个systemctl enable libvirtd --now即可。设置为开机自启动并且启动该服务。不用再start了

这应该是台湾那边的词语，可以了解下

![](/data/attachment/album/202206/01/171619m6dd7bjb8292bbb9.jpg)

**KVM** 是 <ruby> 基于内核的虚拟机 <rt>  Kernel-based Virtual Machine </rt></ruby> 的首字母缩写，这是一项集成在内核中的开源虚拟化技术。它是一种类型一（裸机）的<ruby> 管理程序 <rt>  hypervisor </rt></ruby>，可以使内核能够作为一个<ruby> 裸机管理程序 <rt>  bare-metal hypervisor </rt></ruby>。

在 KVM 之上可以运行 Windows 和 Liunx 虚拟机。每个虚拟机都独立于其它虚拟机和底层操作系统（宿主机系统），并拥有自己的 CPU、内存、网络接口、存储设备等计算资源。

本文将介绍在 Ubuntu 22.04 LTS（Jammy Jellyfish）中如何安装 KVM 。在文末，我们也将演示如何在安装 KVM 完成之后创建一台虚拟机。

### 1、更新 Ubuntu 22.04

在一切开始前，打开终端并通过如下命令更新本地的软件包索引：

```
$ sudo apt update

```

### 2、检查虚拟化是否开启

在进一步行动之前，首先需要检查你的 CPU 是否支持 KVM 虚拟化，确保你系统中有 VT-x（ vmx）英特尔处理器或 AMD-V（svm）处理器。

你可以通过运行如下命令，如果输出值大于 0，那么虚拟化被启用。否则，虚拟化被禁用，你需要启用它：

```
$ egrep -c '(vmx|svm)' /proc/cpuinfo

```

![SVM-VMX-Flags-Cpuinfo-linux](/data/attachment/album/202206/01/171638lo083lxspwwooykb.png)

根据上方命令输出，你可以推断出虚拟化功能已经启用，因为输出结果大于 0。如果虚拟化功能没有启用，请确保在系统的 BIOS 设置中启用虚拟化功能。

另外，你可以通过如下命令判断 KVM 虚拟化是否已经在运行：

```
$ kvm-ok

```

运行该命令之前，请确保你已经安装了 `cpu-checker` 软件包，否则将提示未找到该命令的报错。

直接就在下面，你会得到如何解决这个问题的指示，那就是安装 `cpu-checker` 包。

![KVM-OK-Command-Not-Found-Ubuntu](/data/attachment/album/202206/01/171639y55r74brr3r3r2w7.png)

随后，通过如下命令安装 `cpu-checker` 软件包：

```
$ sudo apt install -y cpu-checker

```

接着再运行 `kvm-ok` 命令，如果 KVM 已经启动，你将看到如下输出：

```
$ kvm-ok

```

![KVM-OK-Command-Output](/data/attachment/album/202206/01/171639ebbsees9efo6ebpb.png)

### 3、在 Ubuntu 22.04 上安装 KVM

随后，通过如下命令在 Ubuntu 22.04 中安装 KVM 以及其他相关虚拟化软件包：

```
$ sudo apt install -y qemu-kvm virt-manager libvirt-daemon-system virtinst libvirt-clients bridge-utils

```

以下为你解释刚刚安装了哪些软件包：

* `qemu-kvm` – 一个提供硬件仿真的开源仿真器和虚拟化包
* `virt-manager` – 一款通过 libvirt 守护进程，基于 QT 的图形界面的虚拟机管理工具
* `libvirt-daemon-system` – 为运行 libvirt 进程提供必要配置文件的工具
* `virtinst` – 一套为置备和修改虚拟机提供的命令行工具
* `libvirt-clients` – 一组客户端的库和API，用于从命令行管理和控制虚拟机和管理程序
* `bridge-utils` – 一套用于创建和管理桥接设备的工具

### 4、启用虚拟化守护进程（libvirtd）

在所有软件包安装完毕之后，通过如下命令启用并启动 libvirt 守护进程：

```
$ sudo systemctl enable --now libvirtd
$ sudo systemctl start libvirtd

```

你可以通过如下命令验证该虚拟化守护进程是否已经运行：

```
$ sudo systemctl status libvirtd

```

![Libvirtd-Status-Ubuntu-Linux](/data/attachment/album/202206/01/171639dikm3adgamqamjwq.png)

另外，请将当前登录用户加入 `kvm` 和 `libvirt` 用户组，以便能够创建和管理虚拟机。

```
$ sudo usermod -aG kvm $USER
$ sudo usermod -aG libvirt $USER

```

`$USER` 环境变量引用的即为当前登录的用户名。你需要重新登录才能使得配置生效。

### 5、创建网桥（br0）

如果你打算从本机（Ubuntu 22.04）之外访问 KVM 虚拟机，你必须将虚拟机的网卡映射至网桥。`virbr0` 网桥是 KVM 安装完成后自动创建的，仅做测试用途。

你可以通过如下内容在 `/etc/netplan` 目录下创建文件 `01-netcfg.yaml` 来新建网桥：

```
$ sudo vi /etc/netplan/01-netcfg.yaml
network:
  ethernets:
    enp0s3:
      dhcp4: false
      dhcp6: false
  # add configuration for bridge interface
  bridges:
    br0:
      interfaces: [enp0s3]
      dhcp4: false
      addresses: [192.168.1.162/24]
      macaddress: 08:00:27:4b:1d:45
      routes:
        - to: default
          via: 192.168.1.1
          metric: 100
      nameservers:
        addresses: [4.2.2.2]
      parameters:
        stp: false
      dhcp6: false
  version: 2

```

保存并退出文件。

注：上述文件的配置是我环境中的，请根据你实际环境替换 IP 地址、网口名称以及 MAC 地址。

你可以通过运行 `netplan apply` 命令应用上述变更。

```
$ sudo netplan apply

```

你可以通过如下 `ip` 命令，验证网桥 `br0`：

```
$ ip add show

```

![Network-Bridge-br0-ubuntu-linux](/data/attachment/album/202206/01/171640d4gj7ogvtgztvgcq.png)

### 6、启动 KVM 虚拟机管理器

当 KVM 安装完成后，你可以使用图形管理工具 `virt-manager` 创建虚拟机。你可以在 GNOME 搜索工具中搜索 `Virtual Machine Manager` 以启动。

点击搜索出来的图标即可：

![Access-Virtual-Machine-Manager-Ubuntu-Linux](/data/attachment/album/202206/01/171640l3zschiibzr9hi1m.png)

虚拟机管理器界面如下所示：

![Virtual-Machine-Manager-Interface-Ubuntu-Linux](/data/attachment/album/202206/01/171640mzy5b7mz44lzrnko.png)

你可以点击 “<ruby> 文件 <rt>  File </rt></ruby>” 并选择 “<ruby> 新建虚拟机 <rt>  New Virtual Machine </rt></ruby>”。你也可以点击下图所示的图标：

![New-Virtual-Machine-Icon-Virt-Manager](/data/attachment/album/202206/01/171640ecehilwhisiwgoql.png)

在弹出的虚拟机安装向导将看到如下四个选项：

* 本地安装介质（ISO 镜像或 CDROM）
* 网络安装（HTTP、HTTPS 和 FTP）
* 导入现有磁盘镜像
* 手动安装

本文使用已下载的 ISO 镜像，你可以选择自己的 ISO 镜像，选择第一个选项，并点击 “<ruby> 向前 <rt>  Forward </rt></ruby>”。

![Local-Install-Media-ISO-Virt-Manager](/data/attachment/album/202206/01/171641pe25eotwx21wwwzo.png)

下一步中，点击 “<ruby> 浏览 <rt>  Browse </rt></ruby>” 选择 ISO 镜像位置。

![Browse-ISO-File-Virt-Manager-Ubuntu-Linux](/data/attachment/album/202206/01/171641ix5fr0lf815vtnx8.png)

在下一个窗口中点击 “<ruby> 浏览本地 <rt>  Browse local </rt></ruby>” 选取本机中 ISO 镜像。

![Browse-Local-ISO-Virt-Manager](/data/attachment/album/202206/01/171641ygkguukdm6kmwg11.png)

如下所示，我们选择了 Debian 11 ISO 镜像，随后点击 “<ruby> 打开 <rt>  Open </rt></ruby>”。

![Choose-ISO-File-Virt-Manager](/data/attachment/album/202206/01/171641taa2k7yy1yj7fzkt.png)

当 ISO 镜像选择后，点击 “<ruby> 向前 <rt>  Forward </rt></ruby>” 进入下一步。

![Forward-after-browsing-iso-file-virt-manager](/data/attachment/album/202206/01/171642y4rmr9rxgxodsoxr.png)

接着定义虚拟机所用内存大小以及 CPU 核心数，并点击 “<ruby> 向前 <rt>  Forward </rt></ruby>” 。

![Virtual-Machine-RAM-CPU-Virt-Manager](/data/attachment/album/202206/01/171642nwrttbb1jbl1w2ee.png)

下一步中，输入虚拟机磁盘空间，并点击 “<ruby> 向前 <rt>  Forward </rt></ruby>” 继续。

![Storage-for-Virtual-Machine-KVM-Virt-Manager](/data/attachment/album/202206/01/171642ndoj9dyk56xemc69.png)

如你需要将虚拟机网卡连接至网桥，点击 “<ruby> 选择网络 <rt>  Network selection </rt></ruby>” 并选择 `br0` 网桥。

![Network-Selection-KVM-Virtual-Machine-Virt-Manager](/data/attachment/album/202206/01/171642oapqqog83z18qorw.png)

最后，点击 “<ruby> 完成 <rt>  Finish </rt></ruby>” 按钮结束设置虚拟机。

![Choose-Finish-to-OS-Installation-KVM-VM](/data/attachment/album/202206/01/171643sfnf31nxh9fdzyn1.png)

稍等片刻，虚拟机的创建过程将开始。

![Creating-Domain-Virtual-Machine-Virt-Manager](/data/attachment/album/202206/01/171643az00v3hpn3f30hmz.png)

当创建结束时，虚拟机将开机并进入系统安装界面。如下是 Debian 11 的安装选项。在这里你可以根据需要进行系统安装。

![Virtual-Machine-Console-Virt-Manager](/data/attachment/album/202206/01/171643f5et37740h9lu0u9.png)

### 小结

至此，本文向你演示了如何在 Ubuntu 22.04 上 安装 KVM 虚拟化引擎。你的反馈对我们至关重要。

---

via: <https://www.linuxtechi.com/how-to-install-kvm-on-ubuntu-22-04/>

作者：[James Kiarie](https://www.linuxtechi.com/author/james/) 选题：[lkxed](https://github.com/lkxed) 译者：[turbokernel](https://github.com/turbokernel) 校对：[wxy](https://github.com/wxy)

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


如何从源码编译 GNOME Shell 和应用

![](/data/attachment/album/202206/01/180518p98dt89wz7779tyb.jpg)

>
> 这是一篇如何从源码编译 GNOME 的快速指南，包括 Shell、mutter 和一些原生应用。
>
>
>

在编译之前，你需要确保一些事情，因为以下编译直接来自 Gitlab 的主分支，其中包含一些开发包。

通常，你可以选择在任何 Linux 发行版中编译。但是我建议使用 Fedora Rawhide（Fedora 的开发分支，用于将来的发布）。

另外，请勿在稳定系统中尝试此操作。因为操作可能出错，所以你可能最终得到损坏的系统。

总而言之，你需要以下内容来从源码编译 GNOME。

* 测试环境（[虚拟机](https://www.debugpoint.com/tag/virtual-machine) 或测试系统）。
* Fedora Rawhide 发行版（推荐，[从此处下载](https://dl.fedoraproject.org/pub/fedora/linux/development/rawhide/Workstation/x86_64/iso/)）。
* 确保你的发行版是最新的。
* 你已登录 [X.org](http://X.org) 会话。

我不建议你在 Wayland 会话中进行编译，因为你会遇到问题。

### 从源码编译 GNOME

GNOME 桌面是一个基于其功能的软件包集合。Linux 发行版的桌面组件工作于窗口管理器和 shell 之下。

因此，对于 GNOME，我将首先编译 mutter – 它是 GNOME Shell 的窗口管理器。然后进行 GNOME Shell 的编译。最后，我将编译一些原生应用。

我将使用 meson 构建系统进行编译。meson 是一个漂亮的构建系统，快速且用户友好。

#### 编译 mutter

打开终端并安装 GNOME Shell 和 mutter 所需的软件包。

```
sudo dnf build-dep mutter gnome-shell

```

在主目录（或你想要的任何地方）中创建演示目录。

```
cd ~
mkdir demo
cd demo

```

从 Gitlab 克隆 mutter 的主分支。

```
git clone https://gitlab.gnome.org/GNOME/mutter

```

进入克隆目录，然后使用以下 `meson` 命令来准备构建文件。默认情况下，meson 使用 `/usr/local` 用于构建文件。但是，你也可以使用前缀开关将输出重定向到特定文件夹（如下所示）。

```
cd mutter
meson _build --prefix=/usr

```

![Compile Mutter for GNOME](/data/attachment/album/202206/01/180555ue5ek56xxhh2wwte.jpg)

使用以下命令在构建完成时，将 mutter 安装在到系统中。

```
sudo ninja install -C _build

```

#### 编译 GNOME Shell

GNOME Shell 和其他软件包的编译方法类似。首先，从 GitLab 克隆 GNOME Shell 主仓库，然后进行编译和安装。你可以按照下面的命令依次进行。

在 GNOME Shell 中，你需要两个依赖项。它们是 [asciidoc](https://asciidoc.org/) 和 [sassc](https://github.com/sass/sassc) 。请在构建 GNOME Shell 之前安装它们。

```
sudo dnf install asciidoc
sudo dnf install sassc

```

安装完这些依赖项后，按照下面的命令来构建和安装 GNOME Shell。在运行这个命令之前，请确保你回到 `demo` 文件夹（我在第一步创建的）。

```
git clone https://gitlab.gnome.org/GNOME/gnome-shellcd gnome-shellmeson _build --prefix=/usrsudo ninja install -C _build

```

### 运行 GNOME Shell

编译完成后，你可以尝试重新启动 GNOME Shell 来查看来自主分支的变化。

在重启之前，正如我之前提到的，确保你处于 [X.Org](http://X.Org) 会话中。按 `ALT+F2` 并输入 `r`。然后按回车键。这个命令将重启 GNOME Shell。

![Restart GNOME Shell (X11)](/data/attachment/album/202206/01/180555kkk5hb8th6z71dkx.jpg)

恭喜你! 你已经成功地编译了 GNOME Shell 和 Mutter。

现在，是时候编译一些 GNOME 原生应用了。

### 编译 GNOME 原生应用

这些步骤对于 GNOME 或任何应用的所有源码都是一样的。你需要改变仓库的名字。因此，这里有一些编译必要的 GNOME 原生应用的命令示例。

#### Files（Nautilus）

```
git clone https://gitlab.gnome.org/GNOME/nautilus/cd gnome-shellmeson _build --prefix=/usrsudo ninja install -C _build

```

#### GNOME 软件商店

```
git clone https://gitlab.gnome.org/GNOME/gnome-software/cd gnome-shellmeson _build --prefix=/usrsudo ninja install -C _build

```

#### GNOME 控制中心

```
git clone https://gitlab.gnome.org/GNOME/gnome-control-center/cd gnome-shellmeson _build --prefix=/usrsudo ninja install -C _build

```

### FAQ

1. 使用上述步骤，你可以编译任何源码分支。不仅仅是 GNOME。
2. GitLab 服务器有时很慢，克隆一个仓库可能需要较长的时间。如果 `git clone` 失败，我建议你再试一次。

### 结束语

我希望这个小小的高级教程能够帮助你在新的 GNOME 功能出现在 GNOME 每日构建系统之前尝试它。既然你编译了，你也可以为测试新的 GNOME 功能做出贡献，并在 GitLab 问题页面上报告任何特定包的 bug 或问题。

这篇文章是开源应用编译系列的第一篇文章。请继续关注更多开源应用的编译文章。

另外，请让我在下面的评论栏中知道你的评论、建议，或者你在使用这些说明时遇到的任何错误。

干杯。

---

via: <https://www.debugpoint.com/2022/05/compile-gnome-source/>

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

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


硬核观察 #654 计划释放数以亿计的 IPv4 地址

Summary: • 计划释放数以亿计的 IPv4 地址 • Safari 浏览器成为唯二用户数突破 10 亿的浏览器之一 • 微软 Office 软件被发现一个已在野利用的零日漏洞

IP地址来的越多封滴越多。嗨嗨嗨！！！要不然防守报告咋写封禁数量

![](/data/attachment/album/202206/01/211706flgadktg2kqtqqdm.jpg)

![](/data/attachment/album/202206/01/211717bpma9s0x09rrmxpe.jpg)

### 计划释放数以亿计的 IPv4 地址

上世纪 80 年代做出的将几个 IPv4 地址范围作为特殊保留的决定，导致了大量的地址资源被浪费。在亚太地区互联网运营技术会议上，Let's Encrypt 的联合创始人 Seth 提议，如果将 240/4、0/8、127/8、225/8-232/8 等范围作为普通的单播号码资源供网络使用，将增加约 4.19 亿个 IPv4 地址。

>
> **[消息来源：itnews](https://www.itnews.com.au/news/freeing-up-of-hundreds-of-millions-of-ipv4-addresses-mooted-580689)**
>
>
>

>
> 老王点评：虽然很多地方都在往 IPv6 迁移了，但是谁会嫌 IPv4 地址多呢？另外，我觉得当年美国那些大学、机构动辄几个 A、B 类地址，是不是也该回收一下？
>
>
>

![](/data/attachment/album/202206/01/211731gzt3ejxpj4y5g8c8.jpg)

### Safari 浏览器成为唯二用户数突破 10 亿的浏览器之一

根据一份新的报告，Safari 的市场份额为 19%，用户数首次超过 10 亿，成为第二个用户数超过 10 亿的浏览器。第一当然是 Chrome，它的用户数远多于其它浏览器，达到了 33 亿之多。而第三名则是 Edge 浏览器，用户数 2 亿。Firefox 则没有机会名列三甲。

顺便说一句，Chrome 和 Edge 都刚刚推出了 102 版，在一周后 Firefox 推出了 101 版。版本号都跑的挺快。

>
> **[消息来源：arstechnica](https://arstechnica.com/gadgets/2022/05/safari-has-1-billion-users-but-it-still-cant-touch-chrome/)**
>
>
>

>
> 老王点评：虽然 Safari 也备受批评，但作为唯一一个没有在世界上最流行的移动操作系统安卓上使用、也没有在最流行的桌面操作系统 Windows 上使用的主要浏览器，这还是非常令人印象深刻的。
>
>
>

![](/data/attachment/album/202206/01/211747wk2cwxc3cwcy2h5w.png)

### 微软 Office 软件被发现一个已在野利用的零日漏洞

这个已经流传了一段时间的漏洞被称为 “Follina”，它使用 Office 来检索一个 HTML 文件，而该文件反过来利用微软支持诊断工具（MSDT）来运行一些代码。更糟糕的是，即使在禁用宏的情况下，它也能工作。虽然最初的攻击只在打开恶意文件的用户账户级别上运行代码，但这种访问为更多提升权限的攻击打开了大门。

>
> **[消息来源：theregister](https://www.theregister.com/2022/05/30/follina_microsoft_office_vulnerability/)**
>
>
>

>
> 老王点评：即使打开一个本身没有什么恶意代码的 Word 文档都有可能被利用，因为恶意代码在远程的一个页面上。所以，只要是打开来路不明的 Word 文档就处于风险之中了。
>
>
>


在 Windows 上使用开源屏幕阅读器 NVDA

![](/data/attachment/album/202206/02/101911ds5t1xts1o52vmss.jpg)

>
> 为纪念全球无障碍意识日，让我们了解一下 NVDA 开源屏幕阅读器，以及你该如何参与其中，为所有网络用户提高无障碍性。
>
>
>

屏幕阅读器是辅助技术软件的一个专门领域，它可以阅读并说出计算机屏幕上的内容。完全没有视力的人只是视力障碍者的一小部分，屏幕阅读器软件可以帮助所有群体。屏幕阅读器大多特定于操作系统，供有视觉障碍的人和无障碍培训师使用，以及想要测试网站或应用的无障碍访问程度的开发人员和无障碍顾问。

### 如何使用 NVDA 屏幕阅读器

[WebAIM 屏幕阅读器用户调查](https://webaim.org/projects) 始于 2009 年，一直持续到 2021 年。在第一次调查中，最常用的屏幕阅读器是 JAWS，占 74%。它是微软 Windows 的商业产品，并且是长期的市场领导者。NVDA 当时是一个相对较新的 Windows 开源屏幕阅读器，仅占 8%。快进到 2021 年，JAWS 占 53.7%，NVDA 占 30.7%。

你可以从 [NVAccess 网站](https://www.nvaccess.org) 下载最新版本的 NVDA。为什么我要使用 NVDA 并将它推荐给我使用微软 Windows 的客户？嗯，它是开源的、速度快、功能强大、易于安装、支持多种语言、可以作为便携式应用运行、拥有庞大的用户群，并且有定期发布新版本的周期。

NVDA 已被翻译成 55 种语言，并在 175 个不同的国家/地区使用。还有一个活跃的开发者社区，拥有自己的 [社区插件网站](https://addons.nvda-project.org/index.en.html)。你选择安装的任何附加组件都将取决于你的需求，并且有很多可供选择，包括常见视频会议平台的扩展。

与所有屏幕阅读器一样，NVDA 有很多组合键需要学习。熟练使用任何屏幕阅读器都需要培训和练习。

![Image of NVDA welcome screen](/data/attachment/album/202206/02/101918tfo2p7dkh5hovdd7.png)

向熟悉计算机和会使用键盘的人教授 NVDA 并不太难。向一个完全初学者教授基本的计算机技能（没有鼠标、触摸板和键盘技能）和使用 NVDA 是一个更大的挑战。个人的学习方式和偏好不同。此外，如果人们只想浏览网页和使用电子邮件，他们可能不需要学习如何做所有事情。NVDA 教程和资源的一个很好的链接来源是 [无障碍中心](http://www.accessibilitycentral.net/)。

当你掌握了使用键盘命令操作 NVDA，它就会变得更容易，但是还有一个菜单驱动的系统可以完成许多配置任务。

![Image of NVDA menu](/data/attachment/album/202206/02/101918gyrqqneznz870ony.png)

### 测试无障碍性

多年来，屏幕阅读器用户无法访问某些网站一直是个问题，尽管美国残疾人法案（ADA）等残疾人平等立法仍然存在。NVDA 在有视力的社区中的一个很好的用途是用于网站无障碍性测试。NVDA 可以免费下载，并且通过运行便携式版本，网站开发人员甚至不需要安装它。运行 NVDA，关闭显示器或闭上眼睛，看看你在浏览网站或应用时的表现如何。

NVDA 也可用于测试（通常被忽略的）正确 [标记 PDF 文档以实现无障碍性](https://www.youtube.com/watch?v=rRzWRk6cXIE) 任务。

有几个指南专注于使用 NVDA 进行无障碍性测试。我可以推荐 [使用 NVDA 测试网页](https://www.unimelb.edu.au/accessibility/tools/testing-web-pages-with-nvda) 和使用 [NVDA 评估 Web 无障碍性](https://webaim.org/articles/nvda)。

---

via: <https://opensource.com/article/22/5/open-source-screen-reader-windows-nvda>

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


Go 数组和切片的介绍

Summary: 了解使用数组和切片在 Go 中存储数据的优缺点，以及为什么其中一个更好。

原文中“你对函数内部的切片所做的任何修改，都不会在函数退出后丢失”有误。在函数内进行切片的append操作导致函数内的切片len>cap时，会发生底层数组重新分配，函数内切片会指向新内存块的地址，也就与一开始函数外的切片指向了不同的内存块。这时候对函数内的切片继续操作将不会影响到外部的切片变量。而且go是没有引用传递一说，本质上还是值传递。

我是个 Go 初学者，感谢指教，学到了！<br />
关于“引用传递”还是“值传递”这个事，当然是“值传递”，没有任何异议。原作者的“引用”的意思应该就是指向这个切片的变量。可能是我翻译得不好～

了解使用数组和切片在 Go 中存储数据的优缺点，以及为什么其中一个更好。

![](/data/attachment/album/202206/02/105657zahhco3612vv1bbo.jpg)

>
> 了解使用数组和切片在 Go 中存储数据的优缺点，以及为什么其中一个更好。
>
>
>

在本系列的第四篇文章中，我将解释 [Go](https://golang.org/) 数组和切片，包括如何使用它们，以及为什么你通常要选择其中一个而不是另一个。

### 数组

数组是编程语言中最流行的数据结构之一，主要原因有两个：一是简单易懂，二是可以存储许多不同类型的数据。

你可以声明一个名为 `anArray` 的 Go 数组，该数组存储四个整数，如下所示：

```
anArray := [4]int{-1, 2, 0, -4}

```

数组的大小应该在它的类型之前声明，而类型应该在声明元素之前定义。`len()` 函数可以帮助你得到任何数组的长度。上面数组的大小是 4。

如果你熟悉其他编程语言，你可能会尝试使用 `for` 循环来遍历数组。Go 当然也支持 `for` 循环，不过，正如你将在下面看到的，Go 的 `range` 关键字可以让你更优雅地遍历数组或切片。

最后，你也可以定义一个二维数组，如下：

```
twoD := [3][3]int{
  {1, 2, 3},
  {6, 7, 8},
  {10, 11, 12}}

```

`arrays.go` 源文件中包含了 Go 数组的示例代码。其中最重要的部分是：

```
for i := 0; i < len(twoD); i++ {
  k := twoD[i]
  for j := 0; j < len(k); j++ {
    fmt.Print(k[j], " ")
  }
  fmt.Println()
}

for _, a := range twoD {
  for _, j := range a {
    fmt.Print(j, " ")
  }
  fmt.Println()
}

```

通过上述代码，我们知道了如何使用 `for` 循环和 `range` 关键字迭代数组的元素。`arrays.go` 的其余代码则展示了如何将数组作为参数传递给函数。

以下是 `arrays.go` 的输出：

```
$ go run arrays.go
Before change(): [-1 2 0 -4]
After change(): [-1 2 0 -4]
1 2 3
6 7 8
10 11 12
1 2 3
6 7 8
10 11 12

```

这个输出告诉我们：对函数内的数组所做的更改，会在函数退出后丢失。

### 数组的缺点

Go 数组有很多缺点，你应该重新考虑是否要在 Go 项目中使用它们。

首先，数组定义之后，大小就无法改变，这意味着 Go 数组不是动态的。简而言之，如果你需要将一个元素添加到一个没有剩余空间的数组中，你将需要创建一个更大的数组，并将旧数组的所有元素复制到新数组中。

其次，当你将数组作为参数传递给函数时，实际上是传递了数组的副本，这意味着你对函数内部的数组所做的任何更改，都将在函数退出后丢失。

最后，将大数组传递给函数可能会很慢，主要是因为 Go 必须创建数组的副本。

以上这些问题的解决方案，就是使用 Go 切片。

### 切片

Go 切片与 Go 数组类似，但是它没有后者的缺点。

首先，你可以使用 `append()` 函数将元素添加到现有切片中。此外，Go 切片在内部使用数组实现，这意味着 Go 中每个切片都有一个底层数组。

切片具有 `capacity` 属性和 `length` 属性，它们并不总是相同的。切片的长度与元素个数相同的数组的长度相同，可以使用 `len()` 函数得到。切片的容量是当前为切片分配的空间，可以使用 `cap()` 函数得到。

由于切片的大小是动态的，如果切片空间不足（也就是说，当你尝试再向切片中添加一个元素时，底层数组的长度恰好与容量相等），Go 会自动将它的当前容量加倍，使其空间能够容纳更多元素，然后将请求的元素添加到底层数组中。

此外，切片是通过引用传递给函数的，这意味着实际传递给函数的是切片变量的内存地址，这样一来，你对函数内部的切片所做的任何修改，都不会在函数退出后丢失。因此，将大切片传递给函数，要比将具有相同数量元素的数组传递给同一函数快得多。这是因为 Go 不必拷贝切片 —— 它只需传递切片变量的内存地址。

`slice.go` 源文件中有 Go 切片的代码示例，其中包含以下代码：

```
package main

import (
  "fmt"
)

func negative(x []int) {
  for i, k := range x {
    x[i] = -k
  }
}

func printSlice(x []int) {
  for _, number := range x {
    fmt.Printf("%d ", number)
  }
  fmt.Println()
}

func main() {
  s := []int{0, 14, 5, 0, 7, 19}
  printSlice(s)
  negative(s)
  printSlice(s)

  fmt.Printf("Before. Cap: %d, length: %d\n", cap(s), len(s))
  s = append(s, -100)
  fmt.Printf("After. Cap: %d, length: %d\n", cap(s), len(s))
  printSlice(s)

  anotherSlice := make([]int, 4)
  fmt.Printf("A new slice with 4 elements: ")
  printSlice(anotherSlice)
}

```

切片和数组在定义方式上的最大区别就在于：你不需要指定切片的大小。实际上，切片的大小取决于你要放入其中的元素数量。此外，`append()` 函数允许你将元素添加到现有切片 —— 请注意，即使切片的容量允许你将元素添加到该切片，它的长度也不会被修改，除非你调用 `append()`。上述代码中的 `printSlice()` 函数是一个辅助函数，用于打印切片中的所有元素，而 `negative()` 函数将切片中的每个元素都变为各自的相反数。

运行 `slice.go` 将得到以下输出：

```
$ go run slice.go
0 14 5 0 7 19
0 -14 -5 0 -7 -19
Before. Cap: 6, length: 6
After. Cap: 12, length: 7
0 -14 -5 0 -7 -19 -100
A new slice with 4 elements: 0 0 0 0

```

请注意，当你创建一个新切片，并为给定数量的元素分配内存空间时，Go 会自动地将所有元素都初始化为其类型的零值，在本例中为 0（`int` 类型的零值）。

### 使用切片来引用数组

Go 允许你使用 `[:]` 语法，使用切片来引用现有的数组。在这种情况下，你对切片所做的任何更改都将传播到数组中 —— 详见 `refArray.go`。请记住，使用 `[:]` 不会创建数组的副本，它只是对数组的引用。

`refArray.go` 中最有趣的部分是：

```
func main() {
  anArray := [5]int{-1, 2, -3, 4, -5}
  refAnArray := anArray[:]

  fmt.Println("Array:", anArray)
  printSlice(refAnArray)
  negative(refAnArray)
  fmt.Println("Array:", anArray)
}

```

运行 `refArray.go`，输出如下：

```
$ go run refArray.go
Array: [-1 2 -3 4 -5]
-1 2 -3 4 -5
Array: [1 -2 3 -4 5]

```

我们可以发现：对 `anArray` 数组的切片引用进行了操作后，它本身也被改变了。

### 总结

尽管 Go 提供了数组和切片两种类型，你很可能还是会使用切片，因为它们比 Go 数组更加通用、强大。只有少数情况需要使用数组而不是切片，特别是当你完全确定元素的数量固定不变时。

你可以在 [GitHub](https://github.com/mactsouk/opensource.com) 上找到 `arrays.go`、`slice.go` 和 `refArray.go` 的源代码。

如果你有任何问题或反馈，请在下方发表评论或在 [Twitter](https://twitter.com/mactsouk) 上与我联系。

---

via: <https://opensource.com/article/18/7/introduction-go-arrays-and-slices>

作者：[Mihalis Tsoukalos](https://opensource.com/users/mtsouk) 选题：[lkxed](https://github.com/lkxed) 译者：[lkxed](https://github.com/lkxed) 校对：[wxy](https://github.com/wxy)

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


去谷歌化操作系统 /e/OS v1 及新品牌 Murena 一同发布

>
> Murena 是一个与 e 基金会有关的新品牌，该品牌专注于提供隐私友好的 /e/OS 及新的智能手机和云服务。
>
>
>

![murena](/data/attachment/album/202206/02/132802u2i2dz0c7dddid40.jpg)

/e/OS 是一个流行的、注重隐私的移动操作系统，是谷歌安卓的替代品之一。

这个复刻自 Lineage OS 的操作系统消除了任何与谷歌有关的依赖性，并鼓励你在使用中不要直接依赖任何谷歌的服务。

取而代之的是，它提供一些解决方案作为替代品，为你提供一个隐私友好的生态系统。

为了精简其产品，负责该操作系统的 e 基金会宣布了一个新的品牌 “Murena”，其中包括了一些以该操作系统为核心的新功能和一个新的智能手机。

### Murena 和 e 基金会

e 基金会作为一个致力于 /e/OS 的非营利组织将继续存在。因此，可以说这不是一次品牌重塑。

然而，[Murena](https://murena.com/) 作为一个新的创业公司，似乎是一个独立的商业实体，将专注于鼓励主流用户尝试 /e/OS，并促进支持该操作系统的智能手机的使用。

对该公司，/e/OS 的创建者提及：

![](/data/attachment/album/202206/02/132803bnrr0fx9ecfbpdbe.jpg)

### /e/OS 1.0 有什么新内容？

随着该操作系统的最新升级发布，他们的目标是让事情变得更容易理解，在提高使用便利性的同时，仍然考虑到隐私。

此外，还随同本次更新推出了新的应用程序商店（App Lounge）和新的隐私工具（Advanced Privacy）。

**App Lounge**：这个新的应用程序安装程序可以让你安装许多开源应用程序和 PWA（<ruby> 渐进式网页应用 <rt>  Progress Web App </rt></ruby>）。在你安装之前，它还会告知你每个应用程序中已有的跟踪器。

![](/data/attachment/album/202206/02/132803r7rrtauchbtz4ury.jpg)

我相信一个量身定做的应用商店的存在将有助于消除新用户是否应该尝试用 /e/OS 安装 Play Store 或 F-Droid 的困惑。

除此之外，Advanced Privacy 工具将有助于限制用户在安装第三方应用程序后暴露的数据。

如果你想远离科技巨头，你还会发现 Murena 云服务可以用作私人电子邮件账户服务和云存储。该电子邮件服务提供的功能可以隐藏你的原始电子邮件地址。

### Murena One

![](/data/attachment/album/202206/02/132803gisy4sjrxlrrtlc7.jpg)

首款 Murena 品牌的智能手机将于 6 月下旬推出，并将向美国、加拿大、欧洲、英国和瑞士等地的用户发货。

这款智能手机将采用 6.5 英寸显示屏，配备 2500 万像素的前置摄像头，后置摄像头设置有三个传感器，分别是 4800 万像素、800 万像素和 500 万像素。

我们不太确定是什么处理器，但它提到了是一个八核芯片，加上 4GB 的内存。所有这些都由 4500 毫安时的电池供电。

除了它的第一款智能手机，你还可以从它的官方网站上购买 Fairphone 和 Teracube 的智能手机，这些手机预装了 /e/OS。

### 总结

你可以在其官方网站上了解更多关于新的 /e/OS 升级、云服务和可用的智能手机的信息。

>
> **[Murena](https://murena.com/)**
>
>
>

该智能手机的定价还没有在新闻发布会上披露。所以，我们建议你如果有兴趣，可以关注一下。

---

via: <https://news.itsfoss.com/murena-e-os/>

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


硬核观察 #655 智能手机将在三年内扼杀单反相机

Summary: • 智能手机将在三年内扼杀单反相机 • 苹果称其应用商店阻止了价值 15 亿美元的欺诈交易 • 360 万台 MySQL 服务器暴露于互联网上

![](/data/attachment/album/202206/02/150704re5ki4eziaiirikk.jpg)

![](/data/attachment/album/202206/02/150712vbfz7zgbbjgibj03.jpg)

### 智能手机将在三年内扼杀单反相机

索尼半导体解决方案 CEO 在会议上称，手机的静止图像预计将在 2024 年超过可换镜头相机的图像质量。这包括无反光镜相机，以及现代基本上放弃的老式单反相机。智能手机摄像技术远未达到技术天花板，预计将继续其成像技术的演变，而对大多数人来说，独立的相机是多余的。索尼在全球手机图像传感器市场上占有 42% 的份额。

>
> **[消息来源：techradar](https://www.techradar.com/news/smartphones-will-kill-off-the-dslr-within-three-years-says-sony)**
>
>
>

>
> 老王点评：确实，我有多久没拿出来相机了？除了给它的电池充一下电？没想到打败相机的不是更先进的相机，却是手机。同样已经被或即将被手机消灭的设备有哪些呢？
>
>
>

![](/data/attachment/album/202206/02/150723k8b8s8jtffaksks7.jpg)

### 苹果称其应用商店阻止了价值 15 亿美元的欺诈交易

根据苹果两年来发布的预防欺诈分析报告称，苹果在 2020 年和 2021 年各阻止了 15 亿美元的欺诈交易。并且，苹果还成功地打击了各类有问题的应用程序，它在 2020 年和 2021 年分别阻止了 100 万和 160 万个应用。苹果还因欺诈活动终止了 80 万个开发者账户，因类似理由拒绝了 15 万个账户。

>
> **[消息来源：9to5mac](https://9to5mac.com/2022/06/01/app-store-fraud-apple/)**
>
>
>

>
> 老王点评：不得不说，苹果在商店的管理上还是下了不少功夫，相对安卓商店，无论是谷歌的还是第三方的，我更信任苹果商店。
>
>
>

![](/data/attachment/album/202206/02/150737quv1veuanvwujvb1.jpg)

### 360 万台 MySQL 服务器暴露于互联网上

网络安全研究组织扫描发现，有近 360 万台 MySQL 服务器在使用默认的 3306 号 TCP 端口暴露在互联网上。其中 IPv4 地址约 230 万台，IPv6 地址约 130 台。按国家划分，这些可以轻松访问的 IPv4 MySQL 服务器数量如下：美国（74 万）、中国（30 万）、波兰（21 万）和德国（17 万）。而对于 IPv6 则是：美国（46 万）、荷兰（30 万）、新加坡（22 万）和德国（17 万）。不知道什么原因，没有统计到中国 IPv6 的 MySQL 服务器。

>
> **[消息来源：shadowserver](https://www.shadowserver.org/news/over-3-6m-exposed-mysql-servers-on-ipv4-and-ipv6/)**
>
>
>

>
> 老王点评：我只能说这些都是自找的，连最最起码安全措施都没有。
>
>
>


通过编写“猜数字”游戏来学习 Awk

看没人写过通过猜数字学习Haskell我想写一个来着，写完代码我发现这个把这个文章的字数翻倍都讲不明白Haskell的猜数字。

好像还真有人写过 Haskel 的，我去看看

可以试着写出这篇文章来，我们很乐意发表它~

>
> 编程语言往往具有许多共同特征。学习一门新语言的好方法是去写一个熟悉的程序。在本文中，我将会使用 Awk 编写一个“猜数字”程序来展示熟悉的概念。
>
>
>

![](/data/attachment/album/202206/03/130545jthh1vtoadahwahd.jpg)

当你学习一门新的编程语言时，最好把重点放在大多数编程语言都有的共同点上:

* 变量 —— 存储信息的地方
* 表达式 —— 计算的方法
* 语句 —— 在程序中表示状态变化的方法

这些概念是大多是编程语言的基础。

一旦你理解了这些概念，你就可以开始把其他的弄清楚。例如，大多数语言都有由其设计所支持的“处理方式”，这些方式在不同语言之间可能有很大的不同。这些方法包括模块化（将相关功能分组在一起）、声明式与命令式、面向对象、低级与高级语法特性等等。许多程序员比较熟悉的是编程“仪式”，即，在处理问题之前设置场景所需花费的工作。据说 Java 编程语言有一个源于其设计的重要仪式要求，就是所有代码都在一个类中定义。

但从根本上讲，编程语言通常有相似之处。一旦你掌握了一种编程语言，就可以从学习另一种语言的基本知识开始，品味这种新语言的不同之处。

一个好方法是创建一组基本的测试程序。有了这些，就可以从这些相似之处开始学习。

你可以选择创建的一个测试程序是“猜数字”程序。电脑从 1 到 100 之间选择一个数字，让你猜这个数字。程序一直循环，直到你猜对为止。

“猜数字”程序练习了编程语言中的几个概念:

* 变量
* 输入
* 输出
* 条件判断
* 循环

这是学习一门新的编程语言的一个很好的实践实验。

**注**：本文改编自 Moshe Zadka 在 [Julia](https://opensource.com/article/20/12/julia) 中使用这种方法和 Jim Hall在 [Bash](https://opensource.com/article/20/12/learn-bash) 中使用这种方法的文章。

### 在 awk 程序中猜数

让我们编写一个实现“猜数字”游戏的 Awk 程序。

Awk 是动态类型的，这是一种面向数据转换的脚本语言，并且对交互使用有着令人惊讶的良好支持。Awk 出现于 20 世纪 70 年代，最初是 Unix 操作系统的一部分。如果你不了解 Awk，但是喜欢电子表格，这就是一个你可以 [去学习 Awk](https://opensource.com/article/20/9/awk-ebook) 的信号！

您可以通过编写一个“猜数字”游戏版本来开始对 Awk 的探索。

以下是我的实现（带有行号，以便我们可以查看一些特定功能）：

```
     1    BEGIN {
     2        srand(42)
     3        randomNumber = int(rand() * 100) + 1
     4        print "random number is",randomNumber
     5        printf "guess a number between 1 and 100\n"
     6    }
     7    {
     8        guess = int($0)
     9        if (guess < randomNumber) {
    10            printf "too low, try again:"
    11        } else if (guess > randomNumber) {
    12            printf "too high, try again:"
    13        } else {
    14            printf "that's right\n"
    15            exit
    16        }
    17    }

```

我们可以立即看到 Awk 控制结构与 C 或 Java 的相似之处，但与 Python 不同。 在像 `if-then-else`、`while` 这样的语句中，`then`、`else` 和 `while` 部分接受一个语句或一组被 `{` 和 `}` 包围的语句。然而，Awk 有一个很大的区别需要从一开始就了解：

根据设计，Awk 是围绕数据管道构建的。

这是什么意思呢？大多数 Awk 程序都是一些代码片段，它们接收一行输入，对数据做一些处理，然后将其写入输出。认识到这种转换管道的需要，Awk 默认情况下提供了所有的转换管道。让我们通过关于上面程序的一个基本问题来探索：“从控制台读取数据”的结构在哪里？

答案是——“内置的”。特别的，第 7-17 行告诉 Awk 如何处理被读取的每一行。在这种情况下，很容易看到第 1-6 行是在读取任何内容之前被执行的。

更具体地说，第 1 行上的 `BEGIN` 关键字是一种“模式”，在本例中，它指示 Awk 在读取任何数据之前，应该先执行 `{ ... }` 中 `BEGIN` 后面的内容。另一个类似的关键字 `END`，在这个程序中没有被使用，它指示 Awk 在读取完所有内容后要做什么。

回到第 7-17 行，我们看到它们创建了一个类似代码块 `{ ... }` 的片段，但前面没有关键字。因为在 `{` 之前没有任何东西可以让 Awk 匹配，所以它将把这一行用于接收每一行输入。每一行的输入都将由用户输入作为猜测。

让我们看看正在执行的代码。首先，是在读取任何输入之前发生的序言部分。

在第 2 行，我们用数字 42 初始化随机数生成器（如果不提供参数，则使用系统时钟）。为什么要用 42？[当然要选 42！](https://en.wikipedia.org/wiki/42_(number)#The_Hitchhiker's_Guide_to_the_Galaxy) 第 3 行计算 1 到 100 之间的随机数，第 4 行输出该随机数以供调试使用。第 5 行邀请用户猜一个数字。注意这一行使用的是 `printf`，而不是 `print`。和 C 语言一样，`printf` 的第一个参数是一个用于格式化输出的模板。

既然用户知道程序需要输入，她就可以在控制台上键入猜测。如前所述，Awk 将这种猜测提供给第 7-17 行的代码。第 18 行将输入记录转换为整数；`$0` 表示整个输入记录，而 `$1` 表示输入记录的第一个字段，`$2` 表示第二个字段，以此类推。是的，Awk 使用预定义的分隔符（默认为空格）将输入行分割为组成字段。第 9-15 行将猜测结果与随机数进行比较，打印适当的响应。如果猜对了，第 15 行就会从输入行处理管道中提前退出。

就这么简单！

考虑到 Awk 程序不同寻常的结构，代码片段会对特定的输入行配置做出反应，并处理数据，让我们看看另一种结构，看看过滤部分是如何工作的：

```
     1    BEGIN {
     2        srand(42)
     3        randomNumber = int(rand() * 100) + 1
     4        print "random number is",randomNumber
     5        printf "guess a number between 1 and 100\n"
     6    }
     7    int($0) < randomNumber {
     8        printf "too low, try again: "
     9    }
    10    int($0) > randomNumber {
    11        printf "too high, try again: "
    12    }
    13    int($0) == randomNumber {
    14        printf "that's right\n"
    15        exit
    16    }

```

第 1–6 行代码没有改变。但是现在我们看到第 7-9 行是当输入整数值小于随机数时执行的代码，第 10-12 行是当输入整数值大于随机数时执行的代码，第 13-16 行是两者相等时执行的代码。

这看起来“很酷但很奇怪” —— 例如，为什么我们会重复计算 `int($0)`？可以肯定的是，用这种方法来解决问题会很奇怪。但这些模式确实是分离条件处理的非常好的方式，因为它们可以使用正则表达式或 Awk 支持的任何其他结构。

为了完整起见，我们可以使用这些模式将普通的计算与只适用于特定环境的计算分离开来。下面是第三个版本：

```
     1    BEGIN {
     2        srand(42)
     3        randomNumber = int(rand() * 100) + 1
     4        print "random number is",randomNumber
     5        printf "guess a number between 1 and 100\n"
     6    }
     7    {
     8        guess = int($0)
     9    }
    10    guess < randomNumber {
    11        printf "too low, try again: "
    12    }
    13    guess > randomNumber {
    14        printf "too high, try again: "
    15    }
    16    guess == randomNumber {
    17        printf "that's right\n"
    18        exit
    19    }

```

认识到这一点，无论输入的是什么值，都需要将其转换为整数，因此我们创建了第 7-9 行来完成这一任务。现在第 10-12、13-15 和 16-19 行这三组代码，都是指已经定义好的变量 guess，而不是每次都对输入行进行转换。

让我们回到我们想要学习的东西列表:

* 变量 —— 是的，Awk 有这些；我们可以推断出，输入数据以字符串形式输入，但在需要时可以转换为数值
* 输入 —— Awk 只是通过它的“数据转换管道”的方式发送输入来读取数据
* 输出 —— 我们已经使用了 Awk 的 `print` 和 `printf` 函数来将内容写入输出
* 条件判断 —— 我们已经学习了 Awk 的 `if-then-else` 和对应特定输入行配置的输入过滤器
* 循环 —— 嗯，想象一下！我们在这里不需要循环，这还是多亏了 Awk 采用的“数据转换管道”方法；循环“就这么发生了”。注意，用户可以通过向 Awk 发送一个文件结束信号（当使用 Linux 终端窗口时可通过快捷键 `CTRL-D`）来提前退出管道。

不需要循环来处理输入的重要性是非常值得的。Awk 能够长期保持存在的一个原因是 Awk 程序是紧凑的，而它们紧凑的一个原因是不需要从控制台或文件中读取的那些格式代码。

让我们运行下面这个程序：

```
$ awk -f guess.awk
random number is 25
guess a number between 1 and 100: 50
too high, try again: 30
too high, try again: 10
too low, try again: 25
that's right
$

```

我们没有涉及的一件事是注释。Awk 注释以 `#` 开头，以行尾结束。

### 总结

Awk 非常强大，这种“猜数字”游戏是入门的好方法。但这不应该是你探索 Awk 的终点。你可以看看 [Awk 和 Gawk（GNU Awk）的历史](https://www.gnu.org/software/gawk/manual/html_node/History.html)，Gawk 是 Awk 的扩展版本，如果你在电脑上运行 Linux，可能会有这个。或者，从它的原始开发者那里阅读关于 [最初版本](https://archive.org/details/pdfy-MgN0H1joIoDVoIC7) 的各种信息。

你还可以 [下载我们的备忘单](https://opensource.com/downloads/cheat-sheet-awk-features) 来帮你记录下你所学的一切。

>
> **[Awk 备忘单](https://opensource.com/downloads/cheat-sheet-awk-features)**
>
>
>

---

via: <https://opensource.com/article/21/1/learn-awk>

作者：[Chris Hermansen](https://opensource.com/users/clhermansen) 选题：[lujun9972](https://github.com/lujun9972) 译者：[FYJNEVERFOLLOWS](https://github.com/FYJNEVERFOLLOWS) 校对：[wxy](https://github.com/wxy)

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


Linux Lite 6.0 发布：弃用 Firefox，默认浏览器使用 Chrome

>
> Linux Lite 6.0 是一个有趣的版本，有一个新的默认浏览器，改进了无障碍性、新的主题、新的系统监视器等等改进。
>
>
>

![linux lite](/data/attachment/album/202206/03/181228eyyc8gvrvgyfz8ab.jpg)

Linux Lite，是 [最好的类 Windows 发行版](https://itsfoss.com/windows-like-linux-distributions/) 之一，刚刚发布了它的最新版本 6.0。

Linux Lite 6.0 基于 [Ubuntu 22.04 LTS](https://news.itsfoss.com/ubuntu-22-04-release/)，内置了 [Linux 内核 5.15 LTS](https://news.itsfoss.com/linux-kernel-5-15-release/)。

这次升级包含了相当多的令人兴奋的新功能，包括一个新的窗口主题和无障碍技术。

让我们深入了解一下新的内容！

### Linux Lite 6.0 概述

Linux Lite 6.0 包括许多变化，包括：

* 更新了软件
* 新的窗口主题
* 新的屏幕键盘
* 屏幕阅读器
* 屏幕放大镜
* Chrome 取代 Firefox 成为默认浏览器
* 新的 GRUB 菜单

#### 无障碍性的改进

![Linux Lite 6.0](/data/attachment/album/202206/03/181229wgcthfy6aae0vhsw.png)

Linux Lite 通过这一改变已经步入了大联盟。无障碍性，在历史上一直是 GNOME 特有的优势，它现在有了很大的改进。这主要体现在三个不同的工具上：一个屏幕键盘，一个屏幕阅读器（Orca），和一个屏幕放大镜。

屏幕键盘对于许多触摸屏用户和没有键盘的用户来说是相当有用的。另一方面，屏幕阅读器对于视障用户来说将是完美的。

![Linux Lite 6.0](/data/attachment/album/202206/03/181229fa2u5s2jsr5juehj.png)

最后一项无障碍改进屏幕放大镜，也是针对与屏幕阅读器相同的受众。然而，它与传统的桌面理念相当吻合，所以众多用户可能更青睐它，而不是屏幕阅读器。

这些无障碍性的改进有助于 Linux Lite 6.0 成为一个主流的选择。

#### 更新的软件

与几乎所有的发行版升级一样，Linux Lite 6.0 包括更新的软件。最值得注意的是最新的 LibreOffice 稳定版 7.2.6。

其他更新包括 VLC 3.0.16、Thunderbird 91.7、Chrome 100、GIMP 2.10.30 等等。

虽然本身不一定是大规模的升级，但它表明了所包含的 LibreOffice 版本的重大变化。

以前，由于提供了更多的稳定性，Linux Lite 停留在更多老版本上。然而，Linux Lite 的开发者现在觉得使用最新的稳定版本也很放心，因为测试新 LibreOffice 版本的人比以往任何时候都多。

#### 新的窗口主题

![Linux Lite 6.0](/data/attachment/album/202206/03/181230s0xn8n8bz38j80w3.png)

Linux Lite 6.0 引入了一个新的窗口主题，叫做 “Materia”。那些主题社区的人可能会对它相当熟悉，因为它已经被移植到几乎所有的平台。这些平台包括 GTK 2、3 和 4、GNOME Shell、Budgie、Cinnamon、MATE、Unity、Xfce、LightDM、GDM，甚至是 Chrome 浏览器。

改用 Materia 应该会让 ChromeOS 用户感觉界面很熟悉，因为它是基于谷歌开发的 Material UI 的。

#### 谷歌 Chrome 浏览器成为新的默认浏览器

![Linux Lite 6.0](/data/attachment/album/202206/03/181230pwz4rkrh4r3knk8j.png)

随着 Ubuntu 将其 Firefox 版本转移到一个 Snap 应用中，Linux Lite 已经完全抛弃了 Firefox，转而使用谷歌 Chrome。虽然我不能说我是这个变化的粉丝，但它确实有意义，特别是对于一个针对 Windows 用户的发行版来说。

虽然你可以自由地安装任何你喜欢的东西，但无论如何，Chrome 是大多数用户的流行选择。

此外，如果你想在访问文件之前扫描文件，Linux Lite 的开发者在 Chrome 中包含了一个 Virus Total 扫描器扩展（默认是禁用的）。

注意，你可以从 Linux Lite 的软件中心安装 Firefox，但它是 Snap 版本的。

#### 系统监控中心替代了任务管理器

![Linux Lite 6.0](/data/attachment/album/202206/03/181231xfkcmw7x75e3bzbr.png)

Linux Lite 6.0 现在打包了<ruby> <a href="https://itsfoss.com/system-monitoring-center/">  系统监控中心 </a> <rt>  System Monitoring Center </rt></ruby> 来替代任务管理器和进程查看器。

请注意，Linux Lite 的开发者复刻了这个应用程序，在系统标签中提供了关于发行版的具体信息。

它提供了所有关注你的资源的必要功能。

### 其他改进

除了基本的变化之外，Linux Lite 6.0 还包括对 GRUB 菜单的更新、推送紧急修复包的能力、新的 whisker 菜单，以及更多的调整。

![Linux Lite 6.0](/data/attachment/album/202206/03/181231i63cm858m37asnw7.png)

正如你所注意到的，新的 GRUB 菜单还包括关闭和重启，同时删除了内存测试选项。

你可以在其 [官方公告帖子](https://www.linuxliteos.com/forums/release-announcements/linux-lite-6-0-final-released/) 中了解更多的技术细节。

### 总结

Linux Lite 6.0 看起来是一个可靠的版本，特别是对于那些等待无障碍功能和新的视觉感受的人。

如果你想自己尝试一下，ISO 文件可以从官方下载页面获得。

>
> **[下载Linux Lite](https://www.linuxliteos.com/download.php#current)**
>
>
>

---

via: <https://news.itsfoss.com/linux-lite-6-0-release/>

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


硬核观察 #656 大新闻！老式 iPad 可能很快就能运行 Linux

Summary: • 大新闻！老式 iPad 可能很快就能运行 Linux • Firefox 推出一个本地运行的机器翻译插件 • 谷歌为开源项目推出新的芯片设计网站

![](/data/attachment/album/202206/03/205725nuyz555a8501m4l4.jpg)

![](/data/attachment/album/202206/03/205744nz81vbhn8nz8ngvg.jpg)

### 大新闻！老式 iPad 可能很快就能运行 Linux

爱好者们成功地在一台旧的 iPad Air 2 上启动了 Linux 内核 5.18，这对一台设计上从未运行过苹果以外的任何操作系统的设备来说，是一个重大的壮举。目前，开发者们只在一些使用 A7 和 A8 芯片的旧版 iPad 硬件上运行了 Linux，这包括 iPad Air、iPad Air 2 和几代 iPad mini。但随后他们暗示，将有可能让 Linux 在任何装有 A7 或 A8 的设备上运行，也就是说还包括 iPhone 5S 和最初的 HomePod 等设备。不过，目前开发工作仍处于早期阶段，只能进行基本的启动，连文件系统都不能挂载。

>
> **[消息来源：Arstechnica](https://arstechnica.com/gadgets/2022/06/developers-get-linux-up-and-running-on-old-ipad-air-2-hardware/)**
>
>
>

>
> 老王点评：这真是一个突破，可以让那些老旧得无法升级、没有支持的 iPad、iPhone 变成有趣的设备。
>
>
>

![](/data/attachment/album/202206/03/205757a4sslsm40kxlkmks.jpg)

### Firefox 推出一个本地运行的机器翻译插件

这个“[Firefox 翻译](https://addons.mozilla.org/en-US/firefox/addon/firefox-translations/)”插件是一个能在本地运行的机器翻译工具，即翻译引擎、语言模型和页面内翻译算法都完全在用户计算机内运行，没有任何数据会发送到云端，因此完全保密。第一次翻译一种语言时，它需要下载一些支持性资源，以及改进的语言模型，但实际的翻译工作是在用户自己的电脑上执行基于机器学习的过程。

>
> **[消息来源：Mozilla](https://blog.mozilla.org/en/mozilla/local-translation-add-on-project-bergamot/)**
>
>
>

>
> 老王点评：这个插件目前支持的语言并不多，由于是欧盟资助的项目，目前还不支持中文的翻译，也没看到支持中文的计划。
>
>
>

![](/data/attachment/album/202206/03/205815yojoo3ulkko2tak2.jpg)

### 谷歌为开源项目推出新的芯片设计网站

谷歌一直在帮助小型开源项目进行芯片制造，谷歌承担费用，并与 SkyWater 合作，使用其开源的工艺设计套件来设计。谷歌今天宣布了一个新的芯片设计门户网站，其 MPW 穿梭计划允许任何人提交开源集成电路设计，并在利用这个开源的工艺设计套件和其他开源 EDA 工具的同时，免费制造这些芯片。而所采用的 130 纳米的芯片技术也被证明对类似物联网的硬件原型设计仍然有用。

>
> **[消息来源：phoronix](https://www.phoronix.com/scan.php?page=news_item&px=Google-Open-Silicon-Portal)**
>
>
>

>
> 老王点评：这才真是真正支持开源硬件，不知道国内什么时候能有这样的支持。
>
>
>

### 回音

* NTFS3 驱动在贡献到上游后又失去维护引来社区关注后，其维护者又重返社区提交了一批贡献。


Collision：用于验证 ISO 和其他文件的 Linux 应用

![](/data/attachment/album/202206/04/111427jzkwsocv4oug3vso.jpg)

>
> 本教程概述了 Collision 的功能和使用指南。它是一个基于 GUI 且易于使用的程序，可让你使用加密哈希函数验证文件。
>
>
>

### 为什么需要验证文件？

人们每天都通过互联网下载文件。但许多用户从不费心去验证他们的完整性或真实性。这意味着不知道该文件是否合法且未被任何恶意代码篡改。

以作为标准安装镜像的 [Linux 发行版](https://www.debugpoint.com/category/distributions) 的 ISO 文件为例。所有流行的发行版制造商在 ISO 文件还提供哈希文件。使用该文件，你可以轻松比较下载文件的哈希值。让你可以放心你的文件是正确的并且没有以任何方式损坏。

此外，如果你通过不稳定的互联网连接下载大文件，该文件可能会损坏。在这些情况下，它也有需要验证。

### Collision – 功能和使用方法

[Collision](https://collision.geopjr.dev/) 使用加密哈希函数来帮助你验证文件。加密哈希函数是一种流行的算法，它通过多种加密算法将文件数据生成为固定长度的数据流。最受欢迎的是 MD5、SHA-1、SHA-256 和 SHA-512。所有这些 Collision 都支持。

除此之外，Collision 还提供了一个简洁的用户界面，它对每个 Linux 用户都简单易用。这是它的外观。

![Collision – First Screen](/data/attachment/album/202206/04/111431wncha0rh0a2lnar8.jpg)

首先，它有两个主要特点。 a、上传文件以获取校验和和或哈希值；b、将校验和与上传的文件进行比较。

例如，如果你有一个简单的文件，你可以通过“<ruby> 打开文件 <rt>  Open a File </rt></ruby>”按钮上传一个文件，或“<ruby> 打开 <rt>  Open </rt></ruby>”按钮重新上传另一个文件。

如下图所示，该文本文件具有以下各种哈希函数的校验和。现在你可以通过互联网/与任何人共享该文件，以及用于验证的校验和值。

![Hash values of a test file](/data/attachment/album/202206/04/111432xyyh47dxi6l7nxw6.jpg)

此外，如果有人篡改文件（即使是单个字节）或文件在分发过程中被破坏，那么哈希值就会完全改变。

其次，如果要验证已下载文件的完整性，请点击“<ruby> 验证 <rt>  Verify </rt></ruby>”选项卡。然后上传文件，输入你收到的上传文件的哈希值。

如果匹配，你应该会看到一个绿色勾号，显示其真实性。

![Collision verifies a sample file with SHA-256](/data/attachment/album/202206/04/111432oc7kdl8v00k8d6gc.jpg)

此外，这是另一个示例，我修改了测试文件并保持大小相同。这个场景清楚地表明它对该文件无效。

![Collision showing that a file is not valid](/data/attachment/album/202206/04/111432qlylynyee55yebd0.jpg)

#### 重要说明

这里值得一提的是，哈希方法不会验证文件元属性，如修改时间、修改日期等。如果有人篡改了文件并将其还原为原始内容，这种哈希方式将其称为有效文件。

现在，让我们看一个验证 ISO 文件的典型示例。

### 使用 Collision 验证 Ubuntu Linux 的示例 ISO 文件

我相信你在使用 Linux 时通常会下载许多 ISO 文件。为了说明，我从官方 Ubuntu 下载页面下载了流行的 Ubuntu ISO 服务器镜像。

![Ubuntu server ISO file and checksums](/data/attachment/album/202206/04/111432h44x1i88d1d1fncd.jpg)

`SHA256SUMS` 文件带有上面的该安装程序的以下校验和值：

![SHA-256 value of Ubuntu server ISO image](/data/attachment/album/202206/04/111432e99z8yvpnromyzcv.jpg)

下载后，打开 Collision 应用并通过“<ruby> 验证 <rt>  Verify </rt></ruby>”选项卡上传 ISO 文件。然后复制 SHA-256 值并将其粘贴到左侧的校验和框中。

如果你已正确下载并按照步骤操作，你应该会看到该文件是真实有效的。

![Ubuntu server ISO image verified](/data/attachment/album/202206/04/111432c8xl1j61xyjlyxlk.jpg)

### 如何安装 Collision

使用 Flatpak 可以轻松安装 Collision 应用。你需要为你的 Linux 发行版 [设置 Flatpak](https://flatpak.org/setup/)，并单击以下链接以安装 Collision。

>
> **[通过 Flathub 安装 Collision](https://dl.flathub.org/repo/appstream/dev.geopjr.Collision.flatpakref)**
>
>
>

安装后，你应该通过发行版的应用菜单找到它。

### 有没有其他方法可以在没有任何应用的情况下验证文件？

是的，所有 Linux 发行版中都有一些内置程序，你还可以使用它们来使用终端验证文件及其完整性。

下面的终端程序可用于确定任何文件的哈希值。它们默认安装在所有发行版中，你甚至可以将它们用于你的 shell 脚本以实现自动化。

```
md5sum <文件名>

```

```
sha1sum <文件名>

```

```
sha256sum <文件名>

```

使用上述程序，你可以找出哈希值。但是你需要比较它们以手动验证。

![Verify files via command-line utilities](/data/attachment/album/202206/04/111433z1kz8mzi0ge888ji.jpg)

### 结束语

我希望本指南可以帮助你使用 Collision GTK 应用验证你的文件。它使用起来很简单。此外，你可以在终端中使用命令行方法来验证您想要的任何文件。尽可能始终检查文件完整性总是应该的。

---

via: <https://www.debugpoint.com/2022/05/collision/>

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

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


移动版 GNOME Shell：希望之始，期望满满

看着很不错

![GNOME Shell 在一台 Pinephone 原型机上运行](/data/attachment/album/202206/04/152528bzmes34pnze6n633.jpg)

>
> GNOME 开发人员在最近的一篇博文中提出了将 GNOME Shell 完全移植到手机上的想法。下面是我对这个项目的一些看法。
>
>
>

### 移动版 GNOME Shell

作为一个桌面环境，GNOME 在过去的十年中发展成为了 [GNOME 40](https://www.debugpoint.com/tag/gnome-40)。GNOME 40 是一个重要的版本，它以一种现代的方式改变了完整的用户界面设计。

看着 GNOME 40 的设计方式，你可能会觉得 Shell 和它的底层技术已经为小屏幕做好了准备。手势驱动的工作区、图标网格和停靠区 —— 在某种程度上感觉更接近于像安卓这样的移动操作系统，而不是桌面环境。

此外，系统托盘、日历、通知和原生的应用程序，可以有效地在较小尺寸的设备上工作。得益于 GTK4 和 libadwaita，其设计是响应式的，应用程序和控件的外观与移动平台很匹配。

在 GNOME 40 之后，GNOME 开发者为较小尺寸的设备（如平板电脑和手机）设计了几个 GNOME Shell 的概念验证。

#### 为什么是现在？

任何项目的开发和研究工作都要花费时间和金钱。虽然有来自主要科技公司对 GNOME 的捐赠，但这次有一个 “<ruby> 原型基金 <rt>  Prototype Fund </rt></ruby>” 帮助该团队继续进行这项努力。[原型基金](http://www.prototypefund.de) 是德国教育部（BMBF）支持公共利益软件的资助项目。

#### 包括什么？

设计一个完整的移动用户界面，并将其与移动操作系统整合是一个非常复杂的项目。它需要一个精心设计的愿景来支持成千上万的移动硬件和用户支持。更不用说，用户在移动设备上的隐私和安全问题了。

因此，有了这个基金，团队可以集中精力进行概念验证，以满足 GNOME Shell 中一些基本的用户互动。

* 启动器
* 应用程序网格
* 轻扫、手势和导航
* 用手机键盘搜索
* 检测屏幕大小和支持屏幕旋转
* 工作空间和多任务
* 设置
* 屏幕键盘

![GNOME Shell 移动版模拟图](/data/attachment/album/202206/04/152528t34o3n5v5l19a1aq.jpg)

始终要记住的是，移动体验远不止用户界面这么简单。另外，GNOME 本身并不是一个操作系统。它由底层的稳定的操作系统组成，它提供了非常需要的隐私和安全。另外，“应用商店”的概念也是如此。手机制造商需要与 GNOME 开发者合作，让他们的产品采用这个概念。

#### 进展如何？

在写这篇文章时，团队给我们快速演示了取得的进展。在下面的视频中可以看到：

*Phone*

复杂的任务是识别触摸屏手机中的各种手势。例如，你可能会使用长触摸、短触摸、双指轻扫和拖动，以及许多只有在小尺寸设备中才可行的可能性。这需要在各自的 GNOME Shell 组件中推倒重构。

而完全在现有的 GNOME Shell 基础上开发它们是很有挑战性的工作。

此外，该团队使用著名的 Pinephone Pro 进行开发和测试。Pinephone 已经是一个商业产品，装有 “友商” KDE Plasma 手机和其他 Linux 操作系统。

*Tablet*

### 结语

如果一切按计划进行，我们可能在一个完整的开源手机中获得原生的 GNOME 体验。而你可以重新拥有你的隐私!

另外，我不确定 Phosh（它也是基于 GNOME 的）会发生什么。虽然 Phosh 是由 Purism 开发和管理的，但看看 GNOME Shell 在移动设备上的努力和 PHosh 在未来一段日子的发展方向将是很有趣的。

那么，你对这个项目的前景怎么看？请在下面的评论栏里告诉我。

*图片和视频来源：GNOME 开发者 [博客](https://blogs.gnome.org/shell-dev/2022/05/30/towards-gnome-shell-on-mobile/)*

---

via: <https://www.debugpoint.com/2022/06/gnome-shell-mobile-announcement/>

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


龙芯 CPU 已经一只脚迈入 Linux 5.19

这文章是故意弄混 LoongISA 和 LoongArch 吧？

老外有偏见是正常的

![](/data/attachment/album/202206/04/184448uebk3ek6464565ke.jpg)

在本周为龙芯 CPU 架构支持进入 [Linux 5.19](https://www.phoronix.com/scan.php?page=search&q=Linux+5.19) 而进行的疯狂冲刺之后，Linus Torvalds 今天成功地将这个受 MIPS64 启发的中国架构代码合并到了 Linux 主线内核中。然而，由于一些代码尚未通过审查，虽然该 CPU 架构代码已经到位，但一些关键的驱动程序还没有到位，因此 Linux 5.19 还无法龙芯架构上启动。

如果你不太了解这件事的进展，我来补充介绍一下：<ruby> <a href="https://www.phoronix.com/scan.php?page=search&q=LoongArch">  龙芯架构 </a> <rp>  （ </rp> <rt>  LoongArch </rt> <rp>  ） </rp></ruby> 是由龙芯公司开发的 CPU 架构，长期以来以其基于 MIPS64 的系统而为人所熟知。但是随着上游 MIPS64 架构已经实际消亡，龙芯公司开始开发他们自己的 ISA。龙芯架构自称受到了 MIPS64 和 RISC-V 的启发，但一些龙芯架构的内核代码实际上是重新使用或精密复制自现有的 MIPS 代码。

今年早些时候，龙芯架构被 [添加到 GCC 12](https://www.phoronix.com/scan.php?page=news_item&px=LoongArch-Merged-GCC-12) 中作为主要系统编译器。与其他 Arm 或 RISC-V 设计相比，目前这一代 [龙芯 3A5000 CPU 的性能](https://www.phoronix.com/scan.php?page=news_item&px=Loongson-3A5000-Benchmark) 在现今阶段并不太诱人。不过我们将拭目以待这个中国国产 CPU 架构在未来几年的发展情况。

正如本周早些时候所写的，有迫切的压力促使 [龙芯架构进入 Linux 5.19](https://www.phoronix.com/scan.php?page=news_item&px=LoongArch-Maybe-For-5.19)，即使这意味着系统还无法启动。开发人员希望将 CPU 架构的代码主线化，这样他们就能腾出手来为 GNU C 库（Glibc）提交龙芯架构的支持代码。主线化他们的 Glibc 目标首先需要有一个坚实的用户空间 ABI 来解决内核支持。但由于 Glibc 2.38 预计在 8 月发布，龙芯架构需要合并到 Linux 5.19，以便有足够的时间在 7 月发布，才能使龙芯架构的代码赶得上 Glibc 的下一个版本截止线。

现在合并龙芯架构也减少了对 Linux 5.20 中可能出现的任何主线树范围变化的维护负担。

因此，大部分的龙芯架构代码已经出现在 Linux 5.19 中了，但缺少一些启动所需的 EFI 代码，IRQ 驱动与 Linux 的 MIPS 支持共享同一段代码，但由于情况复杂，还不能使用，PCI 部分的龙芯代码需要修改并通过 PCI 子系统区域进行合并。

[龙芯架构的合并](https://git.kernel.org/pub/scm/linux/kernel/git/torvalds/linux.git/commit/?id=c6f2f3e2c80e975804360665d973211e4d9390cb) 对内核来说意味着增加了 21000 行的新代码，这还不包括尚未到达的所需驱动程序。据推测，到今年夏天晚些时候的 Linux 5.20 内核开发周期时，其余所需的驱动支持将会通过审查，从而产生一个可启动的龙芯架构系统。

就在四年前，著名的 Linux 内核开发者 Arnd Bergmann [预测](https://www.phoronix.com/scan.php?page=news_item&px=C-SKY-Approved-Last-Arch) C-SKY 将是“我们最后一个添加到内核的新 CPU 架构”。C-SKY 是另一个中国架构，当时的想法是所有未来的 CPU 工作都将走向 RISC-V，但现在发现龙芯架构也许将是最后一个添加到 Linux 内核的新 CPU 架构。

---

via: <https://www.phoronix.com/scan.php?page=news_item&px=LoongArch-Merged-Linux-5.19>

作者： [Michael Larabel](https://www.michaellarabel.com/) 选题：[wxy](https://github.com/wxy) 译者：[wxy](https://github.com/wxy) 校对：[wxy](https://github.com/wxy)

本文由 [LCTT](https://github.com/LCTT/TranslateProject) 原创编译，[Linux中国](/article-14671-1.html) 荣誉推出


硬核观察 #657 开源固件基金会发布公开信要求英特尔开源 FSP

Summary: • 开源固件基金会发布公开信要求英特尔开源 FSP • Zstd 压缩固件的支持提交到 Linux 5.19 • Facebook 正在开发“隐私安全”广告产品

![](/data/attachment/album/202206/04/192428b0v5kki9iqtt6606.jpg)

![](/data/attachment/album/202206/04/192440jwnss63gpswwuewx.jpg)

### 开源固件基金会发布公开信要求英特尔开源 FSP

开源固件基金会发起一封给英特尔的公开信，呼吁英特尔开源其固件支持包（FSP）。FSP 二进制文件对英特尔系统的固件开放程度有很大的限制，也是在英特尔硬件上支持 Coreboot、LinuxBoot 和其他技术的一个限制因素。而行业对拥有开源固件的兴趣越来越大。开源固件有助于从解决安全问题到在系统的低层次上推动创新功能。

>
> **[消息来源：Phoronix](https://www.phoronix.com/scan.php?page=news_item&px=Open-Letter-Intel-FSP)**
>
>
>

>
> 老王点评：开源固件是自由硬件、自由软件的一块重要基石，也是英特尔一直舍不得放开的部分，不过我觉得以英特尔的对开源开放的态度，应该比英伟达更容易接受社区倡议。
>
>
>

![](/data/attachment/album/202206/04/192502kdfd2zqiiq17tb1w.jpg)

### Zstd 压缩固件的支持提交到 Linux 5.19

多年来，一直有人提议在 Linux 内核的固件处理中增加对 Zstd 压缩的支持，取代现有的 XZ 压缩，以节省磁盘空间，同时提供快速的解压缩。但这些补丁从未进入主线，而最终随着 Linux 5.19 的推出，它将会到位。以 .zst 结尾的固件文件将由 Linux 内核的固件加载器进行解压。

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

>
> 老王点评：有时候不得不说，Linux 对于新技术的采纳太过于谨慎了。
>
>
>

![](/data/attachment/album/202206/04/192527ckuuldauo5ptoogw.jpg)

### Facebook 正在开发“隐私安全”广告产品

据称，Facebook 正在早期开发一个不依赖任何匿名用户个人信息的产品。Facebook 的工程师们称之为“基本广告”，它针对的是那些试图建立知名度和塑造产品认知的品牌广告商。该产品似乎与广告商使用 Facebook 的目标工具背道而驰。但是，既能提供规模，又能绕过 CCPA 和 GDPR 等数据法规的广告仍然会得到广告商的青睐。

>
> **[消息来源：businessinsider](https://www.businessinsider.com/facebook-developing-ads-product-no-user-data-amid-privacy-changes-2022-6?IR=T)**
>
>
>

>
> 老王点评：那不就是随意投放么？确实是保护了隐私，不过你也可能会看到更多的广告。
>
>
>


软件包 “被标记为手动安装”？这是什么意思？

Summary: 让我在本篇中分享一些细节。

让我在本篇中分享一些细节。

![](/data/attachment/album/202206/05/154517uqnqdfi79yqidi79.jpg)

如果你使用 `apt` 命令在终端中安装软件包，你将看到各种输出。

如果你注意并查看输出，有时你会注意到一条消息：

```
package_name set to manually installed

```

你有没有想过这条消息是什么意思，为什么你没有在所有包上看到它？让我在本篇中分享一些细节。

### 理解 “软件包被标记为手动安装”

当你尝试安装已安装的库或开发包时，你会看到此消息。此依赖包是与另一个包一起自动安装的。如果删除了主包，则使用 `apt autoremove` 命令删除依赖包。

但是由于你试图显式安装依赖包，你的 Ubuntu 系统认为你需要这个包独立于主包。因此，该软件包被标记为手动安装，因此不会自动删除。

不是很清楚，对吧？以 [在 Ubuntu 上安装 VLC](https://itsfoss.com/install-latest-vlc/) 为例。

由于主 VLC 包依赖于许多其他包，因此这些包会自动安装。

![installing vlc with apt ubuntu](/data/attachment/album/202206/05/154519drr0ufpauzfzmhdr.png)

如果你检查名称中包含 `vlc` 的 [已安装软件包列表](https://itsfoss.com/list-installed-packages-ubuntu/)，你会看到除了 VLC，其余都标记为“自动”。这表明这些软件包是（跟着 vlc）自动安装的，当 VLC 被卸载时，它们将使用 `apt autoremove` 命令自动删除。

![list installed packages vlc ubuntu](/data/attachment/album/202206/05/154520fihw24233hgnr8pr.png)

现在假设你出于某种原因考虑安装 `vlc-plugin-base`。如果你在其上运行 `apt install` 命令，系统会告诉你该软件包已安装。同时，它将标记从自动更改为手动，因为系统认为在尝试手动安装表明你明确需要此 `vlc-plugin-base`。

![package set manually](/data/attachment/album/202206/05/154520np0a3bz0ynjn5jha.png)

可以看到它的状态已经从 `[installed,automatic]` 变成了 `[installed]`。

![listing installed packages with vlc](/data/attachment/album/202206/05/154520r16zzrc9kcryihyk.png)

现在，让我删除 VLC 并运行 `autoremove` 命令。你可以看到 `vlc-plugin-base` 不在要删除的软件包列表中。

![autoremove vlc ubuntu](/data/attachment/album/202206/05/154520b6qupdgwvw0xcir6.png)

再次检查已安装软件包的列表。`vlc-plugin-base` 仍然安装在系统上。

![listing installed packages after removing vlc](/data/attachment/album/202206/05/154521af9i0iooonnilid8.png)

你可以在这里看到另外两个与 VLC 相关的包。这些是 `vlc-plugin-base` 包的依赖项，这就是为什么它们也存在于系统上但标记为 `automatic` 的原因。

我相信现在有了这些例子，事情就更清楚了。让我给你一个额外的技巧。

### 将包重置为自动

如果包的状态从自动更改为手动，你可以通过以下方式将其设置回自动：

```
sudo apt-mark auto package_name

```

![set package to automatic](/data/attachment/album/202206/05/154521vkjj4rszj1z1kqjj.png)

### 结论

这不是一个重大错误，也不会阻止你在系统中进行工作。但是，了解这些小事会增加你的知识。

**好奇心可能会害死猫，但它会让企鹅变得更聪明**。这是为这篇原本枯燥的文章增添幽默感的原始引述 : )

如果你想阅读更多这样的文章，这些文章可能看起来微不足道，但可以帮助你更好地了解您的 Linux 系统，请告诉我。

---

via: <https://itsfoss.com/package-set-manually-installed/>

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


机器学习：使用 Python 进行分类

>
> 机器学习（ML）就是，分析一组数据以预测结果。Python 被认为是 ML 的最佳编程语言选择之一。在本文中，我们将讨论使用 Python 进行分类的机器学习。
>
>
>

![machine-learning-classification](/data/attachment/album/202206/05/161359nxsazihpel8opwqh.jpg)

假设你想教孩子区分苹果和橙子。有多种方法可以做到这一点。你可以让孩子触摸这两种水果，让他们熟悉形状和柔软度。你还可以向她展示苹果和橙子的多个例子，以便他们可以直观地发现差异。这个过程的技术等价物被称为机器学习。

机器学习教计算机解决特定问题，并通过经验变得更好。这里讨论的示例是一个分类问题，其中机器被赋予各种标记示例，并期望使用它从标记样本中获得的知识来对未标记样本进行标记。机器学习问题也可以采用回归的形式，其中期望根据已知样本及其解决方案来预测给定问题的<ruby> 实值 <rt>  real-valued </rt></ruby>解决方案。<ruby> 分类 <rt>  Classification </rt></ruby>和<ruby> 回归 <rt>  Regression </rt></ruby>被广泛称为<ruby> 监督学习 <rt>  supervised learning </rt></ruby>。机器学习也可以是<ruby> 无监督 <rt>  unsupervised </rt></ruby>的，机器识别未标记数据中的模式，并形成具有相似模式的样本集群。机器学习的另一种形式是<ruby> 强化学习 <rt>  reinforcement learning </rt></ruby>，机器通过犯错从环境中学习。

### 分类

分类是根据从已知点获得的信息来预测一组给定点的标签的过程。与一个数据集相关的类别或标签可以是二元的，也可以是多元的。举例来说，如果我们必须给与一个句子相关的情绪打上标签，我们可以把它标记为正面、负面或中性。另一方面，我们必须预测一个水果是苹果还是橘子的问题将有二元标签。表 1 给出了一个分类问题的样本数据集。

在该表中，最后一列的值，即贷款批准，预计将基于其他变量进行预测。在接下来的部分中，我们将学习如何使用 Python 训练和评估分类器。

| 年龄 | 信用等级 | 工作 | 拥有房产 | 贷款批准 |
| --- | --- | --- | --- | --- |
| 35 | 好 | 是 | 是 | 是 |
| 32 | 差 | 是 | 不 | 不 |
| 22 | 一般 | 不 | 不 | 不 |
| 42 | 好 | 是 | 不 | 是 |

*表 1*

### 训练和评估分类器

为了训练<ruby> 分类器 <rt>  classifier </rt></ruby>，我们需要一个包含标记示例的数据集。尽管本节不涉及清理数据的过程，但建议你在将数据集输入分类器之前阅读各种数据预处理和清理技术。为了在 Python 中处理数据集，我们将导入 `pandas` 包和<ruby> 数据帧 <rt>  DataFrame </rt></ruby>结构。然后，你可以从多种分类算法中进行选择，例如<ruby> 决策树 <rt>  decision tree </rt></ruby>、<ruby> 支持向量分类器 <rt>  support vector classifier </rt></ruby>、<ruby> 随机森林 <rt>  random forest </rt></ruby>、XG boost、ADA boost 等。我们将看看随机森林分类器，它是使用多个决策树形成的集成分类器。

```
from sklearn.ensemble import RandomForestClassifier
from sklearn import metrics

classifier = RandomForestClassifier()

#creating a train-test split with a proportion of 70:30
X_train, X_test, y_train, y_test = train_test_split(X, y, test_size=0.33)

classifier.fit(X_train, y_train) # 在训练集上训练分类器

y_pred = classifier.predict(X_test) # 用未知数据评估分类器

print("Accuracy: ", metrics.accuracy_score(y_test, y_pred)) # 用测试计划中的实际值比较准确率

```

虽然这个程序使用准确性作为性能指标，但应该使用多种指标的组合，因为当测试集不平衡时，准确性往往会产生非代表性的结果。例如，如果模型对每条记录都给出了相同的预测，而用于测试模型的数据集是不平衡的，即数据集中的大多数记录与模型预测的类别相同，我们就会得到很高的准确率。

### 调整分类器

调优是指修改模型的<ruby> 超参数 <rt>  hyperparameter </rt></ruby>值以提高其性能的过程。超参数是可以改变其值以改进算法的学习过程的参数。

以下代码描述了随机搜索超参数调整。在此，我们定义了一个搜索空间，算法将从该搜索空间中选择不同的值，并选择产生最佳结果的那个：

```
from sklearn.model_selection import RandomizedSearchCV

#define the search space
min_samples_split = [2, 5, 10]
min_samples_leaf = [1, 2, 4]
grid = {‘min_samples_split’ : min_samples_split, ‘min_samples_leaf’ : min_samples_leaf}

classifier = RandomizedSearchCV(classifier, grid, n_iter = 100)

# n_iter 代表从搜索空间提取的样本数
# result.best_score 和 result.best_params_ 可以用来获得模型的最佳性能，以及参数的最佳值

classifier.fit(X_train, y_train)

```

### 投票分类器

你也可以使用多个分类器和它们的预测来创建一个模型，根据各个预测给出一个预测。这个过程（只考虑为每个预测投票的分类器的数量）被称为硬投票。软投票是一个过程，其中每个分类器产生一个给定记录属于特定类别的概率，而投票分类器产生的预测是获得最大概率的类别。

下面给出了一个创建软投票分类器的代码片段：

```
soft_voting_clf = VotingClassifier(
estimators=[(‘rf’, rf_clf), (‘ada’, ada_clf), (‘xgb’, xgb_clf), (‘et’, et_clf), (‘gb’, gb_clf)],
voting=’soft’)
soft_voting_clf.fit(X_train, y_train)

```

这篇文章总结了分类器的使用，调整分类器和结合多个分类器的结果的过程。请将此作为一个参考点，详细探讨每个领域。

---

via: <https://www.opensourceforu.com/2022/05/machine-learning-classification-using-python/>

作者：[Gayatri Venugopal](https://www.opensourceforu.com/author/gayatri-venugopal/) 选题：[lkxed](https://github.com/lkxed) 译者：[geekpi](https://github.com/geekpi) 校对：[turbokernel](https://github.com/turbokernel)

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


硬核观察 #658 Doom 游戏被移植到 BIOS 中运行

Summary: • Doom 游戏被移植到 BIOS 中运行 • UNISOC 固件中的一个关键缺陷可阻断通讯 • 谷歌助手正在失去基于位置的提醒

本质上很多恶意代码都可以被植入BIOS或者更底层的固件里执行，所以我觉得自由开源软件对个人安全具有更大的社会意义！！！

![](/data/attachment/album/202206/05/194746vkl7kxzr1x37r3ke.jpg)

![](/data/attachment/album/202206/05/194754p1ewhwvzuuocv9zh.jpg)

### Doom 游戏被移植到 BIOS 中运行

Coreboot 是一个自由开源的 BIOS 实现，支持许多被称为“载荷”的扩展。用户可以通过选择不同载荷来自定义 BIOS ROM 所包含的功能。在刚刚发布的 Coreboot 4.17 中，除了支持新的主板、提供新的启动程序、支持 AMD 平台安全启动、有一些修正之外，还有……一个 1993 年的移植版 Doom（毁灭战士）游戏。虽然有些“小小”的不足，比如没有声音、不能保存游戏、退出游戏时系统会挂起，但是他们说，“如果你厌倦了太空入侵者和俄罗斯方块等游戏载荷，将 3D 游戏带入你的 BIOS，是一个很棒的新选择！”

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

>
> 老王点评：嗯，我启动机器是准备干什么来着？为什么我一直玩游戏……
>
>
>

![](/data/attachment/album/202206/05/194805kw5xdidj3cstf5jd.jpg)

### UNISOC 固件中的一个关键缺陷可阻断通讯

研究人员发现，攻击者可以向附近带有 UNISOC 固件的设备发射一个特别设计的无线电数据包，可以使固件崩溃，在设备重新启动之前，会终止该设备的蜂窝网络连接。事实证明，这个缺陷不仅适用于低端智能手机，而且也适用于一些智能电视。研究人员说该漏洞是在 UNISOC 芯片组的固件中，而不是在安卓操作系统中。UNISOC 是一家有 21 年历史的芯片设计公司，总部设在中国，是世界上第四大智能手机芯片商，仅次于联发科、高通和苹果。

>
> **[消息来源：The Register](https://www.theregister.com/2022/06/03/uisoc-chip-flaw-check-point/)**
>
>
>

>
> 老王点评：最糟糕的就是这种硬件中的安全缺陷，无论是升级还是替换，都非常麻烦。
>
>
>

 ![](/data/attachment/album/202206/05/194840rwgg6s1gl5iwo3io.jpg)

### 谷歌助手正在失去基于位置的提醒

这些是非常有用的命令，你可以告诉谷歌助手，比如，“提醒我回家后把垃圾倒掉”，而你的手机一直在追踪你的位置，当你进门时就会提示你。现在谷歌正在发出通知，告诉用户这项功能已经失效，而建议采用定时重复的提醒替代。目前还不清楚为什么谷歌突然要砍掉一个有用的、易于使用的功能。

>
> **[消息来源：Arstechnica](https://arstechnica.com/gadgets/2022/06/the-google-assistant-is-losing-location-reminders-one-of-its-best-features/)**
>
>
>

>
> 老王点评：看来不是好的功能都能留下，有时候你不知道厂商在想什么，如果产品是开源的会怎么样？
>
>
>


Linux 桌面刻薄版点评

“ubuntu是一个古老的非洲单词，意思是‘我用不来debian’”<br />
笑不活了

你的翻译好，采纳！

深刻，却赞同。我基本上都用过。。。<br />
后面就不折腾了，尤其是对 Arch 的评价。没时间玩不起。。。

服务器可能没什么不同，桌面debian比不上ubuntu，安装驱动、按教程安装解码器等ubuntu都很方便，不过最好用的《linux发行版》还是mac

对于媒体工作者来说，确实是mac（尽管它只能叫类unix）

这。。。 机器翻译的  ？

如果你有工作要做，那就不太好了，适用每一种发行版，毕竟office套件和设计类软件不太行。看到最后，还是只能arch和其衍生版。不过话说回来，这篇文章明显只适用于国外，国内zf强推，之前那篇文章不是说25年国内桌面电脑出货量预装Linux的要占20%吗？

突然不想再把时间浪费在学习Linux上了，换Ubuntu，有机会试试Mac，珍惜生命

![](/data/attachment/album/202206/06/101419byuzivyy34wnyl6y.jpg)

>
> 厌倦了 Windows 却买不起 Mac？这里有一份讲道理的最不坏发行版清单供你参考。
>
>
>

众所周知，所有的操作系统都很糟糕，只是有些比其他的更差一些。

在几乎在每一篇关于 Linux 的文章下都有这样的评论：*有太多的发行版了，不知道该试试哪个*。因此，我们觉得应该帮你简化一下，列出不同的发行版到底怎么样，告诉你它们在哪些方面很 [糟糕](http://harmful.cat-v.org/software/operating-systems/os-suck)。

由于 Distrowatch 目前列出了多达 [270](https://distrowatch.com/dwres.php?resource=popularity) 个发行版，如果我们把所有的发行版都体验一遍，那简直是件不可能完成的事。因此，我们需要对这个列表做个瘦身。

如果你对这样的比较感兴趣，那么可能你还没有找到最喜欢的。

### 0. 小众而寂寂无名的发行版，我说的是全部

避免在所有的小众的发行版上费劲。原因如下：首先，它们很小众。没有多少人使用它们，所以你很难找到可以寻求帮助的人。其次，第三方硬件和软件可能无法开箱即用，如果你向供应商寻求帮助，无论是游戏、显卡还是打印机，他们都不会听说过 Ultimate SuperL33tOS 树莓派版。然后就完了。不要选它们，坚持主流。

### 1. ChromeOS Flex

年年都在喊 Linux 桌面年来了，然而根本没有人注意到它是不是来了 —— 也许是因为上面没有写 “Linux” 吧。ChromeOS 只能运行在 ChromeBook 和 ChromeBox 上，但在全球疫情大流行之前，它们的销量曾一度超过 Mac。“Flex” 是适用于普通 PC 的版本，大概因为它是 1.5 万亿美元的谷歌做的而因此得名吧。ChromeOS Flex 非常好用，因为它只做一件事：浏览网页。你不能安装应用程序，甚至不能安装安卓应用程序：只有官方套件才可以。你可以运行 Debian 容器：如果你知道这意味着什么，就去运行 Debian。如果你不知道这意味着什么，相信我们，你不会想知道的。

### 2. Ubuntu

>
> “Ubuntu 是一个古老的非洲单词，[意思](https://www.urbandictionary.com/define.php?term=ubuntu) *是我用不来 Debian*。”
>
>
>

Ubuntu 一开始是为了通过制造一个更容易安装和运行的 Linux 来取代 Windows 的头号消费操作系统的地位。它成功了。于是微软 [威胁要起诉](https://www.theregister.com/2007/05/24/microsoft_novell_patents/) 它，因为如果你不细看的话，它看起来有点像 Windows，[所以取代失败了](https://www.theregister.com/2013/06/03/thank_microsoft_for_linux_desktop_fail/)。Ubuntu 决定，如果它不能看起来像 Windows，那么就 [让它就像 Mac OS X](https://www.theregister.com/2011/04/01/ubuntu1004_beta_review/)。然后它又 [回到了 GNOME](https://www.theregister.com/2017/04/05/ubuntu_euthanizes_unity/)。

Ubuntu 曾经是显而易见的选择，但是它把目光从“<ruby> <a href="https://ubuntu.com/blog/for-human-beings">  为人类服务 </a> <rp>  （ </rp> <rt>  for human beings </rt> <rp>  ） </rp></ruby>”的球上移开了（解释得很好，伙计们），转而关注服务器 —— 公平地说，这是赚钱的地方 —— 并且确实赚到了。当它放弃了所有内部的东西时，它保留了 Snap，这是它的通用应用程序打包格式，其他发行版都不用。这东西能用，但会占用磁盘空间，并使开机速度变慢。如果你只是想继续使用它，而不是摆弄和与之战斗，可以试试 Ubuntu MATE 或 Xubuntu，但这时你再想想我们对小众发行版的警告。

>
> 玩笑归玩笑，“Ubuntu” 是<ruby> 恩古尼 <rp>  （ </rp> <rt>  Nguni </rt> <rp>  ） </rp></ruby>语（<ruby> 恩德贝莱语 <rp>  （ </rp> <rt>  Ndebele </rt> <rp>  ） </rp></ruby>、<ruby> 科萨语 <rp>  （ </rp> <rt>  Xhosa </rt> <rp>  ） </rp></ruby>、<ruby> 祖鲁语 <rp>  （ </rp> <rt>  Zulu </rt> <rp>  ） </rp></ruby>）的一个词，在南部非洲是一个更广泛的哲学概念，与社区中的尊重、仁慈和慷慨有关。其理念是，只有通过与他人进行亲社会互动，你才是一个人类。“umuntu ngumuntu ngabantu” —— “我是，因为你是”。
>
>
>

### 3. Linux Mint

Mint 是一个微调版的 Ubuntu 翻版。多年来它一直是个卢瑟，但是当 Ubuntu 变得像 Mac 一样时，它看到了机会并抓住了它 —— 同时也够到了榜单上第一的位置。它摒弃了 Ubuntu 中一些有问题的部分，比如 GNOME 和 Snap，但却用自己的不可靠的东西取代了它们，比如不是一个、不是两个、而是三个类 Windows 桌面的混乱选择，以及对更新和升级过于谨慎的态度。

### 4. Debian

Debian 是自由发行版的鼻祖，它发明了一种自动安装依赖关系的打包工具。它让安装 Linux 比以前更容易，但却陷入了 [政治](https://www.theregister.com/2022/04/25/debian_firmware_debate/) 的 [泥潭](https://www.theregister.com/2020/09/10/debian_project_address/)。它有点像 Ubuntu，但更过时，[更难安装](https://www.theregister.com/2021/01/22/debian_free_hard_to_install/)，而且驱动程序更少。如果这听起来正是你所需要的，那就去安装它吧。

### 5. Fedora

红帽公司通过从免费发行版转而销售异常无聊的企业服务器版而赚取了数十亿美元。这让那些吃白食的人很不高兴。Fedora 是红帽公司扔给他们的骨头。它已经成熟到可以与 Ubuntu 相媲美，但没有稳定的版本。你将会每年升级两次，除非你推迟升级，躺平啥都不干，并希望跳过每一个其他版本。除非你的日常工作是试图阻止你的 RHEL 机器倒下，或者试图构建能在 RHEL 机器上运行而不倒下的代码，否则可能不值得使用它。

### 6. openSUSE

SUSE 比红帽公司整整大半岁，它是另一个昂贵的企业发行版供应商，把免费的东西丢到了墙外。它对 Fedora 的不稳定版本问题的创新解决方案是有两个不同的发行版。一个是 “Leap”，与付费的 SUSE Linux Enterprise（SLE）同步 —— 也就是说，它的发布周期慢得令人痛苦。另一个，“Tumbleweed”，有一个滚动的发布模式，这意味着每天都有可能出现令人刺激的破坏性变化。

作为补偿，它使用 Btrfs 和快照来使回滚更新变得容易 —— 但软件包管理器不知道快照，也不了解 Btrfs 有名的无法告诉你有多少可用的磁盘空间的 [习惯](https://btrfs.wiki.kernel.org/index.php/FAQ#Help.21_Btrfs_claims_I.27m_out_of_space.2C_but_it_looks_like_I_should_have_lots_left.21)，所以它偶尔会填满你的文件系统并破坏它。沮丧的无聊或畏缩的恐怖，这是你的选择：愿你玩得开心！

SUSE 和 KDE 都产自于德国，它大约永远是 KDE 的最佳发行版。为了显示对 Linux 世界的深刻理解，Novell 收[购了 SUSE](https://www.theregister.com/2003/11/04/novell_bags_suse_for_210m/)，然后又 [收购](https://www.theregister.com/2003/08/04/novell_buys_ximian/) 了 GNOME 供应商 Ximian，然后强迫他们进行了一场 [包办婚姻](https://www.theregister.com/2004/01/07/novell_marries_suse_to_ximian/)。所以现在 SLE 甚至不提供 KDE 作为选项。

### 7. RHEL 一家

IBM 的子公司红帽仍然是 Linux 世界的巨人。特别像克洛诺斯，他吃了自己的孩子。所以它 [买下了 CentOS](https://www.theregister.com/2014/01/08/red_hat_to_team_up_with_communitybased_rhel_lookalike_centos/)，然后把它 [干掉](https://www.theregister.com/2021/01/26/killing_centos/)，就像它 [对 CoreOS 所做](https://www.theregister.com/2018/01/31/red_hat_coreos_acquisition/) 的那样。

让我们随便混用一下古典典故，这导致了一个九头蛇的局面：又有许多脑袋冒了出来。如果 Fedora 是 RHEL 的一个 alpha 版本，那么 CentOS Stream 就是一种 beta 版本。

还有 Rocky Linux 和 AlmaLinux，它们是锉掉了序列号的 RHEL。如果你以后要在 RHEL 上部署东西，或者如果你正在为在红帽商店工作而提高技能，或者如果你只是买不起真货，这都是理想的选择。如果你觉得现在 Oracle 比红帽更值得信赖，那么还有 Oracle 的版本。

对于你自己的笔记本电脑来说，这些都是长期以来有点落后于时代的东西：如果你是一个大企业，这正是你想要的，但如果你在家里运行它，就不是了。

### 8. Pop!\_OS

Pop!\_OS 可以说是最有趣的 Ubuntu 翻版之一。说到这里，请记住那句关于生活在 [有趣的时代](https://quoteinvestigator.com/2015/12/18/live/) 的名言，而开源世界的座右铭是 [快速行动和打破常规](https://www.theregister.com/2017/11/28/break_up_google_and_facebook_if_you_want_tech_innovation_ever_again/)。如果你一定要这么做，那就把它放在一台全新的电脑上，不要尝试双启动。另外，请记住我们对小众发行版说的话，这也适用于所有的 Ubuntu 翻版。

### 9. Arch Linux

最后，我们来到了名单上的第 10 个条目，因为 Unix 人要的就是不同，喜欢从零开始计算。作为最初的滚动发布的发行版之一，Arch 是快速行动和打破常规的体现。如果你是一个业余爱好者或游戏玩家，那就太好了，如果你有工作要做，那就不太好了。这也适用于它的后代，如 EndeavourOS、Manjaro 和 Garuda。

### 结论

有很多值得一试的发行版没有进入我们讽刺而（实则）深情的名单。这是列入前十名的原因：这个名单上的所有发行版都是目前领先的 Linux 发行版，这里的每一个都以自己的方式成为一个很好的、可靠的竞争者。

自由软件的世界之所以存在，是因为人们对正确的做事方式有强烈的感受，因此，它既有强烈的社区意识，也有深刻的、根本上对立的派别，如<ruby> 蝶变党 <rp>  （ </rp> <rt>  Debianistas </rt> <rp>  ） </rp></ruby>与<ruby> 帽子客 <rp>  （ </rp> <rt>  Hatters </rt> <rp>  ） </rp></ruby>的对立。而这还没有涉及到桌面或编辑器的战争。

还有很多其他的发行版也有完全合理的存在理由，比如我们的办公桌面就主要运行一个根本不在这个名单上的 [发行版](https://www.theregister.com/2022/04/26/ubuntu_unity_and_ubuntu_cinnamon/)。

都挺好，真的。

---

via: <https://www.theregister.com/2022/05/31/the_cynics_guide_to_linux/>

作者：[Liam Proven in Prague](https://www.theregister.com/Author/Liam-Proven "Read more by this author") 选题：[wxy](https://github.com/wxy) 译者：[wxy](https://github.com/wxy) 校对：[wxy](https://github.com/wxy)

本文由 [LCTT](https://github.com/LCTT/TranslateProject) 原创编译，[Linux中国](/article-14675-1.html) 荣誉推出


使用 Linux 上的开源财务工具 Skrooge 管理你的预算

Summary: 使用开源预算工具 Skrooge 让你的财务管理更加轻松。

使用开源预算工具 Skrooge 让你的财务管理更加轻松。

>
> 使用开源预算工具 Skrooge 让你的财务管理更加轻松。
>
>
>

![](/data/attachment/album/202206/06/115449f0uy9guxxokj0umo.jpg "2 cents penny money currency")

2021 年，人们喜欢 Linux 的理由比以往任何时候都多。在本系列中，我将分享使用 Linux 的 21 个不同理由。本篇介绍的是个人财务管理。

个人财务可能很难管理。当你没有足够的钱在没有经济援助的情况下度日时，这可能是令人沮丧甚至不安的，而当你确实有所需的钱却又不清楚每个月的去向时，这可能会令人惊讶地难以接受。更糟糕的是，我们经常被告知要“制定预算”，好像宣布你每个月的花销就能在某种程度上体现出你需要多少钱。底线是：制定预算是困难的，没有达到你的财务目标是令人沮丧的。但这仍然很重要，Linux 有几个工具可以帮助使任务变得可管理。

### 理财

就像生活中的其他事情一样，我们都有自己的方法来跟踪我们的财务。我过去常常采取一种简单而直接的方法：我的薪水支票被存入一个账户，然后我会提取一定比例的现金。一旦我钱包里的钱没了，我就得等到下一个发薪日才能花钱。我用了一天没有午餐的时间，就明白了我必须认真对待我的目标，并相应地调整了我的消费行为。对于当时我的简单的生活方式来说，这是一种让我对自己的收入保持诚实的有效手段，但它并不能很好地转化为在线商业交易、长期公用事业合同、投资等等。

随着我不断完善我的财务跟踪方式，我了解到个人会计始终是一个不断发展的过程。我们每个人都有独特的财务状况，这告诉我们可以或应该使用什么样的解决方案来跟踪我们的收入和债务。如果你失业了，那么你的预算目标可能是尽可能少花钱。如果你在工作，但在还学生贷款，那么你的目标可能是向银行汇款。如果你在工作，但计划退休，那么你可能会尽可能多地存钱。

关于预算，要记住的一点是，它是为了将你的财务现实与你的财务 *目标* 进行比较。你无法避免一些开支，但在这些之后，你可以设定自己的优先事项。如果你没有达到你的目标，你可以调整自己的行为或改写你的目标，使其更好地反映现实。调整你的财务计划并不意味着你失败了，这只是意味着你最初的预测并不准确。在困难时期，你可能无法达到任何预算目标，但如果你坚持你的预算，你会学到很多关于维持你目前的生活方式（无论它是什么）所需要的财务手段。随着时间的推移，你可以学习调整你可能从未意识到的变化。例如，由于远程工作已成为一种被广泛接受的选择，人们正在搬到农村城镇以降低生活成本。看到这样一种生活方式的转变可以改变你的预算报告，真是令人震惊。

重点是，预算编制是一项经常被低估的活动，这在很大程度上是因为它令人生畏。重要的是要认识到，无论你的专业水平或对财务的兴趣如何，你都可以进行预算。无论你 [只使用 LibreOffice 电子表格](https://opensource.com/article/20/3/libreoffice-templates)，还是尝试专用的财务应用程序，你都可以设定目标，跟踪自己的行为，并学到许多宝贵的经验教训，这些经验教训最终可能会带来回报。

### 开源会计

有几个专用于 [Linux 的个人理财应用程序](https://opensource.com/life/17/10/personal-finance-tools-linux)，包括 [HomeBank](http://homebank.free.fr/en/index.php)、[Money Manager EX](https://www.moneymanagerex.org/download)、[GNUCash](https://opensource.com/article/20/2/gnucash)、[KMyMoney](https://kmymoney.org/download.html) 和 [Skrooge](https://apps.kde.org/en/skrooge)。所有这些应用程序本质上都是账本，你可以在每个月底（或每当你查看帐户时）退回到一个地方，从你的银行导入数据，并审查你的支出如何与你为自己设定的预算保持一致。

![显示财务数据的 Skrooge 界面](/data/attachment/album/202206/06/120311vs71kvnz4it1g4mw.jpg)

我使用 Skrooge 作为我的个人预算跟踪器。即便面对多个银行账户，它也能轻松自如的设置。与大多数开源金融应用程序一样，Skrooge 可以导入多种文件格式，因此我的工作流程大致如下：

1. 登录我的银行。
2. 将当月的银行对账单导出为 QIF 文件。
3. 打开 Skrooge。
4. 导入 QIF 文件。每个文件都会自动分配到相应的帐户。
5. 对照我为自己设定的预算目标审查我的支出。如果我超支了，那么我就会扣减下个月的目标（这样我就会理性地少花钱来弥补差额）。如果我尚未超出我的目标预算，那么我会把多余的部分移到 12 月的预算中（这样我在年底就会有更多的支出份额）。

我只跟踪了 Skrooge 中的家庭预算的一部分。Skrooge 通过一个动态数据库简化了这一过程，该数据库允许我使用自定义标签一次对多个交易进行分类。这使我可以轻松地从一般家庭和公用事业支出中提取我的个人支出，并且我可以在查看 Skrooge 提供的自动生成的报告时利用这些类别。

![Skrooge 预算饼图](/data/attachment/album/202206/06/120312loax7cyaqhuzlrz3.jpg)

最重要的是，流行的 Linux 财务应用程序使我能够以最适合我的方式管理我的预算。例如，我的合作伙伴更喜欢使用 LibreOffice 电子表格，但我只需要付出很少的努力就可以从家庭预算中提取 CSV 文件，将其导入到 Skrooge，并使用一组更新的数据集。不存在供应商锁定和不兼容。该系统灵活敏捷，使我们能够在更多地了解有效预算和生活中的情况时调整我们的预算和跟踪支出的方法。

### 开放选择

世界各地的货币市场各不相同，我们每个人与之互动的方式也决定了我们可以使用哪些工具。归根结底，你对财务类软件的选择必须基于自己的需求。开源做得特别好的一件事是为用户提供了选择的自由。

在设定自己的财务目标时，我很欣赏我可以使用最适合我个人计算风格的任何应用程序。我可以控制我在生活中如何处理数据，即使是我不一定喜欢处理的数据。Linux 及其令人惊叹的应用程序集使它不再是一件苦差事。

在 Linux 上尝试一些财务应用程序，看看你是否可以激励自己设定一些目标并节省开支吧！

---

via: <https://opensource.com/article/21/2/linux-skrooge>

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

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


硬核观察 #659 AI 机器船“五月花”号航行五周后到达了北美

Summary: • AI 机器船“五月花”号航行五周后到达了北美 • 谷歌研究在 Chromium 上安全使用 C++ • 让区块链管理能源使其不再浪费能源

为什么不抛弃高考，用别的方式选拔人才？<br />
因为这是已知的最好的方式。POW也是。如果换了别的方式，有人就可以耍流氓。

![](/data/attachment/album/202206/06/165632rz88xcds3p8xc88b.jpg)

![](/data/attachment/album/202206/06/165651ma59sww9ta59w7gt.jpg)

### AI 机器船“五月花”号航行五周后到达了北美

一艘曾试图追溯 1620 年“五月花”号海上航行的无人驾驶的机器船，在五周之后，从英国到达了美国马萨诸塞州的普利茅斯岩。IBM 负责该项目的的一位主管说，“构成自主系统的技术工作得非常完美，毫无瑕疵”，但是“在机械上，我们确实遇到了问题”。这并不是它的第一次航行，去年它曾经因为故障而折返，而今年的航程也出现过一些故障，不过，好歹是到达了目的地。

>
> **[消息来源：apnews](https://apnews.com/article/technology-north-america-atlantic-ocean-robotics-36357894ef5b4a346346a2d53a6f4cf3)**
>
>
>

>
> 老王点评：AI 在帮助自动驾驶机器了解其周围环境和自我驾驶方面越来越好，但当硬件出现问题时，大多数机器人没办法自己解决。不过，我在想，如果有一天他们连硬件故障也能解决的话……
>
>
>

![](/data/attachment/album/202206/06/165703bibkqafilttnn5b8.jpg)

### 谷歌研究在 Chromium 上安全使用 C++

谷歌 Chrome 安全团队在最近的一篇博文中说，“C++ 允许编写高性能的应用程序，但这是有代价的，安全……”。虽然如此，他们讨论了使用堆扫描技术来提高 C++ 的内存安全的历程，并提出了一些思路，基本的想法是把明确释放的内存放入隔离区，只有在达到一定的安全条件时才让它可用。在微软改用基于 Chromium 的浏览器之前，也曾在其浏览器中推出了这种缓解措施的版本。

>
> **[消息来源：谷歌](https://security.googleblog.com/2022/05/retrofitting-temporal-memory-safety-on-c.html)**
>
>
>

>
> 老王点评：我倒是觉得，这或许给浏览器漏洞又打开了一道大门，为什么不用内存安全的语言呢。
>
>
>

![](/data/attachment/album/202206/06/165712wgg6xkjmgsk6xm7z.jpg)

### 让区块链管理能源使其不再浪费能源

区块链技术最被人诟病地方之一是其能源浪费，大多数区块链需要计算机反复进行无意义的计算。明显的解决方案是将区块链建立在有用的计算之上，该解决方案必须难以计算，但容易验证。本周发布的一篇论文提供了一种选择。优化问题在计算方面是出了名的昂贵，但解决方案的质量相对容易评估。这里被优化的系统是小型电网，在能源分配中存在需要优化的地方：供应与需求相匹配，找出最经济的发电源组合。随着能源市场逐渐分散化，管理复杂性也在相应增加，而小型子电网可以通过区块链的计算优化进行自我管理。

>
> **[消息来源：Arstechnica](https://arstechnica.com/science/2022/06/making-blockchain-stop-wasting-energy-by-getting-it-to-manage-energy/)**
>
>
>

>
> 老王点评：这倒是一个有趣而值得探索的道路，不但可以部分解决能源浪费问题，而且有助于利用区块链的其它去中心化特性。
>
>
>


Linux Mint 接管 Timeshift 备份工具的开发，并作为一款 XApp 来维护

>
> Linux Mint 接管了 Timeshift 备份/恢复工具的开发。你可以在它新的 GitHub 仓库中找到它。
>
>
>

![linux mint](/data/attachment/album/202206/07/081803dllixdspa5aau8aa.jpg)

Timeshift 可以说是 [备份和恢复 Linux 系统的最佳工具](https://itsfoss.com/backup-restore-linux-timeshift/)。

Linux Mint 也利用它帮助用户在系统更新时更方便地创建快照，确保快捷无碍的操作。

当然，这不是 [Linux Mint 可能比 Ubuntu 更好的唯一原因](https://itsfoss.com/linux-mint-vs-ubuntu/)。

不幸的是，Timeshift 背后的开发者（[Tony George](https://teejeetech.com/)）计划把注意力集中在其他项目上，将不再继续维护这个项目。

Linux Mint 团队联系了这位开发者，并愿意为这个项目提供任何可能的帮助。最终，它们接管了 Timeshift 的开发。

所以，现在 Linux Mint 团队会对 Timeshift 的发布和修复，以及任何与之相关的开发工作负责。

### 将 Timeshift 调整成 XApp

![](/data/attachment/album/202206/07/081803zw14o4pww0wqwwrs.png)

Linux Mint 倾向于将某些应用作为“XApp”来维护，以确保它们能在各种不同的桌面环境下工作，不会依赖于某个特殊的桌面。

考虑到他们计划将 Timeshift 调整成一个XApp，你可以期待该工具在很长一段时间内维持当前的外观和功能，而不用顾虑你的桌面环境是什么。

不像一些 GNOME 应用程序，为了获得最好的体验，它们通常会变成 GNOME 专用的应用程序。

Timeshift 是一个必不可少的备份/恢复工具。所以，Linux Mint 接管 Timeshift 的开发并作为一个 XApp 来维护的计划听上去相当完美！

如果你想知道的话，那不妨告诉你，Timeshift 的迁移已经在 [Launchpad](https://github.com/linuxmint/timeshift) 上完成了。

新的 [GitHub仓库](https://github.com/linuxmint/timeshift)（由 Linux Mint 复刻的）可以给你提供这个应用的更多细节以及它最近的开发活动。

你也可以在 [最近每月发布的博文](https://blog.linuxmint.com/?p=4323) 中查阅官方对此的声明。

### 结语

作为 Timeshift 的维护者，Linux Mint 希望在不久的将来带来更多的新特性和改进。

你如何看待 Linux Mint 将 Timeshift 接管为一款 XApp？欢迎在下方的评论区内分享你的想法。

---

via: <https://news.itsfoss.com/linux-mint-timeshift/>

作者：[Ankush Das](https://news.itsfoss.com/author/ankush/) 选题：[lkxed](https://github.com/lkxed) 译者：[hadisi1993](https://github.com/%E8%AF%91%E8%80%85ID) 校对：[校对者ID](https://github.com/%E6%A0%A1%E5%AF%B9%E8%80%85ID)

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


Simula 诞生之前的面向对象程序设计

想象一下，你坐在河边，河岸上如茵绿草，不远处湍急河流；午后的阳光慵懒惬意，使人陷入冥想哲思，不觉开始思考眼前的河流是否真实存在。诚然，几米外确实有河水奔流而下。不过，我们所称为“河流”的存在究竟是什么呢？毕竟，河水奔流不息，一直处于变化之中。似乎，“河流”这个词无法指代任何固定不变的事物。

2009 年，Clojure 的创始人 <ruby> 里奇·希基 <rt>  Rich Hickey </rt></ruby> 发表了 [一场精彩的演讲](https://www.infoq.com/presentations/Are-We-There-Yet-Rich-Hickey)，探讨了为什么上文那样的哲学窘境会给面向对象程序的编程范式带来难题。他认为，人们看待计算机程序中的对象与看待河流的逻辑是一样的：我们想象对象是固定不变的，即使对象的许多或者说全部的属性都无时无刻不处于变化之中。所以，这种逻辑并不正确，我们无法区分在不同状态下同一对象实例的不同之处。程序中没有明确的时间的概念。人们只是单纯地用着同一个名字，以期在引用对象时，对象能够处于预期的状态中。这样，我们也就难免会遇到 <ruby> 故障 <rt>  bug </rt></ruby>。

希基总结道，这一难题的应对办法就是人们应该将世界建模成作用于不可变数据的 <ruby> 进程 <rt>  process </rt></ruby> 的集合，而不是可变的对象的集合。换句话说，我们应把每个对象看作一条“河流”，因果相连。总结说来，你应该使用 Clojure 等函数式语言。

![](/data/attachment/album/202206/07/111039fmwyq0lvqpplvlrx.jpg)

*作者在远足途中思考面向对象程序设计的本体论问题。*

自从希基发表演讲之后，人们对函数式编程语言的兴趣不断提升，主流的面向对象编程语言也大多都采用了函数式编程语言。尽管如此，大多数程序员依旧沿用自己的老一套，继续将对象实例化，不断改变其状态。这些人长此以往，很难做到用不同的视角看待编程。

我曾经想写一篇关于 Simula 的文章，大概会写到我们今天所熟知的面向对象的理念是何时又是如何应用到程序语言之中的。但是，我觉得写当初的 Simula 与如今的面向对象程序设计的 *迥然不同之处*，会更有趣一些，这我敢打包票。毕竟，我们现在熟知的面向对象程序设计还未完全成型。Simula 有两个主要版本：Simula I 和 Simula 67。Simula 67 为世界带来了 <ruby> 类 <rt>  class </rt></ruby>、 <ruby> 类的继承 <rt>  class hierarchy </rt></ruby> 以及 <ruby> 虚拟方法 <rt>  virtual method </rt></ruby>；但 Simula I 是一个初稿，它实验了如何能够将数据和进程捆绑起来的其他设想。Simula I 的模型不是希基提出的函数式模型，不过这一模型关注的是随时间展开的 *进程*，而非有着隐藏状态的对象之间的相互作用。如果 Simula 67 采用了 Simula I 的理念，那么我们如今所知的面向对象程序设计可能会大有不同——这类偶然性启示我们，不要想着现在的程序设计范式会一直占据主导地位。

### 从 Simula 0 到 Simula 67

Simula 是由两位挪威人 <ruby> 克里斯汀·尼加德 <rt>  Kristen Nygaard </rt></ruby> 和 <ruby> 奥利-约翰·达尔 <rt>  Ole-Johan Dahl </rt></ruby> 创建的。

20 世纪 50 年代末，尼加德受雇于 <ruby> 挪威防务科学研究中心 <rt>  Norwegian Defense Research Establishment </rt></ruby>（NDRE），该研究中心隶属于挪威军方。在那里，他负责设计 <ruby> 蒙特卡洛模拟方法 <rt>  Monte Carlo simulations </rt></ruby>，用于核反应堆设计与操作研究。最初，那些模拟实验是由人工完成的；后来，实验在 Ferranti Mercury 电脑    [1]  上编入程序运行。尼加德随后发现，将这些模拟实验输入电脑需要一种更有效的方式。

尼加德设计的这种模拟实验就是人们所知的“<ruby> 离散事件模型 <rt>  discrete event model </rt></ruby>”，这种模拟记录了一系列事件随着时间改变系统状态的进程。但是问题的关键在于模拟可以从一个事件跳跃到另一个事件中，因为事件是离散的，事件之间的系统不存在任何变化。根据尼加德和达尔在 1966 年发表的一篇关于 Simula 的论文，这种模型被迅速应用于“神经网络、通信系统、交通流量、生产系统、管理系统、社会系统等”    [2]  领域的分析。因此，尼加德认为，其他人描述模拟实验时，可能也需要更高层级的模型。于是他开始物色人才，帮助他完成他称之为“<ruby> 模拟语言 <rt>  Simulation Language </rt></ruby>”或者“<ruby> 蒙特卡洛编译器 <rt>  Monte Carlo Compiler </rt></ruby>”的项目    [3] 。

达尔当时也受雇于挪威防务科学研究中心，专攻语言设计，此时也加入了尼加德的项目，扮演“沃兹尼亚克”的角色（LCTT 译注：指苹果公司联合创始人斯蒂夫·盖瑞·沃兹尼亚克）。在接下来一年左右的时间，尼加德和达尔携手开发了 Simula 0 语言。   [4]  这一语言的早期版本仅仅是在 ALGOL 60 基础上进行的较小拓展，当时也只是打算将其用作预处理程序而已。当时的语言要比后来的编程语言抽象得多，其基本语言结构是“<ruby> 车站 <rt>  stations </rt></ruby>”与“<ruby> 乘客 <rt>  customers </rt></ruby>”，这些结构可以用于针对具体某些离散事件网络建立模型。尼加德和达尔给出了一个模拟飞机离港的例子。   [5]  但是尼加德和达尔最后想出了一个更加通用的语言结构，可以同时表示“车站”和“乘客”，也可以为更广泛的模拟建立模型。这是两个主要的概括，它改变了 Simula 作为 ALGOL 专属包的定位，使其转变为通用编程语言。

Simula I 没有“<ruby> 车站 <rt>  stations </rt></ruby>”和“<ruby> 乘客 <rt>  customers </rt></ruby>”的语言结构，但它可以通过使用“<ruby> 进程 <rt>  process </rt></ruby>”再现这些结构。（LCTT 译注：此处使用的“进程”，与当前计算机中用来指代一个已执行程序的实体的概念不同，大致上，你可以将本文中所说的“进程”理解为一种“对象”。）一个进程包含大量数据属性，这些属性与作为进程的 *操作规程* 的单个行为相联系。你可能会把进程当作是只有单个方法的对象，比如 `run()` 之类的。不过，这种类比并不全面，因为每个进程的操作规程都可以随时暂停、随时恢复，因为这种操作规程属于 <ruby> 协程 <rt>  coroutine </rt></ruby> 的一种。Simula I 程序会将系统建立为一套进程的模型，在概念上这些进程并行运行。实际上，一个时间点上能称为“当前进程”的只有一个进程。但是，一旦某个进程暂停运行，那么下一个进程就会自动接替它的位置。随着模拟的运行，Simula 会保持一个 “<ruby> 事件通知 <rt>  event notices </rt></ruby>” 的时间线，跟踪记录每个进程恢复的时间。为了恢复暂停运行的进程，Simula 需要记录多个 <ruby> 调用栈 <rt>  call stacks </rt></ruby> 的情况。这就意味着 Simula 无法再作为 ALGOL 的预处理程序了，因为 ALGOL 只有一个 <ruby> 调用栈 <rt>  call stacks </rt></ruby>。于是，尼加德和达尔下定决心，开始编写自己的编译器。

尼加德和达尔在介绍该系统的论文中，借助图示，通过模拟一个可用机器数量有限的工厂，阐明了其用法。   [6]  在该案例中，进程就好比订单：通过寻找可用的机器，订单得以发出；如果没有可用的机器，订单就会搁置；而一旦有机器空出来，订单就会执行下去。有一个订单进程的定义，用来实例化若干种不同的订单实例，不过这些实例并未调用任何方法。该程序的主体仅仅是创建进程，并使其运行。

历史上第一个 Simula I 编译器发布于 1965 年。尼加德和达尔在离开挪威防务科学研究中心之后，就进入了 <ruby> 挪威计算机中心 <rt>  Norwegian Computer Center </rt></ruby> 工作，Simula I 也是在这里日渐流行起来的。当时，Simula I 在 UNIVAC 公司的计算机和 Burroughs 公司的 B5500 计算机上均可执行。   [7]  尼加德和达尔两人与一家名为 ASEA 的瑞典公司达成了咨询协议，运用 Simula 模拟加工车间。但是，尼加德和达尔随后就意识到 Simula 也可以写一些和模拟完全不搭边的程序。

<ruby> 奥斯陆大学 <rt>  University of Oslo </rt></ruby>教授 <ruby> 斯坦因·克罗达尔 <rt>  Stein Krogdahl </rt></ruby> 曾写过关于 Simula 的发展史，称“真正能够促使新开发的通用语言快速发展的催化剂”就是 [一篇题为<ruby> 《记录处理》 <rt>  Record Handling </rt></ruby>的论文](https://archive.computerhistory.org/resources/text/algol/ACM_Algol_bulletin/1061032/p39-hoare.pdf)，作者是英国计算机科学家 <ruby> 查尔斯·安东尼·理查德·霍尔 <rt>  C.A.R. Hoare </rt></ruby>。   [8]  假如你现在读霍尔的这篇论文，你就不会怀疑这句话。当人们谈及面向对象语言的发展史时，一定会经常提起霍尔的大名。以下内容摘自霍尔的《记录处理》一文：

>
> 该方案设想，在程序执行期间，计算机内部存在任意数量的记录，每条记录都代表着程序员在过去、现在或未来所需的某个对象。程序对现有记录的数量保持动态控制，并可以根据当前任务的要求创建新的记录或删除现有记录。
>
>
> 计算机中的每条记录都必须属于数量有限但互不重合的记录类型中的一类；程序员可以根据需要声明尽可能多的记录类型，并借助标识符为各个类型命名。记录类型的命名可能是普通词汇，比如“牛”、“桌子”以及“房子”，同时，归属于这些类型的记录分别代表一头“牛”、一张“桌子”以及一座“房子”。
>
>
>

霍尔在这片论文中并未提到子类的概念，但是达尔由衷地感谢霍尔，是他引导了两人发现了这一概念。   [9]  尼加德和达尔注意到 Simula I 的进程通常具有相同的元素，所以引入父类来执行共同元素就会非常方便。这也强化了“进程”这一概念本身可以用作父类的可能性，也就是说，并非每种类型都必须用作只有单个操作规程的进程。这就是 Simula 语言迈向通用化的第二次飞跃，此时，Simula 67 真正成为了通用编程语言。正是如此变化让尼加德和达尔短暂地萌生了给 Simula 改名的想法，想让人们意识到 Simula 不仅仅可以用作模拟。   [10]  不过，考虑到 “Simula”这个名字的知名度已经很高了，另取名字恐怕会带来不小的麻烦。

1967 年，尼加德和达尔与 <ruby> 控制数据公司 <rt>  Control Data </rt></ruby> 签署协议，着手开发Simula 的新版本：Simula 67。同年六月份的一场会议中，来自控制数据公司、奥斯陆大学以及挪威计算机中心的代表与尼加德和达尔两人会面，意在为这门新语言制定标准与规范。最终，会议发布了 [《Simula 67 通用基础语言》](http://web.eah-jena.de/~kleine/history/languages/Simula-CommonBaseLanguage.pdf)，确定了该语言的发展方向。

Simula 67 编译器的开发由若干家供应商负责。<ruby> Simula 用户协会 <rt>  The Association of Simula Users </rt></ruby>（ASU）也随后成立，并于每年举办年会。不久，Simula 67 的用户就遍及了 23 个国家。   [11]

### 21 世纪的 Simula 语言

人们至今还记得 Simula，是因为后来那些取代它的编程语言都受到了它的巨大影响。到了今天，你很难找到还在使用 Simula 写程序的人，但是这并不意味着 Simula 已经从这个世界上消失了。得益于 [GNU cim](https://www.gnu.org/software/cim/)，人们在今天依然能够编写和运行 Simula 程序。

cim 编译器遵循 1986 年修订后的 Simula 标准，基本上也就是 Simula 67 版本。你可以用它编写类、子类以及虚拟方法，就像是在使用 Simula 67 一样。所以，用 Python 或 Ruby 轻松写出短短几行面向对象的程序，你照样也可以用 cim 写出来：

```
! dogs.sim ;
Begin
    Class Dog;
        ! The cim compiler requires virtual procedures to be fully specified ;
        Virtual: Procedure bark Is Procedure bark;;
    Begin
        Procedure bark;
        Begin
            OutText("Woof!");
            OutImage;           ! Outputs a newline ;
        End;
    End;

    Dog Class Chihuahua;        ! Chihuahua is "prefixed" by Dog ;
    Begin
        Procedure bark;
        Begin
            OutText("Yap yap yap yap yap yap");
            OutImage;
        End;
    End;

    Ref (Dog) d;
    d :- new Chihuahua;         ! :- is the reference assignment operator ;
    d.bark;
End;

```

你可以按照下面代码执行程序的编译与运行：

```
$ cim dogs.sim
Compiling dogs.sim:
gcc -g -O2 -c dogs.c
gcc -g -O2 -o dogs dogs.o -L/usr/local/lib -lcim
$ ./dogs
Yap yap yap yap yap yap

```

（你可能会注意到，cim 先将 Simula 语言编译为 C 语言，然后传递给 C 语言编译器。）

这就是 1967 年的面向对象程序设计，除了语法方面的不同，和 2019 年的面向对象程序设计并无本质区别。如果你同意我的这一观点，你也就懂得了为什么人们会认为 Simula 在历史上是那么的重要。

不过，我更想介绍一下 Simula I 的核心概念——进程模型。Simula 67 保留了进程模型，不过只有在使用 `Process` 类 和 `Simulation` 块的时候才能调用。

为了表现出进程是如何运行的，我决定模拟下述场景。想象一下，有这么一座住满了村民的村庄，村庄的旁边有条小河边，小河里有很多的鱼。但是，村里的村民却只有一条鱼竿。村民们胃口很大，每隔一个小时就饿了。他们一饿，就会拿着鱼竿去钓鱼。如果一位村民正在等鱼竿，另一位村民自然也用不了。这样一来，村民们就会为了钓鱼排起长长的队伍。假如村民要等五、六分钟才能钓到一条鱼，那么这样等下去，村民们的身体状况就会变得越来越差。再假如，一位村民已经到了骨瘦如柴的地步，最后他可能就会饿死。

这个例子多少有些奇怪，虽然我也不说不出来为什么我脑袋里最先想到的是这样的故事，但是就这样吧。我们把村民们当作 Simula 的各个进程，观察在有着四个村民的村庄里，一天的模拟时间内会发生什么。

完整程序可以通过此处 [GitHub Gist](https://gist.github.com/sinclairtarget/6364cd521010d28ee24dd41ab3d61a96) 的链接获取。

我把输出结果的最后几行放在了下面。我们来看看一天里最后几个小时发生了什么：

```
1299.45: 王五饿了，要了鱼竿。
1299.45: 王五正在钓鱼。
1311.39: 王五钓到了一条鱼。
1328.96: 赵六饿了，要了鱼竿。
1328.96: 赵六正在钓鱼。
1331.25: 李四饿了，要了鱼竿。
1340.44: 赵六钓到了一条鱼。
1340.44: 李四饿着肚子等着鱼竿。
1340.44: 李四在等鱼竿的时候饿死了。
1369.21: 王五饿了，要了鱼竿。
1369.21: 王五正在钓鱼。
1379.33: 王五钓到了一条鱼。
1409.59: 赵六饿了，要了鱼竿。
1409.59: 赵六正在钓鱼。
1419.98: 赵六钓到了一条鱼。
1427.53: 王五饿了，要了鱼竿。
1427.53: 王五正在钓鱼。
1437.52: 王五钓到了一条鱼。

```

可怜的李四最后饿死了，但是他比张三要长寿，因为张三还没到上午 7 点就饿死了。赵六和王五现在一定过得很好，因为需要鱼竿的就只剩下他们两个了。

这里，我要说明，这个程序最重要的部分只是创建了进程（四个村民），并让它们运行下去。各个进程操作对象（鱼竿）的方式与我们今天对对象的操作方式相同。但是程序的主体部分并没有调用任何方法，也没有修改进程的任何属性。进程本身具有内部状态，但是这种内部状态的改变只有进程自身才能做到。

在这个程序中，仍然有一些字段发生了变化，这类程序设计无法直接解决纯函数式编程所能解决的问题。但是正如克罗达尔所注意到的那样，“这一机制引导进行模拟的程序员为底层系统建立模型，生成一系列进程，每个进程表示了系统内的自然事件顺序。”   [12]  我们不是主要从名词或行动者（对其他对象做事的对象）的角度来思考正在进行的进程。我们可以将程序的总控制权交予 Simula 的事件通知系统，克罗达尔称其为 “<ruby> 时间管理器 <rt>  time manager </rt></ruby>”。因此，尽管我们仍然在适当地改变进程，但是没有任何进程可以假设其他进程的状态。每个进程只能间接地与其他进程进行交互。

这种模式如何用以编写编译器、HTTP 服务器以及其他内容，尚且无法确定。（另外，如果你在 Unity 游戏引擎上编写过游戏，就会发现两者十分相似。）我也承认，尽管我们有了“时间管理器”，但这可能并不完全是希基的意思，他说我们在程序中需要一个明确的时间概念。（我认为，希基想要的类似于 [<ruby> 阿达·洛芙莱斯 <rt>  Ada Lovelace </rt></ruby> 用于区分一个变量随时间变化产生的不同数值的上标符号](https://twobithistory.org/2018/08/18/ada-lovelace-note-g.html)。）尽管如此，我们可以发现，面向对象程序设计前期的设计方式与我们今天所习惯的面向对象程序设计并非完全一致，我觉得这一点很有意思。我们可能会理所当然地认为，面向对象程序设计的方式千篇一律，即程序就是对事件的一长串记录：某个对象以特定顺序对其他对象产生作用。Simula I 的进程系统表明，面向对象程序设计的方式不止一种。仔细想一下，函数式语言或许是更好的设计方式，但是 Simula I 的发展告诉我们，现代面向对象程序设计被取代也很正常。

*如果你喜欢这篇文章，欢迎关注推特 [@TwoBitHistory](https://twitter.com/TwoBitHistory)，也可通过 [RSS feed](https://twobithistory.org/feed.xml) 订阅，获取最新文章（每四周更新一篇）。*

---

1. Jan Rune Holmevik, “The History of Simula,” accessed January 31, 2019, <http://campus.hesge.ch/daehne/2004-2005/langages/simula.htm>. [↩](#fnref1)
2. Ole-Johan Dahl and Kristen Nygaard, “SIMULA—An ALGOL-Based Simulation Langauge,” Communications of the ACM 9, no. 9 (September 1966): 671, accessed January 31, 2019, <http://citeseerx.ist.psu.edu/viewdoc/download?doi=10.1.1.95.384&rep=rep1&type=pdf>. [↩](#fnref2)
3. Stein Krogdahl, “The Birth of Simula,” 2, accessed January 31, 2019, <http://heim.ifi.uio.no/~steinkr/papers/HiNC1-webversion-simula.pdf>. [↩](#fnref3)
4. 出处同上。 [↩](#fnref4)
5. Ole-Johan Dahl and Kristen Nygaard, “The Development of the Simula Languages,” ACM SIGPLAN Notices 13, no. 8 (August 1978): 248, accessed January 31, 2019, <https://hannemyr.com/cache/knojd_acm78.pdf>. [↩](#fnref5)
6. Dahl and Nygaard (1966), 676. [↩](#fnref6)
7. Dahl and Nygaard (1978), 257. [↩](#fnref7)
8. Krogdahl, 3. [↩](#fnref8)
9. Ole-Johan Dahl, “The Birth of Object-Orientation: The Simula Languages,” 3, accessed January 31, 2019, <http://www.olejohandahl.info/old/birth-of-oo.pdf>. [↩](#fnref9)
10. Dahl and Nygaard (1978), 265. [↩](#fnref10)
11. Holmevik. [↩](#fnref11)
12. Krogdahl, 4. [↩](#fnref12)

---

via: <https://twobithistory.org/2019/01/31/simula.html>

作者：[Two-Bit History](https://twobithistory.org) 选题：[lujun9972](https://github.com/lujun9972) 译者：[aREversez](https://github.com/aREversez) 校对：[校对者ID](https://github.com/%E6%A0%A1%E5%AF%B9%E8%80%85ID)

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


如何修复 “yay: error while loading shared libraries: libalpm.so.12”

![](/data/attachment/album/202206/07/144052x9tpvo93zhthdh6x.jpg)

>
> 这篇快速指南是为了帮助你修复 “yay error: while loading shared libraries: libalpm.so.12” 错误。
>
>
>

如果你在系统中运行 [Arch Linux](https://archlinux.org/) 的时间比较长，那么由于其滚动发布性质以及你的硬件支持，程序可能会损坏。 如果你使用 AUR 助手 Yay，那么有时，由于其他软件包的多次安装升级，Yay 可能会损坏。

Yay 助手一般是非常稳定的，但有时它会被搞乱，在修复好之前，你不能使用它安装任何程序。而其中一个令人头疼的错误是这样的：

```
yay: error while loading shared libraries: libalpm.so.12: cannot open shared object file: No such file or directory

```

这个错误特别是在升级到 pacman 6.0 后出现的，因为共享库不兼容。

![error while loading shared libraries - yay](/data/attachment/album/202206/07/144111roz7e1f3i3vhwfj3.jpg)

### 如何解决 “yay: error while loading shared libraries: libalpm.so.12”

这个错误只能通过完全卸载 `yay` 来解决，包括它的依赖。然后重新安装 `yay`。

没有其他方法来解决这个错误。

我们已经有一个 [如何安装 Yay](https://www.debugpoint.com/2021/01/install-yay-arch/) 的指南，然而，以下是修复的步骤。

从 AUR 克隆 yay 仓库并构建。在终端窗口中依次运行以下命令。

```
cd /tmp
git clone 'https://aur.archlinux.org/yay.git'
cd /tmp/yay
makepkg -si
cd ~
rm -rf /tmp/yay/

```

安装完成后，你可以尝试运行给你带来这个错误的命令。然后就好了。如果你仍然有这个错误，请在下面的评论区告诉我。

很多人都遇到了这个问题，网络上有 [几个讨论](https://github.com/Jguer/yay/issues/1519)。以上是解决这个错误的唯一办法。而且我在任何地方都找不到这个问题的确切根源，除了它是在 pacman 6.0 更新后开始的。

---

via: <https://www.debugpoint.com/2021/07/yay-error-libalpm-so-12/>

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

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


硬核观察 #660 真“人工”智能：AI 购物创业公司的 AI 由廉价工人充当

Summary: • 真“人工”智能：AI 购物创业公司的 AI 由廉价工人充当 • 英特尔探索在 Z 级超算中使用 RISC-V 架构 • Edge 浏览器的睡眠标签功能已节省 273PB 内存

![](/data/attachment/album/202206/07/183740o6vugjauvj6a3uul.jpg)

![](/data/attachment/album/202206/07/183754k2c63ph3de33lkpz.jpg)

### 真“人工”智能：AI 购物创业公司的 AI 由廉价工人充当

一家 AI 购物创业公司 Nate 宣称可以在零售商的网站上自动填写购物者的联系信息和支付信息。这可以省去客户在手机上输入一两分钟数据的麻烦，为此，Nate 向购物者收取每笔交易 1 美元的费用。据消息人士透露，实际上该公司在 2021 年促成的大部分交易都是依靠在菲律宾雇佣的工人手动在零售商网站上输入数据。有时候，订单是在客户点击购买按钮的几个小时之后，才由“人工”智能下达。

>
> **[消息来源：theInformation](https://www.theinformation.com/articles/shaky-tech-and-cash-burning-giveaways-ai-shopping-startup-shows-excesses-of-funding-boom)**
>
>
>

>
> 老王点评：除了速度慢点，这其实是名副其实的“人工”智能嘛~
>
>
>

![](/data/attachment/album/202206/07/183806s77nzqo7mikl78m7.jpg)

### 英特尔探索在 Z 级超算中使用 RISC-V 架构

英特尔和巴塞罗那超算中心宣布将投资 4 亿欧元，探索在 Zettascale 级（即超过 1 zettaflops 或超过一千 exaflops）超算中使用 RISC-V 架构。联合实验室将开发基于 RISC-V 架构的处理器，用于 AI 加速器、自主驾驶汽车和高性能计算。但这并不意味着英特尔会在其首批 Zettascale 级超算中使用基于 RISC-V 的 CPU，而只是表示该公司对 RISC-V 架构技术的投资，英特尔去年宣布到 2027 年时建造首台 Zettascale 级超算。

>
> **[消息来源：TomsHardware](https://www.tomshardware.com/news/intel-to-explore-risc-v-isa-for-zettascale-supercomputers)**
>
>
>

>
> 老王点评：前两天才刚刚 E 级超算登顶，过两年就要 Z 级了？！而且是在 RISC-V 上，看来 RISC-V 很有前景啊。前段时间，我在国内 RISV-V 初创公司赛昉科技的朋友还专门送了我一块他们的 RISC-V 板子 VisionFive，我过两天拍个开箱视频给大家。
>
>
>

![](/data/attachment/album/202206/07/183824f1rnrnnppu6rn6h5.jpg)

### Edge 浏览器的睡眠标签功能已节省 273PB 内存

微软 Edge 官方账号表示，在过去 28 天时间里，“睡眠标签”功能节省了超过 273PB（273000 TB）的内存。睡眠标签功能在超过 60 亿个标签中发挥了作用，每个标签节省了大约 40MB 的内存。睡眠标签在所有安装的 Edge 上都是默认启用的。它在闲置两小时后会自动让不活动的网页进入睡眠状态。

>
> **[消息来源：Neowin](https://www.neowin.net/news/microsoft-says-sleeping-tabs-in-edge-saved-more-than-273-petabytes-of-ram-in-28-days/)**
>
>
>

>
> 老王点评：这个功能是不错，不过没想到这个宣传可以将节省的内存加起来算，要这么算，不如 Chrome 出来说说过去一个月总计用了多少内存吧。
>
>
>


Fedora Linux 37 的内核 5.18 测试周到了，一起来做贡献吧！

Summary: 在测试周，任何人都可以为 Fedora 即将发布的版本查漏补缺

在测试周，任何人都可以为 Fedora 即将发布的版本查漏补缺

![](/data/attachment/album/202206/08/091147zg252mo6bb5k5up9.jpg)

Fedora 内核团队正在为 Linux 内核 5.18 进行最终集成。这个版本刚刚发布，很快就会出现在 Fedora 中。因此，Fedora 内核和 QA 团队组织了一个测试周，截止日期为 **2022 年 6 月 12 日，星期日。** 请参阅 [维基页面](http://fedoraproject.org/wiki/Test_Day:2022-06-05_Kernel_5.18_Test_Week) 来获取你将要参与的测试镜像链接。继续阅读下文，可了解更多细节～

### 测试周是如何运作的？

测试周是一个人人都可以参与的活动。在测试周，任何人都可以为 Fedora 即将发布的版本查漏补缺，确保它最终能够运行良好。Fedora 社区成员会经常参与这个活动，我们同时也欢迎公众参加这些活动。如果你以前从未做过贡献，那么这是一个绝佳的上手机会。

要想做出贡献，你只需要能够执行以下操作即可：

* 下载测试资料，包括一些大文件
* 阅读并按照说明一步一步地进行操作

内核测试日的 [维基页面](http://fedoraproject.org/wiki/Test_Day:2022-06-05_Kernel_5.18_Test_Week) 提供了很多关于测试内容和测试方法的有用信息。完成一些测试后，你可以在测试日的 [Web 应用](https://testdays.fedoraproject.org/events/136) 上记录下你的测试结果。如果你在活动的当天或前后有空，请进行一些测试并报告你的结果。不知道该怎么做？没关系，我们有一份文件，其中提供了 [所有步骤](https://docs.fedoraproject.org/en-US/quick-docs/kernel/howto-kernel-testday/)。

希望能在测试日见到你，预祝测试愉快～

---

via: <https://fedoramagazine.org/contribute-at-the-fedora-linux-37-test-week-for-kernel-5-18/>

作者：[Sumantro Mukherjee](https://fedoramagazine.org/author/sumantrom/) 选题：[lkxed](https://github.com/lkxed) 译者：[lkxed](https://github.com/lkxed) 校对：[wxy](https://github.com/wxy)

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


在商业之外，为学生们教授开源知识

Summary: Beyond 计划连接起未来科技行业的人才和开源文化。

Beyond 计划连接起未来科技行业的人才和开源文化。

>
> Beyond 计划连接起未来科技行业的人才和开源文化。
>
>
>

![](/data/attachment/album/202206/08/095200eezhuq7ssd4x4d66.jpg "Teacher or learner?")

那时，我还是一个大学生，我不明白人们为什么那么吹捧开源软件。我也使用 Linux 和开源软件，但是我不明白开源的运作模式，不知道如何参加一个开源项目，也不知道这对我未来的职业有什么好处。我的开发经验主要是家庭作业和学位需要的一个大型期末项目。

所以，当我开始踏足科技行业时，我发现我还有很多知识需要学习。我需要了解如何加入一个既定的、可能很大并且分散在不同地方的团队，为一个正在进行中的项目工作。我还要学会正确的沟通以保证我付出的努力不白费。

在这方面，我并不特别。我只是众多毕业生中的一员。

### 开源让毕业生的起点更高

作为一个工程师，一个管理者，从那时起我开始帮助刚入行的工程师。我发现，有开源经验的毕业生比没有开源经验的毕业生能更快的入门。

通过将开源方法纳入学术研究，学生们可以获得相关的行业经验，学会利用他们自己的知识，并建立一个陈述观点和分享知识的平台。参与开源项目可以对学生的技术知识和经验产生积极影响。这可以帮助他们更好的规划自己的职业生涯。

开源在科技行业的价值是公认的，它塑造了全球软件公司的文化。参与开源项目并采用 [开放组织文化](https://opensource.com/open-organization/resources/open-org-definition) 正在成为行业普遍现象。公司寻求知道如何在开源领域工作并培养其文化的思想新颖、才华横溢的员工。因此，科技行业必须推动学术界将开源文化作为学习科技研究的基本方法之一。

### 商业之上是开源文化

当我遇到红帽的高级软件工程师 [Liora Milbaum](https://www.linkedin.com/in/lioramilbaum) 时，我发现，我们对将开源文化和规则引入学术界有着共同的兴趣。Liora 之前创立了 [DevOps Loft](https://www.devopsloft.io/), 在其中，她与有兴趣进入这个行业的人们分享了 DevOps 实践，并希望发起一个类似的项目，教授大学生开源。我们决定启动 [Beyond](https://research.redhat.com/blog/2020/05/24/open-source-development-course-and-devops-methodology/) 计划，将科技行业拥抱开源精神的人才与红帽的实践联系起来。

我们在 [Tel Aviv-Yafo 技术学院](https://www.int.mta.ac.il/) 开始了 Beyond 计划，在那里，我们受到了信息系统学院的热烈欢迎。我们从介绍 DevOps 技术栈的 “DevOps 入门” 开始。我们开始时最大的挑战是怎么讲明白开源是什么。答案似乎很简单：实践出真理。我们不想给学生们讲授什么老套的学院课程，相反，我们想让学生接触到行业标准。

我们创建了一个包含常见的开源项目和工具的教学大纲来教授 DevOps 技术栈。该课程由工程师教授的讲座和实践组成。学生们被分成小组，每组都由一名工程师指导和支持。他们练习团队合作，分享知识（在团队内外），并有效的协作。

在我们为计算机科学学院的通讯准备的高级课程 “开源开发的基础” 中，我们遇到了另外的困难。当我们的课程开始两周以后，随着新冠疫情在全球的流行，我们完全靠远程沟通。我们通过与学生一起使用我们在红帽日常工作中使用的相同远程协作工具解决了这个问题。我们惊讶于过渡的是如此简单和顺利。

![Beyond teaching online](/data/attachment/album/202206/08/095203z9l8p8oxbwola9h8.png "Beyond teaching online")

(Irit Goihman, [CC BY-SA 4.0](https://creativecommons.org/licenses/by-sa/4.0/))

### 成果展示

这两个课程取得了巨大的成功，我们甚至雇佣了我们最优秀的学生之一。我们收到了非常棒的反馈，同学们表示，我们对他们的知识、思维和软技能产生了积极影响。一些学生因为在课程期间的开源贡献而得到了他们第一份技术工作。

其他学术机构对这些课程表达出了极大的兴趣，因此我们将这个项目扩展到了另外一所大学。

很荣幸，在一群优秀工程师的参与下，与 Liora 一起领导这个成功的项目。我们一起助力开源社区的成长。

---

via: <https://opensource.com/article/21/1/open-source-beyond-business>

作者：[Irit Goihman](https://opensource.com/users/iritgoihman) 选题：[lujun9972](https://github.com/lujun9972) 译者：[duoluoxiaosheng](https://github.com/duoluoxiaosheng) 校对：[wxy](https://github.com/wxy)

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


不同编程语言是如何完成同一件事

Summary: 通过一个简单的小游戏比较 13 种编程语言。

通过一个简单的小游戏比较 13 种编程语言。

>
> 通过一个简单的小游戏比较 13 种编程语言。
>
>
>

![](/data/attachment/album/202206/08/113845fs81srd5s8rjryt5.jpg "Developing code.")

当我开始学习一种新的编程语言时，会把重点放在定义变量、书写声明以及计算表达式，一旦对这些概念有一个大致的了解，通常就能够自己弄清剩下的部分。大多数编程语言都具有相似性，所以如果你掌握了一种编程语言，学习下一种语言的重点就是弄清楚独有的概念以及区分不同。

我喜欢写一些测试程序来帮助练习新的编程语言。其中我经常写的是一个叫做“猜数字”的小游戏，计算机选出 1 到 100 里的任一数字，然后我来猜。程序循环进行，直到猜出正确数字。通过伪代码可以看出，这是个非常简单的程序：

* 计算机在 1 到 100 之间选出一个随机数字
* 循环进行直到猜出该随机数字
	+ 计算机读取我的猜测
	+ 告诉我我的猜测过高还是过低

我们发表了一些文章，用不同的语言写这个程序。这是一个比较不同语言做同样事情的有趣机会。大多数编程语言具有相似性，所以当你在学习下一种新的编程语言时，主要是学习它的独特之处。

C 语言由 Dennis Ritchie 于 1972 年在贝尔实验室创建，是一种早期的通用编程语言。C 语言非常受欢迎，并迅速成为 Unix 系统上的标准编程语言。正是因为它的流行，许多其他编程语言也采用了类似的编程语法。这就是为什么如果你已经知道如何使用 C 语言编程，学习 C++、Rust、Java、Groovy、JavaScript、awk 或 Lua 会更容易。

接下来我们看看这些不同的编程语言是如何实现 “猜数字” 游戏的主要步骤。我将把重点放在基本元素的相似或不同，跳过一些外围代码，如分配临时变量。

### 计算机在 1 到 100 之间选出一个随机数字

你可以看到这里有许多相似之处。大多数编程语言使用类似 `rand()` 的函数，你可以设定一个范围来生成随机数。而其他一些语言使用一个特殊的函数来设定范围生成随机数。

C：

```
// Using the Linux `getrandom` system call
getrandom(&randval, sizeof(int), GRND_NONBLOCK);
number = randval % maxval + 1;

// Using the standard C library
number = rand() % 100 + 1;

```

C++：

```
int number = rand() % 100+1;

```

Rust：

```
let random = rng.gen_range(1..101);

```

Java：

```
private static final int NUMBER = r.nextInt(100) + 1;

```

Groovy：

```
int randomNumber = (new Random()).nextInt(100) + 1

```

JavaScript：

```
const randomNumber = Math.floor(Math.random() * 100) + 1

```

awk：

```
randomNumber = int(rand() * 100) + 1

```

Lua：

```
number = math.random(1,100)

```

### 循环进行直到我猜出该随机数字

循环通常是用控制流程来实现的，如 `while` 或 `do-while`。JavaScript 中的实现没有使用循环，而是 “实时 ”更新 HTML 页面，直到用户猜出正确的数字。Awk 虽然支持循环，但是通过循环读取输入信息是没有意义的，因为 Awk 是基于数据管道的，所以它从文件而不是直接从用户读取输入信息。

C：

```
do {
    …
} while (guess != number);

```

C++：

```
do {
    …
} while ( number != guess );

```

Rust：

```
for line in std::io::stdin().lock().lines() {
    …
    break;
}

```

Java：

```
while ( guess != NUMBER ) {
    …
}

```

Groovy：

```
while ( … ) {
    …
    break;
}

```

Lua：

```
while ( player.guess ~= number ) do
    …
end

```

### 计算机读取我的猜测

不同编程语言对输入的处理方式不同。例如，JavaScript 直接从 HTML 表单中读取数值，而 Awk 则从数据管道中读取数据。

C：

```
scanf("%d", &guess);

```

C++：

```
cin >> guess;

```

Rust：

```
let parsed = line.ok().as_deref().map(str::parse::<i64>);
if let Some(Ok(guess)) = parsed {
    …
}

```

Java：

```
guess = player.nextInt();

```

Groovy：

```
response = reader.readLine()
int guess = response as Integer

```

JavaScript：

```
let myGuess = guess.value

```

Awk：

```
guess = int($0)

```

Lua：

```
player.answer = io.read()
player.guess = tonumber(player.answer)

```

### 告诉我猜测过高还是过低

在这些类 C 语言中，通常是通过 `if` 语句进行比较的。每种编程语言打印输出的方式有一些变化，但打印语句在每个样本中都是可识别的。

C：

```
if (guess < number) {
    puts("Too low");
}
else if (guess > number) {
    puts("Too high");
}
…
puts("That's right!");

```

C++：

```
if ( guess > number) { cout << "Too high.\n" << endl; }
else if ( guess < number ) { cout << "Too low.\n" << endl; }
else {
    cout << "That's right!\n" << endl;
    exit(0);
}

```

Rust：

```
_ if guess < random => println!("Too low"),
_ if guess > random => println!("Too high"),
_ => {
    println!("That's right");
    break;
}

```

Java：

```
if ( guess > NUMBER ) {
    System.out.println("Too high");
} else if ( guess < NUMBER ) {
    System.out.println("Too low");
} else {
    System.out.println("That's right!");
    System.exit(0);
}

```

Groovy：

```
if (guess < randomNumber)
    print 'too low, try again: '
else if (guess > randomNumber)
    print 'too high, try again: '
else {
    println "that's right"
    break
}

```

JavaScript：

```
if (myGuess === randomNumber) {
    feedback.textContent = "You got it right!"
} else if (myGuess > randomNumber) {
    feedback.textContent = "Your guess was " + myGuess + ". That's too high. Try Again!"
} else if (myGuess < randomNumber) {
    feedback.textContent = "Your guess was " + myGuess + ". That's too low. Try Again!"
}

```

Awk：

```
if (guess < randomNumber) {
    printf "too low, try again:"
} else if (guess > randomNumber) {
    printf "too high, try again:"
} else {
    printf "that's right\n"
    exit
}

```

Lua：

```
if ( player.guess > number ) then
    print("Too high")
elseif ( player.guess < number) then
    print("Too low")
else
    print("That's right!")
    os.exit()
end

```

### 非类 C 编程语言会怎么样呢？

非类 C 编程语言会有很大的不同，需要学习特定的语法来完成每一步。Racket 源于 Lisp 和 Scheme，所以它使用 Lisp 的前缀符和大量括号。Python 使用空格而不是括号来表示循环之类的块。Elixir 是一种函数式编程语言，有自己的语法。Bash 是基于 Unix 系统中的 Bourne shell，它本身借鉴了 Algol68，并支持额外的速记符，如 `&&` 作为 `and` 的变体。Fortran 是在使用打孔卡片输入代码的时期创建的，所以它依赖于一些重要列的 80 列布局。

我将通过比较 `if` 语句，举例表现这些编程语言的不同。`if` 判断一个值是否小于或大于另一个值，并向用户打印适当信息。

Racket：

```
(cond [(> number guess) (displayln "Too low") (inquire-user number)]
    [(< number guess) (displayln "Too high") (inquire-user number)]
    [else (displayln "Correct!")]))

```

Python：

```
if guess < random:
    print("Too low")
elif guess > random:
    print("Too high")
else:
    print("That's right!")

```

Elixir：

```
cond do
    guess < num ->
        IO.puts "Too low!"
        guess_loop(num)
    guess > num ->
        IO.puts "Too high!"
        guess_loop(num)
    true ->
        IO.puts "That's right!"
end

```

Bash：

```
[ "0$guess" -lt $number ] && echo "Too low"
[ "0$guess" -gt $number ] && echo "Too high"

```

Fortran：

```
IF (GUESS.LT.NUMBER) THEN
    PRINT *, 'TOO LOW'
ELSE IF (GUESS.GT.NUMBER) THEN
    PRINT *, 'TOO HIGH'
ENDIF

```

### 更多

当你在学习一种新的编程语言时 “猜数字” 游戏是一个很友好的入门程序，通过一种简单的方式练习了几个常见的编程概念。通过不同编程语言实现这个简单游戏，你可以理解一些核心概念和每种语言的细节。

学习如何用 C 和类 C 语言编写 “猜数字” 游戏：

* [C](https://opensource.com/article/21/1/learn-c)， Jim Hall
* [C++](https://opensource.com/article/20/12/learn-c-game)， Seth Kenlon
* [Rust](https://opensource.com/article/20/12/learn-rust)， Moshe Zadka
* [Java](https://opensource.com/article/20/12/learn-java)， Seth Kenlon
* [Groovy](https://opensource.com/article/20/12/groovy)， Chris Hermansen
* [JavaScript](https://opensource.com/article/21/1/learn-javascript)， Mandy Kendall
* [awk](https://opensource.com/article/21/1/learn-awk)， Chris Hermansen
* [Lua](https://opensource.com/article/20/12/lua-guess-number-game)， Seth Kenlon

其他语言：

* [Racket](https://opensource.com/article/21/1/racket-guess-number)， Cristiano L. Fontana
* [Python](https://opensource.com/article/20/12/learn-python)， Moshe Zadka
* [Elixir](https://opensource.com/article/20/12/elixir)， Moshe Zadka
* [Bash](https://opensource.com/article/20/12/learn-bash)， Jim Hall
* [Fortran](https://opensource.com/article/21/1/fortran)， Jim Hall

---

via: <https://opensource.com/article/21/4/compare-programming-languages>

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

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


硬核观察 #661 下一代 CarPlay 将成为汽车操作系统

Summary: • 下一代 CarPlay 将成为汽车操作系统 • 欧盟同意采用通用充电器端口 • MacOS 将很快默认阻止未知的 USB-C 配件

![](/data/attachment/album/202206/08/164925qisqc227schqx22d.jpg)

![](/data/attachment/album/202206/08/164934ml4462ryffw4mnn4.jpg)

### 下一代 CarPlay 将成为汽车操作系统

苹果公司表示，下一代 CarPlay 作为一个完整的车辆界面，可以对车辆进行前所未有的控制，并能获得每辆主机车辆产生的数据。CarPlay 将兼容各种长宽比的显示，与所有主机车辆的系统更加整合。除了目前的导航和媒体功能外，还将处理传统的仪表，如速度表、转速表、温度表和燃料或电动车电量显示等。用户将能够调整他们的空调、座椅加热，甚至直接连接到苹果的智能家居技术。苹果公司称，第一批支持新的 CarPlay 的车辆应该在 2023 年底公布，其合作伙伴包括奥迪、福特、本田、林肯、梅赛德斯-奔驰、日产、保时捷等。

>
> **[消息来源：CNET](https://www.cnet.com/roadshow/news/next-generation-apple-carplay-wwdc-2022-preview/)**
>
>
>

>
> 老王点评：看起来真是将汽车变成了手机配件了。
>
>
>

![](/data/attachment/album/202206/08/164943p2p0hgkdnp7uu776.jpg)

### 欧盟同意采用通用充电器端口

欧盟立法者周二达成协议，要求在欧盟销售的智能手机等便捷式电子设备必须采用通用充电器端口。欧盟预计将在今年晚些时候正式批准该协议，从 2024 年秋季开始执行这一规定。该通用充电标准基于 USB Type-C，这一协议将对苹果产生不利影响。该公司仍然使用自己的雷雳连接器为 iPhone 充电，虽然该公司最近为 iPad 和 MacBook 配备了 USB-C 接口。苹果公司曾表示，“只规定一种类型的连接器的严格监管扼杀了创新，而不是鼓励创新”。

>
> **[消息来源：CNBC](https://www.cnbc.com/2022/06/07/eu-makes-usb-c-mandatory-for-apple-iphones-and-other-devices.html)**
>
>
>

>
> 老王点评：虽然 Type-C 也有很多外形一样，但是协议不同的接口，但是总比各种不同接口的充电线要好。让我们看看苹果是只在欧洲推出 Type-C 充电接口还是会在全球改变。
>
>
>

![](/data/attachment/album/202206/08/164956sfac3eumafr7qul7.jpg)

### MacOS 将很快默认阻止未知的 USB-C 配件

苹果公司即将推出的 macOS 13 Ventura 中的一项新的安全功能将自动阻止新的 USB-C 设备与操作系统进行通信，直到该配件能够得到用户的认可。该功能将在默认情况下启用。但这不适用于电源适配器、独立显示器和与 已批准的集线器的连接，而且即使你不批准该附件，该设备仍然可以充电。

>
> **[消息来源：Techcrunch](https://techcrunch.com/2022/06/07/macos-usb-accessory-security/)**
>
>
>

>
> 老王点评：有一定的作用，不过我觉得仅仅是让用户同意连接，对于恶意 USB 外设的防御还是不够的。
>
>
>


机器学习：使用 Python 进行预测

Summary: 机器学习基本上是人工智能的一个子集，它使用以前存在的数据对新数据进行预测。

机器学习基本上是人工智能的一个子集，它使用以前存在的数据对新数据进行预测。

>
> 机器学习基本上是人工智能的一个子集，它使用以前存在的数据对新数据进行预测。
>
>
>

当然，现在我们所有人都知道这个道理了！这篇文章展示了如何将 Python 中开发的机器学习模型作为 Java 代码的一部分来进行预测。

![Machine-learning](/data/attachment/album/202206/09/085208msb4pq48eclzee1l.jpg)

本文假设你熟悉基本的开发技巧并理解机器学习。我们将从训练我们的模型开始，然后在 Python 中制作一个机器学习模型。

我以一个洪水预测模型为例。首先，导入以下库：

```
import pandas as pd
import numpy as np
import matplotlib.pyplot as plt

```

当我们成功地导入了这些库，我们就需要输入数据集，如下面的代码所示。为了预测洪水，我使用的是河流水位数据集。

```
from google.colab import files
uploaded = files.upload()
for fn in uploaded.keys():
    print('User uploaded file "{name}" with length {length} bytes'.format(name=fn, length=len(uploaded[fn])))

```

如果没有选择文件的话，选择上传的文件。

只有在当前浏览器会话中执行了该单元格时，上传部件才可用。请重新运行此单元，上传文件 `Hoppers Crossing-Hourly-River-Level.csv`，大小 2207036 字节。

完成后，我们就可以使用 `sklearn` 库来训练我们的模型。为此，我们首先需要导入该库和算法模型，如图 1 所示。

![Figure 1: Training the model](/data/attachment/album/202206/09/085208mduzu1b9je97j5e1.jpg)

```
from sklearn.linear_model import LinearRegression
regressor = LinearRegression()
regressor.fit(X_train, y_train)

```

完成后，我们就训练好了我们的模型，现在可以进行预测了，如图 2 所示。

![Figure 2: Making predictions](/data/attachment/album/202206/09/085209sb8picj8nm9bn9gk.jpg)

### 在 Java 中使用 ML 模型

我们现在需要做的是把 ML 模型转换成一个可以被 Java 程序使用的模型。有一个叫做 `sklearn2pmml` 的库可以帮助我们做到这一点：

```
# Install the library
pip install sklearn2pmml

```

库安装完毕后，我们就可以转换我们已经训练好的模型，如下图所示：

```
sklearn2pmml(pipeline, ‘model.pmml’, with_repr = True)

```

这就完成了！我们现在可以在我们的 Java 代码中使用生成的 `model.pmml` 文件来进行预测。请试一试吧！

（LCTT 译注：Java 中有第三方库 [jpmml/jpmml-evaluator](https://github.com/jpmml/jpmml-evaluator)，它能帮助你使用生成的 `model.pmml` 进行预测。）

---

via: <https://www.opensourceforu.com/2022/05/using-a-machine-learning-model-to-make-predictions/>

作者：[Jishnu Saurav Mittapalli](https://www.opensourceforu.com/author/jishnu-saurav-mittapalli/) 选题：[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/) 荣誉推出


编译代码时动态地链接库

Summary: 编译软件在你如何运行你的系统方面给你很大的灵活性。LD_LIBRARY_PATH 变量，以及 GCC 的 -L 和 -l 选项，是这种灵活性的组成部分。

![](/data/attachment/album/202206/09/094633ekluugjjzailicja.jpg)

>
> 编译软件在你如何运行你的系统方面给你很大的灵活性。`LD_LIBRARY_PATH` 变量，以及 GCC 的 `-L` 和 `-l` 选项，是这种灵活性的组成部分。
>
>
>

编译软件是开发者经常做的事情，在开源世界中，一些用户甚至选择自己动手。Linux 播客 Dann Washko 称源码为“通用包格式”，因为它包含了使一个应用在任何平台上运行所需的所有组件。当然，并不是所有的源码都是为所有的系统编写的，所以它只是在目标系统的子集内是“通用”的，但问题是，源码是非常灵活的。有了开源，你可以决定代码的编译和运行方式。

当你在编译代码时，你通常要处理多个源文件。开发人员倾向于将不同的类或模块放在不同的文件中，这样它们可以被单独维护，甚至可能被不同的项目使用。但当你编译这些文件时，许多文件会被编译成一个可执行文件。

这通常是通过创建共享库来完成的，然后从可执行文件中动态链接回它们。这样可以通过保持模块化功能的外部性来保持可执行文件的小型化，并确保库可以独立于使用它们的应用而被更新。

### 在编译过程中定位一个共享对象

当你 [用 GCC 编译](https://opensource.com/article/22/5/what-happens-behind-scenes-during-gcc-compilation-c-programs) 时，你通常需要在你的工作站上安装一个库，以便 GCC 能够定位到它。默认情况下，GCC 假定库在系统库路径中，例如 `/lib64` 和 `/usr/lib64`。然而，如果你要链接到一个你自己的尚未安装的库，或者你需要链接到一个没有安装在标准位置的库，那么你必须帮助 GCC 找到这些文件。

有两个选项对于在 GCC 中寻找库很重要：

* `-L`（大写字母 L）在 GCC 的搜索位置上增加一个额外的库路径。
* `-l`（小写字母 L）设置你要链接的库的名字。

例如，假设你写了一个叫做 `libexample.so` 的库，并且你想在编译你的应用 `demo.c` 时使用它。首先，从 `demo.c` 创建一个对象文件：

```
$ gcc -I ./include -c src/demo.c

```

`-I` 选项在 GCC 搜索头文件的路径中增加了一个目录。在这个例子中，我假设自定义头文件在一个名为 `include` 的本地目录中。`-c` 选项防止 GCC 运行链接器，因为这个任务只是为了创建一个对象文件。结果如下：

```
$ ls
demo.o   include/   lib/    src/

```

现在你可以使用 `-L` 选项为你的库设置一个路径，然后进行编译：

```
$ gcc -L`pwd`/lib -o myDemo demo.o -lexample

```

注意，`-L` 选项在 `-l` 选项*之前*。这很重要，因为如果在你告诉 GCC 查找非默认库之前没有将 `-L` 添加到 GCC 的搜索路径中，GCC 就不知道要在你的自定义位置上搜索。编译成功了，但当你试图运行它时，却出现了问题：

```
$ ./myDemo
./myDemo: error while loading shared libraries:
libexample.so: cannot open shared object file:
No such file or directory

```

### 用 ldd 排除故障

`ldd` 工具可以打印出共享对象的依赖关系，它在排除类似问题时很有用：

```
$ ldd ./myDemo
        linux-vdso.so.1 (0x00007ffe151df000)
        libexample.so => not found
        libc.so.6 => /lib64/libc.so.6 (0x00007f514b60a000)
        /lib64/ld-linux-x86-64.so.2 (0x00007f514b839000)

```

你已经知道定位不到 `libexample`，但 `ldd` 输出至少确认了它对*工作*库的期望位置。例如，`libc.so.6`已经被定位，`ldd` 显示其完整路径。

### LD\_LIBRARY\_PATH

`LD_LIBRARY_PATH` [环境变量](https://opensource.com/article/19/8/what-are-environment-variables) 定义了库的路径。如果你正在运行一个依赖于没有安装到标准目录的库的应用程，你可以使用 `LD_LIBRARY_PATH` 添加到系统的库搜索路径。

有几种设置环境变量的方法，但最灵活的是在运行命令前放置环境变量。看看设置 `LD_LIBRARY_PATH` 对 `ldd` 命令在分析一个“损坏”的可执行文件时的作用：

```
$ LD_LIBRARY_PATH=`pwd`/lib ldd ./
   linux-vdso.so.1 (0x00007ffe515bb000)
   libexample.so => /tmp/Demo/lib/libexample.so (0x0000...
   libc.so.6 => /lib64/libc.so.6 (0x00007eff037ee000)
   /lib64/ld-linux-x86-64.so.2 (0x00007eff03a22000)

```

这也同样适用于你的自定义命令：

```
$ LD_LIBRARY_PATH=`pwd`/lib myDemo
hello world!

```

然而，如果你移动库文件或可执行文件，它又会失效：

```
$ mv lib/libexample.so ~/.local/lib64
$ LD_LIBRARY_PATH=`pwd`/lib myDemo
./myDemo: error while loading shared libraries...

```

要修复它，你必须调整 `LD_LIBRARY_PATH` 以匹配库的新位置：

```
$ LD_LIBRARY_PATH=~/.local/lib64 myDemo
hello world!

```

### 何时使用 LD\_LIBRARY\_PATH

在大多数情况下，`LD_LIBRARY_PATH` 不是你需要设置的变量。按照设计，库安装到 `/usr/lib64` 中，因此应用自然会在其中搜索所需的库。在两种情况下，你可能需要使用 `LD_LIBRARY_PATH`：

* 你正在编译的软件需要链接到本身刚刚编译但尚未安装的库。良好设计的构建系统，例如 [Autotools](https://opensource.com/article/19/7/introduction-gnu-autotools) 和 [CMake](https://opensource.com/article/21/5/cmake)，可以帮助处理这个问题。
* 你正在使用设计为在单个目录之外运行的软件，它没有安装脚本，或安装脚本将库放置在非标准目录中。一些应用具有 Linux 用户可以下载、复制到 `/opt` 并在“不安装”的情况下运行的版本。`LD_PATH_LIBRARY` 变量是通过封装脚本设置的，因此用户通常甚至不知道它已被设置。

编译软件为你在运行系统方面提供了很大的灵活性。`LD_LIBRARY_PATH` 变量以及 `-L` 和 `-l` GCC 选项是这种灵活性的组成部分。

---

via: <https://opensource.com/article/22/5/compile-code-ldlibrarypath>

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