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"の設定は、ダイアログのチェックボタンを下に示したスクリーンショットのように(とりあえずは)ユーザが処理した待ち時間やウィンドー情報を保持しておくのと、後で便利でお勧めです。
■"Win32GuiTest.exe"で自動作成したRubyスクリプト実行動画
"Win32GuiTest.exe"で「Windows操作を再現するRubyスクリプト」を自動で作るの処理例、つまり、"Win32GuiTest.exe"で自動作成したPerlスクリプトをWin32GuiTest by RubyでRubyスクリプトに変換し、そのRubyスクリプトを走らせてみた時の動作画面を下に動画として貼り付けておきます。
まずは、下に貼り付けた動画がpl2rb.rb(変換前のPerlスクリプトはpl.plになります)の実行画面になります。行った作業はテキストを入力して、何回かコピー&ペーストして、その後に削除する、というものです。
そしてこちらがoutput_revised.rb (変換前のPerlスクリプトはoutput.rbです)の実行画面です。行った作業は、日本語入力とアルファベット入力を自動で行ったものです(ちなみに、"Win32GuiTest.exe"は、私の環境では、日本語変換モード切り替えのキーコンビネーションをきちんと記録してくれなかったので、Rubyコードの方に修正を入れてあります)。
2008-12-03[n年前へ]
■ハードウェア要らず?の遠隔リモコン制御
「汎用赤外線リモコンI/Fが使えないエアコンを外出先からオン・オフするにはどうしたらいいか?」ということが話題になっていました。
使える材料として「遠隔操作できるPC」がある、ということなので、「(新たに追加する)ハードウェア要らず?の遠隔リモコン制御」を私も考えてみました。それは「CDトレイをソフト制御してエアコンのリモコンのオン・オフをする」という、実に原始的メカニカルな「アイデア」&「実装」です。
思いついたらやってみよう!というわけで、ソフトウェアを仕立て、万力でエアコンのリモコンを固定して、hirax.netが稼働しているサーバのCDドライブを外に引っ張り出し、実際に検証してみた結果が下に貼り付けた動画です。ケータイで撮影した動画ではわかりづらいかもしれませんが、CDトレイの角でリモコンのボタンがきちんと押されて、エアコンがピピッと鳴り、そしてエアコンからの送風が始まりました。
ちなみに、書いたコードはwin32GuiTest.rbを使ったので、こんな具合になります。「書いた」というほどのものでは、ないことが丸わかり…です。
require 'win32GuiTest' sleep 5 gui=Win32GuiTest.new gui.cdAudioDoorOpen動作としては、CDトレイが開き、リモコンのボタンを押し、何かにぶつかったことをCDドライブが検知し、CDドライブのトレイが(勝手に)自動で閉まる・・・という具合です。こういう動作をするスクリプトを外出先からPCを起動させる時に動かせば、あるいは、常時動いているhttpサーバからでも呼んでやれば、遠隔リモコン動作システムのできあがり、ということになります。
というわけで、今日作ってみたガラクタは「ハードウェア要らず?の遠隔リモコン制御システム」です。
2008-12-10[n年前へ]
■Office付属OCR機能で「板書画像を一発でPPTファイルにするRubyスクリプト」を作る
「ホワイトボード前で打ち合わせをして、打ち合わせ終了時にホワイトボードに書いた板書をプリントアウトして、後でパワーポイント資料を作り直す」といった作業をしたことがある人は多いと思います。あるいは、(印刷機能を持ったホワイトボードは高いですから)「ホワイトボードに板書した内容をデジカメやケータイで撮影しておいて、撮影画像をプリントアウトした後にパワーポイント資料を作ったり」、「撮影画像をモニタ上で眺めながらパワーポイントを作ったりした」ことがある人も多いのではないでしょうか。
そんな人、そんな時のために、Office 2003以降に着いてくる"Microsoft Office Document Imaging"のOCR機能を使って(デフォルト設定ではインストールされないかもしれません)、「板書画像を一発でPPTファイルにするRubyスクリプト」を作ってみました。作ったもの一式をとりあえずここに置いておきます。
たとえばこんな手書きの板書があったら、
ruby imgOCRppt.rb rakugaki.jpgといったようにimgOCRppr.rbスクリプトを呼ぶと、rakugaki.pptというファイルができあがります。この例では私のラクガキ手書き文字が汚いせいで、ずいぶんと文字化けしていますが、達筆な人が描いた板書なら、きちんとしたパワーポイント(PPT)ファイルが(もしかしたら)生成されるかもしれません。
スクリプトの内容は、
require "win32GuiTest" img=ARGV[0] Win32GuiTest.img2PPTbyOCR( img.sub(/\.jpg$/i,'.ppt'), Win32GuiTest.bmp2texts(img), img.sub(/\..?$/i,'') )とい風で、"img2PPTbyOCR"と"bmp2texts"という2つのメソッドからできています。
ちなみに、画像からテキストを抽出するOCR部分("bmp2texts")のRubyソースは、次のようになっています。
def Win32GuiTest.bmp2texts(file) doc=WIN32OLE.new('MODI.Document') doc.Create(file) doc.OCR(17, false, false) # Japanese layout=doc.Images(0).Layout str=doc.Images(0).layout.Text doc.Close return str endそして、この後、 Win32GuiTest.img2PPTbyOCR で画像ファイル名をスライドのタイトルにして、画像ファイルからOCRで抽出されたテキストをスライドのコンテンツ・テキストとして入力・保存する、という内容になっています。
2008-12-11[n年前へ]
■「板書画像をベクタライズしPPTファイルにするRubyスクリプト」を作る
「Office付属OCR機能で「板書画像を一発でPPTファイルにするRubyスクリプト」を作る」で、板書画像を文字認識した上で、パワーポイントのファイルに変換するRubyスクリプトを作ってみたわけですが、あまりの悪筆で板書文字をろくに認識してくれなかったりすることも多いと思います。また、板書にイラスト・説明図を頻繁に描くような人も、おそらく少なからずいると思います。
そんな時、「板書画像を自動でベクタライズした上で、パワーポイント上でイラストを再編集することができたら便利だろう」というわけで、「板書画像をベクタライズしPPTファイルにするRubyスクリプト」を作ってみました。その例がjpg2ppt.rbです。
require "win32GuiTest" jpg=ARGV[0] Win32GuiTest.img2PPT( jpg.sub(/\.jpg$/i,'.ppt'), Win32GuiTest.jpg2wmf(jpg), true)という具合でいつものように、処理本体自体は win32GuiTest に(とりあえず)入れてあります。
スクリプトを置いたディレクトリに"apps"という名前のサブディレクトリを作り 、その中にここからダウンロードしたPotraceのバイナリ・ライブラリ類を置いて、さらに、JPG2BMP に入っているバイナリ・ライブラリ類をを置けば準備完了です(win32GuiTestの末尾当たりを見れば、その汚い実装や変更方法がわかると思います)。後は、
ruby jpg2ppt.rb rakugakiv.jpgとスクリプトを呼べば、こんんなパワーポイントファイルができあがります。
PPT(パワーポイント)ファイルに貼り付けられた画像はベタライズされた上で、Windows Meta File形式でスライド上に貼り付けられているので、グループ化を解除していけば、後でベクター部品に分解された板書の再編集が可能、ということになります。