Processing

このあいだ、スーパーへ買い物に行ったら、色取り取りな ”やしょうま”が並べてあった。 女房に余計な物を買って来てと怒られるのを承知で、思わず買ってしまった。だって、懐かしいんだもん。

家へ帰って、こんなの売ってたよと言うと、女房も懐かしいと言って、早速試食しましたよ。でも、なんで この時期に、やしょうま なんだ? 女房に聞いてみると、お彼岸とかお釈迦様とか脈略の無い答えが 返ってきた。

こちらのページによるとやっぱり、お釈迦様 が関係してるっぽい。でも本当かな? まあ、昔の事だから、信じてあげよう。

こちらには、やしょうま名人 がおられるようだ。

ひょっとして、クックパッド あたりに、登録されてりして。丸いバージョンばかりでなくて こういうバージョンもあるのね。 知らんかったよ。

SWRへの変換

前回、やっと手動でAA-30から測定データを取り出せるようになった。本来なら、手動を自動で出来るように したい所だけど、目の前にデータがあるなら、先にそれを眺めてみるのも良かろう。 戦略は、CSVデータが 入ったファイルを受け取って、それをSWRデータに変換(ファイル化)し、それを、gnuplotへ送り込んで グラフを眺めると言う、分業である。AntScope.exeみたいに、みんな入りと言うWindowスタイルじゃなくて unix流だな。

AA-30のSWRグラフを見ると、縦軸が対数表示っぽい。SWRの1-2付近を良く見せてあげたいと言う親心かな。 対数表示のグラフなんて面倒臭そう。でも、gnuplotなら、ほいと指定するだけで対数軸に対応してくれる から、楽ちんだな。あれ? 人によってはEXCELのグラフでもいいじゃんと思うかも知れんけど、対数軸って EXECLで実現してたっけ? 後で調べておこうかな。 gnuplotでスミスチャートは扱えるみたいだ。

#!/usr/local/bin/gosh
; Usage: ./swr.scm csv-file

(use text.csv)
(use srfi-26)

(define (read-csv file)
  (call-with-input-file file
    (cut port->list (make-csv-reader #\,) <>)))

(define (make-z field)
  (cons (string->number (car field))
        (make-rectangular (string->number (cadr field))
                          (string->number (caddr field)))))

(define (show-swr fz)
  (print (car fz) "  " (swr (cdr fz))))

(define (swr z)
  (let1 a (/ (- z 50) (+ z 50))
    (/. (+ 1 (abs a)) (- 1 (abs a)))))

(define (main args)
  (let1 fz (map make-z (read-csv (cadr args)))
    (for-each show-swr fz)))

以前、ちょろっとSWRの検算をした時に使った物を元に組み立てた。

[sakae@cdr ~/tmp]$ ./swr.scm mla.csv
1.0  34.69311869726476
2.0  34.20477894057897
 :
29.0  8.790955342971857
30.0  9.449837636310281

計算結果を標準出力へ出すように作っておくのもunix流かな。必要なら、結果をリダイレクトするだけで ファイルに落とせるし。

Gauche(gosh)は、CSVファイルを処理するモジュールが同梱されているので、試しに 使ってみた。(カンマを目印にsplitと言う手もあるけど)肝は、read-csvだ。この手続きは、CSVファイルを 引数として取る。

gosh> (read-csv "mla.csv")
(("1.000000" "1.82" "25.62") ... ("29.000000" "39.20" "-115.83") ("30.000000" "15.01" "-66.68"))

そして、上記のように各行(レコード)をフィールドに分解したリストを返してくれる。

cutなんて言う見慣れないものを使っているが、冗長に書くなら

(call-with-input-file "ファイル名"
  (lambda (in)
    (port->list (make-csv-reader #\,) in)))

肝は、portから受け取った1行を加工(この場合は、カンマで分解)して、それをリストにして返す手続きだ。 これ、上手に使うと抽象化が綺麗に出来るね。例えば、RS232Cのポートから1行返すようにしておくとか すればいいんだ。

gosh> (map make-z (read-csv "mla.csv"))
((1.0 . 1.82+25.62i) ... (29.0 . 39.2-115.83i) (30.0 . 15.01-66.68i))

次は、read-csvが返してくるリストを、(周波数 . インピーダンス) と言うドット対に変換してる。こうして 変換しておけば、後の処理が楽になるからね。説明はこれぐらいにしておこう。そうでないと、Schemeの講座に なっちゃいそうだから。

シリアル通信

さて、いよいよTeraTermの代わりだな。今までgaucheを使ってきたんで、gaucheで何とか出来れば良いんだけど。 Windows用のgaucheは有志が公開してくれているんだけど、unixとのマナーの違いにより、unix版と全く 同様には扱えないのが辛い。特にプロセスとかコンソール系とか。。。

gaucheでシリアルってやった事ないけど、同梱のgauche--termios.soを使う事に為るな。Windows版に相当品が 有るかなあ? 調べてみたら、mingwでコンパイルされたdllが入っていた。果たして同様に使えるのか? 先を急ぐなら、別な手段を検討しておいた方が良さそう。(野生の勘ってやつです)

aa-analyzerでは、Perl使ってたな。肝に なる部分は、RS232Cとのやり取り。Windows用のActivePerlを使うとして、Device::SerialPort は、 サポートしてるかな?

調べてみたよ。そしたら シリアルポート制御とか、ずばり ActivePerlによるシリアルポートの利用(Windows) なのが出てきた。更には使用例も。 でも、自分に取ってははまり道な気がするので、迂回する事にします。何故って、トラブッた時に、Windows では、脱出方法を知らないからです。地雷源を好んで歩かなくてもと言う気持ちです。そう、戦場へ行かなく なった戦場カメラマンみたいなもんです。(笑)

ここは正統派でC言語ですかね。おいらのWindowsには、VCじゃなくて、昔懐かしいボーランドのbccが入って いる。だって、VCはマイクロソフト製でMS嫌いなのと重いんだもん。bccで使えそうな、COMnの制御方法を 調べてみる。

C 言語による RS-232C 通信プログラミングとか 夢工房さんとか RS232C シリアル通信とか シリアル通信(API)が見つかった。面倒ですな。出来る事なら、Windows系 なんて魔窟に迷いこみたくないよ。

気を取り直して、もう少し彷徨ってみるか。。。。

Processing

で、さまよった末に見つけたのが、 Processingプログラミング入門。本が手元に無い から何とも言えないけど、wiiもコントロール出来るとか。MITのメディアラボって、Lisp発祥の地のAIラボの 隣なんでしょうかね。

兎に角、本家を訪れて、試しに頂いてきた。何か資料は無いかと思って 探してみたらIBM developerWorks に、要領よい記事が出ていた。

どうやら言語が扱う領域がメディア関係って事で色だ画像だと派手だけど、ちゃんとシリアルやネットや オーディオもサポートしてるみたい。まるで、平成BASICだな。

早速、processingを起動して、ファイルメニューからexampleを辿ってみると、ライブラリーと言う項目の中に シリアル例が出ていた。

/**
 * Simple Read
 * 
 * Read data from the serial port and change the color of a rectangle
 * when a switch connected to a Wiring or Arduino board is pressed and released.
 * This example works with the Wiring / Arduino program that follows below.
 */

import processing.serial.*;

Serial myPort;  // Create object from Serial class
int val;      // Data received from the serial port

void setup() 
{
  size(200, 200);
  // On Windows machines, this generally opens COM1.
  // Open whatever port is the one you're using.
  String portName = Serial.list()[0];
  myPort = new Serial(this, portName, 9600);
}

void draw()
{
  if ( myPort.available() > 0) {  // If data is available,
    val = myPort.read();         // read it and store it in val
  }
  background(255);             // Set background to white
  if (val == 0) {              // If the serial value is 0,
    fill(0);                   // set fill to black
  } 
  else {                       // If the serial value is not 0,
    fill(204);                 // set fill to light gray
  }
  rect(50, 50, 100, 100);
}

例によって、お絵描きだけど、本質部分は、setup関数の中のSerial手続きだな。ここで細かい設定が 出来るんだろうか?http://processing.org/reference/libraries/serial/Serial.html を調べてみると

Constructor 	

Serial(parent)
Serial(parent, rate)
Serial(parent, name)
Serial(parent, name, rate)
Serial(parent, name, rate, parity, databits, stopbits)

Parameters 	
parent 	PApplet: typically use "this"
rate 	int: 9600 is the default
name 	String: name of the port (COM1 is the default)
parity 	char: 'N' for none, 'E' for even, 'O' for odd ('N' is the default)
databits 	int: 8 is the default
stopbits 	float: 1.0, 1.5, or 2.0 (1.0 is the default)

どうやら、シリアルラインの細かい設定が可能なようだ。後は、Serial Duplex あたりのソースを土台に して、カスタマイズしてけば良さそうだな。

この他、ライブラリー系のサンプルとしてnetとかaudioがある。今までのJavaだと、JNIとか異常に巨大な Java Soundとかを解読せにゃならんかったけど、これからは楽出来そう。おまけに、Linuxでも動くしね。

TeraTerm

今、ふと思ったんだけど、TeraTermってマクロ無かったっけ? 端末ソフトなんで、マシンへの自動ログイン とかをやらせたいって要望はきっとあるはず。そのためにマクロをサポートしてますって、きっとあるだろう。

TeraTermのHelpを見たら、MACROの項目が有ったよ。しっかりコマンドレファレンスも付いていた。あんまり 有りすぎて、何から手を付けていいやら。こういう時は参考書を探してくればいいんだな。

Tera Termマクロ活用入門(1):各種ログインを自動化する

Tera Termマクロ活用入門(2):リモートマシンを自在に操作する

マクロサンプル:

terminal macro

切りが無いのでこれぐらいにしとくけど、結構面白そう。