見える化するぞ
今朝のテレビで、最近ハイボールが流行ってまーす なんて紹介してた。砂糖水に炭酸を 加えれば、子供の飲物サイダーになり、ウィスキーに炭酸を加えれば、大人の飲物はいボ ール。
幸い家には、炭酸水ダイエットと称して、「ただの炭酸水」という何ともなネーミングの やつがたくさんあるので、後はウィスキーを仕入れてくるだね。買いに行ったら、おいし いハイボールの作り方 なんていうコピーが、至る所に張ってありました。 知らず知らずのうちに、乗せられましたなあ。まあ、いいけど。
健康重視 & (子供 | 大人)なら、 赤じそジュースが、お勧めです。(教えて頂いた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個の改行を挟めばいいとか。後で、やってみよう。