シリーズ最後のソフトウェアScilab。カテゴリ的にはOctaveと同じ(MATLAB代替的な数値計算OSS)、GUIが昔からあって「CUIソフトウェア」は不正確ですが、CUIだけでグラフを描けるという意味で大目に見て下さい。LaTeXをグラフ内に使う機能を自前で持っているのが、これまで取り上げたOSSにない利点です(前回のpyxplotは外部にLaTeX環境がある前提)。
実行環境
• Windows7 x64 + Cygwin 2.5.1 + ConEmu 150813g
• Cygwin版psql(パッケージpostgresql-client 9.5.3でインストール)
• Scilab 5.5.2(公式サイトのインストーラ使用)
• Windowsの管理者権限ユーザ
psqlが接続したPostgreSQLはWindows版の9.5.3(直接関係ないけど。何らかDBサーバに接続しないとpsqlを使えないので)。
Scilabはインストーラを使って入れた後、プログラムフォルダごと適当な場所にコピーしてポータブルに使いました。同じことはRも可能で、インストール先にしばられないのが利点。手順の詳細は次項にあります。
冒頭に書いたとおりScilab単独でLaTeXをグラフ内へレンダリングでき、元になってるのはJavaのライブラリ(JLateXMath)。グラフやGUI自体もJavaで、インストール時にJREがプログラムフォルダに展開されます。Windows上で、LaTeX文書でなく数式等の素材を作る環境としてはScilabが最も手軽かも。
今回の実行環境とは別に、職場のPC(Win7 x64 標準ユーザ、Javaインストール済み)でScilab起動を試みたらJava関連のエラーが出て駄目でした。この環境はOctaveのグラフ表示もNGなので特殊だと思いますが、一応メモ。
準備 … Scilabインストール
インストーラscilab-5.5.2_x64.exeを起動し、ライセンス同意、プログラムフォルダ指定と進みます。ここまでは普通。
次のコンポーネント選択が重要。デフォルトがフルインストールで、このまま進めないと起動しませんでした。当初CUIとグラフが描ければいいや~と取捨選択したところ、どう組み合わせても起動時にエラー。とりあえず「触らぬ神に崇りなし」状態です。
↓ スタートメニュー、拡張子の関連付け等の設定を経てインストール開始。この後ポータブル化するので関連付けは全部外しました(アンインストーラが消すと思うけど)。
↓ プログラムフォルダ下はこんな感じ。丸ごと適当な場所にコピーし、アンインストーラでScilabを消去。この状態で、コピーした中のbinフォルダにある実行ファイルが動くか確認します。
ScilabDir
|-- .atoms
|-- bin
|-- Scilex.exe
|-- WScilex.exe
|-- contrib
|-- etc
|-- java
|-- libs
|-- locale
|-- modules
|-- thirdparty
|-- tools
WScilex.exeがGUIの方。ダブルクリックすると ↓ 自分が知ってるOSSのスプラッシュでは最もオシャレなのが現れ、問題なく起動しました。GUIと言ってもMATLABやOctaveと同様、メインはコンソール。
残念なのはコンソールのキャレット(テキストカーソル)が常時点滅しており、止める設定が見つからないこと。せっかくですがGUIは当面使いません…。
CUIは2種類あり、一つは本当にコンソールしか使わないモード。グラフを別画面に出すことも不可(Octave-cli.exeはできた)。もう一つはグラフやヘルプなど部分的にGUIが起動するモード。今回使うのは後者で、Scilex.exeのデフォルトもこちらです。
↓ コマンドプロンプトからCUIを起動すると、GUIを使える方はコンソールの色が反転します(画像の上が純CUI、下がGUI可)。デフォルトのプロンプトは-->。
↓ 起動オプションはいろいろあるけど、CUIを大別すれば以上2つです。
> Scilex -h
scilex : run Scilab.
Arguments: passes Arguments to Scilab, This Arguments can be retreived
by the Scilab function sciargs.
-e Instruction: execute the scilab instruction given in Instruction argument.
-f File: execute the scilab script given in File argument.
'-e' and '-f' options are mutually exclusive.
-l lang: it fixes the user language.
-mem N: set the initial stacksize.
-ns: if this option is present the startup file scilab.start is not executed.
-nb: if this option is present then Scilab loading message is not displayed.
-nouserstartup: don't execute user startup files SCIHOME/.scilab or SCIHOME/scilab.ini.
-nw: start Scilab without specialized Scilab Window.
-nwni: start Scilab without user interaction (batch mode).
-nogui: start Scilab without GUI,tcl/tk and user interaction (batch mode).
-texmacs: reserved for WinTeXMacs.
-version: print product version and exit.
今回、Scilabの「CUI+部分的にGUI」のモードをConEmuで使いますが、今いちだったのは自動的にカラーが反転されても周辺がそのまま ↓ なこと。ConEmu側で色設定をいろいろ変更してるうち色が元に戻りますが(画像の下)、初めから無効にしたいので早急に調べ、解決したらここに追記します。
Scilabにはtitlepageという、グラフの代わりに文字を大書するスライド向け?の関数があり、ここにもLaTeXを ↓ 使えます。BMPやPDF等に保存できるので、素材として数式を作っておくのに便利。
--> titlepage('_{n}\mathrm{C}_{r} = \frac{n!}{(n-r)!r!}')
確認 … Cygwinシェルからの起動、データの渡し方
前項でのScilab起動はWindows上でbinフォルダからでしたが、ここではCygwinシェルで任意の場所から起動する条件を調べます。普通にフルパスで指定すると ↓ 環境変数SCIHOMEがないというエラー。
$ d:/works/scilab/current/bin/scilex
Error: Impossible to define SCIHOME environment variable.
SCIHOMEがbinフォルダの上(インストールで作られたプログラムフォルダ)を指すようにして再度試みると ↓ 無事起動しました。
$ export SCIHOME=d:/works/scilab/current
$ $SCIHOME/bin/scilex
Scilab 5.5.2 (Mar 31 2015, 12:04:21)
-->
他のソフトウェアと同様、起動時オプションの-eでコマンドを渡せます(前項の起動時オプション参照)。一方パイプで渡したものは、OctaveやRと同様にスクリプトとして実行。またドキュメントのDifferent execution modes of Scilabのページには ↓ パイプとコマンドライン引数を同時に使うこともでき、パイプで渡した内容が後に実行されるらしいです。
Arguments + pipe
...
"Even when Scilab is used through a pipe, it is possible to use the arguments. Arguments are processed first."
載っているサンプルを実行すると ↓ 確かにそうでした。まず-eで渡したコマンド(円周率を表示)が実行され、次にパイプ(円周率×2を表示)が実行されてます。
echo 'disp(%pi*2)' | $SCIHOME/bin/scilex -e 'disp(%pi)'
Scilab 5.5.2 (Mar 31 2015, 12:04:21)
3.1415927
6.2831853
$
というわけでgnuplotやRのように「データをパイプで渡す」のは不可。コマンドはパイプでも-eでも渡すことができ、以下では後者に一本化します。
↓ テスト。環境変数にパス(+パージョン表示を消す-nb)を入れて起動を簡単にします。tmp6という一時ファイルに2列3行のデータを保存し、-eオプションに続けてグラフ化コマンドを入力して実行しました。
$ export scilab="$SCIHOME/bin/scilex -nb"
$ echo '1 2
3 9
9 6' > tmp6
$ $scilab -e 'd=fscanfMat("tmp6"); plot(d(:,1), d(:,2))'
-->
グラフが別ウィンドウに出たけど、コンソールにフォーカスを戻し対話シェルで待機する動作でした。だから場合によってはグラフが隠れます。gnuplotやOctaveでは対話シェルに留まるため別のオプションが必要、Rは対話シェルに戻れず終了、Scilabはどちらとも違って対話シェルに戻るのがデフォルトという…まぁいろいろですね。
ところでデータ読み込みの際、Octaveではload関数を使いました。Scilabにも同名の関数があるものの同じようには使えず、代わりにデータファイルを行列として読み込むfscanfMatを使用。
↓ もう一つテスト。今度は対話シェルに戻らずグラフを出して止め、閉じるかグラフ内クリックでBashシェルに戻ります。Octaveで使ったwaitforのようなメソッドがあれば「グラフを閉じた時だけ」シェルに戻れるけど、それは今のところ見つからず、代わりにクリックイベントを待つxclickを使用。次のexitでBashに戻ります。
$ export scilab="$SCIHOME/bin/scilex -nb"
$ echo '1 2
3 9
9 6' > tmp6
$ $scilab -e 'd=fscanfMat("tmp6"); plot(d(:,1), d(:,2)); xclick; exit'
意図せずグラフ内をクリックして閉じられると困るので、何かOctaveのwaitforと同じことができないか引き続き調べ、分かったら追記します。
ここまでが準備と確認。長かったですが、結局Scilabのグラフ表示をシェルから使うパターンは上記2つしかありません。次項でそれぞれをpsqlからやってみます。
psqlからデータを渡してプロット
↓ グラフを出して止める例です。最初に環境変数をセット、続いてクエリ結果の出力を「データだけ、半角空白区切り」に。そしてクエリ、結果を\gコマンドで一時ファイルに入れ、\!でScilabを起動して-eオプションでコマンドを渡してます。
-- set environmental variables
# \setenv SCIHOME 'd:/works/scilab/current'
# \setenv scilab `echo $SCIHOME`'/bin/Scilex -nb'
-- set output format
# \f ' ' \\\t on \\\pset format unaligned
-- query and send command to scilab
# select x, y, sin(r) / r
from generate_series(-8, 8, 0.4) as x,
generate_series(-8, 8, 0.4) as y,
cast(sqrt(x^2 + y^2) + 1e-9 as float) as r
\g tmp6
# \! $scilab -e 'd=fscanfMat("tmp6"); nc=length(unique(d(:,1))); surf(matrix(d(:,3), nc, nc)); f=get("current_figure"); f.color_map=[1,1,1]; xclick; exit'
クエリ内容はOctaveの回から毎回使っているソンブレロの3次元座標。surf関数で面的に描画してますが、デフォルトは色付きで、配色があまり好きでないので全部白に。対話シェルでは ↓ と短く書けるところ、なぜか-eオプションではエラー(facecolという変数が未定義と)。なので別の方法にし、コマンドが長くなりました。
surf(MATRIX, 'facecol', 'white')
同様に「対話シェルでは使えても-eオプションでは不可」な構文があるかも。そう考えると-e以下の記述は最低限にし、対話シェル中心に使うのが現実的な感じ。例えば ↓ こんな風に。クエリは上と同じなので\gコマンドで再実行してます。
-- set environmental variables
# \setenv SCIHOME 'd:/works/scilab/current'
# \setenv scilab `echo $SCIHOME`'/bin/Scilex -nb'
-- set output format
# \f ' ' \\\t on \\\pset format unaligned
-- query and send command to scilab
# \g tmp6 \\\! $scilab -e 'd=fscanfMat("tmp6")'
--> nc=length(unique(d(:,1)));
--> surf(matrix(d(:,3), nc, nc), 'facecol', 'interp')
--> title '$\large z=\frac{\sin(\sqrt{x^2+y^2})}{\sqrt{x^2+y^2}}$'
この配色がデフォルトという…まぁ色の好みはそれぞれです。グラフウィンドウから保存したPDFはこちら(356kB)。文字は全部アウトライン化され、ファイルサイズは増えますが環境による崩れはありません。特にLaTeXを使った場合に安心。
今日を含め6回、pqslと「グラフを描けるCUIソフトウェア」の連携をOSS別に書いてきました。gnuplot、Octave、R、pyxplotそしてScilabと、グラフ描画コマンドはもとよりシェルからの使い勝手も結構違って意外。使用場面による向き不向きも大きいと思いました。次回は全体のまとめを書く予定です。