2022年5月

实现一个 WiFi 扫描器玩玩~

去年夏天,我和妻子变卖了家产,带着我们的两只狗移居了夏威夷。这里有美丽的阳光、温暖的沙滩、凉爽的冲浪等你能想到的一切。我们同样遇到了一些意料之外的事:WiFi 问题。

不过,这不是夏威夷的问题,而是我们租住公寓的问题。我们住在一个单身公寓里,与房东的公寓仅一墙之隔。我们的租房协议中包含了免费的网络连接!好耶!只不过,它是由房东的公寓里的 WiFi 提供的,哇哦……

说实话,它的效果还不错……吧?好吧,我承认它不尽如人意,并且不知道是哪里的问题。路由器明明就在墙的另一边,但我们的信号就是很不稳定,经常会自动断开连接。在家的时候,我们的 WiFi 路由器的信号能够穿过层层墙壁和地板。事实上,它所覆盖的区域比我们居住的 600 平方英尺(大约 55 平方米)的公寓还要大。

在这种情况下,一个优秀的技术人员会怎么做呢?既然想知道为什么,当然是开始排查咯!

幸运的是,我们在搬家之前并没有变卖掉树莓派 Zero W。它是如此小巧便携! 我当然就把它一起带来了。我有一个机智的想法:通过树莓派和它内置的 WiFi 适配器,使用 Go 语言编写一个小程序来测量并显示从路由器收到的 WiFi 信号。我打算先简单快速地把它实现出来,以后再去考虑优化。真是麻烦!我现在只想知道这个 WiFi 是怎么回事!

谷歌搜索了一番后,我发现了一个比较有用的 Go 软件包 mdlayher/wifi,它专门用于 WiFi 相关操作,听起来很有希望!

获取 WiFi 接口的信息

我的计划是查询 WiFi 接口的统计数据并返回信号强度,所以我需要先找到设备上的接口。幸运的是,mdlayher/wifi 包有一个查询它们的方法,所以我可以创建一个 main.go 来实现它,具体代码如下:

package main

import (
    "fmt"
    "github.com/mdlayher/wifi"
)

func main() {
    c, err := wifi.New()
    defer c.Close()

    if err != nil {
        panic(err)
    }

    interfaces, err := c.Interfaces()

    for _, x := range interfaces {
        fmt.Printf("%+v\n", x)
    }
}

让我们来看看上面的代码都做了什么吧!首先是导入依赖包,导入后,我就可以使用 mdlayher/wifi 模块就在 main 函数中创建一个新的客户端(类型为 *Client)。接下来,只需要调用这个新的客户端(变量名为 c)的 c.Interfaces() 方法就可以获得系统中的接口列表。接着,我就可以遍历包含接口指针的切片(变长数组),然后打印出它们的具体信息。

注意到 %+v 中有一个 + 了吗?它意味着程序会详细输出 *Interface 结构体中的属性名,这将有助于我标识出我看到的东西,而不用去查阅文档。

运行上面的代码后,我得到了机器上的 WiFi 接口列表:

&{Index:0 Name: HardwareAddr:5c:5f:67:f3:0a:a7 PHY:0 Device:3 Type:P2P device Frequency:0}
&{Index:3 Name:wlp2s0 HardwareAddr:5c:5f:67:f3:0a:a7 PHY:0 Device:1 Type:station Frequency:2412}

注意,两行输出中的 MAC 地址(HardwareAddr)是相同的,这意味着它们是同一个物理硬件。你也可以通过 PHY: 0 来确认。查阅 Go 的 wifi 模块文档PHY 指的就是接口所属的物理设备。

第一个接口没有名字,类型是 TYPE: P2P。第二个接口名为 wpl2s0,类型是 TYPE: Stationwifi 模块的文档列出了 不同类型的接口,以及它们的用途。根据文档,P2P(点对点传输) 类型表示“该接口属于点对点客户端网络中的一个设备”。我认为这个接口的用途是 WiFi 直连 ,这是一个允许两个 WiFi 设备在没有中间接入点的情况下直接连接的标准。

Station(基站)类型表示“该接口是具有 控制接入点 controlling access point 的客户端设备管理的 基本服务集 basic service set (BSS)的一部分”。这是大众熟悉的无线设备标准功能:作为一个客户端来连接到网络接入点。这是测试 WiFi 质量的重要接口。

利用接口获取基站信息

利用该信息,我可以修改遍历接口的代码来获取所需信息:

for _, x := range interfaces {
    if x.Type == wifi.InterfaceTypeStation {
        // c.StationInfo(x) returns a slice of all
        // the staton information about the interface
        info, err := c.StationInfo(x)
        if err != nil {
            fmt.Printf("Station err: %s\n", err)
        }
        for _, x := range info {
            fmt.Printf("%+v\n", x)
        }
    }
}

首先,这段程序检查了 x.Type(接口类型)是否为 wifi.InterfaceTypeStation,它是一个基站接口(也是本练习中唯一涉及到的类型)。不幸的是名字出现了冲突,这个接口“类型”并不是 Golang 中的“类型”。事实上,我在这里使用了一个叫做 interfaceType 的 Go 类型来代表接口类型。呼,我花了一分钟才弄明白!

然后,假设接口的类型正确,我们就可以调用 c.StationInfo(x) 来检索基站信息,StationInfo() 方法可以获取到关于这个接口 x 的信息。

这将返回一个包含 *StationInfo 指针的切片。我不大确定这里为什么要用切片,或许是因为接口可能返回多个 StationInfo?不管怎么样,我都可以遍历这个切片,然后使用之前提到的 +%v 技巧格式化打印出 StationInfo 结构的属性名和属性值。

运行上面的程序后,我得到了下面的输出:

&{HardwareAddr:70:5a:9e:71:2e:d4 Connected:17m10s Inactive:1.579s ReceivedBytes:2458563 TransmittedBytes:1295562 ReceivedPackets:6355 TransmittedPackets:6135 ReceiveBitrate:2000000 TransmitBitrate:43300000 Signal:-79 TransmitRetries:2306 TransmitFailed:4 BeaconLoss:2}

我感兴趣的是 Signal(信号)部分,可能还有 TransmitFailed(传输失败)和 BeaconLoss(信标丢失)部分。信号强度是以 dBm( 分贝-毫瓦 decibel-milliwatts )为单位来报告的。

简短科普:如何读懂 WiFi dBm

根据 MetaGeek 的说法:

  • -30 最佳,但它既不现实也没有必要
  • -67 非常好,它适用于需要可靠数据包传输的应用,例如流媒体
  • -70 还不错,它是实现可靠数据包传输的底线,适用于电子邮件和网页浏览
  • -80 很差,只是基本连接,数据包传输不可靠
  • -90 不可用,接近“ 背景噪声 noise floor

注意:dBm 是对数尺度,-60 比 -30 要低 1000 倍。

使它成为一个真的“扫描器”

所以,看着上面输出显示的我的信号:-79。哇哦,感觉不大好呢。不过单看这个结果并没有太大帮助,它只能提供某个时间点的参考,只对 WiFi 网络适配器在特定物理空间的某一瞬间有效。一个连续的读数会更有用,借助于它,我们观察到信号随着树莓派的移动而变化。我可以再次修改 main 函数来实现这一点。

var i *wifi.Interface

for _, x := range interfaces {
    if x.Type == wifi.InterfaceTypeStation {
        // Loop through the interfaces, and assign the station
        // to var x
        // We could hardcode the station by name, or index,
        // or hardwareaddr, but this is more portable, if less efficient
        i = x
        break
    }
}

for {
    // c.StationInfo(x) returns a slice of all
    // the staton information about the interface
    info, err := c.StationInfo(i)
    if err != nil {
        fmt.Printf("Station err: %s\n", err)
    }

    for _, x := range info {
        fmt.Printf("Signal: %d\n", x.Signal)
    }

    time.Sleep(time.Second)
}

首先,我命名了一个 wifi.Interface 类型的变量 i。因为它在循环的范围外,所以我可以用它来存储接口信息。循环内创建的任何变量在该循环的范围外都是不可访问的。

然后,我可以把这个循环一分为二。第一个遍历了 c.Interfaces() 返回的接口切片,如果元素是一个 Station 类型,它就将其存储在先前创建的变量 i 中,并跳出循环。

第二个循环是一个死循环,它将不断地运行,直到我按下 Ctrl + C 来结束程序。和之前一样,这个循环内部获取接口信息、检索基站信息,并打印出信号信息。然后它会休眠一秒钟,再次运行,反复打印信号信息,直到我退出为止。

运行上面的程序后,我得到了下面的输出:

[chris@marvin wifi-monitor]$ go run main.go
Signal: -81
Signal: -81
Signal: -79
Signal: -81

哇哦,感觉不妙。

绘制公寓信号分布图

不管怎么说,知道这些信息总比不知道要好。让树莓派连接上显示器或者电子墨水屏,并接上电源,我就可以让它在公寓里移动,并绘制出信号死角的位置。

剧透一下:由于房东的接入点在隔壁的公寓里,对我来说最大的死角是以公寓厨房的冰箱为顶点的一个圆锥体形状区域......这个冰箱与房东的公寓靠着一堵墙!

我想如果用《龙与地下城》里的黑话来说,它就是一个“ 沉默之锥 Cone of Silence ”。或者至少是一个“ 糟糕的网络连接之锥 Cone of Poor Internet ”。

总之,这段代码可以直接在树莓派上运行 go build -o wifi_scanner 来编译,得到的二进制文件 wifi_scanner 可以运行在其他同样的ARM 设备上。另外,它也可以在常规系统上用正确的 ARM 设备库进行编译。

祝你扫描愉快!希望你的 WiFi 路由器不在你的冰箱后面!你可以在 我的 GitHub 存储库 中找到这个项目所用的代码。


via: https://opensource.com/article/21/3/troubleshoot-wifi-go-raspberry-pi

作者:Chris Collins 选题:lkxed 译者:lkxed 校对:turbokernel

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

当谷歌文档遇到诗歌时,崩溃了

有用户在谷歌文档中写一首诗时发现,当输入 “And. And. And. And. And.” 或 “But. But. But. But. But.” 时,如果同时打开了“显示语法建议”选项,该应用就会崩溃。而且你可能无法轻易重新访问该文件,因为这样做会再次触发崩溃。其它的一些词汇在多次重复时也会导致这个问题,如“Also、Anyway、Who、Why、Besides、However”等。谷歌表示已经知道该问题,并在修复中。

消息来源:bleepingcomputer
老王点评:看来谷歌文档的语法建议工具被诗歌艺术搞晕了。

苹果芯片独家遭遇全球首个 DMP 漏洞

研究人员发现了世界上第一个 依赖数据内存的预取器 Data Memory-Dependent Prefetcher (DMP)漏洞,该漏洞被称为 “Augury”,是苹果芯片产品独有的漏洞。DMP 旨在通过了解整个内存内容来提高系统性能,通常内存访问是有限制的,但是苹果的 DMP 预取可以超越内存指针集,允许它访问并尝试预取不相关的内存地址,这使得有可能泄露整个内存内容。苹果的 M1、M1 Max 等芯片受到影响。

消息来源:tomshardware
老王点评:苹果芯片确实很快,但是新技术总是以你想不到的方式出现漏洞。

没收的价值 3600 万美元的加密货币被错付

加密货币 Juno 社区投票决定,从一个被认为通过恶意手段获得代币的投资者手中没收约 300 万个 Juno 通证,价值约 3600 万美元。这些资金将被发送到一个由社区控制的钱包,他们可以投票决定如何使用这些资金。然而,由于负责转账开发者同时收到了一个钱包地址及一个哈希值,结果无意中复制和粘贴了哈希值当成钱包地址,导致 3600 万美元的加密货币被发送到了一个无法访问的地址。

消息来源:cnet
老王点评:混乱的社区做的事情也是混乱的,这下鸡飞蛋打了。

学习如何使用 apt 命令在基于 Debian 的 Linux 发行版上安装软件包,然后下载我们的速查表,让正确的命令触手可及。

 title=

包管理器 可帮助你处理 Linux 系统的计算机上软件的更新、卸载、故障排除等问题。Seth Kenlon 写了 使用 dnf 进行 Linux 包管理 一文,介绍了如何使用 dnf 这款命令行包管理工具,在 RHEL、CentOS、Fedora、Mageia、OpenMandriva 等 Linux 发行版中安装软件。

Debian 和基于 Debian 的发行版(例如 MX Linux、Deepin、Ubuntu)以及基于 Ubuntu 的发行版(例如 Linux Mint 和 Pop!\_OS)都有 apt,这是一个“相似但不同”的工具。在本文中,我将按照 Seth 的示例(但使用 apt)向你展示如何使用它。

在一开始,我想先提一下四个跟 apt 相关的软件安装工具:

  • Synaptic 是为 apt 服务的一个基于 GTK+ 的图形用户界面(GUI)的前端工具。
  • Aptitude 是为 apt 服务的一个基于 Ncurses 的全屏命令行前端工具。
  • apt 的前身有 apt-getapt-cache 等工具。
  • Dpkg 是在 apt 包管理器背后处理繁杂事务的”幕后工作者“。

还有其他的包管理系统,例如 FlatpakSnap,你可能会在 Debian 和基于 Debian 的系统上遇到它们,但我不打算在这里讨论。还有一些应用程序“商店”,例如 GNOME “软件”,与 apt 和其他打包技术重叠;我也不打算在这里讨论它们。最后,还有其他 Linux 发行版,例如 ArchGentoo 既不使用 dnf 也不使用 apt,我也不打算在这里讨论它们!

上面我讲了这么多我不想提及的内容,你可能怀疑 apt 到底还能处理多少软件。这么说吧,在我的 Ubuntu 20.04 上,apt 可以让我使用 69,371 个软件包,从 0ad(一款古代战争题材的即时战略游戏)到 zzuf(一个透明的应用程序模糊测试工具),一点也不差。

使用 apt 搜索软件

使用 apt 软件包管理器的第一步是找到感兴趣的软件包。Seth 的 dnf 文章以 Cockpit 服务器管理应用程序为例。用 apt 我会输入如下命令:

$ apt search cockpit
Sorting... Done
Full Text Search... Done
389-ds/hirsute,hirsute 1.4.4.11-1 all
  389 Directory Server suite - metapackage

cockpit/hirsute,hirsute 238-1 all
  Web Console for Linux servers

...
$

上面的第二个包就是你要的那个(以 cockpit/hirsute 开头的那一行)。如果你决定要安装它,输入:

$ sudo apt install cockpit

apt 将负责安装 Cockpit 以及使其工作所需的所有部件或 依赖。有时我们不太确定这是我们所需要的。了解更多的信息可能有助于你决定是否真的要安装此应用程序。

包元数据

要了解有关软件包的更多信息,使用 apt show 命令:

$ apt show cockpit
Package: cockpit
Version: 238-1
Priority: optional
Section: universe/admin
Origin: Ubuntu
Maintainer: Ubuntu Developers <[email protected]>
Original-Maintainer: Utopia Maintenance Team <[email protected]>
Bugs: https://bugs.launchpad.net/ubuntu/+filebug
Installed-Size: 88.1 kB
Depends: cockpit-bridge (>= 238-1), cockpit-ws (>= 238-1), cockpit-system (>= 238-1)
Recommends: cockpit-storaged (>= 238-1), cockpit-networkmanager (>= 238-1), cockpit-packagekit (>= 238-1)
Suggests: cockpit-doc (>= 238-1), cockpit-pcp (>= 238-1), cockpit-machines (>= 238-1), xdg-utils
Homepage: https://cockpit-project.org/
Download-Size: 21.3 kB
APT-Sources: http://ca.archive.ubuntu.com/ubuntu hirsute/universe amd64 Packages
Description: Web Console for Linux servers
 The Cockpit Web Console enables users to administer GNU/Linux servers using a
 web browser.
 .
 It offers network configuration, log inspection, diagnostic reports, SELinux
 troubleshooting, interactive command-line sessions, and more.

$

特别要注意的是 Description 字段,它会告诉你更多关于应用程序的信息。Depends 字段说明还必须安装什么,而 Recommends 则显示建议安装的其他(如果有的话)合作组件。Homepage 字段会提供一个网址,通过它你可以了解更多。

哪个包提供的这个文件?

有时你并不知道包名,但你知道包里一定包含着的某个文件。Seth 以 qmake-qt5 程序作为示例。使用 apt search 找不到它:

$ apt search qmake-qt5
Sorting... Done
Full Text Search... Done
$

但是,另一个有关联的命令 apt-file 可以用来探索包内部:

$ apt-file search qmake-qt5
qt5-qmake-bin: /usr/share/man/man1/qmake-qt5.1.gz
$

这时会显示一个 qmake-qt5 的手册页。它是一个名为 qt5-qmake-bin 的包的一部分。注意,此包名称颠倒了字符串 qmakeqt5 的顺序。

包里包含哪些文件?

方便的 apt-file 命令会列出给定的包中包含哪些文件。例如:

$ apt-file list cockpit
cockpit: /usr/share/doc/cockpit/TODO.Debian
cockpit: /usr/share/doc/cockpit/changelog.Debian.gz
cockpit: /usr/share/doc/cockpit/copyright
cockpit: /usr/share/man/man1/cockpit.1.gz
cockpit: /usr/share/metainfo/cockpit.appdata.xml
cockpit: /usr/share/pixmaps/cockpit.png
$

注意,这与 apt show 命令提供的信息不同,后者列出了包的依赖(其他必须安装的包)。

移除一个应用程序

你还可以使用 apt 移除软件包。例如,要移除apt-file 应用程序:

$ sudo apt purge apt-file

注意必须由超级用户运行 apt 才能安装或移除应用程序。

移除一个包并不会自动移除 apt 在此过程中安装的所有依赖项。不过,一点点的工作就很容易去除这些残留:

$ sudo apt autoremove

认识一下 apt

正如 Seth 所写的,“你对包管理器的工作方式了解得越多,在需要安装和查询应用程序时就会越容易。”

即便你不是 apt 的重度使用者,当你需要在命令行中安装或删除软件包时(例如,在一台远程服务器上或遵循某些热心肠发布的操作指南时),掌握一些 apt 的知识也会很有用。在某些软件创作者仅提供了一个裸 .pkg 文件的情况下,可能还需要了解一些关于 dpkg 的知识(如上所述)。

我发现 Synaptic 包管理器在我的桌面上是一个非常有用的工具,但出于各种目的,我也在少数维护的服务器上使用着 apt

下载我们的 apt 速查表 习惯该命令并尝试一些新技巧。一旦你这样做了,你可能会发现很难再使用其他任何东西。

apt 速查表

via: https://opensource.com/article/21/6/apt-linux

作者:Chris Hermansen 选题:lujun9972 译者:hanszhao80 校对:wxy

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

watch 和 tail 命令可以帮助监视 Linux 系统上的活动。本文介绍了这两个命令的一些有用的使用方法。

watchtail 命令为持续监视 Linux 系统上的活动提供了一些有趣的选项。

也就是说,你可以通过 watch 来显示谁已登录,并随着用户登录和注销不断更新,而不是仅仅提出问题并获得答案(例如询问 who 并获取当前登录用户的列表)。

使用 tail,你可以显示文件的底部并在添加内容时查看内容。这种监控一般非常有用,并且比定期运行命令所需的工作更少。

使用 watch 命令

使用 watch 的最简单示例之一是使用命令 watch who。你会看到一个列表,其中显示了谁登录了,以及他们登录的时间和登录位置。请注意,默认设置是每两秒更新一次显示(左上角),日期和时间(右上角)将按该间隔自行更新。用户列表将随着用户登录和注销而增长和缩小。

$ watch who

此命令将显示如下所示的登录列表:

Every 2.0s: who                              dragonfly: Thu Feb 27 10:52:00 2020

nemo     pts/0        2020-02-27 08:07 (192.168.0.11)
shs      pts/1        2020-02-27 10:58 (192.168.0.5)

你可以通过添加 -n 选项(例如 -n 10)来修改更新间的不同秒数,以修改更新间隔,从而获取较少的更新频率。

$ watch -n 10 who

上述命令将以新的间隔显示,并且显示的时间更新频率较低,从而使显示时间与所选间隔保持一致。

Every 10.0s: who                             dragonfly: Thu Feb 27 11:05:47 2020

nemo     pts/0        2020-02-27 08:07 (192.168.0.11)
shs      pts/1        2020-02-27 10:58 (192.168.0.5)

如果你希望仅查看命令的输出,而不是标题(前 2 行),则可以通过添加 -t(无标题)选项来省略这些行。

$ watch -t who

然后,你的屏幕将显示如下所示:

nemo     pts/0        2020-02-27 08:07 (192.168.0.11)
shs      pts/1        2020-02-27 10:58 (192.168.0.5)

如果每次运行监视的命令时,输出都是相同的,则只有标题行(如果未省略)会更改。其余显示的信息将保持不变。

如果你希望 watch 命令在它正在监视的命令的输出发生更新后立即退出,则可以使用 -g(将其视为“ 离开 go away ”)选项。例如,如果你只是在等待其他人开始登录系统,则可以选择执行此操作。

你还可以使用 -d 差异 differences )选项突出显示显示输出中的更改。突出显示只会持续一个间隔(默认为 2 秒),但有助于引起你对更新的注意。

下面是一个更复杂的示例,该示例使用 watch 命令显示正在侦听连接的服务及其使用的端口。虽然输出不太可能更改,但它会提醒你任何新服务正在启动或关闭。

$ watch 'sudo lsof -i -P -n | grep LISTEN'

值得注意的是,正在运行的命令需要用引号扩起来,以确保不会将 watch 命令的输出发送到 grep 命令。

使用 watch -h 命令将为你提供命令选项的列表。

$ watch -h

Usage:
 watch [options] command

Options:
  -b, --beep             beep if command has a non-zero exit
  -c, --color            interpret ANSI color and style sequences
  -d, --differences[=<permanent>]
                         highlight changes between updates
  -e, --errexit          exit if command has a non-zero exit
  -g, --chgexit          exit when output from command changes
  -n, --interval <secs>  seconds to wait between updates
  -p, --precise          attempt run command in precise intervals
  -t, --no-title         turn off header
  -x, --exec             pass command to exec instead of "sh -c"

 -h, --help     display this help and exit
 -v, --version  output version information and exit

使用 tail -f

tail -f 命令与 watch 有一些相同之处。它也会在添加文件时显示文件的底部和其他内容。你不必一次又一次地运行 tail 命令,而是运行一个命令并获得可重复更新显示视图的结果。例如,你可以使用如下命令查看系统日志:

$ tail -f /var/log/syslog

某些文件(如 /var/log/wtmp)不适合这种类型的处理,因为它们的格式不是普通文本文件,但是通过组合 watchtail,你可以获得类似的结果,如下所示:

watch 'who /var/log/wtmp | tail -20'

无论有多少用户仍处于登录状态,此命令都将只显示最近的 5 次登录。如果发生其他登录,显示结果将添加一行记录并删除顶行记录。

Every 60.0s: who /var/log/wtmp | tail -5    dragonfly: Thu Feb 27 12:46:07 2020

shs      pts/0        2020-02-27 08:07 (192.168.0.5)
nemo     pts/1        2020-02-27 08:26 (192.168.0.5)
shs      pts/1        2020-02-27 10:58 (192.168.0.5)
nemo     pts/1        2020-02-27 11:34 (192.168.0.5)
dory     pts/1        2020-02-27 12:14 (192.168.0.5)

对你有时可能想要监视的信息,无论监视进程、登录名还是系统资源,watchtail -f 命令都可以提供自动更新视图,从而使监视任务变得更加容易。


via: https://www.networkworld.com/article/3529891/watching-activity-on-linux-with-watch-and-tail-commands.html

作者:Sandra Henry-Stocker 选题:lujun9972 译者:Starryi 校对:wxy

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

在今天早些时候的一篇博文中,创始人兼首席执行官 Daniella Fore 公布了 elementary OS 7 的发行说明和计划更新。

elementary OS 7 公告

elementary OS 7 的代号是 “Horus”,它将基于 Ubuntu 22.04 LTS。这个版本的开发已经接近尾声,团队正在修复一些涉及窗口管理器和其他领域的关键回归测试问题。

首先,功能方面,elementary OS 7 得到了来自 Ubuntu 22.04 LTS 的最新软件包和升级。此外,Flatpak 运行时更新、Granite 7、样式表和图标更新 预计将在这个发行版的第 7 个版本中出现。它将会基于 Linux 5.15.x 内核

其次,应用商店中的软件将会获得 软件自动更新功能 和新的 笔记本电脑的电源配置文件选项。预计电源配置文件将遵循传统的“ 平衡 Balanced ”、“ 性能 Performance ”和“ 节能 Power Saver ”选项,就像其他 Linux 发行版一样。

此外,一个 新的漂亮的音乐应用程序 将在这个版本中首次亮相,它重新设计了一些图标,在桌面上的视觉效果也有提升。一些原生的应用商店中的软件已经使用了 GTK4 技术,在 Elementory OS 7 中,它们将会给用户带来流畅的性能体验。

新的升级工具

但这还不是全部。团队还兴奋地宣布,一个 elementary 版本升级工具 的可用原型已经准备就绪,目前正在测试。因此,在 elementary OS 7 发布后,它将正式亮相,以帮助用户实现从 elementary OS 6 到 7 的迁移。

目前,elementary OS 的版本升级是最大的挑战,因为它没有任何官方的升级途径。“版本升级工具” 是一个令人兴奋的消息,它将吸引更多的用户使用这个漂亮的 Linux 发行版。

不过,Wayland 迁移仍在计划之中,还没有被优先考虑。当 Wayland 被完整支持后,elementary OS 用户将会获得令人兴奋的体验。

发布日期?

对于任何一个 elementary OS 发行版,用户最关心的问题都是发布日期。嗯,发布日期还没有最终确定。elementary OS 7 “Horus” 将在准备好后发布。我乐观的猜测是在今年年底,在 Ubuntu 22.04 的第一个点发布(预计在 2022 年 7 月)之后。

最后,请阅读 elementary OS 7 官方公告,了解更多关于这个版本的信息,以及 elementary OS 6 “Odin”(6.1 版本)的许多更新。


via: https://www.debugpoint.com/2022/05/elementary-os-7-announcement/

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

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

Mozilla Firefox 100 是一个重要的版本,它标志着这个浏览器 17 年的发展,以及多年来所有令人兴奋的功能。

Firefox 100

Firefox 可以说是最受欢迎的不基于 Chrome 的开源浏览器,它可用于 Linux、Windows 和 Mac。

众所周知,目前,基于 Chrome 的浏览器在市场份额中占主导地位。但你可能不知道的是,Firefox 早在谷歌 Chrome 出现之前就已经问世了。

准确地说,Firefox 100 的发布标志着,它自 2004 年的发展历程已经有 17 年了。

时间过得好快,一切仿佛就发生在昨天。

Firefox 100:更新内容

Firefox 100

不管你是否喜欢 Firefox 新的发展计划,你都不得不承认,它多年来引入了众多行业领先的功能/技术,这一点令人印象深刻。

Firefox 100 的发布是一个重要的里程碑。但是,这并不是一次大规模升级。

本文中,我将介绍这个版本的主要改进。

“画中画”模式改进

Firefox 100

现在,在“画中画”模式下观看 YouTube、Prime Video 和 Netflix 上的任何内容,Firefox 都支持视频字幕。

你只需要在相应的平台上启用视频字幕,它就会继续出现在“画中画”中。

“画中画”字幕不仅支持主流平台,还支持 Coursera 等使用 WebVTT 格式的网站。

语言检测

为了改善用户体验,Firefox 现在可以检测到语言与操作系统偏好不符的情况。

这只会在你安装浏览器后,第一次运行时触发。你可以在系统语言和浏览器默认语言之间进行选择。

滚动条默认不占用屏幕空间

Linux 和 Windows 11 的滚动条默认不会占用你宝贵的屏幕空间。换句话说,当你进行滚动或导航时,滚动条才会做出反应。

Firefox 100

你可以在设置中改变这一点(针对 Linux 用户)。如果你是在 Windows 上,Firefox 的视觉效果会跟随你的系统设置。因此,你需要对 Firefox 浏览器进行调整,以符合你自己的偏好。

控制网站外观

Firefox 100

对于某些网站,你的浏览器偏好会影响网页的颜色/外观。

为了调整这类网站的体验,你现在可以在设置中设置网站外观偏好,选择浅色/深色、系统或 Firefox 主题。

HDR 视频 & 硬件加速的 AV1 视频解码

尽管,对一些用户来说,支持 HDR 视频可能不是什么大事。但我还是要指出,现在 Mac 上的 Firefox 也支持 HDR 了。

截至目前,官方支持仅限于在 macOS 11+ 上浏览 YouTube 网站。当然,你还需要一个支持 HDR 的屏幕。

硬件加速的 AV1 视频解码终于在 Windows 上得到支持,当然,你还得有与之兼容的 GPU(包括英特尔 11 代、AMD RDNA 2 和 GeForce 30 系列)。除此之外,Firefox 在 Windows 上还启用了视频叠加功能,以减少电量使用。

不幸的是,这些并不是针对 Linux 的更新,但应该能帮助跨平台的 Firefox 用户。

其他改进

除了主要的亮点之外,它还包括了以下改进:

  • 增加了对多个 Java 线程的分析支持。
  • 软重载一个网页将不再导致所有资源的重新验证。
  • 有了一个新的链接焦点指示器,它用一个实心的蓝色轮廓取代了旧的点状轮廓。

你可以在 官方发布说明 中了解更多技术变化。

获取 Firefox 100

你可以从它的官网上下载,也可以寻找可用的更新,应该很快就能下载完成。

Mozilla Firefox 100

via: https://news.itsfoss.com/firefox-100-release/

作者:Ankush Das 选题:lkxed 译者:lkxed 校对:校对者ID

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