hirax.net::Keywords::「ライブラリ」のブログ



2008-11-19[n年前へ]

Rubyで「シリアル通信スレッドクラス」を作る 

 Rubyで「(Rubyシリアル通信ライブラリ(Windows用)TEXCELL を使った)シリアル通信スレッドクラス」を作りました。ソースコードとサンプルはここに置いておきます。”Microsoft Windows VISTAではほとんど見捨てられているような”シリアルポートでの送受信をRubyでスレッドを使って行うクラスです。Queueにデータを突っ込めば「シリアル通信スレッドクラス」から自動的に送信されます。また、受信した文字列が「(指定した改行コードで)一行になるたびに」receiveイベントが呼ばれるので(また、その際にQueueを指定しておけば受信行が自動的にそのQueueに追加されていきます)、読み込みのタイミング・必要な情報がまだ途中までしか読み込まれていない場合などの処理を気にすることなく使いたい、と考えながら作ってみた「シリアル通信スレッドクラス」です。
 たとえば、COM3で受信した内容をコンソールに出力するだけであれば、このようなコードで動くはずです。

require 'comThread'
receiveComThread=ComThread.new({:icomno=>3})
receiveComThread.start({:receive=>true, 
        :receiveMonitor=>true})
sleep 60
receiveComThread.stop
 シリアル通信モニタプログラム(シリアルポート間で送受信されている内容を眺めるプログラム)も、多分10行くらいで書けると思います。チェックせずに書いてしまうと、こんな感じになると思います。
  require 'comThread'
  q=Queue.new
  receiveComThread=ComThread.new({:icomno=>3,:rq=>q})
  sendComThread=ComThread.new({:icomno=>4,:sq=>q})
  receiveComThread.start({:receive=>true,
    :receiveMonitor=>true})
  sendComThread.start({:send=>true})  
  sleep 60
  sendComThread.stop
  receiveComThread.stop

 以前、こんなことを書きました

 「計測・解析ソフトウェア/ハードウェアのハック」が実験系技術者の一番のLifeHackかもしれない…と思っています。その思いを逆に言うならば、実験系技術者が費やす多くの時間を、計測・解析処理が消費していると思っているからです。そして、一番時間を消費している部分の高速化をすることが、全体の高速化に効果的だろう、と思っているわけです。

 そんなこんなで、何を今更…という、Perlで「シリアル通信とユーザインターフェース自動制御」のやり方を整理しておくことにしました。なぜかというと、経験的に(既成機器をを使わざるえないことが多い)「計測・解析ソフトウェア/ハードウェアのハック」は、シリアル通信制御とユーザインターフェース自動制御でほとんどの場合対応できる、からです。
 というわけで、先週末はこの「Perlでシリアル通信とユーザインターフェース自動制御のやり方を整理しておくことにしました」の部分を「Rubyでシリアル通信とユーザインターフェース自動制御を書いて整理しておくことにしました」ということをしてみたわけです。この「シリアル通信クラス」と「ユーザインターフェース自動制御」があると、結構便利な実験屋さんもいるかもしれません。

2008-12-01[n年前へ]

「Windows操作を再現するPerlスクリプト」を自動で作る"Win32GuiTest.exe" 

 PerlでWindowsのGui操作を記述することができるライブラリ Win32::GuiTest を、ppmからインストールするのではなくてWin32-GuiTest-1.56.tar.gzとしてダウンロードしてみると、"Win32-GuiTest Recorder"というwindows アプリケーションが付属していることに気づきました。

 "Win32-GuiTest Recorder"が行う動作を「ひとこと」で言ってしまえば、「マウスイベントとキーボードイベントをフックし、得られたマウス操作やキーボード操作をPerlのソースコードとして保存してくれる」というものです。たとえば、「( "Win32-GuiTest Recorder" の)"Record"ボタンを押し、適当にキーボードとマウス作業をしてから、"Stop"ボタンを押す」と、こういったPerlソースコードが自動作成されます。

#!/usr/bin/perl
use Win32::GuiTest qw/:ALL/;
$Win32::GuiTest::debug = 0;

MouseMoveAbsPix(303, 484);
SendMouse('{LEFTCLICK}');
SendKeys('{ENT}test{ENT}');
SendRawKey(VK_LCONTROL, 
  KEYEVENTF_EXTENDEDKEY);
SendKeys('s');
SendRawKey(VK_LCONTROL, 
  KEYEVENTF_EXTENDEDKEY | 
  KEYEVENTF_KEYUP);
MouseMoveAbsPix(169, 484);
SendMouse('{LEFTCLICK}');
SendKeys('{BAC}{ENT}');
SendRawKey(VK_LCONTROL, 
  KEYEVENTF_EXTENDEDKEY);
SendKeys('s');
SendRawKey(VK_LCONTROL, 
  KEYEVENTF_EXTENDEDKEY | 
  KEYEVENTF_KEYUP);
 

ソースを眺めてみれば、結局、Windows操作を、MouseMoveAbsPix と SendMouse と SendKeys と SendRawKey として記録するだけになります。しかし、Windows上の操作を一回するだけで、スクリプトが自動生成されるというのは、とても便利です。しかも、マウスイベントとキーボードイベントだけを記録するだけでなくて、起動時に表示されるダイアログで"Windows Hint"オプションを付けておけば、「操作を行ったWindowの名前やクラス」を(ソースコード内にコメントとして)記録しておいてくれるのです。これは、後からfindWindowなどを使った処理に変える際に非常に便利です。Windowのクラスや名前を自動で記録しておいてもらえると、たとえば、(画面サイズが異なる他の人のPCで動くように)後でPerlスクリプトを修正したりする作業が実に簡単になります。

 単純作業をスクリプトで書く場合には、ソースコードをゼロから書き始めるよりは、叩き台・スケルトンからスタートする方が「とっつきやすい」ものです。もちろん、「とっつきやすい」コースが最終的に楽なコースかどうかは場合によりけりだと思いますが、いじり始める叩き台が自動的に作ってくれるツールというのは、とても便利なものだと思います。

2008-12-02[n年前へ]

"Win32GuiTest.exe"で「Windows操作を再現するRubyスクリプト」を自動で作る 

 PerlでWindowsのGui操作を記述することができるライブラリ Win32::GuiTest を Ruby に移植した Win32GuiTest クラスをバージョンアップし win32GuiTest.rb として、ここに置きました)。変更点の一つめは、"pushButton" ""pushChildButton" "sendMessage" "postMessage" "getTopWindow" といった関数を増やしたことです。

 そして、もう一つが「マウスイベントとキーボードイベントをフックし、得られたマウス操作やキーボード操作を Perlのソースコードとして保存してくれる」"Win32-GuiTest Recorder"(ここに Recorder.lzh としてコピーを置いておきます)が出力したPerlのソースコードをRubyスクリプトに変更する処理を、クラスメソッドとして実装したことです。たとえば、

require 'win32GuiTest'
Win32GuiTest.convertPerlScript("pl.pl")
といったコードを書けば、"Win32-GuiTest Recorder"が出力したPerlスクリプト"pl.pl"をもとに、Rubyスクリプトが出力されます。(たとえば、pl.plを変換した結果がpl2rb.rbになります)。

 これで、PerlユーザだけでなくRubyユーザも(とはいえ、きっとPerlを使うことができる人はRubyも使うことができるだろうし、Rubyを使うことができる人はPerlも使えるだろう・・・と思っているのですが)、"Win32-GuiTest Recorder"を使ったWindows 操作のスクリプト自動生成のありがたみを味わえる、ということになります。

 ちなみに、"Win32-GuiTest Recorder"の設定は、ダイアログのチェックボタンを下に示したスクリーンショットのように(とりあえずは)ユーザが処理した待ち時間やウィンドー情報を保持しておくのと、後で便利でお勧めです。

2009-02-11[n年前へ]

Ruby 1.9.1ライブラリ互換性の総まとめ 

 Ruby 1.9.1ライブラリ互換性の総まとめ

2009-03-25[n年前へ]

iPhone dev: basic image processing package 

 iPhone dev: basic image processing package

 Ars looks at a Google Code repository that provides basic image processing tools for the iPhone.



■Powered by yagm.net