Scripting Layer for Android で Perl x Android

Shibuya Perl Mongers テクニカルトーク#14 に行ってきました。諸々面白かったですがパネルディスカッション、LT ともに id:kazuhooku さんの発表が良かったですね。

さて、Scripting Layer for Android (SL4A) を使って、PerlAndroid を hack する話をしてきました。SL4A は jRubyPerlPythonPHP などの言語を Android で使えるようにするアプリ。それぞれの言語からは AndroidFacade API と呼ばれる API で、Android のUIやカメラを操作できるというものです。

発表資料は以下です。

今日の発表では PerlAndroid 上の Toast (通知用のメッセージ領域) に echo を返す echo サーバーを作るという簡単なスクリプトを紹介しました。

で、面白いなと思ってその後も少しウェブを巡っていると http://handasse.blogspot.com/2010/09/pythonandroid5.html で、"Python を使って Android 端末を5分でリモートカメラにする方法" なんて hack が見つかる。これは SL4A で Android 端末上にHTTP サーバーを動かして、そのサーバーに HTTP GET すると、端末が API でキックされて写真を撮影する。その写真は GET を投げたブラウザ側に表示されるという hack。面白い!

というわけで、Perl でもやってみようと試みる。

HTTP サーバは HTTP::Server::Simple::PSGI で書けば数行で書ける。問題は、SL4A で追加の CPAN モジュールを動かすところですが、これは組み込みでは足りないモジュールを SDカード上の site_perl ディレクトリに放り込んでやれば ok。HTTP::Server::Simple::PSGI は依存が少ないので、都合が良い。

エミュレータ上のそれに転送するには

% adb -e push /Library/Perl/5.10.0/HTTP /sdcard/com.googlecode.perlforandroid/extras/perl/site_perl/HTTP

などとする。上記は HTTP 以下のモジュールをすべて丸ごと転送する例。

これで FileHandle.pm、File/* HTTP/* あたりを転送してやった。Pure Perl モジュールのディレクトリ全部を丸ごと放り込んでも良いかもしれない。

カメラ操作の HTTP サーバーの実装は以下。Python のそれを Perl に移植しただけ、簡単。

#!perl
use strict;
use warnings;

use HTTP::Server::Simple::PSGI;
use IO::File;
use Android;

my $pic = '/sdcard/snapshot.jpg';
my $droid = Android->new;

my $app = sub {
    my $env = shift;
    $droid->cameraCapturePicture($pic);
    local $/;
    my $fh = IO::File->new;
    $fh->open($pic) or die $!;
    return [
        200,
        [ 'Content-Type' => 'image/jpeg' ],
        [ $fh->getlines ],
    ];
};

my $server = HTTP::Server::Simple::PSGI->new(10082);
$server->app($app);
$server->run;

試しにエミュレータで動かしてみたら...

という感じで getprotobyname() の警告は出ているものの、なんとかバインドできている。CPAN モジュールの問題は解決されたし、echo サーバーが難なく動いたことを考えるとこれでいけるっぽい。

よーし、あとは実機のカメラで動かして・・・と思ったのですが、Xperia では SL4A の Perl (だけでなく Python なども) 動かない。 手元には Xperia しかない、というわけでここで終了。残念。でもまあ、CPAN モジュールを転送してやれば動くことが分かったし、HTTPサーバーも立てられそうだしというので収穫はありました。今日の進捗はここまでです。

SL4A は、まだデバッグが少し面倒ではありますが、本当にちょっとしたネタを実装するだけならすぐに仕上げられるのでなかなか楽しめます。