2008-05-09[n年前へ]
2008-07-31[n年前へ]
■「計測・解析ソフトのハック」が実験系技術者の一番のLifeHack…かもしれない。
「計測・解析ソフトウェア/ハードウェアのハック」が実験系技術者の一番のLifeHack…かもしれない、と思っています。それを逆に言うならば、実験系技術者が費やす多くの時間を、計測・解析ソフトが消費しているということになります。つまり、一番時間を消費している部分の高速化をすることが、全体の高速化に効果的だろう、ということです。
そんなこんなで、何を今更…という、Perlで「シリアル通信とユーザインターフェース自動制御」のやり方を整理しておくことにしました。なぜかというと、経験的に「計測・解析ソフトウェア/ハードウェアのハック」は、シリアル通信制御とユーザインターフェース自動制御でほとんどの場合対応できることが多いから、です。しかも、計測・解析ソフトウェア/ハードウェアを外注したりすると、時間や費用が無視できないほどかかったりするわけで、そういったシステムを簡単に作ることができるということを知っていると、結構便利であるわけです。
たとえば、RBIOシリーズのような汎用(入)出力ボードは、お小遣い程度の価格で「シリアル通信経由でのハードウェア制御をする」ことが簡単にできます。それは、「計測ハードウェアのハック」がとても簡単にできる、ということです。
そして、Windows上(あるいはWindows上で動くソフトウェア)の作業を”勝手に”プログラミングすることができれば、「計測・解析ソフトウェアのハック」も簡単にすることができます。
というわけで、「シリアル通信とユーザインターフェース自動制御」ができれば、「計測・解析ソフトウェア/ハードウェアのハック」を簡単に実現することができるわけです。
とりあえず、たとえば、Perlで「シリアル通信とユーザインターフェース自動制御」を使うには、Win32::SerialPort と Win32::GuiTest という二つのライブラリが必要です。それらのインストールは、コマンドプロンプトから、
ppm install Win32-SerialPortという風に行うことができます。もっとも、インターネットに直接アクセスすることができない Proxy 内部からであれば、
ppm install http://www.bribes.org/perl/ppm/Win32-GuiTest.ppd
set HTTP_proxy=http://proxy.hoge.com:8080といったような、Proxy対策の環境変数設定をコマンドプロンプトから前もって行っておくことが必要になります。
set HTTP_proxy_user=hogehoge
set HTTP_proxy_pass=hogehoge
あとは、シリアルポート通信ようのConfigファイルを作る、プログラムを書く、ということだけです。たとえば、
!c:\perl\bin\perlといったライブラリを読み込む宣言をした後に、ソフトウェアのユーザインターフェース周りは、
use Win32::SerialPort;
use Win32::GuiTest qw( FindWindowLike GetWindowText SetForegroundWindow MouseMoveAbsPix SendMouse GetWindowRect SendKeys);
MouseMoveAbsPix(320, 160);というような感じで、マウスやボタンやキーボードを自動で動かすことができます。また、ハードウェア周りは、
SendMouse("{LEFTCLICK}");
SendKeys($fileName);
SendKeys("{ENTER}");
my $conf_file="serialport.conf";という感じで*、スイッチやモータを適当にシリアル通信(とRB-IOのようなお手軽I/Fボードで)制御すれば良い、という具合です。午前中に秋葉原に行って部品を買って、午後にスクリプトを2,30行書けば、それで自動計測・制御システムのできあがり、というわけです。
tie *PORT, 'Win32::SerialPort',$conf_file or die; pushSwitch(0);
close PORT or warn "Can't close serialport:COM*";
sub pushSwitch{
my ($portNo) = @_;
my $text=sprintf "PCT%d%d\n",$portNo,1;
print PORT $text;
}
*(なお、ここで使用している"serialport_conf"は、こういったserialport_conf.plで作成します)
2008-09-23[n年前へ]
2009-11-24[n年前へ]
■「デバッグ用出力コードを書く」と自動的に「パーサー・スクリプト」を生成するツール
記憶容量が少ないハードウェアでのデバッグを目的として、外部に対して各種変数の内容を出力するプログラムを書く。そんな作業が行われている一方で、ログに出力された内容を解析するスクリプトを書く。…そんな超原始的デバッグ作業をしていると、「各種変数の内容を出力するプログラム」を書くと同時に、そのフォーマットに準じた「ログに出力された内容を解析するスクリプト」を生成するツールがないものだろうか?と思うことがある。
もちろん、このprintfを多用する「出力ログ頼りの超原始的デバッグ」を行う、というところにおそらく根本的な問題があるのだろうとは思うが、色々な制約がある中ではそんな状況に出会ったりする。そんなこんなで、「デバッグ出力」用コード」を書くと、自動的に「パーサー・スクリプト」が生成されるツールがあれば良いな、と思う。
といっても、それが開発環境に組み込まれているような何だかエライ(ここは関西弁の「えらい」で、東京弁の「偉い」ではない)・システムを使え、という答えでは何だか今一つ面白くない。もっと、気軽に・汎用的に使える、原始的な道具が欲しいのである。
そんな、「デバッグ用出力コードを書く」と自動的に「パーサー・スクリプト」を生成するシステムというものが、どこかに転がっていないものだろうか。
2012-04-15[n年前へ]
■例外補足で演算子をオーバーロードするエクセルHack!
エクセル(表計算ソフト)の「表空間と値の拡張」を考える!?の続き、エクセルで「複素数」をセルに入力し、"=A+B"といった”普通の記述の”入力で複素数演算を実現させる、という「Excelの独自型」…まず、その実装方法が面白いです。
①複素数セルA1、A2に対し、=A1+A2のように入力
②#VALUE!エラーが出るので、それを検出(Workbook_Changeを利用)
③検出したセルに対し、入力数式を複素数演算用関数を用いた数式に変換(ここは、数式を解析して汎用に変換する機能が必要ですが、これはたぶんできる)
④変換後の専用関数による数式で計算し、そのまま値を返す
この方針を眺めると、 ”エラーを検出し、エラーの元になった文字列をもとに、拡張処理を実行させる”という実装方法が、"No method"例外を補足し、”見つからない”関数名を元にSQLパターン等を生成し、その関数名で「したいこと」を実現するというRuby on Rails のコードを連想します。
例外補足で演算子をオーバーロードする、という面白く・楽しいエクセル Hackです。