2010年6月29日火曜日

Rhodes_Debugger

以下のドキュメントは、英語の原文を日本語へ翻訳したものをRhomobile社の許可のもと、公開しています。
公式なドキュメントはRhomobile社のサイトをご覧ください。
また、この文書は2010/6/17(JST)の情報がもとになっています。
この日本語の翻訳について問題・質問などがある場合、コメントを残してください。それ以外については、本ドキュメント内にある問い合わせ先にお願いします。

The following document (a translation of the English original into Japanese) is published with Rhomobile permission.
If you need official documents, please visit Rhomobile site.
In addition, the following document is based on 2010/June/17 (JST) information.
If you have any question, problem about the Japanese translation, please leave your comment. Except for that, refer contacts in the document.


概要(Overview)

Rhodes Debuggerアプリは、platform/osx/Rhodes Debuggerにあります。デバッガをビルドするために使える場所に、Xcodeのプロジェクトがあります。

デバッガを起動することは、デフォルトでtcpのデバッガ接続をlistenします。あるチェックボックスは、ローカルエミュレータ実行をgdbを使用してスキャンする機能を有効にするチェックボックスがあります。

以下のメソッドを使ったデバッグは、アプリケーションで顕著なパフォーマンスの低下をもたらすことに注意してください。GDBのパフォーマンスの低下は、デバッガがアプリケーションに接続し、アプリケーションが再起動されるまで発生します。アプリケーションがデバッガに接続成功した場合、TCPのパフォーマンスの低下が発生します。

このビデオは、AndroidとiPhone上でのTCPを使ったデバッグを説明しています: http://www.youtube.com/watch?v=xtpjlIdOdQE

このビデオは、GDBを使用したデバッグを示しています: http://www.youtube.com/watch?v=dHJ3qvzjcuAを

TCPデバッグ

複数のプラットフォーム上でTCPデバッグが動作し、デバイスから実行することができます。

tcpデバッグを有効にするには、2つのアプリケーションにいくつかの小さな変更を加ええます:

  • extensuion net-httpとdebuggerをbuild.ymlに加えます。
 extensions: ["net-http", "debugger"]
  • rhoconfig.txtを変更し、最後の行にdebug_hostを追加します。デバイスやエミュレータが到達可能なデバッガアプリケーションが動作するマシンのIPアドレスを設定します。
debug_host = '192 .168.1.106'
  • application.rbを変更します。アプリのapplication.rbファイルの先頭で、最初のrequire行のあとに以下を追加します:
 require 'debugger'


次に、アプリケーションを起動することができます。そして、デバッガの下の文字が'Wating for Rhodes'から'Connected'に変わるでしょう。接続すると、rhodesアプリケーションを検査したり、ブレークポイントを設定したり、rubyコマンドを実行したりできます。

デバッグが終わったら、debuggerの切断ボタンをクリックして、アプリからdebuggerを切り離します。

gdbデバッグ

debuggerとiPhoneシミュレータが同じマシン上で起動するときだけ、gdbのデバッグは動作します。これはiPhoneのシミュレータとだけで動作します。

gdbデバッグを使うためにアプリケーションに変更は必要ありません。単にRhodes Debuggerアプリを起動し、gdbチェクボックスを選択してから、iPhoneのシミュレータでアプリケーションを起動します。debuggerはアプリケーションを検出し、自動的に接続します。



2010年6月26日土曜日

BuildingRhodes

以下のドキュメントは、英語の原文を日本語へ翻訳したものをRhomobile社の許可のもと、公開しています。
公式なドキュメントはRhomobile社のサイトをご覧ください。
また、この文書は2010/6/17(JST)の情報がもとになっています。
この日本語の翻訳について問題・質問などがある場合、コメントを残してください。それ以外については、本ドキュメント内にある問い合わせ先にお願いします。

The following document (a translation of the English original into Japanese) is published with Rhomobile permission.
If you need official documents, please visit Rhomobile site.
In addition, the following document is based on 2010/June/17 (JST) information.
If you have any question, problem about the Japanese translation, please leave your comment. Except for that, refer contacts in the document.


このページは、ソースからRhodesをビルドする方法を説明します。そしてアプリケーションがすべてのサポートされたプラットフォーム(iPhone, RIM BlackBerry, Windows Mobile, Android)で動作するようにします。

目次

前提条件-すべてのプラットフォーム

必要なソフトウェア

  • Ruby 1.8.6または1.8.7 - http://www.ruby-lang.org/en/downloads/ 。Windowsではrubyインストーラを使用してください。
  • RubyGemsは(v1.3.5以上) - http://rubygems.org/
  • GNU makeは3.80以降(gemに必要)。MacOS XやLinuxならば、おそらくすでにインストールされています。Windowsでは、ダウンロードhttp://gnuwin32.sourceforge.net/packages/make.htmして、どこかにインストールします。PATH環境変数が示す場所にインストールするときは、その場所に気をつけてください。
  • rhodes gem - 最新のrhodes gemをインストールするために"[sudo] gem install rhodes"を起動します。
  • JDKのバージョン1.6.0_2以上。 (推奨バージョン6.0アップデート11)- AndroidとBlackBerryに必要です。
1.6.0_13 Mac OSX 10.5 (インストール後、デフォルト・バージョンを変更するために"Java Preferences"ユーティリティを起動してください)
Sun JDK For Windows/Linux/ 注:32ビットWindowsのバージョンのBlackBerryツールで必要です。
  • JAVA_HOMEを設定して、JAVA_HOME/binがPATHにあることを確認します。
  • HOME環境変数を設定します:
 C:\Documents and Settings\<account_name>
  • TIP:rakeタスクやrhogemコマンドを実行している間に、"no such file to load -- something"というメッセージが表示されたなら、これは通常'[sudo] gem install something'することで解決されます。

Rhodesソースの設定

  • rhodes githubリポジトリをcloneします(まだない場合は、gitをhttp://git-scm.comで取得してください):
 git clone git://github.com/rhomobile/rhodes.git
cd rhodes
  • (省略可能)興味のあるブランチをチェックアウトします(でなければmaster):
 git checkout -f -b <branchname> --track origin/<branchname>
  • ブランチの最新であることを確認します:
 git pull
  • binフォルダをpathに追加します。Linux/Macでは、通常.profileで行います。Windowsでは、システムのコントロールパネルを介して行います。
  • rhodes-setupスクリプトを実行して、環境を設定します。これは自動的にインストールされたSDKを検出し、それらを確認したり、検出できなかったものを入力したりします。
rhodes-setup

iPhone

RhodesアプリのiPhone対応版は、Macマシン上でビルドする必要があります。以下の手順は、Xcodeの開発環境またはコマンドラインからどのようにビルドを行うかについて説明します。

前提条件

  • Mac OS Xの10.5(Leopard)もしくはそれ以降(Snow Leopard)
  • これらの手順に従います
  • iPhoneSDKのインストール(アップルは2.2.1以降のアプリしか提出をさせません。それはRhodesでも必須で、Rhodes1.2で始めましょう)
  • XcodeのIDE(強く推奨しますが、実際には必須ではありません)

XCodeでアプリケーションのビルド

  • build.ymlの'sdk:'の値に注意してください。以降の手順でこの値を使用します。
  • <前stepのsdkのディレクトリ>/platform/iphoneディレクトリに、iPhone XCodeプロジェクトがあります。
  • コマンドウィンドウを開き、アプリケーションのディレクトリに切り替えます。そして、以下のコマンドを実行します:
rake switch_app

これで、SDKフォルダ内のrhobuild.ymlがアプリケーションを指すようになります。

  • シミュレータ用にビルドするには、アプリケーションコードを変更した後に、XCodeで'Build and Go'を実行するだけです。
  • デバイス用のビルドならば、'rhorunner'ターゲットを開いて、アップル・デベロッパー・サイトからインストールしたコード署名情報を選択し、デバイスのアクティブSDKを変更します。
  • ヒント:変更を行った後、デバイスにそれらを反映させたいなら、シミュレータをリセットし、#2を繰り返します。
  • ヒント:デバイス発生していることのログを見るには、rhorunnerコンソールを前面に出すために、Xcodeでコマンド-シフト-rを入力します。

App Store用にビルドおよびリリース

上で説明したようにXCodeでアプリケーションをビルドできたら、他のiPhoneアプリケーションと同様に、AppStore用に署名と配布のときです。

コマンドラインからのアプリケーションのビルド

XCodeのGUIからアプリケーションを構築するのとは異なり、rhogenで生成したアプリのディレクトリからrakeコマンドを介して、コマンドラインからアプリケーションをビルドできます。

  • Rhodesアプリケーションのディレクトリに移ります。
  • build.ymlの内容を見て、applogの以下の設定を確認します。ここにフルパスを入力しないでください、このファイルはアプリのディレクトリにあります:
applog: rholog.txt
  • 実行
rake run:iphone
  • アプリケーションコードの変更後、
シミュレータのアプリケーションを終了してrake run:iphone

BlackBerry

BlackBerryは、Windows上でビルドが必要です。MacやLinuxで開発を行っていたならば、WindowsのRubyをインストールする必要があります。

前提条件

http://na.blackberry.com/eng/support/docs/subcategories/?userType=21&category=BlackBerry+Browser BlackBerryのバージョンを選択してドキュメントをダウンロードします。

rhodes gemを使ってのアプリケーションのビルド

  • アプリケーション・ディレクトリからbuild.ymlを編集、bbverにビルドするターゲットを設定します。
bbver:4.6

BlackBerryシミュレータへのビルドと実行

  • アプリケーションのルートディレクトリで起動
rake run:bb
  • 4.6のシミュレータのダウンロードメニュー項目からアプリケーションを起動もしくは4.3以前ではメインメニュー画面から起動
  • シミュレータを手動で閉じないでください。スクリプトはシミュレータを再起動します。
  • アプリケーションコードの変更後:
rake run:bb
  • アプリケーションログを見るには:
ログをオンにする:アプリケーションのメニューから menu\log\optionを選択します
log levelをInfoに設定し、MessageクラスをAPPまたは *. にして
BB 4.3以降

<simulator folder>\sdcard\rho\<app_name>でRhoLog.txtを開きます。
rhoconfig.txtを編集することでログの設定を変えることができます(アプリケーションの再起動が必要)
BB 4.2 以前
ログを見るには、build.ymlのapplogプロパティを使います。フルパスを入力するのではなく、ログ・ファイル名のみを入力します。ログ・ファイルはアプリ・ディレクトリにあります。フルパスを入力すると、ファイル名だけをログに記録しないと、ログファイルは、アプリのディレクトリにされる
  • BlackBerry4.6でフル・ブラウザモードをオンにします。rhoconfig.txtを編集します:
use_bb_full_browser = 1
  • BlackBerryの永続ストレージ利用モードをオンにするには、rhoconfig.txtを編集します:
use_persistent_storage = 1
  • すべてのデータ(データベースとログ)をクリーンにするには:
BB4.3以降
<simulator folder>\sdcardでrhoフォルダを消します
永続的なストレージモードでは:アプリケーションを削除するか、シミュレータ・フォルダでclean.batを実行しますBB4.3以前:シミュレータ・フォルダでclean.batを実行します

トラブルシューティング

  • 'rake config:checkbb'を実行し、何か問題がないか確認してください
  • Windowsコンソールからすべてのrakeスクリプトを実行します。bashや同様のツールを使用しないでください
  • エミュレータが起動したとき、BlackBerryインターネットブラウザを開き、いくつかwebサイトを参照します。webサイトを閲覧できない場合は:
MDSが動作しているかチェックします - それはエミュレータのコンソール・ウィンドウで動作しているはずです。manage connection(BlackBerryメニュー・ボタン)を開き、モバイルネットワークをチェックします
  • JAVA_HOME環境変数をチェック:それは最後に'bin'が含まれては_いけません_。
  • 'localhost'や'127.0.0.0'をsync source urlに使用しないでください。sync serverがコンピュータ上で動作している場合、ローカルコンピュータ名をsync serverの代わりに指定します。

デバイス用のアプリケーションをビルド

  • デバイスにロードするために、アプリケーションに署名する必要があります:
http://na.blackberry.com/eng/developers/javaappdev/codekeys.jsp
  • BlackBerryの証明書はファイル(sigtool.cskとsigtool.db)入手したら、ブラックベリーのJDKの'bin'フォルダに置くと、すべてのアプリケーションに署名します。
  • ターゲットデバイスがBlackberryのJDK 4.3以降である場合は、rhobuild.ymlファイル(Rhodes SDKフォルダ)の'env'セクション(ローズSDKのフォルダにあります)でパスワードを設定することができます:
 bbsignpwd: <password>
  • 実行
 rake device:bb:production

あるいは

 rake device:bb:debug
  • デバイスへデプロイ:
OTA(Over-The-Air)では: <application_directory>/bin/target

    • たとえば、'rake:bb:production'すると、ファイルがSDKのバージョンの名前のディレクトリに入ります。 /bin/target/4.6/ota-web
    • 多くの.codファイルとひとつの.jadファイルを見るべきでしょう。
    • すべてのこれらのファイルをWebサーバーにアップロードし、BlackBerryデバイス上のブラウザから、jadファイルを開きます。

トラブルシューティング

  • BlackBerryからCSIファイルを取得した後、それらを登録する必要があります。dblクリックした後に、"Already registered(既に登録済み)"メッセージが表示されます:

署名キーを登録しようとするとき、不適切なパスワードのエラー

  • ダイアログ'Would you like to create a new key pair file'の[Yes]を押した後、何も起きない。ダイアログもエラーメッセージもない:これはJava SDKおよびBlackBerrySDKのバージョンに問題があります。

秘密鍵プロンプトを受け付けたあと、署名キーのウィンドウが消える
異なるBlackBerryJDEバージョンのJavaバージョンのサポート

  • まだ問題がある場合:

手動でCSIファイルを登録

  • 署名ファイルは一台のコンピュータに一回だけ登録することができます。もしBlackBerrySDK4.6に例のためにそれらを登録した場合は、他のBBのSDKのbinディレクトリにsigtool.cskとsigtool.dbをコピーすることができます。
  • また、Windows 7でのBlackBerryシミュレータ上のネットワークに問題があります。これは、同期に障害が発生します。この問題に2つの回避策があります。1つは、シミュレータ内のネットワーク接続(ビルドスクリプトは自動的にこれを行います)にMDSを使用することです。2番目の回避策は、シミュレータでWiFi接続をエミュレートすることです。

デバイス上のアプリケーションログ

ログはファイル'rholog.txt'に書かれます。

  • デバイスにSDカードがあるなら、それはMedia Card\Rho\<app name>\にあります。
  • SDカードがないなら、それはDevice Memory\home\user\rho\<app name>\にあります。

ログファイルを見たり、コンピュータにコピーするには:

  • Logメニューアイテムをアプリケーション・メニューに追加します。(例として、sugarを見てください)
  • アプリのどこかでRhoConf.show_logまたはRhoConf.send_logを呼び出します。(例えば、設定ページ)
  • デバイスでメディア・アプリケーションを開き、Menu\exploreを選択します。ログファイルを見たり、bluetooth経由で送信できます。
  • SDカードがある場合:Phone options\memory\Mass storage support\ ON,saveします。ケーブルを介してデバイスをコンピュータに接続し、コンピュータのエクスプローラでUSBディスクドライブが表示されます。コンピュータに'rholog.txt'をコピーします。'Mass Storage support'をOFFにすることを忘れないでください、さもなければRhodesはファイルに書き込むことができません。

デバイスの接続性

携帯電話がWifi接続できるならば、Rhodesは特別な処理などせずにWifiを利用します。PRS方式の場合、以下のようにすべきです:

  • モバイルネットワークのセットアップ:Phone Options\Mobile Network\Data Services ON,Connection preferences:WiFi-Onlyでないこと
  • APNアドレスのセットアップ:Phoen Options\Advanced settings\TCP/IP/APN settingsをenableに。APNは、プロバイダを特定するアドレス(たとえばwap.cingular)です。


Eclipseを使用してRhodesをソースコードをビルド

  1. BlackBerry Eclipse IDEがインストールされている必要があります。
  2. rhodes\platform\bb フォルダに.metadataがないことを確認してください。また、rhodes\platform\bbのサブフォルダに.projectや.classnameファイルがないこともチェックしてください。
  3. Eclipseを起動して、ワークスペースディレクトリとしてrhodes\platform\bbを選びます。ワークスペースを作成しないでください!
  4. ファイル\インポートメニューを選びます。BlackBerry\BlackBerry JDEワークスペースノードを選択します。Nextを押します。rhodes\platform\bb\.BB.jdw\BB.jdwへ移動。Finishを押します。プロジェクトが自動的にビルドされます。
  5. Window\Preferencesメニューに移動します。BlackBerry JDE/Installed componets nodeを選択します。
  6. ターゲットデバイスにJDEのインストールディレクトリを選択します。EclipseはコンボボックスにインストールしたすべてのJDEを表示するわけでないので注意してください。この場合、Browseボタンを押して、必要なJDEを選んでください。BlackBerryのEclipseは、<Eclipse folder>\plug-ins\net.rim.eide.componentpack<version>にJDEがあります。
  7. 選択されたJDEのJavaホームディレクトリを選びます:jdk1.6.0_2 for JDE 4.2以上。
  8. MDSシミュレータノードを選択し、JDEディレクトリからMDSを選びます。OKを押します。
  9. ワークスペースが作成されます。ダイアログでclean all projectsを選びます。OKを押します。 RubyVMプロジェクトがビルドされますので、rhodes\platform\bb\RubyVM\RubyVM.jarをチェックしてください。
  10. <rhodescheckout>に移動し、'rake build:bb:rhobundle'コマンドを実行します。これで、rhodes\platform\bb\RhoBundle\RhoBundle.jarが作成されます。
  11. Eclipseに戻り、Project\Clean...、Clean all projectsを選び、OKを押します。

おめでとうございます。これですべてです。

Eclipseビルドでの既知の問題

時々、BBのEclipseプロジェクトが間違った状態でチェックされ、ロード後に正しくビルドできません。

  1. すべてのサブプロジェクトが、BlackBerryでアクティべイトされているのを確認してください(サブプロジェクトを右クリックし、[Activate for BlackBerry]メニュー項目を選択します)。
  2. プロジェクトの依存関係を正しく設定し、確認してください(Project\Properties...メニューを選択し、BlackBerryProject Dependenciesに移動)。次の依存関係を設定します:
    1. PersLiteは依存関係を持っていない
    2. PersImplJSR75はPersLiteに依存する
    3. RhoBundleはRubyVMに依存する
    4. RubyVMは依存関係を持っていない
    5. RhodesはPersLite、PersImplJSR75、RhoBundle、RubyVMに依存する

コード変更後の再ビルド

  1. <rhodescheckout>に移動し、'rake build:bb:rhobundl'コマンドを実行。これは、rhodes\platform\bb\RhoBundle\RhoBundle.jar を再作成します。
  2. EclipseでRhoBundleプロジェクトを右クリックし、Refreshを選択します。これで、rhodesとRhoBundleが再ビルドされます。Builderコンソールのメッセージを見ることができます。もしくは、ただClean all projectsします。

Eclipseシミュレータのデバッグ方法

  1. ツールバー(小さなバグアイコン)からDebug\Open debug dialog...を開きます。BlackBerryシミュレータノードをダブルクリックします。
  2. シミュレータのページに移動し、デフォルト以外のProfileを選択します。'Launch Mobile Data System Connection service with simulator'チェックボックスをチェックします。(注意:コンピュータにMDSがインストールされていること)
  3. Debugボタンを押します。シミュレータが起動します。Eclipseは、見つからないデバッグ・ファイルについて尋ねるかもしれませんが、'Don't ask me again button'を押します。( <JDE_HOME>\simulator\clean.batを実行してエミュレータを再度起動することで、エミュレータをクリーンにすることもできます)
  4. エミュレータ上でメニューボタンを押します。ダウンロードへ移動し、Rhodesを実行します。

Windows Mobile

RhodesアプリのWindows Mobileのバージョンは、Windows環境でビルドする必要があります。

前提条件

  • この手順に従う
  • .NET Compact Framework
  • のWindows Mobile 6 Professional SDK
  • Microsoft Active Sync 4.5
  • Visual Studio2005 Service Pack 1のインストール
  • 7 - ZIP: http://www.7-zip.org/

ActiveSyncメインウィンドウを開き、File->Connection Settingsに移動、"Allow connections to one of the following"チェックボックスを選択し、リストボックスから"DMA"を選びます。これは、エミュレータで動作するのに必要です。

コマンドラインでアプリケーションをビルド

  • C:\Program Files\Microsoft Visual Studio 8\VC\vcpackagesがPATHにあることを確認してください(vcbuild.exe)。ここでPATH環境変数に設定されるべきPATHのリストあげておきます:

C:\Program Files\Microsoft Visual Studio 8\Common7\IDE;C:\Program Files\Microsoft Visual Studio 8\VC\BIN;C:\Program Files\Microsoft Visual Studio 8\Common7\Tools;C:\Program Files\Microsoft Visual Studio 8\Common7\Tools\bin;C:\Program Files\Microsoft Visual Studio 8\VC\PlatformSDK\bin;C:\Program Files\Microsoft Visual Studio 8\SDK\v2.0\bin

  • アプリケーションディレクトリに移動します。ここから、Windows MobileのすべてのRakeタスクを実行することができます。
  • デバイス用のアプリケーションをビルドするには:
 rake device:wm:production
  • ビルド処理中にアプリケーションが自動的に署名させたい場合には、rhobuild.ymlの'build'セクションへ'wmsign'キーをフルパスで追加してください:
wmsign: <disk:/path/MySign.pfx>
  • Windows Mobileのコード署名についてのより詳細は以下で見つけることができます:

http://msdn.microsoft.com/en-us/windowsmobile/dd569132.aspx

IDEでのビルド

  1. githubからRhodesソースコードをcheckoutします
  2. Visual Studioで platform\wm\rhodes.slnを開きます。
  3. Windows Mobile 6 Professionalを開き、build Release configurationをを開きます。
  4. 'rhobuild.yml'をテキストエディタで開きます:
    1. CabWiz toolのパスを定義
    2. アプリケーションのパスを定義
  5. 'rake build:wm:devrhobundle'を実行
  6. エミュレータのクレードルを確認します(Tools->Device Emulator Manager->Select Running Emulator->Actions->Cradle)
  7. 前の手順から、rhodes.exeとrhobundle(platform\wm\bin\Win32\rhodes\Debug\rho)を My Computer->Mobile Device to \Program Files\rhodes(すべての古いファイルを上書きを保証するため、\Program Files\rhodes\rhoフォルダの中身を最初に消すこともできます) へコピーします。

アプリケーションを変更した場合:

  1. 'rake build:wm:devrhobundle'を実行して、アプリケーション・コードをコンパイルします
  2. platform\wm\bin\Win32\rhodes\Debug\rhoフォルダをデバイスまたは\Program Files\rhodes\rhoのエミュレータへコピーして、デバイスやエミュレータ上での変更を確認することができます。(すべての古いファイルを上書きを保証するため、\Program Files\rhodes\rhoフォルダの中身を最初に消すこともできます)

アプリケーションを変更した場合は、アプリケーションのrake taskを使用します:

  1. "rake device:wm"を実行し、アプリケーションコードをコンパイルする
  2. <appdir>\bin\target\rhodes.cabのコンテンツをデバイスもしくは \My Documents\のエミュレータにコピーし、ロードすると、デバイスまたはエミュレータ上で変更を確認することができます。(上書きを確実にするため、以前の.cabファイルを最初に消すことができます)

ウィンドウズエミュレータ

前提条件

  • この手順に従います
  • Visual Studio 2005 Service Pack 1もしくはVisual Studio 2008。
  • WTL:http://wtl.sourceforge.net/
    • フォルダ <VS path>\VC\WTLに解凍
    • Visual studioでTools\Options\Projects and solutions\VC++ directories. Platform - Win32を開くPlatform - Win32; Show directories for - Include files; そして以下を追加します
      $(VCInstallDir)wtl\include

コマンドラインでのアプリケーションビルド

  • C:\Program Files\Microsoft Visual Studio 8\VC\vcpackagesがpathにあることを確認します(vcbuild.exe)PATH環境変数に設定すべきPATHのリストは:

C:\Program Files\Microsoft Visual Studio 8\Common7\IDE;C:\Program Files\Microsoft Visual Studio 8\VC\BIN;C:\Program Files\Microsoft Visual Studio 8\Common7\Tools;C:\Program Files\Microsoft Visual Studio 8\Common7\Tools\bin;C:\Program Files\Microsoft Visual Studio 8\VC\PlatformSDK\bin;C:\Program Files\Microsoft Visual Studio 8\SDK\v2.0\bin

  • ビルドしエミュレータで動作させるため、rake run:win32を使います
  • すべてのバイナリをcleanするために、rake clean:win32を使います


ロギング

Rholog.txtは<rhodes folder>\platform\wm\bin\win32\rhodes\Debug\rho にあります。

Android

前提条件

  • Andriod SDK互換のOS(こちらをご覧ください )
  • この手順に従います
  • Android SDK Starter Packageをダウンロードします。
    • MacOSXでは<sdk>/tools/androidを(Windowsでは<sdk>/SDK Setup.exe)を起動します。
    • Settings で 'Force https://... sources to be fetched using http://'を選び'Save&Apply'をクリックします。
    • Available で Expand 'https://dl-ssl.google.com'を選びます
    • 最新のSDKのバージョン、SDKプラットフォーム1.5 API 3、およびGoogle API by Google Inc、AndroidのAPIを3をダウンロードします。
    • ANDROID_HOME環境変数をSDKをインストールした場所に設定し、<sdk path>/toolsをPATHに追加します。
  • Android NDKのダウンロードとインストール
    • Revision4はRhodes1.5では動作しないことに注意してください。
    • Rhodes1.5の場合は、Revision3をダウンロードしなければなりません(Googleはそのリンクをしていませんので、ダウンロードURLでr3をr4に変更してください)
  • rhodes-setupを起動して、RhodesにAndroid SDKとNDKをインストールした場所を教えます。
  • Rhodes1.5以降 - native geo mapping(MapView interface)で行う計画があるなら、2つのことを行う必要があります:
android:
apikey:"GOOGLE-API-KEY-FOR-ANDROID"
    • アプリケーションのbuild.yml(または<rhodes-root>/rhobuild.yml)'mapping'を有効にします。
 android:
mapping: yes


Rhodes1.2以前

Linux/MacOSX:

<android_sdk>/platforms/android-1.5/tools/dx を編集します。

javaOpts="-Xmx215M"のコメントを外し、以下のように変更します:
javaOpts="-Xmx768M -Xms768M"

Windowsの場合:

<android_sdk>/platforms/android-1.5/tools/dx.bat を編集します。

最後の行を変更します:

call java -Xmx768M -Xms768M -Djava.ext.dirs=%frameworkdir% -jar %jarpath% %*

Rhodes1.4以降を使っているなら、必要ありません。




注:ユーザーのAndroid 1.5(以降)のユーザへの特別な注意

アプリケーションをチェックして、htmlページにcssファイルをincludeする方法を変更します。

たとえば、以下のようになります。

これを

  <style type="text/css" media="screen">@import "/public/js/iui/iui.css"; @import "/public/css/rho.css";</style>

以下で置き換えます

  <link rel="stylesheet" href="public/js/iui/iui.css" type="text/css">

<link rel="stylesheet" href="public/css/rho.css" type="text/css">

そうしないと、cssファイルはAndroid1.5にロードされません。

ラインコマンドからアプリケーションを実行

  • PATHにjava binディレクトリがあることを確認してください
  • コマンドラインから、rhodesアプリケーションディレクトリで、実行:
 rake run:android
  • もしrakeコマンドがスタックしたら、コマンドウィンドウをkillすることができます。別のウィンドウを開き、以下を実行します
 adb start-server
rake run:android


  • 注:最初に、エミュレータの設定についていくつかの質問を求められます。ほとんどの質問に"yes"と答えるか、デフォルトの答えを使用すべきでしょう。これは、AVD configurationの作成に要求されるものです(これはAndroid1.5の新機能です)

コマンドラインからのRhodes.apkのビルド

  • コマンドラインから、Rhodesアプリケーションディレクトリで、以下を実行します:
 rake device:android:production
  • デバイスにインストールする前に、あなた自身が所有する秘密鍵で署名する必要があります。アプリケーションに署名する方法: http://developer.android.com/guide/publishing/app-signing.html デバイスにインストールするためアプリケーションの準備の仕方の例です:
所有するキーと証明書を格納するkeystoreを作成します。一度だけこの操作を行う必要があります。
    % keytool -genkey -v -keystore my-release-key.keystore -alias alias_name -keyalg RSA -validity 10000パスワードを指定し、すべての質問に答えてください。
新しく作成されたkeystoreを使って、アプリケーションに署名します:
% cd <rhodes-app-dir>/bin/target
% jarsigner -verbose -keystore my-release-key.keystore Rhodes.apk alias_name

アプリケーションが署名されたことを確認します:
    % jarsigner -verify Rhodes.apk
jar verified.
署名されたアプリをデバイスへインストールします:
    % adb install Rhodes.apk

EclipseでRhodes.apkをビルド

  • 以下のディレクトリに新しいワークスペースを作成します:<Rhodes>/platform/android
  • Window>Preferencesに移動
  • tree上でAndroid nodeをクリックし、インストールしたAndroid SDKへのファイルパスを指定します(例:E:\android\android-sdk-windows-1.6_r1)
  • 次のディレクトリからすべてのプロジェクトをインポート:<Rhodes>/platform/android
  • 自動的にソースのビルドのオプションを設定した場合、すべてがインポートの直後にコンパイルされます


===Rhodes1.2または下位===
* treeのGeneral/Workspace/Linked Resources nodeをクリックし、関連するSettingsWindowの右側の"New..."をクリックします。
RHO_SHARED変数を作成し、共有フォルダへのファイルパスを設定する必要があります。例えば:
RHO_SHARED E:\Projects\rhomobile\1-2-stable\platform\shared
*Preferences windowを閉じます
*rake build:android:rhobundle でRhoBundleプロジェクトをビルドします。
*変更をリロードするためにRhodesプロジェクトをリフレッシュします。
*自動的にソースのビルドを行うオプションを指定していないなら、Project/Clean...メニュー項目をクリックし、RhodesとRubyJVMプロジェクトを選択します。OKをクリックして、プロジェクトをクリーン・再ビルドします。

SDK1.5以降:

Rhodesプロジェクトを右クリックし、Androidの1.5ターゲットを選択します。

binディレクトリを確認します。Rhodes.apkファイルが作成されたのを確認してください。これは、SDKで提供さるデバッグキーで署名されます。

これで、デバイス/エミュレータへアプリケーションをインストールする準備が整いました。

アプリケーションapkファイルのインストール

エミュレータへapkをインストール

エミュレータ上でRhodesベースのアプリケーションを起動させるには、アプリケーションフォルダで'rake run:emulator'と入力するだけです。例:

 [user@laptop ~/rhodes-system-api-samples]$ rake run:android

これは、(必要ならば)エミュレータ上に新しい仮想sdcardを作成し、すでにエミュレータが動作していないか(もし動作していないなら実行し)確認し、そこのアプリケーションをアップロードします。アプリケーションのbuild.ymlで実行するエミュレータのバージョンを指定することができます:

 android:
version: 2.1

apkをデバイスへインストール

Androidデバイスがある場合は、Androidのアプリケーションの開発・デバッグを普通にできます。エミュレータ上と同様にデバイス上でアプリケーションを起動しますが、実際に始める前にいくつか行わなければなりません。

関連するAndroidのドキュメントのリンクをチェックしてください:http://developer.android.com/guide/developing/device.html

そして、アプリケーションフォルダに移動し、rake run:android:device'を実行します。例:

 [user@laptop ~/rhodes-system-api-samples]$ rake run:android:device

デバイスが接続されているかは、SDK tools/ディレクトリから"adb devices"を実行することで確認することができます。接続している場合、デバイス名は"デバイス"として表示されます。

アプリケーションのアンインストール

エミュレータからアンインストール

 [user@laptop ~/rhodes-system-api-samples]$ rake uninstall:android

デバイスからアンインストール

 [user@laptop ~/rhodes-system-api-samples]$ rake uninstall:android:device

デバイス/エミュレータからログを取得

デバイスやエミュレータからログを取得するには、アプリケーションフォルダまたはrhodesソースツリーのルート(rhobuild.ymlがある場所)から'rake device:android:getlog' もしくは 'rake emulator:android:getlog'コマンドを実行します。アプリケーションログはデバイス/エミュレータから取得され、RhoLog.txtの名前でアプリケーションディレクトリに格納されます。

Symbian

注:Rhodes v1.1への要求の増加により、Symbianのサポートは中断しています。RhodesアプリのSymbianバージョンのビルドにもWindows環境が必要です。

前提条件

  • 次の手順に従います
  • Nokia Series 3rd Edition SDK for Symbian OS
  • Active Perl 5.6.1

前提条件(FP1)

  • PIPS library
  • Open C/C++ Plug-ins for S60 3rd Edition

インストール手順

現在、FP2の使用だけが推奨されます。それはFP1 SDKブラウザはPOSTリクエストでよく知られた問題があるからです。

  • Nokia Series 60 3rd Edition SDK for Symbian OS:
Feature Pack 2をお勧めします。以下からダウンロードすることができます: http://www.forum.nokia.com/Resources_and_Information/Tools/Platforms/S60_Platform_SDKs/注:SDKとRhodesフォルダは同じ論理ディスクドライブ上にある必要があります。
  • Active Perl v5.6.1
注意:バージョンは5.6.1限定でダウンロードはここ

インストール手順(FP1)

  • PIPS library:
'pips_9_1_s60_sdk_1_2.zip'ファイルをダウンロード: http://developer.symbian.com/wiki/pages/viewpageattachments.action?pageId=1411アーカイブからファイルを解凍します。そして、pdfの指示に従って、ファイルをs60 SDK systemディレクトリにコピーします。
  • Open C/C++ Plug-ins for S60 3rd Edition.
ダウンロードします: http://www.forum.nokia.com/info/sw.nokia.com/id/91d89929-fb8c-4d66-bea0-227e42df9053/Open_C_SDK_Plug-In.htmlプラグインのセットアップのため指示に従います。

rhodes gemを使ってアプリケーションをビルドする[1.0 のみ - 1.1ではbuilding symbian from sourceに飛んでください]

HOME環境変数を設定します。それは任意のディレクトリで、例として:

 C:\Documents and Settings\<account_name>

HOMEディレクトリにrho_build.confファイルを作成し、そこにアプリケーションのディレクトリを定義します:

 apps.dir=<path to test_application>

アプリケーションディレクトリのbuild.ymlを編集します:

 symbiantools: C:/PROGRA~1/COMMON~1/Symbian/Tools
symroot: <symbian SDK root>

もし必要なら、'symbian'セクションのcertification parametersを変更します

rake -Tが利用できるrakeコマンドを表示します

Symbianシミュレーションを使ったビルドと実行[FP1 SDK]

注:FP1 SDKエミュレータは、ブラウザでPOSTリクエストで問題があることが知られています。この場合、FP2エミュレータでテストすることをお勧めします。デバイスのRhodesをビルドするには、FP1とFP2のSDK双方とも利用することができます。

  • C:\Symbian\9.2\S60_3rd_FP1\Epoc32\winscw\c\system\data\config.iniを以下のように編集します:

[STDIO]
STDIN = MEDIA1
STDOUT = MEDIA4
  • デバッグ出力を表示するには:
空のファイル"in.txt"をC:\Symbian\9.2\S60_3rd_FP1\Epoc32\winscw\c\system\data folderに作成します
  • アプリケーションのルートディレクトリで実行します:
 rake run:symbian:app
  • シミュレータが自動的に起動されます。注:シミュレータ最初起動に非常に長い時間がかかります。以降の起動は早くなります
  • Rhodesアプリケーションが自動的に起動されます。メニューの'Installed'>Rhodesへ移動し、アプリケーションのコンテンツを表示します。


Symbianシミュレータを使ってビルドと実行[FP2 SDK]

[注意]この機能はバージョン1.1のみで利用可能です。

  • SDKをインストール
  • 以下のようにC:\S60\devices\S60_3rd_FP2_SDK_v1.1\epoc32\winscw\c\system\data\config.iniを編集します:


[STDIO]
STDIN = MEDIA1
STDOUT = MEDIA4
  • 空のファイル"in.txt"をC:\S60\devices\S60_3rd_FP2_SDK_v1.1\epoc32\winscw\c\system\data folder に作成します。

[注意]複数のバージョンのSDKをインストールしていて、Carbideを使っているならば、すべてのプロジェクトがFP2 SDKを使うように設定されていることを確認します(build configuration optionsをチェックします)。

  • アプリケーションのルートディレクトリで、利用するSDKへの正しいパスがbuild.ymlで"symroot"に設定されていることをチェックします。
  • 最初に、Symbianエミュレータをstart>Programs>S60 Developers Tools>3rd Edition FP2>v1.1>Emulatorから起動する必要があります。そして、Tools>Preferencesメニューを開き、"General Settings"タブへ移動し、 Memory Capacity valueを96MBに設定します。
  • アプリケーションのルートディレクトリで以下を実行します:
 rake run:symbian:app
  • Rhodesアプリケーションが自動的に起動されます。メニューで‘Installed’>Rhodesへ移動し、アプリケーションのコンテンツを表示します。

デバイス用のアプリケーションをビルド

  • 携帯電話にPIPSライブラリをインストールします:
 rhodes\platform\symbian\lib\pips_nokia_1_3_ss.sis
  • SISパッケージに署名するには、有効なシンビアンの証明書とキーが必要です。署名されたパッケージ(SISX)のみが実際のデバイスにインストールすることができます。
http://developer.symbian.com/wiki/display/pub/The+Complete+Guide+to+Symbian+Signed,
{1}http://www.symbiansigned.com{/1} へ移動しhttp://www.symbiansigned.com指示に従って、Symbianアプリケーションに署名するための有効な証明書/キーを取得します。証明書(.cert)とキー(.key)を"symbian/rhodes/sis/cert/"フォルダへ配置します。注:自己署名生成キーを使用することができます。
  • アプリケーションのルートディレクトリで
 rake device:symbian
  • コンパイルされ署名されたrhodes.sisxファイルが以下にあります:
 $(application root)\bin\target\symbian

ソースコードからrhodesのビルド

以下を:

   static const char* const KSuppressPlatSecDiagnostic =
KSuppressPlatSecDiagnosticMagicValue;

このように変更します:

 #if defined(__cplusplus) 
static const char* const KSuppressPlatSecDiagnostic =
KSuppressPlatSecDiagnosticMagicValue;
#endif
  • Symbian C + +の開発環境をインストールします。望ましいのは:"Carbide C++ v2.0"で、以下からダウンロードします。
http://www.forum.nokia.com/main/resources/tools_and_sdks/carbide_cpp/
  • ビルド・プロパティを編集します:
'rhodes\platform\symbian\build'ディレクトリの'build.properties'ファイルをオープンします。
S60_3rd_FP1=<path to symbian SDK>

注意: このパスはドライブ・レターを含んではなりません。そして最後にスラッシュ(/)がなければなりません。
デバイスのビルドには'build.target=GCCE UREL', エミュレータのビルドには'build.target=WINSCW UDEB'
をデフォルトのSDKをSDK=S60_3rd_FP1に設定します。
  • 必要なすべての環境変数を作成します:
'<Carbide20>\x86Build\env_switch\env_update.exe'をコマンドラインから実行します。

サポートされているAntのターゲット

  • RUBYOPT変数を解除します。Windows上のデフォルトでは、RUBYOPT変数が設定されていますが、これは必要でははありません:
set RUBYOPT= 
  • 次のAntターゲットを実行することができます:
build-all                     : to clean + build + make sis + sign sis (no checkout)
build-selfsign : to clean + build + make sis + selfsign sis (no checkout)
build-build : to build + make sis + sign sis (no clean, no checkout)
build-sis : to make sis + sign sis (no clean, no checkout, no build)

rhobundle                     : to make rhobundle

2つのオプションがあります:

  • 作業ディレクトリでパッケージをビルドします(ターゲットは'build-'プレフィックスから始まります)
  • RhoBundleをビルド

パラメータなしで"ant"コマンドを使うことで、サポートされているターゲットを見ることができます。注意:それぞれのターゲットで、SDKパラメータでSDKバージョンを指定しなければなりません。たとえば、以下のようになります。

ant build-all -DSDK=S60_3rd_FP1

これは、S60_3rd_FP1 SDKを使ってビルドします。(build.propertiesファイルで分かるように)

出力ファイル(およびログ)は'rhodes\platform\symbian\bin'に配置されます:

  • "rhodes_v-x.y.z.sis"はメインパッケージです
  • "rhodes_v-x.y.z.sisx"はメイン署名付きパッケージです

Carbide.C++の手順

  • ワークスペースのディレクトリをroot..\rhodesディレクトリにします。
  • 次のプロジェクトをインポートする必要があります(Carbideでbld.infのインポートを選択します)
  rhodes\symbian\shttpd\group
rhodes\symbian\SQLite60\group
rhodes\symbian\rubylib\group
rhodes\symbian\rhodes\group

  • Carbide IDEは相対ファイルパスのインデックスをサポートしていません。この問題は、bld.infのインポートに負の影響をもたらします。なぜなら、それぞれのプロジェクトに外部のincludeディレクトリが含まれているからです。

この問題を解決するために、それぞれのプロジェクトごとに.mmpファイルをオープンする必要があり(インポートの成功のためにも必須です)、USERINCLUDEとSOURCEPATHのlinksを一時的に“..\..\” と “..\..\..” を先頭に付けてコメントする必要があります。

このようなリンクの例:

  USERINCLUDE    ..\..\SQLite60\src
USERINCLUDE ..\..\..\shared\json
USERINCLUDE ..\..\..\shared\syncengine
USERINCLUDE ..\..\..\shared\ruby
SOURCEPATH ..\..\..\shared\shttpd\src
  • プロジェクトのワークスペースへのインポートが成功したら、USERINCLUDE linkのコメントを解除する必要があります。
  • RhodesプロジェクトのProject Propertiesを開き、Project Referencesへ移動し、すべてのプロジェクト(rubylib、shttpd、SQLite6)をチェックしてください。

HOWTO:アプリケーションの名前とアイコンをカスタマイズ

gemsを使用(1.1.1 - 1.2.1)

Gemのバージョン1.2.2以降、次のセクションの手順を使用します(ソースを使用します)。


カスタムベンダー名、アプリケーション名とアイコンを設定するには、以下の手順を行う必要があります:

  1. アプリケーションのルートディレクトリにあるbuild.ymlをオープン
  2. "vendor"変数が存在する場合、変更して、新しいベンダ名を設定します
  3. アプリケーション名を設定するには"application-name"変数を変更します
  4. アイコンのディレクトリの変更を設定するには "application-icon-dir"変数を変更します

例えば、(build.yml):

 env:
version: 1.1.1
vendor: VDGGroup
application-name: SugarCRM
application-icon-dir: E:/MyDocuments/My Pictures
...

注:アプリケーションのアイコンは名前が以下のように必要があります:

  • icon.png:BB,iPhoneとAndroid
  • con.ico:WM
  • icon.svg:Symbian

ソースの使用

  • 現在のところiphone、Android、BlackBerrryで動作します

Xcodeを使ってのiPhone

  • target->info->General->Name
  • Target->info->Build->Product Name (すべてのconfigurationsで)
  • rhodes\platform\iphone\icon.png - オリジナル・アイコンに変えます
  • rhodes\platform\iphone\Info.plistをチェックします。BundleName=${PRODUCT_NAME}があるはずです。

アプリケーション名

アプリケーションフォルダ内のbuild.ymlに、エントリ"name"があります。これは、ユーザーがデバイス上で見える表示名です。例:

 name: My Own App

アプリケーションアイコン

アイコンとして使う画像をアプリケーションの'icon'フォルダに配置します。testappというアプリを作ったら、そのフォルダは"testapp/icon"になります。アイコンは'icon.png'という名前でなければなりません。

 testapp/
build.yml
Rakefile
rhoconfig.txt
app/
public/
icon/
icon.png
icon.ico


RhodesDevices

以下のドキュメントは、英語の原文を日本語へ翻訳したものをRhomobile社の許可のもと、公開しています。
公式なドキュメントはRhomobile社のサイトをご覧ください。
また、この文書は2010/6/16(JST)の情報がもとになっています。
この日本語の翻訳について問題・質問などがある場合、コメントを残してください。それ以外については、本ドキュメント内にある問い合わせ先にお願いします。

The following document (a translation of the English original into Japanese) is published with Rhomobile permission.
If you need official documents, please visit Rhomobile site.
In addition, the following document is based on 2010/June/16 (JST) information.
If you have any question, problem about the Japanese translation, please leave your comment. Except for that, refer contacts in the document.


目次

Systemクラス

システムRubyクラスは、システム特有の情報へのアクセスを提供します。

System.get_property(property) #=> returns value of a named system property.
  • platform - APPLE, Blackberry, WINDOWS, ANDROID, SYMBIAN
  • has_camera
  • screen_width - screen width in pixels
  • screen_height - screen height in pixels
  • ppi_x - horizontal PPI (Pixels Per Inch)
  • ppi_y - vertical PPI (Pixels Per Inch)
  • has_network
  • phone_number
  • device_id - iPhoneでは、callしたら空かもしれないので、空でなくなるまで待つ必要があります。
  • full_browser - BlackBerryで便利です(http://wiki.rhomobile.com/index.php/Rhodes#Blackberry_full_browserを参照してください)
  • device_name - アプリケーションが動作しているデバイス名。例:'9000'(BB)、'iPhone'、'dream'(Android)
  • os_version - デバイスのOSバージョンです。例:'4.6.0.192'(BB)を、'3.0'(iPhone)、'1.6'(Android)
  • locale - 現在の言語、'en','ru'など
  • country - 国の略語

これは、カメラ、GPSやその他のデバイスの機能の可用性などのような、システム機能を詳細に示す他のプロパティにも拡張されます。

System.has_network #=> Obsolete, use get_property; returns true if phone has network connection
# Due to capabilities of particular OS-es this call implemented only for iPhone and Android
# Developers MUST use this on iPhone to pass on the AppStore.

System.get_screen_width #=> Obsolete, use get_property; returns device screen width
System.get_screen_height #=> Obsolete, use get_property; returns device screen height

System.set_screen_rotation_notification(callback, params) #=> calls when screen rotate (since 2.0)
#callback parameters:
#width, height, degrees

System.exit #=> Exit application

システムクラスの使い方の例は、system API sample applicationのlayout.erbを見てください。

サポートするオペレーティングシステム

BlackBerry

BlackBerryの4.2、4.5、4.6、4.7、5.0

Windows Mobile

Windows Mobile 6.1 Professionalと、6.0 Standard

Android

Android 1.5以上

iPhone

iPhone 3.0以上のすべてのバージョンとiPad

BlackBerryのブラウザのサポート

HTML, CSSそしてJavsScriptをサポートについてはBlackBerry Browser Version 4.2 Content Developer Guideを確認してください:

http://docs.blackberry.com/eng/deliverables//1143/browser_devguide.pdf

  • フォームでの簡単なsubmitエレメントは動作しません:

<form id="user_edit_form"
method="POST"
action="<%=url_for(:action => 'do_login')%>" selected="true">

<input type="submit" value="Login"/>
</form>

解決方法:

<form id="user_edit_form"
method="POST"
action="<%=url_for(:action => 'do_login')%>" selected="true">

<a href="#" onclick="document.forms[0].submit(); return false;"><img src="/public/images/bb_logon_btn1.png" /></a>
</form>

BlackBerryタッチスクリーン(4.7、5.x)

  • alignされた画像リンクはクリックできません:


<a href="/app/WelcomeScreen/do_info"><img src="/public/images/bb_info_btn.png" align="left" /></a>

解決方法:alignの削除もしくはテキストをリンクに追加します

  • div内のリンク問題:

<a href="/app/Login"><div style="height:10px"></div>Login</a>

解決方法:<a>をdivから移動します:



<div style="height:10px"></div><a href="/app/Login">Login</a>
  • style display:blockでのリンク:

<a href="/app/Login" style="display:block;background: url('test.png') no-repeat 97% 50%;">Login</a>


<a href="/app/Login" style="display:block;border-Top: 1px solid #bbb;">Login</a>

解決方法:エレメントからdisplay:blockを削除する

BlackBerry5.0フルブラウザ

BlackBerry5.0には、javascript,ajaxと拡張cssをサポートした新しいBrowserFieldクラスがあります。それを使用するにはrhoconfig.txtに設定します:


use_bb_full_browser=5 # use full browser only on BB 5.0 and above


use_bb_full_browser=touch # use full browser only on touch devices including 5.0

注:BlackBerry5.0のタッチ・デバイスでないフル・ブラウザは、ナビゲーション・フィールドに問題があります。それは、普通のブラウザのフィールドのようにフォーカスしたフィールドから別のフィールドへ移動できない問題です。単にシンボルからシンボルに移動するだけです。この問題は、フルブラウザーがタッチ・スクリーン・デバイスでのみ使える原因となっています。

BlackBerryフルブラウザー

  • BlackBerry4.6以降で利用可能
  • AJAXのサポート、CSSのサポートを改善
  • 通常のブラウザのようなタッチ・スクリーンでない場合、(ポインター・カーソルが)とても便利ではありません。タッチスクリーンデバイスでは、フルブラウザとデフォルトのブラウザ・フィールド・モードでは視覚的な違いがありません。
  • すべてのデバイスで有効にするには - rhoconfig.txtに以下を追加:

use_bb_full_browser = 1
  • タッチスクリーンデバイス上で有効にするには - rhoconfig.txtに以下を追加:


use_bb_full_browser ='touch'
  • 送信フォームの問題:

<head>
<script type="text/javascript">
function submitform()
{
document.forms["login"].submit();
}
</script>
</head>

<form id="user_edit_form"
method="POST"
action="<%=url_for(:action => 'do_login')%>" selected="true">
<a href="javascript: submitform()">Login</a>

</form>

解決方法:


<form id="user_edit_form"
method="POST"
action="<%=url_for(:action => 'do_login')%>" selected="true">

<a href="#" onclick="document.forms[0].submit(); return false;"><img src="/public/images/bb_logon_btn1.png" /></a>
</form>



RhodesTesting

以下のドキュメントは、英語の原文を日本語へ翻訳したものをRhomobile社の許可のもと、公開しています。
公式なドキュメントはRhomobile社のサイトをご覧ください。
また、この文書は2010/6/16(JST)の情報がもとになっています。
この日本語の翻訳について問題・質問などがある場合、コメントを残してください。それ以外については、本ドキュメント内にある問い合わせ先にお願いします。

The following document (a translation of the English original into Japanese) is published with Rhomobile permission.
If you need official documents, please visit Rhomobile site.
In addition, the following document is based on 2010/June/16 (JST) information.
If you have any question, problem about the Japanese translation, please leave your comment. Except for that, refer contacts in the document.


目次

ロギング

メッセージをログに記録するには2つの方法があります。

どんなコントローラからでも、app_infoとapp_errorメソッドを使ってログに残すことができます。これらのメソッドは文字列を取り、コントローラ名をカテゴリーとしてrholog.txtへ書き込みを行います。

また、RhoLogのログクラスもあります。このクラスは2つの文字列を引数に持つinfoとerrorメソッドがあります。最初の文字列はカテゴリ、2番目の文字列はメッセージです。

rholog.txtには以下のようなラインが現れるでしょう:

 <Timestamp> <category> | <message>


RhoErrorクラス

ログやレポートの際に、errorクラスにアクセスするのを便利に思うでしょう:

このクラスはエラー・コードを含み、エラー・コードをテキスト・メッセージへ変換するmessage()メソッドがあります。すべてのコールバックは、このクラスのエラーコードを返します。このコールバックのステータス・テキストはいくつかの内部エラーのメッセージを含みます。よって、ほとんどの場合、それはユーザへ公開すべきではないでしょう。現在RhoErrorは次のエラーコードが含まれています:

   ERR_NONE = 0
ERR_NETWORK = 1
ERR_REMOTESERVER = 2
ERR_RUNTIME = 3
ERR_UNEXPECTEDSERVERRESPONSE = 4
ERR_DIFFDOMAINSINSYNCSRC = 5
ERR_NOSERVERRESPONSE = 6
ERR_CLIENTISNOTLOGGEDIN = 7
ERR_CUSTOMSYNCSERVER = 8
ERR_UNATHORIZED = 9

例としてログイン/ログアウトマネージャを参照してください。

デバッグ

Rhodes Debuggerを使用してOSX上で動作するRhodesアプリをデバッグすることができます。


テスト

フレームワークをどのようにテストするかはここ

ユニットテストを追加

モデルを生成するとき、コントローラとともに_spec.rbが生成されます。



Generating with model generator:
....
[ADDED] app/Person/person_spec.rb


このファイルにはコントローラのテストが含まれており、mspecフォーマットで書かれています:rubyspec.org


describe "Person" do
#this test always fails, you really should have tests!

it "should have tests" do
true.should == false
end
end

我々は、このテスト・フォーマットを内部でも同様に使用します。コア・フレームワークのspecをここで確認できます。これはmspecのより多くの機能を使っています。

しかし、これらのテストを実行するには、テストフレームワークをアプリに含めておく必要があります。これを追加するには、アプリケーションフォルダ内でrhogenタスクを実行します:

 rhogen spec

すると、アプリケーションにmspecフレームワークが追加されたのが分かります。



Generating with spec generator:
[ADDED] app/SpecRunner
[ADDED] app/mspec
[ADDED] app/spec
[ADDED] app/fileutils.rb
[ADDED] app/mspec.rb
[ADDED] app/spec_runner.rb


これでテストを実行する準備が整いました。単にSpecRunnerコントローラへのリンクを追加し、passing/failingテスト数の概要を取得するでしょう

index.erbで:


<li><a href="SpecRunner">Run tests</a></li>

結果の概要が画面に表示されます。

詳細結果はrholog.txtに表示されます:



I 01/15/2010 16:36:33 b0185000 APP| FAIL: Product - Expected true
to equal false

apps/app/mspec/expectations/expectations.rb:15:in `fail_with'
apps/app/mspec/matchers/base.rb:8:in `=='
apps/app/Product/product_spec.rb:5:in `block (2 levels) in <main>'
...

そして最後に、概要がrholog.txtにも印刷されます:


I 01/15/2010 16:36:33 b0185000 APP| ***Total: 3
I 01/15/2010 16:36:33 b0185000 APP| ***Passed: 1
I 01/15/2010 16:36:33 b0185000 APP| ***Failed: 2
テストを無効にする

アプリケーションをプロダクション・ビルドする用意ができたら、build.ymlのbuild propertyを'release'に変更すると、specファイルはバイナリに含まれなくなります:



...
vendor: Acme, Inc.
build: release
...

RhodesConnectToWebServices

以下のドキュメントは、英語の原文を日本語へ翻訳したものをRhomobile社の許可のもと、公開しています。
公式なドキュメントはRhomobile社のサイトをご覧ください。
また、この文書は2010/6/16(JST)の情報がもとになっています。
この日本語の翻訳について問題・質問などがある場合、コメントを残してください。それ以外については、本ドキュメント内にある問い合わせ先にお願いします。

The following document (a translation of the English original into Japanese) is published with Rhomobile permission.
If you need official documents, please visit Rhomobile site.
In addition, the following document is based on 2010/June/16 (JST) information.
If you have any question, problem about the Japanese translation, please leave your comment. Except for that, refer contacts in the document.


ここでは、RhoSyncサーバーへの接続を有効にすることで、Rhodesアプリに同期データを追加する方法を説明します。同期は必須ではありませんが、rhogenで生成されたRhodesアプリはすべてメインページにsync loginがあります。このセクションの最後に示すように、RhodesでAsyncHttpライブラリを介してバックエンドWebサービスに直接アクセスすることもできます。

目次

ログイン/ログアウトマネージャ

Rhodesは内蔵ログインマネージャが付属しており、RhoSyncとの認証を処理します。次の関数で、ログインマネージャにアクセス可能です:

# Pre 1.2
SyncEngine::login(@params['login'], @params['password']) #returns 1 if login was successful to all sources, otherwise 0

SyncEngine::logout #performs a logout on each source
SyncEngine::logged_in #returns 1 if true, 0 if false

この使い方の例は、Rhodesアプリケーションの"Settings"コントロールを見てください。

Rhodes1.2以降ログインのコールバックを使用するようになっており、この機能は変更しています:

# Since 1.2 use this login method
SyncEngine.login(@params['login'], @params['password'], (url_for :action => :login_callback))

# Default callback that's provided by the generator
def login_callback
err_code = @params['error_code'].to_i
if err_code == 0
# run sync if we were successful
WebView.navigate Rho::RhoConfig.start_path
SyncEngine.dosync
else
if errCode == Rho::RhoError::ERR_CUSTOMSYNCSERVER
@msg = @params['error_message']
end

if !@msg || @msg.length == 0
@msg = Rho::RhoError.new(errCode).message
end

WebView.navigate ( url_for :action => :login, :query => {:msg => @msg} )
end
end

より詳細は、"System API Samples application"の/app/Settingsフォルダのコントローラとビューを見てください。

Sync notification

ソース上で同期が行われると、リフレッシュされるソースによって提供されるデータをビューが反映します。これを行うには、sync notificationメカニズムを使用してください。

notificationを設定するには、以下のRubyの呼び出しを行います:

  Account.set_notification(url,params)
SyncEngine.set_notification(source_id,url,params)
SyncEngine.set_notification(-1,url,params) #set callback for all sources

たとえば、以下のようになります。

  Account.set_notification("/app/Account/sync_notify", "sync_complete=true")

Accountソースに関連したオブジェクトが変化すると、ユーザが同じページにアクセスしていると、ビューはsync_notify actionへ向けられます(パラメータに'sync_complate=true'が設定されています)。

また同期コールバックでは3つのステータスがあります:

  • それら3つに共通的なパラメータ:source_id、source_name
    • in_progress.パラメータ:total_count、processed_count、cumulative_count。これはユーザーに同期の進捗状況を報告するために使用することができます。
    • error.パラメータ:error_code、error_message
    • OK.パラメータ:total_count、processed_count、cumulative_count
  def sync_notify
status = @params['status'] ? @params['status'] : ""

if status == "error"
errCode = @params['error_code'].to_i
if errCode == Rho::RhoError::ERR_CUSTOMSYNCSERVER
@msg = @params['error_message']
else
@msg = Rho::RhoError.new(errCode).message
end

WebView.navigate(url_for(:action => :server_error, :query => {:msg => @msg}))
elsif status == "ok"

if SyncEngine::logged_in > 0
WebView.navigate "/app/Page"
else
# rhosync has logged us out
WebView.navigate "/app/Page/authenticate_form"
end
end
end

注:ビューがAjax呼び出しを使用して更新された場合は、このメカニズムが正常に働かないでしょう。ビューの場所が、Ajax呼び出しで別の場所へ変更されないからです。
Windows Mobileでの注意:set_notificationのパラメータ文字列は2024byteを超えないようしてください: http://support.microsoft.com/kb/208427

オブジェクト作成のエラー

サーバーがオブジェクトを作成中にエラーを返すことがあります。その場合、sync notificationコールバックが以下のパラメータを受け取ります:

create_error - ハッシュの配列です。各ハッシュは'オブジェクト'と'error_message'が含まれます。

Sync object notification

アプリケーションはsyncエンジンからオブジェクトの変更の通知を受けることができます。アプリケーションは、変更されたオブジェクトを表示する場合、現在のページを更新することができます。

  • SyncEngine.set_objectnotify_urlをコールする。たとえばAppApplication.initializeにおいて一度呼び出します。
  • コントローラメソッドで、レンダー・メソッドの前にオブジェクトの配列や一つのオブジェクトでadd_objectnotifyをコールします。
  • .erbファイルでurl_forを使う場合:ビューに特定のオブジェクトを選んだとき、そのurlはobject idを持っており、そのobject idは自動的にnotificationマップへ追加されます。
  • notificationコールバックは3つの配列を受け取ります。それはハッシュで:'deleted'、'updated'と'created'です。各ハッシュは'オブジェクト'と'source_id'のキー値を含みます。

class AppApplication < Rho::RhoApplication
def initialize
super

SyncEngine::set_objectnotify_url("/app/Settings/sync_object_notify")
end

end

class ProductController < Rho::RhoController

#GET /Product
def index
@products = Product.find(:all)

add_objectnotify(@products)
render
end
end

def sync_object_notify
#do something with notification data
WebView.refresh
end

画像/ブロブ同期

デバイスのカメラの画像を処理するモデルがソースのURLを提供する場合、RhoSyncサーバーへの画像の同期は自動的に行われます。

注:同じメカニズムは、画像だけではなくて、どんなファイルにも当てはまります。

バックエンドサーバーへのストアと同期

"Image"モデルがあり、Imageモデルのコントローラにカメラコールバック・ファンクションがあるとすると:

  def camera_callback
if @params['status'] == 'ok'

#create image record in the DB
image = Image.new({'image_uri'=>@params['image_uri']})
image.save
SyncEngine.dosync
end
#reply on the callback
render :action => :ok, :layout => false
end

このコールバックは、イメージが保存された後、同期をトリガします。そしてRhoSyncサーバへpushします。それは画像を処理するイメージのソースアダプタ次第です("blob"と呼ばれるpaperclipアタッチメントのように提供されます)。

  def create(name_value_list,blob)
if blob
obj = ObjectValue.find(:first, :conditions => "object = '#{blob.instance.object}' AND value = '#{name_value_list[0]["value"]}'")
path = blob.path.gsub(/\/\//,"\/#{obj.id}\/")
name = name_value_list[0]["value"]

`cp #{path} #{File.join(RAILS_ROOT,'public','images',name)}`
end
end

この例では、queryメソッドでイメージのリストをqueryできるように、blobをrails publicフォルダにコピーします。RhoSyncに付属の"camera"サンプルソースアダプタを見てください。

バックエンドサーバーからのファイル取得

新しいレコードを同期するときにデバイスが画像を取得できるために、クエリの呼び出しでは、新しいバックエンドの画像へのURLを格納する必要があります。

  def query
@result={}
Dir.entries(PATH).each do |entry|
new_item = {'image_uri' => BASEURL+'/images/'+entry, 'attrib_type' => 'blob.url'}
unless entry == '..' || entry == '.' || entry == '.keep'

p "Found: #{entry}"
@result[entry.hash.to_s] = new_item
end
end
@result
end

完全なrhosyncアダプタの例はrhosync/vendor/sync/SystemApiSamples/camera.rbを参照してください。

より詳細は、System API Samples applicationの/app/Blobフォルダのコントローラとビューを見てください。

非同期検索の呼び出し

サーバー上に大きなデータベースがある場合、デバイスへすべてをロードする必要はありません。代わりに選択された項目だけを非同期検索機能を使用して同期することができます:

コントローラのどこかに:

Contact.search(
:from => 'search',
:search_params => { :FirstName => @params['FirstName'], :LastName => @params['LastName'], :Company => @params['Company'] },
:offset => page*page_size,
:max_results => page_size,
:callback => '/app/Contact/search_callback',
:callback_param => "" )

Rhodes 1.4 注意:Rhodesは自動的にcallback_paramへsearch_paramsを追加しますので、コールバックでは:@['search_params'][:FirstName] などが利用可能です。

コールバックは次のようになるでしょう:

def search_callback    
if (status && status == 'ok')
WebView.navigate ( url_for( :action => :show_page, :query => @params['search_params']) )
end
#TODO: show error page if status == 'error'

render :action => :ok
end

findを早くするには:http://wiki.rhomobile.com/index.php/Rhom#find.28.2Aargs.29_Advanced_proposalを使います。
そして、コールバックが呼び出されデータが準備できたら、次のページをレンダリングすることがあります:

def show_page
$contacts = Contact.find(:all,
#:conditions => ["LOWER(FirstName) LIKE ? OR LOWER(LastName) LIKE ? OR LOWER(Company) LIKE ?",
# @params[:FirstName], @params[:LastName], @params[:Company]]

:conditions => {
{:func=>'LOWER', :name=>'FirstName', :op=>'LIKE'}=>@params[:FirstName],
{:func=>'LOWER', :name=>'LastName', :op=>'LIKE'}=>@params[:LastName],
{:func=>'LOWER', :name=>'Company', :op=>'LIKE'}=>@params[:Company],
},
:op => 'OR',

:select => ['FirstName','LastName', 'Company'],
:per_page => page_size, :offset => page*page_size )
render :action => :show_page
end

コールバックの呼び出しを中断するには、'stop'を返します:

def search_callback    
if (status && status == 'ok')
WebView.navigate ( url_for :action => :show_page )
end
#TODO: show error page if status == 'error'

'stop'
end

非同期searchコールパラメータ

Searchの呼び出しは、次のパラメータのハッシュを取ります。以下の名前以外のすべてのパラメータは、検索パラメータとみなされます。

:from #=> sets the path or custom method that records will be fetched from (optional, default is 'search')  
:offset #=> starting record to be returned
:max_results #=> max number of records to be returned
:callback #=> callback to be called after search is completed
:callback_param #=> parameters to be passed to the callback (optional)
progress_step#=>optional parameter, define how often search callback will be called with 'in_progress' state

上記の例からの呼び出し(Call)は、RhoSyncサーバーへの以下のような呼び出しになります:

search(検索) /search?conditions[FirstName]=Jon&conditions[LastName]=Smith&conditions[Company]=Acme,offset=30,max_results=10


SyncEngineクラス

同期エンジンクラスには呼び出し(Call)を追加できますが、その完全なセットを下記に記載します。

  • SyncEngine.dosync(show_sync_status)
    • リクエストは同期処理を開始します。オプションのパラメータshow_sync_statusがfalseの場合、同期ステータスポップアップが(デフォルトはtrueです)が表示されません
  • SyncEngine.dosync_source(source_id, show_sync_status)
    • 指定したソースの同期プロセスの開始要求です。オプションのパラメータshow_sync_statusがfalseの場合、同期ステータスのポップアップが(デフォルトはtrueです)が表示されません。
  • SyncEngine.lock_sync_mutex
    • 同期エンジンのロック(バッチ操作を実行するために便利)を取得するのを待ちます、
  • SyncEngine.unlock_sync_mutex
    • 取得した同期エンジンのロックを開放します(lockをしたら、これを行うこと)。
  • SyncEngine.login(login, password, callback)
    • syncサーバでユーザの認証を行います。コールバックURLはログイン操作が完了後に呼び出されます。さらなる詳細はここ
  • SyncEngine.logged_in
    • ユーザがsyncサーバによって認証されているなら、trueを返します。さらなる詳細はここ
  • SyncEngine.logout
    • Syncサーバーからユーザをログアウト。より詳細な情報はこちら
  • SyncEngine.stop_sync
    • 進行中の同期操作を停止します。
  • SyncEngine.set_notification(source_id, url, params)
  • SyncEngine.clear_notification(source_id)
  • SyncEngine.set_pollinterval(interval)
    • 同期のポーリング間隔を設定します。0は更新のためのポーリングを無効にしますが、同期はPUSH notificationによる起動が可能です。
  • SyncEngine.set_syncserver(syncserver)
    • syncサーバーのアドレスを設定しRho Configへ格納します。
  • SyncEngine.set_objectnotify_url
  • SyncEngine.set_pagesize
    • サーバーが見せるリクエストのページサイズを設定します。
  • SyncEngine.get_pagesize
    • サーバーが見せるリクエストのページサイズを取得します。

Webサービスの利用

バックエンドアプリケーションに接続するためにRhoSyncを使用する必要はありません。http経由で直接、バックエンドのWebサービスを呼び出すことができます。具体的にはAsyncHttpライブラリです。httpsを処理するには、httpsをURLの頭に付けるだけです。認証を処理するには、ヘッダーのハッシュを適切に設定するだけです。Webサービスから返却されるXMLやJSONを処理するためには、普通はJSONやRexmlライブラリをSupported extensionsで述べたようにloadしなければなりません。

AsyncHttp

Webサービスやその他のhttp(s)サーバへ非同期呼び出しを行うには、Rho::AsyncHttpを使うべきでしょう。

  • get(:url, :headers, :callback,:callback_params)
  • post(:url, :headers, :body, :callback,:callback_params)
  • download_file(:url, :headers, :filename, :callback, :callback_params)
  • upload_file(:url, :headers, :filename, :body, :callback, :callback_params)
  • cancel(cancel_callback = '*') # cancel current http call, '*' is by default, means cancel all current http calls
  Rho::AsyncHttp.get(
:url => 'http://www.example.com',
:headers => {'Cookie' => cookie},
:callback => (url_for :action => :httpget_callback),
:callback_param => "" )

Rho::AsyncHttp.post(
:url => 'https://www.example.com',
:headers => {'Cookie' => cookie},
:body => 'Test',
:callback => '/app/Contact/httpget_callback',
:callback_param => "" )

@@file_name = File.join(Rho::RhoApplication::get_base_app_path(), 'test.jpg')
Rho::AsyncHttp.download_file(
:url => 'http://rhomobile.com/wp-content/themes/rhomobile/img/imgs_21.jpg',
:filename => @@file_name,
:headers => {},
:callback => (url_for :action => :httpdownload_callback),
:callback_param => "" )

@@file_name = File.join(Rho::RhoApplication::get_base_app_path(), 'rhoconfig.txt')
Rho::AsyncHttp.upload_file(
:url => 'http://dev.rhosync.rhohub.com/apps/SystemApiSamples/sources/client_log?client_id=19bdcf15-aca2-4e5a-9676-3c297c09bb11&device_pin=& log_name=',
:filename => @@file_name,
:body => "" #body will be sent with as separate multipart
:headers => {},
:callback => (url_for :action => :httpupload_callback),
:callback_param => "" )

def httpget_callback
#@params contain response. In case of json (ContentType=application/json) @params['body']
#contain parsed body represented as hash of hashes
#@params['headers'] contain response headers represented as hash
#@params['cookies'] contain parsed cookies suitable for server request
#in case of unrecognized body type @params['body'] contain raw text body
#in case of error usual RhoError info returned plus @params['http_error'] and @params['body'] contain server response
end

注:新しいパラメータ :ssl_verify_peerがRhodes2.0(デフォルトはtrue)からあります。それはAsyncHttpは自己署名証明書を持つサイトで動作できるよう、リモートピアの検証を無効にすることができます。

注:Rhodes2.0から、AsyncHttpは:authorizationパラメータをサポートしています。今のところ'ベーシックHTTP認証'がサポートされてます。使用例:

RRho::AsyncHttp.get(
:url => 'http://www.example.com',
:callback => (url_for :action => :httpget_callback),
:authorization => {:type => :basic, :username => 'username', :password => 'none'} )

注: XMLをパースするのにrexml ruby extensionを使用します:http://wiki.rhomobile.com/index.php/Rhodes#rexml_library_support
例はrhodes-system-api-samples\AsyncHttpを参照してください。

注: 同期呼び出しをするには、callbackパラメータをスキップするだけです(1.5.1以降)

    res = Rho::AsyncHttp.get( :url => 'http://www.apache.org/licenses/LICENSE-2.0')
puts "Sync http call: #{res}"

@@get_result = res['body']

バックエンドWebサービスへ直接接続する例

ここにRexml sample in System API Samplesのコントローラがあります。これは、テストのWebサービスへのAsyncHttp.getを呼び出します。その後、Rexmlで戻りをパースします。

   def webservicetest
Rho::AsyncHttp.get(
:url => 'http://rhostore.heroku.com/products.xml',
:callback => (url_for :action => :httpget_callback),
:callback_param => "" )

render :action => :wait
end

def get_res
@@get_result
end

def get_error
@@error_params
end

def httpget_callback
puts "httpget_callback: #{@params}"


if @params['status'] != 'ok'
@@error_params = @params
WebView.navigate ( url_for :action => :show_error )
else
@@get_result = @params['body']
puts "@@get_result : #{@@get_result}"

begin
require 'rexml/document'


doc = REXML::Document.new(@@get_result)
puts "doc : #{doc}"
rescue Exception => e
puts "Error: #{e}"
@@get_result = "Error: #{e}"
end

WebView.navigate ( url_for :action => :show_result )
end

end

def show_result
render :action => :webservicetest, :back => '/app/RexmlTest'

end