2023年5月

sudo 和 su 命令正在用 Rust 重写

由于 sudo 是用 C 语言编写的,它经历了许多与内存安全问题有关的漏洞。在安全方面,很难想象有什么软件比 sudo 和 su 更重要。在亚马逊 AWS 的资金支持下,sudosu 命令正在用 Rust 编程语言重写,以提高这些广泛依赖的软件的内存安全,进一步加强 Linux/开源的安全性。

消息来源:Phoronix
老王点评:C 和 C++ 语言当年肯定没想过会因为内存安全而丢掉核心基础设施的阵地。

被辞退的 AI 工程师称谷歌拥有更强大的 AI 技术

之前 因主张谷歌 LaMDA AI 拥有情感和意识,而被谷歌辞退的 AI 工程师 Blake Lemoine 在采访中称,谷歌去年秋天几乎发布了其人工智能驱动的 Bard 聊天机器人,但部分因为他提出的一些安全问题,他们删除了它。他认为“谷歌是在以他们认为安全和负责任的方式做事,而 OpenAI 只是碰巧发布了一些东西。”他说,谷歌能做到 Bard 所做的事情的东西或多或少在两年前就可以发布了。在这两年中,他们所做的是努力提高它的安全性,确保它不会捏造和生成有偏见的回应。

消息来源:Futurism
老王点评:说到底还是不成熟,OpenAI 的 AI 不但生成的答案可靠,而且也没有太多的问题。

人工智能编码竞赛,OpenAI 系胜出

研究人员在 Leetcode.com 上测试了五个人工智能机器人解决编码问题的能力:GPT-4、GitHub Copilot、Bard、Bing 和 Claude+。

  • GPT-4 通过了所有测试。它在运行时间上击败了 47% 的对手,在内存占用上击败了 8% 的对手。它生成代码方面具有高度的通用性,但它的响应更慢,而且更贵。
  • Bing 通过了所有的测试。它在运行时间和内存占用上分别战胜了 47% 和 37% 的对手。它在内存占用上战胜了 GPT-4,而且用了更少的代码。
  • GitHub Copilot 通过了所有测试。它在运行时间和内存占用上分别战胜了 30% 和 37% 的对手。
  • Bard 和 Claude+ 都没有通过测试。
消息来源:Hackernoon
老王点评:其实前三个通过测试的都是同一家。

推进你的 Rust 学习,熟悉 Rust 程序的变量和常量。

该系列的第一章中,我讲述了为什么 Rust 是一门越来越流行的编程语言。我还展示了如何 在 Rust 中编写 Hello World 程序

让我们继续 Rust 之旅。在本文中,我将向你介绍 Rust 编程语言中的变量和常量。

此外,我还将讲解一个称为“ 遮蔽 shadowing ”的新编程概念。

Rust 变量的独特之处

在编程语言中,变量是指 存储某些数据的内存地址的一个别名

对 Rust 语言来讲也是如此。但是 Rust 有一个独特的“特性”。每个你声明的变量都是 默认 不可变的 immutable 。这意味着一旦给变量赋值,就不能再改变它的值。

这个决定是为了确保默认情况下,你不需要使用 自旋锁 spin lock 互斥锁 mutex 等特殊机制来引入多线程。Rust 会保证 安全的并发。由于所有变量(默认情况下)都是不可变的,因此你不需要担心线程会无意中更改变量值。

这并不是在说 Rust 中的变量就像常量一样,因为它们确实不是常量。变量可以被显式地定义为可变的。这样的变量称为 可变变量

这是在 Rust 中声明变量的语法:

// 默认情况下不可变
// 初始化值是**唯一**的值
let variable_name = value;

// 使用 'mut' 关键字定义可变变量
// 初始化值可以被改变
let mut variable_name = value;

? 尽管你可以改变可变变量的值,但你不能将另一种数据类型的值赋值给它。

这意味着,如果你有一个可变的浮点型变量,你不能在后面将一个字符赋值给它。

Rust 数据类型概观

在上一篇文章中,你可能注意到了我提到 Rust 是一种强类型语言。但是在定义变量时,你不需要指定数据类型,而是使用一个通用的关键字 let

Rust 编译器可以根据赋值给变量的值推断出变量的数据类型。但是如果你仍然希望明确指定数据类型并希望注释类型,那么可以这样做。以下是语法:

let variable_name: data_type = value;

下面是 Rust 编程语言中一些常见的数据类型:

  • 整数类型:分别用于有符号和无符号的 32 位整数的 i32u32
  • 浮点类型:分别用于 32 位和 64 位浮点数的 f32f64
  • 布尔类型bool
  • 字符类型char

我会在下一篇文章中更详细地介绍 Rust 的数据类型。现在,这应该足够了。

? Rust 并不支持隐式类型转换。因此,如果你将值 8 赋给一个浮点型变量,你将会遇到编译时错误。你应该赋的值是 8.8.0

Rust 还强制要求在读取存储在其中的值之前初始化变量。

{ // 该代码块不会被编译
    let a;
    println!("{}", a); // 本行报错
    // 读取一个**未初始化**变量的值是一个编译时错误
}

{ // 该代码块会被编译
    let a;
    a = 128;
    println!("{}", a); // 本行不会报错
    // 变量 'a' 有一个初始值
}

如果你在不初始化的情况下声明一个变量,并在给它赋值之前使用它,Rust 编译器将会抛出一个 编译时错误

虽然错误很烦人,但在这种情况下,Rust 编译器强制你不要犯写代码时常见的错误之一:未初始化的变量。

Rust 编译器的错误信息

来写几个程序,你将

  • 通过执行“正常”的任务来理解 Rust 的设计,这些任务实际上是内存相关问题的主要原因
  • 阅读和理解 Rust 编译器的错误/警告信息

测试变量的不可变性

让我们故意写一个试图修改不可变变量的程序,看看接下来会发生什么。

fn main() {
    let mut a = 172;
    let b = 273;
    println!("a: {a}, b: {b}");

    a = 380;
    b = 420;
    println!("a: {}, b: {}", a, b);
}

直到第 4 行看起来都是一个简单的程序。但是在第 7 行,变量 b —— 一个不可变变量 —— 的值被修改了。

注意打印 Rust 变量值的两种方法。在第 4 行,我将变量括在花括号中,以便打印它们的值。在第 8 行,我保持括号为空,并使用 C 的风格将变量作为参数。这两种方法都是有效的。(除了修改不可变变量的值,这个程序中的所有内容都是正确的。)

来编译一下!如果你按照上一章的步骤做了,你已经知道该怎么做了。

$ rustc main.rs
error[E0384]: cannot assign twice to immutable variable `b`
 --> main.rs:7:5
  |
3 |     let b = 273;
  |         -
  |         |
  |         first assignment to `b`
  |         help: consider making this binding mutable: `mut b`
...
7 |     b = 420;
  |     ^^^^^^^ cannot assign twice to immutable variable

error: aborting due to previous error

For more information about this error, try `rustc --explain E0384`.
? “binding” 一词是指变量名。但这只是一个简单的解释。

这很好的展示了 Rust 强大的错误检查和信息丰富的错误信息。第一行展示了阻止上述代码编译的错误信息:

error[E0384]: cannot assign twice to immutable variable b

这意味着,Rust 编译器注意到我试图给变量 b 重新赋值,但变量 b 是一个不可变变量。所以这就是导致这个错误的原因。

编译器甚至可以识别出错误发生的确切行和列号。

在显示 first assignment to b 的行下面,是提供帮助的行。因为我正在改变不可变变量 b 的值,所以我被告知使用 mut 关键字将变量 b 声明为可变变量。

?️ 自己实现一个修复来更好地理解手头的问题。

使用未初始化的变量

现在,让我们看看当我们尝试读取未初始化变量的值时,Rust 编译器会做什么。

fn main() {
    let a: i32;
    a = 123;
    println!("a: {a}");

    let b: i32;
    println!("b: {b}");
    b = 123;
}

这里,我有两个不可变变量 ab,在声明时都没有初始化。变量 a 在其值被读取之前被赋予了一个值。但是变量 b 的值在被赋予初始值之前被读取了。

来编译一下,看看结果。

$ rustc main.rs
warning: value assigned to `b` is never read
 --> main.rs:8:5
  |
8 |     b = 123;
  |     ^
  |
  = help: maybe it is overwritten before being read?
  = note: `#[warn(unused_assignments)]` on by default

error[E0381]: used binding `b` is possibly-uninitialized
 --> main.rs:7:19
  |
6 |     let b: i32;
  |         - binding declared here but left uninitialized
7 |     println!("b: {b}");
  |                   ^ `b` used here but it is possibly-uninitialized
  |
  = note: this error originates in the macro `$crate::format_args_nl` which comes from the expansion of the macro `println` (in Nightly builds, run with -Z macro-backtrace for more info)

error: aborting due to previous error; 1 warning emitted

For more information about this error, try `rustc --explain E0381`.

这里,Rust 编译器抛出了一个编译时错误和一个警告。警告说变量 b 的值从来没有被读取过。

但是这是荒谬的!变量 b 的值在第 7 行被访问了。但是仔细看;警告是关于第 8 行的。这很令人困惑;让我们暂时跳过这个警告,继续看错误。

这个错误信息说 used binding b is possibly-uninitialized。和之前的例子一样,Rust 编译器指出错误是由于尝试在第 7 行读取变量 b 的值而引起的。读取变量 b 的值是错误的原因是它的值没有初始化。在 Rust 编程语言中,这是非法的。因此编译时错误出现。

?️ 这个错误可以很容易地通过交换第 7 和第 8 行的代码来解决。试一下,看看错误是否消失了。

示例程序:交换数字

现在你已经熟悉了常见的变量相关问题,让我们来看一个交换两个变量值的程序。

fn main() {
    let mut a = 7186932;
    let mut b = 1276561;

    println!("a: {a}, b: {b}");

    // 交换变量值
    let temp = a;
    a = b;
    b = temp;

    println!("a: {}, b: {}", a, b);
}

我在这里声明了两个变量 ab。这两个变量都是可变的,因为我希望在后面改变它们的值。我赋予了一些随机值。最初,我打印了这些变量的值。

然后,在第 8 行,我创建了一个名为 temp 的不可变变量,并将存储在 a 中的值赋给它。之所以这个变量是不可变的,是因为 temp 的值不会改变。

要交换值,我将变量 b 的值赋给变量 a,在下一行,我将 temp 的值(它包含 a 的值)赋给变量 b。现在值已经交换了,我打印了变量 ab 的值。

在编译并执行上面的代码后,我得到了以下输出:

a: 7186932, b: 1276561
a: 1276561, b: 7186932

正如你所见,值已经交换了。完美。

使用未使用的变量

当你声明了一些变量,打算在后面使用它们,但是还没有使用它们,然后编译你的 Rust 代码来检查一些东西时,Rust 编译器会警告你。

原因是显而易见的。不会被使用的变量占用了不必要的初始化时间(CPU 周期)和内存空间。如果不会被使用,为什么要在程序写上它呢?尽管编译器确实会优化这一点。但是它仍然是一个问题,因为它会以多余的代码的形式影响可读性。

但是,有的时候,你可能会面对这样的情况:创建一个变量与否不在你的控制之下。比如说,当一个函数返回多个值,而你只需要其中的一些值时。在这种情况下,你不能要求库维护者根据你的需要调整他们的函数。

所以,在这种情况下,你可以写一个以下划线开头的变量,Rust 编译器将不再显示这样的警告。如果你真的不需要使用存储在该未使用变量中的值,你可以简单地将其命名为 _(下划线),Rust 编译器也会忽略它!

接下来的程序不仅不会生成任何输出,而且也不会生成任何警告和/或错误消息:

fn main() {
    let _unnecessary_var = 0; // 没有警告
    let _ = 0.0; // 完全忽略
}

算术运算

数学就是数学,Rust 并没有在这方面创新。你可以使用在其他编程语言(如 C、C++ 和/或 Java)中使用过的所有算术运算符。

包含可以在 Rust 编程语言中使用的所有运算符和它们的含义的完整列表可以在 这里 找到。

示例程序:一个生锈的温度计

(LCTT 译注:这里的温度计“生锈”了是因为它是使用 Rust(生锈)编写的,原作者在这里玩了一个双关。)

接下来是一个典型的程序,它将华氏度转换为摄氏度,反之亦然。

fn main() {
    let boiling_water_f: f64 = 212.0;
    let frozen_water_c: f64 = 0.0;

    let boiling_water_c = (boiling_water_f - 32.0) * (5.0 / 9.0);
    let frozen_water_f = (frozen_water_c * (9.0 / 5.0)) + 32.0;

    println!(
        "Water starts boiling at {}°C (or {}°F).",
        boiling_water_c, boiling_water_f
    );
    println!(
        "Water starts freezing at {}°C (or {}°F).",
        frozen_water_c, frozen_water_f
    );
}

没什么大不了的……华氏温度转换为摄氏温度,反之亦然。

正如你在这里看到的,由于 Rust 不允许自动类型转换,我不得不在整数 32、9 和 5 后放一个小数点。除此之外,这与你在 C、C++ 和/或 Java 中所做的类似。

作为练习,尝试编写一个程序,找出给定数中有多少位数字。

常量

如果你有一些编程知识,你可能知道这意味着什么。常量是一种特殊类型的变量,它的值永远不会改变它保持不变

在 Rust 编程语言中,使用以下语法声明常量:

const CONSTANT_NAME: data_type = value;

如你所见,声明常量的语法与我们在 Rust 中看到的变量声明非常相似。但是有两个不同之处:

  • 常量的名字需要像 SCREAMING_SNAKE_CASE 这样。所有的大写字母和单词之间用下划线分隔。
  • 常量的数据类型必须被显性定义。

变量与常量的对比

你可能在想,既然变量默认是不可变的,为什么语言还要包含常量呢?

接下来这个表格应该可以帮助你消除疑虑。(如果你好奇并且想更好地理解这些区别,你可以看看我的博客,它详细地展示了这些区别。)

一个展示 Rust 编程语言中变量和常量之间区别的表格

使用常量的示例程序:计算圆的面积

这是一个很直接的关于 Rust 中常量的简单程序。它计算圆的面积和周长。

fn main() {
    const PI: f64 = 3.14;
    let radius: f64 = 50.0;

    let circle_area = PI * (radius * radius);
    let circle_perimeter = 2.0 * PI * radius;

    println!("有一个周长为 {radius} 厘米的圆");
    println!("它的面积是 {} 平方厘米", circle_area);
    println!(
        "以及它的周长是 {} 厘米",
        circle_perimeter
    );
}

如果运行代码,将产生以下输出:

有一个周长为 50 厘米的圆
它的面积是 7850 平方厘米
以及它的周长是 314 厘米

Rust 中的变量遮蔽

如果你是一个 C++ 程序员,你可能已经知道我在说什么了。当程序员声明一个与已经声明的变量同名的新变量时,这就是变量遮蔽。

与 C++ 不同,Rust 允许你在同一作用域中执行变量遮蔽!

? 当程序员遮蔽一个已经存在的变量时,新变量会被分配一个新的内存地址,但是使用与现有变量相同的名称引用。

来看看它在 Rust 中是如何工作的。

fn main() {
    let a = 108;
    println!("a 的地址: {:p}, a 的值 {a}", &a);
    let a = 56;
    println!("a 的地址: {:p}, a 的值: {a} // 遮蔽后", &a);

    let mut b = 82;
    println!("\nb 的地址: {:p}, b 的值: {b}", &b);
    let mut b = 120;
    println!("b的地址: {:p}, b的值: {b} // 遮蔽后", &b);

    let mut c = 18;
    println!("\nc 的地址: {:p}, c的值: {c}", &c);
    c = 29;
    println!("c 的地址: {:p}, c的值: {c} // 遮蔽后", &c);
}

println 语句中花括号内的 :p 与 C 中的 %p 类似。它指定值的格式为内存地址(指针)。

我在这里使用了 3 个变量。变量 a 是不可变的,并且在第 4 行被遮蔽。变量 b 是可变的,并且在第 9 行也被遮蔽。变量 c 是可变的,但是在第 14 行,只有它的值被改变了。它没有被遮蔽。

现在,让我们看看输出。

a 的地址: 0x7ffe954bf614, a 的值 108
a 的地址: 0x7ffe954bf674, a 的值: 56 // 遮蔽后

b 的地址: 0x7ffe954bf6d4, b 的值: 82
b 的地址: 0x7ffe954bf734, b 的值: 120 // 遮蔽后

c 的地址: 0x7ffe954bf734, c 的值: 18
c 的地址: 0x7ffe954bf734, c 的值: 29 // 遮蔽后

来看看输出,你会发现不仅所有三个变量的值都改变了,而且被遮蔽的变量的地址也不同(检查十六进制的最后几个字符)。

变量 ab 的内存地址改变了。这意味着变量的可变性或不可变性并不是遮蔽变量的限制。

总结

本文介绍了 Rust 编程语言中的变量和常量。还介绍了算术运算。

做个总结:

  • Rust 中的变量默认是不可变的,但是可以引入可变性。
  • 程序员需要显式地指定变量的可变性。
  • 常量总是不可变的,无论如何都需要类型注释。
  • 变量遮蔽是指使用与现有变量相同的名称声明一个 变量。

很好!我相信和 Rust 一起的进展不错。在下一章中,我将讨论 Rust 中的数据类型。敬请关注。

与此同时,如果你有任何问题,请告诉我。

(题图:MJ/7c5366b8-f926-487e-9153-0a877145ca5)


via: https://itsfoss.com/rust-variables/

作者:Pratham Patel 选题:lkxed 译者:Cubik 校对:wxy

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

GNOME Linux 桌面环境的最新版本现已推出。了解 GNOME 44 中新的和改进的蓝牙、用户界面、应用程序和其他功能。

我在家使用的 Linux PC 上采用 GNOME 作为我主要的桌面环境。GNOME 提供了方便易用的图形化桌面,不仅具备我所需的灵活性,而且在我专注工作时不会妨碍我的操作。

最近 GNOME 发布了 GNOME 44,引入了许多新功能。我联系了 GNOME 团队,咨询了最新版本的新特性和改进。以下是品牌经理 Caroline Henriksen、GNOME 开发者和发布团队成员 Matthias Clasen,以及设计团队成员 Allan Day 分享的信息。

GNOME 的新特性

Jim Hall: 在 GNOME 44 中,有哪些令你们最为兴奋的新功能和更新的功能?

GNOME 团队: 我们非常期待全新的、现代化的用户界面设计,这不仅体现在核心应用如 “ 文件 Files ”应用(文件管理器,即 Nautilus),还包括 “ 设置 Settings ” 应用,在上一个开发循环中我们对其中的很多面板做了大量改进。如果你有机会,欢迎试用全新的 “ 鼠标和触控板 Mouse & Touchpad ” 设置面板,享受其中的动态插图。

GNOME 44 中有很多让人惊喜的功能。比如,文件选择器中全新的网格视图一定会让很多人感到惊喜,同时你也可以通过快速设置中的全新蓝牙菜单轻松地连接设备。

Jim:发布说明提到了 GNOME Circle,同时增加了几个新应用程序。请问 GNOME Circle 是什么?

团队:GNOME Circle 是一组优秀的应用程序,它们使用了 GNOME 平台。GNOME Circle 是 GNOME 推广使用我们技术的最佳应用程序,并支持应用程序开发人员的一个项目。

为了被纳入 GNOME Circle,一个应用程序必须满足一组要求。一旦满足要求,开发人员就可以获得额外的公众宣传、GNOME 基金会会员资格,以及访问其他基础设施和旅行赞助支持。有关详细信息和如何申请,请参阅 GNOME Circle 页面。

我们非常高兴看到 GNOME Circle 取得了巨大的成功。目前,它已经包含了超过 50 个应用程序!我特别喜欢其中不是所有的应用程序都与计算机有关,你可以找到健康跟踪器、节拍器或象棋钟等应用程序。

Jim:GNOME 是几个 Linux 发行版的标准桌面环境。我们可以在哪里看到 GNOME 44?

团队:已经发布的 Fedora 38 版本包含 GNOME 44。Ubuntu 23.04 也包含 GNOME 44。而且,GNOME 44 构建已经在一些主要的发行版中出现,例如 openSUSE 的 Tumbleweed 和 MicroOS 等。

GNOME 社区

Jim: GNOME 44 的发布名称是 Kuala Lumpur,请问这个名字的来源是什么?

团队: GNOME 每年都有两个重要的大型会议,GUADEC 是在年中举办的(下一届会议将于 2023 年 7 月在拉脱维亚举行),GNOME Asia 则在年末举行。我们非常感谢马来西亚的本地团队在 吉隆坡 Kuala Lumpur 为我们举办 2022 年的 GNOME Asia 活动。

组织这些活动需要 GNOME 的工作人员和当地团队投入大量的精力和承诺。作为对他们的感激之意,我们会将 GNOME 的发布版本以最近大会的地点命名。这个命名方案是几年前引入的。GNOME 3.18 的发布名称 哥德堡 Gothenburg 就是第一个采用这种方式命名的版本。

Jim: GNOME 拥有一个充满活力的用户社区,有很多积极的成员。那么,GNOME 是如何保持社区的积极参与的呢?

团队: GNOME 一直以来都是一个以社区为驱动的项目,具有强烈的协作和包容性。这也是成为 GNOME 贡献者和用户的回报之一。成为 GNOME 社区的一员,意味着你可以与来自全世界的人进行互动,共同实现目标并交流想法。这是一种丰富而鼓舞人心的体验,这也是我们的社区保持热情和积极性的原因之一。

我们提高社区参与度的一个重要手段是,尽可能地满足社区用户的需求,使我们的活动对世界各地的人来说更易于参加。例如,我们的旗舰会议 GUADEC 去年在墨西哥的 瓜达拉哈拉 Guadalajara 举行,这是自欧洲以外的地方举办的第一个 GUADEC 会议,这有助于增加拉丁美洲的 GNOME 用户和贡献者的参与度。

此外,我们还努力不仅在我们自己的会议和活动中,而且在其他活动如 Linux Application Summit、FOSDEM 或 SCaLE 中与我们的社区成员见面。如果你在这些活动中看到 GNOME 的展台,请过来打个招呼。通常你会发现,开发人员、设计师、基金会工作人员以及理事会成员都很乐意聊天和回答问题。

如何参与 GNOME

Jim: 如何开始编写自己的 GNOME 应用程序呢?如果我想学习如何编写我的第一个 GNOME “Hello World” 应用程序,有没有可以供我参考的教程?

团队: 开始为 GNOME 开发应用程序 网站包括一系列教程,其中包括快速创建你的第一个应用程序的指南。随着 Flatpak 和 GNOME Builder 等新技术的出现,如今创建自己的应用程序变得非常容易。打开 Builder,单击 “ 新项目 new project ”,填写一些细节,就可以拥有自己的运行中的 GNOME 应用程序。确实如此简单。

Jim: 参与者可以通过哪些方式做出贡献呢?

团队: 如果有人对 GNOME 产生了兴趣,并有动力参与其中,那么他们可以做很多事情来帮助我们。如果你是初学者,参与我们 Discourse 实例上的讨论或报告问题是一个很好的开始。还有很多非技术性工作需要完成,比如帮助我们的文档、将 GNOME 翻译成不同的语言,甚至帮助组织我们的年度会议。许多这些活动都有友好的团队进行协作,他们会帮助你入门。

或者,如果你有编码经验,你可以浏览我们的 “新手”任务,寻找你感兴趣的任务。

另一个贡献的方式是通过对 GNOME 的 捐赠。作为一个开源项目和非营利基金会,定期的捐赠可以帮助我们继续建设 GNOME,提供必要的基础设施,以及支持新的倡议。

(题图:MJ/addea707-a20a-4469-9131-cf958b942e7b)


via: https://opensource.com/article/23/4/linux-gnome-44-features

作者:Jim Hall 选题:lkxed 译者:ChatGPT 校对:wxy

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

Windows 10 已发布最终版本

微软在其客户端路线图的更新中披露,Windows 10 将不会有进一步的功能更新。Windows 10 目前的 22H2 版被确认为最后一个版本,对它的支持计划于 2025 年底结束。Windows 10 发布于 2015 年 7 月 29 日,它在发布时被广泛吹捧为 “有史以来最后一个版本的 Windows”,因为它标志着微软的 “Windows 即服务” 概念的揭幕,该平台将被持续更新。这可能是一个误解,但这是一个微软在 Windows 11 发布前没有急于纠正的误解。

消息来源:The Register
老王点评:先不说 TPM 2.0 等硬件要求,不断变化的用户体验也让很多用户无法或不愿意升级到 Windows 11。

OpenAI 寻求注册 “GPT” 商标

OpenAI 在去年 12 月底申请 “GPT”(代表 “生成性预训练转化器”)的商标后,上个月向美国专利商标局提出申请,要求加快程序,理由是 “无数的侵权和假冒的应用程序” 开始涌现。不过这个加快申请被驳回了。OpenAI 多年来一直在使用 “GPT” 一词,早在 2018 年 10 月就发布了其原始的 GPT-1,但一直没有申请这个商标,可能 ChatGPT 的成功他们也始料未及。

消息来源:Tech Crunch
老王点评:姑且不论这个词汇是否应该算作一个通用的技术词汇,OpenAI 想拿下这个商标,谷歌首先就不同意,更别说每天都出现的各种 GPT 们。

微软为其 365 服务采用 .microsoft 新顶级域

随着微软云服务多年来的发展,它们的域名空间已经达到数百个。微软准备将其 365 服务采用一个一致的 URL 结构:“产品名称.cloud.microsoft”。用户将能够通过 outlook.cloud.microsoft 或 team.cloud.microsoft 等 URL 访问产品。将 SaaS 体验隔离在他们自己的域空间中,可以建立一个干净的安全边界,有防欺骗和完整性的好处。

消息来源:The Register
老王点评:这是一个不错的做法,建议国内的其它云服务商也考虑一下。

流行的轻量级桌面环境 LXQt 1.3.0 的新版本现已发布。以下是它的新功能。

轻量级桌面环境 LXQt 发布了 1.3.0 版本,其中包含许多改进和新功能。让我们深入了解细节。

LXQt 1.3.0 桌面

LXQt 1.3.0:主要功能

最新版本的 LXQt 仍然基于 Qt 5.15,即 Qt5 的最后一个 LTS 版本。该团队已经开始支持 Qt6,但由于缺乏稳定的 KF6 而无法发布。但是,该团队显著改进了文件管理器及其库。整个 KF6 API/库目前进行 Qt6 迁移,以供 KDE 和其他桌面使用。

LibFM-Qt / PCManFM-Qt

默认文件管理器 PCManFM-Qt 修复了一个问题,即在配置更改时防止桌面项目抖动。此外,最新版本增加了一个桌面标题,这有助于在某些 Wayland 合成器下设置窗口管理器(WM)规则。

此外,现在所有的视图模式都可以禁用平滑滚动,而之前仅适用于列表和紧凑模式。此外,现在已修复了使用可执行类型打开非可执行文件的问题,并使用 New file 作为新文件的默认名称(特别是在 GLib 2.75.1 不再将空文件视为文本/纯文本之后)。

LXQt 1.3.0 文件管理器更改以实现平滑滚动

LXQt 面板和 QTerminal

现在 LXQt 面板在编译时默认启用 DOM 插件。

新版 QTerminal 修复了深浅配色切换的问题。它还保证了上下文菜单在 Wayland 下的正确定位。

LXQt 会话

主要的 LXQt 会话现在添加了对 procps-ng >= 4.0.0 的支持。此外,它还有更好的方法来检测窗口管理器和系统托盘。在 Wayland 上,现在禁用了所有潜在的崩溃调用。

这是关于此版本的主要亮点。考虑到这是一个次要版本,亮点并不多。你可以在详细的 变更日志 中了解更多信息。

LXQt 1.3.0 的 Linux 发行版可用性

Lubuntu 23.04 “Lunar Lobster” 由于计划不匹配,将不会包含此版本。因此,你可以在 2023 年 10 月发布的 Lubuntu 上收到此更新。

到 2023 年底,Fedora 39 将把这个版本作为 Fedora LXQt 的一部分。

Arch Linux 用户可以在通过测试后立即安装此桌面。截至发布时,当前 它在社区测试仓库中。你可能需要使用 本指南 进行安装。

或者,你可以编辑 /etc/pacman.conf,启用 community-testing 仓库,然后立即安装。此处 提供了一组示例命令。

其他基于 Arch 的发行版,例如 ManjaroEndeavour OS,将在稳定后的几周内采用此版本。

总结

总之,LXQt 1.3.0 是一个重要的版本,包含许多新的改进和错误修复。用户现在可以通过 LXQt 桌面享受更稳定、超快、高效的体验。今天就试试吧!

(题图:MJ/d96d5eb2-290d-4fe4-a9a6-1e51dff8e1d2)


via: https://www.debugpoint.com/lxqt-1-3-0/

作者:Arindam 选题:lkxed 译者:geekpi 校对:wxy

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

使用这些 Drupal 模块,使你的网站对每个人都可以无障碍访问。

随着网站的 无障碍访问 accessibility 继续成为人们日益关注的问题,网站所有者和开发人员需要确保他们的网站符合美国残疾人法案(ADA)。Drupal 是一种流行的开源内容管理系统(CMS),它提供各种工具和模块以确保所有用户都可以访问你的网站,而无论他们的能力如何。本文讨论了网站无障碍访问的重要性、ADA 合规性的基本要求,以及 Drupal 如何帮助你实现合规性。

为什么网站无障碍访问很重要

出于多种原因,网站无障碍访问很重要。首先,它确保残障人士可以访问和使用你的网站。这包括有视觉、听觉、身体和认知障碍的人。通过使你的网站可以无障碍访问,你不仅遵守了法律,而且还为所有用户提供了更好的体验。

此外,网站无障碍访问可以改善你网站的搜索引擎优化(SEO)并提高网站的可用性。搜索引擎优先考虑无障碍的网站,如果易于使用,用户更有可能在你的网站上停留更长时间并与你互动。

ADA 合规性的基本要求

ADA 要求所有网站和数字内容都可供残障人士访问。ADA 合规性的一些基本要求包括:

  • 为所有图像和非文本内容提供替代文本描述。
  • 确保所有视频都有字幕和文字说明。
  • 使用颜色对比和其他设计元素使你的网站更具可读性。
  • 提供访问内容的替代方式,例如音频描述和键盘导航。
  • 确保你的网站与辅助技术兼容,例如屏幕阅读器和盲文显示器。

Drupal 如何帮助你实现合规性

Drupal 提供各种工具和模块来帮助你实现网站的无障碍和 ADA 合规性。以下是我认为最有用的七个:

总结

出于法律原因和为所有用户提供更好的用户体验,确保网站无障碍访问和 ADA 合规性非常重要。从无障碍访问检查器到颜色对比分析器,Drupal 提供了多种方法来确保你的网站符合 ADA 标准。使用 Drupal 的工具和模块,你可以让每个人都可以访问你的网站,无论他们的能力如何,并提供更好的用户体验。


via: https://opensource.com/article/23/4/drupal-modules-website-accessibility

作者:Neeraj Kumar 选题:lkxed 译者:geekpi 校对:wxy

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