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-06-21[n年前へ]
■Mathematicaライブラリをさらに「オブジェクト指向風」にしてみました
以前、分光スペクトル・色処理用のMathematicaライブラリ(関数群)を作りました。そして、この前Mathematicaで「オブジェクト指向風」記述をすることで、括弧の対応や処理手順を見やすく・わかりやすくしてみました。もちろん、「わかりやすい」というのはあくまで主観的な話です。
今日は、もう少し本格的な例を作ってみようと考えて、そのMathematicaライブラリに、Spectorクラス・Layerクラス・Lightクラスを作成・追加してみたのです。物体を光で照らした時に見える分光スペクトルを、モンテカルロ的に解く機能を適当に付けてみました。
そんなわけで、スペクトルを扱うSpectorクラス、立体形状を扱うLayerクラス、そして、適当に光追跡を行う機能を盛り込んだLightクラスを仕立ててみたのです。
たとえば、デフォルト設定をそのまま使うなら、
layers=Layer[new] aLight=Light[new] aLight[in,layer][showTrace]といったコードを書くと、三次元物体中を照らす光の色が、どのように変わっていったかを立体的に表示させることができます。
あるいは、
Spector[new][set,blueSpector][spectorPlot]と書けば、青い色のスペクトル分布を描いてくれます。Layersは・・・形状を定義する関数を少しオブラートに包んだクラスです。
そんなわけで、数日後には、バグ確認・使い方の例などを加えた上で、サイトからダウンロードできるようにします。また、適当に仕立てたこのツールを使い、何か解析でもしてみようと思います。
2009-12-02[n年前へ]
■Ruby版 Thinkpad 加速度センサ類取得クラスを書きました
Lenovo(旧IBM)のノートPC ThinkPad にはハードディスク保護を目的として、加速度センサが付いています。SSDを搭載している機種でも、(その他のハードウェアは共通化されているからだろうと思いますが)やはり加速度センサが付いているということです。
以前、C++でThinkpad加速度センサ類取得クラスを作りましたが(このC++コードを眺めてみると、不要な部分が残っていたので、その点については後で修正します)、今回はRubyでそのクラスを組んでみました。作成したRubyソースは、ここに置きました(accelerometer.rb)。ソース最下部には、使用方法もコメントアウトした上で付けておきました。また、このバージョンはC++バージョン同様、最近のThinkpadでも動く実装になっています。
読みやすさのために改行を適当に入れたソースは、下記のようになります。
# jun hirabayashi jun@hirax.net 2009.12.02
class Accelerometer
require 'Win32API'
attr_accessor :x
attr_accessor :y
attr_accessor :temperature
attr_accessor :presentState
def initialize
begin
@sensorFunctionAPI=Win32API.new("Sensor",
"ShockproofGetAccelerometerData", ['P'], 'V')
@buffer=' '*17
if @sensorFunctionAPI.Call(@buffer)
parse(@buffer)
@offsetX=-@latestRawAccelDataX.to_i;
@offsetY=-@latestRawAccelDataY.to_i;
end
rescue
'We have some problem.'
exit!
end
end
def parse(result)
@presentState,@latestRawAccelDataX,@latestRawAccelDataY,
@latestAccelDataX,@atestAccelDataY,@temperature,
@atestZeroG_X,@atestZeroG_Y=result.unpack("iSSSSCSS")
end
def getAccelerometerData
@sensorFunctionAPI.Call(@buffer)
parse(@buffer)
@x=@latestRawAccelDataX.to_i+@offsetX.to_i;
@y=@latestRawAccelDataY.to_i+@offsetY.to_i;
return [@x,@y]
end
end
このRubyクラスを使った加速度取得スクリプト例は、下記のようになります。ちなみに、Xが(ノートPCに向かって)左右方向で、Yが奥行方向になります。これで、1秒おきにThinkpadの傾斜をコンソール出力します。
require 'accelerometer' accelerometer=Accelerometer.new 10.times{ |i| puts accelerometer.getAccelerometerData.join(',') sleep 1 }
MA5授賞式で面白いものを作っている開発者を見たせいか、何か色々作ってみたくなります。4年ほど前には、この加速度センサテクニックを使って「「未来の立体ディスプレイ」を作る」とか色々作ったような覚えがありますが、まだまだ色々な応用がありそうな気がしてきました。というわけで、まずは準備のために、今日はRuby版 Thinkpad 加速度センサ類取得クラスを書いてみました。
2009-12-06[n年前へ]
■Thinkpad加速度センサ取得用C++クラスの手直しをしました
Lenovo(IBM) Thinkpad加速度センサ取得用C++クラス(関連記事・Thinkpad加速度センサ取得用C++クラス/新しいThinkpad にも対応した加速度センサ値取得プログラム)を少し手直ししておきました。動作は全く変わりませんが前回の修正の際に不要な部分が残っていたので、その点について直しました。
Thinkpad加速度センサ取得用C++クラスをまとめたヘッダファイルソース(Sensordll.h)、および、使用サンプルソース・バイナリ(sample.cpp・sample.exe)は、ここに置いておきました(古いバージョンは、サブディレクトリに置いてあります)。
サンプル・アプリケーション例では、よく意味がわらないままに、"Temprature"も出力するようにしてあります。
sample.exe 1000 10という風にコマンドラインからアプリケーションを実行すると、
0=x, 0=y,35=temp. 0=x, 0=y,35=temp. 0=x, 0=y,35=temp. 0=x, 0=y,35=temp. 1=x, 1=y,35=temp. -16=x, -3=y,35=temp. -1=x, -1=y,35=temp.とった具合に左右方向の傾斜と奥行き方向の傾斜(とtemprature)を出力します。