見える化するぞ(3D Version)
数日前から、Firefox3を起動すると、頼みもしないのにFirefoxのWindowが2枚表示され るようになってしまった。それぞれのWindowで、別々なページを表示出来るのは 良いのだが、ちとうっとうしい。どちらかのWindowから終了を選ぶと、もう片方の Windowsもいなくなる。
いくら私が二卵生双生児だからと言って、Firefoxまで、二卵生にならなくてもいいんだよ。プロセスを見ると、1個しかFirefoxが立ち上がっていない事になっているから、 これは、ひょっとして、双子の開発者が仕込んだ、秘穴をつ突いてしまったの だろうか?
このまま使い続けるのもいやなので、$HOME/.mozilla をバックアップしてから、消してみた。再度、起動してみると、1Windowしか表示しない、正常モードに戻りましたとさ。 やれやれ、bookmarks.html を戻しておこうと、コピーするも、1年ぐらい前のものに しか戻らなかった。ひょっとして、sqliteDBで管理するようになっちゃんでしょうか?
gnuplotのお勉強
これを機会に、Windowsにも gnuplotを入れてあげた。アプリケーションは、 マルチプラットフォームで動いてくれないと、不便で困るからだ。某M$でしか動かない Word/Excel等に対抗して、OOが頑張っているのには、頭が下がる思いです。
gnuplotも、Windowsで動くだけでも嬉しいのに、メニューやヘルプまで、日本語化する データを提供してくださる方がおられ、ありがたい限りです。
初回の起動時に、Windowsの文字がちいさ過ぎて見えないという難があり、解決法を 探してみた所、みな同じ悩みがあったようです。画面上でマウスクリックして、 フォントサイズを変更。そしてUpdate。一手間なんですけど、最初から初期値を 変えておいて頂いた方が楽になりますだ。
インストール後、demoに直行して、豪華ケンランなデモを眺めました。all.demを クリックして、gnuplotを指定してあげればOK。上映時間(スライド風ですけど)30分 ぐらいでしょうか。もういいよと言うぐらい、見所を堪能できました。
その中から、使えそうな表現を見つけ、どんなソースになっているか調べようとしたら、 はて、どこに書かれているかなあ、となっちゃいました。
一計を案じて、gnuplotを先に立ち上げ、そこから load "all.dem"したら、今、ここを 上映してまーす、って、出てきましたよ。後は、お目当てのファイルから、必要部分を 切り出して、それで動くか見て、ヘルプを調べてみるのが良いです。
gauche で gnuplot (3D Version)
上記demoで気になったのは、serface1.dem(16)にあるやつでした。調べてみたら、媒介 変数を使って書いてるんですね。こりゃ、尻尾を巻いて退散するしかありません。だって、非常に時間がかかりそうなんだもん! ここは、素直に行きます。
(define (gp-data lis pos n-frame port) (define (frame-dump lis x y) (if (null? lis) (display "\n\n" port) (begin (format port "~a ~a ~a\n" x y (car lis)) (frame-dump (cdr lis) x (+ y 1))))) (dotimes (x n-frame) (frame-dump (list-ref lis (+ pos x)) x 0))) (define (make-graph-3d lis pos n) (let* ((png (string-append (symbol->string (gensym)) ".png")) (gp #`"set terminal png set output \",png\" set view 60, 45 set ticslevel 0 splot \"-\" with line\n")) (call-with-output-process "/usr/local/bin/gnuplot" (lambda (port) (display gp port) (gp-data lis pos n port) (display "end\n" port))) png)) (define (show3d lis pos n) (sys-system (string-append "/usr/local/bin/xv " (make-graph-3d lis pos n)))) (define (dump3d lis pos n) (let ([output-file (string-append (symbol->string (gensym)) ".txt")]) (call-with-output-file output-file (lambda (port) (gp-data lis pos n port))) output-file))
長いデータを分割して、
((1 2 3 ..) (2 3 1 ...) (1 1 3 ...) ..... ) ; <== lis 0 1 2 ; <== フレーム番号
このようなリスト(lis) の 何番目リストから(pos)、幾つ分(n) の小リストを 拾い出すかと言う事にしました。(小リストは、フレームと言えばいいかな)
gosh> (show3d x 30 10)
これで、xというリストの 30番目のフレームから、10個分のフレームを表示して くれます。出来上がったのは、PNGファイルなので、ただ見るだけです。PNG作成に 使ったパラメータを、そのまま、dump3dに与えてやると、gnuplot形式のデータ (と言っても、ただデータが並んだテキストファイルですが)を、ファイルに 落せます。
後は、gnuplotを立ち上げて
gnuplot> splot "G143.txt" with line
とすると、グラフをマウスを使って、ぐりぐりと回転させられます。同じデータでも、 文字通り、見る方向によって、違って見え、楽しめます。
今日の得した気分
これで、入口と出口は出来た。後は、どう分析するかというのを捻り出せばいい。 まず思いついたのは、フレーム毎に FFT してみるかだ。
FFTは、ケント教授の例を頂いてくればよい。そして、FFTした結果を、slice-at で、半分だけ取り出し、abs して、log10 したのを、show (or show3d)すれば良い。
所で、log は、log10 だよな。えーと、考えこんじゃった。
-- Function: exp z -- Function: log z -- Function: log z1 z2 ..... [R5RS][R6RS] 超越関数です。複素数も扱えます。 2引数の`log'はR6RSで追加されたもので、Z2を底としたZ1の対数を 返します。
gosh> (log 3 10) 0.47712125471966244
へぇー、便利だなぁ。