GAE pythonでのランダムな「AttributeError: ‘~’ object has no attribute ‘~’」の原因

GoogleAppEngine(GAE)のpythonでハマったのでメモ。
具体的には以下のエラーが出た。

AttributeError: ‘~’ object has no attribute ‘=’

~のところには、自分で設定した名前が入る。
このエラーが出るだけなら、単純なんだけど、名前の間違いとか、データが入っていないとかは無くて、それでもなぜかエラーが出たり出なかったりする。この出たり出なかったりという反応の仕方をするので解決に時間がかかった。完璧に100%エラーが出るなら原因は特定しやすいんだけど。

具体的には以下の様な使い方をしていた。

class datax(ndb.Model):
cat = ndb.IntegerProperty()

まず上の用に設定して、以下のようにデータを取り出す。

q = datax.query()
qry2 = q.filter(~)
qry3 = qry2.order(-~)
qry4 = qry3.fetch(1)
datay = qry4[0].cat

~の部分は省略。
この時に、上記のAttributeErrorが出たり出なかったりした。いろいろ試して最後やっと解決したけど、原因は

class datax(ndb.Model):
cat = ndb.IntegerProperty()

の部分だった。class datax(ndb.Model)というのは実際には、

class datax(ndb.Model):
cat = ndb.IntegerProperty()
dog = ndb.IntegerProperty()
bird = ndb.IntegerProperty()
frog = ndb.IntegerProperty()

なんだけど、このファイル内で使うのは、

cat = ndb.IntegerProperty()

だけだったから、

class datax(ndb.Model):
cat = ndb.IntegerProperty()

ファイル内をスッキリさせるために、上記のように使うものだけ入れて書いていた。最初試しに省略したら、普通に問題なく動いたので、これでいいんだと思い込んでいた。で、上記の部分を全ファイル省略せずに書くようにしたら、エラーが完璧に0になった。どういう仕組でエラーが出たり出なかったりしていたのかはわからないけどもとりあえず解決して良かった。

Google App EngineのデータベースNDBのProperty Optionsについて。

Google App Engineのpythonでデータを出し入れするときには、NDBというデータベースをMYSQLの代わりに使う。
NDBのProperty(データ)にはオプション設定がいろいろ用意してあるんだけど、今までオプション設定の必要性を感じたことがなかった。
ところが、NDBからデータを利用するときに、エラーが出ることがあって、エラーを避けるために、データを取り出すときではなくて、入れる段階で処理すると楽だなと思い、そういえばオプション設定があったな、と思い出し、グーグルのマニュアルを見てみると便利そうなものがたくさん用意されていた。

ndb.IntegerProperty(required=True)

みたいに、requiredを設定すると、値が必ず入っていないとダメなので、取り出す時にデータが入ってなくてエラーが出るということを避けられる。ということがやっとわかった。

ふるさと納税で北海道のズワイガニを貰ってみた。

ふるさと納税を利用してみたので、申し込みから、商品が到着するまでにかかった日数等を記録として残しておきます。

利用したのは、北海道紋別町のズワイガニ。
まず紋別町の公式サイトに行く。
申し込みは、郵送、FAX、メールが使えるようだけど、公式サイト上の申し込み専用ページ(手続きのながれ・申し込み方法内の寄附申込入力フォーム)からもう申し込める。これが一番早そうなので、このWEBフォームから申し込んだ。

必要事項を記入するんですが、ここで記入した内容がPDFファイルや書類に印刷されて送られてくるのでちゃんと記入する必要がある。寄付する金額や、名前(ふるさと納税を利用する人の名前)、ほしい記念品もここで選ぶ。1万円以上の寄付で「紋別の海産物」として「ズワイカニ」または「毛ガニ」があるけど、申し込み段階でどちらかをちゃんと選ぶことができる。私はズワイガニを選択。カニは人気らしく境港の松葉ガニやら、他のズワイガニ、毛ガニも品切れや数ヶ月待ち多いなか、この紋別は品切れ等書かれていないので、ここを選んだ。支払いは、クレジットカード決済もできるけど、今回は銀行振込を選択。

記入が終わって、確認して申し込んでも、通販サイトのようにすぐに受信確認メールとかは来ないので、少し不安だったが、意外に早くて、次の日の夜には、振込先の口座番号や、こちらの住所名前等が入力されたPDFファイルが貼付されたメールが送られてきた。

さっそく翌日に指定の口座へ1万円を振込。すぐに入金確認の連絡とかはないのでこれも少し不安になった。公式サイトに非常に申し込みが多いため返信や商品の発送に時間がかかると書いてあったのでのんびり待つことにした。

振込後8日目に、郵送にて封書で、採納証明書という、寄付金の受け取りを証明する書類が届いた。予想より手続きが早い。これを確定申告の時に使うと手数料2000円を除いた分が控除され戻ってくることになる。

寄付の証明書が届いてから、9日目(最初の申し込みからは18日目)には、商品のズワイガニが自宅まで送られてきた。これも予想よりずっと早かった。商品の指定日配達はできないけど、商品は土曜日か日曜日のどちらかに届くように発送するとのこと。商品はクール宅急便で冷凍で送られてきて、北海道紋別のズワイガニが2匹入っていました。楽天で紋別のズワイガニの価格をチェックするとちょうど同じような大きさの2匹セットで7000円ちょっとで売られているので、十分元は取れる感じです。

ちなみに、ふるさと納税の仕組みとかどんな商品があるか等は、ネットでバラバラの情報を見るよりふるさと納税関連本がたくさん本屋に並んでいるのでそちらの方がわかりやすかったです。

今回ふるさと納税を始めて利用しましたが、手続きはネットからできて簡単で手間がかからないし’一度やれば次は10分でできる)、商品もお得だし、これからは毎年利用することになりそうです♪

水泳メモ20 水に浮くことと、前にスイスイ進む方法のメモ

最初の頃は、まともに水に浮くこともできず、前に進もうと、足を必死にバタバタさせても異様に前に進まなかった。

その後、まずビート板を使い練習して徐々にビート板なしで泳ぐようにした。

今考えてみると、水に浮くには、痩せてる人の場合は、足でちょこちょこバランスを取らないと沈む。力を抜けば浮く人もいるけど、ほんとに痩せてる人は、特に息を吐いてる時、じっとしてると水中に沈んで浮かない。なので両足を使って微妙にちょいちょいと動かしてバランスを取りつつ浮かないと無理。慣れてくると、この両足や体のいろんな部分を使って微妙にバランスをとり、水をカイで浮くための行動をしている、ということを無意識にしているから、自然に体が浮くと感じるようになる。例えると、水に浮くのは、自転車に無意識にバランスを取って乗れるのと同じだと感じる。

次に、浮かぶことと前に進むことはほとんど同じで、バランスを取るために体全体を微妙に動かす行動をだんだん大きくしていって、前に進める感じ。効率よく進むには、手と足のリズムが大切のようで、リズムが合った時はぐいっと前へと進むのが自分でもわかる。水泳の本なんかを読むと、タンタッタッ、タンタッタッと足をリズミカルに動かすみたいに書いてある。この最初のタンの時に少し強めに水を蹴ると同時に、対角線上の手をちょうど水の中に入れて前へぐいっと手を伸ばす。するとスーと前へ進みやすい。

あと、バタ足は足をあまり広げず、小刻みにするほうが抵抗が少ないせいか、前へすすみやすいのを感じる。

以上、後で忘れないためのメモ。

GCS(Google Cloud Storage)からPythonでデータを取り出し表示する

前の記事「Google Cloud StorageにPythonでデータのやり取りをする」」でウェブ上ではなくて、プログラム(python)経由でデータをGCS(Google Cloud Storageグーグルクラウドストレージ)へ入れる方法と取り出す方法をメモしたんだけど、取り出して表示する場合についての追加メモ。

GCS(Google Cloud Storage)内のデータを表示する方法は2つあるらしく、固有のBucket名と自分でデータを入れるときに付けたファイル名が繋がったものと、全く推測不可能な文字の羅列からなるURL。固有のBucket名が入る方は、ACLというアクセスをコントロールできる機能があるので、プログラムやGCS(Google Cloud Storage)のコントロールパネルから表示非表示やアクセスを特定の人に限定する等の制御ができるっぽい。もう一つの文字の羅列からなる方は、制御はできず、元のファイルを削除するまで誰でも見れて、ファイルも残るっぽい。どちらも別の専用URLからデータが送られるので、クッキーが無く(この意味もよくわかってないけど)実際に試してみると爆速で表示された。

GCS(Google Cloud Storage)内に入れたデータを表示する時、Bucket名を含む表示は、URLすべてわかっているので簡単。URLは、グーグルのURL + Bucket + 自分で付けたファイル名みたいな感じになる。こちらは、データを入れるときに、オプションでみんなに公開するか、後悔しないか等、いろいろ設定できる。GCSのコントロールパネルからも一般公開にチェックを入れると、公開用のURLが表示されたりする。

もうひとつの文字の羅列からなるURLで表示する場合は、create_gs_keyでキーをゲット(ファイル名は、”/gs”にBucket+データを入れるときに自分で付けたファイル名を繋げたもの)して、そのキーをget_serving_urlに入れると表示用のURLを作成してくれる。

ただ、元のデータの中身を同じファイル名で上書き更新しても、その作成されたURLで表示されるデータは更新以前のままでキャッシュされたものが表示されるっぽい、なので更新するには、別のファイル名にして再度URLを作りなおさないととダメっぽい。公開用のURLを消すには、GCS内のデータを消すか、delete_serving_urlでキーを入れると消える。

create_gs_keyはblobstoreの機能なんだけど、blobstoreが何なのかイマイチ理解していない。GCS(Google Cloud Storage)と似たようなものらしいけど、GCS(Google Cloud Storage)と違い、ウェブ上のコントロールパネルから中のデータを見たりはできないっぽい。そもそもGCS(Google Cloud Storage)を使うのに、どうしてblobstoreの機能を使うのかもよくわかっていない。