2011年2月28日月曜日

RubyとOLEでPowerPointを遠隔操作してみる

MeSHの枠組みを拡張する?

MeSHは、これまでWebブラウザ上で様々なものを動作・同期させることを念頭に置いてきました。しかし、「様々な」という概念を拡張していくと、ネイティブアプリケーションまで辿り着きます。せっかくプラットフォームに依存しないよう開発してきたのですが、「できない理由を説明するより、できることを証明してから悩もう」の精神に則り、ネイティブアプリケーションを操作してみたいと思います。今回は技術検証なので、Windows上にWeb簡易サーバを構築し、ネイティブアプリケーションを制御してみます。

RubyとOLE

OLEはObject Linking and Embeddingの略で、簡単に言うとWindowsアプリの連携を図るための根幹です。対応したプログラムであれば、プログラムを制御したり、プログラム中のイベントに応じて自作プログラム中のメソッドを実行することができます。このような便利な機能を使わない手はありません。早速プログラムを制御してみましょう。

普通は、Microsoft関連の便利な機能を使うためにはVisualStudioなどを使うことになるのですが、RubyにはWIN32OLEというありがたいクラスが作られています。通常、WIN32OLEの説明にはWordやExcelが用いられるのですが、実はPowerPointと連携するとプレゼンが便利になります。と言う訳で、RubyからPowerPointを制御しようというのが本日の記事になります。

基本的な制御

WIN32OLEが何であるかはRubyist Magazineの該当記事を読んでください。ここでは、あくまでPowerPointの制御のみ(簡単に)解説します。いや、深いところを訪ねられても解説できないというのが本音です。

事前準備として、Windowsを使っていて、PowerPointを持っていて、Rubyをインストールしていることが必要となります。それでは早速PowerPointで何かファイルを開いてみて下さい。次にirbを起動して以下の内容を打ち込んでみて下さい。

この3行を入力すると、PowerPointがプレゼンテーションモードになると思います。2つ以上のファイルを開いている場合には、どちらのファイルが対象となるか私には分かりませんので、1つだけ使用して下さい。

2行目は、OLEの仕組みを利用して、PowerPointとやり取りするための書き方です。3行目は、メソッドがチェーンしていますが、順番に「アクティブなプレゼン」の「スライドショー」を「実行」して「その状態」を得る。という(様な)意味です。細かく言うと間違っているかも知れませんので、鵜呑みにしないようお気を付けください。

それでは、ここで得られたオブジェクトviewを利用してPowerPointを制御してみます。制御のためのメソッドの中でも代表的なものを掲載します。上のプログラムの続きと思っておいてください。それぞれ、意味はコメントに書いておきます。


具体的にPowerPointを制御する

ここまで分かれば、後は適当なポート番号でHTTPを想定して待ち受けて、「次へ」や「前へ」のボタンを作成して、ボタンが押されたらview.Nextやview.Previousを実行してあげれば、Webブラウザから制御できます。つまり、iPhoneなどからプレゼンテーションの制御を行なうことが可能となります。

と言うことで作成したのが次のソースです。1つのファイルの中にRubyスクリプト、HTMLファイル、JavaScript、CSSが入っているので見づらいと思いますが、このファイルだけコピーすれば使えるという気楽さを念頭に置いているのでご容赦ください。(無駄に)AJAXを使っているので、ページ遷移などは発生しません。

前準備:
・以下のソースを保存する。
・WindowsのIPアドレスを調べておく

使い方:
1.PowerPointでプレゼンしたいファイルを開く。
2.rubyで以下のソースを実行する。
3.WindowsのWebブラウザ(動作検証はChromeで行ないました)からhttp://localhost:8080/に接続する。
4.ボタンをクリックして動作させる。
5.うまくいったらiPhoneなど、別ホストからも試してみる。

注意事項:
・セキュリティソフトの動作状況によっては、iPhoneなどから接続できない場合があります。その場合は一時的にセキュリティソフトをオフにしてお試しください。
・ユーザインタフェースは手抜きです。簡単なHTMLとCSSなので、気になった方は書き直してください。
・JavaScriptも冗長です。ご容赦ください。
・ctrl+CでRubyスクリプトが停止しない場合があります。対処法としてctrl+Cを3回ほど連打して、ブラウザ側でリロードなどをすると停止します。対処法をご存じの方、ご連絡いただければ幸いです。

将来的な拡張:
・現在のページ番号と全ページ数が手元に表示されるといいな
・ついでにストップウォッチ機能も欲しいな(スタート・ストップは手動で良いかな?)
・ページ番号をメニューから選択して飛ぶ機能も欲しいかも?
・現在表示しているページや次ページの内容が手元で確認できるといいかも

検証に使用したソフトウェアとバージョン:
・Microsoft Windows Vista ServicePack2 (Windows 6.0.6002)
・Microsoft Office PowerPoint 2007(12.0.6535.5002) SP2
・ruby 1.8.7 (2009-06-12 patchlevel 174) [i386-mswin32]
・Google Chrome 9.0.597.98
・iPhone 3GS (iOS4.2.1)

このソフトについて

ライセンス:GPLv3
免責事項:無保証です。このソフトを使用することによって生じた損害に対して、作者は一切の責任を負いません。

このエントリーをはてなブックマークに追加

0 件のコメント:

コメントを投稿