2010/04/29

Android開発環境構築メモ

環境

  • Ubuntu 9.10
  • JDK1.6.0_12
  • Eclipse 3.5
  • Experia X10

Android SDKを入れる。ここからDL。現在2.1

好きなディレクトリに展開。PATHにtoolsを通す。

(必要なら)ソニエリのデベロッパーサイトからExperiaのSDKをDL。AndroidSDKのadd-onsディレクトリに展開。add-ons/XPERIA-X10_r1のようになる。

Eclipseを立ち上げてADTプラグインを入れる。マネージャでhttps://dl-ssl.google.com/android/eclipse/を追加。だめならhttp://dl-ssl.google.com/android/eclipse/としてSSLを使わないようにする。

Preference→AndroidでインストールしたSDKを指定してOK

Window→Android SDK and AVDでAVDマネージャを起動

InstalledPackageで好きなバージョンを追加。Experiaなら1.6(API Level4)を入れる。

VirtualDeviceでTargetをX10に指定してVirtualDevice(エミュレータ)作成。起動時にScale display to real sizeにしておくと、854x480ではなく実機の大きさで起動してくれるのでネットブックでも安心。
Androidのエミュレータは実機をそのままエミュレートするので、iAppliのようにアプリ実行ごと都度起動ではなく立ち上げっぱなしにして使うもの。

EclipseでPreference→AndroidでApplyを押すとTargetが再ロードされるのでX10を選択

New Project→Android Project。Project作成ダイアログが表示されるが、ネットブックとかだと画面の縦幅が足りずにBuild Targetが出てこない場合がある。Linuxの場合、Alt+F7で画面外にダイアログをずらして、Alt+F8で下にダイアログを伸ばすと必要な項目が出てくる。

Project Nameは好きな名前, Build Targetは実機に合わせる。X10とか。Application Nameは実機で表示される名前。package nameはJavaのパッケージ名。デフォルトパッケージは不可なので適当に。Create Activityは最初に呼ばれるActivityのクラス名。Activityについては公式ドキュメント等参照。Min SDK Versionはアプリで許容する最小のSDKのバージョン。API Levelで指定する。

できたらパッケージエクスプローラでプロジェクトを右クリックRunAs→AndroidApplicationで起動すればエミュレータにHelloworldが表示される。

An SDK target must be specified.

2010/04/03

TinyDSメモ(Query編)

Query

クエリ用クラス
内部で使っているので、appengine-apiに含まれるDatastore::Query辺りを合わせて読むと幸せになれそう

使い方

Person.query.sort(:user_name, :desc).filter(:user_name, '==', 'hoge').one

基本的に設定メソッドはselfを返すのでメソッドチェインが可能

メソッド

メソッド説明
initialize(model_class)コンストラクタ
Base.queryで取得するので基本使わない。
ancestor(anc)祖先を指定する。
anc:祖先。Base, String, Keyを指定可能。
filter(*args)フィルタを設定する。
argsはHashまたはパラメータ名, 演算子, 値の3組のどちらかを指定する。
Hashを指定した場合はname=>パラメータ名, value=>値のペアで「==」フィルタになる。
3組の場合に指定できる演算子は以下のとおり
  • ==
  • >
  • >=
  • <
  • <=
  • IN
  • !=
  • <>
sort(name, dir=:asc)ソートを指定する。
name:プロパティ名
dir:ソートの方向 :asc(昇順)または:desc(降順)を指定する。
デフォルトは昇順。
keys_only検索結果としてKeyだけを返すように設定する
count設定されている条件で取得できるエンティティの数を返す。
one設定されている条件で1件のエンティティを取得する。
複数ヒットする場合はTooManyResults例外、ヒットしなかった場合nilを返す
all(opts={})設定されている条件にヒットする全エンティティを取得する。
optsには:limit, :offset, :chunk, :transactionが指定できる。
:limit : クエリが戻す結果の上限
:offset : オフセット(スキップする件数)。スキップした数は:limitに影響しない
:chunk : 内部のチャンク方法を指定するらしいがよく分からない。
:transaction : クエリを実行するトランザクション。祖先のクエリ(ancestor queries)のみサポートしている。
指定しない場合、現在のトランザクション(current transaction)を使用する。
each(opts={})設定されている条件でヒットするエンティティにブロックで渡された処理を行う。
optの値はallと同じ
collect(opts={})設定されている条件でヒットするエンティティにブロックで渡された処理を行い、その結果を返す。
optの値はallと同じ
keys(opts={})指定された条件でヒットするエンティティのKeyを返す。
optの値はallと同じ

2010/04/02

TinyDSメモ(Base編)

JRuby on gae/jで使えるDatastoreのラッパーであるTinyDSの個人的メモ (0.0.3 pre)

間違っていたら指摘をお願いします。

TinyDS::Base

エンティティの基底クラス。

基本的な使い方

class Person << TinyDS::Base property :user_name, :string end # 作成 Person.create({:user_name => "hoge"}) # idから検索 hoge = Person.get_by_id(id) puts hoge.user_name #=> hoge

保存したいプロパティはproperty :カラム名, :型名で定義

プロパティの型

シンボル説明
string文字列 RubyのString(500byte以下)
integer整数 RubyのInteger
text長い文字列 RubyのString(DatastoreのTextクラス)
time日付 RubyのTime
listリスト RubyのArray
float浮動小数点 RubyのFloat *0.0.2にはない
booleanブール値 Rubyのtrue/false *0.0.2にはない

floatとbooleanを使うにはGithubから最新版を取得する必要がある。

予約されているプロパティ名

  • id: Keyのid
  • name: Keyのname
  • key: key
  • entity: Baseの中で使っている
  • parent_key: 親のKey
  • parent: 親

プロパティ名がcreated_atとupdated_atの場合はsaveを行う際に自動的に作成日と更新日時が設定される。

メソッド

メソッド名説明
initialize(attrs={}, opts={}コンストラクタ
attrs:このエンティティに設定したいプロパティのHash(key=>name, value=>値)
opts:オプションのHash :id, :name, :key, :parentと:entityが指定できる。
:id:このエンティティのidに指定したい整数値
:name:このエンティティのKeyのnameに指定したい文字列
:key:このエンティティのKeyに指定したいKey

:id, :name, :keyはいずれか1つだけ指定可能。2以上指定すると例外
:id, :name, :keyを指定しない場合は:id自動発番

:parent:Hashの値にエンティティを入れておくと、それを親エンティティとして作成する。
:entity:Hashの値にエンティティ(生のEntity)を入れておくと、それを元にエンティティを作成する。
:entityを指定しない場合、newで作成した場合は新規レコード扱い(new_record==true)になり、saveするまでDatastoreには格納されない。
self.property(name, type, opts={})プロパティを定義する。
name:プロパティの名前
type:プロパティの型
opts:オプション opts[:default]=デフォルト値とすることでデフォルト値を渡せる。
デフォルト値はProcオブジェクトでもよく、Procの場合はそれをcallした結果がデフォルト値になる。
self.property_definitions定義されているプロパティを取得する(key=>name, value=>PropertyDefinitionsのHash)
>self.property_definitions(name)nameで指定されたプロパティ定義を取得する。存在しない場合は例外
self.valid_property?(name, context)nameで指定されたプロパティが存在すればtrue。contextは使っていないっぽい
self.has_property?(name)nameで指定されたプロパティが存在すればtrue。
self.default_attrsデフォルト値の一覧を返す(key=>name, value=>デフォルト値のHash)
self.kindこのエンティティのKindを返す
keyこのエンティティのKeyを返す
idこのエンティティのidを返す
nameこのエンティティのnameを返す
parent_keyこのエンティティの親のKeyを返す
self.to_key(m)渡されたオブジェクトをKeyとして返す。mの種類によって以下の動作となる。
Key=>そのまま
Entity=>m.key
String=>KeyFactory.stringToKey(m)で生成したKey
Base=>m.key
それ以外=>例外
self.allocate_ids(num)Datastore.allocate_ids(kind, num)の結果(KeyRange)
self.allocate_idDatstore.allocate_ids(1).startの結果(Key)
self.create(attrs={}, opts={})エンティティの作成と同時にDatastoreに保存する。
引数はinitializeと同じ。保存する前にvalid?が呼ばれ、不正なエンティティの場合falseが返る。
self.create!エンティティの作成と同時にDatastoreに保存する。
引数はinitializeと同じ。保存する前にvalid?が呼ばれ、不正なエンティティの場合RecordInvalid例外がスローされる。
self.new_from_entity(_entity)既存のエンティティ(生Entity)からエンティティを生成する。
valid?このエンティティが有効かをチェックする。デフォルト実装では常にtrueを返す。createやsaveのときに暗黙的に呼ばれる。
new_record?新規レコード(まだDatastoreに格納されていない)の場合trueを返す。
saveDatastoreに保存する。保存する前にvalid?が実行され、不正なエンティティの場合falseを返す。
save!Datastoreに保存する。保存する前にvalid?が実行され、不正なエンティティの場合RecordInvalid例外がスローされる。
self.get!(key)指定したkeyのエンティティを取得する。エンティティが見つからない場合EntityNotFound例外をスロー
self.get(key)指定したkeyのエンティティを取得する。エンティティが見つからない場合nil
self.build_key(id_or_name, parent)Keyを生成する。
self._get_by_id_or_name!(id_or_name, parent)指定したidまたはnameのエンティティを取得する。エンティティが見つからない場合EntityNotFound例外
self.get_by_id!(id, parent=nil)指定したidのエンティティを取得する。エンティティが見つからない場合EntityNotFound例外
self.get_by_id(id, parent=nil)指定したidのエンティティを取得する。エンティティが見つからない場合nil
self.get_by_name!(name, parent=nil)指定したnameのエンティティを取得する。エンティティが見つからない場合EntityNotFound例外
self.get_by_name(name, parent=nil)指定したnameのエンティティを取得する。エンティティが見つからない場合nil
self.get_by_ids(ids, parent=nil)指定したidのエンティティを取得する。idsはidのArray。
self.get_by_names(names, parent=nil)指定したnameのエンティティを取得する。namesはnameのArray
self.queryQueryオブジェクトを返す。詳しくはQueryについてを参照。
self.countこのKindの件数を返す
destroyこのエンティティを削除する
self.destroy(array)指定されたArrayに含まれるエンティティを削除する
self.destroy_allこのKindのすべてのエンティティを削除する
read_onlyこのエンティティを読み取り専用にする
regetDatastoreから再度読み込み直す。トランザクション用らしい?
tx(opts={}, &block)トランザクション内でblockを実行する。
optsには:retritesと:force_beginが指定可能。
:retriesはトランザクションの再試行回数(Datastore.transaction(retries)を参照)
:force_beginはDatastore.current_transaction(nil)で強制的にトランザクションを開始する
attributes=(attrs)属性を設定する
set_property(k,v)プロパティを設定する
get_property(k)プロパティを取得する