matplotlibやskimageのimshowとかでウィンドウが全く表示されないならbackendを変えてみよう

サメはいわゆる魚類(分類学的には魚類というのは無いんだそうですね)に含まれますが、普通に「さかな」と言ってイメージするような魚を指す場合、「硬骨魚綱」と呼ぶとだいたい一致するんだそうです。サメやエイは「軟骨魚綱」になります。ただし、タツノオトシゴも硬骨魚綱に含まれます。

さて、matplotlibやskimageなどを使っていて、どんな描画結果をウィンドウに出そうとしてもでないとき。
X周りはちゃんとしているのに、例えばこんなコードを実行しても、ウィンドウが表示されない場合。

import skimage.io
img = skimage.io.imread('/path/to/image.png')
skimage.io.imshow(img)

Render backendを疑ってみてください。
matplotlibが何をベースに描画を行っているかにより、絵の質や出力方式や出力先が変わります。
現在のRender backendを調べてみましょう。

>>> print matplotlib.get_backend()
agg

無印のAGGは、画面への出力には対応していません。
このようなbackendsを、”noninteractive backends”と呼んでいます。

Here is a summary of the matplotlib renderers (there is an eponymous backed for each; these are non-interactive backends, capable of writing to a file):
Usage — Matplotlib 1.4.3 documentation

ということで、画面への出力にも使えるもの”interactive backends”をrender backendにしてしまいましょう。
backendの変更はスクリプト内でもできますが、ホントに最初にやらないといけないので面倒です。
そこで、デフォルト設定を変更してしまいます。

matplotlibの設定ファイルを探し出します。例えばpyenvを使っていたら下記のようなかんじで出力されます。

>>> matplotlib.matplotlib_fname()
u'/your/home/.pyenv/versions/2.7.9/lib/python2.7/site-packages/matplotlib-1.4.2-py2.7-linux-x86_64.egg/matplotlib/mpl-data/matplotlibrc'

で、このファイルを書き換えます。

 - backend      : agg
 + backend      : Qt4Agg

interactive backendであれば何でもOKです。Aggがついてるやつがおすすめです。
また依存ライブラリは事前に入れる必要があります。
例えばQt4Aggの場合はPyQtやPySideが、GTKAggの場合はPyGTKのインストールが必要です。

調べればすぐなんですけども、backendにはinteractiveとnoninteractiveがあり、デフォルトになっている無印AggがGUIをサポートしていないというのがハマりポイントでした。
pyenv環境にpipで入れたわけですが、配布しているパッケージによっては最初からinteractive backendがデフォルトになっていることもあるようです。

Pythonのargparseからzsh補完スクリプトを吐いてくれるgenzshcompでQoLが上がった

タツノオトシゴって、あの見た目なのですが、実は魚類だったんです。なんとなく甲殻類と思っていた。最大の種は30cmを超えるそうで、あの姿でその大きさというのを想像するとちょっとこわい。。

Pythonでは、かなり強力なコマンド引数パーサとしてargparseが使えます。
いろんなオプションをもつコマンドを作ったら、引数の入力も面倒。
ということで、自分の作ったPythonスクリプト専用の補完がzshで効くようにしたいなーと思っていたら、genzshcompというパッケージがありました。

Continue reading

MacからLinuxにssh X11Forwardingする

スズキは出世魚ということで有名ですが、結局何種類の呼び方があるかご存知でしょうか?地方によるようですがなんと4〜5種類。上には上がいて、ボラは6種類。おぼえきれんわ!

さて、MacからLinuxなPCにX転送でsshしたいときの設定、ググればすぐわかるのですが自分の備忘録がてらにメモ。

前提として、普通にLinux同士でのSSH XForwardingまではできてると想定します。
(入り先のsshd_configのX11Forwardingをyesに)

Mac用X端末XQuartzの導入

MacではXが動いてないので、導入する必要があります。
brewでは入れられない模様。

XQuartz download

ダウンロードしてインストールしてください。

これでOK!

% ssh -X foobar@hoge.jp
$ DISPLAY=localhost:10.0 chrominum-browser

高速化Tips

Macに限ったことではないですがX転送を快適にする設定。

.ssh/configを編集して、

Host *
  Compression yes
  CompressionLevel 9
  Ciphers arcfour256

なる設定を追加すると、結構速くなります。
上2つの項目は説明不要でしょう。Ciphersは暗号化方式で、
How to speed up X11 forwarding in SSH – Xmodulo
等に記述がある通り、arcfour256でかなり高速になります。