sola's note -4ページ目

sola's note

日ごろのメモを書いていきます。何か新しいものを作るために。

Error: Forbidden
Your client does not have permission to get URL /hoge/ from this server.

エラーになります。(2012/05/30現在)

以前紹介しましたが、
通常、GAE/J(Slim3)でSSL通信を設定する場合、

・appengine-web.xmlファイルに「ssl-enabled」を有効にする
<ssl-enabled>true</ssl-enabled>

・web.xmlファイルに「security-constraint」を記述する、
<security-constraint>
    <web-resource-collection>
        <url-pattern>/hoge/*</url-pattern>
    </web-resource-collection>
    <user-data-constraint>
        <transport-guarantee>CONFIDENTIAL</transport-guarantee>
    </user-data-constraint>
</security-constraint>

の記述が必要になります。
この場合、

http://[GAEのドメイン]/hoge/

にアクセスすると、自動的にhttpsとなる仕様ですが、
GAEのドメインの部分を、独自ドメインを用意・設定してアクセスすると、
前述したエラーとなります。

Googleの説明によると
現在はテスト中らしいです。

Trusted Tester Features>SSL for Custom Domains
https://developers.google.com/appengine/docs/features?hl=ja
Slim3では、GAEのmodelに対して、
自動的に登録日等を設定出来るようなアノテーションがあります。

登録日:
@Attribute(listener = CreationDate.class)

更新日:
@Attribute(listener = ModificationDate.class)

とかですね。
使い方としてはmodelクラスのフィールドに

/** 登録日時 */
@Attribute(listener = CreationDate.class)
private Date createDate;

といった感じで記載します。
(その他別途setter、getterは必要です。)
そうすると、

Hoge.setCreateDate(new Date());

とかしなくても、Datastoreにputした時の日付が自動的にセットされます。
但し、一点落とし穴があります。(勝手に落ちているだけかもしれませんが)

というのも、正しく動作しない場合があります。

ここではそれぞれについて書いてみます。
まず正しく動作する場合

■正しい動作
1.登録
Key key = KeyFactory.createKey("Hoge","foo");
Hoge hoge = new Hoge();
hoge.setKey(key);
Datastore.put(hoge);

2.更新
Key key = KeyFactory.createKey("Hoge","foo");
Hoge hoge = Datastore.get(meta,key);
Datastore.put(hoge);

上記の例では、何も追加せずに更新しておりますが、
最小限でやるとこうなります。
Keyの生成は登録時は必須ではありませんが、今回の解説の便宜上やっています。

正しい動作の場合、ちゃんと上記のやり方で登録日と更新日が登録されます。
それでは次にそうじゃない場合について記載します。

■そうじゃない動作
1.登録
Key key = KeyFactory.createKey("Hoge","foo");
Hoge hoge = new Hoge();
hoge.setKey(key);
Datastore.put(hoge);

2.更新
Key key = KeyFactory.createKey("Hoge","foo");
Hoge hoge = new Hoge();
hoge.setKey(key);
Datastore.put(hoge);

更新でなんでそんな事しているんだとか言われそうですが、
元々登録されていたデータはどうでもよくて、


とにかくKeyだけを同じにして上書きしてやろう


という時に出てくる発想です。
勿論上記の例ではKey以外に何もパラメータを設定していないので、
バカみたいな処理を行っていますが、Datastoreに対しての読み込みコストを削減したい場合は、
有りうる手法なのではないかと思います。

ですが、

この場合、登録日(createDate)は更新時点の日付になってしまいます。
Slim3の内部処理を確認していないので、あくまで結果論となりますが、

いくらKeyが同じでも、オブジェクトを新規に生成した場合は

@Attribute(listener = CreationDate.class)

は、初回登録以降も更新され続けます。
気を付けて下さい。
起業準備の傍ら、気分転換にGoogle App Engineで写真共有サイトを作ってみました。
スマホ、PC、携帯、iPad、iPhoneで動作確認しましたが、
iPadとiPhoneはそれぞれの都合でファイルの取り込みが出来ないようです。(見る事だけは出来ます。)

フォトシェア-期間限定写真共有サイト-
http://found-photoshare.appspot.com/

3Mbyteまでのサイズであればアップロードできるので、興味があれば試してみて下さい。
でもアクセス殺到すると、サーバの特性上1日停止します。

また、現在は登録から約1週間過ぎるとアカウントと写真、全て削除されます。
(削除期間はアクセス数に応じて3日くらいに変更する可能性があります。)
ちょっとした写真共有のみにお使い下さい。

気軽な写真共有サイトがないなーと思って作ったので、
会員登録みたいなのはありません。

今後GAEのサーバを使っていこうかなという事で、
負荷テストやその他諸々も兼ねての公開なので、
これ以上品質を上げていこうというのはあまり考えていません。