2022年2月

 title=

使用 Linux 的 grep 和 fgrep 命令来赢得你最喜欢的基于单词的猜测游戏。

我最近有点迷恋上了一个在线单词猜谜游戏,在这个游戏中,你有六次机会来猜一个随机的五个字母的单词。这个词每天都在变化,而且你每天只能玩一次。每次猜测后,你猜测中的每个字母都会被高亮显示:灰色表示该字母没有出现在神秘单词中,黄色表示该字母出现在单词中,但不在那个位置,绿色表示该字母出现在单词中的那个正确位置。

下面是你如何使用 Linux 命令行来帮助你玩像 Wordle 这样的猜测游戏。我用这个方法来帮助我解决 1 月 6 日的谜题:

第一次尝试

Linux 系统在 /usr/share/dict/words 文件中保存了一个单词词典。这是一个很长的纯文本文件。我的系统的单词文件里有超过 479,800 个条目。该文件既包含纯文本,也包含专有名词(名字、地点等等)。

为了开始我的第一次猜测,我只想得到一个长度正好是五个字母的纯文本词的列表。要做到这一点,我使用这个 grep 命令:

$ grep '^[a-z][a-z][a-z][a-z][a-z]$' /usr/share/dict/words > myguess

grep 命令使用正则表达式来进行搜索。你可以用正则表达式做很多事情,但为了帮助我解决 Wordle 问题,我只需要基本的东西。^ 表示一行的开始,$ 表示一行的结束。在两者之间,我指定了五个 [a-z] 的实例,表示从 a 到 z 的任何小写字母。

我还可以使用 wc 命令来查看我的可能单词列表,“只有” 15,000 个单词:

$ wc -l myguess
15034 myguess

从这个列表中,我随机挑选了一个五个字母的单词:acresa 被设置为黄色,意味着该字母存在于神秘单词的某处,但不在第一位置。其他字母是灰色的,所以我知道它们并不存在于今天的单词中。

 title=

第二次尝试

对于我的下一个猜测,我想得到一个包含 a 的所有单词的列表,但不是在第一位置。我的列表也不应该包括字母 cres。让我们把这个问题分解成几个步骤。

为了得到所有带 a 的单词的列表,我使用 fgrep(固定字符串 grep)命令。fgrep 命令也像 grep 一样搜索文本,但不使用正则表达式:

$ fgrep a myguess > myguess2

这使我的下一个猜测的可能列表从 15,000 个字下降到 6,600 个字:

$ wc -l myguess myguess2
 15034 myguess
  6634 myguess2
 21668 total

但是这个单词列表中的第一个位置也有字母 a,这是我不想要的。游戏已经表明字母 a 存在于其他位置。我可以用 grep 修改我的命令,以寻找在第一个位置包含其他字母的词。这就把我可能的猜测缩小到了 5500 个单词:

$ fgrep a myguess | grep '^[b-z]' > myguess2
$ wc -l myguess myguess2
 15034 myguess
  5566 myguess2
 20600 total

但我知道这个神秘的词也不包括字母 cres。我可以使用另一个 grep 命令,在搜索中省略这些字母:

$ fgrep a myguess | grep '^[b-z]' | grep -v '[cres]' > myguess2
$ wc -l myguess myguess2
15034 myguess
 1257 myguess2
16291 total

-v 选项意味着反转搜索,所以 grep 将只返回不符合正则表达式 [cres] 或单列字母 cres 的行。有了这个额外的 grep 命令,我把下一个猜测的范围大大缩小到只有 1200 个可能的单词,这些单词在某处有一个 a,但不在第一位置,并且不包含 cre、或 s

在查看了这个列表后,我决定尝试一下 balmy 这个词。

 title=

第三次尝试

这一次,字母 ba 被高亮显示为绿色,意味着我把这些字母放在了正确的位置。字母 l 是黄色的,所以这个字母存在于单词的其他地方,但不是在那个位置。字母 my 是灰色的,所以我可以从我的下一个猜测中排除这些。

为了确定下一个可能的单词列表,我可以使用另一组 grep 命令。我知道这个词以 ba 开头,所以我可以从这里开始搜索:

$ grep '^ba' myguess2 > myguess3
$ wc -l myguess3
77 myguess3

这只有 77 个词! 我可以进一步缩小范围,寻找除第三位外还包含字母 l 的词:

$ grep '^ba[^l]' myguess2 > myguess3
$ wc -l myguess3
61 myguess3

方括号 [^l] 内的 ^ 表示不是这个字母列表,即不是字母 l。这使我的可能单词列表达到 61 个,并非所有的单词都包含字母 l,我可以用另一个 grep 搜索来消除这些单词:

$ grep '^ba[^l]' myguess2 | fgrep l > myguess3
$ wc -l myguess3
10 myguess3

这些词中有些可能包含字母 my,而这些字母并不在今天的神秘词中。我可以再进行一次反转 grep 搜索,将它们从我的猜测列表中删除:

$ grep '^ba[^l]' myguess2 | fgrep l | grep -v '[my]' > myguess3
$ wc -l myguess3
7 myguess3

我的可能的单词列表现在非常短,只有七个单词!

$ cat myguess3
babul
bailo
bakal
bakli
banal
bauld
baulk

我选择 banal 作为我下一次猜测的可能的词,而这恰好是正确的。

 title=

正则表达式的力量

Linux 的命令行提供了强大的工具来帮助你完成实际工作。grepfgrep 命令在扫描单词列表方面提供了极大的灵活性。对于一个基于单词的猜测游戏,grep 帮助识别了一个包含 15000 个可能的单词的列表。在猜测并知道哪些字母出现在神秘的单词中,哪些没有,grepfgrep 帮助将选项缩小到 1200 个单词,然后只剩下 7 个单词。这就是命令行的力量。


via: https://opensource.com/article/22/1/word-game-linux-command-line

作者:Jim Hall 选题:lujun9972 译者:geekpi 校对:wxy

本文由 LCTT 原创编译,Linux中国 荣誉推出

Fragments 2.0 的发布使其成为 Linux 发行版中最方便用户使用的 BitTorrent 客户端之一。让我们来看看有什么新变化。

Fragments 是 Linux 上最好的 BitTorrent 客户端之一

最新的 Fragments 2.0 是一个重大升级,它使用 Rust、GTK 4 和 Libadwaita 从头开始完全重写。

除了技术上的改进之外,你还会发现一些新的功能和改进的用户界面。

让我重点介绍一下它的变化。

Fragments 2.0 的新变化

最近,Gnome 应用程序的生态系统经历了一些大规模的变化。在这个变化的最前沿是向 Gtk4 和 Libadwaita 的过渡。不幸的是,这种变化并不小,许多应用程序需要从头开始重建,以支持这些新标准。

与许多其他应用程序开发者一起,Fragment 的开发者 Felix Häcker 决定从头开始重建 Fragments,现在作为 Fragments 2.0 发布。因此,我们现在得到了一个改进的 Linux 的 BitTorrent 客户端。

其中的一些改进包括。

  • 一个基于 Libadwaita 的漂亮的新用户界面
  • 新的模块化架构
  • 能够被用作远程 Fragments / Transmission 会话的远程控制
  • 新的偏好对话框有更多的选项
  • 能够查看有关网络的统计数据

一个新的用户界面

Fragments 2.0 现在有一个基于 Libadwaita 的新 UI。补充一句,Libadwaita 是 GTK4 对 Gnome 应用程序的一个扩展。它有几个优点,最明显的是在所有 Gnome 应用程序中具有一致的外观。

它比旧的主题更加扁平和圆润,我觉得,看起来非常时尚。

你可以得到一个外观简洁的 BitTorrent 应用程序,易于浏览,你也可以快速访问一些基本的选项。

新的模块化架构

虽然不能直接看到,但 Fragments 2.0 具有一个全新的模块化架构。在内部,该应用程序的所有不同部分都是模块化的。虽然这起初看起来没有那么大的影响,但我可以看到它对用户和开发者都有深远的影响。

首先,它应该意味着更容易维护,希望能让开发人员花更多时间在新功能和错误修复上。其次,它也应该意味着应用程序的更大稳定性。如果 Fragments 的一个部分崩溃了,应用程序的其他部分应该保持工作,希望不会对用户产生任何重大影响。

这只是我想到的这个新架构的两个好处,我相信还可以有更多。

新的首选项对话框

最后,Fragments 2.0 引入了几个经常要求的设置选项。在这些选项中,我认为最重要的是能够改变尚未完全下载的种子的默认文件夹。

虽然仍然不像它的一些替代品那样可以定制,但这些新增功能可以帮助你调整设置以适应你的要求。

其中一些选项包括:

  • 添加种子后自动启动它们
  • 启用/禁用下载队列
  • 可定制的对等体限制
  • 网络端口设置
  • 自动端口转发的切换

控制远程 Fragments / Transmission 会话

远程控制你的下载的能力可以产生相当大的影响。随着 Fragments 2.0,该应用程序终于获得了类似的功能,允许用户远程控制其他安装的 Fragments 和 Transmission 客户端。

这对使用单独的下载服务器的人来说非常有用,因为他们往往不能直接访问它。

虽然这在其他应用程序中一直提供的,但这一功能被直接整合到 Fragments 中,使得它成为一个对高级用户有用的 BitTorrent 客户端!

其他改进措施

除了所有这些大的变化之外,还有一些错误的修复和一些新的能力。

一些关键的亮点包括:

  • 添加的种子的磁力链可以被复制到剪贴板上
  • 可以查看关于当前会话的统计数据(速度、总下载数据等)

你可以在其 GitLab 页面 上探索更多关于 Fragments 2.0 的信息。

下载 Fragments 2.0

Fragments 是以 Flatpak 应用程序的形式提供的。如果你的 Linux 发行版没有内置的支持,你可以通过我们的 Flatpak 指南 来设置 Flatpak。

你可以尝试在你的软件中心搜索它(启用 Flatpak 集成)或在终端键入以下命令:

flatpak install flathub de.haeckerfelix.Fragments

Fragments 2.0.1(有一些小的修正)也可以在其 GitLab 页面上找到,但还没有反映在 Flathub 上。

如果你在使用 Fragments 2.0 时有问题,你可能想等更新版本进入 Flathub。

你最喜欢的 BitTorrent Linux 客户端是什么?Fragments 2.0 是否令人印象深刻?请在下面的评论中告诉我你的想法。


via: https://news.itsfoss.com/fragments-2-0-release/

作者:Jacob Crume 选题:lujun9972 译者:wxy 校对:wxy

本文由 LCTT 原创编译,Linux中国 荣誉推出

美国要替换华为和中兴设备,却没钱没设备

为替换华为和中兴的设备,美国联邦通信委员会的“安全可信通信补偿计划”为拥有 1000 万以下用户的运营商提供补偿,预算为 19 亿美元。然而在三个月的申请期间收到了 56 亿美元的申请,这就需要美国国会重新解决资金问题了。此外,除了 资金问题之外,准备提供替换设备的思科、Juniper 也不能及时提供设备产能,他们表示可能要 1-2 年的时间才能生产出来。

老王点评:如果真的有后门,这么长时间想做什么都做完了吧。

Meta 正考虑退出欧洲市场

伴随着《欧洲通用数据保护条例》(GDPR)的生效,美国的隐私保护法规被认为不符合规定。在欧盟法院的一项重要裁决之后,宣告欧盟-美国之间的有关个人数据的隐私盾协议无效。这一裁决影响到每一家美国公司,包括 Meta、谷歌、微软和亚马逊等。在近日提交的一份 SEC 文件中,Meta 说如果它不能与美国的业务、应用程序和数据中心分享欧洲用户的数据,将对其有针对性的在线广告能力产生破坏性影响,它或将干脆完全 撤出欧洲

老王点评:或许广告盈利模式会有一些新的变化和博弈,但是我想本质上不会变,用户获得免费服务的代价总是以某种形式支付。

AI 已经威胁到有声书行业的从业者

传统的人工配音 相比,AI 配音的有声书成本要低得多。但是将失去工作的不仅仅是配音员,而是整个有声书配音生态。根据美国音频出版商协会的最新数据,美国 2020 年出版的有声书超过 7.1 万本,但只占当年出版的印刷书籍数量的一小部分。专业的配音员认为自己所从事的是艺术,然而这并不能阻止出版商越来越多的采用 AI 来配音。

老王点评:和很多即将被 AI 取代的工作一样,我觉得与其抱怨和反对,倒不如想想如何让 AI 更好的配音,重新定位自己的角色。

Falkon 的最新版本带来了截屏功能和基于 PDFium 的 PDF 阅读器以及其他改进。

如果你是 KDE 的粉丝,你肯定接触过,甚至使用过 Falkon。所以,你一定会惊喜地发现,KDE 已经成功地为他们的网络浏览器发布了新的重大升级。

与其他主流网络浏览器不同,Falkon 的更新并不频繁。这个最新发布的版本是一个令人兴奋的更新,在间隔了近三年之后!

补充一句,Falkon 是一个建立在 QtWebEngine 上的简单的开源网络浏览器。它最初被称为 QupZilla,后来在 KDE 旗下被重新命名为 Falkon。

虽然并不是新浏览器,它早在 2010 年就发布了,但它为普通用户提供了一种极简的浏览体验。

Falkon 3.2.0 有什么新内容?

即使你现在安装的是最新版本,Falkon 也没有定期提供安全更新。

因此,你可以考虑将 Falkon 作为满足特定要求的浏览器或作为辅助浏览器。

下面是这个版本的新内容:

截屏和 PDF 阅读器支持

最新的版本带来了急需的截屏功能和可选的基于 PDFium 的 PDF 阅读器。这两个都是基于 Qt 5.13 的版本。

主题和插件

对下载主题和扩展的初步支持也被添加进来了,同时偏好菜单也显示了对 KDE 商店的链接。此外,用户现在也可以删除本地安装的主题和插件。

书签

由于有了上下文菜单项,用户现在可以创建文件夹并存储书签。人们已经注意到,填充书签栏和创建顶级的书签的能力已经没有了。

其他功能

  • 在 Falkon 中添加的一个非常常见但又必不可少的功能是暂停或恢复下载的能力。
  • 更新的 CookieManager 现在允许同时选择一个以上的 cookie。
  • 首选项扩展现在可以筛选查找。
  • 用户现在可以通过上下文菜单分离标签。
  • 现在包括 NetworkManager 集成。

要了解更多关于所有的技术变化,你可以参考 官方发布说明

总结

Falkon 的最新版本表明 KDE 仍然计划继续支持它。这对 KDE 爱好者来说是个好消息,特别是对那些使用 Falkon 的人来说。但是,现在说他们是否计划定期推送更新,使其成为日常浏览的理想选择,还为时过早。

如果你觉得一个简单的、轻量级的网络浏览器就可以,而且有很好的广告屏蔽功能,一个与 KDE 桌面融合的浏览器,Falkon 是一个必须尝试的东西。

安装是非常直接的。你可以在你的软件库中找到它,或者使用 Flatpak 或 Snap 包 安装它。如果你想知道,它也可用于 Windows 用户。


via: https://news.itsfoss.com/falkon-browser-3-2-release/

作者:Rishabh Moharir 选题:lujun9972 译者:wxy 校对:wxy

本文由 LCTT 原创编译,Linux中国 荣誉推出

提供一个适当的 CMake 配置文件来使其他人可以更容易地构建、使用和贡献你的项目。

 title=

这篇文章是使用开源 DevOps 工具进行 C/C++ 开发系列文章的一部分。如果你从一开始就把你的项目建立在一个功能强大的工具链上,你的开发会更快和更安全。除此之外,这会使别人更容易地参与你的项目。在这篇文章中,我将搭建一个基于 CMakeVSCodium 的 C/C++ 构建系统。像往常一样,相关的示例代码可以在 GitHub 上找到。

我已经测试了在本文中描述的步骤。这是一种适用于所有平台的解决方案。

为什么用 CMake ?

CMake 是一个构建系统生成器,可以为你的项目创建 Makefile。乍一看简单的东西可能相当地复杂。在较高的层次上,你可以定义你的项目的各个部分(可执行文件、库)、编译选项(C/C++ 标准、优化、架构)、依赖关系项(头文件、库),和文件级的项目结构。CMake 使用的这些信息可以在文件 CMakeLists.txt 中获取,它使用一种特殊的描述性语言编写。当 CMake 处理这个文件时,它将自动地侦测在你的系统上已安装的编译器,并创建一个用于启动它的 Makefile 文件。

此外,在 CMakeLists.txt 中描述的配置,能够被很多编辑器读取,像 QtCreator、VSCodium/VSCode 或 Visual Studio 。

示例程序

我们的示例程序是一个简单的命令行工具:它接受一个整数来作为参数,输出一个从 1 到所提供输入值的范围内的随机排列的数字。

$ ./Producer 10
3 8 2 7 9 1 5 10 6 4 

在我们的可执行文件中的 main() 函数,我们只处理输入的参数,如果没有提供一个值(或者一个不能被处理的值)的话,就退出程序。

int main(int argc, char** argv){

    if (argc != 2) {
        std::cerr << "Enter the number of elements as argument" << std::endl;
        return -1;
    }

    int range = 0;
    
    try{
        range = std::stoi(argv[1]);
    }catch (const std::invalid_argument&){
        std::cerr << "Error: Cannot parse \"" << argv[1] << "\" ";
        return -1;
    }

    catch (const std::out_of_range&) {
        std::cerr << "Error: " << argv[1] << " is out of range";
        return -1;
    }

    if (range <= 0) {
        std::cerr << "Error: Zero or negative number provided: " << argv[1];
        return -1;
    }

    std::stringstream data;
    std::cout << Generator::generate(data, range).rdbuf();
}

producer.cpp

实际的工作是在 生成器 中完成的,它将被编译,并将作为一个静态库来链接到我们的Producer 可执行文件。

std::stringstream &Generator::generate(std::stringstream &stream, const int range) {
    std::vector<int> data(range);
    std::iota(data.begin(), data.end(), 1);

    std::random_device rd;
    std::mt19937 g(rd());

    std::shuffle(data.begin(), data.end(), g);

    for (const auto n : data) {

        stream << std::to_string(n) << " ";
    }

    return stream;
}

Generator.cpp

函数 generate 引用一个 std::stringstream 和一个整数来作为一个参数。根据整数 range 的值 n,制作一个在 1n 的范围之中的整数向量,并随后打乱。接下来打乱的向量值转换成一个字符串,并推送到 stringstream 之中。该函数返回与作为参数传递相同的 stringstream 引用。

顶层的 CMakeLists.txt

顶层的 CMakeLists.txt 的是我们项目的入口点。在子目录中可能有多个 CMakeLists.txt 文件(例如,与项目所相关联的库或其它可执行文件)。我们先一步一步地浏览顶层的 CMakeLists.txt

第一行告诉我们处理文件所需要的 CMake 的版本、项目名称及其版本,以及预定的 C++ 标准。

cmake_minimum_required(VERSION 3.14)

project(CPP_Testing_Sample VERSION 1.0)

set(CMAKE_CXX_STANDARD 17)
set(CMAKE_CXX_STANDARD_REQUIRED True)

我们用下面一行告诉 CMake 去查看子目录 Generator。这个子目录包括构建 Generator 库的所有信息,并包含它自身的一个 CMakeLists.txt 。我们很快就会谈到这个问题。

add_subdirectory(Generator)

现在,我们将涉及一个绝对特别的功能: CMake 模块 。加载模块可以扩展 CMake 功能。在我们的项目中,我们加载了 FetchContent 模块,这能使我们能够在 CMake 运行时下载外部的资源,在我们的示例中是 GoogleTest

include(FetchContent)

FetchContent_Declare(
  googletest
  URL https://github.com/google/googletest/archive/bb9216085fbbf193408653ced9e73c61e7766e80.zip
)
FetchContent_MakeAvailable(googletest)

在接下来的部分中,我们会做一些我们通常在普通的 Makefile 中会做的事: 指定要构建的二进制文件、它们相关的源文件、应该链接的库,以及编译器可以找到头文件的目录。

add_executable(Producer Producer.cpp)

target_link_libraries(Producer PUBLIC Generator)

target_include_directories(Producer PUBLIC "${PROJECT_BINARY_DIR}")

通过下面的语句,我们使 CMake 来在构建文件夹中创建一个名称为 compile_commands.json 的文件。这个文件会展示项目的每个文件的编译器选项。在 VSCodium 中加载该文件,会告知 IntelliSense 功能在哪里查找头文件(查看 文档)。

set(CMAKE_EXPORT_COMPILE_COMMANDS ON)

最后的部分为我们的项目定义一些测试。项目使用先前加载的 GoogleTest 框架。单元测试的整个话题将会划归到另外一篇文章。

enable_testing()

add_executable(unit_test unit_test.cpp)

target_link_libraries(unit_test gtest_main)

include(GoogleTest)

gtest_discover_tests(unit_test)

库层次的 CMakeLists.txt

现在,我们来看看包含同名库的子目录 Generator 中的 CMakeLists.txt 文件。这个 CMakeLists.txt 文件的内容更简短一些,除了单元测试相关的命令外,它仅包含 2 条语句。

add_library(Generator STATIC Generator.cpp Generator.h)
target_include_directories(Generator INTERFACE ${CMAKE_CURRENT_SOURCE_DIR})

我们使用 add_library(...) 来定义一个新的构建目标:静态的 Generator 库。我们使用语句 target_include_directories(...) 来把当前子目录添加到其它构建目标的头文件的搜索路径之中。我们也具体指定这个属性的范围为类型 INTERFACE:这意味着该属性仅影响链接到这个库的构建目标,而不是库本身。

开始使用 VSCodium

通过使用 CMakeLists.txt 文件中的信息,像 VSCodium 一样的 IDE 可以相应地配置构建系统。如果你还没有使用 VSCodium 或 VS Code 的经验,这个示例项目会是一个很好的起点。首先,转到它们的 网站 ,然后针对你的系统下载最新的安装软件包。打开 VSCodium 并导航到 “ 扩展 Extensions ” 标签页。

为了正确地构建、调试和测试项目,搜索下面的扩展并安装它们:

 title=

如果尚未完成,通过单击起始页的 “ 克隆 Git 存储库 Clone Git Repository ” 来克隆存储库。

 title=

或者手动输入:

git clone https://github.com/hANSIc99/cpp_testing_sample.git

之后,通过输入如下内容来签出标签 devops_1

git checkout tags/devops_1

或者,通过单击 “main” 分支按钮(红色框),并从下拉菜单(黄色框)中选择标签。

 title=

在你打开 VSCodium 内部中的存储库的根文件夹后,CMake Tools 扩展会侦测 CMakeLists.txt 文件并立即扫描你的系统寻找合适的编译器。你现在可以单击屏幕的底部的 “ 构建 Build ” 按钮(红色框)来开始构建过程。你也可以通过单击底部区域的按钮(黄色框)标记来更改编译器,它显示当前活动的编译器。

 title=

要开始调试 Producer 可执行文件,单击调试器符号(黄色框)并从下拉菜单中选择 “ 调试 Debug Producer”(绿色框)。

 title=

如上所述,Producer 可执行文件要求将元素的数量作为一个命令行的参数。命令行参数可以在 .vscode/launch.json 中具体指定。

 title=

好了,你现在能够构建和调试项目了。

结束语

归功于 CMake ,不管你正在运行哪种操作系统,上述步骤应该都能工作。特别是使用与 CMake 相关的扩展,VSCodium 变成了一个强大的 IDE 。我没有提及 VSCodium 的 Git 集成,是因为你已经能够在网络上查找很多的资源。我希望你可以看到:提供一个适当的 CMake 配置文件可以使其他人更容易地构建、使用和贡献于你的项目。在未来的文章中,我将介绍单元测试和 CMake 的测试实用程序 ctest


via: https://opensource.com/article/22/1/devops-cmake

作者:Stephan Avenwedde 选题:lujun9972 译者:robsean 校对:wxy

本文由 LCTT 原创编译,Linux中国 荣誉推出

GitHub 推出赞助商专属存储库

几年前,GitHub 引入了赞助功能,允许任何人财务赞助开源开发者。而现在,GitHub 推出了 赞助商专属存储库,也就是只有赞助商才能访问的私人存储库。这些存储库可以分为不同的赞助级别。有了赞助商专属仓库,开发者不仅可以募集捐款,还可以更好地与赞助商(企业或其他)进行更深入、更个性化的接触。

老王点评:虽然这样使受益和付出更一致,但是,与开源的关系呢?我觉得将来的发展未必是人们所期望的。

Go 语言正在测试对泛型和模糊处理的支持

Go 1.18 本周发布了 第二个测试版。在 1.18 中,通过 Go 语言服务器和 VSCode 扩展可以支持泛型。此外,还引入了模糊处理和新的 Go 工作区模式。Go 1.18 的测试版被证明是非常可靠的,谷歌称,“事实上,我们已经在谷歌这里的生产中运行它”。候选发布版也有望在本月晚些时候发布,最终的 Go 1.18 版预计在 3 月发布。

老王点评:Go 这样活跃开发的语言,只要坐等就可以预期不断有很多新特性和性能提升。

GNU/Hurd 使用 NetBSD 驱动程序来支持硬件

GNU/Hurd 的硬件支持一直处于非常粗糙的状态,缺乏完整的 x86\_64 支持,缺少 USB 支持,最近才有一定程度的对声音的支持。即使它比 Linux 内核存在的时间更长,仍然还有漫长的道路需要走。它的开发者在 FOSDEM 2022 上说,他们在微内核环境中重新使用 NetBSD 内核驱动,以扩大 Hurd 的硬件支持范围。

老王点评:Hurd 发展的太慢了,不过这样可以利用其它系统的硬件驱动倒是一个好主意。