
導入
まず、SL4Aの公式サイトで最新版のSL4Aをダウンロードする。現時点ではsl4a-r2.apkだが、頻繁に更新されるので注意すること。さらに必要なスクリプト環境をダウンロードする。BeanShell, JRuby, Lua, Perl, Python, Rhino (JavaScript)などがあるが、ここではPythonを選んだ。現時点での最新版はpython_for_android_r1.apkになる。SL4Aとスクリプト環境は独立しているのでそれぞれをインストールする。
これらのAndroidパッケージは公式のものではないので、ダウンロード後インストールするためには、Android端末の設定で「アプリケーション」の「提供元不明のアプリ」にチェックを入れておく必要がある。

これでSL4AでPythonを使用するための準備は整った。
スクリプトの作成


さて、ここで実際にアプリを作ってみる。しばらく前にPythonワンライナーで数独ソルバを作成したのでそれをAndroidアプリとして作り替えてみた。ワンライナーではプログラム中に問題を埋め込んでいたが、Androidではそれダイアログから入力するように変えた。入力時に電話のテンキーにすれば素早く片手で入力できるようになるが、HT-03Aではなぜか全角文字になってしまったのでそれをASCII文字に変換するテーブルも追加した。さらに、ワンライナーのようなコンソールへの出力ではバックグラウンドでの動作ができないので、ダイアログで表示させるように変更した。作成したのが以下のスクリプトだ。
sudoku_solver.py
# -*- coding: utf-8 -*- import sys,android droid=android.Android() L=[] def S(D): if 0 in D: L.append(D.index(0)) A=D[L[-1]//9*9:L[-1]//9*9+9] B=D[L[-1]%9:81:9] C=[d for n in(0,1,2)for d in D[L[-1]//27*27+L[-1]%9//3*3+n*9:L[-1]//27*27+L[-1]%9//3*3+n*9+3]] for i in set(range(1,10))-set(A+B+C): D[L[-1]]=i S(D) D[L.pop()]=0 else: M=''.join(['%d'%d+('\n' if i%9==8 else ' ')for i,d in enumerate(D)]).rstrip() droid.dialogCreateAlert(u'解答',M) droid.dialogShow() sys.exit() T={ord(u'\n'):None,ord(u' '):None,ord(u'*'):u'0',ord(u'*'):u'0',ord(u'.'):u'0',ord(u'.'):u'0'} for i in range(10): T[ord(u'0')+i]=u'%d'%i P=droid.dialogGetInput(u'数独ソルバ',u'問題を入力してください:').result.strip().translate(T) S(map(int,P))
sudoku_solver.pyを起動するにはファイル一覧からsudoku_solver.pyをタップする。すると以下のような5つのアイコン(左から順に、コンソール上での起動、バックグラウンドでの起動、編集、ファイル名の変更、削除)が現れるのでそのうち左の2つのアイコンのどちらかを選ぶことで起動できる。今回はバックグラウンドで起動した。

起動後、以下のようなダイアログが出てくるので問題となる数独を入力する。空白部分は * もしくは . とする。

以下が入力が完了した状態。ここでOKボタンを押すと解析が開始される。

解析が完了すると以下のような解答が表示される。

スクリプトの共有
これでスクリプトによるAndroidアプリを作成することができた。作成したアプリを別の人にも使ってもらうために公開したい場合はどうすればよいのだろうか。ソースコードをそのまま公開することもできるが、それだと一々Android端末にコピーしなくてはならず、場合によっては打ち込み直すはめになり、面倒だ。そこで、QRコードを使ったスクリプトの共有がある。4,296文字という制限があるが、今回のような短いコードでは十分だ。
QRコードを作成するためにQR Code Generatorを利用する。ここのサイトで"Contents"を"Text"とし、"Text content"に、先頭行をファイル名(上述のスクリプトの場合 sudoku_solver.py )としたスクリプトのソースコードを入れる。"Barcode size"は"L"とする。これで"Generate"ボタンを押せばQRコードが生成される。
次にQRコードからソースファイルに戻す方法だが、Android端末でSL4Aを起動し、メニューボタンから"Add"を選ぶ。表示されるリストから"Scan Barcode"でQRコードを読み込むだけだ。ただし、Android 1.6以前ではバーコードスキャナーが入っていないので、Android MarketからZXingのQRコードスキャナー(無料)をインストールしておくこと。

これで簡単にコードを共有することができた。因みにこの記事の先頭に表示しているQRコードは今回作成した数独ソルバのソースコードになっている。
***
まだドラフト段階だがAndroidパッケージ(APK)の作成も可能だし、前回ではPCからadbによるコマンドラインでの操作を取り上げたが、いずれもPCとAndroid端末を繋いでの操作になり青空プログラミングという今回の趣旨から外れてしまうし、一回で説明するには記事が長くなってしまうので今回は割愛することにした。それらについては別の機会に書くかもしれない。
コメント