GAE Tips Vol.2

なんて書いてますけど。
要するに、ただのメモです。
相変わらずっちゃあ、相変わらずですが。
『Tips』って聞くと、イメージ的には粋な小技って感じ(※感想には個人差があります)なので、タイトルに対してどうしようもないメモしか書かないことに抵抗が無い訳ではないのです。


て言うか、白状します。
あまりにも久しぶり過ぎて、記事の書き方忘れました
そんな訳で。
過去の記事を参照しながら書いてます。
いいですね、こういうの。
過去に自分が積み上げたものが、現在の資産となって活かされる。
素晴らしいじゃないですか。
まあ、積み上げたのが僕なので資産というよりも負債かもしれませんが。


さて、本題ですね。ネタの一つ一つが細かいので、特に分けないでだらだら書いてこうと思います。
ちなみに、久方ぶりなので自己確認の意味も込めて書き記しますが、このメモは『僕自身がわからなくて調べたことのまとめ』です
なんで、赤字なんでしょう?
シンキングタイム、ボーナス10ms(マイクロセカンド)!
はい、その通り!正解は『警告の意も兼ねているから』でした!
………………。


端的に言うと、オープンであることはオマケみたいなもので、ウェブ上のテキストファイルのストレージみたいな感覚で僕はこの日記を書いているんです。
なので、貴方がここの記事でどれだけ時間を無駄にし、不快感を催したとしても、その責任を負いかねると胸を張って言っている訳です。
そもそも、日記って人に見せるためにかくもんじゃなくね?とか。
見せるための日記っていうのが新鮮だったんじゃんか!とか。
そういう議論はしないで下さい。
僕のために争う人を見たくない……ああ、僕のためではないですか、そうですか。


それでは、サボりにサボったので、最終的にはとんでもなく長くなるかもしませんので、退場はセルフ・サービスでお願いします。
オープンとクローズがセルフでないページが限りなくマイノリティですが。

管理者だけログイン

初っ端からとんでもなく、ちっちぇネタです。
まあ、これはソースだけ載せときます。(うわ……ソースの載せ方まで忘れてる……)

-  url: /admin/.*
   static_files: htdocs/admin.html
   upload: htdocs/admin.html
   login: admin

これで、該当ページのオープンはログインを要求され、管理者でなければ弾かれます。


ここで、uploadなんですけど、これがいまいちよく分からない。Googleのドキュメントも見たんですが、理解があってるのかどうか……。
でも、要するに『URLとアプリケーションディレクトリにおけるファイルパス(サーバー上のファイル位置)の一致を補助する』ためのものだと思います。


そもそも、GAEでは効率化のため(と仰ってます、Google様が)に、アプリケーションファイル(スクリプトファイルって言ってもいい?)と静的ファイルが別々に保存されています
余談ですが、その都合上アプリケーションファイルからアクセスする必要のあるデータ用のファイルは静的ファイルとして扱われないように、アプリケーションファイルとしてサーバーにアップロードする必要があるそうです。
加えて、アプリケーションファイルと静的ファイルがサーバー上でそれぞれ異なるファイルシステムで管理されています。
気にしないで使ってましたけど、けっこう芸が細かいんです。
まあ、世の中大抵そんなもんですよね。見えない努力の積み重ねが、日常を、当たり前を支えているんです。きっと、僕の努力もいつか。
そのために、まずは努力することから始めようと思います。明日くらいから。


で、話逸れましたが。
要するに、uploadが必要なのは、static_filesハンドラの場合のみです。
どういうことかって?
それは簡単には教えらんねぇなぁ。
だって、僕もよくわかってないんだもん!
……いえ、冗談です。


たとえば、

-  url: /admin
   static_dir: admin

とした場合、ローカルにおけるadminというディレクトリ内のファイルは、一括して静的ファイルとして扱われます。つまり、このディレクトリ内にアプリケーションファイルを配置することはできません。(おいても、静的ファイルとして扱われることでしょう。)


一方、再掲となりますが、

-  url: /admin/.*
   static_files: htdocs/admin.html
   upload: htdocs/admin.html
   login: admin

と書いた場合は、特に他で設定してない限り、htdocsは静的ファイルもアプリケーションファイルも混在可能です。それは、static_filesハンドラ、つまり静的ファイルパターンハンドラが、ディレクトリ全体ではなく、ファイル単位でURLとマッピングするからです。
uploadはここで活きてくるのです。
つまり、そもそも静的ファイルとアプリケーションファイルが別々で保存されているのに、『このURLはこのファイルね』とか言われても、ハンドラはどっちのファイルシステムを探してよいかわかりません。この対応関係を教えてあげるのが、uploadなのです。


もっと端的に言うならば、uploadは対象が静的ファイルであることを明言するためにあります。
ですので。
必然、static_filesとuploadはセットで使うことになる。
唐突にアルス=マグナ発動した訳ではないです
ともあれ。
書かなくても動く可能性ありますが、すみません、今回はそこまでの検証実験は行ってません。
ただ、書いた方が安心、丁寧ということはあるでしょう。

あれ?これ、何を書こうと思った項目だったっけ?

VS. GQL!日付で条件を操作せよ!

これ、何かご存知の方がいたら、ぜひご教授いただきだい内容です。


実は、この空白期間に、ちょっとしたプライベートなチャットシステムを作ったんです。
ラクタも同然の代物でしたけど。
んで。
チャットなんで、書き込みはどんどん増えます。利用者が二桁もいかない程度だったので、まだ良かったんですが、それでも日に50件は書き込みがあるものでした。
だから、データストアへのアクセスもたくさんあったんですよ。


また余談ですけど、データストアへのアクセスは非常にCPUリソースを食います。
気を抜くと、あっという間にクオータの上限越えます。
これは使用率の話ですが、だいたい80件くらい呼び出そうとすると、ダッシュボード(GAEアプリの管理コンソール)に警告メッセージが表示されます。黄色で。
100とかいくと、赤いアイコンで警告されます。
まあ、そこは何とか60件表示して、次があったらリンクを表示して、リンクがクリックされたら次の60件を表示するっていう方法をとり、何とか収めましたが。
これは、別件なので割愛。


で、本題に戻りますけど、アクセスの問題の他にもGQL、つまりデータストアへのアクセス手法でも一つ僕が悩みに悩んだものがあります。
それが、日付での絞り込み検索です。
たとえば、

query = Greeting.gql('WHERE date <= :1 '
                               'ORDER BY date DESC',
                               '2011-01-01 00:00:00')

とかってしたいとしましょう。
この時、dateがdb.DateTimePropertyで宣言されていると比較できなかったんです……。


まあ、ドキュメントをよく見れば書いてあるんだと思います。
でも、僕はそれを見つけられなくて、「何で比較できる形にしてあるのに結果が違うんだ!?」とか「これはGoogleの陰謀か!?」とか、無駄に騒いだものですが。
結局。
新たに日本時間で保存するjdateをdb.StringPropertyで宣言して作ることで、検索可能になりました。
上記のようにjdateを宣言し、先ほどのGQLを、

query = Greeting.gql('WHERE jdate <= :1 '
                               'ORDER BY jdate DESC',
                               '2011-01-01 00:00:00')

とすると、欲しかった検索結果が表示されるようになったのです。


この経験から僕は、『日付で条件付き検索を行いたいなら、日付をStringProperty、つまり文字列型として保存するのが良い』、と思っているんですが、どうなんでしょうね?
ちなみに、ドキュメントでは比較可能な形の中に『2011-01-01 00:00:00』を挙げていますが、『2011/01/01 00:00:00』のようにハイフンをスラッシュで保存して検索しても構いません。
ちゃんと絞り込み検索可能です。
ソースは僕です。
信憑性の欠片もありませんね。

結び

いやあ、もっと書くことあるはずなんですけどね。
力尽きました。
と言う訳で、残りは次回に持ち越しです。
まあ、一つの記事が長くなりすぎるのも嫌なので、結果オーライということにします。
しかし、クラウドのスケーリングの醍醐味を味わおうと、データストアへのアクセス、つまり先述のチャットシステムにおける過去コメントの表示を1000件に設定して、書き込みログが増えた途端に警告祭になったのには驚きました。
ほんとに。
最初は書き込みのログも少ない、つまりアクセスしても読み込む件数が少ないから、1000件設定でも問題なかったんですが、すぐにとんでもない事態になってしまって……。
ダッシュボードをこまめに見ていなかったら、どうなってたんでしょうねぇ……。
まあ、どうなってたんだろうって言うか、結局アプリケーションが停止するんでしょうけどね。
60件ずつ表示とか……超ちまちましてて面倒くさいよね……。
って、使ってた方は思ってたことでしょう。
うん、ごめんなさい。


こんな感じで。
今日のところは、これでご寛恕願います。
それでは、またー。