アクセスレポート投稿プログラムをGAE上に移植

福岡の実家で今も稼働している開発サーバの破棄計画の一環として今回は毎月アクセスレポートを投稿してくれているプログラムをクラウド環境へ移すことにしました。 現在、利用しているServersManのリソースがあまり多くないので、GAE上で動くように移植しました。以前はJavaでしたが新生アクセスレポートプログラムはPythonです。 基本的にGoogle Analyticsのデータを取得して増減値の計算をしているだけなので大したコード量でもありません。ただ、GAE上で動かした時に若干不安定でたまにエラーになり、以前のJavaで書いたコードだとローカルで動かしている分にはそんなことは滅多になかったので若干不安ではありますが、毎月2日12時の定期実行以外にも手動で実行することも可能なので、最悪そっちで行おうかと思います。 また、今年は途中でGoogle Analyticsのアカウントを変更したので、毎年1月に行っている年次のアクセスレポートは中止します。

2010-12-22 02:38:24 · Tatsuya Fukata · No Comments
Tags: ,  · Posted in: HPニュース, PG, Python, ウェブサービス

[GAE/P]独自のValidationManagerを作ってみました

GAEでアプリを作成していて、入力値への検証機構が貧弱だと思ったので、作りました。今回作成したのは、検証情報をyamlに記述し、その検証情報に沿ってモデルのプロパティを走査していくという物です。 検証情報yamlの記述方法、使い方ともにSymfonyのValidationManagerに酷似していると思います。なので、Symfonyを使ったことがある人であれば、なんとなくわかりやすいかもしれません。と言っても、SymfonyのValidationManagerほどまだ細部までエラーチェックなどをしていないので、検証情報yamlの記述によっては、予期しないエラーが発生すると思います。ですので、この辺は、もう少しリファクタリングをしないといけないかと思います。 Pythonによるリフレクション部分だったりdb.Modelの扱い方がもし間違っていたら是非教えてください。 今回、関係するソースは下記に載せておきます。 ■検証情報yaml 1 2 3 validate: name: – validator: RequiredValidator ■ValidationManager 1 2 3 4 5 6 7 8 9 10 11 12 13 14 15 16 17 18 19 20 21 22 23 24 25 26 27 28 29 30 31 32 33 34 35 36 37 38 39 40 41 […]

2009-11-25 11:56:35 · Tatsuya Fukata · 2 Comments
Tags: , ,  · Posted in: PG, Python

[GAE/P]db.ModelのValidtionを任意のタイミングで行えるように変更

GAE の Model の バリデーションの動作を変えてみた – 幸せプールさんの記事を元に任意のタイミングでvalidationが行えるようにしました。まだ、コードが参照元のソースをコピっただけなので、、自分流にカスタマイズをしましたら、ソースを載せたいと思います。 それにしても、まだ、Pythonのコードをちゃんと理解していないんだなと感じさせられました。あぁ、早く好きなようにカスタマイズできるようになりたいw

2009-11-12 11:06:06 · Tatsuya Fukata · No Comments
Tags: , , ,  · Posted in: PG, Python

[GAE/P]国際化に対応してみました 〜その3〜

前回に引き続き国際化についてです。 前の記事で書いていた「Environment variable DJANGO_SETTINGS_MODULE is undefined.」のエラーについてですが、あの記事を書いた後も何度か発生しており、今日、GAE上にアップしたアプリを動かしていると、一時ページを表示した状態で放置し、改めて操作するとAjax部分の通信で上記のエラーが出ていました。 それで、色々調べているとimportの順番が問題だったようで、試してみるとエラーが出なくなりました。その修正内容を書いておきたいと思います。 ■編集前 1 2 3 4 5 6 7 8 9 from django.utils import translation from google.appengine.ext import webapp from org.fukata.mapshare.system.utils.cookies import Cookies import os from django.conf import settings   os.environ.__setitem__(’DJANGO_SETTINGS_MODULE’, ‘conf.settings’) # Force Django to reload settings settings._target = None ■編集後 1 2 3 4 5 6 7 […]

2009-11-05 00:34:51 · Tatsuya Fukata · No Comments
Tags: , ,  · Posted in: PG, Python

[GAE/P]国際化に対応してみました 〜その2〜

前の記事でGAE/Pの標準環境にて国際化に対応した際の記事を書いたのですが、実際にGAE上にデプロイして動かしてみると何点かエラーが出たので、追加したいと思います。 ■UnicodeDecodeErrorの発生 実際にアップロードして、.poファイルで日本語が定義しているmsgidが存在するページを開いた際に同様のエラーが発生しました。これは、.poファイルの文字コードが設定されていなかった為に起こったようです。下記が、現在の.poファイルになります。 msgid "" msgstr "" "Content-Type: text/plain; charset=UTF-8\n" "Content-Transfer-Encoding: 8bit\n" "Last-Translator: Tatsuya Fukata <tatsuya .fukata@gmail.com>\n" "Report-Msgid-Bugs-To: Tatsuya Fukata </tatsuya><tatsuya .fukata@gmail.com>\n" "Language-Team: Japanese\n" "Project-Id-Version: MapShare\n"   msgid "Spot" msgstr "スポット"   msgid "Spot List" msgstr "スポット一覧"   msgid "other" msgstr "その他" </tatsuya> ■DJANGO_SETTINGS_MODULEの未設定 次に、何度かデプロイしている間に上記のようなエラーが発生するようになりました。実際に使われているのは前の記事で作成したクラス「I18NRequestHandler」のファイル内で同様の記述が存在します。直接キーを指定している部分を下記のように修正して、エラーが出なくなりました。 #os.environ[‘DJANGO_SETTINGS_MODULE’] = ‘conf.settings’ os.environ.__setitem__(’DJANGO_SETTINGS_MODULE’, ‘conf.settings’) まだ、完全に国際化に対応されていないかもしれませんが、何かエラーが発生したら随時載せていきたいと思います。

2009-11-02 01:24:06 · Tatsuya Fukata · No Comments
Tags: , ,  · Posted in: PG, Python

[GAE/P]国際化に対応してみました 〜その1〜

現在、GAE/P環境にて作成しているアプリの国際化を対応してみました。Django-1.0やKayといったFWを使って国際化も対応できるようですが、今更変更するのもだるかったので、標準の環境で対応しました。 多分、次に作成するなら、標準の環境ではなく、他のFWを試すかもしれません。 とまぁ、自分のことは置いといて早速、国際化の手順を書いていきたいと思います。まずは、最終的な構成を書きます。 . `– src |– app.yaml |– conf | |– locale | | |– en | | | `– LC_MESSAGES | | | |– django.mo | | | `– django.po | | `– ja | | `– LC_MESSAGES | | |– django.mo | | `– django.po | `– settings.py `– org `– fukata […]

2009-11-01 22:44:20 · Tatsuya Fukata · No Comments
Tags: , ,  · Posted in: PG, Python

[GAE/P]必須カラムの登録について

最近、GAE for Pythonでアプリを作っているのですが、必須カラムの値がうまく登録できなかった問題が解決したので、メモとして残しておきたいと思います。 ■A.py 1 2 class A(db.Model): owner = db.UserProperty(required=True,auto_current_user_add=True) ■B.py 1 2 class B(db.Model): a = db.ReferenceProperty(required=True,reference_class=A) ■main.py 1 2 3 4 5 6 7 a_key = [エンティティAのKeyを取得] a = A.get(a_key) # コンストラクタで指定しないと登録時にエラーになります。 b = B(a=a) # 以下のようにフィールドを指定して代入してもエラーとなる。 b.a = a b.put() ずっと、後者のようにフィールドを指定して代入していたので、「なんで代入してるのにエラーになるんだ?」という風に思っていて、コンストラクタに指定するというのに気づくのがかなり遅くなってしまいました。 とりあえず、なんとか登録することもでき、前に進むことができるようになりました。今作っているアプリはjsごりごりのアプリなので、デバッグがいつもに比べ手間がかかります^^;しかも、Python自体もまだ勉強し始めてそんなに時間が経っていないのでどういう関数があるのかすら分からない状態で、常にググりながらのコーディングとなっています。

2009-10-29 04:36:11 · Tatsuya Fukata · No Comments
Tags: , ,  · Posted in: PG, Python