第8回「Linuxのしくみ」読書会に参加しました

7/18 に開催されたNSEGの「Linuxのしくみ」読書会の第8回に参加しました。参加者7名。

nseg.connpass.com

今回は第8章の最初から最後まで読みました。最終回でした。

個人的な収穫

  • posix_memalign() という関数を知った。

誤植等

  • p.248 「①」「②」ときて何故か「③」じゃなくて「(3)」。あと白抜き文字じゃない。
  • p.249 「①、②のとこんろです」→「①、②のところです」
  • p.252 「sdb -x -p sdb 1」→「iostat -x -p sdb 1

おわり

これで「Linuxのしくみ」の読書会は終了です。

非常に誤植が多かったことが残念ですが、とても良い本でした。

Linux の プロセス、CPU、メモリ、ストレージ管理の基本がわかります。 サーバーの性能が出ないといった時の調べ方の助けにもなると思います。

[試して理解]Linuxのしくみ ~実験と図解で学ぶOSとハードウェアの基礎知識

[試して理解]Linuxのしくみ ~実験と図解で学ぶOSとハードウェアの基礎知識

NSEG読書会として次に何の本を読むかは未定です。次回はたぶん8月のお盆明けくらいになるんじゃないかと思います。

第7回「Linuxのしくみ」読書会に参加しました

7/4 に開催されたNSEGの「Linuxのしくみ」読書会の第7回に参加しました。参加者8名。

nseg.connpass.com

今回は、第7章の途中(p.179)から第7章の最後まで読みました。

個人的な収穫

  • ext4 でディレクトリクォータが使えるのは知らなかった。どうやって設定するんだろう。
  • strings コマンドに -t というオプションがあるのは知らなかった。
  • bash の $((...)) を知った。((...))$ をつけた感じか。一貫性はある。
  • Btrfs は名前しか知らなかったけどかなり便利そう。RHELはなんでサポートやめたんだろう。

誤植等

  • p.204 図7-12の①に hoge ファイルが無い。
  • p.216 "「lost+found」はext4の作成時に必ず作られるファイル" → ファイルじゃなくてディレクトリ。
  • p.218 "このとき「size」マウントオプションによって最大サイズをしています" → "最大サイズを指定しています" かな。
  • p.221 "/sys/fs/cgroup/memory 以下のファイルに読み書きによって制御" → "ファイルの読み書きによって制御" かな。

その他

  • 昔のSolarisにはunlinkというコマンドがあって、ディレクトリエントリもサクッと消してくれるので、簡単にファイルシステム不整合を起こすことができて便利w
  • p.210 "「どのファイルシステムにも共通して存在するのが「fsck」というコマンド(ext4なら fsck.ext4、XFSならxfs_repair、Btrfsなら「btrfs check」)です" という記述が妙な気がする。「fsckコマンドの実体は」ということだとは思うが。
  • p.213 px ax | grep bash で端末を調べてるけど、tty コマンドでいいのでは。

次回は7/18です。おそらく最終回になると思います。

nseg.connpass.com

第6回「Linuxのしくみ」読書会に参加しました

6/20 に開催されたNSEGの「Linuxのしくみ」読書会の第6回に参加しました。参加者5名。

nseg.connpass.com

今回は、第6章の途中(p.170)から第7章の途中(p.197)まで読みました。

個人的な収穫

  • vm.dirty_writeback_centisecs, vm.dirty_background_ratio, vm.dirty_background_bytes, vm.dirty_ratio, vm.dirty_bytes 等のパラメータを知った。
  • なんとなくしか知らなかったハイパースレッドの仕組みを知った。

誤植等

なんと!今回は誤植等がありませんでした!

しかし今まで報告した大量の誤植等の扱いはどうなってるんだろう…。

その他

ページキャッシュが効いてる状態で dd で書き込むと、本の記述と異なり、すぐに pgpgout/s が出てしまいました。 その時は何故かわからなかったんですが、読み進めて、おそらく vm.dirty_background_ratiovm.dirty_ratio の影響だと思い至りました。 1GBも書き込むと、メモリが少ないとすぐにこれに引っかかっちゃいますね。


次回はたぶん7/4です。

第5回「Linuxのしくみ」読書会に参加しました

6/6 に開催されたNSEGの「Linuxのしくみ」読書会の第5回に参加しました。参加者7名。

nseg.connpass.com

今回は、第5章の途中(p.135)から第6章の途中(p.170)まで読みました。

個人的な収穫

階層型ページテーブル、ヒュージページについては知りませんでした。

誤植等

  • p.139 誤植というかプログラムのバグだけど、プロセスIDが5桁未満の場合は ps の出力が空白で始まるので、grep ^%d に適合せず出力されない。
  • p.141 「親プロセスと子プロセスでメモリで共有されているメモリは」
  • p.144-145 プロセスBの仮想アドレスから物理メモリ500に不要な線がある。
  • p.145 PDF版第2版 は 145ページが重複していて146ページがない。[追記] 2018/06/23時点では修正されています。
  • p.152, 154 「物理アドレス」であるべきところが「下位のページテーブル」になっている。
  • p.155 「mdadvise」→「madvise」

その他

  • プロセスサイズだけでは実際のメモリ使用量はわからない。/proc/*/smaps の Pss を見れば目安になる。という話をしました。
  • 誤植つらい。p.145 が重複してるって何事??? 実はこの2つのページには1箇所違いがあります。誤植を直してページを差し替える時に間違って p.146 を消して修正後の p.145 を入れてしまったのかな…。

f:id:tmtms:20180606223508p:plain

[追記] 2018/06/23時点では修正されています。


次回は6/20です。

nseg.connpass.com

第4回「Linuxのしくみ」読書会に参加しました

5/24 に開催されたNSEGの「Linuxのしくみ」読書会の第4回に参加しました。参加者4名。さらに減った!

nseg.connpass.com

今回は、第5章の途中(p.98)から第6章の途中(p.135)まで読みました。

個人的な収穫

今回の範囲では特に知らなかったことは無かったです。

誤植等

  • p.104 「before invalid access」のフォントが異なる。
  • p.130 誤植じゃないけど、sarの結果の1行が折り返されてて見にくい。興味があるのは kbmemused だけなのだから、右側は折り返さなくて見せなくてもいいような。

その他

ページテーブルのアドレスが「100-200」「200-300」となってて、「200」がどっちのページかわかりにくいという意見がありました。まあちょっと考えれば「100-199」「200-299」という意味だとわかるし、たぶん /proc/*/maps の出力に合わせたんだと思うんですが、説明があった方がわかりやすかったかも。

p.101の説明が「ページフォールトが発生するとSIGSEGVが起きる」みたいに読めてしまって違和感。説明も「物理メモリ未割り当て」ページのように書かれてるけど、p.122の用語での「プロセスには未割り当て」の状態のはず。「物理メモリ未割り当て」だとp.122の「プロセスに割り当て済みだが物理メモリは未割り当て」だと思ってしまいそう。

そういや昔のSolarisのmalloc()mmap()じゃなくてbrk()を使ってたなーと思いだした。そのためfree()してもプロセスサイズは減らなかった。mmap()を使うmalloc()を作ってLD_PRELOADで差し替えて遊んだりしてた。懐かしい。


次回は6/6です。

nseg.connpass.com

第3回「Linuxのしくみ」読書会に参加しました

5/9 に開催されたNSEGの「Linuxのしくみ」読書会の第3回に参加しました。参加者6名。急に減った!

nseg.connpass.com

今回は、第4章の途中(p.65)から第5章の途中(p.98)まで読みました。

個人的な収穫

  • sar の %nice の意味を知った。

誤植等

  • p.68 taskset -c 0 , 4 ./sched プロセス数 1000 11000100 の間違い?
  • p.74 誤「開始から終了までの時間までの経過時間と使用時間」 正「開始から終了までの経過時間と使用時間」
  • p.82 ps -eo pid,comm,time,etime の結果が PID COMMAND ELAPSED TIME となってて、ELAPSEDTIME の順番が逆
  • p.84 sched_nice.c 誤植ではないけど、sched.c と比べて無駄に差分がある。空行の有無とか、変数宣言の位置とか、関数名とか。
  • p.98 図05-10 矢印がメチャクチャ

その他

  • やっぱりグラフ化ツールが欲しい。gnuplot か何かで作るかな…。
  • 誤植つらい。
  • しかし Linux の OOM killer の仕組みはどうにかならないんだろうか。
  • OOM killer 「やったね」って何爽やかな笑顔してんだ。「殺ったね」の間違いだろ。

f:id:tmtms:20180509221955p:plain


次回は5/23です。残念ながら私は欠席です。 会場の都合で 5/24 に変更になりました。なので私も参加します。

nseg.connpass.com

第2回「Linuxのしくみ」読書会に参加しました

4/25 に開催されたNSEGの「Linuxのしくみ」読書会の第2回に参加しました。参加者11名。第1回と同じ。

nseg.connpass.com

今回は、第3章と第4章の途中(p.65)まで読みました。

個人的な収穫

  • taskset コマンドを知った。
  • clock_gettime システムコールを知った。gettimeofday はもう古いのね…。

誤植等

  • p.45 誤「takset コマンドは」→正「taskset コマンドは」
  • p.50 誤「次のようなことがことがわかりました。」→正「次のようなことがわかりました。」
  • p.53 「sched プログラム内」の「sched」のフォントがタイプライタ体になっていない。

その他

  • UNIXシステムコールに慣れてない人はやはり fork, exec に戸惑うらしい。
  • bash 等のシェルにも exec がある。引数なしの exec の動きが引数ありの exec と全然違うけど、何故同じ名前にしたし…。
  • 音読時に sched を何と呼ぶのか問題。
  • 測定結果を簡単にグラフ化できるスクリプト等があればありがたかった。
  • VMだと結果が綺麗に出ない場合がある。
  • 誤植つらい

次回は5/9です。

nseg.connpass.com

第1回「Linuxのしくみ」読書会に参加しました

4/11 NSEGの「Linuxのしくみ」読書会の第1回に参加しました。参加者11名。だいたいいつも第1回は参加者が多いんですが、これがいつまで続くか。今回は関西方面からリモート参加の方もいました。

nseg.connpass.com

今回は「はじめに」と1章と2章を読みました。

  • @tatsushi_d の知識、マジパネェ。

  • 「Linuxのしくみ」なのにMac上で試そうとする人多すぎ。チャレンジャーすぎる。

  • sar の結果を見て、

    統計情報を採取していた 1 秒間に、CPU コア 0 上ではユーザプロセス、ここでは loop プログラムが常に動作していたことがわかります

    と書かれてた部分について、「なぜこの出力から loop プログラムだということがわかるのか」と疑問に思った人が数人いた。たしかにちょっと紛らわしい書き方かもしれない。

  • 最近の sar は色がつくのね。

  • ロケールが日本語だと sar の通常の行と最後の「平均値」の行でカラムがずれててダサい。

  • 間違いがたくさんありそうだったので電子書籍にした自分勝ち組。正誤表↓を見ると第3刷でも結構修正されそうな感じ。

docs.google.com

2章まででは、自分は特に知らないことはなかったんですが、良い本です。会社の新人教育用にも良いと思いました。

次回は 4/25 の予定です。

nseg.connpass.com

gihyo.jp の電子書籍は DRMフリーなのでおすすめです。

gihyo.jp

xremap の代わりに xkeysnail を使ってみる

前にこんな記事を書きましたが、

tmtms.hatenablog.com

たしかにCtrl-Nで新しいウィンドウが開くことはなくなったんですけど、Webページによっては Ctrl-N を押しても何も反応がないことがあります。原因は調べてません。まあウィンドウが開くことがないだけでもいいかと思ってたんですけど、xkeysnail というのがあると教えてもらいました。

qiita.com

Python製のツールみたいです。Pythonは全然わかんないんですけど、書かれてる通りにインストールしました。 pip3 は Ruby の gem コマンドみたいなもんなのかしら。

% sudo apt install python3-pip
% sudo pip3 install xkeysnail

example/config.py はたくさん設定されててなんかこわいので Ctrl-N と Ctrl-K だけにしてみました。Pythonわからないんでテキトーです。

# -*- mode: python, coding: utf-8 -*-

import re
from xkeysnail.transform import *

# [Global modemap] Change modifier keys as in xmodmap
define_modmap({
    Key.CAPSLOCK: Key.LEFT_CTRL
})

define_keymap(lambda wm_class: wm_class in ("Firefox"), {
    K("C-k"): [K("Shift-end"), K("C-x"), set_mark(False)],
    K("C-n"): with_mark(K("down")),
}, "Firefox")

/dev/uinput とかを使うので root で実行する必要があるんですけど、常に root で動かしとくのもアレなので、この記事を参考に専用ユーザーを作って見ました。

qiita.com

自動起動はこういうスクリプトを作って、デスクトップの設定の「自動起動するアプリ」で起動するようにしました。バックグラウンド実行するようにしとかないとログイン処理が止まってキー入力が一切効かなくなって電源切るしかなくなっちゃったので注意。

~/bin/xkeysnail.sh:

#!/bin/sh
exec >> $HOME/tmp/xkeysnal.log 2>&1
xhost +SI:localuser:xkeysnail
sudo -u xkeysnail DISPLAY=$DISPLAY /usr/local/bin/xkeysnail $HOME/etc/xkeysnail.conf

今のところ期待通りに動いているようです。

Gtkのスクロールバーの幅とかボタン内の余白とか

最近のデスクトップは Ubuntu Mate を TraditionalOk テーマで使ってます。

だいたいいい感じなんですが、スクロールバーがちょっと太いのとボタン内のテキストの周囲に余計な余白があってボタンが大きくなってしまうのがイマイチだと思ってました。

この辺はテーマによるみたいなので /usr/share/themes 配下で定義されてるようです。

みようみまねでテキトーに $HOME/.config/gtk-3.0/gtk.css に次のように書いておくと調整できました。

/* ボタン内の余白を 0 に */
button {
    padding: 0px;
}

/* スクロールバーの幅を 10px に */
scrollbar.vertical {
    min-width: 10px;
}

scrollbar.horiozntal {
    min-height: 10px;
}

scrollbar.horizontal trough {
    min-height: 10px;
}

scrollbar.vertical trough {
    min-width: 10px;
}

scrollbar.vertical button,
scrollbar.vertical .button {
    min-width: 10px;
}

scrollbar.horizontal button,
scrollbar.horizontal .button {
    min-height: 10px;
}

scrollbar.vertical slider,
scrollbar.vertical .slider {
    min-width: 10px;
}

scrollbar.horizontal slider,
scrollbar.horizontal .slider {
    min-height: 10px;
}

/* ここから下はスクロールバーの矢印ボタンを常に表示する設定 */
scrollbar {
    -GtkScrollbar-has-backward-stepper: true;
    -GtkScrollbar-has-forward-stepper: true;
}

scrollbar.horizontal {
    -GtkScrollbar-has-backward-stepper: false;
    -GtkScrollbar-has-forward-stepper: false;

}

scrolledwindow > scrollbar.horizontal {
    -GtkScrollbar-has-backward-stepper: true;
    -GtkScrollbar-has-forward-stepper: true;
}

/* 追記: テキスト入力を細めに */
entry {
    padding: 1px;
}

しかしこれでもFirefox のスクロールバーに矢印が出ないのは謎。

Firefox 57 のテキスト入力時に Ctrl-N で新規ウィンドウが開くようになってしまったが xremap で事なきを得た

Emacs 使いなので、デスクトップのキーバインドも Emacs にしていて、Firefox のテキスト入力欄でも Emacs ぽく入力していたのですが、Firefox 57 でなぜか Ctrl-N で新規ウィンドウが開くようになってしまいました。Ctrl-B, Ctrl-F, Ctrl-P はちゃんとカーソル移動として動くのに Ctrl-N だけなぜ…。

原因はともかく、これでは使い物にならないので、xremap を入れて対処しました。

k0kubun.hatenablog.com

インストール

% git clone https://github.com/k0kubun/xremap
% cd xremap
% make
% cp xremap $HOME/bin

設定 [$HOME/bin/xremap.config]

window class_only: 'Navigator' do
  remap 'C-b', to: 'Left'
  remap 'C-f', to: 'Right'
  remap 'C-p', to: 'Up'
  remap 'C-n', to: 'Down'

  remap 'M-b', to: 'Ctrl-Left'
  remap 'M-f', to: 'Ctrl-Right'

  remap 'C-a', to: 'Home'
  remap 'C-e', to: 'End'

#  remap 'C-k', to: ['Shift-End', 'Ctrl-x']

  remap 'C-d', to: 'Delete'
  remap 'M-d', to: 'Ctrl-Delete'
end

C-k を無効にしてるのはMozcでカタカナに変換するためのキーだからです。

実行

$HOME/bin/xremap $HOME/bin/xremap.config

xremap すばらしい。

[追記]

Twitterで何故かマップしているキーが動かなくなってたので、結局 C-n だけ有効にしました。

実行中プログラムのイメージを得る

Twitter見てたらこんなこと言ってる人がいました。

昔自分もそんなこと考えたなーと思いつつ、Linuxなら /proc/<pid>/exe が実行ファイルへのリンクになってるんで、

と言ってみたら、

まあ、たしかにシンボリックリンクだし、実行ファイルが消されちゃったらしょうがないなーと思ったんですよ。

そしたら、こんなリプライがついて、

この緑の怪獣が何者かは知らないんですけど、リンクなんだから実行ファイルが消されちゃったらどうしようもないのに何言ってんの?シロウトなの?

と思ったら実は消されててもアクセスできるんですよ!びっくりさ!

がちゃぴ^H^H^H緑の怪獣さんすごい!

試してみます。プログラム作るの面倒なんで、sleep コマンドで。

~% cp /bin/sleep /tmp
~% /tmp/sleep 99999 &
[1] 18728
~% ls -l /proc/18728/exe
lrwxrwxrwx 1 tommy tommy 0 10月 25 23:38 /proc/18728/exe -> /tmp/sleep
~% rm /tmp/sleep 
~% ls -l /proc/18728/exe
lrwxrwxrwx 1 tommy tommy 0 10月 25 23:38 /proc/18728/exe -> /tmp/sleep (deleted)
~% ls -lL /proc/18728/exe
-rwxr-xr-x 0 tommy tommy 35000 10月 25 23:38 /proc/18728/exe
~% cmp /proc/18728/exe /bin/sleep
~% /proc/18728/exe --version
sleep (GNU coreutils) 8.26
Copyright (C) 2016 Free Software Foundation, Inc.
ライセンス GPLv3+: GNU GPL version 3 or later <http://gnu.org/licenses/gpl.html>.
This is free software: you are free to change and redistribute it.
There is NO WARRANTY, to the extent permitted by law.

作者 Jim Meyering および Paul Eggert。

exe はリンクファイルなので、実行ファイルが消されたら (deleted) となって、もう参照できないように思えるんだけど、実体を見ようとしたらちゃんと見えるんですよ。リンクカウント 0 のファイルとして。

それをそのまま読み込むこともできるし、実行だってできる。面白い。

プロセスの実行ファイルだけじゃなくて、プロセスがオープンしているファイルも /proc/<pid>/fd/ 配下で見ることができるんですけど、それも同じように実体が消えたとしてもアクセスできます。

UNIX/Linux ではオープン中のファイルがファイルシステム上から削除されても、ディレクトリツリーからは見えなくなるだけで、ディスク上には残ってて、そのファイルをオープンしているプロセスがすべて死んだら、ディスク上の領域からもなくなります。

/proc はカーネル内の管理領域をファイルシステムとして見せている特殊なファイルシステムだから、こういうこともできるんですかねー。

ところでやっぱりこれは Linux だけでしか通用しないみたいです。

おまけ

言い出しっぺの人が全然反応ないなーと思ってたら…。

ThinkPad T460s Ubuntu でトラックパッドを無効化

5ヶ月ほど ThinkPad T460s を Ubuntu(Xubuntu) で使ってます。

ちょっと前に さよならMac | めがねをかけるんだ という ThinkPad をdisった記事が話題になりましたが、自分はあんまり不満はありません。 ノートPCでLinuxを使う時の鬼門だった無線LANやサスペンドもまったく問題ありません。 当然トラックパッドは無効にしています。

唯一の不満がこのトラックパッド無効化です。

トラックパッドを無効にしようとBIOSで無効に設定しても無効になりません。

しょうがないので、Xubuntu の設定の「マウスとタッチパッド」でタッチパッドの設定を無効化します。

f:id:tmtms:20170218135347p:plain

これでトラックパッドが無効になってめでたしめでたし。

…と思ったのですが、しばらく使ってると、時折トラックポイントのボタンをクリックしても効かないことがあります。

どうやらトラックパッドに触れているとボタンのクリックイベントを取りこぼすようでした。 トラックパッドを無効にしていたので、それが原因だとなかなか気がつきませんでした。

トラックパッドに二本以上の指が触れているとかなりの確率でボタンのクリックイベントを取りこぼしてしまいます。

どうやら psmouse ドライバのインストール時に proto=bare を指定するとトラックパッドを完全に無効化できるようです。 というより proto=bare ではトラックパッドを扱えないというだけな気がします。

# modprobe -r psmouse
# modprobe psmouse proto=bare

これでトラックパッドに触れていてもボタンクリックを取りこぼすことはなくなりました。

…が、もうひとつ問題が。

proto=bare ではトラックポイントの感度と速度の調整ができません。

proto=bare を指定しない時は、次のようにして感度と速度を調整できました。

# echo 200 > /sys/devices/platform/i8042/serio*/serio*/sensitivity
# echo 200 > /sys/devices/platform/i8042/serio*/serio*/speed

proto=bare で psmouse をインストールした時は、この sensitivity, speed ファイル自体ありません。

色々試行錯誤したところ、proto=bare をつけずに psmouse をインストールして、感度と速度を調整した後に proto=bare をつけて psmouse を再インストールすると感度と速度が保持されたままになることがわかりました。

とりあえず、簡単なシェルスクリプトを作って、電源ON時やサスペンドからの復帰時に走らせてます。

#!/bin/bash
DIR=/sys/devices/platform/i8042
SPEED=200
SENSITIVITY=200

# echo が刺さることがあるので1秒でタイムアウトさせる
sub() {
    (echo $1 > $2) &
    pid=$!
    (sleep 1; kill $pid) &
    pid2=$!
    wait $pid
    kill $pid2
}

modprobe -r psmouse
modprobe psmouse proto=any
while :; do
    sleep 0.3
    speed=$DIR/serio*/serio*/speed
    test -f $speed || continue
    sens=$(dirname $speed)/sensitivity
    test -f $sens || continue
    sub $SPEED $speed
    test "$(cat $speed)" -eq $SPEED || continue
    sub $SENSITIVITY $sens
    test "$(cat $sens)" -eq $SENSITIVITY || continue
    break
done
modprobe -r psmouse
modprobe psmouse proto=bare

ThinkPad T460s 購入

ちょっと前ですが ThinkPad T460s を買いました。

軽いPCが欲しくて、1kg前後のPCを探したりしてたんですけど、ThinkPad T460s が 10万円以下で買えるようになったので値段に負けました。

購入したモデルはこんな感じです:

  • Core i5-6200U (2.30GHz, 3MB)
  • ディスプレイ 14.0 FHD (1920x1800 IPS)
  • メモリー 12GB (4GB + 8GB)
  • 日本語キーボード
  • 指紋センサーなし
  • SSD 256GB
  • 1.36kg
  • 米沢生産
  • 102,211円

9/25 に注文して 10/7 に届きました。

振り返ってみると16年くらいずっと ThinkPad です。

前に使ってた ThinkPad X220 よりも画面が広くて薄くて軽くていい感じです。

X220 の時は Xubuntu 使っててサスペンド&レジュームが不安定で良くフリーズしたり、bluetooth マウスの接続がうまくいかなかったりしたんで、新しい PC では Windows の上に仮想マシンで Linux Desktop を動かそうと考えていました。

ということで初めは VirtualBox に Xubuntu 入れてフルスクリーンでデスクトップを使ってみましたが、 トラックポイントの中ボタンをクリックとスクロールの両方で使えなかったり、動画が見れなかったり。

VirtualBox の代わりに VMware Workstation Player で試してみたら動画はちゃんと見れるようになったのですが、トラックポイントの動きは変わらず。

トラックポイントのはどうも Linux か X の制御の問題のような感じでした。

それでもしばらくは Xubuntu on VMware on Windows で使おうと思ってたのですが、突然 Windows update によって勝手にリブートされたので、嫌になって直接 Xubuntu を動かすようにしました。そしたらサスペンドも bluetooth も普通に動いたので拍子抜け。

一応 Windows は残してデュアルブートできるようにしてあります。ヘタレなので。

Firefoxで絵文字が白黒で表示される

Firefox 50 で絵文字に色がつきました。

次のようなテキストファイルを表示すると

🍣と🍺

次のように表示されるようになりました。

f:id:tmtms:20161123163111p:plain

ですが、Ubuntu で次のファイルを表示すると

🐭🐮🐯🐰🐲🐍

次のように「🐭」と「🐮」だけ白黒で表示されてしまいました。

f:id:tmtms:20161123163115p:plain

どうやら、OSのフォントに該当する文字があればそれが優先されるようです。

Dejavu Sans フォントに該当するフォントが入ってるようなので、それを読ませないようにすればいいようです。

% sudo apt purge fonts-dejavu-core

ちゃんと色付きで表示されるようになりました。

f:id:tmtms:20161123163119p:plain

なお、fonts-dejavu-core を削除すると、合わせて xubuntu-core や xubuntu-desktop も削除されてしまいますが、これらはメタパッケージなので特に問題ありません。 それが嫌な場合は、要するにフォントファイルを見せなければいいので、次のようにするだけでも良いようです。

% sudo chmod 000 /usr/share/fonts/truetype/dejavu

[追記]

font-manager を使って Dejavu Sans のチェックボックスを外すことで無効に出来ます。 そのユーザーだけに影響してシステムには影響しないため、上記の方法よりも望ましいと思います。

どのフォントファイルに定義されているのかを調べる

「🐭」と「🐮」がどのフォントファイルで定義されているか調べるのにいくつかツールを使ってみました。

gnome-font-viewer

特定の文字しか表示されないのでダメでした。

fontforge

UIが使いづらかったのでやめました。

gnome-specimen

そのフォントに定義されていない文字はデフォルトのフォントで表示されるようなので使えませんでした。

font-manager

これで見つけることができました。

waterfall

ちょっと使いにくかったですが、これでも見つけられました。