2012-09-07
■ [mac][android] MacにEasyTetherをインストールしているとadb devicesで端末を認識できない
らしい。
解決法:
EasyTetherを無効にする:
$ sudo kextunload /System/Library/Extensions/EasyTetherUSBEthernet.kext $ adb kill-server $ adb devices
EasyTetherを有効にする:
$ sudo kextload /System/Library/Extensions/EasyTetherUSBEthernet.kext
■ [vim] Vimの補完(Ctrl-P/N)でインクルードされているファイルをスキャンしないようにする
~/.vimrcに以下のように書く。
set complete=.,w,b,u,t
デフォルトだと「i」が含まれていて、これのせいでRubyの標準ライブラリのソースとか延々読みに行って補完が遅いことがあったので。
■ [ruby][android] Rubotoを試す
わかったこと
- ケータイでRubyを動かして遊びたいだけならRuboto irbを入れるといい
- Rubotoアプリを動かすには別途Ruboto Coreというアプリを入れる必要がある
- これがJRubyのランタイムなのかな?
- 開発のためにJRubyをインストールする必要はない(CRubyでOK)
- rake testでGUIの自動テストができる (例)
- test-unitかと思ったが違いそう
- 普通にFileクラス使って/mnt/sdcard/foo.txtとかに書き込むことができるので楽ちん
作業メモ。
インストール
とりあえずJRubyを入れる。(ruboto gem自身はCRubyでも動くんだろうか?)
$ rbenv install jruby-1.7.0-preview2 Downloading http://jruby.org.s3.amazonaws.com/downloads/1.7.0.preview2/jruby-bin-1.7.0.preview2.tar.gz... Installing jruby-1.7.0.preview2... BUILD FAILED Inspect or clean up the working tree at /var/folders/kv/nddxhp4x1rj2hgw4x0dbcnt40000gn/T/ruby-build.20120907110436.14170 Results logged to /var/folders/kv/nddxhp4x1rj2hgw4x0dbcnt40000gn/T/ruby-build.20120907110436.14170.log Last 10 log lines: x jruby-1.7.0.preview2/tool/nailgun/src/ x jruby-1.7.0.preview2/tool/nailgun/src/c/ x jruby-1.7.0.preview2/tool/nailgun/Makefile.in x jruby-1.7.0.preview2/tool/nailgun/README.txt x jruby-1.7.0.preview2/tool/nailgun/ng.exe x jruby-1.7.0.preview2/tool/nailgun/src/c/ng.c x jruby-1.7.0.preview2/tool/nailgun/configure /var/folders/kv/nddxhp4x1rj2hgw4x0dbcnt40000gn/T/ruby-build.20120907110436.14170/jruby-1.7.0.preview2 /var/folders/kv/nddxhp4x1rj2hgw4x0dbcnt40000gn/T/ruby-build.20120907110436.14170 ~/proj/afpray ERROR: Could not find a valid gem 'jruby-launcher' (>= 0) in any repository ERROR: Possible alternatives: jruby-launcher
なんか失敗したので1.6.7.2を入れる。
いや、これもダメだなぁ。rubygemsサーバのトラブルかな。
http://rubygems.org/gems/rubotoからgemのURLを調べて直接wgetしてみると、tokyo-m.rubygems.orgがエラーを返している模様。 ~/.gemrcを編集して、sourceをhttp://production.s3.rubygems.orgにしてみる。gem i rubotoがうまくいった。CRubyに入れちゃったけどまあいいか。
アプリ作成
ruboto gen app〜でテンプレ作成。僕のINFOBAR A01はAndroid 2.3.3なのでandroid-10で。
% ruboto gen app --package net.route477.app1 --target android-10 Generating Android app App1 in /Users/yhara/Dropbox/proj/research/ruboto/app1...
普通にアプリができた模様。
アプリのインストール
(このへんで端末が認識できなくて試行錯誤する)
rake installでapp1がインストールされた。が、起動しない。adb logcatしてみると、
E/AndroidRuntime(11006): java.lang.RuntimeException: Either script or predefined class must be present.
と出ていた。まあまだ何も書いてないしな。
Activityを作る?
あとからActivityを増やす方法がわからない(追記:ruboto gen classらしい)のでapp2を作る。
% ruboto gen app --package net.route477.app2 --target android-10 --activity FooActivity % rak -ai foo AndroidManifest.xml 4| <activity android:name='FooActivity' android:label='@string/app_name'> src/foo_activity.rb 8|class FooActivity src/net/route477/app2/FooActivity.java 5|public class FooActivity extends org.ruboto.EntryPointActivity { test/src/foo_activity_test.rb 1|activity Java::net.route477.app2.FooActivity
と思ったが、そういえばデフォルトでsrc/app1_activity.rbというのが作られるんだった。
Either script or predefined class must be present
rake testでも同じエラーが出てる。
エラーのちょっと前を見てみる。printlnの結果が読めるみたいだ。src/org/ruboto/ScriptLoader.javaと照らし合わせる。
I/System.out(11866): RubotoActivity onCreate(): net.route477.app1.App1Activity I/System.out(11866): Looking for Ruby class: App1Activity I/System.out(11866): Found: null I/System.out(11866): Checking file: scripts/app_1_activity.rb I/System.out(11866): Classpath resource: null W/dalvikvm(11866): threadid=1: thread exiting with uncaught exception (group=0x4002d560) E/AndroidRuntime(11866): FATAL EXCEPTION: main E/AndroidRuntime(11866): java.lang.RuntimeException: Unable to start activity ComponentInfo{net.route477.app1/net.route477.app1.App1Activity}: java.lang.RuntimeException: Either script or predefined class must be present.
App1Activityがない→script/app_1_activity.rbを探す→ない→エラー ということらしい。そりゃあ、あるのはsrc/app1_activity.rbだもんなぁ。
(ここでまた試行錯誤) チュートリアルを見つつ、もしやと思って アプリ名をhelloにしたらいけた。もしやっていうか冷静に考えるとそれしかないんだが。 バグっぽいので報告した。
というわけでHello World的なもの(M-x butterfly)ができるようになった。
1.9って使えるのかな
改めてsrc/app_1_activity.rb(リネームした)を眺めると、ハッシュのsyntaxが1.8だ。JRubyはバージョンいくつかから1.9の文法をサポートしているはずだけど。
READMEにあるコマンドを実行してみる。
% ruboto update jruby Cannot find existing jruby jars in libs. Make sure you're in the root directory of your app.
だめだ。READMEの内容が古いのかも。
ちょっといじってみる
toast "Flipped a bit via butterfly (#{Time.now})"
ボタンを押すと時刻が出るようになった。
とりあえずここまで。
その後なんやかんやあって、ボタンを押すと就寝・起床時間が記録されるアプリができた。 普通にFile.openで/mnt/sdcard/foo.txtとかに書き込めばいいだけなので便利。