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
免責事項:無保証です。このソフトを使用することによって生じた損害に対して、作者は一切の責任を負いません。

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

2011年2月12日土曜日

Mac OS XのApache設定

MacBook Air

ちょっと前になりますが、MacBook Air 11'モデルを入手しました。System7以来、久しぶりにMacに回帰しました。CPUなどのスペックには特筆すべきことはない、いや、むしろ今のご時世では貧弱と言わざるをえないのですが、予想外にキビキビ動作します。特にスリープへの移行と復帰は感動ものです。しかも、OS XはBSD UNIXの血を受け継いでいるので、Macは立派なUNIXマシンです。これまでWindows環境上でプログラミングしようとして、数々の苦労をしてきた経験からすると、様々な言語や環境がプリインストールされ、まともに動作することだけで嬉しくなってしまいました。(私とWindowsの相性がわるいことは否定しません。Apacheの設定がうまくいかないとか、Rubyでソケットを使うとうまくいかないとか、CGIの設定がうまくいかないとか、MySQLの設定がうまくいかないとか、昨日まできちんと動いていたシステムが上手く動かなくなったとか、環境設定ファイルがどこにあるのか分からないとか・・・。結局、Windows上で足掻くよりも、仮想計算機環境でDebianを動かす方が楽です。)

細かいところでは、controlキーが正規の位置(Aの左)に配置されているのも好印象です。

まずはApacheの設定

OS Xでは、RubyもApacheもMySQLもPythonもVIMもプリインストールされています。ターミナルを開けば、基本的なUNIXコマンドは使用できます。うーん、幸せ。あ、別にUNIXコマンドが好きなわけじゃなくて、設定を変更したら素直に反映される環境が好きなだけです。

と言うことで、まずはApacheの設定を変更してみます。前提条件として、ユーザ名はadminと仮定して話を進めます。この場合、ホームディレクトリは/Users/adminに、Webサイトのホームディレクトリは/Users/admin/Sitesになります。

準備編

まずは、Webサーバの起動です。標準状態では起動されません。
システム環境設定 ー 共有 ー Web共有にチェックをつけて「入」にしてください。
Webブラウザから
http://localhost/~admin/
にアクセスすると、エラーが出ずに「あなたのWebサイト。」というタイトルのページが見られることを確認しましょう。もしWebサーバが起動していなければエラーとなります。

気が向いたら、適当なHTMLファイルを作ってWebブラウザで確認してみましょう。ファイルを置くフォルダは前節で説明しています。

CGIスクリプト編

CGIスクリプトは、管理者しか設置できないようにする場合と、ユーザが自由に拡張できる場合のどちらでも設定できます。とりあえずお手軽に試せるように、ホームディレクトリ内に置いたファイルを実行できるようにします。
(1)cgi-binディレクトリを作る
mkdir /Users/admin/Sites/cgi-bin

(2)Webサーバ(Apache2)の設定ファイルを書き換える
主な設定は/etc/apache2/httpd.confに書いてあるので編集する。このとき、一般ユーザの権限では書き込みできないので
cd /etc/apache2
sudo vi httpd.conf
という風にsudoを付けてから書き換える。
#AddHandler cgi-script .cgi
という行があるので、行頭の「#」を取ってこの設定を有効化する私の環境では、396行目でした。


(3)adminユーザのWeb設定を変更する
OS Xでは、ユーザごとのWeb設定ファイルが存在するので変更しましょう。
設定ファイルは/etc/apache2/usersに全ユーザ分が入っています。今回はadminと言う名のユーザなので該当ファイルは
/etc/apache2/users/admin.conf
です。またしても一般ユーザでは書き込めないのでsudoを付けて編集しましょう。
cd /etc/apache2/users
sudo vi admin.conf
元々のファイルには、下記の内容(全6行)が書いてあります。

それを、以下の内容に変更してください。具体的には7行目以降を追加します。Optionsの行は、Apacheのドキュメントを参照して欲しいが、簡単に言うと「CGIの実行を許可」し、「ファイルの一覧表示を拒否」し、「言語の自動判別機能を不使用」としています。


(4)Webサーバの再起動
設定を変えたらWebサーバの再起動をしましょう。コマンドラインから再起動する方法が分からなかったので、システム環境設定 ー 共有 ー Web共有のチェックを一度外し、一呼吸おいてから再度チェックを付けることで再起動できます。

(5)CGIファイルを作る
CGIなので言語は何でも良いが、せっかく標準でインストールされているのでRubyを例に取ります。
cd /Users/admin/Sites/cgi-bin
vi test.cgi
と入力して、test.cgiを作ってみましょう。サンプルを以下に示します。

たった3行のプログラムです。試しにターミナルから実行してみましょう。viを終了したら、ruby test.cgiと入力すると、画面にcontent-type…以下略と表示されるはずです。もし表示されない場合はプログラムがきちんと入力されていないので確認して下さい。次に、このプログラムに実行属性をつけます。説明は省略しますが、ファイル作成直後のパーミッションは644なので、自分は読み書きが可能、他の人は読むだけです。これでは実行できないので、755の状態にします。
chmod 755 test.cgi
これでコマンドラインから直接実行できるはずです。試しに
./test.cgi
と入力してみると、確かに実行できます。

ここまで終わったら、次はWebブラウザから見てみましょう。
http://localhost/~admin/cgi-bin/test.cgi
にアクセスして、画面にOKと表示されれば(文字通り)OKです。

続く・・・のか? このエントリーをはてなブックマークに追加