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
0859nobodyさん
2011/02/28(月) 14:24:19.45ID:???複数のフォームに入力されたデータをある一定のアルゴリズムで変換し
(たとえば、1と入力したら50,4と入力したら200など)
それを表示したいのですが、この場合どうすればいいんでしょうか?
現在は、AddHandlerで
def post(self):
form = AddForm(data=self.request.POST)
if form.is_valid():
data = form.save()
data.put()
self.redirect("/")
else:
self.layout["content"] = self.view_dir + "add.html"
params = {"layout":self.layout,"form":form}
fpath = os.path.join(os.path.dirname(__file__),"layouts",self.layout_file)
html = template.render(fpath,paramas)
self.response.out.write(html)
このように、入力された値は保存してそのままindexで表示されるようになっています。
0860nobodyさん
2011/03/01(火) 22:30:04.73ID:???http://d.hatena.ne.jp/sugyan/20090705/1246803690
ではgenerate_keyを設定してますが bulkloader.yaml
で設定する方法がわかりません。
localで実行のみ。
Modelクラスだけで定義はしているけど、まだdatastore上に実体のデータがない。
とりあえずbulkloaderを走らせてみましたが、データは記録できるものの不定期にスレッドエラーがでて全行送れない。→インデックス設定が必要?
この問題はさておき、何度もテストしていると重複したデータが増える。
key_nameをフィールドを連結した文字列で設定してアップロードしたい。
テストはこのサイトを忠実に再現している・・・つもり。
http://endoyuta.blogspot.com/2011/02/gaebulk-loadercsv.html
というわけです。よろしくお願いします。
0861nobodyさん
2011/03/02(水) 01:01:09.41ID:???--num_threads=
でスレッド数を制限したらいけました。
あとはkey nameで保存させることです。よろしくお願いします。
0862nobodyさん
2011/03/02(水) 04:09:43.92ID:???---------------
property_map:
- property: __key__
external_name: key
export_transform: transform.key_id_or_name_as_string
ならcsvのcolumn_name=keyのフィールドがkey_nameになる
0864nobodyさん
2011/03/04(金) 12:03:30.61ID:???ありがとうございました。
調べた結果キーを複数の要素から生成するにはこうすればできるようです。
- property: __key__
import_template: "%(first_name)s %(last_name)s"
http://efreedom.com/Question/1-3920171/Set-Key-New-Bulkloader
first_nameとlast_nameの定義の前でも使えるのか疑問ですがちょっとやってみます。
0866nobodyさん
2011/03/05(土) 17:06:25.19ID:???やっぱりエラーが出ます。
Error parsing yaml file:
Invalid object:
Neither external_name nor import_template nor export specifiled for propaty __key__
こんな風に名前の定義も入れてみたんですが、ダメです。
- kind: Station
connector: csv
connector_options:
encoding: euc-jp
skip_import_header_row : True
column_list: [rr_cd, line_cd, station_cd,
line_sort, station_sort, station_g_cd, r_type,
rr_name, line_name, station_name,pref_cd,
lon, lat,f_flag]
property_map:
- property: __key__
- import_template: "%(line_name)s%(station_name)s"
ここを参考にしてます。
http://endoyuta.blogspot.com/2011/02/gaebulk-loadercsv.html
csvを改造してKEYを先に作ったほうがラクかなあ。
お知恵をおかし下さい。
0867nobodyさん
2011/03/05(土) 18:39:45.84ID:???こんどは郵便番号データを郵便番号をキーに登録しようとしてやはり同じエラーが出ました。
- kind: ziplist
connector: csv
connector_options:
encoding: utf-8
column_list: [cityno, oldzip, zipcode, pref, citykana, city, townkana,
town, two_code, banchi, chome, two_town]
property_map:
- property: __key__
external_name: zipcode
export_transform: transform.key_id_or_name_as_string
http://www.post.japanpost.jp/zipcode/download.html
0868nobodyさん
2011/03/06(日) 10:33:02.95ID:???columns: from_headerを明記する
- import_template: "%(line_name)s%(station_name)s"
マイナス記号がいつの間にかくっついてた
コピペでいろいろ試しているうちに余計に現象が複雑化してました。
無事、二つのカラムからKeyを生成できました。
>>867
これからやってみます。
まずはご報告まで。
0869nobodyさん
2011/03/06(日) 14:56:49.77ID:???export_transform: transform.key_id_or_name_as_string
これ削除したらkey_nameでのインポートはできるようになりました。
エクスポートの時に困りますね。
0870nobodyさん
2011/03/07(月) 08:14:19.48ID:???それについてどこかに詳しく説明してるページないでしょうか?
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を使用しています。
レス数が950を超えています。1000を超えると書き込みができなくなります。