「プログラム」カテゴリーアーカイブ

Google Cloud Storageのデータを一定期間後に自動で削除するよう設定(管理画面で)

GOOGLE APP ENGINEでGoogle Cloud Storage使っていると、だんだんデータが溜まってくる。
GOOGLE APP ENGINE側で、cronで定期的にデータを消すプログラムを動かすようにしてたけど、そんな面倒なことをせずに管理画面で簡単に削除の設定ができるようになっていた。

Google Cloud Storageの管理画面に行くと、ライフサイクルというのがあるから
そこから条件とアクション、例えば180日後に削除、とルールを追加すると、180日を過ぎたデータは自動で削除される。

GAEのランチャーでデプロイしようとするとエラーが出る

GAE(google app engine)でアプリをいじってデプロイしようとすると突然以下のエラーが出てデプロイできなくなった。

raise SSLHandshakeError(e)
httplib2.SSLHandshakeError: [Errno 1] _ssl.c:504: error:14090086:SSL routines:SSL3_GET_SERVER_CERTIFICATE:certificate verify failed

実際には長いログの下に上にようなエラーメッセージが出る。
ランチャーの方をアップデートしても駄目で、海外のサイトで探すとpythonをアップデートすると解決したという情報を見て試したら一発で解決。

今回のエラーとは関係ないけど、GAEはちょこちょこ変更があってて、ランチャー自体のダウンロード場所もわかりにくくなってて、コマンドだけで操作する物がメインになってるようだし、たまに見てないとついていけなくなる。

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を使いリストなどをシリアライズして入れ、取り出すときは逆に戻してあげてデータを利用する。

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