PowerShell

『沈黙の春』(レイチェル・カーソン著、新潮社)を読んだ。

化学物質による環境汚染の警告の書だ。殺虫剤やら除草剤により環境が破壊され、春になっても鳥の 鳴き声さえ聞こえないと言う不気味な世の中になってしまったという、恐ろしい現実を報告している。

たとえ微量の薬品でも、地下にもぐり水や微生物を汚染する。生物の食物連鎖により、毒が増幅され連鎖の 頂上にいる生物達に甚大な被害をもたらす。1960年代に書かれた本だけど、化学薬品の恐ろしさを的確に 警告してる。

マグニチュード9の地震により原発が甚大な被害を受けた。想定外の津波に襲われて、冷却系統のポンプ だかが正常に機能しなくなったのが破滅への引き金になったと言われている。

想定外って便利な言葉だなあ。5mの津波を想定してたとか。一応想定しましたからね、人知を超える 所での問題ですから、責任はありませんよと逃げ道が、きっちり確保されてます。

こういうのの安全係数って幾つなの? 楽観すぎやしませんか? それとも、費用対効果で手を抜いたか だな。一度の事故が未来永劫、大きな負の遺産になる事を思えば、費用対効果なんて事を言ってはいられないと 思うんだけど。

核廃棄物は、人里離れた青森県に捨ててしまえば問題無しって、企業のバックにいる国家のエゴだよなあ。安全な原発と 言うなら、皇居あたりに作るがよろし。地産地消で、配電系に金をかけなくても済むぞ。憤懣やるかたない ですな。

『沈黙のコマーシャル』、CMの多様性が失われて、繁殖したのはAC Japanだ。洗脳と言う害毒が 撒き散らされている。 うざいのでTVを消して 節電に協力してねって言う裏メッセージなんだな。みなさん、協力しましょ。

ああ、とりとめもないことを書いてしまったわい。

地雷源へ

前回、TeraTermの代わりになりそうなやつを検討したけど、一番手軽そうなのは、パアルで動かしちゃう 方法。但し地雷注意の事だけど。。。

[sakae@cdr ~/tmp]$ perldoc Device::SerialPort
  :
AUTHORS
        Based on Win32::SerialPort.pm, Version 0.8, by Bill Birthisel
        Ported to linux/POSIX by Joe Doss for MisterHouse
        Ported to Solaris/POSIX by Kees Cook for Sendpage
        Ported to BSD/POSIX by Kees Cook
        Ported to Perl XS by Kees Cook

        Currently maintained by:
        Kees Cook, kees@outflux.net, http://outflux.net/

SEE ALSO
       Win32API::CommPort

       Win32::SerialPort

       perltoot ? Tom Christiansen’s Object‐Oriented Tutorial

地雷に吹き飛ばされないように、一応下調べ。Win32版の方がオリジナルなのね。知らんかったよ。 取りあえず、ActivePerlを入れた。そして、ppm(Perl Package Manager)から、Win32::SerialPortを 入れてあげた。このppmってGUI操作が出来て便利だな。Rubyのgemにも同じようなやつがあるのだろうか?

そして、オリジナルのスクリプトを少々改変

[sakae@cdr ~/tmp]$ diff -u aa-analyzer.pl win-aa-analyzer.pl
--- aa-analyzer.pl      2011-03-25 09:26:46.000000000 +0900
+++ win-aa-analyzer.pl  2011-03-25 09:31:09.000000000 +0900
@@ -45,7 +45,7 @@

 use strict;
 use Getopt::Long;
-use Device::SerialPort qw( :PARAM :STAT 0.07 );
+use Win32::SerialPort qw( :PARAM :STAT 0.19 );
 use Math::Trig;
 use File::Basename;
 use POSIX qw(strftime);
@@ -242,7 +242,7 @@
 # Open the serial port to the RigExpert antenna analyzer
 # ============================================================

-my $PortObj = new Device::SerialPort($infile) || die "Cannot open $infile";
+my $PortObj = new Win32::SerialPort($infile) || die "Cannot open $infile";

 $PortObj->reset_error;

@@ -259,7 +259,7 @@

 $PortObj->save($ConfigFile);

-$PortObj = tie (*FH, 'Device::SerialPort', $ConfigFile) || die "Cannot tie: $!\n";
+$PortObj = tie (*FH, 'Win32::SerialPort', $ConfigFile) || die "Cannot tie: $!\n";

 # Double check the comm settings
 if ($debug) {

取りあえず走らせてみると

c:\homes\WORK>perl win-aa-analyzer.pl -i COM8 -aaver
アクセスが拒否されました。
can't open device: \\.\COM8
 at win-aa-analyzer.pl line 262
signature = Win32::SerialPort_Configuration_File -- DO NOT EDIT --
class = Win32::SerialPort
name = \\.\COM8
Cannot tie:

あーあ、やっぱり地雷が埋まってた。アクセス拒否で、(ネク)タイが出来なかったとな。 あのー、おいらとっくの昔にサラリーマンを辞めてるんですけど! それにしても、見慣れないデバイスだな。

コンフィグファイルが出来てて、それを使って、ファイルハンドルと結合させる んかな。スクリプトを読むと、そんなファイルが指定されてた。

c:\homes\WORK>type .aa-xxx-cfgFile
Win32::SerialPort_Configuration_File -- DO NOT EDIT --
\\.\COM8
CFG_1,none
eol,10
clear,-@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@-
RCONST,0
istrip,0
ALIAS,COM8
BAUD,38400
PARITY,none
DATA,8
STOP,1
HSHAKE,none
  :

上記のエラーに出てくるやつは、コンフィグファイルの一部を表示してるんだな。(良く見ると CSVファイルだな)それにしても デバイス名の冒頭に付いているやつは、難だ? perldoc する鹿。

    The PortName maps to both the Registry *Device Name* and the
    *Properties* associated with that device. A single *Physical* port can
    be accessed using two or more *Device Names*. But the options and setup
    data will differ significantly in the two cases. A typical example is a
    Modem on port "COM2". Both of these PortNames open the same *Physical*
    hardware:

      $P1 = new Win32::SerialPort ("COM2");

      $P2 = new Win32::SerialPort ("\\\\.\\Nanohertz Modem model K-9");

    $P1 is a "generic" serial port. $P2 includes all of $P1 plus a variety
    of modem-specific added options and features. The "raw" API calls return
    different size configuration structures in the two cases. Win32 uses the
    "\\.\" prefix to identify "named" devices. Since both names use the same
    *Physical* hardware, they can not both be used at the same time. The OS
    will complain. Consider this A Good Thing. Use alias to convert the name
    used by "built-in" messages.

      $P2->alias("FIDO");

    Beginning with version 0.20, the prefix is added automatically to device
    names that match the regular expression "^COM\d+$" so that COM10, COM11,
    etc. do not require separate handling. A corresponding alias is created.
    Hence, for the first constructor above:

      $alias = $P1->alias;    # $alias = "COM1"
      $device = $P1->device:  # $device = "\\.\COM1"

    The second constructor, start is intended to simplify scripts which need
    a constant setup. It executes all the steps from new to write_settings
    based on a previously saved configuration. This constructor will return
    "undef" on a bad configuration file or failure of a validity check. The
    returned object is ready for access.

perlと言うかWindowsは良く分からないので、潔く離脱します。で、もっとやさしそう なのに目を向けてみます。(何せ、ヘタレですから)

MACRO

名前に惹かれて飛んできましたよ。マクロなんて括弧いいじゃん。ああ、括弧が無いから ruby風に言えば、DSLだな。

と言う事で、TeraTermでマクロします。。 参考書を元にあれこれやって出来上がったのが、下記のやつ。

inputbox 'Freq in KHz' 'Center Freq' '7000'
f = inputstr
strconcat f '000'
fcmd = 'fq'
strconcat fcmd f

inputbox 'Scan in KHz' 'Scan Range' '1000'
s = inputstr
strconcat s '000'
scmd = 'sw'
strconcat scmd s

inputbox 'points' 'Number of scan points' '20'
p = inputstr
pcmd = 'frx'
strconcat pcmd p

connect '/C=8'  ; ######### COM8 ##############

sendln 'VER'
wait 'OK'

sendln fcmd
wait 'OK'
sendln scmd
wait 'OK'
sendln 'on'
wait 'OK'

sendln pcmd
logopen 'c:\homes\work\AA30.log' 0 0
wait 'OK'
logclose

sendln 'off'
wait 'OK'
disconnect
end

COMポート番号は、マクロ中に決め打ちしてるんで、試すなら調整してね。また、ログの名前や吐き出し先も 決め打ちしてる。マクロ中では、絶対Pathを指定してるけど、ログ名だけを書いておくと、ログはTeraTermが インストールされた所に出来るみたいだ。

AA-30に与えるパラメータは、MACROの冒頭付近にまとめておいた。入力の初期値は、中心周波数が7MHz、 スキャン幅1MHz等とゆるく指定してある。

このMAKUROをAA30.ttlと言う名前で保存しておいて、ダブルクリックすると、どのアプリで開く?って聞いて くるので、Ttpmacro.exeを指定すれば、次回からはこのアプリで起動(マクロの実行)されるようになる。

WindowsXPの頃は、拡張子とアプリの関連付けが面倒だったけど、Windows7になってからは、楽になったのね。 知らんかったよ。きっとHelpを探せば、どこかに書いてあるんだろうけど、こういうのって、どうやって 調べれば良いのでしょうね? 結局、グーグル先生に聞くか、ヤホーの知恵袋を頼りにした方が早いんだろうな。 全く、使えない(使いこなせない)Helpだ事。

で、このマクロを実行してみると、下記のようなログが取得される。


frx206.500000,584.46,-3710.68
6.550000,569.13,-5654.56
6.600000,49.18,-3411.17
 :
7.450000,360.37,-3339.33
7.500000,128.40,-3571.78

OK

見れば分かるように、ログの冒頭と終わりの部分にゴミが混じっていて、このままでは、CSVファイルですと 言い張る事は出来ない。ごみの除去をしたいな。sedを使ってクリーニングしましょ、なんて言うと、歳が ばれるな。百歩譲って、perlかな。でも、ありきたりでつまんないし、perlには良い思い出が無いからな。

grep等どうだろう? でも、素のWindowsには入っていないしな。バッチーで使われる、findはどうだ。 古過ぎてだめか。

PowerShell

近頃のdebianではbash改めdashになってて、似非 sh に泣かされる局面も あるようですから、いいかげん、command.exeの呪縛から逃れるのいいかも知れません。

前から気になっていたんだけど、アクセサリーの中に有る Windows PowerShell はどうだろう? grepは 入っていないかな?

おっとー、UNIX互換環境SUAに追加のパッケージをインストールする 一応、こういうのは除外して考える事にします。だって、XPの時代にこれを試して、酷い目に有ったからです。 出来れば、何も足さない という方針で臨みたい(特にWindowsの場合は)のです。

PowerShellの所を見ると、PowerShellとPowerShell ISEの2種類が登録されている。起動してみると分かる けど、前者は、ただのコンソールWindowが出てきて、後者は、一応IDEっぽい。IDEの方はメニューに HELPが有ったので、取りあえずこちらを使う事にした。

HELPに検索窓が付いていたので、迷わず、grepと入力。そしたら、Select-String なんてコマンドが 候補に出てきた。怪しいやっちゃなあと思って、そやつを調べてみると、説明に、Unixのgrep相当と 書いてあったよ。だったら、grepに最初からしとけよ。ゲイツさんよ、ああ、今はたこ男のバルマー君か、 なんか、unixに対向意識持ちすぎじゃあーりませんか?

何はともあれ、こんなのが、さっと動いたよ。

cat .\AA30.log | Select-String "^\d" > ./out.csv

出来上がったcsvファイルを点検したら、空行が入っていた。全くもう、grepもどきなんだから! 安心して使えないじゃない。プンプン。

気を取り直して、スクリプトをどうやって起動するか調べてみたら、 Invoke-Commandとか start-jobが使えそうなのね。なんか、昔触った事がある、VMSみたいだな。まだ、DECから来てWindowsNTを 作った親分は健在なのだろうか?

Pythonとかはどうよ

PowerShellもなんだかなあとなるとgrepもどきも自作せにゃならんな。goshで書いてもいいんだけど、Python はどうか? なんて、ふと思っちゃうんだなあ。以前にSerialPortを検索した時、Pythonが抜け落ちていた のがプチ気になったりしたから。

今Pythonを入れるなら2系より3系だな。3.2といつの間にか進化してた。そして、SerialPortに変わる python用のやつは、 pyserialだったよ。 Pythonを入れる時、ついでにpywin32と言うGUIのツールも 入れておいた。

見よう見まねで

import serial

ser = serial.Serial(7) 
ser.baudrate = 38400

ser.write('ver\n')
LineData = ser.readline()
print( LineData )

ser.close()

こんなスクリプトを書いた。COMの番号は、一つ小さいものを設定するのがPython流らしい。 早速走らせてみると

Traceback (most recent call last):
  File "C:\Python32\test-ser.py", line 3, in <module>
    ser = serial.Serial(7)
  File "C:\Python32\lib\site-packages\serial\serialwin32.py", line 30, in __init__
    SerialBase.__init__(self, *args, **kwargs)
  File "C:\Python32\lib\site-packages\serial\serialutil.py", line 260, in __init__
    self.open()
  File "C:\Python32\lib\site-packages\serial\serialwin32.py", line 56, in open
    raise SerialException("could not open port %s: %s" % (self.portstr, ctypes.WinError()))
serial.serialutil.SerialException: could not open port COM8: [Error 5] アクセスが拒否されました。

見事にエラーだわな。perlの時と一緒で、COM8にアクセス権が無いと言われた。一応エラーを起した 該当部分を見ておく。

        self.hComPort = win32.CreateFile(port,
               win32.GENERIC_READ | win32.GENERIC_WRITE,
               0, # exclusive access
               None, # no security
               win32.OPEN_EXISTING,
               win32.FILE_ATTRIBUTE_NORMAL | win32.FILE_FLAG_OVERLAPPED,
               0)
        if self.hComPort == win32.INVALID_HANDLE_VALUE:
            self.hComPort = None    # 'cause __del__ is called anyway
            raise SerialException("could not open port %s: %s" % (self.portstr, ctypes.WinError()))

何故だ? 先生に聞いてみても、誰かよそのアプリが使ってんじゃねーかぐらいのアドバイスしか無いし。 余り頼りにならんな。とほほ。

もう、どうでもいいけど

>>> 3-4j
(3-4j)

こういうの、なかなかいいね。

なななかいいねで、たまたま見つけたのがRubyシリアル通信ライブラリ(Windwos用) 。こういうのの耐用年数って、どのくらい? 改修すると、ずっと使えるのかなあ?

現在のおいらの炉心は、rubyとかSchemeなんで、pythonは使用済みプールに 保管されてるぞ。ちょっと頭を冷却してみよっと。