Ruboto-coreのReadmeをおおざっぱに訳してみた。
下記で訳してたものがまとまったので、こちらでも公開しておきます。
http://silentworlds.info/pukiwiki/?RubotoReadme
アップデートはwikiの方で行っていくのでご注意を。
オリジナル
2011/5/28最新のものを訳しています。
https://github.com/ruboto/ruboto-core/blob/master/README.md
ライセンス
古くなっていたり、翻訳が間違っている可能性もあるので、その点留意してご参照ください。
細かい表現を省いて訳している部分もありますので、ご注意ください。
インストール
$ gem install ruboto-core
はじめに
Rubotoを使う前に、次のことをやっておくこと。
JRubyのインストールはとても簡単。もしくはrvmも使える
- Android SDKのインストール
- `$PATH` にAndroid SDKの`tools/`を追加する
- Android エミュレータイメージを生成する。(実機で開発するなら不要)
コマンドラインツール
- アプリ生成コマンド(railsのアプリケーション生成に似てる)
- クラス生成コマンドは追加のActivity、BroadcastReceiver、Serviceなどを生成する
- コールバック生成コマンドは、多くのAndroidAPIのアクセスのために必要なサブクラスを生成する
- パッケージ処理はapkファイルを生成する
- デプロイ処理は、エミュレータか接続されたデバイスに、生成されたパッケージをデプロイする
- 変更のたびにコンパイルしないですむような開発
アプリ生成コマンド
$ ruboto gen app --package com.yourdomain.whatever --path path/to/where/you/want/the/app --name \
$ NameOfApp --target android-version --min_sdk another-android-version --activity MainActivityName
versionの値は、'android-'+SDKのレベル番号の形式をとること。(froyoの例 android-8 ).
クラス生成コマンド
rubotoのスクリプトで、Javaのクラス (Activity、Service、BroadcastReceiver) を生成する。同時にテストスクリプトも生成する。
$ ruboto gen class ClassName --name YourObjectName
Ex:
$ ruboto gen class BroadcastReceiver --name AwesomenessReceiver
コールバック生成コマンド
このコマンドで、特定のメソッドが呼ばれたときに、スクリプトに制御を渡せるようにどんなAndroid APIでもサブクラス化できるようにする。あなたがrubotoに制御を渡すAndroidインタフェースを実装することもできる。
サブクラス化する必要があるクラスの場合は、(例 PhoneStateListener, SQLiteOpenHelper, View)
$ ruboto gen subclass AndroidPackageAndClassName --name YourClassName --method_base all-on-or-none --method_include methods --method_exclude methods
実際の例:
$ ruboto gen subclass android.telephony.PhoneStateListener --name MyPhoneStateListener --method_base on
実装が必要なインタフェースの場合は、(例 OnClickListener or SensorListener)
$ ruboto gen interface AndroidPackageAndInterfaceName --name YourClassName
実際の例:
$ ruboto gen interface android.hardware.SensorListener --name MySensorListener
スクリプトの中で使う時は:
# java_importとは違うことに注意 ruboto_import "your.package.MySensorListener"
後ろの方で:
# コールバックオブジェクトを生成 @sensor_listener = MySensorListener.new # 呼び出しされるブロックの設定 @sensor_listener.handle_sensor_changed do |sensor, values| # Do stuff end # リスナーの登録
デプロイ処理
マーケットで公開する準備ができたら、いくつかやることがある。
まず、`keytool`でアプリの署名を行うためのキーを生成する必要がある。いくつかのしっかりした初期値を使うつもりがあれば、
$ ruboto gen key --alias keyの名前
というコマンドを、`--keystore /path/to/keystore.keystore`というオプションと共に使うことができる。それは、`~/.android/production.keystore`のデフォルト値となる。(?)
途中、keystoreと、キーそれ自身のための、パスワードを聞かれる。その二つのパスワード、キーの名前をちゃんと覚えておくこと。
キーはセキュリティに気をつけつつ、バックアップをしておくようにしておくように。(鍵をなくすと、アップデートがリリースできなくなる)
あなたのキーがあれば、`rake publish`タスクを使って、マーケットに公開できるapkファイルを作成できる。その際、環境変数`RUBOTO_KEYSTORE`と`RUBOTO_KEY_ALIAS`にkeystoreのパスと、キーの名前を下記のように設定すること。
$ RUBOTO_KEYSTORE=~/.android/production.keystore RUBOTO_KEY_ALIAS=foo rake publish
または`~/.bashrc`やそれに準じるファイルに設定してもよい。
そして下記を実行する。
$ rake publish
マーケットに公開可能なapkのできあがり。
スクリプトの更新
これまでのAndroid開発では、変更があるたびに、アプリをビルドし直して、デバイス/エミュレータにインストールしていた。
遅くて退屈であった。
Rubotoでは、幸運にも、変更のほとんどはJavaをコンパイルしないですむスクリプトの中だ。もし変更がRubyのみの場合、下記を実行するだけでよい。
$ rake update_scripts
チャンバラのための言い訳を無くしてしまったとしたら、ごめんなさい。
注意:
これは変更が全てRubyの中に収まっているときだけ、上手く動作する。Javaの変更(一般的には新しいクラスを生成したとき)、またはXMLの変更があったときは、再コンパイルが必要である。
また、この処理を行うため、リードオンリーのディレクトリに書き込むことが必要になるようなときに、デバイスのroot権限が必要になる。rootを取れないときの、最も簡単な解決方法はエミュレータでテストするということだ。
スクリプト
Rubotoがあなたに求める主なことは、Activity、BroadcastReceievers、Serviceの動作を定めるRubyスクリプトを書く能力である。(ゆくゆくは全てのクラスになるだろう。クラスが増えてもそれはさほど大変なことではない)
どんな風に動いているのか:
最初に、あなたのスクリプトは`assets/scripts/`にあり、スクリプトの名前はあなたのクラスと同じである。キャメルケース記法の代わりにアンダースコアを使っている。
Androidのクラスは、特定の状況で呼ばれるメソッドの全てを持っている。例えば、`Activity.onDestroy()`はActivityがkillされるときに呼ばれる。
変わった場合の対応として(JRubyのセットアップが必要な起動メソッドのような)、onFooBarを書くために、あなたはAndroidオブジェクトの中で、Rubyメソッド handle_foo_barを呼ぶ。(?)*1
あなたのスクリプトの中では、それらは`$class_name`として定義されている。これはまったくの概要なので、例を示す。
アプリを`--activity FooActivity`オプションを付けて生成するということは、rubotoはFooActivityを生成することを意味する。
`assets/scripts/foo_activity.rb`を好きなエディタで開いてみる。アプリが起動した時と破棄されたとき(onCreate、onDestroyのなかで)にLogを出すactivityが欲しいとき、スクリプトは下記のような感じである。
require 'ruboto.rb' #これ抜きではスクリプトは動かない $activity.handle_create do |bundle| Log.v 'MYAPPNAME', 'onCreate got called!' handle_pause do Log.v 'MYAPPNAME', 'onPause got called!' end end
下記のようなやり方を選択することもできる。やっていることは同じである。
require 'ruboto.rb' #これ抜きではスクリプトは動かない $activity.handle_create do |bundle| Log.v 'MYAPPNAME', 'onCreate got called!' end $activity.handle_pause do Log.v 'MYAPPNAME', 'onPause got called!' end
それぞれのクラスは、他の呼び出しをネストすることができるメソッドを一つだけ持つことができる(最初の例のように、二回目の`$activit.`の記述が不要になる)。(?)*2
ActivityとServiceのためには`handle_create`、BroadcastReceiverのためには`handle_receive`がある。
基本的なルールは、これはクラスのライフサイクルの最初のメソッドに依存している。
しかし、このようなことは気にするべきではない、それはジェネレータがクラスを作る時に、メソッド呼び出しのサンプルスクリプトを生成しているからである。
引数は`handle_`メソッドに与えたブロックに渡される。それらはJavaのメソッドが受け取った引数と同じである。(?)*3
Activityは、色々と簡単以するためにいくつか特別なメソッドをもっている。それらはdemo scriptsあたりを見れば分かるだろう。
合わせてruboto.rb fileを読めば、そこには全て定義されている。
テスト
それぞれの生成されたクラスについて、テストスクリプトはtest/assets/scriptsに生成される。
例えば、RubotoSampleAppActivityを生成したとすれば、test/assets/scripts/ruboto_sample_app_activity_test.rb がテストスクリプトのサンプルである。
activity Java::org.ruboto.sample_app.RubotoSampleAppActivity setup do |activity| start = Time.now loop do @text_view = activity.findViewById(42) break if @text_view || (Time.now - start > 60) sleep 1 end assert @text_view end test('initial setup') do |activity| assert_equal "What hath Matz wrought?", @text_view.text end test('button changes text') do |activity| button = activity.findViewById(43) button.performClick assert_equal "What hath Matz wrought!", @text_view.text end
Antまたはrakeを使って、テストを実行できる。
$ jruby -S rake test
$ cd test ; ant run-tests
プロジェクトへの協力
協力したいって?それは素晴らしい! irc.freenode.net の #ruboto で話そう。そしてプロジェクトをforkしてコーディングを始めよう。
「でも、プロジェクトをforkして協力していくほど、十分理解できてないのだけど」
気にすることは無い。下記のようなやり方もある。
- Rubotoを使い、どうしていけばよいか教えてほしい
- 何かよい考えがあれば、それをwikiに書いてほしい
- 考えがまとまったら、プロジェクトをforkすることをもう一度考えてほしい
プロジェクトへコードを提供するなら、既にあるテストを走らせて、あなたの変更分についてのテストも追加して欲しい。テストは下記のようにやって実行できる。
$ jruby -S rake test
ヘルプ
- Android APIについても多少詳しくあるべきだろう。 Developer Guide とReference が便利だ
- さらに詳しいドキュメントはwikiにある
- バグを見つけたり、リクエストがあるときは、GitHubを開いて項目を登録してほしい。
- irc.freenode.net の #ruboto とmailing list で質問を投げることができる。
- サンプルスクリプトは ここにある。
小ネタ
代替になるもの
Rubotoのパフォーマンスが問題であるなら、またはRubotoがまだできてないAndroidAPIへの全体的なアクセスが欲しいなら、Mirah と Garrett をチェックアウトするとよい。
Dubyとして知られる、Mirahは、Rubyに似た文法を持ち、Javaファイルにコンパイルされる言語である。これはランタイムへの大きな依存を避け、Javaで書いたのと同等の性能を出せることを意味する。これは性能が大きな問題となるモバイルデバイスによく適合するだろう。
Garrettは”Android上でのMirah評価用の遊び場”である。
Domo Arigato
以下の皆様に感謝:
- JRubyコアチームのメンバーのCharles Nutter氏へ。RSoCプロジェクトのメンテナンス、そしてirbで、最初にRubotoに取りかかってくれたことに対して。
- Ruby Summer of Codeの スポンサーの皆様へ。
- Engine Yardへ。RSoCとJRubyの協力なスポンサーとして。このプロジェクトの重要な部分を担っています。
- すべての Ruboto-coreコントリビュータ と Ruboto-irbプロジェクトのコントリビュータへ。多くのRuboto-irbのコードを参考にしてます。
*1:Save weird cases (like the "launching" methods that need to setup JRuby), to script the method onFooBar, you call the Ruby method handle_foo_bar on the Android object.
*2:Each class has only one method that you can nest other calls inside of [例 what is happening in that first example that removes the need for the second `$activity.`].
*3:The arguments passed to the block you give `handle_` methods are the same as the arguments that the java methods take. Consult the Android documentation.
Dalvikのソースコードを読んで分かったこと(1)
先週の横浜AndroidPF部の発表を、ぎっくり腰のために欠席してしまったためお蔵入りしてた資料を増強してアップしてみました。
途中疲れて説明がなげやりになってますが、あとでもう少しちゃんとWikiの方に反映させて行きたいと思います。
TokyuRubyKaigi03でLTしてきた(Rubotoのはなし)
自分の発表
今日開催されたTokyuRubyKaigi03でLTしてきました(スタッフとしてのお手伝いも少々)。案の定、発表時間が足りなくなってしまったので、少し補足を。
/
今回発表したのはRubotoについてです。
RubotoとはAndroidのDalvikVMの上でJRubyを動かすというプロジェクトです。
RubotoにはIRBアプリとRuboto-coreと呼ばれる、それ単体でAndroidアプリを作成するプロジェクトが含まれています。今回試したのはRuboto-Coreの方です。
AndroidアプリにはJavaで書いたActivity等が必要なので、Ruboto-Coreでは、自動的なコード生成と組み合わせることで、Rubyだけでアプリを書けるようにしています。
使ってみると起動が遅かったり、情報が少なかったり、取っ付きにくい部分はありますが、現在進行形で拡張されているんで、自分で拡張して行くつもりでさわってみるのが、楽しいんではないかと思います。
下のスクリーンショットはRubotoで作ったあみだくじアプリです。…が、フォントが等幅じゃないので、画面が盛大に崩れてしまった…orz
それとRubotoからのandroid.os.Handlerの使い方をまだよく理解してなかったので、たまたま動かしてたセンサイベントをトリガーにして画面更新させました。
加速度センサのイベントを取得する部分はRubyConf2010で発表された方のソースを参考にしました。
https://github.com/jackowayed/accelerate
$activity.handle_create do |bundle| setTitle 'Shake to Change Color' #加速度センサを使うした準備 @sensors = getSystemService Context::SENSOR_SERVICE accelerometers = @sensors.getSensorList(Sensor::TYPE_ACCELEROMETER) unless accelerometers.empty? @accelerometer = accelerometers[0] end @sensor = AccelerometerEventListener.new @sensor.handle_sensor_changed do |sensor_event| #ここでイベントキャッチ vals = sensor_event.values if Math.sqrt(vals[0] ** 2 + vals[1] ** 2 + vals[2] ** 2) > 12 #しきい値チェック getWindow.setBackgroundDrawable ColorDrawable.new(Color.rgb(rand(255), rand(255), rand(255))) end end setup_content do text_view :text => "shake!" end handle_pause do @sensors.unregisterListener @sensor, @accelerometer if @accelerometer end handle_resume do #センサの登録 #(自分の場合、二番目の引数がSensorManager::SENSOR_ACCELEROMETER じゃ無いと #エラーになってしまった。 #最初の"ruboto gen interface ..."のあたりが正しくなかったのだろうか…) @sensors.registerListener @sensor, @accelerometer, SensorManager::SENSOR_DELAY_UI if @accelerometer end end
もう少し理解を進めて、とりあえずちゃんとあみだアプリは完成させておきます。それ以外にも色々試したり、JRubyの勉強したりして、何か追加してみるなり、ちょっとでも貢献できればなと思ってます。
取りあえず自分の備忘録と、他の方のきっかけになればと思ってReadme訳してみてます *1。
情報は下記で随時更新していく予定です。
http://silentworlds.info/pukiwiki/index.php?Ruboto
イベントのこと
今回で3回目のTokyuRubyKaigiですが、今回はECナビさんの会場をお借りすることが出来て、以前の退廃ムードから一転、あか抜けた感じなったような気がします。
が、しかし、結局は酔っぱらいの集団なので終盤のぐだぐだはいつもの感じでしたw
ここまで酔っぱらってLTやるイベントはそうそうないと思うので、酒の勢いでLTデビューしたい方はぜひ参加してみるのが良いと思います。
参加された皆様、協力された皆様ありがとうございました。
次回開催予定日は10/29(とぅっ|じゅー肉の日)となっています。
当日の雰囲気は、下記のTogetterで少し分かるかも。
http://togetter.com/li/143092
Rubotoを調べてみる
最近、Rubotoを調べています。
RubotoとはAndroidの上で、JRubyを動かすプロジェクトです。
小さなプロジェクトですが、面白そうなのでちょっと追いかけてみようと思ってます。あんまり知っている人が多くなさそうなので、下記で調べて成果をまとめ中。
Readmeの翻訳もちゃんとできたら、こちらにも転載する予定。
- Rubotoについて
http://silentworlds.info/pukiwiki/index.php?Ruboto
- RubotoのReadme訳(まだ書きかけ)
三十路なのでお料理Ustream配信してみた
三十周年記念でUstream配信してみました。配信と言ってももくもくと料理を続けただけですが。
下記で夕方から配信しました。
http://www.ustream.tv/channel/kishima-show
作るもの(参考レシピへのリンクつき)
パテが思いのほか、それっぽく美味しくできたので感動しました。
ボルシチは缶詰ビーツだと色が弱いのか、あんまり赤くなりませんでしたが、優しい味で美味しかった。
ムニエルはちょっと塩気がたりなかったかなあ。でも見た目はとてもいい感じに仕上がった。
マリネはもう少しドレッシングを改善したい感じだったけど、鯛美味い。
しばしば言ってることだけど、料理をするというのは、何かを作ること。何かを作ることは楽しい。ほんとそう思います。ただ、部屋の掃除1時間、料理4時間の長丁場で、後半マジで疲れてふらふらしてきてしまったことに、三十路の現実を見せられた気がします。
未だ独身でふらふらしてますが、以前思っていたような追いつめられ感は無く、これからどうなるか楽しみ、という前向きな気持ちが生まれたのが、ここ2年の活動の成果かなと思います。
三十代、面白くして行きたい。
調べものメモ置き場を作りました
せっかくさくらVPSを契約してるので、調べものの成果を公開できるように自分用Wikiを作りました。
http://silentworlds.info/pukiwiki/
こちらでAndroidのソースコード読みの結果などを整理していこうかと思ってます。まずDalvikにトライ。