2008年9月24日水曜日

Google App Engineのアプリバージョン

GAEでは、アプリケーションのバージョンを、
app.yamlというファイルで指示するメジャーバージョンと、GAEサーバにアップロードする度にカウントアップされるマイナーバージョンの2つで管理していたようなので、変更してはアップロードを繰り返していたら、Push It!は、1.180とかとんでもないバージョンになっていました。

そう。なっていました。過去形。

いつの間にかマイナーバージョンの表示がなくなってます。
Dropboxを使い始めた時期とかぶるので、それが関係してるのかなあとか思ったけど、マイナーバージョン管理・参照するのはGAEサーバだけだと思うしなあ。SDKが見てるとしてもDropbox関係なさそうだし。

サーバの方もちまちまと手が入ってるのね~。と思た。

2008年9月23日火曜日

プロキシ環境内のappcfg.py

Google App Engineの話。
会社内などで、社外に出るにはプロキシを通す必要がある場合がありますよね。
Google App Engineでコンテンツをサーバにアップロードするためにはappcfg.pyというコマンドを使ってHTTPで送信するのですが、これがOSの(というかWindowsならIEの、かな)プロキシ設定を勝手に使ってくれるわけではく、プロキシを環境変数に設定してやる必要があります。

で、ここ↓
http://code.google.com/intl/ja/appengine/docs/appcfgpy.html
に、どのように設定すればいいか書いてあります。解決。


・・・じゃなかったんだよ!
Windowsだけなのかな?ここに書いてある方法だけじゃHTTPS通信がこけるんです。
で、試行錯誤した結果、
https_proxy=http://.....
という環境変数を設定すれば通ることを確認した。

環境変数名はhttps_proxyだけど、値はhttp:で始まるとかわけわからんよ。。。
というか、ちゃんとどっかに書いておけ~!

2008年9月22日月曜日

Dropboxを使い始める

Google App Engineとはちょっと話題がずれますが、Dropboxっていうオンラインストレージ、知ってますか?

自分、家と会社の休み時間でちょこちょことコーディングしたりするので、ソースコードを持ちまわってたんですが、わりとめんどくさいんですよね。いちいち固めてUSBなり既存のオンラインストレージにアップして、またそれを解凍して配置して、、、って。

で、Dropboxなんですが、これ、OSのファイルシステムと統合されてるんです。
どういうことかというと、マイドキュメントに作られたMy Dropboxというフォルダに普通にファイルやフォルダを置いたり、更新したりすると、自動的にインターネット上のストレージと同期されるってわけ。

つまりこれまでのオンラインストレージのように、ローカルのファイルをわざわざ専用ツールやブラウザからアップしなくていいってこと。劇的に楽だ!

強いて言えばWindowsのオフラインフォルダのインターネット版のようなもの。
でもオフラインフォルダはオンライン状態では、共有ディスクの方が原本になるのに対して、こちらはインターネットというLANよりは信頼性の落ちるネットワークを使ってるので、ローカルディスクが原本となって、インターネット上へは逐次同期される感じ。rsyncのイメージ。
もちろんタイムラグは発生するわけですが、遅いネットワークにアップし終わるのを待たされるより全然いい。ファイルの書き込み時間はローカルと同等(ローカルだから当たり前だが)なので快適。素敵。

昔の「.Mac」。今の・・・なんだっけ?あれもインターネット上のフォルダをOSからシームレスに使えたけど、あれはネット上が原本だから、読み書きのレスポンスは期待できなかったし、ネット未接続だと使えない。でもDropboxはいい!

しかも変更前のファイルも保存してくれる(subversionのイメージ)とか、もう至れりつくせりだな、おい!

そんなわけでとても気に言ってます。
唯一気になるのは、ブラウザ用インタフェースが、シンプルなんだがなんだか微妙にしっくりこないこと、くらいかな。慣れればオッケー!
皆さんも使ってみてください。

Google App EngineのSDKについて

DeadlineExceededErrorの話を前回書いたけれども、こいつにはもう一つ困ったことがあって、ローカル環境で開発するためのSDKにDeadlineExceededErrorクラスが存在しないの。
もちろん発生もしないのだが。

そのせいで、DeadlineExceededErrorのインポートでエラーになるから、ホストの判定がlocalhostだったらインポートしないようにしつつ、例外キャッチの部分ではどうしてもDeadlineExceededErrorを書かんとあかんので、ダミーのDeadlineExceededErrorクラスを定義してやるというような工夫を余儀なくされている。

インポートをifブロックに入れるなんてできるとは知らなかった頃は、ローカルの時はDeadlineExceededErrorをコメントアウトして、アップするときはコメントを消す、なんて涙ぐましい努力をしていたのだった。消し忘れてDeadlineExceededErrorをトラップできなかったりね。

ちなみにもう一つ、memcacheという非常に有効な仕組みがGAEにはある(というかGoogleが作ったわけじゃないので、使えるようにしてある、と言うのが正しいか)のだが、これも昔のSDKでは使えなかったようだ。
しかし、少なくともSDK1.1.1のあたりでは使えたはずだし、現時点で最新の1.1.3ではローカル環境の管理ツールで、memcacheの内容を確認できるようになった。めでたい!
でも逆に本番サーバ上で確認する方法はないのだろうか??

追記:memcacheはSDK1.1.0から使えるようでした。

2008年9月19日金曜日

Google App Engineで遊んでいます。でも・・・

Google App Engine。知ってますか?
要するにホスティングサービスみたいなもんなんですけどね。
ただGoogleの潤沢なインフラを使える、無料、DBも(ちょっと変わってるけど)使える。などなどのメリットがあり、それで遊んでます。

でも、ちょいと困ったことがありまして、このGAEのサーバは、一つのHTTP Requestに対して8秒前後くらいでタイムアウトしてしまうのです。

で、それを放置すると、DeadlineExceededErrorというエラーが出てしまい、HTTPエラーが返ってしまうという仕様。

これをトラップして、DeadlineExceededErrorが出たらそれなりの正常応答を返すという方法もあって、
http://webdba.blogspot.com/2008/07/deadlineexceedederror.html
この辺を参考に、トラップして逃げることはできました。

しかし、ですよ。
どっ ちにしても8秒前後でタイムアウトしてしまうことには変わりないので、例えば誰かの書いたコメントを即時ブラウザに反映させるチャットのようなサービスを 作るためにComet的IFを用意したとすると、8秒に1回HTTP Requestを投げないといけないわけで、そうするとどうなるか。
8秒に1回HTTP Requestを投げ続けて、しばらくすると、

「Over Quota」

といって怒られる(HTTP Requestがはねられる)。

おいー、どないせいっちゅうねん!

いちお、GAEにはCPUだのストレージ容量だのに制限があって、気を付けてそれらをバカ食いしないようにしてるんですが、なぜか怒られます。
引っかかるとしたら単位時間あたりCPU使用時間くらいなんですが、このComet的IFの中身は9割以上sleep時間のはずで、そのくらいで引っかかっててもらったら全然楽しくないんですけど。
自分一人のためのサイトを作ってるなら我慢するけど、それだったらGAEのインフラなんぞ使う必要ないわー!と一人不満をためこんでいる毎日です。

英語が得意ならGAE担当に苦情のメールでも投げてやるんだが。。。

☆☆☆2009/12/26追記☆☆☆
あ~これ最初のエントリだったんだね~。
最新のDeadlineExceededErrorの情報については→ここ←が詳しいですよ。
で、相変わらずCometは使えませんが。
WebSocketとか後でいいから早くCometを・・・。