見える化するぞ(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

へぇー、便利だなぁ。