トップページphp
1001コメント298KB

Google AppEngine 3アプ目

レス数が950を超えています。1000を超えると書き込みができなくなります。
0001nobodyさん2010/02/25(木) 09:32:03ID:5mUqVSik
Google App Engine
http://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:???
>>870 これ?
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:???
もしかしてこれでようやくGAEもミッションクリティカルな用途に使えたりもするのかな?
0873nobodyさん2011/03/07(月) 17:07:19.40ID:???
今日調子にのって100万行単位のcsvをアップロードしてたら、クォータ使いきってエラーになりました。
マスターデータは一回アップロードすればそれ以上必要ないんですが、緊急メンテナンスが発生したとき
out of quota出たら泣けますね。
ダッシュボードは使えるみたいだから、管理者ページだけでも動くようにしておいて欲しいなあ・・・
0874nobodyさん2011/03/07(月) 17:14:26.86ID:???
大人しく課金しろよ
0875nobodyさん2011/03/08(火) 14:47:38.27ID:???
緊急メンテの時だけのためにそんなにCPU時間買えないっすよー
0876nobodyさん2011/03/08(火) 15:53:16.21ID:???
>>871
ありがとうございます!これのことです!。昔作ったアプリは変更できないんですね。。
それにしてもいつの間にか日本語ブログ出来てたのかぁ。
0877nobodyさん2011/03/08(火) 16:14:27.16ID:???
gqlで最新のエンティティだけを取得する場合はどうすればいいでしょうか?


datas = db.GqlQuery("SELECT * FROM Data offset -1")
と書いてみましたが、-1では指定できませんでした。
0878nobodyさん2011/03/08(火) 16:25:35.89ID:???
SQL自体が初心者でしょ
使わなくてもアプリ組めるよ
0879nobodyさん2011/03/08(火) 16:33:24.19ID:???
>>877
タイムスタンプ記録してORDER BY timestamp DESC LIMIT 1
別のテーブルでIDを管理してIDで検索
ID検索がたぶん高速
0880nobodyさん2011/03/08(火) 16:35:41.68ID:???
>>877
管理コンソールのDatastore ViewerでGQL直接実行できるからいろいろ試せ
0881nobodyさん2011/03/08(火) 16:51:11.36ID:???
bulkloaderでcsvのアップロードやり続けてここ汚してる者です。

複数エンティティからKey_name作って登録する方法だと、たぶんbulkloaderのCPU使用時間は
おまかせkeyで登録するより5倍かかる(当然登録件数によるけど10万件単位)ようです。
10万行処理するのに無料Quotaの10%使ったって参考にしたブログにあったけど
今日は10万行で50%使いました。100万単位だともっとかかるようになるでしょね。

データのメンテナンスするときは更新・削除がラクだろうけど、これは果たしてどうだったのか・・・
チラ裏でした。

さて、そろそろQuotaリセットされる時間です。作業にもどります。
0882nobodyさん2011/03/08(火) 17:20:59.00ID:???
>>879
別のテーブルでIDを管理、というのはどうすればいいんでしょうか?

0883nobodyさん2011/03/08(火) 19:27:23.10ID:???
>>881
Quotaって言ってもいろいろあるぞ。具体的にどれだ?
0884nobodyさん2011/03/08(火) 19:31:02.60ID:???
>>882
テーブルって言葉が混乱を招いたようですが
別にモデルを作ってそのエンティティに保存しておくだけです。
key_nameを決めてその名前でひとつだけエンティティを保存しておけば
key_nameから簡単にエンティティにアクセスできます。
0885nobodyさん2011/03/08(火) 19:31:53.47ID:???
>>883
CPU Timeです
0886nobodyさん2011/03/08(火) 19:49:47.01ID:???
>>884
なるほど
現在、Model Aで定義したものをフォームから受け取り、
そのフォームから受け取ったデータを
data = form.save()
data.put()
で保存しているのですが、
具体的にこれを別のモデルを作りそのエンティティに保存しておく、というのは
どうすればいいんでしょうか?

0887nobodyさん2011/03/08(火) 21:13:48.19ID:???
class B(db.Model):
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:???
'utf-8'のencodingエラーが
0890nobodyさん2011/03/08(火) 21:49:33.48ID:???
>>887
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:???
>>889
こっちではimportエラーが出てます
<type 'exceptions.ImportError'>: cannot import name template
0892nobodyさん2011/03/08(火) 22:10:44.23ID:???
>>887
  b.ID=data.key()id()

ここは、
b.ID=data.key().id()でよろしいでしょうか?
スペースをなくし、.をいれています。
0893nobodyさん2011/03/08(火) 22:11:48.96ID:???
>>890
そうです。でもコピペしただけでは動かない可能性もありますよ。
ここから先はリファレンスを読んで全体の理解を深めることをおすすめします。
0894nobodyさん2011/03/08(火) 22:12:42.99ID:???
>>892
そうですね。ごめんなさい。
0895nobodyさん2011/03/08(火) 22:18:32.88ID:???
やっと正常に動き出したけど、今日デプロイしてないアプリまで全部死んでたんでびっくりした。
0896nobodyさん2011/03/08(火) 22:24:25.86ID:???
>>894
いえ、本当に助かりました。ありがとうございます。
一度動くとリファレンス読んでも急に理解しやすくなったような気がします。
しっかり読んで、またオライリーの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 が発生しています。
現在復旧作業中です。アップデートがあればこのスレッドでお知らせします。

松尾さんご苦労様です。早く直してね。
0899nobodyさん2011/03/09(水) 07:40:31.93ID:???
>>898
このソース元どこ?なんかのML?
0900nobodyさん2011/03/09(水) 07:49:38.80ID:???
>>899
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:???
datastoreである要素の行がnoneのものだけ集めることってできましたっけ?
0903nobodyさん2011/03/09(水) 14:38:10.63ID:???
JavaとPython未経験でGAEを使いたいのですがどちらの方が習得早いでしょうか?
Javaの方ができることは多そうですがPythonの方が新しい言語なのでまとまっていて取っ付きやすいのではないかと踏んでいます。
目標は認証付きでテキスト、画像、バイナリのアップロード、ダウンロード。
特定の呼び出し(?)に対して任意のXMLを返すといったところまでです。
アドバイスよろしくお願いします。
書籍は「新人プログラマのための」を買おうと思っていますが他にもおすすめがあればお願いします。
0904nobodyさん2011/03/09(水) 15:05:18.92ID:???
教えてあげるから、なんかちょーだい
0905nobodyさん2011/03/09(水) 18:30:54.01ID:???
python
0906nobodyさん2011/03/09(水) 20:26:35.45ID:???
どっちの言語も未経験でよくGAE使う気になったもんだ
0907nobodyさん2011/03/09(水) 23:25:55.44ID:7V71uazC
Google-Sky-Map
http://www.youtube.com/watch?v=3xnKX8xksNg
0908nobodyさん2011/03/10(木) 04:06:53.38ID:79yNqmJl
>>898
えっ!やっぱり ずっと悩んでたのに。。。
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:/uspR3SG
jruby on rails 2.3.10 で
NoMethodError (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:???
Javaスレはこっち
http://hibari.2ch.net/test/read.cgi/php/1267094290/
0916nobodyさん2011/03/10(木) 23:41:14.23ID:???
1つのリクエストにlogging.debug()で10個ぐらいログ出力してるんですが
何気にlogging.debug()使っていい適正回数とかあるんでしょうか?
10回以上使うと重くなるよ的なことってあるんでしょうか?
0917nobodyさん2011/03/11(金) 08:22:28.47ID:???
管理画面のLogsに出てくる
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:???
Error: Server Error

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.

このエラーから進めなくなってるんですが
対処法ありませんか?
0921nobodyさん2011/03/12(土) 09:03:36.80ID:???
>>920
ログを見る
09229172011/03/13(日) 21:27:28.09ID:???
>>918-919
なるほど。ありがとうございます。
これめっちゃ便利な機能ですね。
0923nobodyさん2011/03/15(火) 13:04:24.11ID:???
すみません peydevのコンソール出力にprintするにはどうしたらいいですか?
0924nobodyさん2011/03/15(火) 13:58:42.47ID:???
>>923
import logging
logging.debug(str)
0925nobodyさん2011/03/15(火) 14:34:38.36ID:???
>>924
なるほど!ありがとう!
0926nobodyさん2011/03/15(火) 17:46:39.95ID:???
>>921
ログとはどのログですか?
0927nobodyさん2011/03/15(火) 18:21:38.24ID:???
>>921
ログは自己解決しました。
しかし問題は>>887で指摘されたところにありました。
ローカルでは動くのですが、アップするとエラーになってしまいます。代替案を考えなければならないんでしょうか
0928nobodyさん2011/03/15(火) 20:19:30.05ID:???
馬鹿には無理
0929nobodyさん2011/03/15(火) 20:22:15.55ID:???
>>927
エラーってのは具体的になんだ?
技術者なら質問の仕方ぐらい覚えなさい
0930nobodyさん2011/03/16(水) 02:02:36.09ID:???
「ダッシュボードのログの時間が1時間ズレてる」と思ったらサマータイムだった
0931nobodyさん2011/03/17(木) 18:49:25.34ID:???
>>929

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)
おそらくここでエラーが出ているようです
0932nobodyさん2011/03/17(木) 19:12:09.77ID:???
>>931
b.IDがNoneなんじゃね?
0933nobodyさん2011/03/19(土) 15:41:03.41ID:???
class MYdata(db.Model):
  dataA = db.StringProperty()
dataB = db.StringProperty()

というモデルがあって
key_name = dataA + dataB
とルールを内包させたい場合
put()
をオーバーライドしようとして詰まってます。
get_or_inserを外から呼び出せばいいことですが
中で処理するのは無理でしょうか?
よい方法はありませんか?
0934nobodyさん2011/03/19(土) 16:24:56.79ID:???
自前のget_or_insertを用意するとか。こんな感じで(テストしてない)
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)
0935nobodyさん2011/03/19(土) 17:27:02.18ID:???
>>934
あー!

やってみます!ありがとうございました。
0936nobodyさん2011/03/22(火) 22:43:07.31ID:???
質問なんですがGAEでアプリ作らずに画像置き場として使ってもOKなんでしょうか?
他のサイトの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
>>936
0939nobodyさん2011/03/23(水) 17:31:53.80ID:MNcbKRzA
>>937
        # 認証の要求
        self.response.set_status(401)
        self.response.headers['WWW-Authenticate'] = 'Basic realm="BasicTest"'

これを毎回出すといい
0940nobodyさん2011/03/24(木) 05:41:46.60ID:???
>>939
レスありがとうございます。
認証要求を毎回出すような位置に移動してみたところ、認証が成功した時にもまた認証を促すようになってしまいました。
リロードのタイミングではなくて、認証直後に再度ログインダイアログが表示される状態です。
これは再度 get が呼ばれて認証の要求が発生しているという理解で良いのでしょうか。
この場合、認証直後の時のみダイアログを表示しないようにすることはできるのでしょうか?
それとも認証時は別のページに飛ばしてやるのが良いのでしょうか?
09419362011/03/24(木) 12:04:56.84ID:???
>>938
遅くなりましたがありがとうございます。
0942nobodyさん2011/03/24(木) 15:20:36.40ID:???
>>940
一回出したら次は出ないようにすれば良いのでは?
0943nobodyさん2011/03/24(木) 20:01:58.20ID:???
UTF8でURLエンコードされた文字を受け取るときに
ずっと今まで

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:???
試したら問題なかったなんですが、そうなるとurllib.unquote()はどういうときに使うのかなって
0946nobodyさん2011/03/24(木) 21:15:07.62ID:???
値がスクリプトに渡される前にunquote処理がされているはず。
URLなどのパラメータを自前で処理しなきゃならない、Webアプリのミドルウェアやフレームワークレベルで使われている。
0947nobodyさん2011/03/24(木) 21:32:06.44ID:???
なるほど〜。フレームワーク側でやってくれてるんですね。ありがとうございます。
0948nobodyさん2011/03/26(土) 07:10:57.79ID:???
>>942
グローバル変数を使って思い通りの挙動が出来ました!
今はローカルからしかアクセスしていないのですが、
複数の接続先から呼び出された時にグローバル変数が共通して使用されるものだとしたらグローバル変数による条件処理は使えないという懸念もありますが、そのへんはまた試してみたいと思います。
0949nobodyさん2011/03/26(土) 07:45:47.24ID:???
>>948
複数端末からアクセスしてみたところグローバル変数の値は共有されてました。失礼しました。
ブラウザのリロード時だけ再認証させるというのは難しいのでしょうか…
0950nobodyさん2011/03/26(土) 07:46:44.29ID:???
安価ミスすみません。>>942でした
0951nobodyさん2011/03/26(土) 14:20:49.93ID:???
そろそろWeb初心者スレ行けよ
GAE関係無い
0952nobodyさん2011/03/26(土) 18:45:58.77ID:???
global変数
session変数
local変数
があるんだっけ?
まあスレちだけど
うまくいったら
結果とソース晒すのが礼儀だよ
0953nobodyさん2011/03/26(土) 20:54:20.19ID:???
GAE初心者です。PYTHONも初心者ですが、GAE&PYTHONに興味がありまして、
調べているうちに一つ疑問がありました。すいませんが、どなたかご教授
していただけませんでしょうか。

ネットで見ていますと、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:???
ローカルでテストしてみて index.yaml の内容見ればわかる
0955nobodyさん2011/03/31(木) 20:54:57.84ID:???
1.4.3で追加されたFiles APIとは何ぞや?
0956nobodyさん2011/04/01(金) 03:56:08.09ID:???
Files API: The new Files API in Python and Java allow you to pragmatically read and write data using Blobstore. This API can be used to generate reports, export data, or do anything that your heart desires that requires large, binary objects.
だって
0957nobodyさん2011/04/01(金) 21:37:32.56ID:???
>>956
つまり管理系のAPIってことなのだろうか

file.open('hoge.txt, 'r').read()
的な動作とはかとは全く関係ないってことね
0958nobodyさん2011/04/07(木) 16:04:39.38ID:???
GoogleAppEngineLauncherでPythonファイルをアップロードする際の内部っていうオプションは何でしょうか?
Version 1.4.3を使用しています。
0959nobodyさん2011/04/07(木) 16:26:31.08ID:???
Windows版には見あたらないけど
スクリーンショットを貼れ
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:???
画像やZIPデータをダウンロードさせるのって、一度Blobとしてアップロードして格納した後にgetに対してそれを返してやるって方法でいいのでしょうか?
アプリのファイルと一緒にアップロードしておいて、self.response とかにURLを渡してダウンロードさせてやるようなことはできないのでしょうか?
変な質問かも知れませんがご教示よろしくお願いします。ググれワードでもいいです。
0962nobodyさん2011/04/07(木) 19:39:09.95ID:???
redirect
0963nobodyさん2011/04/07(木) 19:59:30.30ID:???
>>961
そのファイルはどこに置いてあるんだい?
0964nobodyさん2011/04/07(木) 20:48:06.55ID:???
>>963
/helloworld
/helloworld/app.yaml
/helloworld/index.html
/helloworld/main.py
/helloworld/myfile.jpg
のような感じです。これだと自動で一緒にアップロードしてくれますよね?
redirectも調べてみます。
0965nobodyさん2011/04/07(木) 21:06:01.19ID:???
>>962
静的ハンドラと redirect を使っていけたようです!
他のファイルやパスでも試してみたいと思います。ありがとうございます。
0966nobodyさん2011/04/07(木) 23:20:53.80ID:???
sslにするとダメになったりするバグ治ってるのかな
0967nobodyさん2011/04/08(金) 07:35:32.97ID:???
>>966
確かめてみたところ 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:???
blobstore
レス数が950を超えています。1000を超えると書き込みができなくなります。