BNU-FZH

fengzhenhua@outlook.com

As you know, the transition to Wayland from the traditional Xorg server in the Linux ecosystem has been a hot topic that caused much controversy and, admittedly, a fair share of troubleshooting.

While Wayland promises a more streamlined and secure interface than its predecessor, Xorg, users have often encountered hurdles, particularly regarding compatibility with NVIDIA graphics cards.

In other words, the journey hasn’t always been without bumps, from rendering issues to compatibility quirks. However, it’s becoming increasingly clear that the NVIDIA and Wayland combo, while not yet a perfect match, is evolving into a viable, working solution for many.

Still, with the proper guidance and a bit of patience, using NVIDIA with Wayland on Arch is not just a possibility but a largely workable solution. You can approach this transition with confidence.

This guide is designed to do precisely this: usher you through the setup process and offer solutions to ensure you can take most of your NVIDIA and Wayland experience on Arch Linux. So, let’s get started.

1、Install NVIDIA Driver

1
sudo pacman -S nvidia nvidia-settings

2、Set Environment Variables

With NVIDIA’s introduction of GBM (Generic Buffer Management) support, a crucial component of the Linux graphics stack that provides an API for allocating buffers for graphics rendering and display, many compositors have adopted it as their default. So, to force GBM as a backend, we need to set some environment variables.

Open the “/etc/environment” file, paste the following two lines, then save the file and exit.

/etc/environment
1
2
GBM_BACKEND=nvidia-drm
__GLX_VENDOR_LIBRARY_NAME=nvidia

Set environment variables.

3、Loading the NVIDIA Modules at System Boot

To ensure that the NVIDIA modules are loaded at the earliest possible stage, i.e., on the system boot, we need to add the ‘nvidia,’ ‘nvidia_modeset,’ ‘nvidia_uvm,’ and ‘nvidia_drm‘ modules to the initramfs – a temporary root file system loaded into memory as part of the boot process before the real root file system is mounted.

This is possible by entering them in the “MODULES” section of the “/etc/mkinitcpio.conf” file. This is a configuration file for mkinitcpio, a tool Arch uses to generate initial ramdisk images.

So, open the “/etc/mkinitcpio.conf” file. Then, enter the modules mentioned above, as the final version should look like this:

/etc/mkinitcpio.conf
1
MODULES=(nvidia nvidia_modeset nvidia_uvm nvidia_drm)

Loading the NVIDIA modules at system boot.

Great, but we’re not done with this file yet. Scroll down and remove the “kms” from the “HOOKS” section. This ensures that the initramfs will avoid including the open-source “nouveau” driver to mess with the work of the proprietary NVIDIA one we have installed and rely on.

Removing KMS from the Hooks.

We’ve finished modifying “/etc/mkinitcpio.conf“. Save your changes and close the file. Next, we’ll proceed to regenerate the initramfs. To do this, execute the following command:

1
sudo mkinitcpio -P

In the command’s output, you might notice messages like “WARNING: Possibly missing firmware for module…” These shouldn’t cause concern and are unrelated to the modifications we are currently implementing.

4、Enable DRM

DRM (Direct Rendering Manager) is a subsystem of the Linux kernel responsible for interfacing with GPUs. It provides a framework for graphics drivers to enable direct access to the graphics hardware, which is crucial for performance in rendering tasks, 3D graphics, video playback, and more.

NVIDIA provides proprietary graphics drivers for Linux that use the DRM subsystem to interact with their GPUs. These drivers are essential for getting the best performance and feature support on NVIDIA hardware under Linux.

Enabling the DRM kernel mode setting is required for Wayland compositors to function properly. So, we will pass it as a parameter to the Linux kernel during its initial boot through the GRUB bootloader.

Open its configuration file/etc/default/grub. Locate the line that begins with “GRUB_CMDLINE_LINUX_DEFAULT” and append “nvidia-drm.modeset=1” to its end. The completed line should resemble the example provided below.

Enabling DRM (Direct Rendering Manager) via GRUB.

Finally, regenerate the GRUB configuration by running:

1
sudo grub-mkconfig -o /boot/grub/grub.cfg

Regenerating the main GRUB configuration file.

5、Testing Wayland with NVIDIA on Arch Linux

You are all set up. Now, reboot your Arch system. At the login screen of the display manager you’re using, choose the Wayland Session option.

Switching to Wayland session on Arch.

Log in and enjoy a seamless Wayland experience with NVIDIA and your beloved Arch Linux.

Arch Linux is running on Wayland with NVIDIA GPU.

In addition, to verify that the NVIDIA DRM settings were correctly applied after a reboot, execute the following command; in response, you should get “Y.”

1
sudo cat /sys/module/nvidia_drm/parameters/modeset

Verifying the NVIDIA DRM settings.

6、设置 nvidia 电源管理

  1. Create a file /etc/modprobe.d/nvidia-power-management.conf with the following content:

    1
    options nvidia NVreg_PreserveVideoMemoryAllocations=1 NVreg_TemporaryFilePath=/var/tmp

  2. sudo update-initramfs -c -k all to re-generate the kernels. 此处我没有执行成功命令,但是并没有影响,系统正常配置成功。

  3. Reboot

  4. Go to suspend mode.

  5. Get an error when trying to load a saved state.

7、配置wayland

经过上述配置后,我发现重启系统将会默认进入到x11, 它是可以正常工作的,效果良好。但是,既然有强大的独立nvidia显卡,我们还是需要设置好nvidia. 下述根据 Wayland and the proprietary NVIDIA driver主操作,详细信息可以参考。

  • 启用nvidia相关服务

    1
    sudo systemctl enable nvidia-suspend.service nvidia-hibernate.service nvidia-resume.service
    此项参考:Preserve video memory after suspend

  • 强制启用Wayland, As of GDM 42 and NVIDIA driver 510, GDM defaults to Wayland. For older NVIDIA drivers (in between version 470 and 510), GDM has chipset-dependent udev rules to use Xorg rather than Wayland. To force-enable Wayland, override these rules by creating the following symlink:

    1
    sudo ln -s /dev/null /etc/udev/rules.d/61-gdm.rules

注意:如果没有第67步,在GNOME桌面环境启动后,GDM不能显示wayland启动选项,而只是默认启动Xorg, 设置好67后,系统正常进入到wayland

8、Bottom Line

In the end, it’s essential to clarify a key point. Our guide has confidently demonstrated that Wayland can operate smoothly with NVIDIA on an Arch system. This, however, does not extend to guaranteeing that every application, game, or desktop environment will also function flawlessly.

The compatibility of these components with Wayland varies and is dependent on the extent to which they have integrated support for it.

For example, desktop environments like KDE Plasma and GNOME offer very good support for Wayland, ensuring a seamless experience. On the other hand, environments like Cinnamon, with only basic Wayland support, may not deliver the same smoothness. So, it’s important to consider these differences.

Similarly, using the Hyprland dynamic tiling Wayland compositor would result in a smooth user experience, whereas others that are still dependent on Xorg may not offer the necessary support for Wayland. This variability in compatibility applies to individual applications too, so it’s important to be aware of potential issues when using specific software.

In conclusion, navigating the complexities of setting up Wayland on Arch can seem daunting, especially for those wielding the power of NVIDIA GPUs, who have historically faced hurdles ranging from rendering glitches to compatibility concerns.

Yet, with the proper knowledge, a dash of perseverance, and our guidance, the hurdles that once seemed impossible begin to shrink to the level that, with the correct setup, NVIDIA and Wayland can indeed create a synergy that brings out the best in your Arch setup.

Finally, we recommend referring to the specific Wayland and NVIDIA sections on the official Arch wiki for a more comprehensive understanding. They provide detailed information on setting up and troubleshooting Wayland and NVIDIA on Arch, making them valuable resources for further exploration.

And, of course, we’d love to hear your feedback or thoughts, so please don’t hesitate to share them in the comment box below.

9、References

对于一个数组,使用#表示删除左侧的部分,%表示删除右侧的部分,同时支持正则表达式。例如:

1
2
3
4
5
6
7
8
9
url="https://gitlab.com/fengzhenhua/script/-/raw/$USB_REMORT_SH\?inline\=false"
echo $url |sed -e 's/\(.\)/\1\n/g' |grep "/" |wc -l
> 7 # $url中一共有7个`/`
echo ${url#*//*/*/*/}
>
-/raw/$USB_REMORT_SH\?inline\=false
echo ${url%/${url#*//*/*/*/}}
>
https://gitlab.com/fengzhenhua/script

注意:此处不同与网上的教程,网上的一些教程如Shell 8种字符串截取方法等,指明了截取字符串时某一个字符的方法,但是对于*的理解没有做深入分析,而本文指出其代表若干字符,是正则表达式的一部分。于是在截取网址时,使用正则表达式给出*//*/*/*/方便的取得了相要的地址部分。

在编写Shell脚本中需要判断网址中的/出现的次数,进而获取网址的结构,然后根据需要可以截取部分网址。假设我们有一个字符串“Hello Bash”:

1
2
3
$ STRING="Hello Bash"
$ echo $STRING
Hello Bash

使用 bash shell,我们现在可以计算任何给定字符的出现次数。例如,让我们计算字符 l 出现的次数:

1
2
$ echo $STRING | sed -e 's/\(.\)/\1\n/g' | grep l | wc -l
2

sed 命令首先将任何给定的字符串分成多行。其中每行包含一个字符:

1
2
3
4
5
6
7
8
9
10
11
$ echo $STRING | sed -e 's/\(.\)/\1\n/g' 
H
e
l
l
o

B
a
s
h

之后我们可以使用grep命令来仅搜索特定字符。在本例中,我们仅打印字符 l

1
2
3
$ echo $STRING | sed -e 's/\(.\)/\1\n/g' | grep l
l
l

剩下的就是使用 wc -l 来简单地计算行数:

1
2
$ echo $STRING | sed -e 's/\(.\)/\1\n/g' | grep l | wc -l
2

相同的策略也可用于计算文件中字符的出现次数。下面的 bash shell 命令计算字符 l 在文件 /etc/services 中出现的次数:

1
2
 $ cat /etc/services | sed -e 's/\(.\)/\1\n/g' | grep l | wc -l
9298

然而,计算字符出现次数的另一种方法是使用 grep 的 --only-matching-o 选项仅打印匹配的字符:

1
2
$ grep -o l /etc/services | wc -l
9298

  RS232是一种通用的串行接口,可以用来连接不同的设备,比如计算机、打印机、终端设备等。它可以传输数据、控制信号和电源,但是它有一定的缺点,比如传输速率较慢,最高只能达到115200bps,而且它也不能支持高级功能,比如多点控制和网络通信。那么,RS232能接显示器吗?

RS232

  RS232接口是一种标准的串行接口,它由25个接口针组成,每个接口针都有一个不同的功能,比如接收和发送数据,控制信号等。它的接口针分为4组,每组有5个接口针,第一组是信号线,第二组是控制线,第三组是电源线,第四组是用于接收和发送数据的线。

RS232能接显示器吗?

  RS232接口可以用来连接显示器,但是需要使用一个转换器,它可以将RS232接口转换成显示器接口,如VGA接口、DVI接口等。这样,就可以使用RS232接口来连接显示器,但是由于RS232接口的传输速率较慢,所以只能用来传输低分辨率的画面,比如640×480或800×600,而不能用来传输高分辨率的画面,比如1920×1080。

总结

  RS232是一种通用的串行接口,可以用来连接不同的设备,比如计算机、打印机、终端设备等。它由25个接口针组成,每个接口针都有一个不同的功能,比如接收和发送数据,控制信号等。RS232接口可以用来连接显示器,但是需要使用一个转换器,它可以将RS232接口转换成显示器接口,如VGA接口、DVI接口等,但是由于RS232接口的传输速率较慢,所以只能用来传输低分辨率的画面,而不能用来传输高分辨率的画面。

参考资料

一、流程图是什么

流程图(Flowchart)也称为框图,通俗的讲就是把“流程”用“图”的形式展现出来,也就是“流程”+“图”。通常会使用一些特定图形加上相应的文字描述表示流程的具体步骤,并用含有箭头的线将这些图形连接起来,表示步骤执行的算法与先后顺序。

流程图简单画法

二、流程图的常见作用

  1. 流程图可以把复杂的过程简单而又直观地呈现出来,帮助我们梳理流程的先后顺序,让整个流程的思路更加清晰、有逻辑。
  2. 帮助管理者了解流程内的具体流程,用于查缺补漏,避免流程内出现多余或遗漏的内容,简化整理步骤的同时确保流程的完整性。
  3. 帮助分析流程内出现的问题,让流程内参与者能准确了解自己的职责所在,提高工作效率、优化管理水平。
流程图的常见作用

三、流程图符号

  常用流程图符号
  流程图的类型有很多,例如程序流程图、数据流程图或工艺流程图等。虽然流程图的分类众多,但在绘制过程中,不管是什么类型的流程图,通常会使用相同符号表示同类型流程。
  如文档、卡片、角色由于流程类型存在差异,其使用的符号也会大不相同。下图给大家分享一些常用流程图符号供以参考。

常用流程图符号

  基本流程图符号
  虽然流程图符号如此之多,但在实际制图时能够频繁使用到的符号却并不多。用得较多且较为基础的有五种:起止框、处理框、判断框、输出输入框和流程线。

基本流程图符号

四、流程图结构

  流程图通常由三种结构组成:顺序结构、选择结构、循环结构。
  顺序结构:这是流程图三种结构中最简单的一种,只需按照流程内箭头方向依次执行内容即可。
  选择结构:选择结构也称之为判断结构,根据给定的条件进行判断,并以该判断结果来控制运行的流程。
  循环结构:循环结构就是在一定的条件下重复执行某一操作,用于判断程序继续执行某一操作或退出循环。分为直到型和当型两种循环结构。

流程图结构

五、流程图注意事项

  1. 为了使流程图直观且有逻辑,一般会遵循从上到下、从左到右的顺序排列。
  2. 一份完整的流程图会涵盖开始框和结束框,且一般情况下开始框和结束框分别只出现一次。
  3. 流程图可以出现包含和并列关系,但不能交叉,除非给予适当的判断。
  4. 对于判断框需要有两个或两个以上的执行条件,且每一条件要有相应的注释和执行结果。

六、流程图绘制

  流程图分为在线和软件两种绘制方式。在绘制流程图时有一个清晰的思路非常重要,鉴于不少小伙伴刚接触流程图时可能会分不清主次的情况,所以可以从运用模板开始学习。合理的使用模板可以加快学习绘制速度,便于寻找他人的绘制优点,并将其化为己用。

流程图绘制

在近十年的发展,显示设备的接口发生了巨大的改变。以前使用比较多的是蓝色VGA接口,接著出现了白色的DVI接口,当遇到不同接口时,还得买转接头进行转接。后来,又有了HDMI等接口,现在则出现DP和USB Type-C接口。那么,这么多接口,到底有什么区别,又应该用哪个呢?

VGA

VGA接口也称为D-Sub接口。在CRT显示器时代,VGA接口是必备的。因为CRT是模拟设备,而VGA采用的也是模拟协议,所以它们理所当然被匹配来使用。VGA接口采用15针插针式结构,里面传输分量、同步等信号,是很多老显卡、笔记本和投影仪所使用的接口。后来液晶显示器出现,也带有VGA接口。显示器内置了A/D转换器,将模拟信号转换为数字信号在液晶显示器上显示。

由于线材与信号干扰等一系列问题,VGA使用时一般仅能够达到1080p分辨率,在高分辨率下字体容易虚,信号线长的话,图像有拖尾现象。在数字设备高度发展的今天,VGA接口已逐渐退出舞台,一些显示器也不再带有VGA接口。

DVI

DVI的种类非常多,接口上有DVI-A、DVI-D、DVI-I,又可分为单通道与双通道。DVI-A(DVI-Analog)接口只传输模拟信号,实质就是VGA模拟传输接口规格,常用于转接显卡的DVI-I输出到VGA显示器接口。DVI-D(DVI-Digital)接口是纯数字接口,不兼容模拟信号。DVI-I(DVI-Integrated)接口,兼容DVI-I和DVI-D两种插头,兼容数字和模拟信号。它们的接口形状不同,如果接口不匹配就无法插入使用。

 以下是它们支持的最大分辨率与频率:

 现在有些支持4K分辨率的显示器,也带有DVI接口。为了达到4K的分辨率,在接口使用上就需要注意,不要使用DVI接口,否则是达不到4K分辨率的。

HDMI

HDMI接口在2002年提出,现在已经发展到HDMI 2.1标准,而且随着行业发展,HDMI 2.1标准已经能够支持4K 120Hz及8K 60Hz,支持高动态范围成像(HDR),可以针对场景或帧数进行优化,向后兼容HDMI 2.0、HDMI 1.4。最主要的是,它是视音频同时传输的。

如今很多的显示器内置音箱,使用一根HDMI线,就可以同时完成图像和声音的传输,这也是HDMI的一大优势。也因为如此,HDMI成为了当今显示器最常见的接口。我们在使用时,也应该优选这个接口。

HDMI在物理接口上,有几种类型。主要有标准HDMI接口,mini HDMI接口和Micro HDMI接口。对于长距离传输的HDMI线,一般线材较硬,这样,就尽量使用带有标准的HDMI接口的设备,以得到稳固的连接。Mini HDMI接口和Micro HDMI接口则更适合于小设备的使用。

DisplayPort

DP(Display Port)接口是HDMI接口的竞争对手。在一些显卡与显示器上,除了有HDMI接口,也带有DP接口。目前DP接口发展到1.4版本,能传输10bit的4K 120Hz视频,也可以支持8K 60Hz视频。DP1.4兼容USB Type-C接口,这就意味着,我们可以使用DP1.4协议,在USB 3.1传输数据的同时,同步传输高清视频。从趋势来看,这对于推动周边影音及影像设备的升级,是非常有好处的。而且,DP接口也可以单根线同步传输声音,达到使用显示器声音的使用方式。

DP口定义了两种接头,全尺寸(Full Size)和迷你DP(Mini),两种接头皆是20针,但迷你接头的宽度大约是全尺寸的一半。明基PD2500Q、PD2700U等显示器均带有Mini DP接口。在DP接口旁,都有一个“D”型的标志。

有些高端的显示器,会带有DP的输出口。这是一个非常好的功能。这样就能以菊花链的形式,完成显示器扩展级联。菊花链是最基本的拓扑结构,一般需要多屏扩展时,多是从显卡的多个端口输出到显示器,这不仅连线不便,而且对于不同的接口和分辨率,也不一定能满足一致。而使用支持菊花链技术的显示器,就能从一个显示器直接连接到另一个,满足多个级联。

(注在电子电气工程中菊花链代表一种配线方案,例如设备A和设备B用电缆相连,设备B再用电缆和设备C相连,设备C用电缆和设备D相连,在这种连接方法中不会形成网状的拓扑结构,只有相邻的设备之间才能直接通信,例如在上例中设备A是不能和设备C直接通信的,它们必须通过设备B来中转,这种方法同样不会形成环路。因为最后一个设备不会连向第一个设备。这种连线方法能够用来传输电力,数字信号和模拟信号)

Type-C

USB接口早已被大家所熟知,以往USB接口被设计用来传输数据,所以它在移动硬盘等存储设备的使用上非常常见。现在USB 3.1 Gen2的速度已经达到10Gbps,设计标准也可以满足视频、数据兼顾传输,所以在一些显示器上,也能够发现USB 3.1接口。现在的USB3.1接口,已经能够满足4K 30P的分辨率显示,大致与HDMI1.4在同一水平。但它以后再进行升级,必将能成为最通用的显示传输方式。需要注意的是,USB 3.1 Gen1就是USB 3.0,而USB 3.1 Gen2才是真正的USB3.1。

USB3.1是传输协议,而USB接口形状有好多种,拿USB 3.1的接口来说,有Type-A、Type-B以及Type-C。Type-C的形状最小,也被宣传的最多。我们所说的Type-C接口,仅仅是接口形状,它并不对等于USB3.1。Type-C接口,也被用在了雷电3上。

Type-C接口的好处在于可以正反插拔,部分Type-C接口也同样具有数据、电力、信号传输的功能,被应用到显示器上时可以带来很多方便。Type-C笔记本用户可以透过一个接口完成充电和连接显示器,还能使用显示器上拓展出来的USB接口,极大地减少了笔记本的负担。

雷电

雷电(thunderbolt)接口有Intel提出来,在苹果电脑上用的非常多,苹果的中文官网将其译为雷雳。它以速度快,传输稳定而著称。雷电接口的技术融合了PCI Express和DisplayPort(就是上面说的DP口)两种通信协议。其中PCI Express用于数据传输,可以非常方便地进行任何类型设备扩展;DisplayPort用于显示,能同步传输1080p乃至4K视频和最多八声道音频。并且两条通道在传输时都有自己单独的通道,不会产生任何干扰。

雷电接口到现在已经发展到三代。雷电1的速度达到10Gbps,雷电2的速度达到20Gbps,现在的雷电3达到40Gbps,依然处于民用传输速度的顶端。容易让人混淆的是,雷电接口的形状在雷电1和雷电2外形上采用的是Mini DP的外形,而雷电3采用的是USB Type-C的外形,但即使外形不同,它们采用的数据传输方式都是雷电协议。不像其它接口能直观地从形状就能分辨出来,使用雷电接口需要认准接口旁的闪电标志,以作区分。

雷电口也支持菊花链连接。而且,我们也可以在显示器下级连上雷电口的硬盘,作为扩展使用。这也是雷电口菊花链的优势所在。

总结来看,雷电接口是集信号、数据、电力传输为一身的集成性接口,可以极大地提高使用效率,目前这个接口多应用于苹果相关设备上。

这些常用的接口在各类显示器上都可以看见,对于我们日常使用的显示器,如今HDMI占有绝对的主导位置。它成熟稳定,也能够满足日常的需要,但是应用于显示器硬件校色时,并不推荐使用HDMI接口,它的RGB范围会有缺失,校色时选择DP接口是更好的选择。其余接口的实用性也很高,一些相对“高冷”的接口目前也在不断普及。因此,根据需要进行选择,才是最根本的解决方式。

一、先与电脑连接好两个显示器

显示器插口
  1. 电脑必须要有两个显示器插口,如HDMIDVIVGA都可以,其他参考【科普】显示器VGA、DVI、HDMI、DP等各种接口详细科普

  2. 使用相应线材连接显示器,可以一个连接DVI一个连接VGA,或是HDMI。使用什么线,取决于你的显示器支持什么接口。

  3. 连接完成,开机一般两个显示器可以正常显示。

注意事项:使用两个信号线分别将两个显示器连接到显卡上两个视频输出接口。电脑显卡必须支持双输出,有两个用于连接不同显示器的视频接口。

二、Linux(Gnome)连接两个显示器设置方法

Archlinux Gnome 双屏设置
  1. 打开设置显示器

  2. 选择加入镜像等设置. 其中加入是指两个屏显示不同内容,而镜像是副屏与主屏完全一样,适合教学演示之用。

三、WIN7连接两个显示器设置方法

  1. 在桌面空白处右击鼠标选择“屏幕分辨率”选项; 进入分辨率设置对话框。

  2. 如果电脑主机显卡连接有两台显示器的,就会有显示。单击“检测”进行检测。然后点击多显示器后面的按钮框,就可以看到“复制这些显示”和“扩展这些显示”两个选项。

  3. 选择的“复制这些显示”,那么在两个显示器上你会看到一模一样的Windows 窗口。适合教学演示、为多人展示相同内容的场所,也适合会场和户外等商业展示。

四、WIN10连接两个显示器设置方法

  1. Windows 10桌面上单击右键,选择“显示设置”。或通过快捷键Win + I打开设置,然后导航至“系统”>“显示”。

  2. 检测并配置显示器:系统将自动检测到两个显示器。在“显示”页面,你可以看到显示器的代表图标,点击“标识”按钮帮助区分哪个是显示器1,哪个是2。随后,选择“多显示器设置”,设定为“扩展这些显示器”,以实现不同内容的显示。

  3. 自定义布局:通过拖动显示器图标,你可以根据实际摆放位置调整虚拟布局,确保操作顺畅。

  4. 调整分辨率与方向:进一步个性化每个显示器的显示设置,包括分辨率和方向调整,确保最佳视觉效果。

  5. 保存设置:调整完毕后,设置会自动保存,无需额外确认,你可以立即体验双屏带来的便捷

今天终于使用上了双屏显示器,其中主屏使用的是三星S27D590, 副屏是DELL的一个22寸的屏幕。其中,主屏通过VGA接口直接与主机连接,同时副屏通过HDMI接口也直接与主机相连,顺利使用上了双显示器。测试通过三星S27D590上的HDMI转接到副屏上没有成功,这留待以后再研究。连接两块屏幕后,一个最显著的地方是它们的亮度不同,于是需要调整屏幕的亮度,而这个三星S27D590只有一个按键,一时有点让人琢磨不透。经过一翻百度,获得答案,原来三星显示器的按键是一个叫做五维式按键的东西,百度问答给出了答案:

根据三星显示器的不同型号,调整屏幕亮度的方法,请参考以下方式:

  1. 普通按(或触摸)键:按(或触摸)机身的【MENU】键,依次选择【图像】-【亮度】 , 根据个人的需求调整亮度数值即可。
  2. 五维式按键:按【电源】键,将摇杆向上拔动,光标移至菜单位置,按【电源】键,依次选择【图像】-【亮度】,进行调整。
  3. 没有菜单选择的显示器,需要在电脑上安装MagicTune(魔调软件),通过此软件进行调整。

参考网址:三星显示器亮度在显示器上怎么调

JASON 语言简介

  • JSON 指的是 JavaScript 对象表示法(JavaScript Object Notation)
  • JSON 是轻量级的文本数据交换格式
  • JSON 独立于语言:JSON 使用 Javascript语法来描述数据对象,但是 JSON 仍然独立于语言和平台。JSON 解析器和 JSON 库支持许多不同的编程语言。 目前非常多的动态(PHP,JSP,.NET)编程语言都支持 JSON
  • JSON 具有自我描述性,更易理解

详细参考:jason数据格式

Shell脚本解析JASON数据

使用jq解析JASON数据

jq 是一个小型跨平台解决方案,用于以更短、更简单、更轻松的方式管理 JSON 数据。安装jq

1
sudo pacman -S jq
  1. jq . 命令美化 json 数据。
1
curl "https://jsonplaceholder.typicode.com/posts" | jq .

输出:

1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
[
{
"userId": 1,
"id": 1,
"title": "delectus aut autem",
"completed": false
},
{
"userId": 1,
"id": 2,
"title": "quis ut nam facilis et officia qui",
"completed": false
},
{
"userId": 1,
"id": 3,
"title": "fugiat veniam minus",
"completed": false
}
... // remaining list of data
]
  1. 从 JSON 获取特定字段的值

我们可以使用 jq.[].field_name 从 JSON 数据数组中获取任何特定字段的值。

1
curl "https://jsonplaceholder.typicode.com/posts" | jq '.[].id'

输出:

1
2
3
4
1
2
3
...
  1. 从 JSON 中获取第一个项目的标题
1
curl "https://jsonplaceholder.typicode.com/posts" | jq '.[0].title'

输出:

1
"delectus aut autem"

使用grep解析JSON

grep 命令也可用于解析 JSON 数据。

示例 JSON 文件:

1
2
3
4
5
6
7
8
9
10
11
12
[
{
"id": 1,
"name": "Andres Gustov",
"email": "andddy7@gmail.com"
},
{
"id": 2,
"name": "Anthony Marklov",
"email": "antman33@gmail.com"
}
]

示例脚本:

1
grep -o '"email": "[^"]*' examplejsonfile.json | grep -o '[^"]*$'

我们使用 -o 选项仅选择与给定模式匹配的行。然后,我们指定模式'"email": "[^"]*',这意味着我们想要键 email 的所有值。之后,我们传递 JSON 文件来查找模式。最后,我们使用另一个 grep -o 命令将结果通过管道输出,以删除除值之外的所有内容。

输出:

1
2
andddy7@gmail.com 
antman33@gmail.com

使用python3解析JSON

我们还可以使用 python 的 json 模块来处理 JSON 操作。

1
curl -s 'https://jsonplaceholder.typicode.com/posts' | \ python3 -c "import sys, json; print(json.load(sys.stdin))"

获取特定字段值

1
2
curl "https://jsonplaceholder.typicode.com/posts" | \ 
python3 -c "import sys, json; data=json.load(sys.stdin); print([d['id'] for d in data])"

输出:

1
2
3
4
1
2
3
...

获取第一个项目的标题

1
2
curl "https://jsonplaceholder.typicode.com/posts" | \ 
python3 -c "import sys, json; print(json.load(sys.stdin)[0]['title'])"

输出:

1
"delectus aut autem"

YAML语言简介

AML 是"YAML Ain't a Markup Language"(YAML 不是一种标记语言)的递归缩写。在开发的这种语言时,YAML 的意思其实是:"Yet Another Markup Language"(仍是一种标记语言)。

YAML 的语法和其他高级语言类似, 并且可以简单表达清单、散列表, 标量等数据形态。 它使用空白符号缩进和大量依赖外观的特色, 特别适合用来表达或编辑数据结构、各种配置文件、倾印调试内容、文件大纲(例如:许多电子邮件标题格式和YAML非常接近)。

YAML常在Linux作为一种配置文件出现,详细使用规则参考:YAML入门教程

Shell中解析YAML

在 Bash 中直接操作 YAML 需要一点创造性,因为 Bash 没有内置支持解析 YAML。然而,你可以使用外部工具,如 yq(一个轻量级且便携的命令行 YAML 处理器),来高效地与 YAML 文件交互。

安装YAML解析器

1
sudo pacman -S yq

假设你有一个名为 config.yaml 的文件,内容如下:

1
2
3
4
5
6
database: 
host: localhost
port: 5432
user:
name: admin
password: secret
  1. 要读取数据库主机,你可以如下使用 yq
1
2
yq e '.database.host' config.yaml
>localhost
  1. 要在 config.yaml 中更新用户的名称,使用带 -i(就地)选项的 yq eval 命令:
1
yq e '.user.name = "newadmin"' -i config.yaml

用以下命令验证更改:

1
2
yq e '.user.name' config.yaml
> newadmin
  1. 要在数据库部分下添加一个新字段 timeout
1
yq e '.database.timeout = 30' -i config.yaml
  1. 要移除用户下的密码:
1
yq e 'del(.user.password)' -i config.yaml

此操作将从配置中删除密码字段。

记住,yq 是一款强大的工具,具有更多功能,包括将 YAML 转换为 JSON、合并文件,甚至更复杂的操作。请参考 yq 文档以进一步探索。

参考文章