代替インストールして、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
Sources
- A set of instructions on how to fix the harfbuzz + Infinality issue and restoring good-looking, Infinality-like font rendering. · GitHub
- How To Fix The Harfbuzz And Infinality Issue In Arch Linux – OSTechNix
- Freetype 2.7.0 is out. Will be there infinality patch ? · Issue #171 · bohoomil/fontconfig-ultimate · GitHub