2011年7月22日金曜日

Android 2.3.4のSDKってどこさ?

ふとAndroid 2.3.4のSDKってリリースされてないのかと思い、Android SDKツールのアップデートをかけてみたんだけど「Android 2.3.4」は出てこない。

おかしいなぁと思ってググってみたところ、他にも同じ境遇の人を発見。でも続報はないみたい(残念

ひょっとして公開されてないのかなぁと思ったけど、Android SDK and AVD Managerで、Google APIsをインストールすればいいだけなのかもしれない。Google APIs Add-onは、ManagerのAvailable packagesから次のよう辿ってインストール。

Available packages  └ Third party Add-ons    └ Google Inc.      └ Google APIs by Google Inc., Android API 10, revision 2

で、インストールしたAPIのAVDを作成する。するとManager上ではプラットフォームのバージョン表記は「2.3.3」のままだけど、エミュレータを起動して端末の情報を表示してみると「2.3.4」となっていた。コレか?

Settings → About phone → Android version
Android version 2.3.4

SDK Platform Android 2.3.3, API 10, revision 1やGoogle APIs by Google Inc., Android API 10, revision 1の方の端末情報は「2.3.3」なので、Google APIsのrevison 2の方を使えばいいのかな?ホントかなぁ?でも、他にアップデートで出てこないし。

てーか、分かりにくいって。全然気が付かなかった。Manager上のプラットフォームの表示も「2.3.4」にしてくれればいいのに。。。




公式のリリースノートにはちゃんとGoogle APIs Add-Onをアップデートしてねって記載されてるじゃん。なんだよ。英語力なさすぎだろオレ。。。

To get started developing or testing against Android 2.3.4, use the Android SDK Manager to download the latest version of the Google APIs Add-On into your SDK.

2011年5月14日土曜日

enum列挙子をプロセス間通信でやり取りする方法

enumがParcelableならそのまま渡せるんだけど、調べても大して見つからない。 カスタムクラスにenum定数を持たせる方法とかはあったんだけど、 AIDLインタフェースの引数に直接enum定数をやり取りする情報は見つからない。 そんなに需要がないんだろうか。。。

たとえば、こんなenum型があったとして、

public enum EnumTest {
  ENUM_1, ENUM_2, ENUM_3;
}

こんな感じでAIDLのインタフェースとやり取りしたい場合があるんだけど、

package sample.test;

import sample.test.EnumTest;

interface TestService {
  void test(in EnumTest e);    // エラー
}

これは当然EnumTestがParcelableを実装していないのでエラーになる。

でも、enumも実際は特殊なクラスなんだから、おそらくParcelableを実装したらいいんだろうなと予測はできる。 というわけで、やってみた。

まずは、Parcelableを実装したenumを作成する。

public enum ParcelableEnumTest implements Parcelable {
  ENUM_1, ENUM_2, ENUM_3;

  @Override
  public int describeContents() {
    return 0;
  }

  @Override
  public void writeToParcel(Parcel dest, int flags) {
    // StringでParcelに書き出す
    dest.writeString(this.name());
  }

  public static final Parcelable.Creator<ParcelableEnumTest> CREATOR = 
      new Parcelable.Creator<ParcelableEnumTest>() {
        @Override
        public ParcelableEnumTest[] newArray(int size) {
          return new ParcelableEnumTest[size];
        }

        @Override
        public ParcelableEnumTest createFromParcel(Parcel source) {
          // StringでParcelから読み出してenumに変換する
          return ParcelableEnumTest.valueOf(source.readString());
        }
      };
}

次に、同パッケージにAIDLファイルを作成。

package sample.test;

parcelable ParcelableEnumTest;

そんでもって、AIDLインタフェースで引数にParcelableを実装したenumを指定する。

package sample.test;

import sample.test.ParcelableEnumTest;

interface TestService {
  void test(in ParcelableEnumTest e);
}

するとまぁ一応Serviceをバインドしてenumをやり取りできたんだが、こんなんであってんのかね?

Parcelへの書き込みと読み出しには、一旦Stringを経由して行っているので、読み出しはちょっと効率が悪いかもしれない。 enumって確かSerializableだから、Parcel#writeSerializable()Parcel#readSerializable()でもいけるかもと思ったんだけど、ダメだった。

そもそもenumじゃなくて、intのクラス定数(static final int)を使った方がパフォーマンス的に有利だし、面倒が少なそう。 enumにimplementsを書くのも気持ち悪いし、公式ドキュメントにもパフォーマンスを意識するならenum使うなって書いてあった気がするしね*1。 実用的ではないんだろう。

だから、enum列挙子でやり取りしたいっていう需要がないのかなぁ。

参考

Android Interface Definition Language (AIDL) | Android Developers
Designing for Performance | Android Developers
Android - Avoid Enums


^1:と思ったら、いつの間にかDesigning for PerformanceからAvoid Enumsの項目が消えてた。 どういうこと?VMが改良されて今では気にしなくても良くなったりしたのかな? 昔書いてあった内容はLinuxtopiaに残ってるっぽい。

2011年5月11日水曜日

Javadocを英語で生成する方法

Javadocを英語で生成しようと思ったらちょっと嵌ったのでメモ。

EclipseでJavadocを英語で生成する場合

Eclipseで、「プロジェクト」→「Javadoc の生成」からJavadocを生成させる場合、そのまま生成するとデフォルトのロケール設定が使用されて日本語でJavadocが生成される。
これを英語で生成させたい。

「Javadoc の生成」→「次へ」→「次へ」で表示されるダイアログに「追加の javadoc オプション」というのがあるので、これにロケールの指定「-locale en_US」を加えればいいのかと思ったが、「javadoc: エラー - オプション -locale は、コマンド行の最初に指定する必要があります。」というエラーが出てしまう。
仕方なく「VM オプション」の方に「-locale en_US」を指定すると、一応は英語でJavadocを生成できた。

で、これを毎回ダイアログからポチポチ実行するのも面倒なので、Antで実行させようと思ったら嵌った。

AntでJavadocを英語で生成する場合

単純に上の「Javadoc の生成」ダイアログで、「この Javadoc エクスポートの設定を Ant スクリプトとして保管」にチェックを付けてEclipseに生成させたjavadoc.xmlをAntで実行しても、「javadoc: エラー - オプション -locale は、コマンド行の最初に指定する必要があります。」という上と同じエラーが出てしまう。

Eclipseに生成させたjavadoc.xml
<?xml version="1.0" encoding="UTF-8" standalone="no"?>
<project default="javadoc">
  <target name="javadoc">
    <javadoc
      access="public"
      additionalparam="-locale en_US -encoding utf-8 -charset utf-8"
      author="true"
      classpath="."
      destdir="doc"
      nodeprecated="false"
      nodeprecatedlist="false"
      noindex="false"
      nonavbar="false"
      notree="false"
      source="1.6"
      sourcepath="src"
      splitindex="true"
      use="true"
      version="true"
    />
  </target>
</project>

javadocタグにはlocale属性があるから、代わりにそっちで指定すればいいのかと思ったんだけど、相変わらず日本語で生成されてしまう。

ダメだったパターン(抜粋)
  <target name="javadoc">
    <javadoc
      locale="en_US"
      access="public"
      additionalparam="-encoding utf-8 -charset utf-8"
      author="true"
      classpath="."
       ・・・省略・・・
    />
  </target>

すごく悩んだ末、「locale」の代わりに「-J-Duser.language=en_US」を指定したら、何とか英語で生成できた。

何故かうまくいったパターン(抜粋)
  <target name="javadoc">
    <javadoc
      access="public"
      additionalparam="-J-Duser.language=en_US -encoding utf-8 -charset utf-8"
      author="true"
      classpath="."
       ・・・省略・・・
    />
  </target>

だいぶ無理やり感が強いんだけど、こんなんであってんだろうか?正攻法じゃない気がする。 そもそも何でjavadocタグのlocale属性が効かないんだろう。バグなんじゃないだろうか?

まぁ、悩んでも仕方ないので、他に正式な方法が見つかるまではこれでよしとしよう。

2011年5月8日日曜日

投稿テスト

とりあえず、テスト*1

番号付きリスト
  1. 項目1
  2. 項目2
  3. 項目3
    1. ネストした項目3-1
    2. ネストした項目3-2
      1. ネストした項目3-2-1
箇条書き
  • 項目1
  • 項目2
  • 項目3
    • ネストした項目3-1
    • ネストした項目3-2
      • ネストした項目3-2-1
 配置
左揃え
中央揃え
右揃え
均等割り付け

取り消し線


何を書いていこうかな。

ソースコードのハイライト
function main() {
    var d = new Date();
    var time = d.getHours();

    if (time < 10) {
        document.write("<b>Good morning</b>");
    } else {
        document.write("<b>Good day</b>");
    }
}

セクション

サブセクション
サブサブセクション

引用はどう表示される?

引用のテスト。引用のテスト。引用のテスト。引用のテスト。引用のテスト。引用のテスト。 引用のテスト。引用のテスト。引用のテスト。引用のテスト。引用のテスト。引用のテスト。 引用のテスト。引用のテスト。引用のテスト。引用のテスト。引用のテスト。引用のテスト。 引用のテスト。引用のテスト。引用のテスト。引用のテスト。引用のテスト。引用のテスト。

引用元の表示は後ろに付ける?


脚注

*1:脚注のテスト。