2022年7月

我对 终端 Terminal 是怎么回事困惑了很久。

但在上个星期,我使用 xterm.js 在浏览器中显示了一个交互式终端,我终于想到要问一个相当基本的问题:当你在终端中按下键盘上的一个键(比如 Delete,或 Escape,或 a),发送了哪些字节?

像往常一样,我们将通过做一些实验来回答这个问题,看看会发生什么 : )

远程终端是非常古老的技术

首先,我想说的是,用 xterm.js 在浏览器中显示一个终端可能看起来像一个新事物,但它真的不是。在 70 年代,计算机很昂贵。因此,一个机构的许多员工会共用一台电脑,每个人都可以有自己的 “终端” 来连接该电脑。

例如,这里有一张 70 年代或 80 年代的 VT100 终端的照片。这看起来像是一台计算机(它有点大!),但它不是 —— 它只是显示实际计算机发送的任何信息。

https://creativecommons.org/licenses/by/2.0, via Wikimedia Commons">DEC VT100终端

当然,在 70 年代,他们并没有使用 Websocket 来做这个,但来回发送的信息的方式和当时差不多。

(照片中的终端是来自西雅图的 活电脑博物馆 Living Computer Museum ,我曾经去过那里,并在一个非常老的 Unix 系统上用 ed 编写了 FizzBuzz,所以我有可能真的用过那台机器或它的一个兄弟姐妹!我真的希望活电脑博物馆能再次开放,能玩到老式电脑是非常酷的。)

发送了什么信息?

很明显,如果你想连接到一个远程计算机(用 ssh 或使用 xterm.js 和 Websocket,或其他任何方式),那么需要在客户端和服务器之间发送一些信息。

具体来说:

客户端 需要发送用户输入的键盘信息(如 ls -l)。 服务器 需要告诉客户端在屏幕上显示什么。

让我们看看一个真正的程序,它在浏览器中运行一个远程终端,看看有哪些信息会被来回发送!

我们将使用 goterm 来进行实验

我在 GitHub 上发现了这个叫做 goterm 的小程序,它运行一个 Go 服务器,可以让你在浏览器中使用 xterm.js 与终端进行交互。这个程序非常不安全,但它很简单,很适合学习。

复刻了它,使它能与最新的 xterm.js 一起工作,因为它最后一次更新是在 6 年前。然后,我添加了一些日志语句,以打印出每次通过 WebSocket 发送/接收的字节数。

让我们来看看在几个不同的终端交互过程中的发送和接收情况吧!

示例:ls

首先,让我们运行 ls。下面是我在 xterm.js 终端上看到的情况:

~:/play$ ls
file
~:/play$

以下是发送和接收的内容:(在我的代码中,我记录了每次客户端发送的字节:sent: [bytes],每次它从服务器接收的字节:recv: [bytes]

sent: "l"
recv: "l"
sent: "s"
recv: "s"
sent: "\r"
recv: "
\x1b[?2004l\r"
recv: "file
"
recv: "\x1b[~:/play$ "

我在这个输出中注意到 3 件事:

  1. 回显:客户端发送 l,然后立即收到一个 l 发送回来。我想这里的意思是,客户端真的很笨 —— 它不知道当我输入l 时,我想让 l 被回显到屏幕上。它必须由服务器进程明确地告诉它来显示它。
  2. 换行:当我按下回车键时,它发送了一个 \r'(回车)符号,而不是\n'(换行)。
  3. 转义序列:\x1b 是 ASCII 转义字符,所以 \x1b[?2004h 是告诉终端显示什么或其他东西。我想这是一个颜色序列,但我不确定。我们稍后会详细讨论转义序列。

好了,现在我们来做一些稍微复杂的事情。

示例:Ctrl+C

接下来,让我们看看当我们用 Ctrl+C 中断一个进程时会发生什么。下面是我在终端中看到的情况:

~:/play$ cat
^C
~:/play$

而这里是客户端发送和接收的内容。

sent: "c"
recv: "c"
sent: "a"
recv: "a"
sent: "t"
recv: "t"
sent: "\r"
recv: "
\x1b[?2004l\r"
sent: "\x03"
recv: "^C"
recv: "
"
recv: "\x1b[?2004h"
recv: "~:/play$ "

当我按下 Ctrl+C 时,客户端发送了 \x03。如果我查 ASCII 表,\x03 是 “文本结束”,这似乎很合理。我认为这真的很酷,因为我一直对 Ctrl+C 的工作原理有点困惑 —— 很高兴知道它只是在发送一个 \x03 字符。

我相信当我们按 Ctrl+C 时,cat 被中断的原因是服务器端的 Linux 内核收到这个 \x03 字符,识别出它意味着 “中断”,然后发送一个 SIGINT 到拥有伪终端的进程组。所以它是在内核而不是在用户空间处理的。

示例:Ctrl+D

让我们试试完全相同的事情,只是用 Ctrl+D。下面是我在终端看到的情况:

~:/play$ cat
~:/play$

而这里是发送和接收的内容:

sent: "c"
recv: "c"
sent: "a"
recv: "a"
sent: "t"
recv: "t"
sent: "\r"
recv: "
\x1b[?2004l\r"
sent: "\x04"
recv: "\x1b[?2004h"
recv: "~:/play$ "

它与 Ctrl+C 非常相似,只是发送 \x04 而不是 \x03。很好!\x04 对应于 ASCII “传输结束”。

Ctrl + 其它字母呢?

接下来我开始好奇 —— 如果我发送 Ctrl+e,会发送什么字节?

事实证明,这只是该字母在字母表中的编号,像这样。

  • Ctrl+a => 1
  • Ctrl+b => 2
  • Ctrl+c => 3
  • Ctrl+d => 4
  • ...
  • Ctrl+z => 26

另外,Ctrl+Shift+b 的作用与 Ctrl+b 完全相同(它写的是0x2)。

键盘上的其他键呢?下面是它们的映射情况:

  • Tab -> 0x9(与 Ctrl+I 相同,因为 I 是第 9 个字母)
  • Escape -> \x1b
  • Backspace -> \x7f
  • Home -> \x1b[H
  • End -> \x1b[F
  • Print Screen -> \x1b\x5b\x31\x3b\x35\x41
  • Insert -> \x1b\x5b\x32\x7e
  • Delete -> \x1b\x5b\x33\x7e
  • 我的 Meta 键完全没有作用

Alt 呢?根据我的实验(和一些搜索),似乎 AltEscape 在字面上是一样的,只是按 Alt 本身不会向终端发送任何字符,而按 Escape 本身会。所以:

  • alt + d => \x1bd(其他每个字母都一样)
  • alt + shift + d => \x1bD(其他每个字母都一样)
  • 诸如此类

让我们再看一个例子!

示例:nano

下面是我运行文本编辑器 nano 时发送和接收的内容:

recv: "\r\x1b[~:/play$ "
sent: "n" [[]byte{0x6e}]
recv: "n"
sent: "a" [[]byte{0x61}]
recv: "a"
sent: "n" [[]byte{0x6e}]
recv: "n"
sent: "o" [[]byte{0x6f}]
recv: "o"
sent: "\r" [[]byte{0xd}]
recv: "
\x1b[?2004l\r"
recv: "\x1b[?2004h"
recv: "\x1b[?1049h\x1b[22;0;0t\x1b[1;16r\x1b(B\x1b[m\x1b[4l\x1b[?7h\x1b[39;49m\x1b[?1h\x1b=\x1b[?1h\x1b=\x1b[?25l"
recv: "\x1b[39;49m\x1b(B\x1b[m\x1b[H\x1b[2J"
recv: "\x1b(B\x1b[0;7m  GNU nano 6.2 \x1b[44bNew Buffer \x1b[53b \x1b[1;123H\x1b(B\x1b[m\x1b[14;38H\x1b(B\x1b[0;7m[ Welcome to nano.  For basic help, type Ctrl+G. ]\x1b(B\x1b[m\r\x1b[15d\x1b(B\x1b[0;7m^G\x1b(B\x1b[m Help\x1b[15;16H\x1b(B\x1b[0;7m^O\x1b(B\x1b[m Write Out   \x1b(B\x1b[0;7m^W\x1b(B\x1b[m Where Is    \x1b(B\x1b[0;7m^K\x1b(B\x1b[m Cut\x1b[15;61H"

你可以看到一些来自用户界面的文字,如 “GNU nano 6.2”,而这些 \x1b[27m 的东西是转义序列。让我们来谈谈转义序列吧!

ANSI 转义序列

上面这些 nano 发给客户端的 \x1b[ 东西被称为“转义序列”或 “转义代码”。这是因为它们都是以 “转义”字符 \x1b 开头。它们可以改变光标的位置,使文本变成粗体或下划线,改变颜色,等等。维基百科介绍了一些历史,如果你有兴趣的话可以去看看。

举个简单的例子:如果你在终端运行

echo -e '\e[0;31mhi\e[0m there'

它将打印出 “hi there”,其中 “hi” 是红色的,“there” 是黑色的。本页 有一些关于颜色和格式化的转义代码的例子。

我认为有几个不同的转义代码标准,但我的理解是,人们在 Unix 上使用的最常见的转义代码集来自 VT100(博客文章顶部图片中的那个老终端),在过去的 40 年里没有真正改变。

转义代码是为什么你的终端会被搞乱的原因,如果你 cat 一些二进制数据到你的屏幕上 —— 通常你会不小心打印出一堆随机的转义代码,这将搞乱你的终端 —— 如果你 cat 足够多的二进制数据到你的终端,那里一定会有一个 0x1b 的字节。

可以手动输入转义序列吗?

在前面几节中,我们谈到了 Home 键是如何映射到 \x1b[H 的。这 3 个字节是 Escape + [ + H(因为 Escape\x1b)。

如果我在 xterm.js 终端手动键入 Escape ,然后是 [,然后是 H,我就会出现在行的开头,与我按下 Home 完全一样。

我注意到这在我的电脑上的 Fish shell 中不起作用 —— 如果我键入 Escape,然后输入 [,它只是打印出 [,而不是让我继续转义序列。我问了我的朋友 Jesse,他写过 一堆 Rust 终端代码,Jesse 告诉我,很多程序为转义代码实现了一个 超时 —— 如果你在某个最小的时间内没有按下另一个键,它就会决定它实际上不再是一个转义代码了。

显然,这在 Fish shell 中可以用 fish_escape_delay_ms 来配置,所以我运行了 set fish_escape_delay_ms 1000,然后我就能用手输入转义代码了。工作的很好!

终端编码有点奇怪

我想在这里暂停一下,我觉得你按下的键被映射到字节的方式是非常奇怪的。比如,如果我们今天从头开始设计按键的编码方式,我们可能不会把它设置成这样:

  • Ctrl + aCtrl + Shift + a 做的事情完全一样。
  • AltEscape 是一样的
  • 控制序列(如颜色/移动光标)使用与 Escape 键相同的字节,因此你需要依靠时间来确定它是一个控制序列还是用户只是想按 Escape

但所有这些都是在 70 年代或 80 年代或什么时候设计的,然后需要永远保持不变,以便向后兼容,所以这就是我们得到的东西 :smiley:

改变窗口大小

在终端中,并不是所有你能做的事情都是通过来回发送字节发生的。例如,当终端被调整大小时,我们必须以不同的方式告诉 Linux 窗口大小已经改变。

下面是 goterm 中用来做这件事的 Go 代码的样子:

syscall.Syscall(
    syscall.SYS_IOCTL,
    tty.Fd(),
    syscall.TIOCSWINSZ,
    uintptr(unsafe.Pointer(&resizeMessage)),
)

这是在使用 ioctl 系统调用。我对 ioctl 的理解是,它是一个系统调用,用于处理其他系统调用没有涉及到的一些随机的东西,通常与 IO 有关,我猜。

syscall.TIOCSWINSZ 是一个整数常数,它告诉 ioctl 我们希望它在本例中做哪件事(改变终端的窗口大小)。

这也是 xterm 的工作方式。

在这篇文章中,我们一直在讨论远程终端,即客户端和服务器在不同的计算机上。但实际上,如果你使用像 xterm 这样的终端模拟器,所有这些工作方式都是完全一样的,只是很难注意到,因为这些字节并不是通过网络连接发送的。

文章到此结束啦

关于终端,肯定还有很多东西要了解(我们可以讨论更多关于颜色,或者原始与熟化模式,或者 Unicode 支持,或者 Linux 伪终端界面),但我将在这里停止,因为现在是晚上 10 点,这篇文章有点长,而且我认为我的大脑今天无法处理更多关于终端的新信息。

感谢 Jesse Luehrs 回答了我关于终端的十亿个问题,所有的错误都是我的 :smiley:


via: https://jvns.ca/blog/2022/07/20/pseudoterminals/

作者:Julia Evans 选题:lujun9972 译者:wxy 校对:wxy

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

了解 Java 中的内存管理。

用 C 或 C++ 这样的编程语言写一个应用时,需要编写代码来销毁内存中不再需要的对象。当应用程序扩展得越来越复杂时,未使用对象被忽略释放的可能性就越大。这会导致内存泄露,最终内存耗尽,在某个时刻将没有更多的内存可以分配。结果就是应用程序运行失败并出现 OutOfMemoryError 错误。但在 Java 中, 垃圾收集器 Garbage Collection (GC)会在程序执行过程中自动运行,减轻了手动分配内存和可能的内存泄漏的任务。

垃圾收集器并不只有一种,Java 虚拟机(JVM)有七种不同的垃圾收集器,了解每种垃圾收集器的目的和优点是很有用的。

1、Serial 收集器

Serial threaded garbage collection

垃圾收集器的原始实现,使用单线程。当垃圾收集器运行时,会停止应用程序(通常称为“stop the world”事件)。适用于能够承受短暂停顿的应用程序。该垃圾收集器占用内存空间比较小,因此这是嵌入式应用程序的首选垃圾收集器类型。在运行时使用以下命令启用该垃圾收集器:

$ java -XX:+UseSerialGC

2、Parallel 收集器

Parallel garbage collection

像 Serial 收集器一样,Parallel 收集器也使用“stop the world”方法。这意味着,当垃圾收集器运行时,应用程序线程会停止。但是不同的是,Parallel 收集器运行时有多个线程执行垃圾收集操作。这种类型的垃圾收集器适用于在多线程和多处理器环境中运行中到大型数据集的应用程序。

这是 JVM 中的默认垃圾收集器,也被称为吞吐量收集器。使用该垃圾收集器时可以通过使用各种合适的 JVM 参数进行调优,例如吞吐量、暂停时间、线程数和内存占用。如下:

  • 线程数:-XX:ParallelGCThreads=<N>
  • 暂停时间:-XX:MaxGCPauseMillis=<N>
  • 吞吐量(垃圾收集花费的时间与实际应用程序执行的时间相比):-XX:GCTimeRatio=<N>
  • 最大堆内存:-Xmx<N>

Parallel 收集器可以使用该命令显式启用:java -XX:+UseParallelGC 。使用这个命令,指定在新生代中通过多个线程进行垃圾回收,而老年代中的垃圾收集和内存压缩仍使用单个线程完成的。

还有一个版本的的 Parallel 收集器叫做 “Parallel Old GC”,它对新生代和老年代都使用多线程,启用命令如下:

$ java -XX:+UseParallelOldGC

3、Concurrent Mark Sweep(CMS)收集器

Concurrent garbage collection

Concurrent Mark Sweep(CMS)垃圾收集器与应用程序并行运行。对于新生代和老年代都使用了多线程。在 CMS 垃圾收集器删除无用对象后,不会对存活对象进行内存压缩。该垃圾收集器和应用程序并行运行,会降低应用程序的响应时间,适用于停顿时间较短的应用程序。这个收集器在 Java8 已过时,并在 Java14 中被移除。如果你仍在使用有这个垃圾收集器的 Java 版本,可以使用如下命令启用:

$ java -XX:+UseConcMarkSweepGC

在 CMS 垃圾收集器使用过程中,应用程序将暂停两次。首次暂停发生在标记可直接访问的存活对象时,这个暂停被称为初始标记。第二次暂停发生在 CMS 收集器结束时期,来修正在并发标记过程中,应用程序线程在 CMS 垃圾回收完成后更新对象时被遗漏的对象。这就是所谓的重新标记

4、G1 收集器

Garbage first

G1 垃圾收集器旨在替代 GMS。G1 垃圾收集器具备并行、并发以及增量压缩,且暂停时间较短。与 CMS 收集器使用的内存布局不同,G1 收集器将堆内存划分为大小相同的区域,通过多个线程触发全局标记阶段。标记阶段完成后,G1 知道哪个区域可能大部分是空的,并首选该区域作为清除/删除阶段。

在 G1 收集器中,一个对象如果大小超过半个区域容量会被认为是一个“大对象” 。这些对象被放置在老年代中,在一个被称为“humongous region”的区域中。 启用 G1 收集器的命令如下:

$ java -XX:+UseG1GC

5、Epsilon 收集器

该垃圾收集器是在 Java11 中引入的,是一个 no-op(无操作)收集器。它不做任何实际的内存回收,只负责管理内存分配。Epsilon 只在当你知道应用程序的确切内存占用情况并且不需要垃圾回收时使用。启用命令如下:

$ java -XX:+UnlockExperimentalVMOptions -XX:+UseEpsilonGC

6、Shenandoah 收集器

Shenandoah 是在 JDK12 中引入的,是一种 CPU 密集型垃圾收集器。它会进行内存压缩,立即删除无用对象并释放操作系统的空间。所有的这一切与应用程序线程并行发生。启用命令如下:

$ java -XX:+UnlockExperimentalVMOptions -XX:+UseShenandoahGC

7、ZGC 收集器

ZGC 为低延迟需要和大量堆空间使用而设计,允许当垃圾回收器运行时 Java 应用程序继续运行。ZGC 收集器在 JDK11 引入,在 JDK12 改进。在 JDK15,ZGC 和 Shenandoah 都被移出了实验阶段。启用 ZGC 收集器使用如下命令:

$ java -XX:+UnlockExperimentalVMOptions -XX:+UseZGC

灵活的垃圾收集器

Java 为我们提供了灵活的内存管理方式,熟悉不同的可用方法有助于为正在开发或运行的应用程序选择最合适的内存管理方式。


via: https://opensource.com/article/22/7/garbage-collection-java

作者:Jayashree Huttanagoudar 选题:lkxed 译者:Veryzzj 校对:wxy

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

apt 命令 用于 Debian 和 Ubuntu 中的包管理。虽然你可能已经熟悉安装和删除选项,但 apt 还提供了一些额外的功能。

其中之一是能够查看系统上所有可升级的软件包。要显示它们,你所要做的就是在终端中使用以下命令:

apt list --upgradable

如你所见,你甚至不需要使用 sudo 来列出可更新的包。它只是列出了可以更新的包,而不会更新它们。

实际上,当你运行 sudo apt update 命令更新本地包仓库缓存时,apt 命令会添加此提示。

Fetched 1,243 kB in 17s (71.4 kB/s)           
Reading package lists... Done
Building dependency tree... Done
Reading state information... Done
30 packages can be upgraded. Run 'apt list --upgradable' to see them.

我不记得在旧的 apt-get 命令中有任何类似的直接选项来列出所有可升级的包。这是 apt 在旧的 apt-get 命令之上添加的几个新功能之一。

让我们更详细地讨论一下。

列出所有可升级的包

你在这里应该知道的是你只能列出通过 APT 包管理器可用的更新。因此,如果你已将 PPA 或 外部仓库 添加到系统的 sources.list,你也将看到来自它们的更新。

但是你不会在这里获得 AppImage、Flatpak、Snap 或一些其他打包格式的更新。

换句话说,它只适用于 APT 包。

因此,要列出 Ubuntu 或 Debian 系统上的所有可升级包,你应该首先更新本地包缓存:

sudo apt update

然后你的系统将知道可用的软件包更新。apt 命令告诉你在 update 命令结束时可以升级多少个软件包:

The apt command shows the number of upgradable packages at the bottom of the apt update command output

要查看可以升级的软件包,请运行以下命令:

apt list --upgradable

你应该看到这样的输出:

~$ apt list --upgradable 
Listing... Done
apparmor/jammy-updates 3.0.4-2ubuntu2.1 amd64 [upgradable from: 3.0.4-2ubuntu2]
brave-browser/stable 1.40.113 amd64 [upgradable from: 1.40.107]
evolution-data-server-common/jammy-updates,jammy-updates 3.44.2-0ubuntu1 all [upgradable from: 3.44.1-0ubuntu2]
evolution-data-server/jammy-updates 3.44.2-0ubuntu1 amd64 [upgradable from: 3.44.1-0ubuntu2]

Listing all the upgradable packages

按字母顺序列出所有可升级的软件包以及有关当前安装版本和新可用软件包版本的信息。

brave-browser/stable 1.40.113 amd64 [upgradable from: 1.40.107]

例如,这显示我系统上安装了 Brave 浏览器,版本 1.40.107,并且版本 1.40.113 可用。

你能用这些信息做什么?让我分享一些我能想到的事情。

升级所有包

这可能是大多数普通 Ubuntu 用户所做的。你可以使用以下命令升级所有可升级包:

sudo apt upgrade

它列出了将要升级的软件包,然后要求按回车或 Y 确认升级。

Upgrade all packages

如果你确定要升级所有软件包,则可以通过在命令中添加 -y 来跳过 “Do you want to continue” 部分。

sudo apt upgrade -y

模拟升级(但不升级任何包)

这是人们在 apt list 命令之前所做的。使用模拟选项,你实际上不会进行任何更改。它仅显示运行升级时将安装或升级的软件包。

apt -s upgrade

你不需要使用 sudo(即使我在下面的截图中使用了它)。

Running an upgrade simulation with apt command

仅升级选定的包

如果你正在管理一个 Ubuntu 服务器,并且你不想升级所有软件包,而只想升级少数选定的软件包中的一个(如 MySQL/Ngnix),你可以使用 apt 命令轻松完成。

sudo apt --only-upgrade install package_name

实际上,如果你在已安装且有可用更新的软件包上运行 apt install 命令,它将升级该软件包。

使用 --only-upgrade 标志,你可以确保仅升级软件包(如果已安装)。如果尚未安装,它将不会安装给定的包。

你还可以通过提供名称来升级选定的几个包:

sudo apt --only-upgrade install package1 package2

你也可以做相反的事情,升级时保留选定的软件包

sudo apt-mark hold package_name

这样,当你升级所有系统包时,将不会升级给定的包。

你可以使用以下命令删除保留设置:

sudo apt-mark unhold package_name

是否显示内核升级?

这有点棘手。

当你运行 apt list –upgradable 命令时,它会显示所有可以升级的包。

但是如果有新的内核版本可用,它们可能不会显示,因为内核包名称以 linux-headers-x-y 开头。这是因为系统将它们视为新包,而不是对已安装的包 linux-headers-a-b 的升级。

但是,你仍然会在可升级包列表中看到 linux-generic-hwe 类型的包,因为该软件包将被升级(使用较新的内核)。

总结

列出可升级包的能力是 apt 命令为旧的 apt-get 命令带来的几个新功能之一。有关此主题的更多信息,你可以阅读我 解释 apt 和 apt-get 命令之间的区别 的文章。

作为桌面用户,我并不总是检查可以升级的软件包。我直接去升级。但是,当我管理服务器时,我更喜欢查看可用的更新,然后决定是否进行升级。

你呢?你觉得这个功能对你自己有用吗?


via: https://itsfoss.com/apt-list-upgradable/

作者:Abhishek Prakash 选题:lkxed 译者:geekpi 校对:wxy

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

Linux x86\_32 架构易受 Retbleed 漏洞影响,但没人关心

虽然相关的英特尔和AMD处理器已经对最近影响老一代处理器的 Retbleed 安全漏洞提供了缓解措施,但这些缓解措施目前只适用于 x86\_64 内核,如果在受影响的硬件上运用传统的 32 位 x86 内核,则这些安全措施无法发挥作用。事实证明,32 位的 Debian 即使打了补丁的内核,i386 部分仍然容易受到 Retbleed 攻击。Linux 稳定版内核维护负责人 GKH 说,“我不认为这是一个应该关心的有效组合。”英特尔的工程师补充说,“是的,到目前为止没有人关心修复 32 位架构。但如果有人真正关心并想投入精力,我想我会审查这些补丁,但说真的,没人会也不应该在基于 Skylake/Zen 的系统上运行 32 位内核,这太傻了。”

消息来源:phoronix
老王点评:过时的硬件连厂商和开源操作系统都不想管,虽然确实是老了点。

T2 SDE Linux 发布第一个 AI 超过人类贡献总和的版本

T2 SDE Linux 发布了 22.6 版本,其公告中称,它不仅仅是一个普通的 Linux发行版,而是一个“元发行版”。T2 允许用最先进的技术、最新的软件包和对交叉编译的集成支持来创建定制的发行版。T2 以其复杂的交叉编译支持而闻名,并支持几乎所有现有的 CPU 架构,并在嵌入式系统中广泛使用。在这个新的版本中,为 25 种 CPU 架构、变体和 C 库提供了全面支持。这也是第一个由 AI 驱动的软件包更新机器人 “data” 贡献的修改比人类贡献者加起来还要多的重要版本。(AI :164,人类:141)

消息来源:T2 SDE
老王点评:看来以后各种 AI 会接过更多开发工作。

荷兰教育部要求学校暂停使用 Chrome

出于对数据隐私的担忧,荷兰教育部决定在 2023 年 8 月前暂停使用谷歌的 ChromeOS 以及 Chrome 浏览器。官员们担心,谷歌服务收集学生数据,并将其提供给大型广告网络,而这些广告网络使用这些数据的目的超出了对教育的帮助。由于国家监督机构不知道学生的个人数据在哪里被存储和处理,人们担心会违反欧盟的 GDPR。谷歌承诺在明年之前准备好新版本的 Chrome 浏览器和 ChromeOS,因此临时禁令适用到那时,荷兰监管机构将作出新的评估。

消息来源:Bleeping Computer
老王点评:ChromeOS 本来就是主要为学校环境设计的,却因为欧洲的数据法案不能在学校使用了。

为角色扮演游戏的所有元素找到一个开源工具。

 title=

我玩过很多桌面角色扮演游戏(RPG),无论是从频率还是种类来说。一般来说,我更喜欢和朋友一起玩 RPG,但在过去的 2 年里,我一直在玩网络游戏。(LCTT 校注:这里的 RPG 游戏指的是那种“传统”的面对面的桌面游戏,而非很多人最初接触的 RPG 电子游戏。)

起初,我不确定如何在线长期的进行游戏。我知道有很多的工具可以实现,但直到我发现在线桌面游戏的开源世界之前,这些工具没有一个引起我的兴趣。通过一小部分开源应用程序,我已经能够在开源平台上进行我的所有游戏。

这也是一年中的好时机,因为最近是 免费 RPG 日(LCTT 校注:今年的这个节日在 7 月 23 日举办)。在免费 RPG 日,桌面角色扮演游戏行业的发行商们会免费发放游戏,鼓励玩家尝试新游戏和新冒险。尽管它在 2020 年被取消了,但今年它又作为现场活动回归,并通过 Dungeon Crawl ClassicsPaizo 的免费 RPG 示例下载提供了一些虚拟支持。

如果这个活动提供的虚拟产品还不够,我还整理了一份 你可能尚未尝试过的 5 个开源桌面 RPG 游戏列表

当你准备好开始玩游戏时,请尝试其中一些开源工具,看看它们能在多大程度上增强你的游戏体验。

聊天

在线 RPG 游戏最基本的(从技术上讲,也是唯一的)要求是交流。这是游戏的媒介:玩家需要一种说话的途径。

有几个不错的选择。我发现 Mumble 是对带宽需求最低的工具。这是一个纯语音聊天应用程序,可以使用非常高效的 Opus 编解码器让每个人一次交谈数小时而不会中断。

 title=

它在世界各地都运行有公共实例,所以下载 Mumble 客户端后,你可以加入其中任何一个开放的实例,并使用它来在线运行游戏。有一个“按下通话”设置,你可以用此来消除背景噪音,当你的其他家庭成员在进行其它工作而不想被你的桌面会话打扰时,这个功能将会非常实用。

还有一个文本聊天客户端。我的游戏组通常使用它来发布与游戏相关的链接,但你也可以将其用于其它无关内容的交谈,而让口头游戏保持在主题上。

如果你的玩家更喜欢看到面部表情,或者只是习惯于视频聊天网页应用。那么 Jitsi 是面对面围坐在桌子旁聚会的绝佳替代品。Jitsi 和你曾经使用过的其它视频聊天软件几乎一样,甚至更简单。你可以设置一个“房间”,邀请朋友,将陌生人拒之门外,并玩上几个小时。静音和关闭摄像都很直观,界面很吸引人,并且还定期开发和推出了新功能。

 title=

Mumble 和 Jitsi 都有适用于台式机和移动设备的客户端,因此任何人都可以在任何设备上使用。

角色表

我发布了我的 数字角色表 解决方案,但任何 RPG 玩家都知道管理角色不仅仅是统计数据。

在延续多个会话的在线游戏中,我发现每次游戏之间有很长的停止时间。我突然想到,虽然我发现要求我的玩家在现场纸笔游戏中计算损耗是不合理的,但当一切都是数字化时,要求他们跟踪损耗很容易。

网上有很多可用的电子表格,但开源的选择是 Ethercalc。由于其实例遍布世界各地,因此很容易找到免费的 Ethercalc 主机。或者,你可以使用 Podman 或者 Docker 轻松安装和运行你自己的实例。

 title=

Etherclac 提供了一些基本要素:一个共享的账本,这样玩家就可以跟踪他们的团队所携带的物品(以及在任何给定的时间持有该物品的人)、每件物品的重量和价值。当队伍在游戏过程中收集到战利品时,就会输入该物品,所以他们知道什么自己何时会因为负担过重而无法拿起新物品。

在不同的游戏会话之间,可以引用和整理这份共享的电子表格,以便玩家(PC)知道哪些物品可以卖掉,哪些物品可以放入储物袋,哪些物品可以在下一次会话发现更好的战利品时安全的丢弃。

地图

Mythic Table 是一款开源的桌面游戏共享地图系统。这意味着你可以加载图片作为游戏地图,并在地图上移动数字标记以表示玩家角色所在的位置。

自从 上次我介绍了关于 Mythic Table 以来,它已经在 Kickstarter 上成功地进行了一次众筹,以确保它的持续发展。它还增加了一些新功能,其中最引人注目的是“战争迷雾”功能,它允许地下城主掩盖地图并仅显示玩家探索过的部分。

 title=

在过去的几个月里,我一直在 Mythic Table 上运行两款游戏,这是一款优秀且直观的地图系统。它还提供了一个数字骰子筒,所以如果你的玩家没有骰子,或者你更喜欢在公开场合掷骰子,你就可以用它作为共享的骰子池。

你可以在 mythictable.com 上试用 Mythic Table,或者访问他们在 Github 上的代码库。

开源的开放游戏

我使用的开源工具是通用的,因此它们适用于你想玩的任何游戏系统。因为它们都是开源的,所以无论你的玩家使用什么操作系统,他们都可以在线使用,并且它们都可以自托管。

如果你既是程序员又是游戏玩家,请访问他们的 Git 代码仓库,看看是否有任何你可以贡献的东西。如果你是游戏玩家或者游戏管理员,在下次坐在数字版的游戏桌前请尝试使用一下这些工具。你可能会惊讶于你只需要很少的在线账户就可以使用一些可用于游戏的最佳应用程序。

(文内图片来自:Seth Kenlon,CC-BY-SA 4.0)


via: https://opensource.com/article/21/10/open-source-rpgs

作者:Seth Kenlon 选题:lujun9972 译者:perfiffer 校对:wxy

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

我创建了 Linux nftwatch 命令来观察防火墙的流量统计。

Netfilter 表(nftables)是现代 Linux 发行版中的默认防火墙。它在 Fedora 和 RHEL 8、最新的 Debian 和许多其他版本上都有。它取代了早期发行版中捆绑的旧版 iptables。它是一个强大的、值得的 iptables 替代品,作为一个广泛使用它的人,我欣赏它的能力和功能。

nftables 的一个特点是能够为许多元素添加计数器,例如规则。这些都是按需启用的。你需要使用 counter 参数,在每一行明确地要求它。我为我的防火墙中的特定规则启用了这些计数器,这使我能够看到这些规则。

这让我开始思考。我怎样才能实时查看这些计数器?一开始我尝试了 watch,它允许诸如刷新率之类的东西,但我不喜欢默认格式,而且它不能滚动。我发现使用 headtail 以及 awk 也不理想,并不存在一个用户友好的解决方案。所以我自己写了一个,我想与开源社区分享。

Linux 上的 nftwatch 介绍

我的解决方案,我称之为 nftwatch,做了几件事:

  • 它对 nftables 的输出进行重新排序和改写,使其更具有可读性。
  • 它允许向上或向下滚动输出。
  • 可以由用户定义的刷新率(可以实时改变)。
  • 它可以暂停显示。

你得到的不是一个表格的转储,而是显示每个规则活动的输出。

Image of nftwatch

你可以从它的 Git 仓库下载它。

它是 100% 的 Python 代码,100% 的开源,100% 的免费。它满足了所有免费的高质量程序的要求。

在 Linux 上安装 nftwatch

以下是手动安装说明:

  1. 克隆或从 git 仓库下载该项目。
  2. nftwatch.yml 复制到 /etc/nftwatch.yml
  3. nftwatch 复制到 /usr/local/bin/nftwatch 并使用 chmod a+x 授予其可执行权限。
  4. 使用 nftwatch,不带任何参数来运行它。
  5. 参见 nftwatch -m 的手册。

你也可以在没有 YAML 配置文件的情况下运行 nftwatch,在这种情况下它使用内置的默认值。

使用

nftwatch 命令显示 nftables 规则。大多数控制都是为此目的而设计的。

箭头键和等效的 Vim 的按键控制滚动。使用 FS 键来改变刷新速度。使用 P 键来暂停显示。

运行 nftwatch -m 以获得完整的说明,以及交互式按键控制的列表。

防火墙的新观点

即使你花费了时间去配置防火墙,它也会显得晦涩难懂和模糊不清。除了从日志条目中推断指标外,很难判断你的防火墙实际看到的活动类型。 使用 nftwatch,你可以看到你的防火墙在工作,并且可以更好地了解你的网络每天需要处理的流量类型。

(文内图片来自 Kenneth Aaron,CC BY-SA 4.0)


via: https://opensource.com/article/22/7/nftwatch-linux-firewall

作者:Kenneth Aaron 选题:lkxed 译者:geekpi 校对:wxy

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