尝鲜可能比 sunpinyin 好一点的新拼音输入法

大概很多人还不知道,在老K同学偷偷默默开发了很久后,新一代的 fcitx5 已经“能用”了。不过因为还处在早期开发阶段,现在只有拼音输入法能用,而且输入界面极挫,没有配置界面和任何命令行帮助信息等。

先来一段 demo:

下面简单介绍一下 Arch 里的安装及配置方法:

首先从 AUR 中安装相关的软件包:

yaourt -S fcitx5-git fcitx5-qt-git fcitx5-gtk-git fcitx5-chinese-addons-git

依赖中其他的相关包会被 yaourt 自动安装。如果你更喜欢手动安装,可以参考下面的顺序:

xcb-imdkit-git -> fcitx5-git -> libime-git -> fcitx5-chinese-addons-git -> fcitx5-gtk-git -> fcitx5-qt-git

注意原来的 fcitx 和这系列软件包冲突,可能会被提示卸载。

Continue reading 尝鲜可能比 sunpinyin 好一点的新拼音输入法

Arch Linux devtools 简介 – 在干净的环境里编译软件包

devtools 是 Arch Linux 开发者们用来往官方仓库里推进软件包使用的一系列工具。由于里面有许多工具可能不是我们常用的,这里主要介绍里面的一部分——用于在干净的环境中编译软件包的命令。

为什么要在干净的环境里编译软件包?这里有几个常见的理由:

  • 避免忘记写依赖 – 当前环境中已安装的软件包可能在普通的 makepkg 过程中被忽略,最后在 depends 或者 makedepends 等列表中缺失。
  • 避免编译过程污染环境 – 因为一些你可能没有想到的原因,编译过程中可能会对你当前的系统产生污染,比如跑 npm install 的时候可能会把缓存塞到 $HOME。
  • 避免因环境不干净导致的奇怪编译错误 – 你的环境中可能有各种不干净的情况,比如 profile.d 里覆盖了 gcc 等常见命令、/usr/local/bin 里有覆盖常用命令、用非系统包管理器安装(覆盖)了一些东西等。
  • 或者你只是不想把这个软件包编译时需要的一堆乱七八糟的依赖都装在自己机器上。

如果你有这样的需求,可以考虑使用 devtools。安装过程很简单

pacman -S devtools
Continue reading Arch Linux devtools 简介 – 在干净的环境里编译软件包

给 Arch 打一个包 – Python 模块篇

这是一篇简化的教程,如果你有一个喜爱的 Python 模块不在 Arch 仓库里,AUR 里也没有,可以尝试读下去。

准备

对 Python 模块来说,一般仅仅一个 PKGBUILD 文件就足以完成所有的事情。现在你可以打开你最喜欢的文本编辑器,把下面这一个简单的 PKGBUILD 模板复制进去:

# $Id$
# Maintainer: Felix Yan <felixonmars@archlinux.org>

pkgbase=python-whatever
pkgname=('python-whatever' 'python2-whatever')
pkgver=0.4.3
pkgrel=1
pkgdesc='Easy way to make anonymous functions by partial application of operators'
arch=('any')
license=('BSD')
url='https://github.com/Suor/whatever'
makedepends=('python-setuptools' 'python2-setuptools')
checkdepends=('python-pytest-runner' 'python2-pytest-runner')
source=("$pkgbase-$pkgver.tar.gz::https://github.com/Suor/whatever/archive/$pkgver.tar.gz")
sha512sums=('162d66753ef4fb15279150b7fa953b4ecf086e2b36cc77531dac099ff4a25b3458af627bdf52e168b7b4b2163a1445f35c2c656b1c10c0c73502d2357ba42dd8')

prepare() {
  cp -a whatever-$pkgver{,-py2}
}

build() {
  cd "$srcdir"/whatever-$pkgver
  python setup.py build

  cd "$srcdir"/whatever-$pkgver-py2
  python2 setup.py build
}

check() {
  cd "$srcdir"/whatever-$pkgver
  python setup.py pytest

  cd "$srcdir"/whatever-$pkgver-py2
  python2 setup.py pytest
}

package_python-whatever() {
  depends=('python')

  cd whatever-$pkgver
  python setup.py install --root="$pkgdir" --optimize=1
  install -D -m644 LICENSE "$pkgdir"/usr/share/licenses/$pkgname/LICENSE
}

package_python2-whatever() {
  depends=('python2')

  cd whatever-$pkgver-py2
  python2 setup.py install --root="$pkgdir" --optimize=1
  install -D -m644 LICENSE "$pkgdir"/usr/share/licenses/$pkgname/LICENSE
}

# vim:set ts=2 sw=2 et:

因为距离 Python 2 的废弃时间(2020年)还早,Arch 仓库中的 Python 模块包通常同时提供 Python 2/3 模块。上面例子里的 Python 软件包名叫 whatever,这也同样是它在 PyPI 中的名字。如果原来的包名中包含大写字母,在制作软件包时需要改成小写。

Continue reading 给 Arch 打一个包 – Python 模块篇

记一次磁盘数据损坏的修复过程

昨晚我大概没有把硬盘插紧,零点(一堆计划任务执行时)在 dmesg 里看到了大量 ext4/SATA 错误。今天开机时 BIOS 直接提示没有可引导的设备。下面记录了我所有的测试和恢复步骤:

  • 用备份盘开机,首先发现 /dev/sda 存在,但没有任何 /dev/sda*。判断是分区表损坏。
  • 执行 testdisk 快速扫描找回分区表,因为盘里只有一个分区,这一步很顺利。继续操作写回分区表。
  • 此时 /dev/sda1 已经出现,尝试 mount,失败。提示 ext4 没有 journal。
  • 执行 fsck.ext4 /dev/sda1,期间提示包括 root node 不是 directory 等一系列错误,一路 y 下去重建了 root node,并把一堆目录丢到了 /lost+found。
  • 重新 mount,成功挂载到 /mnt。
  • 进去查看,发现只有一个 ./lost+found。果然 / 目录里的信息丢失了。
  • 进入 ./lost+found,里面有二十来个目录。一个个进去查看。
  • 根据目录内容,将 home、var、usr、etc、srv、opt、root、boot 猜出来,并移动回对应的 /mnt/*。剩下的多是空目录,放弃。
  • 尝试 arch-chroot,失败,想起来还需要重建 / 里的一些 symlink 和空目录。
  • mkdir dev media mnt net proc run sys,然后创建 {s,}bin -> usr/bin,lib{,64} -> usr/lib 的 symlink。
  • 再次 arch-chroot,成功。
  • 执行 pacman -S filesystem 以防万一。
  • 运行 grub-install 恢复引导。
  • 运行 pacman -Qkq 比对文件,发现只有 visual-studio-code 包内容有丢失,暂时不管。
  • 重启,成功进入系统,重新安装 visual-studio-code。

至此,虚惊一场的数据丢失已经完全恢复,总共历时 1 个小时(前面大量的时间花在了让备份盘能启动起来,上一次备份出现了一点差错……)。

最后赞美一下坚强的 ext4!

Pacman Hooks 简介

Pacman 5.0 带来了 Hooks 支持,但在大规模应用前,我们留出了一个多月的时间来让用户先升级到 Pacman 5.0(因为同时升级 pacman 和有定义 hooks 的包会导致无法正常执行这些 hooks)。现在距离 Hooks 正式投入使用已经过去了一个月,我觉得是时候介绍一下 Hooks 和如何使用它了。

先来看一个简单的 Hook:

[Trigger]
Type = File
Operation = Install
Operation = Upgrade
Target = usr/lib/tmpfiles.d/*.conf

[Action]
Description = Creating temporary files...
When = PostTransaction
Exec = /bin/sh -c 'while read -r f; do /usr/bin/systemd-tmpfiles --create "/$f"; done'
NeedsTargets

这个 Hook 的作用是:当检测到安装或更新的包文件中存在 usr/lib/tmpfiles.d/*.conf 时,在更新后对每个文件调用 systemd-tmpfiles --create 方法。前面的检测部分定义在 [Trigger] 部分,后面执行的操作定义在 [Action] 部分。下面我们分别了解一下这两部分。

一、[Trigger] 部分

首先需要了解的是可以用于触发的条件类别(Type)。上面的例子里使用了文件(File),即当操作中的包中存在对应文件时触发。另一个可选的 Type 是软件包名(Package),即直接匹配操作中的包名。

接下来,操作(Operation)选项限制了对软件包的操作类别。可以选择的操作有安装(Install)、更新(Upgrade)和删除(Remove)。一个 Hook 需要在多种操作执行时,如例子中那样写成多行即可。常用的组合有三种全部写上(更新缓存、数据库等)、写 Install+Upgrade(执行安装时的一次性操作)及与之对应的 Upgrade+Remove(卸载时的一次性操作)。

最后,我们需要定义具体的目标(Target)。如果目标是文件,这里需要写其相对根目录的完整路径,但需要去掉开头的 / 字符。通配符(*、?)可以使用,具体匹配时会使用 fnmatch 方法。同样的,在一个 Hook 中可以定义多个目标,类似例子中的 Operation 那样写成多行即可。

Continue reading Pacman Hooks 简介

让 Pipelight 用中文 Locale 运行 – 解决非中文 Locale 下 Pipelight 插件中文显示为方框问题的简单方法

如果你和我一样, 系统语言喜欢用英语等非中文语言, 但是又需要 pipelight 的插件能正常显示中文(比如 flash player + AB 站之类的), 那么这个简单的方法可以让你两者兼得!

先上效果图:
snapshot70

方法其实很简单, 只是因为 pipelight 还在开发中, 所以没看到相关的介绍哈. 以下方法是 pipelight 开发者在 irc 中告诉我的, 特此感谢~!
(如果你的 pipelight 安装的地方和我不一样, 别忘记相应修改路径哈)

1. 创建文件 /usr/local/bin/wine-pipelight-zh_cn-wrapper:

#!/bin/sh
LANG=zh_CN.utf8 /opt/wine-compholio/bin/wine "$@"

给它加上执行权限.

2. 复制 pipelight 配置文件以便编辑: (以 flash 为例)

$ cp /usr/share/pipelight/configs/pipelight-flash ~/.config/

3. 编辑 pipelight 配置文件:
找到

winePath            = /opt/wine-compholio/bin/wine

修改为:

winePath            = /usr/local/bin/wine-pipelight-zh_cn-wrapper

完成! 启动浏览器享受流畅科学的 flash 吧! (不对, flash 怎么可能科学!)

更新: 升级了 flash 再上张图, 嗯我才不是故意宣传老 K 的视频呢~
snapshot71

搜狗拼音 for Linux 新版发布

官网地址:
http://pinyin.sogou.com/linux/

本猫折腾了一下, 做了一个 PKGBUILD, Hack 了一下 curl 版本的问题, 目前自己测试可以用哈~
snapshot66

坑爹之处在于, 这次放出的版本必须用内置的 qimpanel 界面! 也就是说, 经典 UI 和 kimpanel (包括 gnome-shell 那个 kimpanel 插件之类的) 都不能用, 否则你会看到一条超坑的提示:

“请启用fcitx-qimpanel面板程序,以便更好的享受搜狗输入法!”

做好的包和完整的 src 包下载: http://pkgbuild.com/~fyan/staging/fcitx-sogoupinyin/

PKGBUILD: (偷懒的猫只做了 x86_64 的)

# Maintainer: Jove Yu <yushijun110[at]gmail.com>
# Contributor: csslayer <wengxt[at]gmail.com>

pkgname=fcitx-sogoupinyin
pkgver=1.0.0.0011
pkgrel=1
pkgdesc="Sogou Pinyin for Linux"
arch=('x86_64')
url="http://code.google.com/p/fcitx"
license=('custom')
depends=('fcitx')
source=("http://ime.sogou.com/dl/1397738329/sogou_pinyin_linux_${pkgver}_amd64.deb"
        fcitx-qimpanel
        libcurl.so.4)

if [ "${CARCH}" = "i686" ]; then
    _LIB_DIR=i386-linux-gnu
else
    _LIB_DIR=x86_64-linux-gnu
fi

package(){
  bsdtar -xf data.tar.xz -C "${pkgdir}"

  mv "$pkgdir"/usr/lib/{$_LIB_DIR/,}fcitx
  rmdir "$pkgdir/usr/lib/${_LIB_DIR}"
  
  # Workaround curl problem - install an old version and use LD_LIBRARY_PATH to use it
  mv "$pkgdir"/usr/bin/fcitx-qimpanel{,.real}
  install -Dm755 fcitx-qimpanel "$pkgdir/usr/bin/"
  install -Dm644 libcurl.so.4 "$pkgdir/usr/share/fcitx-sogoupinyin/"

  rm -r "$pkgdir"/etc/apt
  rm -r "$pkgdir"/usr/share/{keyrings,upstart}
}

sha512sums=('9ac4d67aa2dea979d39cd5d13965c5ca103a6f52b4e7db53d1d9402efec0641aaf30ebc64d99a690692d45d4b6ebb742da56cb0d175eb36d194b1d45ed11e53f'
            '4d49b346cd1fb1279865b1c6df774ad393816f709c91c80702adce6926d32a45641d26943597d152a5c7b57dd4c2e23799e005cc1d959645025218a5ce5bfd41'
            '8b64e7489443d59a6ceebc7cf66697c16826502f0bb4f64c5c1a475ffc45cf000794339d95acdada849e85bc99183112a6887525aa00a13c1234d0dc7fa676dc')

其中那个 libcurl.so.4 是从一个很老版本的 curl 包里提出来的.

workaround curl 用的那个启动脚本:
/usr/bin/fcitx-qimpanel

#!/bin/sh
LD_LIBRARY_PATH="/usr/share/fcitx-sogoupinyin:$LD_LIBRARY_PATH" /usr/bin/fcitx-qimpanel.real "$@"

使用方法:
重载 fcitx, 开启 qimpanel:

fcitx -r --enable fcitx-qimpanel

然后启动 fcitx-qimpanel:

fcitx-qimpanel

然后切换到搜狗拼音输入法, 可以开始玩了!

尝鲜: 新的网络连接管理工具 systemd-networkd

在吃掉 udev 和谋划收编 dbus 后, systemd 又将它的魔爪伸向了网络管理方面. 虽然这已经是 systemd 209 时候的旧闻, 不过因为整个功能太过不完善 (被吐槽有超多 bug, 以及各种基本功能缺失) 以及没有文档, 上游一直没有大力推广.

本文仅就最为简单普通的有线网络连接介绍 systemd-networkd 的打开方式. (wifi 呀, ppp 呀, vpn 呀之类的复杂配置现在都不支持哦) (大部分信息翻译自 ArchWiki)

先介绍一些基本的信息:

配置文件存放在 /usr/lib/systemd/network (上游提供的配置), /run/systemd/network (运行时配置), 以及 /etc/systemd/network (本地配置). 其中 /etc/systemd/network 有着最高的优先级.

有三类配置文件:

  1. .network 文件: 给匹配到的设备应用一个网络配置
  2. .netdev 文件: 给匹配到的环境创建一个虚拟的网络设备
  3. .link 文件: 当一个网络设备出现时, udev 会寻找第一个匹配到的 .link 文件.

他们都遵循一些相同的规则:

  • 如果 [Match] 部分满足了条件, 在接下来的段落中的配置会被应用
  • [Match] 部分可以接受不止一项条目. 在这种情况下, 只有当每一个条目都被满足时, 这个配置才会被启用
  • 空白的 [Match] 部分表示这个配置在任何情况下都会被应用
  • 每一项条目都是 KEY=VALUE 格式的键值对
  • 所有的配置文件会被收集并按字典序排序后再处理, 无论它们在哪个目录
  • 相同名字的配置文件会相互替代
Continue reading 尝鲜: 新的网络连接管理工具 systemd-networkd

添加 Linux 原生游戏到 Wine Steam 里并记录游戏状态 / 让 Wine Steam 里的不同游戏用不同的语言(环境变量)运行

首先解释下这个奇怪的需求哈:

1. 添加 Linux 原生游戏到 Wine Steam 里并记录游戏状态: 可以让 Steam 好友知道自己在玩什么, 而同时又可以避免用 Wine 跑相应游戏带来的性能损失. 如果直接用 Wine 自带的 start.exe 启动 Linux 游戏, 因为 start.exe 会在启动游戏后直接退出 (/wait 参数对 Linux 进程无效), 因此游戏时 Steam 状态会显示为不在游戏中, 这样我们的目的就达不到了…

2. 让 Wine Steam 里的不同游戏用不同的语言(环境变量)运行: Wine 对 CJK 字符编码的修正是和语言(Locale)环境变量有关的, 比如 Touhou 用 ja_JP 环境跑表现一切正常, 而在 zh_CN 或者 en_US 下标题栏均是不同程度的乱码 (其它程序有更严重的问题, 包括全部字符变成问号等). 但是用 Steam 运行游戏时, 所有子进程都直接继承了运行 Steam 时的环境变量, 没有办法修改.

至于为啥不在 Linux 原生版的 Steam 里用? 嗯, 因为想要反向实现需求, 也就是让 Linux 原生版的 Steam 能跑 Wine 的 Steam only 游戏, 这件事情的难度好像不是一般的大… (DRM 什么的, 而且 Steam 是单点登录的)

看起来好像是无关的两个问题哈 <(=^_^=)> 不过呢, 本猫用了相关的方法来解决, 因此放在同一篇博客里介绍啦.

警告: 本方法各种丑陋, 要是产生不适千万不要怪我(

咳咳, 回到正题. 我的思路是使用一个文件锁:

1. Wine 启动一个 wrapper (也就是 Steam 命令行里填写相应的路径)
2. wrapper 首先创建一个临时文件, 然后把文件名传给一个 wine 外运行的脚本
3. 这个时候 wrapper 已经丢失了自己刚刚启动的脚本的运行状态, 但是可以继续通过检测文件是否存在来知道脚本是否已经退出
4. 脚本启动目标程序
5. 脚本等到程序退出再删除临时文件
6. wrapper 检测到临时文件消失后, 退出

Continue reading 添加 Linux 原生游戏到 Wine Steam 里并记录游戏状态 / 让 Wine Steam 里的不同游戏用不同的语言(环境变量)运行

开源图形驱动也可以流畅 Wine “原生的” DX9!

想在 Linux 里 Wine 点什么 Direct X 游戏? 买 A 卡啦? Intel 集显啦? 用 nouveau 开源驱动啦? 哈哈哈哈哈哈哈哈(大雾

其实我们改改 Gallium3D (Mesa) 再改改 Wine 的话, Direct X 9 还是可以跑得刷刷的快的哦~! (虽然这个其实不是新闻了)

首先解释一下原理, Gallium3D 拥有一种被称为 “State Tracker” 的机制, 下面的介绍翻译自维基百科:

Gallium3D 提供了一个统一的 API, 将标准的硬件功能暴露出来, 比如现代硬件中的着色器单元. 因此, 如 OpenGL 1.x/2.x, OpenGL 3.x, OpenVG, GPGPU 平台, 或者甚至 Direct3D (存在于 Wine 兼容层中) 都将只需要一个后端 – 被称为 state tracker, 来描述 Gallium3D 的 API 调用.

至于写本文的目的呢, 除了给大家介绍这样一个好玩的功能以外, 主要是非常希望有人能参与这个项目的继续开发 (现在这个项目又快被抛弃了(没准已经被抛弃了)).

(猫比较懒, 没有制作打好 patch 并改名的 PKGBUILD, 因此…嗯)

1. 首先我们需要的 patch 们在这里: http://download.ixit.cz/d3d9/mesa-10.0-d3d-0b75a4b.patch (mesa) 和这里: http://ix.io/b0y (wine)
注意经本猫测试, mesa 10.1.0 目测和这个 patch 不能直接兼容, 所以我们用 10.0.3 的 mesa 来测试~

2. 从 ABS 里下载需要的 PKGBUILD. 如果有安装 yaourt 工具的话, 可以直接跑:

$ yaourt -G mesa lib32-mesa wine

(如果你使用的是 32 位系统, lib32-mesa 可以省去)
(如果遇到奇怪的 404 Not Found 问题, 可以去这里这里下载…)

3. 修改 mesa 的 PKGBUILD.
3.1 首先修改版本为 10.0.3, 理由之前已经解释过了.
3.2 在 source 数组中新增 mesa-10.0-d3d-0b75a4b.patch, 并相应修改 md5sums 数组. (如果你和本猫一样懒, 可以直接把 md5sums 数组的内容写成两个 ‘SKIP’)
3.3 在运行 autoreconf 前, 加入这样的语句:

patch -p1 -i "$srcdir/mesa-10.0-d3d-0b75a4b.patch"

3.4 修改编译选项, 在 “–enable-gallium-llvm \” 后面加入:

--enable-nine \

4. OK! 跑 makepkg 吧~ (如果有提示缺少依赖的话, 装上就好)

5. 依葫芦画瓢, 给 lib32-mesa 以及 wine 加上相应的补丁, 然后编译吧~ (lib32-mesa 和 mesa 需要做相同的修改哟)

6. 安装上编好的包, 重启!

7. 打开注册表编辑器 regedit, 找到 HKCU->Software->Wine->Direct3D (最后一层如果没有, 就右键创建), 然后创建一个名为 UseNative 的 DWORD 值, 值为 1. (想关掉”原生” Direct3D 支持的话, 把这个键值改为 0 即可.)

8. 打开你想测试的 wine 游戏试试吧!

PS: 本猫提供了一些编好的包可以自己用哦, 包括 mesa/lib32-mesa 10.0.3 的 patch 好的版本, 以及 wine-multimedia 改好的版本(多了一个 multimedia 补丁, 主要是 pulseaudio 支持等音频方面的修改) 地址在: http://pkgbuild.com/~fyan/staging/wine_d3d9/

补丁作者测试了 Crysis 和 Bioshock 有显著的 fps 提升, 幅度可以达到近一倍; 而本猫测试了 Skyrim, Civilization V 等游戏, 甚至能有两倍的 fps 提升哟 😛 (虽然和闭源驱动相比还是有相当差距…)

附测试结果: (我的显卡是 Nvidia 650 Ti)
游戏名/开源驱动+Wine(fps)/开源驱动+Wine+Direct3D ST(fps)/闭源驱动+Wine(fps)/开源驱动+Linux 原生版本(fps)
Skyrim/8/25/60/
Civilization V/20/40/60/
东方辉针城/60/120/60/ (嗯, 这里 Direct3D 的 ST bug 掉了, 游戏速度无比快…)
Left 4 Dead 2/25/50/60/40 (超过 Linux 原生版本了!!!)
Kerbal Space Program/10/35/60/25 (又超过 Linux 原生版本了!!!)

参考资料 (补丁作者自己写的介绍原文): http://ixit.cz/faster-wine-games-with-open-source-drivers-d3d9-aka-gallium-nine/

QR Code Business Card