しばらく前に、PythonのWebフレームワークである Pyramid を利用した。これがなかなか良くできており、Android端末上でも動かしてみたくなったので載せてみた。 ところで、自分が利用しているキャリアはドコモなんだけど、 spモード だとグローバルIPが割り振られないので外部から端末にアクセスできない。なので、spモードを契約せずに、 mopera U を利用している。mopera UであればグローバルIPが割り振られるのでアクセスすることができるからだ。このためだけに、spモードにせず、mopera Uにしていると言っても過言ではない。 閑話休題。まず、Pyramidを動作させるにはAndroid端末用のPython環境である SL4A を入れる必要がある。次にPyramidを入れるのだが、必要なモジュールなどが複数あるのでそれも一緒に入れる。一応、Hello Worldプログラムを動かすのに必要なものはすべて挙げたが、もし足りない場合は実行時に何が足りないかエラー表示が出るので、それを参考に入れて欲しい。また、 Android SDK が導入されていることを前提にしている。 まず、Android端末にシェルで入ってプログラムを展開するディレクトリを準備する。環境に合わせてディレクトリは読み替えて欲しい。 > adb shell * daemon not running. starting it now on port 5037 * * daemon started successfully * $ cd /sdcard/sl4a/scripts $ mkdir pyramid $ exit 適当なディレクトリで以下のプログラム・モジュールをPC側で展開する。 pyramid-master.zip translationstring-1.3.tar.gz venusian-1.0.tar.gz WebOb-1.4.tar.gz zope.deprecation-4.1.2.tar.gz zope.interface-4.1.2.tar.gz repoze.lru-0.6.tar.gz PC側からAndroid端末にプログラム・モジュールをコピーする。 > adb push pyramid /...
投稿
ラベル(Android)が付いた投稿を表示しています
最近、HTML5に触れる機会があり、その良さが何となく伝わってきたので、何かしら簡単なコードを書いてみたくなった。そこで、ちっちゃいけどリッチ、というギャップを楽しむためにAndroid端末を使うことにした。具体的には、Android端末を SL4A で ウェブサーバにして 、HTML5をインターフェイスにしたお絵かきBBSをPythonで書いてみた。 BBSでは絵とテキストを扱うことができて、それらはAndroid端末上でSQLiteのデータベースで管理される。利用者の利便を考えて、名前などはクッキーで保存する。3G回線や無線LANなどで接続することを考慮して、IPアドレスも取得できるようにした。また、書き込み時にサーバのAndroid端末が振動して書き込みがあったことを知らせてくれる。因みに、NTTドコモの3G回線で使うためには、グローバルIPが振られるmopera Uなどのサービスが必要で、spモードでは利用できない。 実際に作ってみたプログラムのスクリーンショットを冒頭に入れてみた。必要最低限の機能しかないが、それでも文章と画像を保存できるちゃんとした掲示板だ。草の根BBSのころを考えると隔世の感がある。 以下に今回作成したソースコードを載せておく。こんな短いコードでもちゃんと機能するのが不思議な感じだ。 image_bbs.py # -*- coding: utf-8 -*- import sys,os,cgi,sqlite3,datetime import socket,fcntl from wsgiref.simple_server import make_server import android droid=android.Android() LIMIT=10 # 最大表示記事数. DB_FILE='/sdcard/image_bbs.sqlite' P=8080 con=sqlite3.connect(DB_FILE) cur=con.cursor() cur.execute('CREATE TABLE IF NOT EXISTS bbs (id INTEGER NOT NULL PRIMARY KEY AUTOINCREMENT, user TEXT, datetime TEXT, ima...
ちょっと出先で手持ち無沙汰になったとき、なにかコードが書きたくなることってあると思う。その時に書くプログラムは何でもよくて、言語も選ばない。でも、駅で電車を待っている間とか、注文したメニューが来るまでとか、ノートPCを引っ張り出してまでやりたくはない。そんなとき、Android端末を片手に SL4A でコードを書くっていうのは丁度よい。 というわけで、ちょっと外出したときの暇な時間にSL4AのPythonで書いたコードが以下のコード。本当にくだらないプログラムなわけだけど、暇潰しにはなった。何をするプログラムか興味のある方は読み解いて欲しい。暇潰しぐらいにしかならないけど。まあ、勘のよい人ならファイル名だけでわかってしまうかも。 Android端末を持っている方なら、SL4Aのメニューを開いてAddを選択し、Scan Barcodeで冒頭のQRコードを読み込むことでソースコードを取得できる。SL4Aで書いたプログラムだけど、Android端末以外でもPythonの動作する環境なら大抵は実行できると思う。 Zm9yIGkgaW4gcmFuZ2UoMSwxMDEpOnByaW50J0ZpenonKigxLWklMykrJ0J1enonKigxLWklNSlvciBp.py exec(r"""%s'''gzga*%%%%,hmkl*ocr*nco`fc"a8ajp*mpf*a+\0円+.p%%%s'kormpv"mq.`cqg469gzga*`cqg46,fgamfgqvpkle*mq,rcvj,`cqglcog*]]dkng]]+Y8/1_++')))%%+++''')))"""%(lambda _:(_,_))("exec(''.join(map(lambda _:chr(ord(_)^2),"))
最近このブログではAndroidの SL4A ネタが多いのだけど、それだけ遊べるのだから仕方がない。SL4AのPythonを使えば実質一行で自動通訳プログラムを作ることもできる。日本語で喋った文章が翻訳されて英語の音声で返ってくる。 import android,urllib,urllib2,simplejson;droid=android.Android();droid.ttsSpeak(simplejson.loads(urllib2.urlopen('http://ajax.googleapis.com/ajax/services/language/translate?v=1.0&q=%s&langpair=%s%%7C%s'%(urllib.quote(droid.recognizeSpeech().result.encode('utf-8')),'ja','en')).read())['responseData']['translatedText']) このプログラムでは日本語を英語に変換するが、コード中の en を変更すれば別の外国語に通訳することもできる。例えば fr に変更すればフランス語に通訳される。ただし、通訳した外国語はGoogleによる翻訳の精度に依存するので、実用的に用いるにはもう少し精度が良くなって欲しいところだ。それでもこれだけ簡単に自動通訳プログラムを作れるのだからAndroidとSL4Aは大したものだと思う。 以下にもう少し分かりやすいコードを示しておく。ついでに翻訳結果をダイアログに表示するように変更してある。 translator.py # -*- coding: utf-8 -*- import android,urllib,urllib2,simplejson def translator(text,from_lang,to_lang): url='http://ajax.googleapis.com/ajax/services/language/translate?v=1.0&q=%s&langpair=%s%%7C%s'%(urllib.quote(...
先日、ドコモの GALAXY S を購入した。丁度1年前に購入した HT-03A からの機種変更になる。Androidのバージョンは1.6から2.2となり、性能は格段に良くなった。この1年での技術の進歩には驚かされる。GALAXY Sで SL4A が利用できるかは気になるところだが、実は購入する前に既に動作することを確認していたので、その点については心配なかった。もしSL4Aが使えなかったら、多分購入しなかったと思う。 この新しいAndroid機を使って、SL4AのPythonで日本語を喋らせてみることにした。英語であればttsSpeakのAPIを使えば一発なのだが漢字かな混じりの日本語では簡単には行かない。まずは日本語の発音を取得しなくてはならないが、それについては Yahoo! デベロッパーネットワーク の 日本語形態素解析 を使うことにした。これなら助詞の「は」も「わ」という発音であることがわかるし、後々、応用が効くだろう。 作成したソースコードは最後に示してあるが、短いコードで簡単に実装できた。使い方も簡単で、入力ダイアログから喋らせたい文章を入力するだけだ。それを形態素解析のWeb APIでXMLとして取得し、Beautiful Soupで解析している。取得した平仮名をその発音に近い英語に直すだけだ。ローマ字に置き換えるだけでは日本語として正しく発音されないので、適当にいじってある。 実用的なプログラムにしたければ、 Galatea Project などを利用して、ちゃんとした日本語を喋らせるようにしたほうが良いのだろうけど、形態素解析を使ってみたかったし、英語を無理やり日本語にするところも面白かったので、今回はこれで良しとした。やっぱり自分が楽しめないとね。 例によって、このプログラムを使って子供相手に遊んでみた。元の文章を知っていれば問題なく聞き取れるのだが、知らないと思ったよりも聞き取れないことを逆手に取って、何を喋っているかを当てるゲームをしてみた。こんな単純なことなのだが、子供たちは思いのほか楽しんでいたようだ。インチキ外国人ぽい雰囲気が面白いらしい。 作成したソースコードは以下の通り。 speak_ja.py # -*- coding: utf-8 -*- import android import sys,os...
最近になって日本においてもAndroid端末が続々と発表されて巷で賑わいを見せている。ドコモからは GALAXY S 、auからは IS03 、ソフトバンクからは Desire HD と立て続けに発売される。このほかにも年末までにタブレット端末を含めた複数のAndroid端末が発売されるようで結構なことだ。 Androidも盛り上がってきたし、Android端末を使って手軽で役に立つことができないか考えてみた。そこで今回、Android端末をウェブサーバにして、そこに電子掲示板システム(BBS)を構築してみた。これさえあれば不意にプライベートなBBSを使いたくなったときにいつでも利用することができる。たとえばライトニングトークやセミナーなどのようなイベントの参加者からその場でちょっとしたアンケートや感想を貰いたいときに便利ではないかと思う。ちょっとした話題作りにもなるかも。 電子掲示板システムの作成に必要なものはAndroid端末と SL4A /Pythonだけ。あとは今回作成した android_bbs.py を使えばいい。そして、SL4Aを使ってサーバを立ち上げてから、android_bbs.pyを起動すれば完了だ。SL4Aによるサーバの起動方法とアドレス取得については Pythonを使ってAndroid端末を5分でリモートカメラにする方法 で書いたのでそちらを参考にして欲しい。 今回の電子掲示板システムはPythonを使って即席で作ったこともあってエラー処理などを入れずに30行ちょいのシンプルな作りになっている。sqlite3モジュールによるSQLiteデータベースで記事を管理し、wsgiref.simple_serverモジュールを使ってウェブサーバ構築した。簡単だ。ただ、Android独自の機能は使っていないのでAndroid端末専用というわけではないけど。Android独自の機能を入れるとしたら、たとえばTwitterなどの投稿者の位置情報表示に対抗して、投稿者ではなくサーバの位置、さらに向きや速度も一緒に表示されるようにするとか。誰得な機能だけど。 以下にソースコードを示す。 android_bbs.py # -*- coding: utf-8 -*- import cgi,sqlite3,datetime from w...
Android端末をリモートカメラにしてしまう方法「Spycam」 という記事経由で Turn your Android Phone Into a Remote Spy Camera with Ruby in 15 Minutes を知った。 SL4A のJRubyを使ってAndroid端末を15分で遠隔操作のスパイカメラにしてしまえるらしい。これは面白い。そこで、Rubyが15分ならPythonを使って5分でリモートカメラにしてしまおうと思い立った。 まず、Pythonでは標準モジュールのSimpleHTTPServerやwsgiref.simple_serverを使って簡単にWebサーバを構築することができる。そしてSL4Aを使えばAndroid端末をそのままサーバとして起動させることができる。これを組み合わせればできたも同然だ。 それで書いたのが以下のコードだ。10行そこそこでAndroid端末をWebサーバに仕立て上げ、Webブラウザ経由で写真を撮ることができる。こんなちっこい端末がWebサーバになるなんて世の中進歩したものだ。 remote_camera.py import android from wsgiref.simple_server import make_server droid=android.Android() pic='/sdcard/snapshot.jpg' def camera(env,res): if env['PATH_INFO']=='/': droid.cameraCapturePicture(pic) res('200 OK',[('Content-type','image/jpeg')]) return [file(pic).read()] httpd=make_server('', 9998 ,camera) httpd.serve_forever() 使い方は次の通り。まず、SL4Aを起動し、メニューボタンから"View"を選ぶとダイアログが出てくるので"Interpreters"を選択する。 ...
以前、 Android上でPython、Lua、JavaScriptなどを実行するスクリプティング環境ASE (Android Script Environment) について記事にした。現在ASEはSL4A (Scripting Layer for Android)に変更され、機能がさらに進化している。APIの充実やインターフェイスの改良、スクリプト環境は独立になり、HTMLインタプリタ導入やAndroidパッケージ(APK)の作成などもできるようになった。そこで改めてSL4Aのインストール方法、使い方、Pythonによるアプリケーションの作成、QRコードによるソースコードの公開方法などを紹介する。 導入 まず、 SL4Aの公式サイト で最新版のSL4Aをダウンロードする。現時点では sl4a-r2.apk だが、頻繁に更新されるので注意すること。さらに必要なスクリプト環境をダウンロードする。BeanShell, JRuby, Lua, Perl, Python, Rhino (JavaScript)などがあるが、ここではPythonを選んだ。現時点での最新版は python_for_android_r1.apk になる。SL4Aとスクリプト環境は独立しているのでそれぞれをインストールする。 これらのAndroidパッケージは公式のものではないので、ダウンロード後インストールするためには、Android端末の設定で「アプリケーション」の「提供元不明のアプリ」にチェックを入れておく必要がある。 これでSL4AでPythonを使用するための準備は整った。 スクリプトの作成 SL4Aをインストールすると左のようなアイコンが出てくるのでそれをタップして起動する。Pythonスクリプトファイルの作成するには、メニューボタンから"Add"を選択し(スクリーンショット左側)、表示されるダイアログから"Python"を選ぶ(スクリーショット左から2番目)。そうすると、Pythonスクリプトの雛形を伴った編集画面になるので(スクリーンショット中央)、それを更新して作成する(スクリーンショット右から2番目)。ファイル名は自由に付けることができ、作成したスクリプトファイルは"Save & Run...
以前、 ASE (Android Scripting Environment) を使って「 AndroidからPythonでTwitterに投稿する 」という記事を書いたが、来月末にTwitterのBASIC認証が廃止されるので使えなくなる。そこで、OAuthを利用するコードに書き直してみた。最近はAndroidの twicca がとても使いやすいのでPythonスクリプトによるTwitterへの投稿もあまりないかもしれないが、Android端末単体でOAuthを利用したTwitterの認証ができることを示す意味でも公開することにした。 まず、「 コマンドラインで動作するOAuth対応TwitterクライアントをPythonで作ってみた 」という記事で用意したoauth.pyとoauthtwitter.pyをAndroid機の/sdcard/ase/scripts/ディレクトリにコピーする。これは adb pushでコピー してもいいし、SDカードに直接コピーしてもいい。oauthtwitter.pyは一部修正してあるので上述記事の該当箇所を参照して書き直して欲しい。 次に、それらのライブラリを利用して以下のようなコードを書いた。赤字で示した認証コードの部分はTwitterのサイトの OAuthクライアント登録 で取得する必要がある。 tw_oauth_ase.py #!/usr/bin/env python # -*- coding: utf-8 -*- import os, pickle, time, android from oauthtwitter import * CONSUMER_KEY = " CONSUMER_KEY " CONSUMER_SECRET = " CONSUMER_SECRET " KEY_FILE = "/sdcard/ase/scripts/twitter_key.dat" droid = android.Android() def twitter(): if os.path.isfile(KEY_FILE): access_token = pickle.load(file(KEY_FILE)) else: ...
Android Scripting Environment (ASE) について、「 Android上でPython、Lua、JavaScriptなどを実行するスクリプティング環境が凄い 」で紹介した。今回はAndroid端末の機能を利用するためのPython APIの使い方をリファレンスとしてまとめてみた。Python 2.6の標準モジュールは最初から利用できる。また、twitterモジュールなど、いくつかの標準外のモジュールがデフォルトでインストールされている。詳細については利用する環境で確認して欲しい。 ASE上のPythonスクリプトの編集画面でメニューボタンを押し、そこから"API Browser"で簡単なリファレンスを読むことができる。また、ASEのWikiとして Wiki pages - android-scripting 、サンプルプログラムとして test.py が参考になる。 以下にASE Python APIの簡易リファレンスを示すが、APIのすべてを記しているわけではない。足りない部分については随時追加していく予定だ。 Androidモジュールを使用する import android droid = android.Android() 現在のクリップボード取得と貼り付け clip = droid.getClipboard()["result"] droid.setClipboard("Hello, world!") GDataの使用 import gdata.docs.service client = gdata.docs.service.DocsService() # クライアント. client.ClientLogin(username, password) # 接続. feed = client.GetDocumentListFeed() # ドキュメントリストのAtomをフィード. GPSで現在の位置情報を取得 droid.startLocating() # 開始. location = droid.readLocation()["result"] lat = location[...
AndroidにASE (Android Scripting Environment)を入れて から楽しくてちょくちょくいじっているのだけど、Pythonに初めから twitterモジュール が入っていることに気が付いたので使ってみた。 普段はAndroid端末(HT-03A)のTwitterクライアントとして Twidroid を使っているのだけど、最初の立ち上げでタイムラインを取得しに行くのでちょっとだけ待たされる。あまり気にはならないけど、つぶやきをサクっと投稿したいだけならタイムライン取得は無駄なので、投稿専用のスクリプトを組んでみることにした。以下がそのコードだ。起動するとダイアログが出るのでつぶやきを書いて送信するだけだ。送信が完了したら画面に投稿したつぶやきが表示されて終了する。 # -*- coding: utf-8 -*- import android, twitter droid = android.Android() t = droid.getInput(u"Tweet", u"いまどうしてる?")["result"].strip() if t: api = twitter.Api(" username ", " password ") api.PostUpdate(t) droid.makeToast(t) これはすべてAndroid上でコーディングしたものだ。短いし、せいぜい数分もあれば書ける。書き終わったらそれをそのままホーム画面にショートカットアイコンとして登録すればいい。他にも、 bit.lyのAPIを使って短縮URLを実装 したり、サービスとして起動させ、特定のキーワードに引っかかったときにAndroidに通知させたり、メールを送信させたりすることも簡単だろう。やはり、スクリプトが使えるといろいろできて面白いな。
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[...
来月、海外に出張することもあってdocomoの HT-03A を購入してしまった。本当は海外で使うというのは口実で Androidアプリケーションを開発 したいだけだったりする。ここでは個人的なメモも兼ねて、Windows上でAndroidアプリケーションを開発するための準備について記しておく。 まず、 Eclipse Classic をダウンロード(現時点の最新版は3.5.1)して、それを適当なディレクトリに展開する。C:\に展開した場合、C:\eclipse\というディレクトリができる。因みに日本語版でも問題ないと思うが、自分は英語版のEclipseを使っている。 次に Android SDK をダウンロード(現時点の最新プラットフォームは2.0 "eclair")して、やはり適当な場所に展開する。C:\android\に展開した場合、C:\android\android-sdk-windows\というディレクトリが作成される。C:\android\android-sdk-windows\toolsを環境変数PATHに追加しておく。 展開したディレクトリにある SDK Setup.exe を実行すると、Android SDK and AVD Managerが起動するので、そのままプラットフォームをアップデートする。もし、SSLでエラーが出る場合は、Settingsの"Force https://... sources to be fetched using http://..."のチェックボックスをオンにすること。Installed Packagesでインストールされたプラットフォームを確認できる。必要なバージョンのプラットフォームがインストールされていないときは、Available Packagesで必要なバージョンをインストールできる。 Androidのアップデートが終わったら、Eclipseを起動させる。最初に作業ディレクトリ(workspace)を訊かれるが適当なディレクトリを指定する。起動したら[Help]-[Install New Software...]でAddボタンを押し、Nameに Android Plugin 、Locationに https://dl-ssl.google.com/an...
Androidについて、Google I/Oデベロッパーカンファレンスで行われたデモを見たけど良さそう。端末のアンロックにパスワードではなく、タッチパネルをなぞってパターンを認識させる方法は面白いと思った。Androidじゃなくてもここまでサクサク操作できる携帯電話があったら是非欲しいものだ。 以前、ここのブログでも 紹介 したように、開発はJavaで行われる。Androidのアプリケーションを作ってみたいけど、いくら開発するのに言語は関係ないといっても、どれもこれも全部違う言語だと大変だなぁ。現在、C/C++, Python, ActionScript3のほかに、仕事ではFortranも使っているし。しかも、言語だけを覚えていればいいというわけではなく、それの開発に必要なライブラリや既存のコード、そして環境についても知っておかなくてはならないわけで。うーん。 なんか話がずれてしまったけど、Androidには今後も注目していきたい。
Googleの携帯用OS、 Android のSDKが公開されている。しかも、それで作ったアプリケーションに対して 総額1000万ドル(約11億円)の賞金が出る そうな。審査は2段階(Challenge I, Challenge II)に分かれており、Challenge Iは2008年1月2日から3月3日までで50人が選ばれ25,000ドルがもらえる。さらに、Challenge IIは5月1日までで、Challenge Iで選ばれたものの中から10人が選ばれ27万5000ドルが贈られるようだ。さすがGoogle、桁が違う。 別に賞金に釣られてということでもないのだが、早速SDKを落としてみた。開発言語はJavaのようだ。んー、Javaはあまり好きじゃないんだけどなぁ。随分前のこと、Javaが発表されてすぐに飛びついてそのエレガントな設計に将来必ずこれはクルと思ったものだけど、その後のSunの対応などに嫌気がさしてJava自体も嫌いになってしまった。あとは、JITコンパイラなどの起動にいらいらすることが多かったってのもあるかな。決して悪い言語じゃないんだけどね。 そうは云っても、Javaで開発するしかないようなのでアイデアが浮かぶようなら挑戦してみようかな。そこそこのレベルであれば、Javaで開発することもできそうだし。やはりキモになるのはアイデア。良いアイデアさえあれば半分はできたようなもの(云い過ぎ?)。たまに考え付くことがあるけど、都合よく出てくるとは限らないので苦労する。何か小気味好いアイデアないかなぁ。 Google側としては、多少技術的に荒いソフトウェアでも良いアイデアを集めることができれば1000万ドルの価値はあるのだろう。携帯電話の良し悪しはアプリケーションの良し悪し(とインターフェイス)で決まると思う。