infinality-bundle アップデート停止中なので、とりあえずアンインストールするメモ

代替インストールして、Infinalityに近づける工夫もする

mcomix は圧縮書庫の画像やPDFを眺めるのにちょうどよく、自炊なんかに重宝するものだが、お題目はそれではない。その mcomix が PyGTK エラーで起動しなくなったのだ。そこで pygtk-demo を実行してみるとやはりエラー。

$ pygtk-demo
...
ImportError: /usr/lib/libharfbuzz.so.0: undefined symbol: FT_Get_Var_Blend_Coordinates

この libharfbuzz のエラーはどうも freetype2 が古いということらしい。

私は Arch Linux に infinality-bundle リポジトリのフォントレンダリングパッチをインストールしている。だから freetype2-infinality-ultimate が原因ということになるだろうか。

さて、この infinality-bundle なのだがしばらくアップデートされておらず、freetype2 の新バージョン対応パッチがリリースされていないらしい。

デベロッパとの連絡もとれず、結構な時日が経っている。

たまたま mcomix で気付いたが、この harfbuzz に関するエラーで動かないアプリは多数あるだろう。まだ問題の出ていない Arch Linux ワークステーションも、infinality-bundle をインストールしているのならば、ローリング・リリースのアップデートによって早晩エラーに遭遇することになる。

これは困ってしまう。

しかし、ありがたいことに対策方法が挙げられていた。

上記中でも言及しているが、infinality-bundle についての今後は極めて不透明であり、不自由を強いられているならば、アップデート再開などで問題がクリアされるまで Infinality そのものを全てシステムから取り除いて待つべきであろう、と判断した。

それで上記方法を実践したところうまくいったようで、助かっている。ただ、多少勝手が違うと感じたところもあるので、そこも含めてメモを残す。

やること

以下の事を実行する。

  • インストール状況の把握
  • fc-presets で reset
  • infinality-bundle リポジトリのアプリを削除し代替パッケージをインストールする
  • infinality に近づけるため /etc/fonts をちょっといじる

Infinality のインストール状況の把握

まず、infinality-bundle リポジトリのインストール済みパッケージをリストアップしてインストール状況を把握しておく。

こういうことには pkgbrowser (AUR)を使うと非常にやりやすい。

ところが、同様の harfbuzz エラーで pkgbrowser が動かないのだ。

だったらとにかくコマンドラインでいってみる。ちょっと冗長的かもしれないが以下のようになった(pacman -Qg を使うとうまくなかった)。

$ LANG=C pacman -Sl | grep '^infinality-bundle.*installed\]$'

infinality-bundle cairo-infinality-ultimate 1.14.6-2 [installed]
infinality-bundle fontconfig-infinality-ultimate 2.11.95-4 [installed]
infinality-bundle freetype2-infinality-ultimate 2.6.3-4 [installed]
infinality-bundle jdk8-openjdk-infinality 8.u92-1 [installed]
infinality-bundle jre8-openjdk-headless-infinality 8.u92-1 [installed]
infinality-bundle jre8-openjdk-infinality 8.u92-1 [installed]
infinality-bundle ttf-oxygen-ibx 1:5.4.3-2 [installed]
infinality-bundle-fonts ibfonts-meta-base 1-7 [installed]
infinality-bundle-fonts ttf-courier-prime-ib 1.203-7 [installed]
infinality-bundle-fonts ttf-dejavu-ib 2.35-2 [installed]
infinality-bundle-fonts ttf-heuristica-ib 1.0.2-4 [installed]
infinality-bundle-fonts ttf-liberation-ib 2.00.1-13 [installed]
infinality-bundle-fonts ttf-noto-fonts-ib 20150929-2 [installed]
infinality-bundle-fonts ttf-symbola-ib 8.00-2 [installed]
...

インストール状況によっては上記に加えて multilib (lib32) や 他のinfinality-bundle版フォントもリストアップされるかもしれない。フォントメタパッケージの ibfonts は ibfonts-meta-base のほかに ibfonts-meta-extended とかもある。

アンインストールするだけであれば上記をawkしてpacmanに渡せばいいのだろうかと思うが、そこまで簡単なことでもないようだ。依存の問題や、なにより代わりのものをインストールしなければならないからだ。すなわちinfinality-bundle版に置き換わってしまっているもののオリジナルをインストールするということだ。

オリジナルの名前はなんとなく推測できるので、ちょっと調べてきた。

infinality-bundle版 代わりのオリジナル版
cairo-infinality-ultimate cairo
fontconfig-infinality-ultimate fontconfig
freetype2-infinality-ultimate freetype2
jdk8-openjdk-infinality jdk8-openjdk
jre8-openjdk-headless-infinality jre8-openjdk-headless
jre8-openjdk-infinality jre8-openjdk
ibfonts-meta-base
ttf-oxygen-ibx ttf-oxygen
ttf-courier-prime-ib ttf-courier-prime
ttf-dejavu-ib ttf-dejavu
ttf-heuristica-ib ttf-heuristica
ttf-liberation-ib ttf-liberation
ttf-noto-fonts-ib noto-fonts
ttf-symbola-ib ttf-symbola

幸いなことに pacman というパッケージ管理機能はパッケージの置き換えをうまくやってくれる。つまり代替パッケージ(というかオリジナル?)をインストールすれば infinality-bundle 版はアンインストールされるのだ。

また、ibfonts-meta はメタパッケージで、依存関係とかよくわからないのだが、これは明示的にアンインストールしてしまえばいい。

アンインストール作業を実行する

fc-presets

まずは ‘sudo fc-presets set’ から。 “4) reset” を実行してから “5) quit” でクイット。

$ sudo fc-presets set
[sudo] password for jenny:

1) combi
2) free
3) ms
4) reset
5) quit
Enter your choice... 4
 Removing current preset...
Done. Now select a new preset...
Enter your choice... 5
 No preset chosen. Aborting.

ibfonts-meta フォントをアンインストール

次にメタパッケージのフォントを削除。インストールされているなら ibfonts-meta-extended などもアンインストールする。

$ sudo pacman -Rns ibfonts-meta-base

確認すると、削除されていない infinalityフォント があるかもしれないが、前述の通り代替フォントをインストールすることで取り除かれる。

$ LANG=C pacman -Sl | grep '^infinality-bundle-fonts.*installed\]$'

infinality-bundle-fonts ttf-dejavu-ib 2.35-2 [installed]
infinality-bundle-fonts ttf-noto-fonts-ib 20150929-2 [installed]

上の様子では ttf-dejavu と noto-fonts をインストールすればいいだろう。次のところで一緒にインストールする。

Infinalityをアンインストール

オリジナルパッケージをインストールすると、衝突パッケージについて削除するか聞かれるから、その都度 y で答えていく。

$ sudo pacman -S cairo fontconfig freetype2 jdk8-openjdk jre8-openjdk-headless jre8-openjdk ttf-dejavu noto-fonts

これで infinality-bundle 関連のパッケージがアンインストールされただろう。確認するために以下を実行してみる。

$ LANG=C pacman -Sl | grep '^infinality-bundle.*installed\]$'

もしまだフォントが残っているようなら、メモをとっておいてから pacman -Rns で削除し、後で該当するオリジナルのフォントを調べてインストールする。

infinality-bundle リポジトリを無効にする

Infinalityを使っていたのであれば /etc/pacman.conf にinfinality-bundleリポジトリを追加しているはずだ。以下のような記述になっているかと思う。少なくともコメントアウトする。

# [infinality-bundle]
# Server = http://bohoomil.com/repo/$arch
# [infinality-bundle-multilib]
# Server = http://bohoomil.com/repo/multilib/$arch
# [infinality-bundle-fonts]
# Server = http://bohoomil.com/repo/fonts

Infinality に近づける

ここから以下は、infinality に近づけるために /etc/fonts などに手を加える手順。

まずシンボリックリンクを作成。

$ sudo ln -s /etc/fonts/conf.avail/11-lcdfilter-default.conf /etc/fonts/conf.d
$ sudo ln -s /etc/fonts/conf.avail/10-sub-pixel-rgb.conf /etc/fonts/conf.d

/etc/fonts/local.conf ファイルを作成して、 ここにある内容 を貼り付ける(抵抗なければ sudo wget でも)。

次に、以下のように fonts-meta-extended-lt をインストール。抵抗なければ –noconfirm オプションをつけると面倒くさくない。

$ yaourt -S fonts-meta-extended-lt

次いで、 /etc/profile.d/jre.sh に以下の2行を追記する。

# https://wiki.archlinux.org/index.php/java#Better_font_rendering
export _JAVA_OPTIONS='-Dawt.useSystemAAFontSettings=on -Dswing.aatext=true'

最後に以下を実行して、再起動する。

sudo gdk-pixbuf-query-loaders --update-cache
systemctl reboot