背景

使用AOSC OS的WPS PDF软件,滚轮滚动过快,阅读体验非常差。再WPS中设置滚动速度无效。

软硬件条件

KDE 5,X11

解决步骤

1、先查看鼠标名称:

xinput list --name-only

示例输出内容:

❯ xinput list --name-only                               
Virtual core pointer
Virtual core XTEST pointer
Razer Razer Ouroboros
Razer Razer Ouroboros Keyboard
BY Tech Gaming Keyboard Mouse
BY Tech Gaming Keyboard Consumer Control
Virtual core keyboard
Virtual core XTEST keyboard
Razer Razer Ouroboros
BY Tech Gaming Keyboard
BY Tech Gaming Keyboard
BY Tech Gaming Keyboard System Control
USB PnP Audio Device
Power Button
Power Button
Razer Razer Ouroboros Keyboard
BY Tech Gaming Keyboard Consumer Control

我的鼠标名称为Razer Razer Ouroboros。下面以此为例叙述。
2、执行xinput list,找到类似↳ Razer Razer Ouroboros id=12 [slave pointer (2)]
3、记下pointer那一行的ID,然后检查当前驱动:

xinput list-props 12 | grep -Ei 'libinput|evdev'

将其中的12替换成你实际的ID。
如果输出主要包含libinput ...,则需要改为evdev。
4、安装驱动。

sudo oma install xf86-input-evdev

注意,请根据你的系统选择合适的包管理器。此外,在aosc os以外的系统上,需要安装的包可能叫xserver-xorg-input-evdev,请结合AI辅助。
5、创建针对该鼠标的evdev设置。

sudo mkdir -p /etc/X11/xorg.conf.d
sudo nano /etc/X11/xorg.conf.d/30-razer-ouroboros-evdev.conf

写入:

Section "InputClass"
    Identifier "Razer Ouroboros evdev"
    MatchProduct "Razer Razer Ouroboros"
    MatchIsPointer "on"
    MatchDevicePath "/dev/input/event*"
    Driver "evdev"
EndSection

6、注销或重启系统。
7、再次执行xinput list-props ID | grep -Ei 'libinput|evdev',如果出现evdev,则证明设置成功。
8、在WPS中测试效果

为什么是evedv?

ibinput是现代Linux桌面默认的输入方案,功能更完整,evdev是较传统的X11输入驱动,处理方式更直接,功能较少,但对部分旧软件兼容性更好,因此切换到evdev能改善滚动表现。

背景

loong64架构的安同操作系统中安装微信后,无法使用中文输入法。

解决方法

1、编辑微信的快捷方式。

sudo vim /usr/share/applications/wechat.desktop

2、将正确的环境变量添加进去。
原来:

[Desktop Entry]
Name=wechat
Name[zh_CN]=微信
Exec=/usr/bin/wechat %U
StartupNotify=true
Terminal=false
Icon=/usr/share/icons/hicolor/256x256/apps/wechat.png
Type=Application
Categories=Utility;
Comment=Wechat Desktop
Comment[zh_CN]=微信桌面版

env GTK_IM_MODULE=fcitx QT_IM_MODULE=fcitx XMODIFIERS=@im=fcitx添加到Exec后面,如下所示:

[Desktop Entry]
Name=wechat
Name[zh_CN]=微信
Exec=env GTK_IM_MODULE=fcitx QT_IM_MODULE=fcitx XMODIFIERS=@im=fcitx /usr/bin/wechat %U
StartupNotify=true
Terminal=false
Icon=/usr/share/icons/hicolor/256x256/apps/wechat.png
Type=Application
Categories=Utility;
Comment=Wechat Desktop
Comment[zh_CN]=微信桌面版

3、保存,重启微信,问题解决。

cd /tmp

wget https://github.com/loong64/docker-ce-packaging/raw/refs/heads/main/docker.service
wget https://github.com/loong64/docker-ce-packaging/releases/download/v27.4.1/docker-27.4.1.tgz
wget -O docker-buildx https://github.com/loong64/buildx/releases/download/v0.19.3/buildx-v0.19.3-linux-loongarch64
wget -O docker-compose https://github.com/loong64/compose/releases/download/v2.32.1/docker-compose-linux-loongarch64

mkdir -p /usr/local/libexec/docker/cli-plugins

tar -xf docker-27.4.1.tgz
sudo chown root:root docker/* docker-buildx docker-compose
sudo chmod 755 docker/* docker-buildx docker-compose
sudo mv docker.service /etc/systemd/system
sudo mv docker/* /usr/local/bin/
sudo mv docker-buildx /usr/local/libexec/docker/cli-plugins/
sudo mv docker-compose /usr/local/libexec/docker/cli-plugins/
sudo systemctl enable docker --now
sudo docker version
sudo docker buildx version
sudo docker compose version

删除docker

sudo systemctl stop docker docker.socket

sudo rm -rf /usr/local/libexec/docker/cli-plugins
sudo rm -f /usr/local/bin/docker*
sudo rm -f /usr/local/bin/container*
sudo rm -f /usr/local/bin/ctr
sudo rm -f /usr/local/bin/runc
sudo rm -f /etc/systemd/system/docker.service

背景

开发了一个项目,需要打成pip包。

重要概念

pyproject.toml 就是“告诉 Python:这个项目叫什么、依赖什么、怎么打包、打完后生成什么”的配置文件。

步骤

1、目录结构

myproj/
  mypkg/
    __init__.py

2、准备project.toml

[project]
name = "mypkg"
version = "0.1.0"
description = "My package"
requires-python = ">=3.11"
dependencies = []

[build-system]
requires = ["hatchling"]
build-backend = "hatchling.build"

[tool.hatch.build.targets.wheel]
packages = ["mypkg"]

3、准备构建工具。

python3 -m venv .pkgbuild
./.pkgbuild/bin/python -m ensurepip --upgrade
./.pkgbuild/bin/python -m pip install -U pip build hatchling -i https://pypi.tuna.tsinghua.edu.cn/simple

4、在项目根目录构建包
这里的“项目根目录”就是有 pyproject.toml 的目录

./.pkgbuild/bin/python -m build --no-isolation

最简模板

  1. 纯库包模板
    适合:别人 import mypkg,但没有命令行入口。

假设目录是:

myproj/
  pyproject.toml
  README.md
  mypkg/
    __init__.py

模板:

[project]
name = "mypkg"
version = "0.1.0"
description = "My Python package"
readme = "README.md"
requires-python = ">=3.11"
license = { text = "MIT" }
authors = [
  { name = "your name" }
]
dependencies = []

[build-system]
requires = ["hatchling"]
build-backend = "hatchling.build"

[tool.hatch.build.targets.wheel]
packages = ["mypkg"]
  1. 带 CLI 的包模板
    适合:安装后能直接运行命令,比如mytool。

假设目录是:

myproj/
  pyproject.toml
  README.md
  mypkg/
    __init__.py
    cli.py

如果 cli.py 里有一个可调用入口,例如:

def main():
    print("hello")

那模板可以写成:

[project]
name = "mypkg"
version = "0.1.0"
description = "My command line tool"
readme = "README.md"
requires-python = ">=3.11"
license = { text = "MIT" }
authors = [
  { name = "your name" }
]
dependencies = []

[project.scripts]
mypkg = "mypkg.cli:main"

[build-system]
requires = ["hatchling"]
build-backend = "hatchling.build"

[tool.hatch.build.targets.wheel]
packages = ["mypkg"]

这里最关键的是这句:

[project.scripts]
mypkg = "mypkg.cli:main"

意思是安装后可以直接运行 mypkg 命令,它会调用 mypkg/cli.py 里的 main()。

  1. 带资源文件的包模板
    适合:除了 Python 代码,还要把脚本、配置、jar、模板等文件一起打进包里。这个最接近你现在的。

假设目录是:

myproj/
  pyproject.toml
  README.md
  bridge/
    package.json
  softwares/
    tool.jar
  mypkg/
    __init__.py
    cli.py
    resources/
      config.json
    skills/
      demo/
        SKILL.md
        scripts/
          run.sh
          helper.py

模板:

[project]
name = "mypkg"
version = "0.1.0"
description = "My package with bundled resources"
readme = "README.md"
requires-python = ">=3.11"
license = { text = "MIT" }
authors = [
  { name = "your name" }
]
dependencies = []

[project.scripts]
mypkg = "mypkg.cli:main"

[build-system]
requires = ["hatchling"]
build-backend = "hatchling.build"

[tool.hatch.build.targets.wheel]
packages = ["mypkg"]

[tool.hatch.build]
include = [
  "mypkg/**/*.py",
  "mypkg/**/*.md",
  "mypkg/**/*.sh",
  "mypkg/**/*.json",
]

[tool.hatch.build.targets.sdist]
include = [
  "mypkg/",
  "bridge/",
  "README.md",
]

artifacts = [
  "softwares/**",
]

[tool.hatch.build.targets.wheel.force-include]
"bridge" = "mypkg/bridge"
"softwares" = "mypkg/softwares"

这里最值得你记住的是:

include:选进正常资源
sdist.include:源码包里带什么
artifacts:专门处理像 softwares/ 这种可能被 .gitignore 忽略、但仍然要打包的内容
force-include:把包目录外的目录塞进最终 wheel