2008-12-02[n年前へ]
■"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-29[n年前へ]
2009-01-01[n年前へ]
■「行く年」と「動的言語」と「来る年」と
12月31日から1月1日に日付が変わる頃、脈絡もなく、「人生」は「動的に色々なものが定まっていくプログラム」と似ているのかもしれない、とふと考えました。
そのどちらも、実行前に何かが定まってしまうのではなく、その時その瞬間にさまざまなことが決まっていくように思います。そんな一行一行が積み重なり動いていくさまを、なぜか連想したのです。
Rubyスクリプトを実行できる形に変換することができるRubyScript2Exeというものがあります。このRubyスクリプトは、他の(実行形式に変えたい)Rubyスクリプトを一行一行実行しながら逐次必要ファイル情報などを集めていき、さらにRubyインタプリタも内包させた上で、最終的に実行形式に変換する、というものです。
こういった動作でアプリケーションが作られるということは、実行形式に変換する際のプログラムの動き次第で、最終的に作成される実行形式ファイルが違ったものになる、ということです。たとえば、こんなRubyスクリプトを作ってみます。
i=2008+rand(2) if i>2008 puts 'in case of '+i.to_s sleep 3 require 'win32GuiTest' gui=Win32GuiTest.new # (中略) else puts 'in case of '+i.to_s sleep 3 endRubyScript2Exeは、Rubyスクリプトを実行しながら、必要なものを逐次集めていきますから、実行形式作成時に1行目のiが2009になったとしたら、win32GuiTest.rb ライブラリが読み込まれることになります。しかし、もしも、iに2008なったとしたらwin32GuiTest.rbは読み込まれません。
つまり、実行形式を作成する際に、"i=2008+rand(2)"でiがどうのような値になったかで、win32GuiTest.rb ライブラリの読み込みの有無が異なる2種類の実行形式ファイルができあがるのです。試しに、実行形式作成時のiの値が異なっていたことによる、(RubyScript2Exe.rbで作成した)異なる2種類の実行形式ファイル(2008.exe, 2009.exe)を置いてみました。
さて、実行形式ファイル作成時に、"i=2008+rand(2)"が2008になり、win32GuiTest.rb ライブラリが読み込まれていない実行形式ファイルが2008.exeです。この実行形式ファイル2008.exeを(たとえば実際にあなたが)実行するときには、"i=2008+rand(2)"は2008になるかもしれませんが、2009になることだって1/2の確率であるわけです。
もしも、2008.exeを実行する時にiが2009になったとしたら、必要なライブラリが読み込まれていないので、未定義のクラスや関数が登場することになり例外が発生することになります。
さて、実行形式ファイル作成時に"i=2008+rand(2)"が2009であった2009.exeの場合には、実行時にiが2008になっても2009でも動作します。2009.exeは、"i=2008+rand(2)"が2009になった場合には「ペイント」プログラムを立ち上げて、「初日の出もどき」を描きます。"i=2008+rand(2)"が2008だったら特に何もしません。
「行く年」や「来る年」を見て、その「行く年」「来る年」の中を歩いていくたくさんの人たちをみて、なぜか「動的言語」を連想しました。これが、2009年の一番最初に作ったプログラムです。
2009-04-26[n年前へ]
■win32GuiTest.rb にコマンドプロンプトを閉じる関数を追加する
Windows上のRubyで、さまざまな(雑多な)GUI関係の操作を簡単に行うことができるライブラリ、win32GuiTest.rbに、ひとつ関数を増やしておきました。増やした関数は"closeComandWindowLikeName"という名前の、指定した文字列が含まれるコマンドプロンプトのWindowをすべて閉じる、というものになります。
たとえば、下記のようなスクリプトを書けば、Windowタイトル中に"mongrel"という文字列を含むコマンドプロンプトをすべて閉じ・終了させます。
require 'win32GuiTest'ちなみに、closeComandWindowLikeName('mongrel',3)と書けばウィンドゥを閉じるための毎キー操作につき、3秒の時間間隔を使います。何も指定しなければ、キー操作の時間間隔は2秒になります。
gui=Win32GuiTest.new
gui.closeComandWindowLikeName('mongrel')
この程度の機能であれば自分で作る人の方が多いでしょうし、そもそもこんな機能を使うという人がいるかどうかは…怪しいところですが、とりあえず、何かの役に立つかもしれませんのでライブラリとしてソースコードを置いておくことにします。