例題10-1:「インタラクティブに使う」って?

A: さて、例題も10を迎えたことだし、そろそろmatlabの話をしようと思う。

B: なんですか、だしぬけに。

A: いや、もともとこの企画は 研究費の都合 やらなんやらでmatlabを使えない状況でいかに金をかけずに心理実験をやっていくかってトコロから始まってんのね。だから、matlabの話は避けて通れないわけ。

B: はあ、何だか知りませんが怨念がこもってますね。で、なんで例題10だとmatlabとかいうやつの話なんですか?

A: 特に理由はない。まあ例題0から数えて10題終わったんで、ここで初心に帰ってプログラムを作るための環境づくりの話をしようと思ってな。

B: 環境づくり?

A: そう。環境づくり。静かな方が落ち着いて考えられる人もいれば、何か音楽でもかかっている方がいいっていう人もいる。同じプログラムを作るにしても、快適な環境の方が作業がはかどるだろ。

B: そりゃそうでしょうが、じゃあMatlabってのは快適なんですか?

A: ふむ。何が快適かってのは人それぞれ何だが、私の個人的な好みを言うとMatlabはインタラクティブ性が素晴らしい。 プログラムの実行を指定した行で停止させてその時の変数の値を確認したり書き換えたりしながらあれこれ分析することができる。 例えばこれは眼球運動を測定したデータなんだが、こういうでーたは生の数値を見ても特徴を把握しづらい。 Matlabならぱぱっとグラフを描いて、ちょっと試してみた結果を重ね描きしたりとかいった事がかなり楽に出来る。 決まり切った分析をするんじゃなく、いろいろな分析を試してみるときにはとても便利なんだ。

../_images/10-1-01.png

B: へー。

A: こういった作業はpythonに限らず他の言語でももちろん可能なんだが、「可能だ」ってのと「快適」ってことの間には大きな隔たりがある。 まあこのコーナーは「pythonで心理実験」なんでpythonでやることを考えるけど、少なくとも私が試した事があるpython開発環境の多くは、デバッグと作図の両方を快適にこなせないんだよな。

B: デバッグ?

A: プログラムの間違いを見つけて修正する事さ。さっき「プログラムの実行を指定した行で停止させてその時の変数の値を確認したり」って言ったのがそれにあたる。

B: Aさん、セリフ引用長すぎです。

A: デバッグに関しては例題0-1でちょっと名前を出したKomodo IDEがまあいい感じだ。eclipse+PyDevなんかも良さげだったけど、ごく個人的な好みを言うとKomodoの方がしっくりくる。eclipseは重いしな。 でもKomodoが有料なのに対してeclipse+PyDevは無料で使えるんで、まずeclipse+PyDevから試してみるのがお勧めかな?

B: eclipse+PyDevって、それでひとつの名前なんですか?

A: ああ、eclipseという統合開発環境があってだな、eclipseをpythonに対応させるためのプラグインがPyDevだ。

B: プラグイン? webページ見てたら「Flashのプラグインをインストールしてください」とか言われるアレですか。

A: そう。eclipseの機能を拡張するパーツみたいなもんだ。ともかく、このあたりのアプリケーションはなかなか良いんだが、 インタラクティブコンソールでさくさくとグラフを描いては消し描いては消しを繰り返すとエラーを起こして止まってしまう。

B: インタラクティブ? ってなんか聞いてばっかりですね、さっきから。

A: まあ全く説明してこなかった話題だから仕方ないな。これまでの例題のようにエディタでプログラムを書いておいて「えいやっ」とまとめて実行するのではなく、一行ずつコマンドを打ち込んでpythonから結果を受け取るのが双方向のやりとり、インタラクティブというわけだ。 コンソールってのはコンピュータの入出力装置のセットのことなんだが…、どういったらわかりやすいかな。pythonとやりとりするためのプログラムだ。 具体的には例題0-2でコマンドプロンプトを起動してpythonインタプリタを起動した状態を図に示したけど、あれがpythonのインタラクティブコンソールということになる。

B: わかったようなわからないような。

A: ま、とにかく図を何度も描いたり消したりして試行錯誤するには使えないんだよ。 あともうひとつ、インタラクティブコンソールからpythonスクリプトを呼び出しても、スクリプト内で生成した変数にコンソールからアクセスできない。いや、やり方があるのかも知れないけど私は知らない。

B: ???

A: 要するにだな、コンソールでごにょごにょと作業している時に「そうだ、この処理は昨日書いたスクリプトの中でやってるからそこから持ってきたらいいぞ」とか目論んでスクリプトをimportしても、スクリプト内で得られた処理結果をコンソールから得ることは出来ないんだ。 これは名前空間の働きを考えると当然のことなのだが。

B: 名前空間?

A: 関数の説明をした時の「スコープ」を思い出したまえ( 例題5-1 )。「importしたファイルで使われている変数と重複しないように変数名を決めなきゃいけません」って仕様だと大変だろ。だから、importされるファイルで使われている変数は、import *とかしない限りimport元の変数に影響を与えないようになってるんだよ。 とにかく、KomodoやPydevではMatlabの開発環境のような使い方は出来ないんだ。 別にMatlabのように使えないからこれらのアプリケーションがダメだというわけではないんだが、一度Matlabに慣れてしまうとこういった使い方が出来ないのは少々つらい。

B: なんかギャンブルを止められない人みたいですね。

A: んーっっ、と。どうリアクションしたらいいのかわかんない例えだな。ええと。

B: あ、無視して先に進んでください。

A: そうか。で、実はこの問題を全部解決できるパッケージがある。IPythonだ。 こんな感じでさくさくとグラフを描けるし、スクリプトを実行してその中で得られた処理結果をコンソールから利用することも問題なし。

B: さっきのMatlabのグラフと比べると妙に線がカクカクしていませんか?

A: ああ、そりゃMatlabの方は生の眼球運動軌跡のプロットでIPythonの方は注視点の重心を直線で結んだプロットだからな。同じデータをプロットすりゃよかったんだが、面倒だったんもんで。

../_images/10-1-02.png

B: 相変わらずズボラですね…。それにしても、こんな便利なものがあるんだったら、最初からそれを紹介してくれりゃいいじゃないですか。

A: ふむ。それはもっともな文句だが、正直なところこの企画を始めたころはIPythonは「そんなものもある」程度の事しか知らんかったのよ。 おまけにちょっと別の問題があってな。まあそれは次回詳しく話そう。 それからここではIPythonの他にもう一つ、spyderというのも紹介しておこうと思う。見た目はこちらの方がMatlabに近いからMatlabからの移行にはいいと思うし、IPythonの問題も解決されている。

B: じゃあ最初っからこっちを…って、待てよ。こっちはこっちで問題があるとかいうオチじゃないでしょうね。

A: よくわかってるじゃないか。その通り。まあそれを言い出したらMatlabにも問題があるわけで、自分に一番合うものを選ぶか、自分の理想にかなうものを自分で創るしかない。まあ自分で創れとかいいだしたらこのコーナー自体お終いなんで、ここではIPythonとspyderの両方のセットアップを紹介しておこうと思う。まず次回はIPythonから始めるかな。