Home Assistant：谷歌助理、Alexa 和 Siri 的开源替代品

Summary: 一个开源助手可以取代谷歌助理、Alexa 和 Siri？

一个开源助手可以取代谷歌助理、Alexa 和 Siri？

# Home Assistant：谷歌助理、Alexa 和 Siri 的开源替代品

>
> 一个开源助手可以取代谷歌助理、Alexa 和 Siri？
>
>
>

<img src="content_image/album_202301_09_140626acnwq48b0nqtvn1w.png" alt="An Open-Source Alternative to Google, Alexa, and Siri in Works for Home Assistant Platform" title="An Open-Source Alternative to Google, Alexa, and Siri in Works for Home Assistant Platform">

**Home Assistant** 是一个开源的智能家居平台，专注于为用户提供本地控制和隐私。它可以从树莓派或甚至本地服务器上运行。

他们还有一个订阅服务，可以获得额外的功能，如支持 Alexa 和谷歌助理，它由一家名为 “[Nabu Casa](https://www.nabucasa.com)” 的公司管理。

>
> ? 该公司由 Home Assistant 的创始人 [Paulus Schoutsen](https://twitter.com/balloob) 领导。
>
>
>

在上周的 [博客](https://www.home-assistant.io/blog/2022/12/20/year-of-voice/) 中，Paulus 宣布了**一个新的开源项目，旨在提供一个没有主动互联网连接的语音助手**，也无需任何其他大型科技公司的语音助手。

这是 *一个对谷歌助理、Alexa 和 Siri 的开源挑战者？* ?

让我们看看这到底是怎么回事。

**它是什么？** 这将是 Home Assistant 应用的一部分，将提供在本地运行语音命令的能力，以控制连接的智能设备。

Paulus 还断言，他们最重要的优先事项是支持不同的语言，他说：

>
> 人们需要能够用自己的语言说话，因为对于智能家居的语音助手来说，这是最容易接受和唯一可以接受的语言。
>
>
>

为了推动这一努力，Rhasspy 的创造者 [Mike Hansen](https://synesthesiam.com) 已经被拉来实现这一目标。

对于那些不知道的人来说，[Rhasspy](https://rhasspy.readthedocs.io) 是另一个开源软件，专门提供一个由其用户社区支持的完全离线的语音助手。

如果你问我，我觉得 Home Assistant 的这个功能将由 Rhasspy 提供，这是一件好事。

*为什么要重新发明已经存在的东西？最好是在它的基础上进行改进。*

**可以期待什么？** 最初，这个语音助手做不到做你可能期待的事情。因此，像进行网络搜索、打电话、玩语音游戏等，都是不可能的。

它所关注的反而是**语音助手应该有的基本功能**。这样做是为了确保他们面前的工作是可控的。

他们的目标是从几个动作开始，然后围绕它们建立语言模型。

在目前的状态下，Home Assistant 在其用户界面上支持 62 种不同的语言。他们计划用他们的语音助手增加对所有这些语言的支持。

**何时期待？** 他们已经开始了这方面的工作，为每种语言建立一个 [意图匹配句子集合](https://github.com/home-assistant/intents)。

这意味着社区可以通过将智能设备的命令改编成各自的母语，来为语音助手的发展做出贡献。

他们的目标是在 **2023** 年的某个时候发布，并提到这将是“*语音年*”。

我认为一个可以离线工作的开源语音助手可以是一个非常有用的东西。它可以让你不受大科技公司的任何追踪。

? *还有一个额外的好处是，它的开发背后有一个庞大的社区，有什么理由不喜欢呢？*

---

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

作者：[Sourav Rudra](https://news.itsfoss.com/author/sourav/) 选题：[lkxed](https://github.com/lkxed) 译者：[geekpi](https://github.com/geekpi) 校对：[wxy](https://github.com/wxy)

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


在 Linux 中创建定时器

Summary: 这是一个演示如何创建 POSIX 兼容的间隔定时器的教程。

这是一个演示如何创建 POSIX 兼容的间隔定时器的教程。

# 在 Linux 中创建定时器

>
> 这是一个演示如何创建 POSIX 兼容的间隔定时器的教程。
>
>
>

对开发人员来说，定时某些事件是一项常见任务。定时器的常见场景是看门狗、任务的循环执行，或在特定时间安排事件。在这篇文章中，我将演示如何使用 [timer\_create(...)](https://linux.die.net/man/2/timer_create) 创建一个 POSIX 兼容的间隔定时器。

你可以从 [GitHub](https://github.com/hANSIc99/posix_timers) 下载下面样例的源代码。

### 准备 Qt Creator

我使用 [Qt Creator](https://www.qt.io/product/development-tools) 作为该样例的 IDE。为了在 Qt Creator 运行和调试样例代码，请克隆 [GitHub](https://github.com/hANSIc99/posix_timers) 上的仓库，打开 Qt Creator，在 “<ruby> 文件 <rt>  File </rt></ruby> -> <ruby> 打开文件或项目…… <rt>  Open File or Project... </rt></ruby>” 并选择 “CMakeLists.txt”：

*在 Qt Creator 中打开项目*

选择工具链之后，点击 “<ruby> 配置项目 <rt>  Configure Project </rt></ruby>”。这个项目包括三个独立的样例（我们在这篇文章中将只会用到其中的两个）。使用绿色标记出来的菜单，可以在每个样例的配置之间切换，并为每个样例激活在终端运行 “<ruby> 在终端中运行 <rt>  Run in terminal </rt></ruby>”（用黄色标记）。当前用于构建和调试的活动示例可以通过左下角的“<ruby> 调试 <rt>  Debug </rt></ruby>” 按钮进行选择（参见下面的橙色标记）。

*项目配置*

### 线程定时器

让我们看看 `simple_threading_timer.c` 样例。这是最简单的一个。它展示了一个调用了超时函数 `expired` 的间隔定时器是如何被创建的。在每次过期时，都会创建一个新的线程，在其中调用函数 `expired`：

```
#include <stdio.h>
#include <stdlib.h>
#include <time.h>
#include <signal.h>
#include <unistd.h>
#include <string.h>
#include <errno.h>

void expired(union sigval timer_data);

pid_t gettid(void);

struct t_eventData{
    int myData;
};

int main()
{
    int res = 0;
    timer_t timerId = 0;

    struct t_eventData eventData = { .myData = 0 };

    /*  sigevent 指定了过期时要执行的操作  */
    struct sigevent sev = { 0 };

    /* 指定启动延时时间和间隔时间
    * it_value和it_interval 不能为零 */

    struct itimerspec its = {   .it_value.tv_sec  = 1,
                                .it_value.tv_nsec = 0,
                                .it_interval.tv_sec  = 1,
                                .it_interval.tv_nsec = 0
                            };

    printf("Simple Threading Timer - thread-id: %d\n", gettid());

    sev.sigev_notify = SIGEV_THREAD;
    sev.sigev_notify_function = &expired;
    sev.sigev_value.sival_ptr = &eventData;

    /* 创建定时器 */
    res = timer_create(CLOCK_REALTIME, &sev, &timerId);

    if (res != 0){
        fprintf(stderr, "Error timer_create: %s\n", strerror(errno));
        exit(-1);
    }

    /* 启动定时器 */
    res = timer_settime(timerId, 0, &its, NULL);

    if (res != 0){
        fprintf(stderr, "Error timer_settime: %s\n", strerror(errno));
        exit(-1);
    }

    printf("Press ETNER Key to Exit\n");
    while(getchar()!='\n'){}
    return 0;
}

void expired(union sigval timer_data){
    struct t_eventData *data = timer_data.sival_ptr;
    printf("Timer fired %d - thread-id: %d\n", ++data->myData, gettid());
}

```

这种方法的优点是在代码和简单调试方面用量小。缺点是由于到期时创建新线程而增加额外的开销，因此行为不太确定。

### 中断信号定时器

超时定时器通知的另一种可能性是基于 [内核信号](https://man7.org/linux/man-pages/man3/signal.3p.html)。内核不是在每次定时器过期时创建一个新线程，而是向进程发送一个信号，进程被中断，并调用相应的信号处理程序。

由于接收信号时的默认操作是终止进程（参考 [signal](https://linux.die.net/man/7/signal) 手册页），我们必须要提前设置好 Qt Creator，以便进行正确的调试。

当被调试对象接收到一个信号时，Qt Creator 的默认行为是：

* 中断执行并切换到调试器上下文。
* 显示一个弹出窗口，通知用户接收到信号。

这两种操作都不需要，因为信号的接收是我们应用程序的一部分。

Qt Creator 在后台使用 GDB。为了防止 GDB 在进程接收到信号时停止执行，进入 “<ruby> 工具 <rp>  （ </rp> <rt>  Tools </rt> <rp>  ） </rp></ruby> -> <ruby> 选项 <rt>  Options </rt></ruby>” 菜单，选择 “<ruby> 调试器 <rt>  Debugger </rt></ruby>”，并导航到 “<ruby> 本地变量和表达式 <rt>  Locals & Expressions </rt></ruby>”。添加下面的表达式到 “<ruby> 定制调试助手 <rt>  Debugging Helper Customization </rt></ruby>”：

```
handle SIG34 nostop pass

```

*Sig 34 时不停止*

你可以在 [GDB 文档](https://sourceware.org/gdb/onlinedocs/gdb/Signals.html) 中找到更多关于 GDB 信号处理的信息。

接下来，当我们在信号处理程序中停止时，我们要抑制每次接收到信号时通知我们的弹出窗口:

*Signal 34 弹出窗口*

为此，导航到 “GDB” 标签并取消勾选标记的复选框:

*定时器信号窗口*

现在你可以正确的调试 `signal_interrupt_timer`。真正的信号定时器的实施会更复杂一些：

```
#include <stdio.h>
#include <stdlib.h>
#include <signal.h>
#include <unistd.h>
#include <signal.h>
#include <time.h>
#include <unistd.h>
#include <errno.h>
#include <string.h>

#define UNUSED(x) (void)(x)

static void handler(int sig, siginfo_t *si, void *uc);
pid_t gettid(void);

struct t_eventData{
    int myData;
};

int main()
{
    int res = 0;
    timer_t timerId = 0;

    struct sigevent sev = { 0 };
    struct t_eventData eventData = { .myData = 0 };

    /* 指定收到信号时的操作 */
    struct sigaction sa = { 0 };

    /* 指定启动延时的时间和间隔时间 */
    struct itimerspec its = {   .it_value.tv_sec  = 1,
                                .it_value.tv_nsec = 0,
                                .it_interval.tv_sec  = 1,
                                .it_interval.tv_nsec = 0
                            };

    printf("Signal Interrupt Timer - thread-id: %d\n", gettid());

    sev.sigev_notify = SIGEV_SIGNAL; // Linux-specific
    sev.sigev_signo = SIGRTMIN;
    sev.sigev_value.sival_ptr = &eventData;

    /* 创建定时器 */
    res = timer_create(CLOCK_REALTIME, &sev, &timerId);

    if ( res != 0){
        fprintf(stderr, "Error timer_create: %s\n", strerror(errno));
        exit(-1);
    }

    /* 指定信号和处理程序 */
    sa.sa_flags = SA_SIGINFO;
    sa.sa_sigaction = handler;

    /* 初始化信号 */
    sigemptyset(&sa.sa_mask);

    printf("Establishing handler for signal %d\n", SIGRTMIN);

    /* 注册信号处理程序 */
    if (sigaction(SIGRTMIN, &sa, NULL) == -1){
        fprintf(stderr, "Error sigaction: %s\n", strerror(errno));
        exit(-1);
    }

    /* 启动定时器 */
    res = timer_settime(timerId, 0, &its, NULL);

    if ( res != 0){
        fprintf(stderr, "Error timer_settime: %s\n", strerror(errno));
        exit(-1);
    }

    printf("Press ENTER to Exit\n");
    while(getchar()!='\n'){}
    return 0;
}

static void
handler(int sig, siginfo_t *si, void *uc)
{
    UNUSED(sig);
    UNUSED(uc);
    struct t_eventData *data = (struct t_eventData *) si->_sifields._rt.si_sigval.sival_ptr;
    printf("Timer fired %d - thread-id: %d\n", ++data->myData, gettid());
}

```

与线程定时器相比，我们必须初始化信号并注册一个信号处理程序。这种方法性能更好，因为它不会导致创建额外的线程。因此，信号处理程序的执行也更加确定。缺点显然是正确调试需要额外的配置工作。

### 总结

本文中描述的两种方法都是接近内核的定时器的实现。不过，即使 [timer\_create(...)](https://linux.die.net/man/2/timer_create) 函数是 POSIX 规范的一部分，由于数据结构的细微差别，也不可能在 FreeBSD 系统上编译样例代码。除了这个缺点之外，这种实现还为通用计时应用程序提供了细粒度控制。

---

via: <https://opensource.com/article/21/10/linux-timers>

作者：[Stephan Avenwedde](https://opensource.com/users/hansic99) 选题：[lujun9972](https://github.com/lujun9972) 译者：[FigaroCao](https://github.com/FigaroCao) 校对：[wxy](https://github.com/wxy)

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


硬核观察 #876 数千用 Rust 开发的项目面临拒绝服务攻击

Summary:
❶ 数千用 Rust 开发的项目面临拒绝服务攻击
❷ 美国最幸福、压力最小的工作是伐木工和农民
❸ 苹果公司因非法获取用户数据而被罚

有意就有意，还什么“有意无意”

美国的那个“农民”其实是农场地主。

欧盟的提款机

来自223.104.41.176的 Chrome Mobile 92.0|Android 12 用户

# 硬核观察 #876 数千用 Rust 开发的项目面临拒绝服务攻击

### 数千用 Rust 开发的项目面临拒绝服务攻击

Rust Hyper 包是一个非常流行的处理 HTTP 请求的 Rust 库。安全研究人员发现，大量包含 Hyper 的项目容易受到精心设计的 HTTP 请求引起的拒绝服务攻击，漏洞源于在使用 Hyper 库时忘记对 HTTP 请求设置适当的限制。目前，Rust 的包存储库 [crates.io](http://crates.io/) 中列出的 2,579 个项目依赖于 Hyper，下载量已超过 6700 万次，但大量项目尚未回应修复的消息。

>
> **[消息来源：The Register](https://www.theregister.com/2023/01/06/flaws_rust_projects_ddos/)**
>
>
>

>
> 老王点评：并不是使用了 Rust 就高枕无忧了，还是会有各种其他的安全漏洞。
>
>
>

### 美国最幸福、压力最小的工作是伐木工和农民

根据美国劳工统计局的调查，农业、伐木业和林业在所有主要行业类别中具有最高的自我报告的幸福水平，以及最低的自我报告的压力水平。压力最大的行业是包括金融和保险在内的行业，其次是教育和专业和技术行业。

>
> **[消息来源：华盛顿邮报](https://www.seattletimes.com/business/the-happiest-least-stressful-most-meaningful-jobs-in-america/)**
>
>
>

>
> 老王点评：看看手里的键盘，突然不香了。
>
>
>

### 苹果公司因非法获取用户数据而被罚

法国数据保护机构 CNIL 周三对苹果公司处以 800 万欧元的罚款。CNIL 称，苹果公司未能 “在将用于广告目的的标识符存入法国 iPhone 用户（iOS 14.6 版本）的终端之前获得他们的同意”。在运行较低版本的 iOS 的 iPhone 中，苹果的个性化广告隐私设置是默认打开的。较新版本的 iPhone 操作系统已纠正了这一问题。

>
> **[消息来源：Gizmodo](https://gizmodo.com/apple-iphone-france-ads-fine-illegal-data-1849950163)**
>
>
>

>
> 老王点评：虽然苹果公司在隐私方面已经算是不错了，但是也难免会有这种有意无意的错误。
>
>
>


EulerMaker：构建 openEuler 全场景生态

Summary: 2022 年末，openEuler Summit 2022 上吴峰光博士正式向开发者披露了 openEuler 统一构建服务 EulerMaker。

# EulerMaker：构建 openEuler 全场景生态

### 引言

2022 年末，openEuler Summit 2022 上，中国 Linux 内核圈最有影响力的开发者之一——吴峰光博士做了名为《**面向全场景操作系统的构建服务发布**》的主题演讲，正式向开发者披露了 openEuler 统一构建服务 **EulerMaker**。

Linux 中国开源社区就此采访了**吴峰光博士**，为读者挖掘到一些在峰会上亮相的 EulerMaker 背后的有趣细节。

>
> ? 吴峰光博士是著名的 Linux 内核贡献者、华为计算操作系统首席专家、openEuler 社区技术委员会委员。他在 Linux 内核领域上拥有卓越贡献，在 I/O 和内存管理、内核测试服务方面做出了重要的贡献。有关他的故事，可以参阅《新程序员》杂志的专访《**吴峰光杀进 Linux 内核**》。
>
>
>

### openEuler 的全场景

2021 年 9 月，openEuler 宣布将支持全场景，在服务器、云计算之外，还支持编译计算和嵌入式场景，这就引来了很多人的关注，但也有一些怀疑的眼光。因为，服务器和嵌入式分处两端，中间有着巨大的鸿沟。

“30 年前，服务器 OS、嵌入式 OS，界限非常清晰，像是两个村，中间全是农田。但后来 IT 越来越深入千行百业，云、边缘、IoT 兴起，各种场景涌现，发生了交叠。所以我们认为这是一个新的历史机会，来做一个全场景 OS。”吴峰光说。

>
> ? 关于多场景的支持和融合，请参考我们之前对欧拉技术委员熊伟的采访：《[操作系统专家解读 openEuler 22.09 最新技术特性](/article-15326-1.html)》。
>
>
>

“要做全场景 OS，就引入了一个需求：原来的构建系统，如何转化为全场景统一构建系统？”

### 什么是 OS 构建系统？

OS 构建系统以 OS 源代码作为输入，以用户可安装使用的软件仓或OS镜像作为输出。

>
> ? 服务器领域的 OBS、嵌入式领域的 Bitbake，是各自领域的代表性构建系统，历史悠久。
>
>
>

### 为什么需要新的构建系统？

“openEuler 社区一开始是用 OBS 来构建的，”吴峰光介绍说，“OBS 最初由 SUSE 贡献开源，功能强大。但随着使用的深入，我们发现一些复杂的新需求很难在它上面改进，这就对 openEuler 的演进造成了困难。”

就一般的 OS 来说，OBS 构建可能够用；但是当一个操作系统要支持全场景，复杂度就大大增加，对构建系统提出了更严苛的要求。

吴峰光博士对 OBS、Bitbake 做了深入调研。他解释了这些老牌构建系统，为什么满足不了openEuler的需求：

“服务器领域的 OBS 主打能力是什么？几大主流的 Linux 发行版它都支持，比如可以给 Redhat 打包，也可以给 Debian 打包。兼容并包是它的核心设计目标，适应了 Linux 多样化的现状。但我们认为，多样化在早期对 Linux 发展有利，但长期而言，Linux 生态的碎片化是一个需要被解决的问题。”

“嵌入式领域的 Bitbake 采用了面向任务和过程的 DSL 描述语言，这使得它非常灵活强大，但自由度和复杂性过高，以学习曲线陡峭知名。现在流行的理念是如 YAML、JSON 等通用、声明式的配置语言，和函数式编程，以实现低门槛、易理解、可控可重复的构建过程。”

在吴峰光看来，在 30 年后的今天，**构建系统有着新的时代目标**。

2022 年 3 月，openEuler 团队开始设计新的构建系统 EulerMaker。

### EulerMaker 构建系统

OS 构建系统的核心流程是，用户给定一组软件包后，按照包依赖关系，对它们发起并行构建任务。“那么搭一个 Kubernetes 集群，上面叠加一个包构建调度模块，是不是就可以了呢？”

“这里的包依赖管理和调度，的确非常复杂：既有源包的依赖，又有二进制包的依赖，还有构建环境的依赖；既有构建依赖，又有运行依赖，还有传递依赖；成千上万的依赖关系，形成一个巨大的图，要考虑怎么破环，把它变成一个有向无环图（DAG），用于最大化并发调度。随着包构建的推进，新输出的 RPM 包需要成为之后 RPM 包构建的环境，还会提供新的依赖信息，动态更新这个 DAG 图。还要考虑各种包构建的失败情况，多用户并发任务之间的干扰，或者任意机器、模块随时崩溃重启后如何接力，避免单点故障，等等，这需要一整套精巧的架构设计。”

看到这样的难题，可能有工程师大牛们要摩拳擦掌，跃跃欲试了。但是在难题面前，吴峰光不慌不忙，踩了一脚刹车——

“我们先把发动机放一边，追根溯源，回到最初的那一个问题：**用户到底需要一辆什么车？**”

做架构设计，首先要考虑用户场景，然后推导出功能，最后才能确定数据和流程。设计时全盘考虑了所有的用户需求，数据和流程在未来才会稳定，才不会变来变去。

“我们对用户需求的考虑，真的全面了吗？”

吴峰光继续展开分析：“在 Linux 发展的最初阶段，需求是简单的：只要功能实现了，跑一下 gcc / make 能构建出来，用户能用，构建系统的工作就完成了。那时侯 Linux 社区对测试不重视，也还没有 CI / CD 的概念，测试基本全靠用户踩坑。现在情况就不一样了，时代的要求在提高：开发者期望有质量把控，要做测试，要有一整套的构建测试 CI / CD，要覆盖一整个开发流程，一站式全部搞定，出来的 RPM 包已经是经过测试的、用户能放心用的。这已经被开发者认为是标配，是开发者的正常预期。”

所以，新的构建系统要集成测试流程。

那么，是不是直接集成现在流行的通用 CI / CD 测试工具就可以了呢？

“市面上的 CI / CD 通用测试服务，适合测试上层的应用；而操作系统需要测试的，既有上层软件，又有基础软件；既面向应用开发者，又面向内核开发者，还有软件厂商、硬件厂商、OS 厂商，他们都有独特的测试需求；既要做功能测试，还要做性能测试。这些不是市面上通用 CI / CD 能做的。”

“所以，我们需要**一套全栈系统，既能构建，又满足上述所有测试需求**。”

早在 2020 年，吴峰光就综合分析上述需求，设计了 Compass-CI。Compass-CI 被设计为一个通用的任务执行系统，可以执行构建、功能测试、性能测试等各类任务。Compass-CI 也被设计为一个异构调度系统，可以调度物理机、虚拟机、容器等各种资源。

“Compass-CI 已经在 2020 年上线服务，在这个基础上补足构建相关的模块，就可以作为 EulerMaker 的后端，服务 openEuler 的构建。”

“当我们可以用一套系统，来服务好业界各方的需求，就会有硬件厂商问我们，能不能远程接入他们的硬件？然后，我们就需要支持工作机远程接入，分布式调度，数据共享，立足云端，连接各类线下机房，x86、ARM 等各类硬件，方便开发者之间、厂商之间、开发者与厂商之间的分布式协作。”

“资源有了，功能有了，开发者来了，也会有很多需求：我打包了，能不能看见进展？出问题了能不能复现当时的环境？能不能登录调试修复？能不能 DIY 验证？这些需求都需要一一满足大家。现在 EulerMaker 的可视化界面可以显示构建的进展，每个包会显示其依赖关系图以及其构建的进度，哪些包已经构建了，哪些包还没有构建，预计还有多少分钟，它前面还有哪几个依赖都一目了然。而且每个开发者都可以有专属队列，可以大大缩短等待时间。”

### EulerMaker 怎么解决全场景

一个 OS 怎么支持全场景？

“首先这个 OS 要足够通用。但这还不够。”吴峰光继续说到：“一个通用的 OS，所带的软件往往要求大而全，把常见的功能都编进去。但很多场合有着不同的需求，比如启用一个不常用的功能，或者在嵌入式设备上，因为资源受限，需要把不必要的功能裁减掉。”

一个通用软件，往往会提供一组编译期的定制功能，方便不同场景的开发者和用户针对自己的需求，构建出不同功能组合的二进制程序。

“类似的，当我们说一个 OS 支持全场景，是只需维护一套 OS 源代码，通过源码级 + 镜像级定制，即可构建生成各类场景化的二进制 OS 发布。强大的定制能力，是赋能一套 OS 源码支持全场景的‘究极魔法’。”

吴峰光进一步介绍什么是定制能力：

“最简单的定制能力，体现在软件打包上，就是对用户提供定制选项。一般是把上游软件的可选功能做一个封装，让用户在做包构建的时候可以打开或者关闭。比如 RPM SPEC 文件中通过宏定义了 `%{with xxx}` 选项，用户就可以通过 `rpmbuild --with xxx` 来打开 `xxx` 选项对应的软件功能。”

“然而 SPEC 文件中往往只封装了少量选项，对于没有被 SPEC 维护者封装的上游软件功能，用户就只好自行修改 SPEC 文件来实现定制，这样就很杂乱了。”

“事实上 OS 的用户和场景多种多样，他们需要的定制项，往往远超包维护者所能提供。比如有人想升级版本号，有人想加个补丁，有人想加个编译选项，或者修改编译器。我们需要一种开放式的定制规范，即允许用户在不修改打包文件的情况下，实现对打包文件的定制，且允许定制任意字段，不限于包维护者事先提供的一个封闭选项集合。”

“这时候就会发现 SPEC 文件的定制能力不够用了。”

EulerMaker 怎么解决这个问题呢？

“我们引入了开发者们都很熟悉的 YAML 配置语言，用它来声明式的描述一个软件包。然后允许用户再定义一个 YAML 文件，来选择性覆盖或者修改 OS 软件包 YAML 文件里的任意字段。这样不但实现了开放式定制，而且用户定制选项都可以以 YAML 配置文件的形式，集中存储管理，或者代码化 Git 管理。”

不过，事情并没有这么简单。

“当用户可以非常方便的定制任意字段，随之而来一个风险：很多包字段之间有条件依赖和约束，用户一不小心，就容易在不知情的情况下，破坏一些关联约束。在过去，很多这种约束在 Git 日志里隐式维护的。比如开发者首先修改一个 SPEC 文件里的版本号，同时去掉一个只适用于老版本的补丁，完成对软件包的一次升级。当暴露在定制环境下，这就是一大脆弱性，会造成事实上难以自由定制。”

而 EulerMaker 的解决办法，是把该补丁适用的版本范围，用条件语句显式的写在软件包 YAML 里。“这样用户随便改版本号，都不会出错，其它关联字段会自适应的变化，从而实现定制自由。”

如此一来，定制能力是强大了，那么易用性又如何？

“一般用户要的不是一堆零件，而是套装。成千上万的定制项，小白用户眼花缭乱，不知道拿它们怎么办，他可能只知道我用的是 OrangePI，那有没有对应的一组定制项可以拿来就用的？”

针对这个问题，EulerMaker 的解决思路如下：

“这组定制项，要由这个专业领域的开发者或者厂商，在社区里提供，我们称之为一个定制层。每一种硬件、场景都可以有这样一个个的定制层。这样场景化 OS 的开发任务就简化为，菜单式选择所需的层，像搭积木一样组合，轻松完成 OS 的场景化分层定制。”

以上，就是 EulerMaker 解决全场景的整体思路。最后，吴峰光总结说：

“一个好用的全场景 OS，一定会是一种生态协作的组织形态。首先把各个场景的公共知识下沉到 BaseOS，统一描述，汇聚复杂枯燥的字段间条件依赖，方便在各个场景中复用。然后创建一个个薄薄的场景化定制层，简单描述各场景下“我要什么”的问题。BaseOS + 多样化场景层，成为 openEuler 社区共同维护和提供的公共组件，通过搭积木的方式，让开发者 DIY 菜单式定制，成就一个轻松愉悦的 OS 创造体验。”

为了让读者们对分层定制有一个直观的概念，吴峰光举了两个例子：

1、Redis 容器裁剪：

```
env.CC: /usr/bin/musl-gcc -static
env.CFLAGS: -I/usr/musl/include
env.LDFLAGS: -L/usr/musl/lib

buildRequires:
    - musl-gcc

subpackage.redis-server:
    meta.summary: redis-server
    files: %{_bindir}/%{name}-server
```

*redis.yaml 示例*

该示例使用十行 YAML，即可裁剪出 1MB 的 Redis 。

以下视频演示了分层定制 Redis 的过程：

2、内核定制维护：

```
env.kconfig: CONFIG_BTRFS_FS=y
patchset.my-xxx-improve: xxx.patch
```

*kernel.yaml 示例*

该示例使用一个 YAML 文件，两行搞定 Linux 内核的定制维护。

“比如您在一家大公司的基础设施团队，需要在 openEuler 基础上定制 Linux 内核，改一下 kconfig，加一个补丁。在过去，您可能需要拷贝一份 `kernel.spec`，然后直接在上面修改。这意味着维护上百行的 SPEC 文件，且时不时要从上游回合新的改进，这一过程枯燥而繁琐。现在从 Fork 模式转为搭积木模式，只需维护好一个小小的 `kernel.yaml` 文件。然后每次拉新的 BaseOS 重新构建，都会自动拿到上游欧拉内核的最新错误修复。这样就很好的降低了开发维护成本，提高了安全性。是一种更加可持续的上下游协同演进方式。”

### 统一的包格式

在吴峰光的介绍中，我发现了一件令我很感兴趣的事情，就是 openEuler 在探索自己独有的软件包规范。

我们知道，openEuler 现在采用的是业界主流的软件包格式之一：RPM 。这种软件包格式不仅仅被 Redhat Linux 使用，也被 openSUSE、OpenMandriva、Oracle Linux、Tizen 等使用。

而在 openEuler 中，RPM 软件包不仅仅用在我们熟知的服务器、云计算领域，还应用在其它场景中，比如嵌入式。

为了一统软件包的定义，openEuler 采用了新的 YAML 配置语言进行包描述，并接管 RPM 的 SPEC 文件，成为新的开发者界面。吴峰光说，SPEC 文件中采用了大量复杂的宏定义，而 EulerMaker 将这些复杂性隐藏到YAML后面。换言之，openEuler 新的统一构建系统采用的 YAML 配置语言制定了一种更通用、更灵活的包定义。

这是不是代表着 openEuler 会逐渐发展自己的软件包格式？吴峰光表示，在保持兼容性的同时，openEuler 会走出一条自己的路。

别出心裁创建一种新的包格式容易，但是能在兼容既有架构的基础上，又能开拓新的特性，乃至于支持更广泛的场景，这应该很值得期待。

### 迈向开源开放

经过半年的努力，统一构建系统服务 EulerMaker 已经上线，已经在欧拉社区发挥作用，但是作为一个开源社区的产物，笔者更希望看到它能开源出来，惠及更广大的开源社区，也接受开源社区的批评和贡献。对此，吴峰光博士表示，一定是会开源的，但是目前还需要进一步打磨成熟。对于这样的回应，笔者很认可，毕竟吴峰光博士对开源社区的贡献一向以精益求精而著称。非常期待能早日见到一个强大而完善的统一构建系统开源出来。


who 命令的解释与示例

Summary: 这里是一个关于理解 Linux 中 who 命令的初学者指南，并带有几个例子。

这里是一个关于理解 Linux 中 who 命令的初学者指南，并带有几个例子。

# who 命令的解释与示例

>
> 这里是一个关于理解 Linux 中 who 命令的初学者指南，并带有几个例子。
>
>
>

这篇文章是 [Linux 命令](https://www.debugpoint.com/category/linux-commands)学习系列的一部分。

### who 命令

Linux 中的 `who` 命令用于显示当前登录到系统中的用户的信息。它显示用户的登录名，用户登录的终端，用户登录的时间，以及远程主机名（如果有）。

#### 语法

下面是 `who` 命令的基本语法：

```
who [OPTION]... [ FILE | ARG1 ARG2 ]

```

### 各种 who 命令和开关的例子

默认情况下，`who` 读取文件 `/var/run/utmp`，其中包含当前登录的用户的信息。如果没有指定选项，它会显示每个用户的登录名、终端和登录时间。

```
who

```

它给出了以下输出。你可以看到它显示了登录名是 `debugpoint`，终端 ID `tty2` 和登录的日期和时间。

```
debugpoint tty2 2023-01-01 11:22 (tty2)

```

然而，如果你在虚拟机中运行上述命令，你应该看到同样的情况，但终端 ID 将是 x11 服务器的显示名称，即 `:0`。

```
❯ who
debugpoint :0 2023-01-01 23:36 (:0)

```

要显示当前用户的用户名和信息，使用下面的方法：

```
whoami

```

使用 `-b` 选项查看最后一次系统启动时间：

```
❯ who -b
system boot 2023-01-01 23:36

```

显示当前系统中登录的用户数：

```
❯ who -q
debugpoint
users=1

```

所有上述命令与 `-H` 选项配对时，你会有一个更好的含标题行的信息，如下所示：

```
who -H

NAME LINE TIME COMMENT
debugpoint tty2 2023-01-01 11:22 (tty2)

```

如果你想在 Linux 中显示与 `who` 命令有关的所有信息，请使用选项 `-a`：

```
who -aH

NAME LINE TIME IDLE PID COMMENT EXIT
system boot 2023-01-01 11:19
run-level 5 2023-01-01 11:19
debugpoint + tty2 2023-01-01 11:22 13:26 2042 (tty2)

```

像往常一样，你可以使用下面的重定向将 `who` 命令的输出保存到任何文件：

```
who > user_details.txt

```

#### who 命令选项的例子总结

下面是一些 `who` 命令的例子和它们的解释：

下面是一些可以与 `who` 命令一起使用的选项：

* `-a`: 显示每个用户的主机名、登录时间和进程
* `-b`: 显示上次系统启动的时间
* `-d`: 显示死进程（已终止但未从 utmp 文件中删除的进程）
* `-H`: 显示标题行
* `-l`: 显示长格式的登录进程
* `-m`: 只显示在 `ARG1 ARG2` 指定的终端上登录的用户的名字和行。
* `-q`: 显示已登录用户的数量
* `-u`: 显示拥有未脱离进程的用户的信息
* `-w`: 显示已经登录的用户信息，格式与 utmp 文件相同

### 总结

我希望这篇文章能够帮助你了解 `who` 命令及其基本原理。你也可以阅读 [who 手册页](https://man7.org/linux/man-pages/man1/who.1.html)来了解更多。如果你有任何问题，请告诉我。

---

via: <https://www.debugpoint.com/who-command-linux/>

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


硬核观察 #877 微软准备将 AI 聊天机器人添加到 Word 和电子邮件中

Summary:
❶ 微软准备将 AI 聊天机器人添加到 Word 和电子邮件中
❷ 艺术家担心 Adobe 追踪其设计过程来训练 AI
❸ 动态三重缓冲有望加入 GNOME 44

# 硬核观察 #877 微软准备将 AI 聊天机器人添加到 Word 和电子邮件中

### 微软准备将 AI 聊天机器人添加到 Word 和电子邮件中

据报道，微软已经讨论在 Word、PowerPoint、Outlook 等应用程序中加入 OpenAI 的人工智能，以便客户能够使用简单的提示自动生成文本。这一举措可能会改变超过 10 亿人编写文档、演示文稿和电子邮件的方式。工程师们正在开发在客户数据上训练这些模型的方法，并保证这些数据不会泄露给其他客户或落入不良分子手中。

>
> **[消息来源：The Information](https://www.theinformation.com/articles/ghost-writer-microsoft-looks-to-add-openais-chatbot-technology-to-word-email)**
>
>
>

>
> 老王点评：让我想一下，或许以后可以就写个提纲，Word 就可以替你补充大段看起来没什么问题的文字？这简直是灌水的福音。
>
>
>

### 艺术家担心 Adobe 追踪其设计过程来训练 AI

前两天我们 [报道](/article-15425-1.html) 过，Adobe 创意云服务的隐私条款让用户担心其创作被用来训练 Adobe 的生成性 AI。这一讨论在 Twitter 上吸引了数百万次浏览和数千次转发。但是除了对图像、音乐、视频等创作被利用的担心之外，艺术家们还担心 Photoshop 和其他 Adobe 产品追踪其应用的使用，以了解创作者是如何工作的。也就是说，窃取平面设计师在几十年的工作中形成的流程和行动。一个复杂、曲折的艺术过程变得有可能被自动化。

>
> **[消息来源：Fast Company](https://www.fastcompany.com/90831386/artists-accuse-adobe-tracking-design-ai)**
>
>
>

>
> 老王点评：如果是真的，那么平面设计师或艺术家们也将很快被人工智能取代。我们说的 AI 的消息够多了，总感觉我们处在 AI 爆发前夜，或许明天一切你想得到、想不到的工作都会因 AI 而改变。
>
>
>

### 动态三重缓冲有望加入 GNOME 44

两年多来，Canonical 一直在为 GNOME 桌面的 Mutter 合成器研究动态三重缓冲。这种按需的三重缓冲可以极大地提高桌面性能，特别是在使用英特尔集成显卡和树莓派板卡的情况下。虽然三重缓冲的实现还没有被上游化，但从 Ubuntu 22.04 LTS 开始就把这些补丁作为他们发行的 Mutter 包的一部分，Debian 等发行版也一直携带该补丁。开发人员表示动态三重缓冲有望会被 GNOME 44 上游纳入。GNOME 44.0 稳定版将于 3 月 22 日发布。

>
> **[消息来源：Phoronix](https://www.phoronix.com/news/GNOME-44-Hopes-Triple-Buffering)**
>
>
>

>
> 老王点评：这对低性能显卡真是一件好事。相比 GNOME、KDE 的各种花哨改进，我更愿意看到它们在性能和稳定性等底层的进展。
>
>
>


Oh My Zsh 和 Powerlevel10k：天作之合

# Oh My Zsh 和 Powerlevel10k：天作之合

>
> 这是一篇快速而简单的指南，用 Oh My Zsh 和 Powerlevel10k 主题改造你的 Zsh 终端 Shell，使其在 Ubuntu 和其他 Linux 发行版中看起来很酷。
>
>
>

大多数 Linux 发行版中的默认 Shell 是 Bash。Bash 是一个可靠的和传统的工具。然而，它缺乏一些自定义功能，比如漂亮的颜色、光标支持等等。

你可以使用另一个 Shell，即 Zsh 来得到更多的设置调整，并帮助你扩展你的 Bash Shell 体验。

这个简单的指南解释了如何安装 Zsh、Oh My Zsh 并应用 Powerlevel10k 主题。

### Oh My Zsh 和 Powerlevel10k 安装和配置指南

#### 1、安装 Zsh 和改变 Shell

打开一个终端，使用以下适用于你的发行版的命令安装 Zsh。

Ubuntu、Debian、Linux Mint 和所有相关的发行版：

```
sudo apt install zsh

```

Fedora：

```
sudo dnf install zsh

```

Arch：

```
pacman -S zsh

```

安装完成后，找出 Zsh 的安装路径：

```
whereis zsh

```

然后使用当前用户的 Zsh 可执行路径改变 Shell。

```
chsh -s /usr/bin/zsh <用户名 >

```

关闭并再次打开终端。然后你应该看到 Zsh 的首次设置。选择选项 2。它将用一个默认的主题改变你的 Shell 提示符的外观，如下图所示：

#### 2、安装 Oh My Zsh

Oh My Zsh 是一套可以进一步定制 Zsh 的脚本。

首先，我们将从 GitHub 上下载 Oh My Zsh 脚本来安装它。如果你有 `wget` 和 `git` 软件包，那就最好了。如果还没有安装，请使用以下命令 [安装 wget](https://www.debugpoint.com/wget-not-found-error/) & git：

```
sudo apt install wget
sudo apt install git

```

然后用下面的命令安装 Oh My Zsh：

```
sh -c "$(wget -O- https://raw.githubusercontent.com/ohmyzsh/ohmyzsh/master/tools/install.sh)"

```

然后你应该看到 Oh My Zsh 及默认主题 Robbyrussell 应用到了你的终端。

Oh My Zsh 还附带了其他的主题，你可以 [使用这篇指南](https://www.debugpoint.com/install-use-zsh/) 安装它们。然而，在本教程中，我将谈论一个特定的主题，即 Powerlevel10k。

#### 3、为 Oh My Zsh 安装 Powerlevel10k 主题

打开终端，运行以下命令，从 GitHub 上克隆 Powerlevel10k 代码库，并将文件放到 Oh My Zsh 的配置文件夹中。

```
git clone https://github.com/romkatv/powerlevel10k.git $ZSH_CUSTOM/themes/powerlevel10k

```

用文本编辑器打开 `~/.zshrc` 文件，将 `ZSH_THEME` 变量设为 `"powerlevel10k/powerlevel10k"`。

```
cd ~

```

```
nano .zshrc

```

默认情况下，它应该是 Robbyrussell。删除 `”robbyrussell"`，添加下面的 `"powerlevel10k/powerlevel10k"`。

更改后，你的 `~/.zshrc` 文件应该是这样的：

```
ZSH_THEME="powerlevel10k/powerlevel10k”

```

保存并关闭该文件（`CTRL+O`、回车和 `CTRL+X`）。

重新启动你的终端，启动首次向导来设置 Powerlevel10k 主题。

#### 4、Powerleve10k 的首次设置

安装后启动终端时，Powerlevel10k 会提示你各种问题以了解你的 Linux 发行版设置。所以，根据你的需要按下键，按照你的口味来定制你的终端。下面是一些问题的例子截图，可以给你一些启发。

最后，你可以保存文件，享受你的终端的新面貌。

如果你想再次重启配置向导，运行以下程序。你可以随心所欲地做，次数不限。

```
p10k configure

```

基本设置就这样结束了。如果你想了解更多，请继续阅读。

### 更多配置（高级用法）

#### 5、安装 Dracula GNOME 终端主题

如果你使用的是带有原生终端应用的 GNOME 桌面，你可以试试令人惊叹的 Drakula 主题。要做到这一点，打开一个终端，运行下面的命令来下载该主题：

```
git clone https://github.com/dracula/gnome-terminalcd gnome-terminal

```

打开 GNOME “终端”应用，进入偏好设置。通过点击 “+” 添加一个新的配置文件，并命名为 “drakula”。然后进入颜色标签，取消勾选 “<ruby> 使用系统主题的颜色 <rt>  use colors from system theme </rt></ruby>” 选项。

回到终端，运行以下程序。当出现提示时，选择你刚才创建的配置文件名称，如上所述。

```
./install.sh

```

一旦安装完成，回到偏好设置中，将 Drakula 配置文件标记为默认。

#### 6、Zsh 的自动补完和语法高亮

你可能想试试由社区开发的两个可用于 Zsh 的插件。它们是 zsh-autosuggestions 和 zsh-syntax-highlighting。

打开终端，运行以下程序，下载 zsh-autosuggestions，并将其放在插件文件夹中：

```
git clone https://github.com/zsh-users/zsh-autosuggestions.git $ZSH_CUSTOM/plugins/zsh-autosuggestions

```

同样地，为语法高亮插件运行以下程序：

```
git clone https://github.com/zsh-users/zsh-syntax-highlighting.git $ZSH_CUSTOM/plugins/zsh-syntax-highlighting

```

通过文本编辑器打开 `~/.zshrc`文件（使用以下命令），并找到 `plugins=(git)` 一行。并将其替换为以下内容：

```
nano ~/.zshrc

```

```
plugins=(git zsh-autosuggestions zsh-syntax-highlighting)

```

使用 `CTRL+O`、回车和 `CTRL+X` 保存并关闭该文件。

关闭并打开你的终端。现在，你应该可以使用自动建议和语法高亮了。

### 总结

这样就好了！你现在应该已经在你的系统上安装了 Oh My Zsh 和 Powerlevel10k 主题。你可以根据自己的需要，进一步定制 Powerlevel10k 主题的外观和行为。

干杯。

---

via: <https://www.debugpoint.com/oh-my-zsh-powerlevel10k/>

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


酷冷至尊（CoolerMaster）的 MasterPlus 软件即将开源

Summary: MasterPlus 将被彻底改造并推出开源版本？听起来不错！

MasterPlus 将被彻底改造并推出开源版本？听起来不错！

# 酷冷至尊（CoolerMaster）的 MasterPlus 软件即将开源

>
> MasterPlus 将被彻底改造并推出开源版本？听起来不错！
>
>
>

大多数游戏/外设软件套装要么是专有的，要么是没有对 Linux 的官方支持。

因此，我们必须不断寻找开源工具来配置我们的硬件以获得原生功能。

像 [Piper](https://github.com/libratbag/piper)、[OpenRGB](https://openrgb.org)、[Solaar](https://github.com/pwr-Solaar/Solaar) 等在这些情况下都很有用。

但是，有时候，即使是这些也是不够的。

幸运的是，[酷冷至尊（CoolerMaster）](https://www.coolermaster.com) 已经决定发布其 [MasterPlus](https://masterplus.coolermaster.com) 软件的开源版本，旨在为其散热器和第三方的散热器提供服务。

**虽然这并不能保证它可以用在 Linux 系统上，但我们绝对可以期待它。**

此举也应该鼓励雷蛇和罗技这样公司考虑制作精简过的开源工具。

让我们看看酷冷至尊打算怎么做。

### MasterPlus 开源版本：我们目前所知的情况

**酷冷至尊在最近的 [CES 2023](https://www.ces.tech) 活动中透露了他们计划发布新的 MasterPlus 开源版本**。感谢来自 [Boring Text Reviews](https://boringtextreviews.com/exclusive-say-goodbye-to-bloated-closed-source-software-coolermaster-to-release-new-open-source-version-of-its-software-with-api-integration-and-it-can-work-with-other-coolers-too) 的 Albert 让我们注意到了这一点。

**预期会有什么？** 对 MasterPlus 软件进行了全面的重新设计，有一个 API 插件系统，允许非酷冷至尊散热器与之整合。

他们已经澄清，酷冷至尊的独有功能不能配合其他散热器一起工作。因此，诸如检测 AIO 散热器的泄漏或计算 PSU 的效率等，都不能对第三方产品进行跟踪。

相反，该应用程序将只支持读取基本的性能信息，如温度和风扇速度，并能够配置 ARGB 设备。

如果你问我，**这总比没有好。** 而且，如果你的系统碰巧使用了酷冷至尊的组件，这对你来说是一个令人兴奋的消息！

酷冷至尊还展示了 API 系统的潜在应用，让它与一个照片应用程序挂钩，用它来控制集成在电脑机箱侧面的辅助显示器。

此外，他们还介绍了其软件的全面云整合。但遗憾的是，这部分不会开源。

**什么时候？** 我们还没有 MasterPlus 开源的具体发布日期。

但是，如果让我猜，2023 年的某个时候是最好的选择。

? *即使该工具没有被确认可以在 Linux 上工作，对开源工具来说也是一个好的开始，不是吗？你怎么看？*

---

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

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


MySQL 字符串指南

Summary: 了解 MySQL 如何存储和显示你的字符串变量，以便你能更好地控制你的数据。

了解 MySQL 如何存储和显示你的字符串变量，以便你能更好地控制你的数据。

# MySQL 字符串指南

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

>
> 了解 MySQL 如何存储和显示你的字符串变量，以便你能更好地控制你的数据。
>
>
>

字符串是你在 MySQL 中使用的最常见的数据类型之一。许多用户在他们的数据库中插入和读取字符串，而没有认真地了解过它们。本文旨在让你深入了解 MySQL 如何存储和显示你的字符串变量，以便你能更好地控制你的数据。

你可以把字符串分成两类：二进制和非二进制。你可能在大多数时候想到的是非二进制字符串。非二进制字符串有字符集和排序的不同。另一方面，二进制字符串存储诸如 MP3 文件或图像等东西。即使你在二进制字符串中存储了一个词，比如“歌曲”，它的存储方式也与非二进制字符串不同。

我将重点讨论非二进制字符串。MySQL 中的所有非二进制字符串都与字符集和排序相关。字符串的字符集控制哪些字符可以存储在字符串中，而它的排序方式控制当你显示字符串时如何排序。

### 字符集

要查看你系统中的字符集，请运行以下命令：

```
SHOW CHARACTER SET;

```

这个命令将输出四列数据，包括字符集：

* 名称
* 简要描述
* 默认的排序方式
* 字符集中每个字符的最大尺寸

MySQL 过去默认为 `latin1` 字符集，但自 8.0 版以来，默认为 `utf8mb4`。现在的默认排序方式是 `utf8mb4_0900_ai_ci`。`ai` 表示该排序对音调不敏感（ `á` = `a`），而 `ci` 则指定它对大小写不敏感（`a` = `A`）。

不同的字符集将其字符存储在内存中不同大小的块中。例如，从上面的命令可以看出，存储在 `utf8mb4` 的字符被存储在 1 到 4 个字节大小的内存中。如果你想看看一个字符串是否包含多字节的字符，你可以使用 `CHAR_LENGTH()` 和 `LENGTH()` 函数。`CHAR_LENGTH()` 显示一个字符串包含多少个字符，而 `LENGTH()` 显示一个字符串有多少个字节，根据字符集的不同，它可能与一个字符串的字符长度相同，也可能不相同。下面是一个例子：

```
SET @a = CONVERT('data' USING latin1);

SELECT LENGTH(@a), CHAR_LENGTH(@a);

+------------+-----------------+
| LENGTH(@a) | CHAR_LENGTH(@a) |
+------------+-----------------+
|     4      |       4         |
+------------+-----------------+

```

这个例子表明，`latin1` 字符集以单字节为单位存储字符。其他字符集，如 `utf16`，允许多字节的字符：

```
SET @b = CONVERT('data' USING utf16);

SELECT LENGTH(@b), CHAR_LENGTH(@b);

+------------+------------------+
| LENGTH(@b) | CHAR_LENGTH(@b)  |
+------------+------------------+
|       8    |        4         |
+------------+------------------+

```

### 排序

当你运行带有 `ORDER BY` 子句的 SQL 语句时，字符串排序方式将决定值的显示方式。你对排序方式的选择是由你选择的字符集决定的。当你运行上面的 `SHOW CHARACTER SET` 命令时，你看到了每个字符集的默认排序方式。你可以很容易地看到某个特定字符集的所有排序方式。例如，如果你想查看 `utf8mb4` 字符集允许哪些排序，请运行：

```
SHOW COLLATION LIKE 'utf8mb4%';

```

排序方式可以是不区分大小写的，也可以是区分大小写的，或者是二进制的。让我们建立一个简单的表，向其中插入一些值，然后用不同的排序方式查看数据，看看输出结果有什么不同：

```
CREATE TABLE sample (s CHAR(5));

INSERT INTO sample (s) VALUES
 ('AAAAA'), ('ccccc'),  ('bbbbb'), ('BBBBB'), ('aaaaa'), ('CCCCC');

SELECT * FROM sample;

+-----------+
| s         |
+-----------+
| AAAAA     |
| ccccc     |
| bbbbb     |
| BBBBB     |
| aaaaa     |
| CCCCC     |
+-----------+

```

在不区分大小写的情况下，你的数据会按字母顺序返回，但不能保证大写的单词会排在小写的单词之前，如下图所示：

```
SELECT * FROM sample ORDER BY s COLLATE utf8mb4_turkish_ci;

+-----------+
| s         |
+-----------+
| AAAAA     |
| aaaaa     |
| bbbbb     |
| BBBBB     |
| ccccc     |
| CCCCC     |
+-----------+

```

另一方面，当 MySQL 运行大小写敏感的搜索时，每个字母的小写将排在大写之前：

```
SELECT * FROM sample ORDER BY s COLLATE utf8mb4_0900_as_cs;

+-----------+
| s         |
+-----------+
| aaaaa     |
| AAAAA     |
| bbbbb     |
| BBBBB     |
| ccccc     |
| CCCCC     |
+-----------+

```

而按二进制排序方式将返回所有大写的值，然后再返回小写的值：

```
SELECT * FROM sample ORDER BY s COLLATE utf8mb4_0900_bin;

+-----------+
| s         |
+-----------+
| AAAAA     |
| ccccc     |
| bbbbb     |
| BBBBB     |
| aaaaa     |
| CCCCC     |
+-----------+

```

如果你想知道一个字符串使用哪种字符集和排序，你可以使用被恰当命名的 `charset` 和 `collation` 函数。运行 MySQL 8.0 或更高版本的服务器将默认使用 `utf8mb4` 字符集和 `utf8mb4_0900_ai_ci` 排序：

```
SELECT charset('data');

+-------------------+
| charset('data')   |
+-------------------+
| utf8mb4           |
+-------------------+

SELECT collation('data');

+--------------------+
| collation('data')  |
+--------------------+
| utf8mb4_0900_ai_ci |
+--------------------+

```

你可以使用 `SET NAMES` 命令来改变所使用的字符集或排序方式。

要从 `utf8mb4` 字符集改为 `utf16`，运行这个命令：

```
SET NAMES 'utf16';

```

如果你想选择默认以外的排序方式，你可以在 `SET NAMES` 命令中添加一个 `COLLATE` 子句。

例如，假设你的数据库存储西班牙语的单词。MySQL 的默认排序（`utf8mb4_0900_ai_ci`）将 `ch` 和 `ll` 视为两个不同的字符，并将它们排序。但在西班牙语中，`ch` 和 `ll` 是单独的字母，所以如果你想让它们按正确的顺序排序（分别排在 `c` 和 `l` 之后），你需要使用不同的排序。一个选择是使用 `utf8mb4_spanish2_ci` 排序方式：

```
SET NAMES 'utf8mb4' COLLATE 'utf8mb4_spanish2_ci';

```

### 储存字符串

MySQL 允许你为你的字符串值选择不同的数据类型。（甚至比其他流行的数据库，如 PostgreSQL 和 MongoDB 更多。）

下面是 MySQL 的二进制字符串数据类型的列表、它们的非二进制对应物，以及它们的最大长度：

* `binary`：`char`（255）
* `varbinary`：`varchar`（65,535）
* `tinyblob`：`tinytext`（255）
* `blob`：`text`（65,535）
* `mediumblob`：`mediumtext`（16,777,215）
* `longblob`：`longtext`（4,294,967,295）

要记住的一件重要事情是，与被存储在可变长度的字段中的 `varbinary`、`varchar`、`text` 和 `blob` 类型不同（也就是说，只使用需要的空间），MySQL 将二进制（`binary`）和字符（`char`）类型存储在固定长度的字段。因此，像 `char(20)` 或 `binary(20)` 这样的值将总是占用 20 个字节，即使你在其中存储了少于 20 个字符。对于二进制类型，MySQL用 ASCII NUL 值（`0x00`）填充这些值，对于 字符类型，用空格填充。

在选择数据类型时要考虑的另一件事是，你是否希望在字符串后面的空格被保留或剥离。在显示数据时，MySQL 会从以字符数据类型存储的数据中剥离空格，但不会剥离 `varchar` 的空格。

```
CREATE TABLE sample2 (s1 CHAR(10), s2 VARCHAR(10));

INSERT INTO sample2 (s1, s2) VALUES ('cat       ', 'cat       ');

SELECT s1, s2, CHAR_LENGTH(s1), CHAR_LENGTH(s2) FROM sample2;

+---------+---------+-----------------------------------+
| s1      | s2      | CHAR_LENGTH(s1) | CHAR_LENGTH(s2) |
+---------+---------+-----------------------------------+
| cat     | cat     |        3        |       10        |
+---------+---------+-----------------------------------+

```

### 总结

字符串是数据库中最常用的数据类型之一，而 MySQL 仍然是当今最流行的数据库系统之一。我希望你能从这篇文章中学到一些新的东西，并能用你的新知识来提高你的数据库技能。

---

via: <https://opensource.com/article/23/1/strings-mysql>

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


全场景创新，这些厉害的 openEuler 技术创新，你值得拥有

Summary: “在过去的三年里，openEuler 深入行业和产业，用八个技术方向的纵深创新，引领全场景的产业领先”

# 全场景创新，这些厉害的 openEuler 技术创新，你值得拥有

在刚刚结束的 openEuler Summit 2022 上，华为服务器 OS 首席架构师、openEuler 社区技术委员会委员熊伟为广大开发者介绍了 openEuler 在过去 3 年的成就和成果。而其中最值得关注的是，openEuler 在云、服务器、边缘计算、嵌入式等四大场景下的八个技术方向的创新。

用熊伟博士的话来说，“**在过去的三年里，openEuler 深入行业和产业，用八个技术方向的纵深创新，引领全场景的产业领先**”。接下来，作为一个一直关注开源操作系统的技术人，我分享一下我的理解。

### 可编程内核：系统调度的极限追求

首先介绍一下可编程内核。

我们知道，内核是一个操作系统的核心。对于我们所熟悉的 PC 和服务器，由于对资源的消耗和性能的需求没有那么的敏感，无需毫厘必争，所以往往不太需要在内核层面做删减，正常使用即可。删减内核功能的成本可能远高于增加内存的成本。

但对于资源消耗和成本更加敏感的边缘计算、嵌入式设备来说，每一丝的资源占有，都是难以估量的成本。对于资源集群量级极大的云计算场景而言，每 0.1% 的性能优化，对于整个集群而言，都是十分可观的收益。**一个可编程的内核相比于模块化的内核，为生产环境下的优化提供了更多的可能性** —— 工程师可以根据业务的实际变化，随时调整内核的实现和策略，从而优化系统的性能。

在这种情况下，对于内核进行组装，支持可编程能力，就变得极其重要。openEuler 创新性地借鉴了社区当中 eBPF 的思想，并在此基础之上，将内核的机制和框架进行了分离，将框架内置到内核，实现的功能和策略则可以在开发完成后，注入到内核中即可实现对内核二次编程的效果。

说起来简单，但在具体落实层面，openEuler 做了不少的工作来达成这个目标：

openEuler 在系统内核层面，提供了编写用户态策略的基础库函数和可配置的调度策略模板，可以帮助用户快速理解内核的编程方式。支持用户快速编排和扩展，降低用户对内核实现调整时的成本，降低上手的门槛。在具体的管理机制方面，则提供了对任务 / 进程 / 组 / 用户等对象的自定义拓展标签，从而承载了用户态与内核态、内核态组件之间协同调度的语义，实现了整个内核的统一调度，确保力往一处使。此外，openEuler 还在内核层面提供了丰富的钩子点位和辅助函数，从而支持对 CFS 调度类的选核、选任务、抢占流程的自定义策略注入。

对于普通的开发人员来说，也可以基于 openEuler 提供的可编程框架，来实现针对不同的应用场景来开发自定义策略，动态加载到内核执行，提升内核的执行效率，为整个业务系统降本增效。

除了内核级别的资源调度，在 openEuler 操作系统中，还实现了两种不同层面的混合部署：在线/离线业务混部和软硬实时混部。从这个角度看，openEuler 志在实现更多更大场景的统一管理和运筹。我们先来看一下在线/离线业务混部：

### 在线/离线业务混部：资源利用率和系统性能的极限平衡追求

对于任何规模化的业务来说，必然会存在波峰和波谷。如何**平衡不同业务之间分配的资源从而实现资源的最大化利用**，是一个极为重要的课题。

在 openEuler 当中，你可以使用可编程的内核来完成内核级别的资源调度；而在更上一层，openEuler 提供了完整的在线/离线业务混部能力。openEuler 为开发者提供了**三层不同的层次的资源调度能力**。

在内核层，基于内核优先级隔离调度技术，对于 CPU、内存、IO/NET 等资源维度实现干扰隔离，从根源上优化资源调度和隔离的能力。在用户态，为用户提供了基于 Rubik 的动态配置和拓扑编排能力，同时配合新一代 QoS 感知资源调度器 Skylark 所提供的资源调度能力，从而实现为不同的 QoS 要求的混部业务提供合适的资源调度。

Rubik 为开发者提供了基于应用画像的应用调度机制，来实现自动的资源调度能力。通过自动注入技术，来实现业务的自动画像和自动分析，得出不同业务负载对于资源的敏感度和压力度。再基于画像和标记，对各节点的资源进行调度（如 CPU、内存带宽、缓存带宽、磁盘带宽、网络带宽等）和数据收集，并基于历史数据二次调度资源，均衡各不同业务对于资源的平均利用水平。

在应用调度之上，Rubik 还会基于业务指标进行一定程度上的节点资源超卖。通过对业务资源维度的采样，预测可压缩资源的使用情况，从而实现基于预测情况的超卖。在为在线业务准确预留所需资源，保障其 QoS 的同时，将未使用资源尽可能多地分配给离线业务，最大化离线业务的吞吐率，提升节点的资源利用率。

通过引入 Rubik 在离线混部解决方案，在保证业务 SLA 不下降的情况下，资源利用率从业界平均的 15% 提升到 35%。

除了在线/离线业务混部之外，openEuler 还支持软硬件层面的实时混部：

### 软硬实时混部：多层次确定性时延需求满足

在 openEuler 当中，集成了一个新的硬实时内核 uniProton，帮助开发者磨平底层的硬件平台的差异，提供**一套标准统一的操作系统平台**。uniProton 支持任务管理、事件管理、队列管理、硬中断管理等管理方式，兼容 POSIX 标准接口的开发，降低了开发者的开发成本。

而对于开发者而言，更重要的是 uniProton 是鸿蒙系统和 openEuler **共同支持的内核**。开发者可以开发一套应用，同时运行在 openEuler 计算设备和鸿蒙设备上，降低了开发者的开发成本。

对于需要硬实时方案的开发者来说，配合 uniProton 和 openEuler 的系统镜像裁剪能力，可以实现 **KB 级的系统镜像**，**调度时延 < 3us**；而可以接受软实时方案的开发者则可以选择基于内核自旋锁和信号量优先级继承机制，配合周期性、Workqueue 延时、负载均衡等任务驱逐机制，实现 20us 中断响应。

通过软硬实时方案的混部能力，openEuler 实现了 CPU 、内存等全域资源的隔离分区，满足了数控机床、传统工业场景下对于多层次确定性时延的需求，帮助 openEuler 开发者可以进行传统工业场景的开发。

openEuler 除了和鸿蒙系统共建 uniProton，还提供了一个更有价值的特性 —— 多芯片架构的支持。

### 异构互联：泛架构算力存储统一调度

openEuler 全版本支持 x86、ARM、申威、龙芯、RISC-V 等五大架构，并支持英特尔、AMD、兆芯等多款 CPU 芯片，支持多个硬件厂商发布的多款整机型号、板卡型号，对于开发者来说，可以轻松完成多个不同型号的设备之间的互联和统一调度。

配合分布式软总线，可以实现鸿蒙设备和 openEuler 系统设备之间的即插即用、高效传输。开发者可以无需关注设备的发现机制，借助分布式软总线提供的通信机制，快速完成设备的发现、组网、连接和传输能力。开发者可以通过使用分布式软总线提供的 API 实现设备间的高速通信，无需关心通信细节，进而实现业务平台的高效部署与运行能力。

### SysMaster： 安全可靠机制可靠的服务管理系统

除了上面介绍的各种内核、硬件方面的技术突破以外，openEuler 还在开发者最熟悉的初始化系统上做了一些探索和改进。

我们过去熟悉的初始化系统（比如 sysVinit、systemd、upstart），大多是使用 C 写的，且往往因为设计复杂，功能大一统等有违 UNIX 传统思维的做法而广受诟病。openEuler 社区为社区提供了一个全新的、采用 Rust 编写的初始化系统 —— SysMaster。

和 systemd 相比，由于 SysMaster 采用 Rust 语言编写，原生地规避了内存泄漏问题，开发者无需担心内存泄漏导致的 1 号进程挂掉。而从零构建的 SysMaster，也摒弃了之前的初始化系统中存在问题，为开发者提供了**新一代的初始化系统**。

相比于过去的初始化系统，SysMaster 提供了全新的架构设计，分为 SysMaster Core 和 SysMaster Extend 两类。SysMaster Core 提供了极度轻量的调度方式，占用更少的资源，以及更快的启动速度。拆分的架构则可以支持拓展多种服务类型，实现 1+1+N 的架构，满足初始化系统的多样化诉求。而它的生态兼容工具，则可以让开发者可以自由选择 systemd 和 SysMaster，无需担心被生态绑定。

### 总结

openEuler 的技术创新覆盖的场景相当地丰富和深入，以至于我无法在一篇文章中逐一分析和披露所有细分场景和技术创新点。在撰写这篇文章时，给我的最大感受是“**他们居然实现了！**”

对于一个产业的研发人员来说，毫无疑问，openEuler 的这些技术创新，将帮助产业和行业的开发者节省大量的时间，用更短的时间完成应用的建设，将精力投放在产业和业务当中，产生价值。

从过去的“要打造根社区”，到如今的“**成为根社区，并从根出发，进入纵深领域创新**”，openEuler 给我了太多的惊喜。假以时日，我相信，openEuler 还给我带来更多的震撼。


硬核观察 #878 微软准备向 OpenAI 追投 100 亿美元

Summary:
❶ 微软准备向 OpenAI 追投 100 亿美元
❷ Mastodon 用户活跃度下降三成
❸ 苹果应用商店的开发者迄今已赚取了 3200 亿美元

# 硬核观察 #878 微软准备向 OpenAI 追投 100 亿美元

### 微软准备向 OpenAI 追投 100 亿美元

OpenAI 开发了聊天机器人原型 ChatGPT 和文本图像创作工具 DALL-E。微软此前已经向 OpenAI 投资了 10 亿美元，如果再追投 100 亿美元，OpenAI 将达到 290 亿美元估值。根据融资条款，一旦 OpenAI 找到方法从 ChatGPT 等产品上赚钱，微软将获得利润的四分之三，直到收回初始投资，之后微软将拥有 OpenAI 的 49% 的股份。

>
> **[消息来源：路透社](https://www.reuters.com/technology/microsoft-talks-invest-10-bln-chatgpt-owner-semafor-2023-01-10/)**
>
>
>

>
> 老王点评：这应该是微软近年来不多的最成功的投资之一。
>
>
>

### Mastodon 用户活跃度下降三成

在 Twitter 被收购前，Mastodon 有大约 50 万活跃用户。之后，Mastodon 在 11 月份涌入了大量用户，到 12 月初它的活跃用户数达到了 250 万。据 Mastodon 统计，活跃用户数量自高峰期以来已经下降了 30% 以上，并且正在继续缓慢下降，1 月第一周约有 180 万活跃用户。许多从 Twitter 转移到 Mastodon 的用户可能重新回到了 Twitter，但仍然有很多用户留了下来。

>
> **[消息来源：卫报](https://www.theguardian.com/news/datablog/2023/jan/08/elon-musk-drove-more-than-a-million-people-to-mastodon-but-many-arent-sticking-around)**
>
>
>

>
> 老王点评：虽然略有回落，但是 Mastodon 应该还会更好，我在考虑是不是也搭建一个服务器。
>
>
>

### 苹果应用商店的开发者迄今已赚取了 3200 亿美元

苹果公司今天分享了其订阅业务和全球应用程序商店的最新情况，指出自 2008 年以来，苹果公司已经向应用程序开发人员支付了创纪录的 3200 亿美元。苹果表示，它现在拥有超过 9 亿的苹果服务的付费用户，每周有来自全球 175 个地区的超过 6.5 亿访客访问其应用商店。

>
> **[消息来源：Tech Crunch](https://techcrunch.com/2023/01/10/app-store-developers-have-earned-320-billion-to-date-says-apple/)**
>
>
>

>
> 老王点评：无论如何，苹果应用商店开创了一个新的时代。
>
>
>


w 命令的解释与示例

# w 命令的解释与示例

>
> 下面是一份关于理解 Linux 和 BSD 中的 w 命令的初学者指南，并附有几个例子。
>
>
>

这篇文章是 [Linux 命令](https://www.debugpoint.com/category/linux-commands)学习系列的一部分。

### w 命令

`w` 命令是 Linux 中的一个工具，它显示当前登录到系统中的用户及其进程的信息。它显示谁已登录，以及他们正在做什么活动。这意味着它可以显示他们在系统中运行什么进程。

### 语法

下面是 `w` 命令的基本语法：

```
w [options] [username]

```

`w` 命令接受一个可选的选项列表，然后是一个可选的用户名。如果指定了用户名，`w` 将只显示该用户拥有的进程信息。

### w 命令的例子及其用法

下面是一些使用 `w` 命令的例子。

当你只用 `w` 运行它时，它显示以下输出：

```
$ w
 21:45:07 up 1 day, 12:48,  1 user,  load average: 1.05, 0.85, 0.56
USER     TTY        LOGIN@   IDLE   JCPU   PCPU WHAT
debugpoi tty2       Thu08   36:48m  0.03s  0.03s /usr/libexec/gnome-session-binary

```

解释：`USER` 列给出了用户名，然后是终端号、登录日期时间、空闲时间、CPU 使用率，以及用户正在执行的进程。

* `USER` - 在你的 Linux 或 BSD 系统中登录的用户名称。
* `TTY` - 当前会话的终端标识符号。
* `FROM` - 用户的主机名或 IP 地址。
* `LOGIN@` - 用户登录的时间。它有时会根据你的系统设置显示日期。
* `IDLE` - 用户与终端交互后的空闲时间。
* `JCPU` - 该会话的所有用户进程使用的 CPU 时间。
* `PCPU` - 该用户的进程（在 `WHAT` 字段中提到）使用的时间。
* `WHAT` - 当前带参数的进程。

下面是 `w` 命令的另一个例子，有两个用户在虚拟机环境中登录。正如你所看到的，显示了两个用户名与当前运行的带有进程参数的独立进程。

让我们看一下这个命令的一些选项。

要停止显示标题，使用 `-h` 选项。它与 `--no-header` 开关相同。

```
$ w -h

```

`-f` 选项可以在输出中切换 `FROM` 字段的可见性。

```
$ w -f

```

使用 `-s` 选项打印一个简短的输出，不包括 `JCPU`、`PCPU` 和 `LOGIN@` 信息。

```
$ w -s

```

要显示一个特定用户（例如，`debugpoint`）拥有的所有进程的列表：

```
$ w debugpoint

```

### 结束语

我希望这篇文章能帮助你了解 `w` 命令及其基本原理。你也可以阅读 [w 手册页](https://linux.die.net/man/1/w) 来了解更多。如果你有任何问题，请告诉我。

---

via: <https://www.debugpoint.com/w-command-linux-examples/>

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


Summary:
❶ GPT-4 将有 100 万亿参数，与人类大脑神经元数量相当！
❷ 美联邦机构 1/5 的密码在安全审计中被破解
❸ 美国原住民要求阿帕奇基金会改名

永远达不到，人脑背后是宇宙能量驱动，宇宙是无穷的。而机器，永远被局限在有限的功率里。

不会没有 ASF，美国人就以为“阿帕奇”和“切诺基”都是汽车的名字吧？再不然，AH-64 ”阿帕奇“武装直升机总听说过吧？就没有人考虑过”阿帕奇“这个名字是从哪来的？

# 硬核观察 #879 GPT-4 将有 100 万亿参数，与人类大脑神经元数量相当！

### GPT-4 将有 100 万亿参数，与人类大脑神经元数量相当！

OpenAI 发布于 2020 年的 GPT-3 有 1750 亿个参数。根据传闻，即将在 2023 年初发布的 GPT-4 的参数约为 100 万亿。如果将参数比作人类的神经元，这一数量的参数大致相当于人类大脑中存在的神经元连接的数量，而人类实际上并没有使用我们大脑的全部容量。按照 GPT-3 对其前代产品的进步，GPT-4 将在能力、范围和潜力方面与我们目前的 GPT-3 版本的 ChatGPT 相比，可能拥有一个质的飞跃。

>
> **[消息来源：Impakter](https://impakter.com/chatgpt-poised-for-upgrade-it-could-become-as-complex-as-the-human-brain/)**
>
>
>

>
> 老王点评：我已经无法用想象力来想象 AI 能做到什么了，希望打开的不是潘多拉魔盒吧。
>
>
>

### 美联邦机构 1/5 的密码在安全审计中被破解

美国内政部最近的一次的安全审计发现，在测试的近 9 万个加密哈希值中，只用了 90 分钟就破解了 16% 的密码，最后有 21% 的账户密码被破解。这些被破解的密码涉及 28 个高价值资产中的 25 个，占比近 90%。破解这些密码只使用了一台价值 15000 美元的设备。值得注意的是，被破解的绝大多数密码都符合密码复杂性要求，该要求规定密码必须至少有 12 个字符，并且至少包含大写、小写、数字和特殊字符等四种字符类型中的三种。

>
> **[消息来源：Ars Technica](https://arstechnica.com/information-technology/2023/01/a-fifth-of-passwords-used-by-federal-agency-cracked-in-security-audit/)**
>
>
>

>
> 老王点评：传统的“强密码”理论已经不合时宜。多个无关联的单词组成的长密码会更安全一些，最好是使用密码管理器生成随机密码，以及辅助使用多因子认证。
>
>
>

### 美国原住民要求阿帕奇基金会改名

美国的一个民间组织呼吁<ruby> 阿帕奇软件基金会 <rt>  Apache Software Foundation </rt></ruby>（ASF）改名，以尊重美国原住民，并遵守其自身的行为准则。他们指责 ASF 出于品牌推广的目的盗用原住民文化。该团体对他们所说的阿帕奇部落只存在于过去的历史背景中的说法提出异议。ASF 表示已经知晓此事，但“变化需要时间与成员、董事会和我们的法律团队进行仔细权衡。我们的成员正在探索其他解决方法。”

>
> **[消息来源：The Register](https://www.theregister.com/2023/01/11/native_american_apache_software_foundation/)**
>
>
>

>
> 老王点评：我觉得，要是没有 ASF，可能很多人都不知道阿帕奇部落，我不觉得这是恶意滥用。而且，据我所知，Apache 起名的部分灵感来自于对 NCSA 服务器的修补版。
>
>
>


OBS Studio 29 发布，但对 Linux 用户来说变化不大

Summary: OBS Studio 29 是一个令人兴奋的版本，在所有平台上都有关键的改进。

OBS Studio 29 是一个令人兴奋的版本，在所有平台上都有关键的改进。

# OBS Studio 29 发布，但对 Linux 用户来说变化不大

>
> OBS Studio 29 是一个令人兴奋的版本，在所有平台上都有关键的改进。
>
>
>

[OBS Studio](https://obsproject.com) 是最受欢迎的开源屏幕录制和流媒体软件之一。

许多 Linux 用户和内容创作者都在使用它，它有一套相当不错的工具和功能，可以让你录制和串流内容。

它的上一个主要版本发布于 2022 年 9 月，它带来了对苹果芯片的原生支持、更新了用户界面、改进了颜色支持等等。

它的下一个版本，即 v29，似乎有点意思，但对 Linux 用户来说变化不大 ?

### OBS Studio 29 的新变化

这个版本有大量的改进和修复；其中一些亮点包括：

* 对 Linux 的媒体键支持
* 新的音频过滤器
* 改进的英伟达视频和音频过滤器
* 更好的编码器支持
* 各种修复和改进

**媒体键支持：** 你终于可以用键盘上的媒体键来控制 Linux 上的 OBS 的播放或音量了。

**新的音频过滤器：** OBS Studio 29 具有两个新的音频滤波器，一个向上压缩滤波器和一个 3 波段均衡器滤波器。

**改进的英伟达视频和音频过滤器：** 对这些过滤器进行了各种改进。

增加了一个新的屏蔽刷新滑块，同时支持时间处理，这应该是为了提供更好的屏蔽质量。

**更好的编码器支持：**，OBS Studio 29 对几个编码器的支持得到了改善，例如：

* Windows 上的用于 AMD [RX7000 系列](https://en.wikipedia.org/wiki/Radeon_RX_7000_series) 的 AV1 编码器。
* Windows 上的用于英特尔 [Arc GPU](https://www.intel.in/content/www/in/en/products/details/discrete-gpus/arc.html) 的 AV1 编码器。
* Windows 上的英特尔 HEVC 编码器。
* macOS 上的原生 HEVC 和 ProRes 编码器。

>
> ? 注意，这些编码器只支持 Windows 或 macOS。可悲的是，他们少了对 Linux 的支持。我们希望在 OBS Studio 的未来版本中加入这些功能。
>
>
>

**各种修复和改进：** 除了上面列出的那些，OBS Studio 29 还有很多其他的变化，例如：

* Websockets 5.1.0
* 回放缓冲区的内存限制现在被限制在已安装的系统内存的 75%，而不是固定在 8GB。
* 支持对 SRT 和 RIST 输出的加密和认证。
* 能够检查和/或静音个别的浏览器底座。
* 在视频捕获的情况下，支持更高的刷新率。

关于更多的技术细节，你可以查看 [官方发布说明](https://github.com/obsproject/obs-studio/releases/tag/29.0.0)。

### 下载 OBS Studio 29

要获得最新的 OBS Studio 29，你可以使用 [Flatpak](https://flathub.org/apps/details/com.obsproject.Studio)，这是推荐的方法。

你也可以看看其官方下载页面中提到的其他安装方法。

>
> **[OBS Studio 29](https://obsproject.com/download)**
>
>
>

---

via: <https://news.itsfoss.com/obs-studio-29-release/>

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


通过编写“猜数字”游戏来学习 Ada 编程语言

问题是现在没几个人学这古董玩意儿

# 通过编写“猜数字”游戏来学习 Ada 编程语言

>
> 这个 "猜数字 "游戏是学习新编程语言的一个很好的入门程序，因为它以一种相当直接的方式锻炼了几个常见的编程概念。
>
>
>

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

当你想 [学习一种新的编程语言](https://opensource.com/article/20/10/learn-any-programming-language) 时，把注意力放在编程语言的共同点上是很好的：

* 变量
* 表达式
* 语句

这些概念是大多数编程语言的基础。一旦你理解了它们，你就可以开始琢磨其他的东西了。因为编程语言通常有相似之处，一旦你知道一种语言，你就可以通过了解其差异来学习另一种语言的基础知识。

学习新语言的一个好方法是用一个标准程序进行练习。这使你能够专注于语言，而不是程序的逻辑。在这个系列文章中，我使用了一个“猜数字”的程序，在这个程序中，计算机在 1 到 100 之间挑选一个数字，并要求你猜出来。程序循环进行，直到你猜对数字为止。

这个程序锻炼了编程语言中的几个概念：

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

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

### 安装 Ada

[Ada 编程语言](https://opensource.com/article/21/10/learn-ada-2021) 是一种独特的、高度结构化的语言，有专门一群开发者使用它。Ada 的工具链是 GNU Ada 开发环境，多被称为 GNAT。

你可以使用你的发行版的包管理器在 Linux 上安装 GNAT。在 Fedora、CentOS 或类似系统上：

```
$ sudo dnf install gcc-gnat

```

在 Debian、Linux Mint 及衍生版上:

```
$ sudo apt install gnat

```

在 macOS 和 Windows 上，你可以从 [Adacore 网站](https://www.adacore.com/download/more) 下载一个安装程序（从下拉菜单中选择你的平台）。

### 在 Ada 中猜数字

创建一个名为 `game.adb` 的文件。

这个程序使用的两个内置 Ada 库：`Text_IO` 和 `Numerics.Discrete_Random`：

```
with Ada.Text_IO;
use Ada.Text_IO;
with Ada.Numerics.Discrete_Random;

```

#### 过程头

<ruby> 过程 <rt>  procedure </rt></ruby> 的名称必须与文件的名称一致。第一部分是定义变量。

注意，`discrete_random` 是专门针对特定范围的。在这里，允许数字范围：

```
procedure Game is
   type randRange is range 1..100;
   package Rand_Int is new ada.numerics.discrete_random(randRange);
   use Rand_Int;
   gen : Generator;
   num : randRange;
   incorrect: Boolean := True;
   guess: randRange;

```

#### 过程逻辑

该逻辑从 `reset(gen)` 开始。这将初始化随机数发生器，确保每次运行程序时，用 `random(gen)` 初始化的数字将是不同的。

下一步是运行循环：

* 输出猜测的指令
* 读取该行
* 将其转换为 `randRange`。
* 将其与数字进行核对

如果数字匹配，`incorrect` 被设置为 `False`，导致循环的下一次迭代退出。

最后，程序在退出前会打印出对猜测正确性的确认：

```
begin
   reset(gen);
   num := random(gen);
   while incorrect loop
       Put_Line ("Guess a number between 1 and 100");
       declare
          guess_str : String := Get_Line (Current_Input);
       begin
          guess := randRange'Value (guess_str);
       end;
       if guess < num then
           Put_line("Too low");
       elsif guess > num then
           Put_line("Too high");
       else
           incorrect := False;
       end if;
   end loop;
   Put_line("That's right");
end Game;

```

### 编译程序

编译 Ada 程序的最简单方法是使用 `gnatmake`：

```
$ gnatmake game.adb
aarch64-linux-gnu-gcc-10 -c game.adb
aarch64-linux-gnu-gnatbind-10 -x game.ali
aarch64-linux-gnu-gnatlink-10 game.ali

```

这将生成一个名为 `game` 的二进制文件。

### 运行程序

程序的每次运行都会有一些不同。这是一个例子：

```
$ ./game
Guess a number between 1 and 100
50
Too low
Guess a number between 1 and 100
75
Too low
Guess a number between 1 and 100
82
Too low
Guess a number between 1 and 100
90
Too high
Guess a number between 1 and 100
87
Too low
Guess a number between 1 and 100
88
That's right

```

### 学习 Ada

这个“猜数字”游戏是学习新的编程语言的一个很好的入门程序，因为它以一种相当直接的方式锻炼了几个常见的编程概念。通过在不同的编程语言中实现这个简单的游戏，你可以展示这些语言的一些核心概念，并比较它们的细节。

你有喜欢的编程语言吗？你会如何用它来写“猜数字”的游戏？请关注本系列文章，看看你可能感兴趣的其他编程语言的例子吧!

---

via: <https://opensource.com/article/23/1/learn-ada-simple-game>

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


硬核观察 #880 数据库损坏导致全美停飞航班

Summary:
❶ 数据库损坏导致全美停飞航班
❷ 因员工监控软件显示摸鱼，被勒令向公司返回工资
❸ 谷歌将在 Chrome 开发中使用 Rust

谷歌自己的那个编程语言是什么来着

go，重视并发性

# 硬核观察 #880 数据库损坏导致全美停飞航班

### 数据库损坏导致全美停飞航班

周三，美国联邦航空局（FAA）的空中任务通知系统发生严重故障，一度导致全美停飞航班。FAA 初步判断问题根源是一个数据库文件受损，而没有证据表明这是一次网络攻击。周二晚间 FAA 的计算机系统就出现了问题，于是他们在周三凌晨航班最少的时候重启了系统。但在经过 90 分钟的重启之后，该系统的功能没有完全恢复，而备份系统也同样发现存在问题。FAA 于是下达了全美的停飞令，导致了大规模航班延误和机场瘫痪。

>
> **[消息来源：CNN](https://edition.cnn.com/travel/article/faa-ground-stop-causes/index.html)**
>
>
>

>
> 老王点评：你真想不到一些非常重要的系统有多破旧。
>
>
>

### 因员工监控软件显示摸鱼，被勒令向公司返回工资

一名加拿大女子以远程方式从事会计工作，她最初声称自己去年被无故解雇，并要求获得赔偿。但该公司告诉法庭，该员工有 50 多个小时没有从事工作有关的任务。该公司说，在发现该员工分配的工作超出预算和进度后，该公司在其工作笔记本上安装了名为 TimeCampon 的员工追踪软件。该软件可以跟踪文件打开的时间，员工如何使用该文件，并将时间记录为工作时间。该软件可以将工作时间记录与使用笔记本电脑播放电影和电视节目等活动分开。法官因此判决该女子败诉并向公司返回部分工资。

>
> **[消息来源：《卫报》](https://www.theguardian.com/world/2023/jan/12/canada-woman-time-theft-tracking-software)**
>
>
>

>
> 老王点评：真是，都不能愉快的摸鱼了。
>
>
>

### 谷歌将在 Chrome 开发中使用 Rust

谷歌今天宣布，他们将允许 Rust 代码进入 Chromium 代码库。谷歌正在努力将 Rust 工具链引入他们的 Chromium 构建系统，并将允许在 Chrome/Chromium 中使用 Rust 库。在 Chromium 中使用 Rust 可以避免内存安全错误，这将有助于加快开发速度，提高 Chrome/Chromium 浏览器的整体安全性。

>
> **[消息来源：Phoronix](https://www.phoronix.com/news/Google-Rust-In-Chromium)**
>
>
>

>
> 老王点评：继安卓之后，谷歌又将 Rust 加入到 Chrome 开发中，这将对改善浏览器安全有很大的意义。
>
>
>


如何在 Rust 中读取和写入文件

Summary: 跟随这个演示，学习如何在 Rust 中使用文件系统模块。

跟随这个演示，学习如何在 Rust 中使用文件系统模块。

# 如何在 Rust 中读取和写入文件

>
> 跟随这个演示，学习如何在 Rust 中使用文件系统模块。
>
>
>

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

知道如何读写文件对各种用途都很有用。在 Rust 中，这项任务是通过标准库中的文件系统模块（[std::fs](https://doc.rust-lang.org/std/fs/)）完成的。在这篇文章中，我将向你介绍如何使用这个模块。

为了演示这项任务，我准备了一些示例代码，也可以在 [GitHub](https://github.com/hANSIc99/rust_file_io) 上找到。

### 准备工作

在使用 Rust 时，失败的函数会返回 [Result](https://doc.rust-lang.org/std/result/enum.Result.html) 类型。尤其是文件系统模块会返回专门的类型 [std::io::Result<T, Error>](https://doc.rust-lang.org/std/io/type.Result.html)。有了这些知识，你可以从 `main()` 函数中返回相同的类型：

```
fn  main() ->  std::io::Result<()> {
/* ...code comes here... */

```

### Rust 文件写入

在 Rust 中执行文件的 I/O 操作是相对容易的。写入文件可以简化为一行：

```
use  std::fs;
fs::write("favorite_websites.txt", b"opensource.com")?;
Ok(())

```

使用错误传播操作符 `(?)`，错误信息被传递到调用函数中，随后可以处理错误。由于 `main()` 是调用栈中唯一的其他函数，如果写操作失败，错误信息将被传递到控制台输出。

[fs::write](https://doc.rust-lang.org/std/fs/fn.write.html) 函数的语法是非常先进的。第一个参数是文件路径，它必须是 [std::path::Path](https://doc.rust-lang.org/std/path/struct.Path.html) 类型。第二个参数是内容，它实际上是一个字节切片（`[u8]`）。Rust 将传递的参数转换为正确的类型。幸运的是，这些类型基本上是下面的例子中所处理的唯一类型。

使用文件描述符类型 [std::fs::File](https://doc.rust-lang.org/std/fs/struct.File.html) 可以实现对写操作更简洁的访问：

```
let mut file = fs::File::create("favorite_websites.txt")?;
file.write_all(b"opensource.com\n")?;
Ok(())

```

由于文件类型实现了 [Write](https://doc.rust-lang.org/std/io/trait.Write.html) 特性，所以可以使用相关的方法来写入文件。然而，`create` 方法可以覆盖一个已经存在的文件。

为了获得对文件描述符的更多控制，必须使用 [std::fs::OpenOptions](https://doc.rust-lang.org/std/fs/struct.OpenOptions.html#) 类型。这提供了类似于其他语言中的打开模式：

```
let mut file = fs::OpenOptions::new()
                            .append(true)
                            .open("favorite_websites.txt")?;

file.write_all(b"sourceforge.net\n")?;

```

### Rust 文件读取

适用于写的东西也适用于读。读取也可以通过简单的一行代码来完成：

```
let websites = fs::read_to_string("favorite_websites.txt")?;

```

以上一行读取文件的内容并返回一个字符串。除了读取字符串，还有 [std::fs::read](https://doc.rust-lang.org/std/fs/fn.read.html) 函数，如果文件包含二进制数据，该函数会将数据读成一个字节向量。

下一个例子显示了如何将文件的内容读入内存，随后逐行打印到控制台：

```
let file = fs::File::open("favorite_websites.txt")?;
let lines = io::BufReader::new(file).lines();

for line in lines {
    if let Ok(_line) = line {
        println!(">>> {}", _line);
    }
}

```

### 总结

如果你已经熟悉了其他编程语言，你可能已经注意到没有 `close-` 函数（或类似的）来释放文件句柄。在 Rust 中，当相关变量超出作用域，文件句柄就会被释放。为了定义关闭行为，可以在文件表示的周围应用作用域 `({ })`。我建议你熟悉 [Read](https://doc.rust-lang.org/std/io/trait.Read.html) 和 [Write](https://doc.rust-lang.org/std/io/trait.Write.html) 特性，因为你可以在许多其他类型中找到这个特性的实现。

---

via: <https://opensource.com/article/23/1/read-write-files-rust>

作者：[Stephan Avenwedde](https://opensource.com/users/hansic99) 选题：[lkxed](https://github.com/lkxed) 译者：[geekpi](https://github.com/geekpi) 校对：[wxy](https://github.com/wxy)

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


适用于 Linux 的五大流媒体直播应用

# 适用于 Linux 的五大流媒体直播应用

>
> 本文列出了 Linux 上的五大流媒体直播应用，包括了它们的功能、亮点、下载详情和对比。
>
>
>

现在是为你的业务纳入在线视频内容的最佳时机。为什么？因为研究表明，全球在线视频市场正以每年约 20% 的速度增长。

而且，由于开发者们提供的一些优秀软件，任何人都可以轻松地创建视频内容，并在 YouTube 和 Twitch 等几个流行的平台上传播。如果你仔细想想，你会发现如今你在网上观看的视频内容比基于文本的内容更多。

因此，在这篇文章中，我们将列出一些适用于 Ubuntu 和其他 Linux 的免费软件，这些软件很容易用于为你和你的企业创建超级有趣的流媒体内容。

### Linux 的五大流媒体直播应用

#### OBS Studio

本列表中的第一个免费应用程序是 OBS Studio（即 Open Broadcaster Software）。它是一个具有屏幕广播功能的流媒体直播应用程序，可用于 Linux、Windows 和 macOS。

出于几个原因，OBS Studio 是这个名单上最好的一个。它内置了编码，支持 RTMP 广播、多源、网络摄像头、绿屏、捕捉卡和你的应用程序窗口。

其用户界面相当简单明了，功能丰富。你可以从第三方开发的插件中获得帮助，以扩展其功能，例如，在直播时将 Twitter 上的实时推文混入你的流媒体。不过，OBS 不支持多比特率流媒体。

如何安装：

OBS Studio 可以在所有 Linux 发行版的官方软件库中找到。详细的安装说明见下面的链接。

>
> **[下载 OBS Studio](https://obsproject.com/wiki/install-instructions#linux)**
>
>
>

更多信息：

* [主页](https://obsproject.com/)
* [文档](https://obsproject.com/wiki/Home)

#### VokoscreenNG

我们将在这个列表中介绍的第二个应用程序是 VokoscreenNG。它复刻了已停止的 Vokoscreen 项目。这个新的应用程序完全用 Qt 和 GStreamer 库编写。它可以记录你的屏幕，并接受多个音频源和视频源。VokoscreenNG 的工具箱也相当引人注目。它包括一个放大镜、计时器、系统托盘插件，可以简化你的工作流程。

它可以免费用于 Linux 和 Windows。

如何安装：

你可以从下面的链接下载用于 Linux 系统的压缩可执行文件。下载后，将其解压，然后执行二进制文件来启动该应用程序。

记住，这个应用程序需要在你的 Linux 系统中安装 X11、PulseAudio 和 GStreamer 插件才能工作。如果你使用的是带有 Wayland 和 Pipewire 声音服务器的现代 Linux 系统（例如 Fedora），这个应用程序可能无法工作。

>
> **[下载 VokoscreenNG](https://linuxecke.volkoh.de/vokoscreen/vokoscreen-download.html)**
>
>
>

更多信息：

* [主页](https://linuxecke.volkoh.de/vokoscreen/vokoscreen.html)

#### Restreamer

Restreamer 应用程序可以让你直接在你的网站上直播视频和截屏，而无需任何流媒体服务商。也可以用这个应用程序使用流行的流媒体解决方案，如 YouTube、Twitch等。

这个应用程序功能丰富，有一个不错的功能列表。下面是对其功能的快速介绍：

* 支持 H.264 流媒体
* 内置 HTML5 视频播放
* 可用于 Linux、macOS、Windows 和 Docker 镜像
* 支持你自己的网站和 YouTube、Twitchm、Facebook、Vimeo、Wowza 等。
* 支持多个视频源：[网络摄像机](https://www.debugpoint.com/2018/08/onvifviewer-internet-camera-viewer-for-linux/)、USB 摄像机或任何 H.2645 流媒体
* 编码和音频源支持
* 支持 JPEG 形式的定期快照
* 通过 JSON HTTP API 访问流状态，以便进行额外的编程

如何安装:

安装 Restreamer 有点麻烦，因为它是通过 Docker 镜像发布的。你可以在下面的链接中找到在 Linux、Windows 和 MacOS 安装的说明。

>
> **[下载 Restreamer](https://datarhei.github.io/restreamer/docs/installation-index.html)**
>
>
>

更多信息：

* [主页](https://datarhei.github.io/restreamer/)
* [文档](https://datarhei.github.io/restreamer/docs/index.html)
* [源代码](https://github.com/datarhei/restreamer)

#### ffscreencast

ffscreencast 是一个使用 ffmpeg 库的命令行流媒体应用程序。它利用了 ffmpeg 的强大功能，并作为它的一个封装器。尽管它是以命令行的形式出现的，但你可以直接通过终端使用其强大的功能，如多源和录音设备。它也支持多种显示设置。你还可以在你的桌面截屏上叠加你的摄像机画面。

如何安装：

要安装这个应用程序，你需要克隆它的 Git 代码库，然后将其内容复制到 `/bin`目录，以便全局执行 `ffscreencast` 命令。

```
git clone https://github.com/cytopia/ffscreencast
cd ffscreencastsudo
cp bin/ffscreencast /usr/local/bin

```

你可以在终端用 `ffscreencast` 命令来运行这个应用程序。

>
> **[源代码和主页](https://github.com/cytopia/ffscreencast)**
>
>
>

#### Open Streaming Platforms

本列表中的最后一个应用是 Open Streaming Platforms（OSP），这是一个开源的 RTMP 流媒体软件，可以作为 YouTube LIVE、[Twitch.tv](http://Twitch.tv) 等的自托管替代品。

如果使用得当，这个应用程序功能丰富且强大。因为它有以下的基本功能：

* 从 Open Broadcast Software（OBS）等输入源进行 RTMP 直播。
* 每个用户有多个频道，允许一个用户同时广播多个流，而不需要多个账户。
* 视频流记录和按需播放。
* 手动上传来源于 OSP 之外的 MP4 视频。
* 视频剪辑，为值得注意的时刻创建更短的视频。
* 频道所有者的实时聊天管理（禁止/解禁）。
* 管理员控制的自适应流媒体。
* 受保护的频道，只允许你想要的观众访问。
* 实时频道，当流媒体没有直播时，继续聊天和闲逛。
* Webhooks：通过完全可定制的 HTTP 请求将 OSP 连接到其他服务，这可以传递信息。
* 将你的流媒体或视频直接嵌入到另一个网页中，很容易。
* 通过 Facebook 或 Twitter 快速分享频道或视频。
* 能够将用户界面定制为你自己的个人外观的主题

如何安装：

要安装 Open Streaming Platform，请按照以下页面的详细说明进行。

>
> **[下载 Open Streaming Platform](https://wiki.openstreamingplatform.com/Install/Standard)**
>
>
>

更多信息：

* [主页](https://openstreamingplatform.com/)
* [源代码](https://gitlab.com/Deamos/flask-nginx-rtmp-manager)
* [文档](https://wiki.openstreamingplatform.com/)

### 总结

可用于 Linux 的自由开源的流媒体应用程序不多。然而，有几个商业性的流媒体应用程序，它们可能会给你更多的选择、质量和支持。但正如我所说，它们可能要花费你一些钱。所以，如果你是流媒体世界的新手，你可能想从上面列出的用于 Linux 系统的免费流媒体应用程序开始。我希望这篇文章能给你一些想法，让你根据自己的需要使用，并让你开始使用。

请在下面的评论栏里告诉我你最喜欢的流媒体软件。

加油。

---

via: <https://www.debugpoint.com/live-streaming-applications-linux-2022/>

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


硬核观察 #881 流媒体应用可以伪造你的眼睛看向摄像头

Summary:
❶ 流媒体应用可以伪造你的眼睛看向摄像头
❷ 网售的安卓电视盒被预装了恶意软件
❸ 诺顿密码管理器账户被攻破

# 硬核观察 #881 流媒体应用可以伪造你的眼睛看向摄像头

### 流媒体应用可以伪造你的眼睛看向摄像头

英伟达的流媒体软件 Broadcast 现在有一个选项，可以通过深度伪造让你看起来像在与摄像头进行眼神交流，即使你在现实生活中看着别的地方。该功能可以让“内容创作者拍摄自己时可以阅读他们的笔记或剧本”，而不必直接看向摄像机。

>
> **[消息来源：The Verge](https://www.theverge.com/2023/1/12/23552606/nvidia-broadcast-1-4-eye-contact-ai-generation-webcam)**
>
>
>

>
> 老王点评：这就是我所需要的功能啊，感觉人工智能有时候也能做一些很有趣的事情。
>
>
>

### 网售的安卓电视盒被预装了恶意软件

安全专家发现，从亚马逊购买的一个安卓电视盒被预装了持久的、复杂的恶意软件，并被植入其固件。该安卓电视盒配备了全志 T616 处理器，通过亚马逊等网络平台销售。不幸的是，这些基于安卓系统的廉价电视盒设备从制造到全球市场的供应都遵循一条模糊的路线。在许多情况下，这些设备以多个品牌和设备名称出售，没有明确说明它们的来源地。

>
> **[消息来源：Bleeping Computer](https://www.bleepingcomputer.com/news/security/android-tv-box-on-amazon-came-pre-installed-with-malware/)**
>
>
>

>
> 老王点评：就如我们之前报道的，智能电视卖的是用户数据，这些廉价电视盒也是一样的生意。
>
>
>

### 诺顿密码管理器账户被攻破

Gen Digital 公司正在向客户发送数据泄露通知，告知他们黑客已经成功地在凭证填充攻击中攻破了 Norton 密码管理器账户。该公司称自己的系统没有被破坏，而是用户在其它地方泄露的账户信息遭到了利用。该公司发现攻击者使用他们从暗网购买的用户名和密码对，试图登录诺顿客户账户。调查显示，凭证填充攻击已经成功侵入了数量不详的客户账户，这可能导致其他在线账户的泄露，数字资产的损失，秘密的暴露等等。

>
> **[消息来源：Bleeping Computer](https://www.bleepingcomputer.com/news/security/nortonlifelock-warns-that-hackers-breached-password-manager-accounts/)**
>
>
>

>
> 老王点评：密码管理器账户的主密码采用其它地方使用的账户，你说这是怎么想的？
>
>
>


Mastodon 继续增长，Medium 的新社区平台也加入了

# Mastodon 继续增长，Medium 的新社区平台也加入了

>
> Mastodon 的又一次胜利！Medium 为其用户推出了一个 Mastodon 实例。
>
>
>

Mastodon 在最近一段时间的增长是巨大的；越来越多的人正在转向这个 Twitter 的替代品。

如果你不熟悉 Mastodon，它是目前 [最好的主流社交媒体替代品](https://itsfoss.com/mainstream-social-media-alternaives/) 之一，有可能成为 Twitter 的替代品，它是 **完全开源和去中心化的**。

随着 Twitter 的不断发生变化和去年埃隆·马斯克对它的收购，更多的用户开始对 Mastodon 这个平台产生了浓厚的兴趣。

Vivaldi [最近推出了](https://news.itsfoss.com/vivaldi-mastodon-integration/) 其由 Mastodon 驱动的社区，[Mozilla 基金会](https://blog.mozilla.org/en/mozilla/mozilla-launch-fediverse-instance-social-media-alternative/) 也在考虑类似的东西。

现在，[Medium](https://medium.com) 已经向前迈出了一步，推出了它们的 Mastodon 实例。

### Medium 启动了一个由 Mastodon 驱动的社区

在 [最近的公告](https://blog.medium.com/medium-embraces-mastodon-19dcb873eb11) 中，Medium 在 [me.dm](https://me.dm/) 推出了其 Mastodon 实例，专注于 “帮助他们的作者、出版物和读者在 <ruby> 联盟宇宙 <rt>  Fediverse </rt></ruby> 中找到一个家”。

该网站（即 Mastodon 实例）旨在成为 Medium 的用户的专属空间。

换句话说，它将成为 Medium 用户的专属社交网络平台。

有了这个网络平台，他们也可以开始进行 500 字以内的短文写作了。

Medium 的 CEO 提到：

>
> 相比之下，Mastodon 主要是为 500 字以内的短文写作服务的。用一个不太双关的说法：今天，我们正在借助 Mastodon 上的实例（[me.dm](http://me.dm)）将我们用于发表长文的 Medium 扩展到短文 medium（小写 m）。除了更简短的形式外，Mastodon 还带来了围绕联盟概念的重要创新。
>
>
>

因此，看起来 Medium 正在试水和尝试新的东西。

对于那些喜欢一目了然的内容而不是冗长信息的用户来说，可能是一件好事。

如果操作得当，这对他们来说会有很好的效果。

\*\*那么，你怎样才能加入 Medium 的 Mastodon 平台？

>
> ? 你看，最初，**只有选定的作者和出版物** 才能进入这个 Mastodon 实例。现有的 Medium 用户可以尝试发送一个 [注册请求](https://me.dm/auth/sign_up)，但要经过他们的批准。
>
>
>

因此，如果你发送一个注册请求，你得等待批准。

他们还计划作为付费会员的额外服务来邀请作家和读者。

他们已经在为他们的 Mastodon 实例开发一个 “用 Medium 注册” 的选项，这应该是为了让你更容易开始使用。

关于这一点，他们提到：

>
> 有这么多的 Mastodon 实例可供选择，我们计划让 [me.dm](http://me.dm) 一开始就有几个重要的好处：可靠的基础设施和审核，一个短域名让你更容易分享你的用户名，为新用户提供更好的入门培训，以及一个有趣的本地信息源。
>
>
>

### 去中心化和开源平台的步伐加快了

去中心化的平台正在变得比人们十年前预期的更加流行。

最大的促成因素是大型科技公司越来越多的不稳定的变化和决定，迫使用户不断调整他们在社交媒体平台上的互动方式和理由。

有了开源和去中心化的平台，用户得到了透明度，更多的数据控制，以及更多的自由。

我们可能没有想到，Mastodon 作为一个平台，逐渐成为各种组织的社区建设的一个重要组成部分。因此，我们非常期待在不久的将来看到更多变化。

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

---

via: <https://news.itsfoss.com/medium-mastodon/>

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


whereis 命令的解释与示例

Summary: 这是一份关于如何理解 Linux 和 BSD 中 whereis 命令的初学者指南，还包括几个例子。

# whereis 命令的解释与示例

>
> 这是一份关于如何理解 Linux 和 BSD 中 `whereis` 命令的初学者指南，还包括几个例子。
>
>
>

这篇文章是 [Linux 命令](https://www.debugpoint.com/category/linux-commands) 学习系列的一部分。

### whereis 命令

`whereis` 命令是一个命令行程序，可以帮助你找出任何二进制可执行文件、源文件或手册页的路径或位置。

在告诉你如何使用 `whereis` 命令之前，让我们先看看其语法。

### 语法

以下是 whereis 命令的语法：

```
whereis [OPTIONS] FILE_NAME

```

`whereis` 命令的参数是你要搜索的程序名或文件名。该参数是必须的。

默认情况下，它在环境变量（如 `HOME`、`USER`、`SHELL` 等）中定义的路径中搜索程序。

让我们看下一些例子。

### Linux 和 BSD 中 whereis 命令的例子

下面是 `whereis` 命令的一个简单例子，我试图搜索 `firefox`。在下面的输出中，你可以看到包含 `firefox` 文件或可执行文件的路径列表。

```
$ whereis firefox

firefox: /usr/bin/firefox /usr/lib64/firefox /etc/firefox /usr/share/man/man1/firefox.1.gz

```

带有选项 `-l` 的命令会显示其搜索的路径列表。比如:

```
$ whereis -l

bin: /usr/bin
bin: /usr/sbin
bin: /usr/lib
bin: /usr/lib64
bin: /etc
bin: /usr/games
bin: /usr/local/bin
bin: /usr/local/sbin
bin: /usr/local/etc
bin: /usr/local/lib
bin: /usr/local/games

```

如果 `whereis` 命令没有找到任何东西，它只显示参数的名称。例如，如果我在 Linux 中搜索 `nano`，它没有安装，它的输出如下：

```
$ whereis nano

```

```
nano:

```

如果你想搜索更多的参数，你可以随时添加多个参数。例如，下面的命令同时搜索 `bash` 和 `nano`，输出结果是这样的：

```
$ whereis bash nano

bash: /usr/bin/bash /usr/share/man/man1/bash.1.gz /usr/share/info/bash.info.gz
nano: /usr/bin/nano /usr/share/nano /usr/share/man/man1/nano.1.gz /usr/share/info/nano.info.gz

```

你也可以使用 `-b` 选项搜索特定的文件类型，比如二进制文件。下面的命令只告诉你 `nano` 的二进制路径。

```
$ whereis -b nano

nano: /usr/bin/nano /usr/share/nano

```

同样，`-s` 选项可以搜索源文件，而 `-m` 选项可以搜索手册页。

```
$ whereis -m nano

nano: /usr/share/man/man1/nano.1.gz /usr/share/info/nano.info.gz

```

你也可以结合上面的选项来进行更广泛的搜索。例如，下面的命令可以搜索 `nano` 和 `firefox` 的二进制、手册页；而对于 `bash`，只搜索手册页。

```
$ whereis -bm nano firefox -m bash

nano: /usr/bin/nano /usr/share/nano /usr/share/man/man1/nano.1.gz /usr/share/info/nano.info.gz
firefox-m:
bash: /usr/bin/bash /usr/share/man/man1/bash.1.gz /usr/share/info/bash.info.gz

```

下面是选项的摘要：

| 选项 | 描述 |
| --- | --- |
| `-b` | 只搜索二进制文件。 |
| `-m` | 只搜索手册页部分。 |
| `-s` | 只搜索源码。 |
| `-u` | 搜索不寻常的条目。如果一个文件没有所要求的每种类型的条目，就被称为不寻常。因此，`whereis -m -u *` 会查询当前目录中没有文档的那些文件。 |
| `-B` | 改变或限制 `whereis` 搜索二进制文件的地方。 |
| `-M` | 更改或限制 `whereis` 搜索手册的位置。 |
| `-S` | 更改或以其他方式限制 `whereis` 搜索源码的位置。 |
| `-f` | 终止上一个目录列表并指示文件名的开始，并且必须在使用任何 `-B`、`-M` 或 `-S` 选项时使用。 |

### 总结

我希望这篇文章能够帮助你理解 `whereis` 命令及其基本原理。你也可以阅读 [whereis 手册页](https://linux.die.net/man/1/whereis) 来了解更多。如果你有任何问题，请告诉我。

---

via: <https://www.debugpoint.com/whereis-command-linux/>

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


硬核观察 #882 Copilot 添加 Photoshop 式的代码“笔刷”

Summary:
❶ Copilot 添加 Photoshop 式的代码“笔刷”
❷ Ubuntu 的实时内核接近普遍可用状态
❸ 大量第三方 Twitter 应用停止工作

# 硬核观察 #882 Copilot 添加 Photoshop 式的代码“笔刷”

### Copilot 添加 Photoshop 式的代码“笔刷”

Copilot 实验室的 VS 扩展中“添加了一个笔刷工具箱，可以修改你的代码，只要选择几行，再选择你的笔刷，就能看到你的代码更新了。”他们演示了添加类型笔刷、修复错误笔刷、添加调试笔刷、易读性笔刷等。并且以后会增加更多笔刷，允许开发人员存储自定义笔刷。他们的目的是“如何赋予开发者权力，而不是使他们自动化”，最终是将一个令人难以置信的简单界面嫁接到 “由机器学习驱动的代码修改” 上。目前该笔刷工具箱的订阅费用是每月 10 美元。

>
> **[消息来源：GitHub Next](https://githubnext.com/projects/code-brushes)**
>
>
>

>
> 老王点评：我有个脑洞啊 —— 以后或许可以选择“卡马克”笔刷，就可以写出像大神一样的代码了。
>
>
>

### Ubuntu 的实时内核接近普遍可用状态

在 Ubuntu 22.04 LTS 中，Canonical 提供了一个测试版的实时内核。一年后，Canonical 宣布带有实时内核的 Ubuntu 接近普遍可用（GA）。而且，它目前仍然是 Ubuntu Pro/Ubuntu Advantage 组合的一部分，这至少对个人使用是免费的。此外，上游的实时补丁系列几乎已经完全就绪，只剩下一些不大的问题了。如果今年实时内核支持进入了 Linux 内核主线，将使 Linux 发行版更容易提供实时内核。

>
> **[消息来源：Phoronix](https://www.phoronix.com/news/Ubuntu-RT-Kernel-GA-Coming)**
>
>
>

>
> 老王点评：通过整个社区的各家企业和开发者的努力，Linux 的实时内核终于就快完成了，这对 Linux 的应用场景拓展很有意义。
>
>
>

### 大量第三方 Twitter 应用停止工作

众多第三方 Twitter 客户端在周四晚上停止工作，目前还不知道是什么原因，Twitter 官方并没有给出解释。“因为新的所有者取消了致力于保持 API 顺利运行的员工，包括之前提供与第三方沟通的开发者布道师”。现在访问这些客户端使用的 API 会返回 “401 未授权” 的错误。据推测，访问受限的原因可能是在这些第三方客户端上的广告被过滤、推文按时间排序而不是按更容易挣钱的算法排序，也有可能是使用这些第三方客户端的用户超过了一定数量。

>
> **[消息来源：The Register](https://www.theregister.com/2023/01/14/third_party_twitter_clients_stop_working/)**
>
>
>

>
> 老王点评：我的印象中，Twitter 的某个国内山寨品的衰落迹象之一，就是 API 不好用、开放平台名存实亡、封杀第三方客户端。
>
>
>


Ubuntu 23.04 “月球龙虾” 壁纸比赛开始了

# Ubuntu 23.04 “月球龙虾” 壁纸比赛开始了

>
> 喜欢数字绘画或摄影？这个壁纸比赛可以让你的照片出现在 Ubuntu 23.04 的官方版本中。
>
>
>

### Ubuntu 23.04 的壁纸比赛

Ubuntu 23.04 “<ruby> 月球龙虾 <rt>  Lunar Lobster </rt></ruby>” 版本将于 2023 年 4 月发布。按照时间表，在即将到来的 BETA 版本之前，官方壁纸比赛现在已经开始。

按照官方的指导方针，你必须拥有你所发布的图片的权利，而且必须是原创。可以说，不应该考虑人工智能生成的图像。

此外，你提交的图片应该至少有 3840x2160px 的尺寸，文件大小不应超过 10MB。文件格式以 SVG 和 WebP 为佳。然而，标准格式如 PNG 和 JPG 也可以接受。

此外，你的图片不应该有任何水印、标志或文字，如 “Lunar Lobster” 或 “Ubuntu”。你可以在 [这里](https://gitlab.gnome.org/GNOME/gnome-backgrounds/-/blob/main/README.md) 阅读详细的指导原则。

最后，你的壁纸可以以官方吉祥物 —— “月球” 和 “龙虾” 为特色。

提交截止日期为 2023 年 2 月 6 日，最终获胜者将在 2023 年 2 月 18 日社区投票后公布。

### 如何提交？

前往官方 Discourse 论坛的帖子下提交你的作品。请务必提到你的名字和 Twitter，如果被选中的话，可以得到 Ubuntu 团队的致谢。

>
> **[提交壁纸](https://discourse.ubuntu.com/t/lunar-lobster-23-04-wallpaper-competition/33132)**
>
>
>

戴上你的创意帽子，提交所有那些很酷的壁纸吧！

*图片来源：各自的作者*

---

via: <https://debugpointnews.com/ubuntu-23-04-wallpaper-competition/>

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


Discourse 3.0 发布，增加了很多需要的功能

# Discourse 3.0 发布，增加了很多需要的功能

>
> 开源论坛软件 Discourse 有了一个新的重大版本升级！让我们看看有什么新东西。
>
>
>

Discourse 是一个开源的论坛平台，以其丰富的功能和第三方集成而闻名。

它也是 [最好的开源论坛软件](https://itsfoss.com/open-source-forum-software/) 之一，你可以部署在你的 Linux 服务器上来建立一个社区。

现在，我们来看看 Discourse 的最新版本。

在 [Discourse 2.0](https://blog.discourse.org/2018/05/discourse-2-0-released/) 发布已近五年之后，**Discourse 3.0 终于来了**。

这个版本包含了大量的新功能和改进，让我带你看看：

### ? Discourse 3.0 的新变化

Discourse 3.0 提供了很多东西，其中一些值得注意的亮点包括：

* 新的设置向导
* 用户状态
* 通知菜单
* 新的侧边栏
* 实时聊天
* 用户提示

#### 新的设置向导

Discourse 现在有一个新的设置向导，可以让你快速配置一些最重要的选项。

因此，像将社区设置为私人、仅邀请、需要批准等选项在论坛设置的初始阶段就会显示出来。

#### 用户状态

与现在大多数社区平台的做法类似，Discourse 现在也支持设置用户状态。

用户可以设置一个自定义的表情符号和文字，在整个平台上显示在他们的头像附近，无论是帖子、聊天还是用户卡中。

#### 通知菜单

这终于实现了。

Discourse 现在有一个专门的通知菜单，让你更容易跟踪你在论坛上的活动。

#### 新的侧边栏

这是的另一项你可能会喜欢的用户体验改进。

你现在可以在新的侧边栏上添加聊天频道、标签和类别，以方便访问你想追踪的东西。

论坛的管理员也可以为游客和新成员设置一个默认的侧边栏配置；这样，每个人都可以对论坛提供的内容有一个很好的展望。

#### 实时聊天

Discourse 现在支持实时聊天；频道管理员可以选择创建一个非正式的讨论、展示，甚至是备忘录的空间，如果这对他们有用的话。

Discourse 的产品经理 Rishabh Nambiar 提到：

>
> 我们的目标是，当对话在快节奏的聊天和慢节奏的讨论之间转换时，赋予社区以综合的体验。
>
>
> 当想法被激发出来，在一个更容易被发现的地方，聊天信息可以被引用到话题中，讨论可以随着时间的推移而继续，并允许不同时间和地点的人以后加入进来。
>
>
>

#### 用户提示

这个功能对不熟悉 Discourse 的新用户很有帮助。

当用户第一次使用某个特定的功能时，他们会得到与 Discourse 的功能相关的提示。

#### ? 其他变化和改进

上面提到的并不是这次发布的 Discourse 的全部变化，下面是其他一些亮点：

* 改造了标签系统。
* 改进了搜索界面。
* 更新了开源工具。
* 改进了错误页面。
* 新的闪屏。
* 改进了页面加载动画。
* 更快的图像预加载。

如果你想深入了解这个版本的技术细节，请查阅 [发行说明](https://meta.discourse.org/t/discourse-version-3-0/)。

### ? 获取 Discourse 3.0

如果你使用的是 [Discourse 的托管计划](https://www.discourse.org/pricing)，你一定已经收到了 3.0 的更新，你所要做的就是通过你的管理设置启用新功能。

如果你是自我托管，你必须通过点击管理仪表板上的“更新”按钮手动更新你的实例。

对于新用户，请在他们的官方网站上探索更多关于 Discourse 的信息。

>
> **[Discourse](https://www.discourse.org)**
>
>
>

---

via: <https://news.itsfoss.com/discourse-3-0-release/>

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


Cinnamon 是一个被低估的神奇 Linux 桌面环境

KDE PLASMA IS BEST!

最低内存要求4GiB？有点高了吧

来自39.144.135.194的 Chrome Mobile 108.0|Android 12 用户

# Cinnamon 是一个被低估的神奇 Linux 桌面环境

>
> Linux Mint 是我最喜欢的发行版之一，其旗舰版的默认 Cinnamon 桌面是我如此喜欢它的原因。
>
>
>

Cinnamon 桌面提供的用户体验可能并不炫目花哨。但是，用户有充分的理由喜欢这个桌面环境，并可以轻松地用它来完成工作。

在日复一日工作中，我们想要的是，一个能按预期工作且不造成妨碍的用户界面。

我认为 Cinnamon 桌面做对了几件事，可以给你带来了令人兴奋的体验。让我在这里介绍其中一些。

>
> 如果你还不知道，Cinnamon 桌面是由 Linux Mint 的创建者 Clement Lefebvre 于 2011 年创建的 GNOME 3 复刻版，并经过多年的改进。
>
>
>

### 1、熟悉的用户界面

构建 Cinnamon 的主要目的是为了保持 GNOME 2 的桌面风格。

而这就是为什么与最流行的消费级桌面操作系统 Windows 相比，你会看到一个熟悉的桌面布局。

当然，随着时间的推移，Windows 11 已经进化了它的通常布局。但是，访问开始菜单、任务栏、托盘中的系统图标和几个窗口装饰使其易于掌握。

无论你是 Windows 用户还是 macOS 用户，Cinnamon 的桌面布局都不应该让你感到有什么挑战。

为了进一步帮助你，Linux Mint 的 “欢迎屏幕” 为你迅速提供了各种信息。

### 2、轻量级

为了获得舒适的 Cinnamon 桌面体验（通常使用 Linux Mint），有以下最低系统要求：

* 4GB 内存
* 100 GB 的磁盘空间
* 1024×768 分辨率的屏幕

在现代计算时代，这些规格应该适合几乎所有人。所以，你不必担心需要一个疯狂的内存或磁盘空间来运行由 Cinnamon 驱动的 Linux 发行版。

当然，你可以尝试 [在 Ubuntu 上安装 Cinnamon 桌面](https://itsfoss.com/install-cinnamon-on-ubuntu/)。

但是，在本文中，我们认为 Linux Mint 是理想的使用案例。

### 3、快速的性能而不牺牲用户体验

当我们想到一个轻量级的桌面环境时，我们通常会想象一个注重性能的、平淡无奇的用户界面。

在 Cinnamon 桌面上，情况并非如此。它确实包括了各种细微的动画和特色的图标/主题，即使不是最好的，其外观也相当现代。

它以极简的方式让你看起来很赏心悦目。

通常情况下，我很喜欢漂亮的用户界面，但我仍然可以接受 Linux Mint 的简单直接的用户体验，并在双显示器设置（1440p + 1080p）上运行它。

它可能不是 Linux Mint Cinnamon 版最好的双显示器体验（对我来说，第二个屏幕上没有停靠区和面板），但需要改进地方不多。

### 4、默认的自定义选项

你可能已经知道，在提供开箱即用的定制能力方面，KDE 可能是最棒的。

如果你对这种方式感到好奇，我们有超级有用的指南：

* [KDE 定制指南](https://itsfoss.com/kde-customization/)
* [如何正确地给 KDE Plasma 定制主题（深度指南）](https://itsfoss.com/properly-theme-kde-plasma/)
* [最佳的 KDE Plasma 华丽主题](https://itsfoss.com/best-kde-plasma-themes/)

但是，对于许多用户来说，这有些过于复杂了。

我认为 Linux Mint 给出了适量的额外控制/定制，你也可以在它的欢迎屏幕上了解到这些。

一些你可以轻松定制的元素包括：

* 桌面颜色（强调色）
* 浅色/深色主题切换
* 面板布局
* 图标、按钮和鼠标指针

你可以前往系统设置，并导航到 “主题”，找到必要的调整项。

推荐阅读：

>
> **[在 Linux 上定制 Cinnamon 桌面的 7 种方法](https://itsfoss.com/customize-cinnamon-desktop/)**
>
>
>

### 5、为你的体验增色的官方附加组件

Linux Mint 支持各种插件来增强你的体验。这些都是 [Cinnamon 调味品](https://cinnamon-spices.linuxmint.com) 产品的一部分。它们包括：

* 主题
* 扩展程序
* <ruby> 小程序 <rt>  Applet </rt></ruby>
* <ruby> 桌面组件 <rt>  Desklet </rt></ruby>

小程序和桌面组件是小型程序，你可以分别在面板（靠近系统托盘）和桌面上添加。

你可以管理系统默认的小程序，也可以从官方软件库下载更多的小程序。

同样，你可以从可用的默认程序中添加桌面组件，或者从软件库中获得新的。

大量有价值的实用程序可以用来监控系统资源、检查天气，以及更多。

此外，你还可以访问社区构建的各种主题，可以很容易地给你一个你一直想要的外观。

通过补充上述所有的 “调味品”，你可以使用扩展来使面板透明，在桌面上添加水印，启用窗口平铺，并添加一些令人兴奋的窗口动画。

### 6、兼容和无缝的用户体验

为什么我再次强调用户体验？

Cinnamon 桌面最棒的地方在于它以尊重和支持所有功能的方式发展。

例如，如果你想安装一个你在 KDE Plasma 上喜欢使用的应用程序，它在这里也应该以同样的方式工作。Cinnamon 桌面没有什么特别之处，会破坏这种体验。

同样地，该桌面增加了一些试图与其他桌面环境的服务共存的功能。例如，支持使用 GNOME 在线账户的日历事件。

### 7、面板定制

停靠区、任务栏或面板是用户界面的一个组成部分。

是的，其他的桌面环境也允许你在某种程度上同样定制这些。但在 Cinnamon 中，你可以得到大量的控制权来调整它。

我认为你可以得到一个用户想要的所有基本选项。

### 总结

GNOME 和 KDE Plasma 是流行的桌面环境。然而，Cinnamon 在提供最佳用户体验的基本部分上并不逊色。

你对 Cinnamon 桌面环境有什么看法？你更喜欢用 Linux Mint 来尝试它吗？在下面的评论部分分享你的想法。

---

via: <https://itsfoss.com/why-cinnamon/>

作者：[Ankush Das](https://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/) 荣誉推出


Summary:
❶ BussFeed 用 AI 报道《CNET 用 AI 撰写文章》
❷ Linux 准备禁用微软的 RNDIS 协议的驱动程序
❸ 前十名痴迷智能手机的国家中，有七个在亚洲

# 硬核观察 #883 BussFeed 用 AI 报道《CNET 用 AI 撰写文章》

### BussFeed 用 AI 报道《CNET 用 AI 撰写文章》

科技新闻网站 CNET 被发现自去年 11 月以来，用 AI 撰写了 75 篇与个人财务有关的文章，但这些文章并没有申明使用 AI 撰写。CNET [回应](https://www.cnet.com/tech/cnet-is-experimenting-with-an-ai-assist-heres-why/) 称，虽然 AI 撰写了这些文章内容和收集了素材，但发表的每一篇文章都经过了具有相关专业知识的编辑的审查、事实核查和编辑。CNET 随后注明了这些文章由 AI 撰写。他们称正在做其最擅长的事情：测试一项新技术，以便能够将炒作与现实分开。有趣的是，BussFeed 在报道此事时，也使用 ChatGPT 来撰写了整篇报道，但经过编辑审核后，“不得不重写了几次提示，以使其不再插入事实错误”。

>
> **[消息来源：BuzzFeed News](https://www.buzzfeednews.com/article/katienotopoulos/cnet-articles-written-by-ai-chatgpt-article)**
>
>
>

>
> 老王点评：将来，AI 辅助写作可能会接管写作中的大部分工作。
>
>
>

### Linux 准备禁用微软的 RNDIS 协议的驱动程序

RNDIS 是通过 USB 提供虚拟以太网功能的专有协议，但除了 Windows 之外，几乎没有得到支持。由于安全问题，Linux 内核正在准备将 RNDIS 内核驱动程序移到 Kconfig “损坏” 选项里，一旦被标记为 “损坏” 一段时间，这些驱动将可能最终从上游源码树中删除。内核维护者 Greg 表示 “因为该协议不可能做到安全，所以禁用所有 RNDIS 驱动，以防止任何人再使用它们”。

>
> **[消息来源：Phoronix](https://www.phoronix.com/news/Linux-Disabling-RNDIS-Drivers)**
>
>
>

>
> 老王点评：按 Linux 的风格，这么不安全的协议是怎么进入内核的？
>
>
>

### 前十名痴迷智能手机的国家中，有七个在亚洲

[Data.ai](http://data.ai/) 对 2022 年移动互联网的最新研究报告披露，亚洲国家是移动生态系统的主要推动者。在前十名痴迷智能手机的国家中，有七个在亚洲。印尼人以每天平均 5.7 小时的时间名列在手机上花费时间最多的榜首。中国人排在第 18 位，平均每天花费 3.6 小时。但中国人在下载量和消费者在应用程序上的花费方面排名第一，中国人共下载了 1110 亿个应用程序，花费了约 580 亿美元。

>
> **[消息来源：The Register](https://www.theregister.com/2023/01/16/state_of_mobile_2023/)**
>
>
>

>
> 老王点评：这份报告里面还有很多有趣的数据，值得一看。
>
>
>


Linux 已准备好禁用微软的 RNDIS 驱动程序，但是……

# Linux 已准备好禁用微软的 RNDIS 驱动程序，但是……

>
> Linux 内核将不再支持 RNDIS 驱动程序。这是一个好的举措吗？这对你意味着什么？在这里了解一下。
>
>
>

微软的 RNDIS 协议（即 <ruby> 远程网络驱动接口规范 <rt>  Remote Network Driver Interface Specification </rt></ruby> 的简称），是一个专有的 USB 协议，用于计算机上的虚拟以太网功能。

这方面最常见的使用情况是通过连接到电脑上的 USB，使用手机的移动网络连接互联网，也称为 <ruby>   系连  <rt>  Tethering </rt></ruby>。

尽管它主要在 Windows 上工作，但它成为 Linux 内核的一部分已经有一段时间了。

但这种情况很快就会改变。

### 向 RNDIS 协议说再见？

**发生了什么？** 周一，[Greg Kroah-Hartman](https://twitter.com/gregkh) 创建了 [usb.git rndis-removal](https://git.kernel.org/pub/scm/linux/kernel/git/gregkh/usb.git/commit/?h=rndis-removal&id=5eb127bb9741c1480aff95ffa4e1bd4cd9b5b16d) 分支，其中他提到禁用 Linux 上所有 RNDIS 协议驱动程序的实现。

在该提交中他提到：

>
> 微软的 RNDIS 协议按照设计是不安全的，在任何连接不信任的主机或设备的系统上使用它都是脆弱的。因为该协议不可能变得安全，所以只要禁用所有的 RNDIS 驱动，就可以防止任何人再使用它们。Windows 只在 XP 和更新一些的系统中需要用它，比这更早的 Windows 系统可以使用正常的 USB 类协议来代替，没有这些问题。
>
>
>

正如最初由 [Phoronix](https://www.phoronix.com/news/Linux-Disabling-RNDIS-Drivers) 报道的那样，一旦这个协议在 Kconfig 选项中被标记为 “损坏”，它将再保留一段时间，最终从内核中删除。

但是**为什么呢？**

众所周知，RNDIS 在 Windows 之外的平台上的实现是一团糟，并带来了相当多的安全风险。此外，RNDIS 并不像以前那样广泛使用了，它带来的安全风险可能是作出这一决定的主要原因之一。

**这对目前的用户有影响吗？你应该担心吗？**

如果我们看一下对这一即将到来的变化的 [Reddit 讨论](https://www.reddit.com/r/linux/comments/108avzx/linux_preparing_to_disable_drivers_for_microsofts/)，我们会发现许多用户仍然很担心**这是否会破坏大家的 USB 连接**。

考虑到许多安卓手机仍然使用 RNDIS 而不是 CDC NCM（一种较新的协议），用户似乎对这一举措感到困惑 ?；不只是用户，一位 [谷歌的内核网络开发人员](https://lkml.org/lkml/2022/11/23/1502) 也提出了这个议题，但我们还没有看到对此的回应。

**但不是每个人都使用主线 Linux 内核？如果你不想受到这种变化的影响，你是否应该坚持使用 LTS 版本的内核？**

此外，用户希望更清楚地了解这是否会影响到所有人。

但是，从目前来看，Greg 可能并没有给出更多的细节来说服一些相关用户。

? 当然，我们不是 Linux 内核维护者。所以，最好等这个提交通过时，我希望 Linux 内核维护者能比我们知道更多的信息。

? 你对这个计划中的 Linux 内核的变化有什么看法？请在下面的评论中分享你的想法。

---

via: <https://news.itsfoss.com/linux-disable-microsoft-rndis/>

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


Summary:
❶ PyTorch 和 Triton 正在打破英伟达 CUDA 的垄断
❷ Basecamp 因巨额账单退出云计算
❸ 使用了 25 年的笔记本内存规范 SO-DIMM 将被替换

# 硬核观察 #884 PyTorch 和 Triton 正在打破英伟达 CUDA 的垄断

### PyTorch 和 Triton 正在打破英伟达 CUDA 的垄断

大部分机器学习软件开发框架严重依赖于英伟达 CUDA，并在英伟达 GPU 上表现最佳。但随着 PyTorch 2.0 和 OpenAI Triton 的到来，英伟达 CUDA 对机器学习的垄断地位正逐渐瓦解。即将到来的 PyTorch 2.0 在英伟达 A100 上的训练性能提升了 86%，在 CPU 上的推理性能提升了 26%。而且这种优势可以扩展到 AMD、英特尔、特斯拉、谷歌、亚马逊、微软等等各个公司生产的 GPU 和 AI 加速器上。而 Triton 能让高级语言达到与使用低级语言相当的性能，提高了可用性。

>
> **[消息来源：Semi Analysis](https://www.semianalysis.com/p/nvidiaopenaitritonpytorch)**
>
>
>

>
> 老王点评：又一次证明了开源胜过闭源，无论闭源的护城河有多深。
>
>
>

### Basecamp 因巨额账单退出云计算

Basecamp 的 CTO，也是 Ruby On Rails 的创建者 DHH 介绍了让该公司退出云计算的巨额账单。其 2022 年的费用为 320 万美元，绝大部分都花在了 AWS 上，其中 S3 花费 90 万美元，RDS 47 万美元，OpenSearch 52 万美元，Elasticache 12 万美元。即便如此，也是经过大量工作才减少到这一费用的，该团队不但运行了成本检查计划，还就作为私人协议就长期使用达成了协议。DHH 还用戴尔服务器的三年均摊成本做了对比。

>
> **[消息来源：The Register](https://www.theregister.com/2023/01/16/basecamp_37signals_cloud_bill/)**
>
>
>

>
> 老王点评：云计算确实有很多好处，但也可能是个让你花钱上瘾的无底洞。
>
>
>

### 使用了 25 年的笔记本内存规范 SO-DIMM 将被替换

制定内存标准的组织 JEDEC 正在制定新规范，以取代已经使用了 25 年的 SO-DIMM 规范。新的 CAMM 标准将基于戴尔公司的设计，目标是在 2023 年下半年完成 1.0 规范，到明年推出基于 CAMM 的系统。现有的 SO-DIMM 在 DDR5/6400 时已经遇到了“困境”，CAMM 的主要吸引力在于它可以实现更高的内存密度，同时还可以扩展到更高的时钟速度。

>
> **[消息来源：PC World](https://www.pcworld.com/article/1473126/camm-the-future-of-laptop-memory-has-arrived.html)**
>
>
>

>
> 老王点评：这是不是代表以后笔记本会需要更多内存？
>
>
>


lnav: 用于 Linux 的高级日志文件浏览器

# lnav: 用于 Linux 的高级日志文件浏览器

>
> 如果你想调试或排除任何问题，你需要一个像 lnav 这样的高级日志文件查看器。它在任何 Linux 系统的终端都能创造奇迹。
>
>
>

### lnav: 日志文件查看器

`lnav` 可以即时解压缩所有的压缩日志文件，并将它们合并在一起进行漂亮的显示。显示是根据错误/警告的类型进行解析和格式化的，这有助于快速浏览成千上万的日志，特别是在服务器中。

在分析日志的时候，时间戳是非常重要的。所以 `lnav` 会根据时间戳合并多个日志，这对追踪系统问题很有帮助。

大多数重要的日志文件格式检测都是内置的，包括如下：

* <ruby> 通用网络访问日志 <rt>  Common Web Access Log </rt></ruby>格式
* CUPS page\_log
* Syslog
* Glog
* VMware ESXi/vCenter 日志
* dpkg.log
* uwsgi
* “通用”：任何以时间戳开头的信息
* Strace
* sudo
* GZIP、BZIP

这还不是全部，`lnav` 还能实现以下功能，使其成为 Linux 系统的重要应用：

* 根据正则表达式过滤消息
* 错误日志的时间轴视图
* 漂亮的打印视图，这有助于重新格式化
* 使用 SQL 查询日志
* 在搜索时，日志会实时更新
* 通过正则表达式高亮显示语法（比如你想在整个日志中找出一个 IP 地址）
* 显示的日志中任何单词的 Tab 补全！!

要查看上述功能的截图和了解更多信息，请访问 [本页面](http://lnav.org/features/) 。

### 如何安装

这个程序在 Ubuntu、Debian 的官方仓库中可以找到。使用以下命令安装它。

```
sudo apt install lnav

```

而对于 Fedora、RHEL 用户，使用下面的命令：

```
sudo dnf install lnav

```

另外，开发者还提供了一个离线的独立可执行文件，你不需要安装。你可以从 [GitHub 发布页](https://github.com/tstack/lnav/releases/) 下载压缩包，然后按以下方式执行：

```
./lnav

```

**注意**：它也可用于 macOS，你可以在上述 GitHub 页面找到。

### lnav: 如何使用（基础）

简单的命令语法是：

```
lnav [options] [logfile1 logfile2 …]

```

如果你直接运行 `lnav` 命令，它会显示你系统中的所有日志（`/var/log/messages` 和 `/var/log/syslog`)

```
lnav

```

要查看任何特定的日志文件，在命令行中输入：

```
lnav /var/log/syslog

```

使用 `-t` 参数在你的日志输出中添加时间戳：

```
lnav -t /var/log/syslog

```

以下是 `lnav` 的一些关键开关：

* `-d file`：将调试信息写入给定的文件。
* `-a`：加载所有最新的日志文件类型。
* `-r`：也加载较早的轮转的日志文件。
* `-t`：在标准输入中读入的数据行上预加时间戳。
* `-w file`：将标准输入的内容写入该文件。
* `-c cmd`：在文件加载后执行命令。
* `-f path`：执行给定文件中的命令。
* `-n`：不使用 curses UI 运行（无头模式）。

要进一步阅读和探索，请访问 [官方文档](https://docs.lnav.org/en/latest/intro.html)。

---

via: <https://www.debugpoint.com/advanced-log-file-viewer-lnav-ubuntu-linux/>

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


你可以尝试的 5 个 NeoVim GUI 编辑器

vim的配置文件可以在neovim下使用吗？

迁移基本没啥问题

# 你可以尝试的 5 个 NeoVim GUI 编辑器

Vim 很不错，但 NeoVim 更新一些，甚至更棒。Vim 和 NeoVim 都是基于终端的文本编辑器，具有类似的功能。

如果你是一个习惯于使用 [像 VS Code 这样的 GUI 文本编辑器](https://itsfoss.com/best-modern-open-source-code-editors-for-linux/) 的人，并且希望拥有 NeoVim 提供的类似功能，你应该了解一下这些 GUI 编辑器。

虽然我知道你可以把 NeoVim 作为你目前的文本编辑器的插件，但直接使用 NeoVim 工作要比管理插件更有效和方便。

在选择 NeoVim 的 GUI 时，有一些不同的选择，我把一些最好的 GUI 列在下面：

### 1、Neovide

主要特点：

* 动画光标
* 平滑滚动
* 动画窗口
* 模糊的浮动窗口
* 支持表情符号

[Neovide](https://neovide.dev/index.html) 旨在成为一个简单的 NeoVim GUI。

虽然你不会看到很多图形元素，它只是增加了一些诸如动画之类的 GUI 功能。它使用了一个叫 Skulpin 的库来渲染动画。

而我在使用 Neovide 时最喜欢的地方是它拥有一个动画光标和平滑滚动。你看一看这个就明白了：

看起来很酷。对吗？

### 2、Neovim Qt

主要特点：

* 悬停功能
* 多个 GUI 标签
* 自动制表符补完
* 跨平台支持

顾名思义，[Neovim Qt](https://github.com/equalsraf/neovim-qt) 是用 Qt5 库构建的，你会经常看到它在 KDE 中使用。它没有太多花哨的东西，只是增加了一些额外的 GUI 功能，如多个标签，自动制表符补完等。

因此，如果你已经在使用 Qt5 库，并希望为 NeoVim 提供一个精简的 GUI，它将工作的很好，并为你省去一些依赖安装。

推荐：

>
> **[Vim vs Nano：你应该选择哪个？](https://itsfoss.com/vim-vs-nano/)**
>
>
>

### 3、Uivonim

主要特点：

* WebGL GPU 渲染和多线程
* 支持 VSCode 扩展
* Nyancat（经典猫咪动画的 ANSI 文本程序）
* 悬停和代码动作

[Uivonim](https://github.com/smolck/uivonim) 是 Veonim（一个建立在 VSCode 插件和 NeoVim 上的简单 IDE）的复刻版，采用 Electron 框架编写，如果你从 VSCode 转换过来，它是一个完美的选择。

而 Uivonim 的唯一目标是提供丰富的 NeoVim 体验，支持 NeoVim 的最新功能，包括浮动窗口、内置 LSP 等等。你不需要依赖 VSCode 扩展来获得这些功能。

### 4、FVim

主要特点：

* 脱离窗口（使用 `Ctrl+w`，`GE`）
* 自定义弹出式菜单条目图标
* 支持 HiDPI
* GPU 加速

[FVim](https://github.com/yatli/fvim) 是一个用 F# + Avalonia 构建的 NeoVim 的跨平台 GUI，带有一些突破性的功能，如高性能渲染（在 4K 显示器上支持 60FPS）。

而我经常使用脱离窗口的功能，因为我更喜欢为不同的文本文件设置独立的窗口。另外，如果你是一个资深的远程用户，FVim 也不会让你失望。

### 5、Goneovim

主要特点：

* 支持一个带有 Bash 和 Zsh 的终端
* 迷你地图
* 动画光标
* HiDPI 缩放
* 外部浮动窗口

顾名思义，[Goneovim](https://github.com/akiyosi/goneovim) 是用 Go 语言编写的，是 Gonvim 的一个复刻品。它提供了足够的 GUI 功能来完成你的工作，如动画光标、像素级滚动等。

而且它在让你获得基本的文本编辑功能方面也并不差，比如对文本文件的拖放支持。

### 总结

这是我对 NeoVim 的图形用户界面的一些好的选择，我希望你能找到你想要的东西。

如果我错过了任何你喜欢的东西，请在评论中告诉我。

---

via: <https://itsfoss.com/neovim-gui-editors/>

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


硬核观察 #885 苹果 AR 眼镜被无限期推迟

Summary:
❶ 苹果 AR 眼镜被无限期推迟
❷ 数千 Sophos 防火墙存在严重漏洞
❸ Windows 专业版也将默认禁止访客访问

# 硬核观察 #885 苹果 AR 眼镜被无限期推迟

### 苹果 AR 眼镜被无限期推迟

据报道，由于技术上的挑战，苹果公司已经无限期推迟了其轻型增强现实（AR）眼镜的推出，但仍计划在今年推出其首款混合现实（MR）头盔。MR 头盔结合了增强现实和虚拟现实（VR），将在今年的春季活动中推出，该设备的价格将在 3000 美元左右。但 Meta 的 Quest Pro 价格只有它的一半左右。

>
> **[消息来源：路透社](https://www.reuters.com/technology/apple-indefinitely-postpones-launch-ar-glasses-bloomberg-news-2023-01-18/)**
>
>
>

>
> 老王点评：看来在 AR 眼镜上又一家巨头折戟了，我原本很看好苹果的 AR 眼镜。
>
>
>

### 数千 Sophos 防火墙存在严重漏洞

数千台暴露在互联网上的服务器运行的 Sophos 防火墙中存在一个严重漏洞，允许黑客执行恶意代码。它的严重性评级为 9.8/10。当 Sophos 在去年 9 月披露该漏洞时，它已经作为一个零日漏洞在野外被利用。该安全公司敦促客户安装热补丁或完整的升级。最新的研究发现，有超过 4400 台运行 Sophos 防火墙的服务器仍然存在漏洞，约占所有的 Sophos 防火墙的 6%。

>
> **[消息来源：ARS Technica](https://arstechnica.com/information-technology/2023/01/more-than-4400-sophos-firewall-servers-remain-vulnerable-to-critical-exploits/)**
>
>
>

>
> 老王点评：作为第一道防御措施，如果连严重漏洞都不去修补，无异于给盗贼开门。
>
>
>

### Windows 专业版也将默认禁止访客访问

这意味着最新版本的 Windows 10、Windows Server 2019、使用 SMB2 和 SMB3 的系统将不再默认允许访客账户访问远程服务器，或允许那些提供无效凭证的人回退到访客账户。这使得 Windows 专业版与企业版和教育版中安全性保持一致，它们自 Windows 10 以来就不再允许默认访问。允许客户端使用访客登录使用户容易受到中间人攻击或恶意服务器的影响。微软称，自 Windows 2000 以来，Windows 客户端和服务器就不允许访客访问或远程用户作为访客或匿名用户连接。只有第三方远程设备可能默认需要访客访问，但运行 Windows 的系统不需要。

>
> **[消息来源：The Register](https://www.theregister.com/2023/01/17/microsoft_windows_pro_guest)**
>
>
>

>
> 老王点评：默认访客可能是方便，但在当前网络安全越来越重要的形式下，显然是个严重的安全缺陷。
>
>
>


Unix 已落幕，Unix 仍长存

Rest in peace...

血统断绝，精神长存。

R.I.P

最后剩下的Unix难道不是BSD？没有AT&T跟BSD的那场官司，Linux未必能发展到今天

windows、macOS、linux，某种意义上说都是UNIX

# Unix 已落幕，Unix 仍长存

>
> 不要指望再看到任何更多的 AIX 大新闻了。这意味着最后剩下的 Unix 是 …… Linux。
>
>
>

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

这是一个时代的结束。正如上周报道的那样，IBM 已经将 AIX 的开发转移到印度。在它支付了 340 亿美金买下了红帽，有了自己的 FOSS 版本的 Unix 后，为什么还要为一个昂贵的美国团队支付费用来维护它自己的官方 Unix 的专有版本呢？！

自从我们报道“大蓝”推出 [不支持 AIX](https://www.theregister.com/2015/11/02/ibm_linux_mainframes/) 的新 POWER 服务器后，我们就察觉到了这一点 —— 而这已经是近八年前的事了。即使这已经是明摆的事，它也是一个重大事件。AIX 是最后一个正在积极开发的专有 Unix，在官方的 Open Group [名单](https://www.opengroup.org/openbrand/register) 的 10 个条目中就占了 4 个。

在甲骨文公司内部，Solaris 正处于 [维护模式](https://www.theregister.com/2022/08/19/oracle_solaris_updated/)。几乎整整六年前，我们报道了下一个主要版本 Solaris 12 已经从甲骨文的路线图上 [消失](https://www.theregister.com/2017/01/18/solaris_12_disappears_from_oracles_roadmap/) 了。HPE 的 HP-UX 也处于维护模式，因为没有新的硬件可以运行它。安腾现在真的 [已经死了](https://www.theregister.com/2019/02/01/intel_kills_itanium_again/)，而最后 HP-UX 只能在这上面运行。自从我们报道惠普调查但 [取消](https://www.theregister.com/2012/05/23/hp_project_blackbird_redwood_hp_ux/) 了将其移植到 x86-64 的努力以来，已经过去了十年。

SCO Group 的最后一个化身 Xinuos [仍然存在](https://www.theregister.com/2021/03/31/ibm_redhat_xinuos/)，它提供的不是一个而是两个专有的 Unix 变体：SCO [OpenServer](https://www.xinuos.com/products/openserver-6/) 是 SCO Xenix 的后代，而 [UnixWare](https://www.xinuos.com/products/unixware-7/) 是 Novell 的 Unix 的后代。我们注意到，OpenServer 10，一个基于 FreeBSD 10 的更现代的操作系统，已经从 Xinuos 的主页上消失了。值得指出的是，SCO Group 是以前被称为 [Caldera](https://www.theregister.com/2002/08/27/sco_lives_caldera_reinvents_itself/) 的公司，与 1980 年代与微软 [共同创建](https://www.theregister.com/2000/01/31/ms_sells_stake_in_sco/) Xenix 的 Santa Cruz Operation 不是同一个 SCO。

曾经有 [两个](https://www.theregister.com/2022/08/30/kylin_the_multiple_semiofficial_chinese/) 中国的 Linux 发行版通过了 Open Group 的测试，可以使用 Unix 商标：[浪潮 K/UX](https://www.opengroup.org/openbrand/register/brand3617.htm) 和 [华为 EulerOS](https://www.opengroup.org/openbrand/register/brand3622.htm)。虽然这两家公司都丢掉了这个相当 [昂贵](https://www.opengroup.org/openbrand/Brandfees.htm) 的商标。但这里的重要细节是，Linux 通过并被认证为 UNIX™。而且这不仅仅是一个发行版，尽管这两个都是 CentOS Linux 的衍生产品。我们怀疑任何 Linux 都会轻而易举地通过，因为许多非类 Unix 操作系统以前都通过了。

其他操作系统已经通过了，或者可能很容易就会通过。IBM 的 z/OS 活得很好：2021 年推出了 [2.5 版本](https://www.theregister.com/2021/07/28/z_os_2_5_launch/)，2022 年大蓝开始提供 [云实例](https://www.theregister.com/2022/06/29/ibm_cloud_mainframe_launch/)。z/OS 有一个与 Unix 兼容的环境，已经通过了兼容性测试，所以正式来说，它是一个 UNIX™，即使这不是它最初的原生 API。

“OpenVMS” 这个名字中的 “Open” 最初 [是指](https://www.pcmag.com/encyclopedia/term/openvms) 它在 1991 年的第五版中获得的 POSIX 兼容性，并首次应用于 DEC 的 Alpha CPU 的新版本。去年，VMS 软件公司发布了适用于 x86-64 管理程序的 [9.2 版本](https://www.theregister.com/2022/05/10/openvms_92/)（以及一个支持的机器，HPE [DL380](https://www.hpe.com/psnow/doc/a00008180enw.html)）。

自从 1993 年的 Windows NT 以来，Windows 就有了一个 POSIX 环境。现在，有了 WSL，它可以说有了两个，而且我们怀疑，如果微软有这样的想法，它可以把 Windows 认证为一个官方的 Unix 兼容的操作系统。

在我们最近关于 Haiku Beta 4 的 [报道](https://www.theregister.com/2023/01/11/haiku_beta_4/) 中，我们说它并不是真正的 Unix。正如你所看到的，在文章的结尾处有一个编辑说明，解释了为什么。

我们听取了 Haiku 的主要全职开发人员的意见，他坚决不同意我们的观点。在他看来，Haiku 现在有很强的 Unix 兼容性，文件系统中有一些主要的 Unix 目录，有一套相当完整的 Unix API 调用，有一个 Unix shell，等等，这意味着 Haiku 绝对是一个 Unix。我们认为，由于它是 BeOS 的重新实现，有自己原生的文件系统、API、GUI 等等，它是一种不同的东西，只是提供了 Unix 兼容性。

但这说明了在 21 世纪准确定义 “Unix” 一词的含义的困难。自从 1993 年 Novell 从 AT&T [收购](https://www.theregister.com/2013/07/25/novell_peaked_with_netware_four/) 了 Unix 系统实验室，保留了代码，并将商标捐赠给 Open Group 后，Unix 就不再意味着 “基于 AT&T 的代码”。从那时起，如果通过了 Open Group 的测试（并且你支付了使用商标的费用），它就是 UNIX™。Haiku 还没有，所以它不是。Linux 有，所以它是。但 z/OS 也是如此，它是 OS/390 的直接后裔，或者说它是 IBM MVS 在 1974 年推出时的名字。换句话说，它是一个实际上并不基于、类似于、甚至与 Unix 有关的操作系统。

这意味着最后一个官方商标的商业 UNIX™ 是苹果的 macOS 13，在专有的 GUI 层之下，无论如何，它主要是一个名为 Darwin 的开源操作系统。内核 [XNU](https://github.com/apple/darwin-xnu) 是基于 Mach 的，内核中的 “Unix 服务器” 来自 FreeBSD。

所以，从 2023 年起，开源真的赢了。现在有比以往更多的类 Unix 操作系统，还有一些非常不类似于 Unix 的操作系统与之高度兼容，但是官方路线，就所有的意图和目的而言，已经死亡和消失。所有专有的、商业的 Unix 们现在都是在维持而已：它们会得到基本的错误修复和安全更新，但我们不会看到任何重大的新版本。

让我们为之献花。

---

via: <https://www.theregister.com/2023/01/17/unix_is_dead>

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

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


apt remove 和 apt purge: 有什么区别？

Summary: 两者之间有什么不同呢？下面将为你揭晓。

了解啦

两者之间有什么不同呢？下面将为你揭晓。

# apt remove 和 apt purge: 有什么区别？

如果你想 [在 Ubuntu 上使用终端卸载软件](https://itsfoss.com/apt-remove/)，可以使用：

```
sudo apt remove package_name

```

但是在很多论坛，你可能会看到别人说，如果你想彻底删除软件就用 `apt purge`。

你可能会觉得很困惑，因为 `apt purge` 和 `apt remove` 看起来是一样的。

```
sudo apt purge package_name

```

为什么会有两个如此像的命令来删除软件包呢？两者之间有什么不同呢？下面将为你揭晓。

### apt-remove 和 apt-purge 有什么不同？

`apt-remove` 和 `apt-purge` 的相同之处就是都可以卸载软件包，但是运行 `apt-purge` 除了可以删除安装包之外，还可以清除相关的配置文件。这是两者之间唯一的不同点。要注意的是这两条命令都不能删除用户主目录中相关的应用程序文件。

你是否遇到过这样的情况，卸载一个软件然后重新安装，却发现之前的设置都还在。这是因为用 `apt remove` 不能删除该软件的相关配置文件。

#### 哪些东西被删除了？哪些还在？

我分享一个使用 `apt remove` 和 `apt purge` 两个命令分别卸载 mplayer 这个软件的实际例子。重点是看每次操作后还残余哪些文件。

这是删除前的文件：

现在运行 `apt remove` 这个命令：

下面的是还残留在系统中的文件：

我们可以看到，有两个地方残留着 mplayer 的文件: `/etc` 和 `/home/abhishek`。

这次我们重新安装 mplayer，然后用 `apt purge` 来卸载软件。

现在让我们看看与 mplayer 相关的文件：

我们可以看到 `/etc` 目录下的文件已经没有了。

但是在主目录中的文件呢？`apt purge` 会删除它们吗？

答案是否定的。`apt` 命令不会删除主目录中的配置文件。所以它们仍然在系统中，除非你手动删除。但是这些文件所占的空间真的很小，几乎不占磁盘空间。

值得注意的是，不是所有的软件在主目录或者 `/etc` 目录下都有配置文件。

#### 使用 apt remove 或者 apt purge 的效果

我能想到的一个实际例子就是 Discord，你用 deb 文件 [在 Ubuntu 上安装了 Discord](https://itsfoss.com/install-discord-linux/)。然后登录自己的账号，之后又卸载并重新用 deb 文件安装。

现在如果你打开 Discord，你会发现你的账号自动登录了。是不是觉得很奇怪？

这是个功能，像一些软件，比如 Discord、VirtualBox，它们会提供更新，就是卸载现在的版本然后下载新的（尽管你不知道它内部怎么进行的），但是它在卸载的时候，这些软件的配置文件没有被删除，所以等你打开这些软件的时候就会自动登录。

当你想卸载一个软件，但是想保留你过去使用该软件留下的配置文件的时候，你就可以用 `apt remove`。

但是，有时候用它不能满足你的需求，比如当你没有配置好一个软件的时候，你想要重新开始，这个时候用 `apt purge` 就比较合适。

#### 运行 apt purge 是否可以用通配符删除？

当你删除一个包的时候，它会提示 `removing package-name*`。这意味着它会删除以这个包名开头的所有文件。

我在手册页之类的文档中没有找到关于这个问题的答案。所以我自己做了一个小测试，我安装了 espeak 和 espeak-ng 这两个软件，espeak\* 应该可以通配扩展到 espeak-ng。

但是当我用 `apt purge` 删除 espeak 包时，espeak-ng 包还在，没有被一并删除。因此，这似乎是有一种防止通配符的扩展的机制。

### 那么，你应该使用 apt remove 还是 apt purge 呢？

很少有人会一直使用 `apt purge`。

在我看来，一般清况下，用 `apt remove` 就可以了，但是当你想删除那些自定义配置文件时，你就得用 `apt purge`。

不管是用 `apt remove` 还是 `apt purge`，你都需要从用户的主目录中删除残余的配置文件，并运行 `apt autoremove` 来清除任何依赖的包。

现在到你啦。你现在对 `apt remove` 和 `apt purge` 的区别更加了解吗？你更喜欢使用哪一个呢？

---

via: <https://itsfoss.com/apt-remove/>

作者：[Abhishek Prakash](https://itsfoss.com/) 选题：[lkxed](https://github.com/lkxed) 译者：[Tingze-G](https://github.com/Tingze-G) 校对：[wxy](https://github.com/wxy)

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


硬核观察 #886 谷歌公共 DNS 服务正在推行大小写混杂查询

Summary:
❶ 谷歌公共 DNS 服务正在推行大小写混杂查询
❷ 290 款微星主板的安全启动默认被绕过
❸ USB4 2.0 规格正式发布，USB-C 可达 120Gbps

# 硬核观察 #886 谷歌公共 DNS 服务正在推行大小写混杂查询

### 谷歌公共 DNS 服务正在推行大小写混杂查询

在 DNS over TLS 之前，DNS 查询由于技术原因会被投毒，从而导致客户端访问到投毒者设置的假冒地址。为了避免这种安全风险，最好的方式是使用 DNS over TLS 这样的加密查询通道。但是仍然有大量的 DNS 服务器没有或不能使用加密查询。谷歌从 2009 年就在小范围实验一种名为 0x20 的做法，它可以将查询的域名随机改变字母大小写，这可以有效的提高 DNS 投毒的难度。现在谷歌已经扩大了该方案，已经覆盖了 90% 没有使用加密查询的 DNS 服务器。

>
> **[消息来源：The Register](https://www.theregister.com/2023/01/19/google_dns_queries/)**
>
>
>

>
> 老王点评：以后在你的权威 DNS 服务器上看到类似 [liNUx.cN](http://linux.cn/) 这样的查询不要惊奇。
>
>
>

### 290 款微星主板的安全启动默认被绕过

安全启动是 UEFI 主板固件中的一项安全功能，确保在启动过程中只有受信任的（签名）软件可以执行。研究发现，微星公司在 2021 年 9 月至 2022 年 1 月期间发布的固件更新，改变了微星主板上的一个默认安全启动设置，该设置允许任何操作系统镜像运行，无论其是否有错误或丢失的签名。受影响的主板超过了 290 款，包括最新的用于英特尔和 AMD CPU 的微星主板。

>
> **[消息来源：Bleeping Computer](https://www.bleepingcomputer.com/news/security/msi-accidentally-breaks-secure-boot-for-hundreds-of-motherboards/)**
>
>
>

>
> 老王点评：我觉得讨厌安全启动功能的人会喜欢这个默认设置。
>
>
>

### USB4 2.0 规格正式发布，USB-C 可达 120Gbps

USB-C 是令人困惑的，一个 USB-C 端口或电缆可以支持一系列的速度、电源能力和其他功能，它支持的数据传输速率，可以从 USB 2.0 的 0.48Gbps 一直到 USB4 和雷电 3/4 的 40Gbps。USB 实施者论坛（USB-IF）今天发布了 USB4 2.0 规范，它增加了对 80Gbps 双向带宽的可选支持，以及以高达 120Gbps 速度发送或接收数据的可选能力。但预计在至少 12 到 18 个月内不会看到支持新规格的产品出现。

>
> **[消息来源：USB-IF](https://www.usb.org/document-library/usb4r-specification-v20)**
>
>
>

>
> 老王点评：都是一种样子的接口，但是有的电缆就特别优秀。?
>
>
>

### 回音

* 自去年 9 月 [宣布](/article-15090-1.html) 以来，谷歌今天正式 [关闭](https://www.macrumors.com/2023/01/18/googles-stadia-shuts-down-today/) 了其 Stadia 云游戏平台。除了对用户购买的软硬件退款之外，他们还使其游戏手柄能够使用蓝牙，以便在其他游戏平台上使用。


构建高效的 DevOps 文化的 6 个技巧

# 构建高效的 DevOps 文化的 6 个技巧

>
> 无论你是刚刚开始在你的组织中使用 DevOps，还是仅仅想改善你现有的文化，请考虑这些技巧以及它们与你组织的未来的关系。
>
>
>

你为什么要构建 [DevOps](https://opensource.com/resources/devops) 文化？开发团队和运维团队的精简协作有很多好处。效率是首要目标：提高新软件部署的速度，减少等待的时间。培养同事之间的信任可以提升员工的满意度，激发新的创新，并对盈利能力产生积极的影响。

[DevOps](https://opensource.com/article/22/2/devops-documentation-maturity) 是一个很广泛的思想，大家的理解也见仁见智。每个公司对于如何实行 DevOps 也各不相同。这种意见的多样性实际上是一件好事 —— 这么多的观点对于建立更强大的团队是很有用的。本指南将探讨在 DevOps 文化中鼓励同事之间更好地合作的最高技巧。

下面每个部分从不同的视角介绍 DevOps 文化，并探讨了将它引入员工队伍的方法。

### 流程的持续发展

DevOps 文化的这一核心原则使它与许多其他类型的工作场所的风气区别开来。DevOps 哲学说，犯错是有积极意义的，因为这表明你在尝试新的想法。

DevOps 文化的核心是不停地创造。实际上，这意味着当测试结果显示事情由于你的改动而变坏时，不要懊恼。我们要认识到，进化的过程不是线性的，通往成功的道路也从来不是一条直线。

DevOps 专家 [Gene Kim](https://enterprisersproject.com/user/gene-kim) 主张勇于承担风险和进行实验。鼓励你的团队尝试不寻常的任务，以得到新的领悟。

你的组织应该以利润为导向吗？你能允许你的团队尝试一些新东西（非指个人兴趣项目）吗？持续的流程发展意味着对升级目前的方法持开放态度。优秀的销售领导懂得，结果比出勤率更重要，因此，关注团队的工作方式而不是工作量的多少始终是关键。

### 随时提供反馈并积极寻求反馈

成员之间增加信任是蓬勃发展的 DevOps 文化的另一个关键特征。无论你的员工是在学习如何建立联盟网络联系，还是试图设计他们的下一个 [用户体验](https://opensource.com/article/22/7/awesome-ux-cli-application) 调查，每个人都应该对他们工作的反馈持开放态度。但是，除非你的团队成员尊重彼此的意见，并相信反馈是本着善意的精神提出的，否则这永远不会发生。

这种文化听起来可能是很难培养的；事实上，一些公司会比其他公司更努力地实现这一点。诚然，给予和接受反馈的成功很大程度上取决于员工的个性。在招聘过程中，也可以对此进行筛选。

在你期望员工随时向同事提供反馈并主动寻求反馈之前，你应该以身作则。高管应该以身作则，公开要求公司成员对其战略决策提出探究性问题，并提供相应的反馈。

### 不断改进

在同事之间增加对智力信任的基础上，你的团队应该寻找方法来改善其工作。DevOps 的性质意味着软件开发团队将比传统方法更迅速地进行部署。

这种开放的改进文化可以对开发和运维以外的部门产生积极的影响。你也可以自己去探索企业还有哪些领域会受到积极的影响。

留意培训和提高技能的机会。即使一个培训课程没有广告上说的那么突出，但有机会与行业专家建立联系，并与未来建立联系，这可以提高你的组织内的思想多样性。

### 为以后的开发保存当前的想法

频繁使用的 [Git](https://opensource.com/article/22/11/git-concepts) 账户应该是你的 DevOps 工具链的一部分。你可以用 Git 作为软件开发和其他相关项目中产生的脚本的共同仓库。Git 作为 “版本控制” 工具而被熟知，Git 允许程序员保存他们工作的迭代、复用或改进其他人的工作。

你的目标是能够保留好的想法以供将来使用。某个方法由于某种原因没有成功。然而，那套想法在当时是错误的，并不意味着它在未来永远无法成为有用的东西。

由于 DevOps 的整个重点在于生产环境中的软件的端到端所有权，因此节省开发的迭代真正支持这一原则。你希望看到对手头的软件测试项目的持续关注和投入。

一个简单的方法是要求开发者在开发者合同和最终项目报告中包含对未来工作的想法。确保技术服务经理知道他们应该要求提供在建设过程中出现的旁门左道的想法的例子。意识到这些小创新的人越多，在需要的时候就越有可能有人记住一个。

### 坐在一起（物理上或逻辑上）

目标是对彼此的工作角色以及它们之间的相互关系有一个共同的理解。你可以通过几个简单的方法实现这一目标，用一句话概括：坐在一起。邀请其他团队参加你们的会议，完整地分享用户反馈报告。一起吃午饭，一起计划虚拟的快乐时光，一般来说，要确保你的同事都在一起。大约 90% 的拥有成熟的 DevOps 协议的团队报告说，他们清楚地了解自己对其他团队的责任，而在不成熟的 DevOps 团队中，只有大约 46% 的工作者清楚地了解自己的责任。

虽然与志同道合的人结成小团体，只与被雇来执行与你相同任务的员工在一起是很诱人的，但这对整个企业来说是很糟糕的。无论你喜欢与否，所有的人都是多面手，能够在一系列的情况下贡献自己的独特才能。

密切协作的理念是尊重任何人对其周围正在进行的产品或工作流程提出改进建议的能力。如果你与公司内的其他部门保持一定的距离，你将会错过无数次分享智慧想法的机会。毕竟，你往往在交流中学习得最好。

### 致力于自动化

你应该以提高效率和加速流程的名义，寻求将单调的和重复的任务变为自动化。每个行业都有无聊的 —— 说得直白一点，就是愚蠢的 —— 每天或每周都要进行的工作。

无论是手工将数据从一页复制到另一页，还是手工打出音频记录，每个级别的工作人员都应该坚持让机器在可能的情况下承担这些负担。现实是自动化技术每年都在进步，操作流程也应该如此。[自动化测试](https://opensource.com/article/20/7/open-source-test-automation-frameworks) 对 DevOps 非常关键，它是 CALMS 框架的第二个原则（其中的 “C” 代表 “文化”）。

你怎样才能实现这一点？邀请员工公开表达他们认为工作的哪些方面可以自动化，然后 —— 这里是关键的部分 —— 支持实现自动化所需的设施。这可能意味着每年花 600 美元订阅一个软件程序、一套完整的企业应用现代化解决方案，或开发人员用两天时间来建立一个在内部使用新工具。

无论哪种方式，你都应该评估自动化的好处，考虑你可以为每个人节省多少时间。DevOps 的统计数据不断表明，现代公司通过整合这些有益的原则，年复一年地得到了很大的改善。

### 探索成功的新工作方式

文化转变不会在一夜之间发生。不过，你越早开始，就越早看到结果。根据我的经验，当变化真正对以前进行了改进时，人们会接受它。DevOps 为这种改进提供了一个框架。无论你是刚刚在你的组织中开始使用 DevOps，还是仅仅想改善你现有的文化，请考虑以上几点以及它们与你组织的未来的关系。

---

via: <https://opensource.com/article/23/1/tips-effective-devops-culture>

作者：[Yauhen Zaremba](https://opensource.com/users/yauhen-zaremba) 选题：[lkxed](https://github.com/lkxed) 译者：[lxbwolf](https://github.com/lxbwolf) 校对：[wxy](https://github.com/wxy)

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


用复古电脑程序 Toy CPU 学习低级编程

# 用复古电脑程序 Toy CPU 学习低级编程

>
> 我写了一个名为 “Toy CPU” 的教育性复古计算机程序，以便我的学生能够学习机器语言。
>
>
>

我兼职教授大学课程，包括一个对所有专业开放的一般计算机主题的课程。这是一门入门课程，向学生讲授技术是如何运作的，以消除围绕计算的神秘感。

虽然不是计算机科学课程，但这门课的一个部分涉及计算机编程。我通常用非常抽象的术语谈论编程，所以不会让听众听不懂。但是今年，我想让我的学生以 “老派” 的方式做一些需要 “动手” 的编程。同时，我又想保持简单，以便让每个人都能跟上。

我喜欢将我的课程结构化，以显示你是如何从 “那里” 到 “这里” 的。理想情况下，我会让我的学生学习如何编写一个简单的程序。然后，我将从这里开始，展示现代编程是如何让开发人员创建更复杂的程序的。我决定尝试一种非常规的方法 —— 教学生学习终极的低级别编程语言：机器语言。

### 机器语言编程

早期的个人电脑如 Apple II（1977 年）、TRS-80（1977 年）和 IBM PC（1981 年）让用户用键盘输入程序，并在屏幕上显示结果。但计算机并不总是带有屏幕和键盘。

Altair 8800 和 IMSAI 8080（均为 1975 年制造）要求用户使用面板上的 “开关和灯” 输入程序。你可以用机器语言输入指令，使用一组开关，机器会点亮 LED 灯以代表每个二进制指令的 1 和 0。

对这些早期机器进行编程，需要了解被称为 “<ruby> 操作码 <rt>  opcode </rt></ruby>” （操作代码的简称）的机器语言指令，以执行基本操作，如将两个数字相加或将一个值存储到计算机的存储器中。我想向我的学生展示程序员是如何通过开关和灯，手工输入一系列指令和内存地址的。

然而，在这门课上，使用实际的 Altair 8800 就有点太复杂了。我需要一些简单的、任何初级水平的学生都能掌握的东西。理想情况下，我希望能找到一个简单的 “业余” 复古计算机，其工作原理与 Altair 8800 相似，但我无法找到一个价格低于 100 美元的合适的 “类似 Altair” 的设备。我找到了几个 “Altair” 软件模拟器，但它们忠实地再现了 Altair 8800 的操作码，这对我的需求来说太过沉重。

我决定编写我自己的 “教育” 复古计算机。我称它为 “Toy CPU”。你可以在我的 [GitHub 代码库](https://github.com/freedosproject/toycpu) 上找到它，包括几个可以运行的版本。第一版是一个实验性的原型，运行在 [FreeDOS](https://opensource.com/downloads/guide-using-freedos) 上。第二版是一个更新的原型，在 Linux 上用 [ncurses](https://opensource.com/article/21/8/ncurses-linux) 运行。版本 3 是一个 FreeDOS 程序，在图形模式下运行。

### Toy CPU 的编程

Toy CPU 是一个非常简单的复古计算机。它只有 256 字节的内存和一个最小化的指令集，其目的是在复制 “开关和灯” 编程模式的同时保持简单化。它的界面模仿 Altair 8800，有一系列 8 个 LED 灯，分别代表计数器（程序的 “行号”）、指令、累积器（用于临时数据的内部存储器）和状态。

当你启动 Toy CPU 时，它通过清除内存来模拟 “启动”。当它启动时，它也会在屏幕右下方的状态灯中显示 “INI”（初始化）。“PWR”（电源）灯亮表示 Toy CPU 已被打开。

当 Toy CPU 准备好让你进入一个程序时，它通过状态灯指示 “INP”（“输入”模式），并让你从程序的计数器 0 开始。Toy CPU 的程序总是从计数器 0 开始。

在 “输入” 模式下，用上下方向键显示不同的程序计数器，按回车键编辑当前计数器上的指令。当你进入 “编辑” 模式时，Toy CPU 的状态灯上会显示 “EDT”（“编辑” 模式）。

Toy CPU 有一张速查表，被 “贴” 在显示屏的前面。它列出了 Toy CPU 可以处理的不同操作码。

* `00000000`（`STOP`）：停止程序执行。
* `00000001`（`RIGHT`）：将累加器中的位向右移动一个位置。值 `00000010` 变成 `00000001`，`00000001` 变成 `00000000`。
* `00000010`（`LEFT`）：将累加器中的位向左移动一个位置。值 `01000000` 变成 `10000000`，`10000000` 变成 `00000000`。
* `00001111`（`NOT`）：对累加器进行二进制非操作。例如，值 `10001000` 变成 `01110111`。
* `00010001`（`AND`）：对累加器用存储在某一地址的值进行二进制与操作。该地址被存储在下一个计数器中。
* `00010010`（`OR`）：对累积器用存储在某一地址的值进行二进制或运算。
* `00010011`（`XOR`）：对累加器用存储在某一地址的值进行二进制异或运算。
* `00010100`（`LOAD`）：将一个地址的值加载（复制）到累加器中。
* `00010101`（`STORE`）： 存储（复制）累加器中的值到一个地址。
* `00010110`（`ADD`）：将存储在某一地址的数值加入到累加器中。
* `00010111`（`SUB`）：从累积器中减去储存在某一地址的数值。
* `00011000`（`GOTO`）：转到（跳到）一个计数器地址。
* `00011001`（`IFZERO`）：如果累加器为零，转到（跳到）一个计数器地址。
* `10000000`（`NOP`）：空操作，可以安全地忽略。

当处于 “编辑” 模式时，使用左右方向键选择操作码中的一个位，然后按空格键在关闭（0）和开启（1）之间翻转数值。当你完成编辑后，按回车键回到 “输入” 模式。

### 一个示例程序

我想通过输入一个简短的程序来探索 Toy CPU，将两个数值相加，并将结果存储在 Toy CPU 的内存中。实际上，这执行的是算术运算 `A+B=C`。要创建这个程序，你只需要几个操作码：

* `00010100`（`LOAD`）
* `00010110`（`ADD`）
* `00010101`（`STORE`）
* `00000000`（`STOP`）

`LOAD`、`ADD` 和 `STORE` 指令需要一个内存地址，这个地址总是在下一个计数器的位置。例如，程序的前两条指令是:

```
计数器 0：00010100
计数器 1：某个内存地址，第一个值 A 存放在那里

```

计数器 0 中的指令是 `LOAD` 操作，计数器 1 中的值是你存储某个值的内存地址。这两条指令一起将内存中的数值复制到 Toy CPU 的累加器中，在那里你可以对该数值进行操作。

将一个数字 `A` 装入累加器后，你需要将数值 `B` 加到它上面。你可以用这两条指令来做：

```
计数器 2：00010110
计数器 3：存储第二个值 B 的内存地址

```

假设你把值 `1`（`A`）装入累加器，然后把值 `3`（`B`）加到它上面。现在累加器的值是 `4`。现在你需要用这两条指令把数值 `4` 复制到另一个内存地址（`C`）：

```
计数器 4：00010101
计数器 5：一个内存地址（C），我们可以在那里保存新的值

```

把这两个值加在一起后，现在可以用这条指令结束程序：

```
计数器 6: 00000000

```

计数器 6 之后的任何指令都可以供程序作为存储内存使用。这意味着你可以用计数器 7 的内存来储存值 `A`，计数器 8 的内存来储存值 `B` ，计数器 9 的内存来储存值 `C`。你需要将这些分别输入到 Toy CPU 中：

```
计数器 7：00000001（1）
计数器 8：00000011（3）
计数器 9：00000000（0，以后会被覆盖）

```

在弄清了所有指令和 `A`、`B` 和 `C` 的内存位置后，现在可以将完整的程序输入到 Toy CPU 中。这个程序将数值 1 和 3 相加，得到 4：

```
计数器 0：00010100
计数器 1：00000111（7）
计数器 2：00010110
计数器 3：00001000（8）
计数器 4：00010101
计数器 5：00001001（9）
计数器 6：00000000
计数器 7：00000001（1）
计数器 8：00000011（3）
计数器 9：00000000（0，以后会被覆盖）

```

要运行程序，在 “输入” 模式下按下 `R` 键。Toy CPU 将在状态灯中显示 “RUN”（“运行” 模式），并从计数器 0 开始执行你的程序。

Toy CPU 有一个明显的延迟，所以你可以看到它执行程序中的每一步。随着程序的进行，你应该看到计数器从 `00000000`（0）移动到 `00000110`（6）。在计数器 1 之后，程序从内存位置 7 加载数值 `1`，累积器更新为 `00000001`（1）。在计数器 3 之后，程序将加数值 `3`，并更新累加器显示 `00000100`（4）。累加器将保持这种状态，直到程序在计数器 5 之后将数值存入内存位置 9，然后在计数器 6 结束。

### 探索机器语言编程

你可以使用 Toy CPU 来创建其他程序，并进一步探索机器语言编程。通过用机器语言编写这些程序来测试你的创造力。

### 一个在累积器上闪灯的程序

你能点亮累加器上的右四位，然后是左四位，然后是所有的位吗？你可以用两种方法之一来写这个程序。

一种直接的方法是，从不同的内存地址加载三个数值，像这样：

```
计数器 0：LOAD
计数器 1：“右边”
计数器 2：LOAD
计数器 3：“左边”
计数器 4：LOAD
计数器 5：“所有”
计数器 6：STOP
计数器 7：00001111（“右边”）
计数器 8：11110000（“左边”）
计数器 9：11111111（“全部”）

```

写这个程序的另一种方法是尝试使用 `NOT` 和 `OR` 二进制操作。这样可以得到一个更小的程序：

```
计数器 0：LOAD
计数器 1：“右边”
计数器 2：NOT
计数器 3：OR
计数器 4：“右边”
计数器 5：STOP
计数器 6：00001111（“右边”）

```

### 从一个数字开始倒数

你可以把 Toy CPU 作为一个倒数计时器。这个程序行使 `IFZERO` 测试，只有当累加器为零时，程序才会跳转到一个新的计数器：

```
计数器 0：LOAD
计数器 1：“初始值”
计数器 2：IFZERO（这也是倒计时的“开始”）
计数器 3：“结束”
计数器 4：SUB
计数器 5：“1”
计数器 6：GOTO
计数器 7：“开始”
计数器 8：STOP
计数器 9：00000111（“初始值”）
计数器 10：00000001（“1”）

```

Toy CPU 是学习机器语言的一个好方法。我在入门课程中使用了 Toy CPU，学生们说他们发现写第一个程序很困难，但写下一个程序就容易多了。学生们还表示，用这种方式编写程序其实很有趣，他们学到了很多关于计算机实际工作的知识。Toy CPU 既具有教育性，也很有趣味性！

---

via: <https://opensource.com/article/23/1/learn-machine-language-retro-computer>

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


硬核观察 #887 安卓 13 占比已超过 5%，原因可能你不知道

Summary:
❶ 安卓 13 占比已超过 5%，原因可能你不知道
❷ ChatGPT 被列为论文署名作者，你同意吗？
❸ 勒索软件受害者付款金额大幅下降，但不是因为攻击减少

# 硬核观察 #887 安卓 13 占比已超过 5%，原因可能你不知道

### 安卓 13 占比已超过 5%，原因可能你不知道

根据谷歌最新的官方安卓分布数据，安卓 13 在发布后不到 6 个月的时间里，已运行在 5.2% 的设备上。以往，最新版本的安卓在半年后也比这个比例少得多。这主要归功于安卓开发和部署方式的结构性变化。2017 年推出的 Project Treble 项目重新架构了平台，将操作系统框架与底层供应商代码分开。这使得更新设备更容易，而无需等待供应商提供更新的驱动程序。

>
> **[消息来源：9to5google](https://9to5google.com/2023/01/18/android-13-device-distribution/)**
>
>
>

>
> 老王点评：原来新安卓系统快速普及的背后是有原因的。?
>
>
>

### ChatGPT 被列为论文署名作者，你同意吗？

至少有四篇论文或预印本将 AI 聊天机器人 ChatGPT 列为署名作者。ChatGPT 通过模仿其训练的庞大文本能生成令人信服的语句，它在学术界引发了争议，因为它给出的陈述不一定正确。一些期刊出版商和预印本服务认为，将 ChatGPT 等 AI 列为署名作者是不合适的，因为它无法对论文内容和完整性负责。而另外一些出版商认为 AI 对论文撰写的贡献可以写在署名作者列表之外的部分。

>
> **[消息来源：《自然》](https://www.nature.com/articles/d41586-023-00107-z)**
>
>
>

>
> 老王点评：我觉得，哪怕就是提供初步的提纲或进行润色填充，也值得署个名。?
>
>
>

### 勒索软件受害者付款金额大幅下降，但不是因为攻击减少

据研究，自 2019 年以来，受害者的支付率从 76% 下降到 41%。数据显示，去年勒索软件的总收入至少下降到 4.6 亿美元，比 2021 年的 7.7 亿美元下降了 40%。而据另外的数据，2021 年至 2022 年的勒索攻击数量仅仅下降了 10.4%。这一金额的降低的主要原因是，支付赎金可能带来严重的法律后果。此外，最终偿还公司赎金的网络安全保险公司也要求在签发或续签保单之前，企业必须证明他们已经有了相应的工具和措施，以防止被勒索软件攻击。

>
> **[消息来源：The Register](https://www.theregister.com/2023/01/19/ransomware_payments_down/)**
>
>
>

>
> 老王点评：看来猖獗的勒索软件攻击终于达到了一定的制约。?
>
>
>