カテゴリー別アーカイブ: プログラム

pythonで、データベースを使い、データに更新があるか調べる時に出たエラー

また、ほんのちょっとしたミスで長時間を無駄にしたのでメモ。

GAE上でpythonを使ってデータをデータベースに入れ、新しいデータを入れる時に、データに変化があったら自動でメールで知らせる、というプログラムを作っていた。

最初は問題なく動いていたんだけど、途中で急におかしくなり、データに更新がないのにデータ更新がある、というメールが来るようになってしまった。

最初は、ランチャーのバージョンの更新か何かが影響してるかと思ったが、色々試した結果、文字コードのせいだとわかった。

データの更新を調べるときに、新しく入れるデータと、すでに入れているデータを比較するんだけど、お互いに文字コードが違ったので、同じ内容でも更新ありと判断してしまっていた。前に、プログラムをちょっといじった時に、文字コードに関する部分もいじっていたのが原因。

単純なミスだけど、文字コードの違いでエラーが出るという発想自体頭に無かったのでハマった。

google app engineでローカルのファイルを削除してしまい、ソース(ファイル)をダウンロードする。

パソコンのハードディスクをSSD化したときに、GAE(google app engine)のソース(pythonで書いたプログラム)をコピーするのを忘れてしまった。交換前のハードディスクは保管しているんだけど、また接続してファイルを探すのは面倒なので、アップロードしたものをダウンロードできないのか?と思い調べてみた。(以前にもかんたんにダッシュボードからボタン一つでダウンロードできたら便利なのにと思ったことがある)

結局、GAEのヘルプに以下があって
https://groups.google.com/forum/?hl=ja&fromgroups#!topic/google-app-engine-japan/1d3ZJGWFjgY

以下で指定のローカルフォルダにダウンロードできた。

appcfg.py download_app -A <your_app_id> -V <your_app_version> <output-dir>

「<your_app_id>」は、google app engine launcherの「name」に当たる部分。
「-V <your_app_version> 」、はデフォルトのバージョン(アプリのバージョンのことだと思う)をダウンロードするなら指定しなくていいらしい。
「<output-dir>」は、ダウンロードしたい自分のパソコン上のローカルフォルダの場所、例えば「/Users/abc/def」とか指定する。

上記のコマンドは、ウインドウズの、アクセサリのコマンドプロンプトを開いて、入れて、エンターを押すと
一つウインドウが開いて、グーグルのアカウントの許可がどうのという表示がでるのでOKしたら、「~complete」のような表示が出て、指定のフォルダを見ると、ずらっとファイルがダウンロードされていた。ヘルプの方には一部のファイルはダウンロードされない、と記載されていたけども、ざっと見た感じは全部ダウンロードできているもよう。

Google app engineでの課金の抑え方

Googleappengineのpythonで一番無料枠を超えやすいリソースは、ndbのデータストア読み取り操作。読み取りは5万回まで無料で、それを超えると10万回当たり0.06ドルかかる。ただしキーの取り出しだけの操作は無料。

無料枠の5万回は、思ったより少ない。大きなデータを扱うとすぐに無料枠を使いきってしまう。そこで、いろいろ工夫してデータの読み取り回数を減らすようにした。

一番効果があったのは、ソートなどをすることがないデータを、一個づつデータベースに入れずに、すべてをまとめてリスト化や辞書にして1つの場所に入れ直した方法。1個ずつデータを入れておいて10万件取り出すと、それだけで無料枠をオーバーするけれど、まとめて入れておけば読み取り回数は1回ですむ。

ndbへ入れるときは、pickleを使いリストなどをシリアライズして入れ、取り出すときは逆に戻してあげてデータを利用する。

以前は無料枠を超えていたものが、これで無料枠内で余裕で収まるようになった。

Google app engineのCRONで月に1回だけ動かす

Google app engineのpythonで、月に1回だけ動かす方法。
何分ごと、毎日何時、毎週何曜と何曜の何時、毎日何時から何時の間に何分ごと
これらはわかったけども、月に1回だけがわからなかった。

結局、月に1回は以下でOK

15 of month 05:00

これだと、毎月15日の5時に動かすとなる。管理画面でチェックすると、CRONの起動予定の日時が表示されるので、ここで正しいか確認できる。

GAE(appengine)のパフォーマンス設定でスライドバーが2つずつ出てきた

グーグルのGAE(appengine)のアプリケーション設定画面でパフォーマンスを設定するスライドバーが2つあるんだけど、そこにある調整用のスライドが各バー1個から2個に増えていた。意味がわからないのでしょうがなく英語のマニュアルを見てみると、これは課金設定をONにした場合のみ出現するらしい。そういえば、この前課金設定をONにした気がする・・。

で調べたところ。

Idle Instancesのバー設定は、
上のバーが最小インスタンス数、下のバーが最大インスタンス数を設定する。1つのインスタンスで1つの仕事をするので、同時に何十個立ち上げると並列でいろんなことができるけど、料金は高くなるという仕組みらしい。最小インスタンス数を調整すると常にインスタンスが動いていることになるので、この設定は課金してないと出来ないという理由がわかった。できるだけコストを下げるには、上のバーはAutomatic、下のバーは1に設定する。これだと最大でもインスタンスは1しか動かず必要ないときには0になる。最小を1に設定してしまうと常に1個立ち上がった状態になる。

Pending Latencyのバー設定は、上の下の違いがよくわからず
とりあえず、Pending Latencyというのは、インスタンスに空きがない時に、どのくらいの時間待つと、新しいインスタンスを立ち上げるか?の設定で下のバーはその待ち時間の最大を設定。なので、最大の15sにすると一番コストは低くなるはず。15sとAutomaticがすぐ近くにあるからなにか変な感じがするがたぶんこの理解であっているはず・・・。上のバーも時間を長くするほどコストは下がるようなので、

結局設定は

Pending Latency: ( 15.0s – 15.0s )

とした。まだイマイチ使い方がわかっていないので、無料期間(最初300ドル分の無料クーポンを貰えた)の間にいろいろ試しておこう。