見える化するぞ

今朝のテレビで、最近ハイボールが流行ってまーす なんて紹介してた。砂糖水に炭酸を 加えれば、子供の飲物サイダーになり、ウィスキーに炭酸を加えれば、大人の飲物はいボ ール。

幸い家には、炭酸水ダイエットと称して、「ただの炭酸水」という何ともなネーミングの やつがたくさんあるので、後はウィスキーを仕入れてくるだね。買いに行ったら、おいし いハイボールの作り方 なんていうコピーが、至る所に張ってありました。 知らず知らずのうちに、乗せられましたなあ。まあ、いいけど。

健康重視 & (子供 | 大人)なら、 赤じそジュースが、お勧めです。(教えて頂いたMさん、ありがとう)

前回の落ち穂拾い

前回は、PCMなサウンドファイルを読み込んで、リストにする所までやった。あれから、 久しぶりに、Gauche本を開いてみたら(もう、1年は経っているよな)、Gauche特有な 便利機能をすっかりと忘れていた事に気がついた。たとえば、

(set! M (cons (func fp) M)))

は、よく出てくる表現なので

(push! M (func fp))

と書いてもいいよとか、

(lambda (v) (> v 10000))

は、今風に

(cut > <> 10000)

で、いいよとか。ちょっと、lambdaが消えちゃうのは、淋しい気もするが、これも有りかなと思う次第。<> て、ブレースフォルダーと言うそうで、ラリーおじさんが発明したものなのかな?

見える化?

長い々リストが出来上がる訳だが、ちょっと扱いに困る。使い易いように、短く切って おきたいよね。丁度、先ほどの昼食に食べたソーセージ。一本丸毎じゃ食べずらいけど、スライスしてあれば、食べ頃になるのと一緒。リストをスライスする道具もGaucheには、ちゃんと用意されている。

gosh> (wave-info sound-file)
Mono 22050 16  441000
#<undef>
gosh> (use util.list)
#<undef>
gosh> (length M)
220500
gosh> (define x (slices M 1000 :fill 0))
x
gosh> (length x)
221

データ数 1000個毎に分割してみた。(最後が、1000個に満たない場合は、満たない部分を0で補うように指定)この結果、221個のリストが生成された。

でも、(list-ref x 123) 等としても、1000個のデータが、バーと表示されるだけで、やはり、ピンとこない。こういう時には、グラフを書かせるのが一番!

グラフをお手軽に書くには、Rとかgnuplot等があるが、今回は起動の早さを買って、gnuplotを使ってみる事にする。(昔もやったような ...) gnuplot用にデータファイルをいちいち用意するのも面倒なので、何か逃げ手がないかと探してみると、 Perlで書かれた例が見つかった。有難く、頂戴して gauche へ移植してあげよう。

(use gauche.process)

(define (make-graph lis)
  (let* ((png (string-append (symbol->string (gensym)) ".png"))
         (gp #`"set terminal png
               set output \",png\"
               plot \"-\" with line\n"))
    (call-with-output-process "/usr/local/bin/gnuplot"
                              (lambda (port)
                                (display gp port)
                                (for-each (cut format port "~a\n" <>) lis)
                                (display "end\n" port)))
    png))

(define (show lis)
  (sys-system (string-append "/usr/local/bin/xv "
                             (make-graph lis))))

make-graph は、指定されたリストを、折れ線グラフの入った pngファイルにしてくれるものだ。ファイル名は、gensymで勝手に決めてくれる。面倒なくて楽チン。 ファイルが出来れば、ついでに見たいと言うのが人情なので、xvを使って、その場で表示してくれるものぐさぶりです。

gosh> (show (list-ref x 100))
0

なお、グラフを見た後のごみファイルは、GCされませので、rm G*.png とか、手動でお願いします。

上記に少し手を加えれば、3Dグラフも出来そうだ。その場合は、データブロック間の区切りとして、2個の改行を挟めばいいとか。後で、やってみよう。