GAE のアプリケーションを Marketplace に登録するときの注意点

Google Apps Marketplace にアプリケーションを登録しようとしてハマった。この Marketplace への登録についてはそれなりにドキュメントが揃っているのですぐに出来るだろうと思っていたが、かなり時間が掛かってしまったのでその経過をメモ。

まずは Marketplace のデベロッパ登録をするのだが、これについてはオリジナルの “Google Apps Developer Program Site” に加えて、”Google Apps Marketplaceにアプリケーションを登録する方法” や “Google Apps Marketplaceにアプリを公開するときに気をつけること” を参考にさせていただいた。これらのドキュメントにしたがって、Marketplace の Vendor 登録はあっさりと完了。

続いてサンプルアプリケーションを登録してみようということで、”Writing your First Marketplace App using Python” に掲載されているコードを使って、Google App Engine にアプリケーション環境を構築する。そしてこれを Marketplace に登録し、さらに Google Apps からアクセスできることを確認した。

本来はここで Google Apps のアカウントからアプリケーションを起動できるはずなのだが、どうしてもエラーとなってしまい期待した結果にならない。調べてみるとサンプルコードの federated_identity() が本来返すべき値を返さず None を返していることがわかった。OpenID まわりでうまく行ってないのだろうと推測するものの、どうすればいいのか分からないまま調べを進めていたら、”App Engine and Chrome Webstore Issues” に解決策があった。原因はアプリケーションではなく GAE の設定であった。GAE の Application Settings にある Authentication Options を (Experimental) Federated Login にすることで、Google Apps に組み込んだ自前のアプリケーションを動作させることができた。

結論:
Google Marketplace に登録するアプリケーションを Google App Engine 環境で提供するときは GAE の Authentication Options を変更する必要あり。

Google Apps の Gmail 設定について

Gmail ではデフォルトのメールアドレスに加えて、他のアドレスを使ったメール送信が可能で、このアドレスを何個か事前に登録しておくことができる。この機能を使ってデフォルト以外のアドレスを使って Gmail サーバからメール送信すると、メールヘッダの From: と envelope-from にそれぞれ異なるアドレスが設定される。この状態を避けて、From: と envelope-from を一致させたい場合は、From: に指定したアドレスの本来の SMTP サーバを使えばよい。この目的のために個人利用者向けの Gmail では、追加したそれぞれのアドレスに対して Gmail サーバ以外の SMTP サーバを設定する機能がある。

ところが Google Apps の Gmail ではデフォルトで SMTP サーバの設定が不可になっているため、どのアドレスを選択してもすべてデフォルトドメイン用の Gmail サーバから送信されてしまう。このようにして送られた From: と envlope-from が異なるメールを受信したとき、そのことを受信者に対して常に明示するメールツールがある。例えば Outlook2007 の場合だと、「xxx@foo.com が次の人の代理で送信しました:xxx@bar.net」というメッセージが表示される。利用者によってはこのメッセージ表示は好ましくないと考えるかもしれない。

この状況を避けるためには Google Apps の Dashboard → Email settings → General のところにある ‘Allow users to send mail through an external SMTP when configuring a “from” address hosted outside your email domains. ‘ という項目を有効にする必要がある。実はこの設定項目を当初見落としていたのだが、ヘルプフォーラムの記述によってその存在を知った。

http://www.google.com/support/forum/p/gmail/thread?tid=48b458471de77c9b&hl=ja
http://www.google.com/support/forum/p/gmail/thread?tid=2a5487be9d446a05&hl=ja

Android エミュレータの DNS 設定 — その2

前回の記事に書いた Android エミュレータにおける DNS 設定の件で、さらに理解できたことがあったのでメモ。プライマリの DNS サーバが落ちて名前解決が出来ていないときの状況では、net.dns1 の値が 10.0.2.3 になっているものの、net.dns2 には何も値が設定されていなかったことは前回にも書いた。

$ adb shell
# getprop net.dns1
getprop net.dns1
10.0.2.3
# getprop net.dns2
getprop net.dns2

#

たまたま入手した「ANDROID HACKS」(オライリー・ジャパン)によると、ここに出てくる 10.0.2.3 から 10.0.2.6 までの IP アドレスは、ホストマシンが参照している DNS サーバのエイリアスになっていることが分かった。したがって上記の状態ではホストマシンのプライマリに設定してある DNS しか参照しないことになり、該当する DNS サーバが落ちていたりすると名前解決が出来なくなってしまう。しかし net.dns2 に 10.0.2.4 を設定しておけば、ホストマシンのセカンダリ DNS 設定を参照するようになり、結果的に名前解決が可能になる。

#setprop net.dns2 10.0.2.4
setprop net.dns2 10.0.2.4
#

実際にこの手順で問題が解決したことを確認できた。ただしこのままだとプライマリの DNS が落ちているときは常に手動での設定操作が必要になり煩わしい。net.dns2 の値を恒常的に設定しておく方法を探す必要がある。

Android エミュレータの DNS 設定

突然にAndroid エミュレータがインターネットへ接続できなくなってしまった。調べたところまさに同じ状況についてのブログ記事があった。

Androidのエミュレータがネットワークに接続できない場合の対処方法

この記事によると、何らかの要因で DNS にアクセス出来なくなっているようで、手動で明示的に DNS を設定してやれば解決することが分かった。ちなみに自分のところでは net.dns1 だけ値(10.0.2.3)が設定されており、net.nds2 には何も設定されていなかった。上記のブログ記事のように Google の DNS を設定すると、確かにインターネット接続が可能になった。

ただ、これまではこんなことをしなくてもそのまま接続できていたのが、急に繋がらなくなったのが気になった。そこで本家ドキュメントを探してみると、Android エミュレータについての情報を見つけた。

Using the Android Emulator

このページの中盤あたりにある “Configuring the Emulator’s DNS Settings” によると、エミュレータはその実行環境で設定されている DNS を使うようになっている。問題のエミュレータは Windows7 上で動いているのだが、この Windows7 が名前解決に使っているプライマリの DNS サーバは、このところの計画停電に対応するため電源を落としていた。どうもこのことが名前解決できなくなった原因のようだ。

もちろん Windows7 環境では複数の DNS サーバを参照するように設定してあるので、プライマリの DNS サーバが無くてもまったく問題はない。当然 Android エミュレータも、親環境と同じセカンダリ以降の DNS を参照すればよいはず。しかしどうもこのあたりに問題があるようで、プライマリの DNS にアクセスできないと、Android エミュレータは名前解決できなくなってしまうようだ。前述のドキュメントによると Windows 環境では DNS 情報を GetNetworkParams() API によって獲得するとある。この API が複数 DNS に対応していないことは考えにくいので、恐らく Android エミュレータが複数 DNS 情報の扱いが出来ていないと思われる。

jQuery を使って checkbox の上限選択数を制御する

HTML フォームの checkbox を選択できる上限を任意に設定するための処理を jQuery で書いてみた。指定数以上を選択したとき alert() でダイアログボックスを出す例はたくさんあるようだが、ここではダイアログボックスを出さずに選択済みのものをひとつ減らすようにしている。ダイアログボックスが出ないので、上限値を越えたときの選択操作が楽だと思う。

HTML の記述は次のようになる。class や id 属性の値はこのサンプルと同じである必要はなくて自由に設定して構わない。また name 属性はこの処理では使っていない。

<input type=”checkbox” class=”chkbox_cls” id=”chkbox_0″ name=”chkbox” value=”foo” onclick=”ltd_chkbox(this)” />foo
<input type=”checkbox” class=”chkbox_cls” id=”chkbox_1″ name=”chkbox” value=”bar” onclick=”ltd_chkbox(this)” />bar
                :
<input type=”checkbox” class=”chkbox_cls” id=”chkbox_N” name=”chkbox” value=”baz” onclick=”ltd_chkbox(this)” />baz

それぞれの checkbox における onclick イベント発生時に呼び出すのが次の JavaScript 関数。変数 limit_len に選択可能な上限数を設定しておく。サンプルでは 3 としているので、仮に checkbox が 10 個あったとしても 3 個以上はチェックできない。4 個めをチェックするとすでにチェック済みのものから 1 個のチェックが自動的に外れる。コード中に jQuery() と記述している部分は、もちろん $() としても構わない。

function ltd_chkbox(obj) {
  var limit_len = 3;   # 選択可能な上限値
  var attr_name = ‘.’ + jQuery(obj).attr(‘class’) + ‘:checked’;
  var checked_len = jQuery(attr_name).length;

  var tail = false;
  for (var i = 0; i < checked_len; i++) {
    if (jQuery(jQuery(attr_name)[i]).attr('id') == jQuery(obj).attr('id')
        && i == checked_len - 1) {
      tail = true;
    }
  }

  if (checked_len > limit_len) {
    var idx = tail ? 0 : checked_len – 1;
    jQuery(jQuery(attr_name)[idx]).attr(‘checked’, false);
  }
}

Eclipse における TAB キーと空白入力

最近、Android アプリケーションに手を付けるため Eclipse を使っている。コード編集時には TAB キー入力を空白に置き換えたかったので、次の手順でメニューをたどっていき、そのダイアログに出ている “Insert spaces for tabs” を有効化した。

“Window”→”Preferences”→”General”→”Editors”→”Text Editors”→”Insert spaces for tabs”

これで TAB キー入力で空白が入るようになったのだが、Java コードのときだけは TAB キーが TAB コードのまま挿入されることに気付いた。調べてみると前述の設定以外に Java コードに特化した設定項目があることが分かった。次の手順でたどりつけるダイアログである。

“Window”→”Preferences”→”Java”→”Code Style”→”Formatter”

ここからさらに “Active profile:” のいずれかを選択してから “Edit…” ボタンを押すと別のダイアログが表示される。さらにそこの “Indentation” タブにある “Tab policy:” を “Spaces only” にしなければならない。

ところがデフォルトのプロファイルである “Eclipse [built-in]” は組み込みプロファイルということで編集することが出来ない。このデフォルトプロファイルを元にして新しいプロファイルを作り、そこで “Spaces only” を設定する必要がある。もちろん以降は、この新しいプロフィールを使うことになる。これで Java コード編集時も TAB キー入力は空白に変換される。

それにしてもメニュー階層が深い。それだけ Eclipse には非常に多くの設定可能な項目があることがわかる。

Android 開発環境の設定手順

久しぶりに Android 開発環境をインストールしたので、その手順を忘れないうちにメモしておく。基本的に本家 Web サイトの情報に従って作業すれば問題ない。

http://developer.android.com/
http://developer.android.com/intl/ja/

Java のインストール

当然ながら Java 実行環境は必須。JDK でなく JRE でも OK。今回使っているバージョンは 1.6.0_20。ところで Oracle 版 Update 21 を使うと Eclipse がクラッシュするという情報あり( http://bit.ly/cw94bC )。自分のところで確認していないが要注意。

Eclipse のインストール

Eclipse Helios 3.6.1 をインストール( http://www.eclipse.org/ )。現時点で Android のサイトによると不具合のため 3.6 は非推奨となっているが、つい最近の情報によるとこの問題は直ったようだ。また、実際に手元の環境でも今のところ問題は顕在化していない。

https://bugs.eclipse.org/bugs/show_bug.cgi?id=318108

Eclipse の日本語化プラグインもあるが Android の開発には必須でないので、今回はインストールしていない。

Android SDK のインストール

http://developer.android.com/sdk/installing.html

Android SDK の zip パッケージをダウンロードして任意のディレクトリに展開。現在のバージョンは r07。続いて SDK を展開したディレクトリの中にある /tools へ PATH を通しておく。

Android Development Tools のインストール

http://developer.android.com/sdk/eclipse-adt.html

ADT のインストールは Eclipse のメニューから実行する。Eclipse を使わないときは直接 ADT をインストールすることも可能。

  1. Eclipse の Help メニューから Install New Software –> Add を選択。
  2. “Name:” 欄に “Android Development Tools Plugin” など任意の文字列、”Location:” 欄は https://dl-ssl.google.com/android/eclipse/ を入力して OK ボタンを押す。ここで問題が起きたら Location の https を http に変更すると解決出来る場合もある。
  3. 一覧に Developer Tools と表示されるので、これをチェックして Next ボタンを押すと、Install Detail 画面になるのでさらに Next ボタン。
  4. ライセンス内容を確認して同意できるのであれば Finish ボタンを押す。これで ADT のインストールが始まる。途中で Security Warning が出るので内容を確認して次へ。
  5. ADT のインストールが完了したら Eclipse を再起動。

ADT Plugin の確認とアップデート

Eclipse 用 ADT Plugin の確認を行なう。

  1. Eclipse の Window メニューから Preference を選択。
  2. 開いたダイアログで Android をクリックし Android SDK の設置場所と Android プラットフォーム(SDK のターゲットバージョン)一覧を確認する。
  3. 同じダイアログの Java メニューで Java ランタイムのバージョンを確認できる。複数の JDK や JRE がインストールされている環境では、それらを切り替えることができる。
  4. ADT をアップデートするときは Eclipse の Help メニューから “Check for Updates” を選択。

http://developer.android.com/sdk/index.html
http://developer.android.com/sdk/adding-components.html

SDK component のインストール

ここまでで SDK は Core だけがインストールされた状態なので、さらに必要な component をインストールする。

http://developer.android.com/sdk/adding-components.html

  1. Window メニューから “Android SDK and AVD Manager” –> “Available Packages” を選ぶ。
  2. 表示されている URL を選んで “Install Selected” を押すと、実際にインストールするパッケージを選択する画面へ移る。
  3. Google API と USB ドライバに “?” マークが付いているが、ここではとりあえずこれらすべてを選択する。
  4. インストールを開始する。一連のインストール作業の中でここが一番時間が掛かる。今回は 10 分程度。

これですべてのインストールが完了。これ以降は本家サイトにあるチュートリアルなどを参照すれば良い。リファレンスもこのサイトにまとめられている。

http://developer.android.com/resources/
http://developer.android.com/reference/packages.html
http://groups.google.co.jp/group/android-sdk-japan?hl=ja

Android 端末の GPS と 3G — その後

3G を切断して Wifi だけでインターネットに接続した環境で、Android 端末の GPS 利用アプリケーションが位置を正確に特定できなくなっているという記事を以前に書いたところ、yananob さんという方からコメントをいただき、やはり同じような状況が他でも発生していることが分かった。

ところが先週にリリースされた「モバイル Google マップ」のアップデートを適用したところ、3G を切断したままの状態でもまた以前のように正確な位置特定が出来るようになった模様だ。このアプリケーションは Andoid 端末に元からインストールされていたものだが、今回のアップデートで GPS や位置情報を処理する共用ライブラリのようなものが更新されたのではないかと推測している。このアップデート以降、Foresquare クライアントでも発生していた同様の不具合は解消された模様。ただし、これらアプリケーションで位置情報を確定するまでの時間が以前よりも長くなったように感じている。

Android 端末の GPS と 3G

最近 NTT 東日本の「光ポータブル」(PWR-100F)を導入した。Android 端末(HT-03A)の 3G を完全に遮断し、外出先でも光ポータブルを経由して HT-03A を利用するためである。これによって出先における HT-03A とノート PC のネット回線を一本化し経費を半減できると考えた。

これまで Android、PC ともに光ポータブル経由で問題なく利用出来ていたのだが、Andoroid 端末の Google Map や Foursquare クライアントソフトで GPS による位置特定がうまく出来ないことに気付いた。光ポータブルとつながっている基地局らしき場所までは判別しているようなのだが、端末があるピンポイントの場所を識別出来ないように見えるのだ。

そこで試しに 3G を一時的に復活させてみたところ、すぐにピンポイントの位置特定が可能になった。Tricorder という別のソフトによると 3G を遮断した状態でも GPS 情報は捕捉しているように見えるので、Google Map などでは恐らく衛星からの情報に加えて、どこかのサーバとの連携によって位置を割り出しているのではないかと推測している。なお、一時的な 3G 復活時には約 1,000 パケットが送受信されていた模様。

このままでもまあそれほど問題は無いのだが、正確な GPS 情報にアクセス出来ないのはちょっと悔しい。かといって GPS を使うときだけ 3G を復活させていると、思ったよりもパケットを消費しそうで、そうなると 3G 回線を一本化した意味が無くなってしまう。悩ましいところだ。ちなみに光ポータブルは SIM ロックフリー版で、E-mobile の SIM を挿している。まさかこれが原因ということは無いだろうと思う。

Windows7/64 ビット版と Android 開発環境

Windwos7/64 ビット版上に Android の開発環境を構築した。その際、Java SDK が 64 ビットに対応していたため、Eclipse も 64 ビット対応のもので揃えることを試みた。実は Windows 用 Eclipse の 64 ビット対応版は正式にはリリースされていない。

http://www.eclipse.org/downloads/

しかし、次のサイトにある Latest Release のリンクをたどっていくと 64 ビットに対応していると思われる Eclipse (eclipse-SDK-3.5.2-win32-x86_64.zip)を入手することができる。

http://download.eclipse.org/eclipse/downloads/

これによって 64 ビット版(と思われる)Eclipse は特に問題なく起動することができた。

続いて Android 開発用の Eclipse プラグインである ADT (Android Development Tools)のインストールを開始したのだが、次のようなメッセージとともにインストールを完了させることが出来なかった。

Cannot complete the install because one or more required items could not be found.

この状況については頻発しているようで、検索すると対応策をすぐに見つけることができる。必要なモジュールが足りないから、それらを補完するためリポジトリを追加設定すれば良いということらしい。検索結果に基づいて Eclipse の Help > Install New Software > Add を使い、Available Software Sites リストに次の URL を追加した。

http://download.eclipse.org/releases/galileo

ところがこのリポジトリには必要と思われるモジュール群が見つからず、結局は ADT のインストールを終了させることが出来なかった。

やはり Eclipse のダウンロードサイトに 64 ビット版が掲載されていないことから、これ以上調べても無駄と判断して 32 ビット版 Eclipse に切り替えた。そうしたところ ADT のインストールは問題なく完了し、Android SDK との連携から AVD (Android Virtual Device)の起動まで確認することができた。

ちなみに今回インストールした Eclipse は Galileo 3.5.2 である。