BNU-FZH

fengzhenhua@outlook.com

ArchLinux是一款灵活、强大、可定制的Linux发行版,提供丰富的软件包和工具,支持滚动更新和多种桌面环境,拥有庞大的社区支持和方便的包管理器,适合各种用户需求和使用场景。Endeavour 是一个基于ArchLinux的轻量级和用户友好的发行版,预装了桌面环境和预配置的软件包,旨在提供一个无忧的ArchLinux体验。

阅读全文 »

在 shell 脚本中使用$1$2 等表示变量,它们不仅可以表示脚本的参数,也可以表示函数的参数。但是,如果一个函数它自己有参变量,同时又需要引用脚本的参变量,那这个函数就无法识别$1是脚本的还是函数的,这会导致矛盾。为了解决函数参数覆盖脚本参数的问题,一个简单安全的方法是提前保存脚本参数,即

1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
#!/bin/bash
# 调用前保存脚本参数到全局变量
script_args=("$@") # 保存所有参数到数组
process_args() {
# 函数参数
local func_param="$1"
# 访问脚本参数
echo "脚本第一个参数: ${script_args[0]}"
echo "脚本第二个参数: ${script_args[1]}"
echo "函数参数: $func_param"
# 遍历所有脚本参数
for arg in "${script_args[@]}"; do
echo "脚本参数: $arg"
done
}
# 调用函数并传递函数参数
process_args "函数参数值"

此法能确保在函数中正确访问脚本参数,同时保持代码清晰和可维护性。 这里需要注意变量$0$?不会被函数参数覆盖,这里将各变量列表如下:

变量 是否被函数参数覆盖 作用域 说明
$0 全局 始终表示脚本名称
$? 动态更新 始终表示上一个命令的退出状态
$1-$9 函数内局部 在函数内被函数参数覆盖
$# 函数内局部 在函数内表示函数参数个数
$@ 函数内局部 在函数内表示函数参数列表

所以综合考虑,将$0也在脚本开头保存,以便规范使用。于是前面的脚本可以进一步写为:

1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
#!/bin/bash
# 调用前保存脚本参数到全局变量
script_args=("$0" "$@") # 保存所有参数到数组
process_args() {
# 函数参数
local func_param="$1"
# 访问脚本参数
echo "脚本第一个参数: ${script_args[0]}"
echo "脚本第二个参数: ${script_args[1]}"
echo "函数参数: $func_param"
# 遍历所有脚本参数
for arg in "${script_args[@]}"; do
echo "脚本参数: $arg"
done
}
# 调用函数并传递函数参数
process_args "函数参数值"

在编写 shell 脚本时经常使用的函数可以封闭到一个脚本中,然后其他脚本使用 source 命令直接调用即可,这样不仅有利于新脚本的开发,更有利于维护。但是今天在编写新的脚本 chaos.sh 时调用了我之前在diary.sh中调用过的菜单脚本,然而却出现错误。一直提示" stty: 标准输入: 对设备不适当的 ioctl 操作" 。

造成这个问题的原因是:使用 Neovim 内置命令运行脚本时并没有真正在一个终端中运行,而菜单脚本使用tty获取终端的尺寸,此时没有可用的tty, 因此出现报错。

一个更健壮的获取终端尺寸的方法(在非终端环境下,如 Neovim :!sh ./chaos.sh 等也不会报错),是使用tput, 这是一具兼容度最好的方案。具体原因是

  • tput 会尝试从环境变量或terminfo 中获取尺寸
  • 在非终端环境下返回空或错误,可用||提供默认值
  • 不会像stty size 那样报错

一般情况下,使用stty sizetput会获得相同的结果,为了确保与之前脚本的兼容性,修改获取尺寸函数为:

~/.Share_Fun/Share_Fun_Menu.sh
1
2
3
4
5
6
7
8
9
10
11
12
# 列表程序
DY_SET_SIZE(){
if [ -t 0 ]; then
TTY_H=$(stty size|awk '{print $1}')
TTY_W=$(stty size|awk '{print $2}')
else
TTY_H=$(tput lines 2>/dev/null) || TTY_H=37
TTY_W=$(tput cols 2>/dev/null) || TTY_W=147
fi
let TTY_H-=2
}
DY_SET_SIZE

通过[ -t 0 ]来判断运行程序时是否在终端,若在终端仍然使用stty size获取终端尺寸,否则使用tput获取。这样重新定义获取尺寸函数后,问题彻底解决。

Neovim 配置好 LSP 后可以极大的增强功能,其中 Mason 可以方便的管理和配置 LSP, 而 ltex-ls 可以实现离线latex, markdown等的语法检测,所以这是一个重要 LSP. 然而,在近几天使用 Neovim 打开 latex文件时总是报错如下:

1
JDK 24 - Cannot load or parse input stream of '/org/languagetool/rules/en/grammar.xml'

根据 https://github.com/languagetool-org/languagetool/issues/11125 的提示,将ltex-ls替换为ltex-ls-plus可以解决问题,同时后者是前者的增强版本也是一个更好的选择。但是在安装时发现ltex-ls-plus的体积非常大,使用Mason直接安装多次未成功。于是将Maso的默认下载工具调整为aria2, 实现了快速下载,最终成功安装ltex-ls-plus.

安装 aria2

1
sudo pacman -S aria

配置 Mason

设置如下:

~/.config/nvim/lua/lsp/mason.lua
1
2
3
4
5
6
7
require("mason").setup({
... ,
download = {
cmd = "aria2c",
args = { "--continue", "--out=$FILE", "$URL" }
},
})

为方便使用,我的完整文件内容展示如下:

~/.config/nvim/lua/lsp/mason.lua
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
33
34
35
36
37
-- :h mason-default-settings
-- ~/.local/share/nvim/mason
--
local servers = {
lua_ls = require "lsp.lua", -- /lua/lsp/lua.lua
ltex = require "lsp.ltex", -- /lua/lsp/ltex.lua
}

require("mason").setup({
github = {
since 1.0.0
download_url_template = "https://github.com/%s/releases/download/%s/%s",
},
ui = {
icons = {
package_installed = "✓",
package_pending = "➜",
package_uninstalled = "✗"
}
},
download = {
cmd = "aria2c",
args = { "--continue", "--out=$FILE", "$URL" }
},
})

-- 添加安装的插件,使用Mason命令查询插件名称
require("mason-lspconfig").setup {
ensure_installed = {
"lua_ls",
"rust_analyzer",
-- "ltex_plus",
"pyright",
"vimls",
"texlab",
},
}

2025年07月25日星期五, 今天是离开北师大后第一次更新博客,原因是一直没有时间来重新配置系统。在新电脑上启用diary.sh脚本时,需要提前配置好hexo, 因为直接clone博客仓库后,使用hexo shexo g均报错:

报错
1
2
3
4
5
Error: Cannot find module './db.json'
Require stack:
- /home/feng/.DY_SCE/fungzhenhua.github.io/node_modules/mime-db/index.js
- /home/feng/.DY_SCE/fungzhenhua.github.io/node_modules/compressible/index.js
- /home/feng/.DY_SCE/fungzhenhua.github.io/node_modules/compression/index.js

解决方法为:使用yarn对应的命令清理缓存和重装.

1
2
3
yarn cache clean
rm -rf node_modules
yarn install

之后使用hexo g, 重新生成仓库后问题解决。

在 Linux 使用系统自带的 File-Roller 文件归档器解压缩文件时有时会遇到中文文件名解压后乱码的问题,此时我们可以使用命令行工具unar执行unar yourfile.zip实现中文名文件的解压缩,但是对于正在进行图形工作的任务时,切换命令行会降低效率。因此,解决 File-Roller 的中文解压缩乱码问题是一个相当重要的问题。

乱码的原因

  • 编码不一致(主要原因):Windows (GBK)和 Linux (UTF-8)系统下默认的字符编码不同,导致在交叉使用时出现乱码。
  • 软件版本问题:某些软件版本对编码支持不全,也会导致乱码的出现。

旧版本 File-Roller 解决方案

  1. 打开 File-Roller, 选择 “工具” 菜单中的 “配置文件管理器” 。
  2. 在 “编码” 选项卡中,将 “自动检测” 设置为 “否”,并手动添加GB18030, GBK, GB2312等编码。
  3. 保存并关闭配置文件管理器。

新版本 File-Roller 解决方案

在 GNOME 48 环境下,File-Roller(归档管理器)的界面已更新,不再提供旧版的 工具 菜单和 配置文件管理器。但底层仍支持通过配置文件(fr-encodings.json)自定义编码列表。修改配置文件后, File-Roller 会优先使用列表中的编码尝试解压(等同于关闭自动检测)。

  1. 打开终端。
  2. 编辑 File-Roller 的配置文件:
    1
    2
    mkdir ~/.config/file-roller
    nvim ~/.config/file-roller/fr-encodings.json
  3. 将以下内容粘贴到文件中:
    1
    2
    3
    4
    5
    6
    7
    8
    9
    {
    "encodings": [
    "GB18030",
    "GBK",
    "GB2312",
    "UTF-8",
    "CURRENT"
    ]
    }
    • GB18030,BGK,BG2312是手动添加的中文编码。
    • UTF-8, CURRENT是保留的默认编码。
  4. 重启 File-Roller 即可生效。

解压时手动选择编码

  1. 双击打开压缩文件。
  2. 点击右上解的⋮(菜单)使用其他编码打开...
  3. 从列表中选择GB18030,BGKGB2312

办公累了,偶尔也找款游戏玩玩,其中 SuperTuxKart 类似于 Windows 下的泡泡卡丁车。由于 Linux 的开源特性,我们可以直接修改配置文件而解锁所有关卡。方法是:

  • 找到本地配置文件 ~/.config/supertuxkart/config-0.10/players.xml
  • 找到标签 <story-mode>, 然后修改 solved="none"solved="easy"solved="hard".
  • 修改好的文件内容为:
    ~/.config/supertuxkart/config-0.10/players.xml
    1
    2
    3
    4
    5
    6
    7
    8
    9
    10
    11
    12
    13
    14
    15
    16
    17
    18
    19
    20
    21
    22
    23
    24
    25
    26
    27
    28
    29
    30
    31
    <story-mode first-time="false" finished="false" speedrun-finished="false"
    story-ms="1023726" speedrun-ms="1291839">
    <abyss solved="easy" best_while_slower="false"/>
    <candela_city solved="easy" best_while_slower="false"/>
    <cocoa_temple solved="easy" best_while_slower="false"/>
    <cornfield_crossing solved="easy" best_while_slower="false"/>
    <fortmagma solved="easy" best_while_slower="false"/>
    <gp1 solved="easy" best_while_slower="false"/>
    <gp2 solved="easy" best_while_slower="false"/>
    <gp3 solved="easy" best_while_slower="false"/>
    <gp4 solved="easy" best_while_slower="false"/>
    <granparadiso_island solved="easy" best_while_slower="false"/>
    <green_valley solved="easy" best_while_slower="false"/>
    <hacienda solved="easy" best_while_slower="false"/>
    <lighthouse solved="easy" best_while_slower="false"/>
    <mansion solved="easy" best_while_slower="false"/>
    <mines solved="easy" best_while_slower="false"/>
    <minigolf solved="easy" best_while_slower="false"/>
    <olivermath solved="easy" best_while_slower="false"/>
    <sandtrack solved="easy" best_while_slower="false"/>
    <scotland solved="easy" best_while_slower="false"/>
    <snowmountain solved="easy" best_while_slower="false"/>
    <snowpeak solved="easy" best_while_slower="false"/>
    <stk_enterprise solved="easy" best_while_slower="false"/>
    <unlock_bonus_kart1 solved="easy" best_while_slower="false"/>
    <unlock_bonus_kart2 solved="easy" best_while_slower="false"/>
    <unlock_supertux solved="easy" best_while_slower="false"/>
    <volcano_island solved="easy" best_while_slower="false"/>
    <xr591 solved="easy" best_while_slower="false"/>
    <zengarden solved="easy" best_while_slower="false"/>
    </story-mode>

简介

GNOME 近年来正在转向 GTK4 + LibAdwaita。核心应用程序要么移植到新框架,要么被新框架替换。Papers 是一款专门为 GNOME 桌面环境打造的强大「文档查看器」。它支持多种文档格式,能够轻松查看、搜索和批注文档,为用户带来更丰富的使用体验。

目前,Papers 支持的文档格式包括:PDF、PS、EPS、XPS、DjVu、TIFF,以及漫画书档案(CBR、CBT、CBZ 和 CB7 格式)。无论常见文档还是特殊格式,Papers 都能轻松搞定,堪称 GNOME 用户的得力助手。

安装

1
sudo pacman -S papers

参考文章

伴随 Gnome 的升级迭代,一些软件开始变得不再特别适配新的系统,因此本文介绍三款更加现代的播放器:Decibels 音乐播放器,Showtime 视频播放器,Clapper 视频播放器。

Showtime 视频播放器

Showtime 是一款即将在GNOME 49桌面环境中替代Totem视频播放器的新应用。它基于GTK4和libadwaita构建,强调提供沉浸式的观影体验。该播放器采用无边框窗口设计,控制界面默认隐藏,以便用户能够专注于视频内容展示。

特性:

  • 技术栈:使用GStreamer支持多种音视频文件格式。
  • 功能集:调节播放速度、切换字幕与音轨、旋转画面、循环播放等。
  • 限制:当前版本不支持DVD播放。

安装:

1
sudo pacman -S showtime

Clapper 视频播放器

Clapper 是一款专为GNOME桌面环境打造的媒体播放器,采用了最新的GTK4工具包和GStreamer引擎,并且利用OpenGL进行渲染。这款播放器以其简约的设计理念著称,旨在为用户提供一个既现代又易于使用的视频观看体验。

特性:

  • 易用性:直观的用户界面,无需复杂的配置过程。
  • 核心功能:基本但必要的视频播放功能,极简主义设计。
  • 技术细节:包括Clapper库(负责播放逻辑)和ClapperGtk库(确保与GTK4的无缝整合)。
  • 扩展性:支持GObject Introspection绑定,提供了Rust语言的绑定选项。

安装:

1
sudo pacman -S clapper

Decibels 音乐播放器

Decibels 是GNOME 48中引入的核心音频播放器,用于填补GNOME桌面环境中长期缺乏官方音频播放解决方案的空白。该项目从GNOME孵化器项目中晋升为核心应用程序。

特性:

  • 技术栈:使用TypeScript编写,基于GTK4工具包和libadwaita。
  • 简单功能:目前作为一款非常基础的音频播放器运作。
  • 挑战:由于编程语言的选择,可能会面临短期内在一些Linux发行版中的集成障碍。

安装:

1
sudo pacman -S decibels

安装 GStreame 插件

为了进一步增强前述播放器支持的播放格式,安装相应的 GStreame 插件。

1
sudo pacman -S lsp-plugins-gst

参考文章

在学术投稿过程中,即使你的稿件已经分配给了特定的编辑(例如编辑 A),所有的邮件交流通常都是通过期刊提供的统一邮箱进行的。那么,这些发送到统一邮箱的邮件是如何被编辑 A 获取并处理的呢?本文将详细解释这一过程。

期刊统一邮箱的工作机制

统一邮箱作为前端接口

大多数期刊采用一个统一的投稿邮箱作为外部通信的接口。所有与作者、审稿人和编辑之间的交流都通过这个邮箱进行中转,但实际上它只是一个自动化系统的出口/入口,背后有一个完整的投稿管理系统支持(如 Editorial Manager、ScholarOne 等)。

稿件分配给编辑 A

当稿件进入系统后,主编会根据情况指派一位责任编辑(如编辑 A )。该编辑将在投稿系统中查看他/她负责的所有稿件,并能够访问相关的通信记录、审稿意见及作者回复等信息。

后续邮件交流流程

发送邮件至统一邮箱

当你回复了期刊提供的统一邮箱时,系统会自动识别出这封邮件是关于哪篇稿件的(基于邮件主题、稿件编号等信息)。随后,系统会将你的回复同步到投稿系统中,并通知编辑 A 有新的消息需要关注。

编辑 A 处理邮件

编辑 A 登录投稿系统后可以看到你的回复内容,而无需直接通过个人邮箱参与交流。这种方式确保了所有沟通都有记录可查,避免了因编辑更换或离职导致的信息丢失风险。

小贴士

  • 在回复邮件时,请保留邮件标题中的稿件编号(如Manuscript ID: XYZ123),以帮助系统正确识别。
  • 如果担心邮件未被收到,可以通过投稿系统检查是否有新的状态更新(如 Under Review, Required Reviews Completed 等)。