2010年2月25日木曜日

Android上でPython、Lua、JavaScriptなどを実行するスクリプティング環境が凄い

このブログ記事をはてなブックマークに追加

ASE (Android Scripting Environment)を使って簡単にPython, Perl, JRuby, Lua, BeanShell, JavaScript (Rhino), それにシェル(将来的にはさらにたくさんのスクリプト言語)をAndroid上で実行できるのはご存じだろうか。ASEのインストールからスクリプトの作成、実行まで、すべてAndroid単体でできる。もちろん、PC上でコーディングしたい場合は、USBで繋げてPC上のスクリプトをAndroid端末上で実行することもできるし、PC上のコードをAndroid端末にコピーすることもコマンド一発だ。さらに、各種センサー、位置情報、SMS、テキストの読み上げなどもスクリプト上で操作できるというのだからこれを使わない手はない。

そこで、試しにPythonスクリプトを書いてみた。Android端末のGPS機能で緯度経度を取得して、逆ジオコーディングで現在の住所を表示するスクリプトだ。Google Maps APIのURLなどを含めた雛形だけPCからAndroid端末(HT-03A)にコピーして、通勤時の電車の中で書いたのが以下のコードだ。

# -*- coding: utf-8 -*- import android, time, json, urllib url = "http://maps.google.com/maps/geo?ll=%.16f,%.16f&sensor=false&output=json&hl=ja&oe=UTF8&key=Google_Maps_API_Key" droid = android.Android() droid.startLocating() for i in range(10): location = droid.readLocation() if location["result"]: break time.sleep(1) lat, lng = location["result"]["network"]["latitude"], location["result"]["network"]["longitude"] geo_data = json.loads(urllib.urlopen(url % (lat, lng)).read())["Placemark"] geo_data = sorted(geo_data, key=lambda x: -x["AddressDetails"]["Accuracy"]) address = geo_data[0]["address"] droid.makeToast(address)

シェル環境が使えるので、print文を使ったデバッグも簡単だった。苦労すると思われたソフトキーボードもQWERTY配列と予測変換が使えるので思ったよりも楽だったし、トラックボールでのカーソル移動、コピー、カット、ペーストもある。できればキーボード付き端末が欲しいところだが、これからAndroid端末はたくさん出てくると予想されるので、そちらに期待している。早いところ、DroidXperia X10 mini proが日本で出て欲しいところだ。因みに、作成したスクリプトはASE上でも実行できるし、ホーム画面にショートカットアイコンを作って直接実行もできる。

本格的なAndroidアプリケーションを作成するにはAndroid SDKとJavaになるのだろうが、個人的に使う小さなスクリプトならASEの方が端末上でサクッと書けるし、比較的大きなコードでもPC上で作成し、PCに端末を接続してデバッグ、完成したら端末にコピーすればいい。それに、様々なスクリプト言語が使えるので、自分が使いたいスクリプトを選べるのも魅力だ。対話環境も利用できるのでスクリプト言語の勉強のために使うのもありだと思う。

以下に、ASEの導入方法と使い方を書いておく。

準備

ASEはGoogleの公式プロジェクトではあるが、ちゃんと認証を受けたソフトウェアではないので(将来的にはAndroid Marketで配布されるらしい)、Androidの設定で[アプリケーション]-[提供元不明のアプリ]のチェックをオンにしておく必要がある(インストール後にはオフに戻しておくこと)。次に、Android端末でandroid-scriptingのFeatured downloadsにある最新版をダウンロードして、そのままインストールする。

ASEを起動し、メニューを開くと[Interpreters]の項目があるので、それを選択する。初期状態ではShellだけが選択できるようになっているが、他のスクリプト言語を入れたい場合は、メニューを開いて[Add]を選択する。ダイアログが開き、複数のスクリプト言語が表示されるので、使いたい言語を選択する。選択すると自動的にダウンロードされインストールされる。

PCとAndroid端末を連動させたい場合は、PCにAndroid SDKをインストールする必要がある。以前に導入方法を書いたので、そちらを参考にして欲しい。

さて、これでASEを使用する準備が整った。

使い方

まず、端末上でのコーディング方法を説明する。ASEを起動してメニューを開き、[Add]を選択するとダイアログが開くので、作成したいスクリプト言語を選ぶ。ソースコードの雛形が出るので、それにコードを書いていく。書き上がったら適当なファイル名で保存する。実行するにはASEを起動した最初の画面で表示されるスクリプトファイルを選択してもいいし、スクリプトのショートカットを作っておいてホーム画面から起動してもいい。因みにショートカットを作成するには、ASE起動時に表示されるスクリプトファイルを長押しして[Add Shortcut]を選べばいい。

次に、PCとAndroid端末をUSBで接続してAndroid上で実行する方法を示す。これについては、Android ASE (Android Scripting Environment)入門を参考にさせてもらった。

最初にPCとAndroid端末をUSBで接続する。このとき端末側の設定で[アプリケーション]-[開発]-[USBデバッグ]をオンにしておく。

ASEのインタプリタ起動時に表示されるAP_PORTが55063で、PC上のポートを4321(任意の未使用ポートを選べる)とする場合は、Windowsでは以下のようにコマンドプロンプト(シェル)上で設定する。因みに%はプロンプトを示している。

% adb forward tcp:4321 tcp:55063 * daemon not running. starting it now * * daemon started successfully * % set AP_PORT=4321

最後にデーモンを停止してポートを閉じる場合は、以下のコマンドを使う。

% adb kill-server

また、PCにもAndroidで使用するスクリプト環境が入っている必要がある。例えばPythonを使う場合はあらかじめPCにもPyhton 2.6をインストールしておき、さらにandroid.pyを、PythonをインストールしたディレクトリのLib/site-packages/にコピーしておく。これでPC上で実行したスクリプトがAndroid端末で動作する。

最後に、PC上で作成したスクリプトをAndroid端末にコピーする方法だが以下のようにすればコピーできる。ただし、将来にわたってコピー先のディレクトリが不変である保証はない。

% adb push 作成したスクリプトファイル /sdcard/ase/scripts/

Android端末上のディレクトリを調べたい場合、

% adb shell

とすればリモートシェルが立ち上がるので、以下のように調べることができる。

$ cd /sdcard/ase/scripts cd /sdcard/ase/scripts $ ls ls saychat.py notify_weather.py speak.py weather.py saytime.py sayweather.py test.py $

注意事項

今回、HT-03Aで使用したのだが、入力方法がiWnn IMEやOpenWnnになっているとASEのインタプリタ上で文字を入力できなかった。入力するには入力方法をAndroidキーボードにする必要がある。ただし、スクリプトの作成・編集についてはどの入力方法でも問題はなかった。

追記(2010/4/5):

記事を書いた時点でのASEはase_r16.apkだったが、現在の最新版はase_r20.apkになっている。頻繁に更新されるのでダウンロードする際は最新版の確認をして欲しい。

追記(2010/6/27):

ASE r22からreadLocation()のデータ構造が変更されたようなので、それに合わせて上述のコードを修正した。

0 コメント: