トップ «前の日記(2012-08-23) 最新 次の日記(2012-09-25)» 編集

Route 477



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の自動テストができる ()
  • 普通に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とかに書き込めばいいだけなので便利。