Google AppEngine 3アプ目
レス数が950を超えています。1000を超えると書き込みができなくなります。
0001nobodyさん
2010/02/25(木) 09:32:03ID:5mUqVSikhttp://code.google.com/appengine/
■過去スレ
Google App Engine
http://pc11.2ch.net/test/read.cgi/php/1207754942/
Google App Engine 2アプ目
http://pc11.2ch.net/test/read.cgi/php/1243654802/
■リンク集
はてなブックマーク
http://b.hatena.ne.jp/t/gae
http://b.hatena.ne.jp/t/Google%20App%20Engine
Delicious
http://delicious.com/popular/gae
http://delicious.com/popular/googleappengine
■参考サイト
App Engine ギャラリー
http://appgallery.appspot.com/
ドキュメント
http://code.google.com/appengine/docs/python/overview.html
0871nobodyさん
2011/03/07(月) 08:38:48.62ID:???App Engine 1.4.1 をリリースしました - High Replication Datastore の紹介 - Google Japan Developer Relations Blog
http://googledevjp.blogspot.com/2011/01/app-engine-141-high-replication.html
0872nobodyさん
2011/03/07(月) 12:12:07.14ID:???0873nobodyさん
2011/03/07(月) 17:07:19.40ID:???マスターデータは一回アップロードすればそれ以上必要ないんですが、緊急メンテナンスが発生したとき
out of quota出たら泣けますね。
ダッシュボードは使えるみたいだから、管理者ページだけでも動くようにしておいて欲しいなあ・・・
0874nobodyさん
2011/03/07(月) 17:14:26.86ID:???0875nobodyさん
2011/03/08(火) 14:47:38.27ID:???0876nobodyさん
2011/03/08(火) 15:53:16.21ID:???ありがとうございます!これのことです!。昔作ったアプリは変更できないんですね。。
それにしてもいつの間にか日本語ブログ出来てたのかぁ。
0877nobodyさん
2011/03/08(火) 16:14:27.16ID:???datas = db.GqlQuery("SELECT * FROM Data offset -1")
と書いてみましたが、-1では指定できませんでした。
0878nobodyさん
2011/03/08(火) 16:25:35.89ID:???使わなくてもアプリ組めるよ
0879nobodyさん
2011/03/08(火) 16:33:24.19ID:???タイムスタンプ記録してORDER BY timestamp DESC LIMIT 1
別のテーブルでIDを管理してIDで検索
ID検索がたぶん高速
0881nobodyさん
2011/03/08(火) 16:51:11.36ID:???複数エンティティからKey_name作って登録する方法だと、たぶんbulkloaderのCPU使用時間は
おまかせkeyで登録するより5倍かかる(当然登録件数によるけど10万件単位)ようです。
10万行処理するのに無料Quotaの10%使ったって参考にしたブログにあったけど
今日は10万行で50%使いました。100万単位だともっとかかるようになるでしょね。
データのメンテナンスするときは更新・削除がラクだろうけど、これは果たしてどうだったのか・・・
チラ裏でした。
さて、そろそろQuotaリセットされる時間です。作業にもどります。
0884nobodyさん
2011/03/08(火) 19:31:02.60ID:???テーブルって言葉が混乱を招いたようですが
別にモデルを作ってそのエンティティに保存しておくだけです。
key_nameを決めてその名前でひとつだけエンティティを保存しておけば
key_nameから簡単にエンティティにアクセスできます。
0886nobodyさん
2011/03/08(火) 19:49:47.01ID:???なるほど
現在、Model Aで定義したものをフォームから受け取り、
そのフォームから受け取ったデータを
data = form.save()
data.put()
で保存しているのですが、
具体的にこれを別のモデルを作りそのエンティティに保存しておく、というのは
どうすればいいんでしょうか?
0887nobodyさん
2011/03/08(火) 21:13:48.19ID:???ID = db.IntegerProperty()
があるとして、Aのdataを保存したあと
key_name = "thisisAslastupdate"
b=B.get_or_insert(key_name)
b.ID=data.key()id() #dataのIDを保存
b.put()
Aのdataを呼び出すとき
key_name = "thisisAslastupdate" #常に同じkey_nameをつかう
b=B.get_or_insert(key_name)
data = A.get_by_id(b.ID)
もちろんトランザクションで処理した方がいいです。
適当にみつけた参考ページ
http://kan.txt-nifty.com/softdev/google_apps_engine/index.html
0888nobodyさん
2011/03/08(火) 21:21:17.71ID:???0889nobodyさん
2011/03/08(火) 21:26:11.17ID:???0890nobodyさん
2011/03/08(火) 21:49:33.48ID:???key_name = "thisisAslastupdate"
b=B.get_or_insert(key_name)
b.ID=data.key()id() #dataのIDを保存
b.put()
これはどこに記述すればいいんでしょうか?
Class Aでdata.put()をした直後でしょうか?
0891nobodyさん
2011/03/08(火) 22:00:23.08ID:???こっちではimportエラーが出てます
<type 'exceptions.ImportError'>: cannot import name template
0892nobodyさん
2011/03/08(火) 22:10:44.23ID:???b.ID=data.key()id()
ここは、
b.ID=data.key().id()でよろしいでしょうか?
スペースをなくし、.をいれています。
0893nobodyさん
2011/03/08(火) 22:11:48.96ID:???そうです。でもコピペしただけでは動かない可能性もありますよ。
ここから先はリファレンスを読んで全体の理解を深めることをおすすめします。
0895nobodyさん
2011/03/08(火) 22:18:32.88ID:???0896nobodyさん
2011/03/08(火) 22:24:25.86ID:???いえ、本当に助かりました。ありがとうございます。
一度動くとリファレンス読んでも急に理解しやすくなったような気がします。
しっかり読んで、またオライリーのGAEも買ってみようと思います。
うまく動いたのですが、
<__main__.TotalData object at 0x078046F0>
と、unicodeがそのまま表示されてしまった?のですが
これはどうすればそのまま表示できるのでしょうか?
0897nobodyさん
2011/03/08(火) 22:27:39.15ID:???0898nobodyさん
2011/03/08(火) 22:32:13.18ID:???日本時間 3/8 9:00PM 現在 Python Runtime で障害が発生しています。
現象としてはあるはずのモジュールに関して ImportError が発生しています。
現在復旧作業中です。アップデートがあればこのスレッドでお知らせします。
松尾さんご苦労様です。早く直してね。
0900nobodyさん
2011/03/09(水) 07:49:38.80ID:???http://groups.google.com/group/google-app-engine-japan/browse_thread/thread/c8f2fe71e927e5d4
0901nobodyさん
2011/03/09(水) 07:52:28.78ID:???0902nobodyさん
2011/03/09(水) 12:16:09.67ID:???0903nobodyさん
2011/03/09(水) 14:38:10.63ID:???Javaの方ができることは多そうですがPythonの方が新しい言語なのでまとまっていて取っ付きやすいのではないかと踏んでいます。
目標は認証付きでテキスト、画像、バイナリのアップロード、ダウンロード。
特定の呼び出し(?)に対して任意のXMLを返すといったところまでです。
アドバイスよろしくお願いします。
書籍は「新人プログラマのための」を買おうと思っていますが他にもおすすめがあればお願いします。
0904nobodyさん
2011/03/09(水) 15:05:18.92ID:???0905nobodyさん
2011/03/09(水) 18:30:54.01ID:???0906nobodyさん
2011/03/09(水) 20:26:35.45ID:???0907nobodyさん
2011/03/09(水) 23:25:55.44ID:7V71uazChttp://www.youtube.com/watch?v=3xnKX8xksNg
0908nobodyさん
2011/03/10(木) 04:06:53.38ID:79yNqmJlえっ!やっぱり ずっと悩んでたのに。。。
0909nobodyさん
2011/03/10(木) 04:09:24.32ID:???みんな会社単位とかで使ってるのか?
0910nobodyさん
2011/03/10(木) 09:48:36.24ID:???みんな会社単位とかで使ってるのか?
0911nobodyさん
2011/03/10(木) 10:41:49.18ID:???0912nobodyさん
2011/03/10(木) 11:09:50.86ID:???0913nobodyさん
2011/03/10(木) 11:11:07.28ID:???わからないことはそのつどググって英語サイトとかまで見てます。
0914nobodyさん
2011/03/10(木) 15:55:06.40ID:/uspR3SGNoMethodError (undefined method `getString' for #<Str1:0x9e40d2>)
のエラーがでるんですが、Str1クラスのnewはできるみたいなんですが
メソッドgetStringを呼べません。ソースは
// Str1.java
package com.aaa;
class Str1 {
protected String str;
public Str1(String str) {
this.str = str;
}
public String getString() {
return str;
}
}
#aaa_controller.rbの一部
require 'java'
import 'com.aaa.Str1'
class AaaController < ApplicationController
def aaa
sss = Str1.new("asasas")
p sss.getString
render :text => ""
end
end
0915nobodyさん
2011/03/10(木) 15:59:35.51ID:???http://hibari.2ch.net/test/read.cgi/php/1267094290/
0916nobodyさん
2011/03/10(木) 23:41:14.23ID:???何気にlogging.debug()使っていい適正回数とかあるんでしょうか?
10回以上使うと重くなるよ的なことってあるんでしょうか?
0917nobodyさん
2011/03/11(金) 08:22:28.47ID:???http://uproda.2ch-library.com/351286Yrr/lib351286.png
ってなんで赤文字で出てるんでしょう?どんな意味があるんでしょうか?
0918nobodyさん
2011/03/11(金) 11:01:15.80ID:???0919nobodyさん
2011/03/11(金) 19:49:49.46ID:???課金覚悟くらいの感じだと思う。
現実的にCPUコスト食うのはしゃーない
0920nobodyさん
2011/03/12(土) 00:13:49.97ID:???The server encountered an error and could not complete your request.
If the problem persists, please report your problem and mention this error message and the query that caused it.
このエラーから進めなくなってるんですが
対処法ありませんか?
0923nobodyさん
2011/03/15(火) 13:04:24.11ID:???0927nobodyさん
2011/03/15(火) 18:21:38.24ID:???ログは自己解決しました。
しかし問題は>>887で指摘されたところにありました。
ローカルでは動くのですが、アップするとエラーになってしまいます。代替案を考えなければならないんでしょうか
0928nobodyさん
2011/03/15(火) 20:19:30.05ID:???0930nobodyさん
2011/03/16(水) 02:02:36.09ID:???0931nobodyさん
2011/03/17(木) 18:49:25.34ID:???BadArgumentError: Expected an instance or iterable of (<type 'int'>, <type 'long'>); received None (a NoneType).
というエラーでつまづいてしまいます。
>key_name = "thisisAslastupdate" #常に同じkey_nameをつかう
>b=B.get_or_insert(key_name)
>data = A.get_by_id(b.ID)
おそらくここでエラーが出ているようです
0933nobodyさん
2011/03/19(土) 15:41:03.41ID:???dataA = db.StringProperty()
dataB = db.StringProperty()
というモデルがあって
key_name = dataA + dataB
とルールを内包させたい場合
put()
をオーバーライドしようとして詰まってます。
get_or_inserを外から呼び出せばいいことですが
中で処理するのは無理でしょうか?
よい方法はありませんか?
0934nobodyさん
2011/03/19(土) 16:24:56.79ID:???class MYdata(db.Model):
dataA = db.StringProperty(required=True)
dataB = db.StringProperty(required=True)
@classmethod
def my_get_or_insert(cls, _a, _b):
return cls.get_or_insert(key_name=_a + _b, dataA=_a, dataB=_b)
0936nobodyさん
2011/03/22(火) 22:43:07.31ID:???他のサイトのHTMLの<img src="xxx">的な使い方です。
0937nobodyさん
2011/03/23(水) 03:22:09.20ID:???http://d.hatena.ne.jp/sugyan/20090310/1236642963
一度名前とパスを入れるとブラウザをリロードしても、名前とパスが入力された状態で self.request.headers に入ったままになってしまいます。
ブラウザを再起動するとまた認証を求められる様になるのですが、(認証成功、認証失敗に関わらず)リロード毎に認証を求める様にするにはどうしたら良いでしょうか?
0938nobodyさん
2011/03/23(水) 17:30:18.57ID:MNcbKRzA桶
0939nobodyさん
2011/03/23(水) 17:31:53.80ID:MNcbKRzA# 認証の要求
self.response.set_status(401)
self.response.headers['WWW-Authenticate'] = 'Basic realm="BasicTest"'
これを毎回出すといい
0940nobodyさん
2011/03/24(木) 05:41:46.60ID:???レスありがとうございます。
認証要求を毎回出すような位置に移動してみたところ、認証が成功した時にもまた認証を促すようになってしまいました。
リロードのタイミングではなくて、認証直後に再度ログインダイアログが表示される状態です。
これは再度 get が呼ばれて認証の要求が発生しているという理解で良いのでしょうか。
この場合、認証直後の時のみダイアログを表示しないようにすることはできるのでしょうか?
それとも認証時は別のページに飛ばしてやるのが良いのでしょうか?
0943nobodyさん
2011/03/24(木) 20:01:58.20ID:???ずっと今まで
value = urllib.unquote(self.request.get('key'))
とやってたんですが、もしかしてurllib.unquote()は必要なく、
value = self.request.get('key')
だけでOKでしょうか?
0944nobodyさん
2011/03/24(木) 20:30:39.74ID:???0945nobodyさん
2011/03/24(木) 21:03:48.07ID:???0946nobodyさん
2011/03/24(木) 21:15:07.62ID:???URLなどのパラメータを自前で処理しなきゃならない、Webアプリのミドルウェアやフレームワークレベルで使われている。
0947nobodyさん
2011/03/24(木) 21:32:06.44ID:???0948nobodyさん
2011/03/26(土) 07:10:57.79ID:???グローバル変数を使って思い通りの挙動が出来ました!
今はローカルからしかアクセスしていないのですが、
複数の接続先から呼び出された時にグローバル変数が共通して使用されるものだとしたらグローバル変数による条件処理は使えないという懸念もありますが、そのへんはまた試してみたいと思います。
0949nobodyさん
2011/03/26(土) 07:45:47.24ID:???複数端末からアクセスしてみたところグローバル変数の値は共有されてました。失礼しました。
ブラウザのリロード時だけ再認証させるというのは難しいのでしょうか…
0951nobodyさん
2011/03/26(土) 14:20:49.93ID:???GAE関係無い
0952nobodyさん
2011/03/26(土) 18:45:58.77ID:???session変数
local変数
があるんだっけ?
まあスレちだけど
うまくいったら
結果とソース晒すのが礼儀だよ
0953nobodyさん
2011/03/26(土) 20:54:20.19ID:???調べているうちに一つ疑問がありました。すいませんが、どなたかご教授
していただけませんでしょうか。
ネットで見ていますと、GAEのデータベースでは、数十万件のKINDまたは、
エンティティグループ(トランザクションのグループのようなもの?)を作成
してトランザクションが衝突することを避けた方が良いと書かれていました。
一方で、GAEの割り当てでは、インデックス数が200に設定されていました。
これは、検索(filter)を行わずにただ単純にfetchしてしまえば、インデッ
クスは生成されないということでしょうか?
その場合、さらに、get_by_key_nameなどを実行したり、__key__に対する
filterではインデックスが生成されないと考えてよろしかったのでしょうか?
といいますのも、keyの値は一意で有る必要があると思うのですが、そのkey
に対してインデックスが張られないとなると、どのようにして一意判定をし
ているのかよく分かりませんでした。
それとも、KIND+key全体で一つのインデックスを張っていると理解すれば、
よろしかったでしょうか。
GAEのインデックスが張られるのはいつなのかいまいちよく分からなかった
ため、質問させていただきました。
【XXをすると、インデックスが生成される】、というのが有りましたら、
是非お教え下さい。
以上、少々長文になってしまいましたが、よろしくお願い致します。
0954nobodyさん
2011/03/26(土) 21:38:17.63ID:???0955nobodyさん
2011/03/31(木) 20:54:57.84ID:???0956nobodyさん
2011/04/01(金) 03:56:08.09ID:???だって
0957nobodyさん
2011/04/01(金) 21:37:32.56ID:???つまり管理系のAPIってことなのだろうか
file.open('hoge.txt, 'r').read()
的な動作とはかとは全く関係ないってことね
0958nobodyさん
2011/04/07(木) 16:04:39.38ID:???Version 1.4.3を使用しています。
0959nobodyさん
2011/04/07(木) 16:26:31.08ID:???スクリーンショットを貼れ
0960nobodyさん
2011/04/07(木) 16:41:44.31ID:???ttp://uproda.2ch-library.com/360936QIj/lib360936.png
詳細を押すとここに飛ばされますが、内部については記述ありませんでした。
ttp://code.google.com/intl/ja-JP/appengine/docs/python/tools/uploadinganapp.html
0961nobodyさん
2011/04/07(木) 19:19:53.80ID:???アプリのファイルと一緒にアップロードしておいて、self.response とかにURLを渡してダウンロードさせてやるようなことはできないのでしょうか?
変な質問かも知れませんがご教示よろしくお願いします。ググれワードでもいいです。
0962nobodyさん
2011/04/07(木) 19:39:09.95ID:???0964nobodyさん
2011/04/07(木) 20:48:06.55ID:???/helloworld
/helloworld/app.yaml
/helloworld/index.html
/helloworld/main.py
/helloworld/myfile.jpg
のような感じです。これだと自動で一緒にアップロードしてくれますよね?
redirectも調べてみます。
0965nobodyさん
2011/04/07(木) 21:06:01.19ID:???静的ハンドラと redirect を使っていけたようです!
他のファイルやパスでも試してみたいと思います。ありがとうございます。
0966nobodyさん
2011/04/07(木) 23:20:53.80ID:???0967nobodyさん
2011/04/08(金) 07:35:32.97ID:???確かめてみたところ secure: always にしてもちゃんとダウンロードできました。
リダイレクトで該当のZIPをダウンロードさせることができたのですが、URL直打ちでもファイルをダウンロードできてしまいました。
URL直打ちからはアクセスできなく、別のページ経由からのアクセスでしかダウンロードできないようにするにはどうしたら良いでしょうか?
この場合もデータストアを使わずredirectで実現可能でしょうか?
今、app.yamlの設定は
handlers:
- url: /static
static_dir: static
で、staticフォルダの中がダウンロードできる状態です。
0968nobodyさん
2011/04/08(金) 07:44:34.13ID:???0969nobodyさん
2011/04/08(金) 18:05:34.02ID:???0970nobodyさん
2011/04/08(金) 22:03:59.27ID:???レス数が950を超えています。1000を超えると書き込みができなくなります。