年別アーカイブ: 2014年

ImportError: No module named cloudstorageというエラーが出てしまう場合の解決方法

Google App EngineのpythonでGoogle Cloud Storage Client Libraryを試しに使おうと思い、グーグルのマニュアルを読んでいたんだけど、
デモのファイルを動かすときに以下のエラーが出てはまった・・・
インストールはPyPi(PyPiは何のことか知らなけど、以前にも使ったことがあった)を使い、マニュアル通りに

pip install GoogleAppEngineCloudStorageClient -t <your_app_directory/lib>

とした。これは、your_app_directoryのとこに自分のアプリ(appangineの本体ではなくアプリのファイル)のアドレスをそのまま置き換えて、コマンドプロンプトでコピペするだけでOKだった。

ところが、

ImportError: No module named cloudstorage

というエラーが出て、いろいろ試行錯誤しても駄目で、
海外のサイトを見ると、

import lib/cloudstorage as gcs

のようにlib/をつけると上手く行ったと書いてる人もいたが、上手く行かず
結局どうしたら解決したかというと、
アプリのlibフォルダの中にcloudstorageというフォルダがあるから、これをlibファオルダから出して、一つ上の階層にあげて
app.yamlとかサンプルファイルがある場所に移したらあっさり解決した。

ちなみにPyPiでインストールすると、サンプルファイルが含まれてないようだけど、マニュアルにあるサンプルソースをコピペして、ファイル名の場所だけ変えればそのまま使えた。

Google Cloud Storage Pythonを使ってみる

グーグルがやってるクラウドサービスというのを試しに使って見てるが、まだ良くわからないところが多い。

基本の単語からわからなくて、取り敢えず、データを収める場所がバケットで、収めるデータをオブジェクトというらしい。

面白いなと思ったのは、サブディレクトリの仕組みで
例えば、
animal/sea/fish
というサブディレクトリの構造らしきものがあったとして(これをバケットというらしい)、実際は、animalの下にseaフォルダがあって、そこにfishというファイルがあるんではなくて
たんに、fishというファイルにanimal/sea/fishという名前が付いているだけということらしい。

グーグルのクラウドサービスを見るとなんでも用意されてるので、ほんとできるだけ自前でやらずに用意されているものを上手に組み合わせてどう利用するかが大切だなぁと思った。

GAE(Google App Engine)pythonのNDBでデータの有る無しを確認してから取り出す。

GAEのデータストアNDBからデータを取り出す時にはまった。
日付データと、いくつかの文字列型のデータを収めるデータ型のクラスがあって、文字列は時々からの場合がある。
これをデータが空でないエンティティだけを取り出して、日付データでソートする、というのをやりたかったんだけど、どうしてもエラーが出てしまう。
どうも、このデータ型のクラスだけでは、希望のデータ取り出し方法はできないようで、結局、もう一つBooleanProperty型のプロパティを加えてあげることで解決した。

BooleanPropertyはTrueかFalseを収めることができる型で、データを入れるときにデータがあれば、BooleanPropertyをTrueにしておく。すると、取り出すときに、BooleanPropertyがTrueの物をフィルタリングすることで、あっけなく希望通りのデータ取り出しが出来た。

ネクサス7をアンドロイド5にアップグレードしたら異様に遅くなって、その後解決したこととか

少し前の話だけど、2012年にGoogle Playで購入したNexus7(32GB)に、今月(2014年11月)になってOSのAndroid5へのアップデートのお知らせが来ていた。迷うことなくすぐにアップグレードしたんだけど、アップグレード後にネクサス7の動作の全てが異様に遅くなった。どのくらい遅くなったかというと、我慢の限界を越えて、タブレットをパキンと真っ二つに割ってしまいたくなるくらい遅くなった。

電池の持ちを良くするために、普段はいつも飛行機搭乗モードにして、wifiだけONにして、ブラウザとアマゾンキンドル、他ごく一部のアプリだけ使っている。もしかしたらそれが何か影響してるのかと思い、飛行機モードを解除しても治らず。とてもまともに使える状態ではないので、ネットで調べたら同じような人がたくさんいて、対策法が1つ紹介されていた、これで治らない人もいるらしいが、私の場合は完璧に解決して、むしろアップデート前より早くなったんじゃないかというくらい快適になった。

方法は以下。

電源OFFにする。

電源ボタンと、ボリュームダウンボタンを同時に長押し

画面の左下に小さな文字でいくつか選択肢メニューが出てくるので、
「recovery mode」を選択して決定(選択は音量ボタン、決定は電源ボタン)

小さなAndroidロボットが倒れて「!」みたいなマークが出てくるので、そこで
電源ボタンとボリュームアップボタンを同時に押して、電源ボタンだけ離す。

またいくつかメニューが出てくるので、「wipe the cache partition」を選択して決定。

ほんの数秒で、キャッシュクリアが完了と英語で表示(~complete)と出るので
「reboot system now」を選択して、再起動。

これをやっても再起動後直後は、対策する前と全く同じで、物凄く動作が遅いんだけど
しばらくいじっていると、まず、ブラウザ表示がグングン早くなってきて、アプリも最初は異様に遅かったのが、何回かいじっているとだんだん早くなってきてしばらくすると違和感なく動くようになりました。しばらくというのは、具体的には20分か30分。対策前は、同じ時間いじってもずっと遅いままだったので、この対策で解決したっぽい。たぶん裏でいろいろ動いてるんだろうけど、何が起きてるのかは謎。取り敢えず無事に動くようになって良かった。ネクサス7には現状で何も不満はないので、5,6年は普通に使うつもり。

GAE(Google App Engine)pythonのNDBで特定のデータを消す方法

最近、GAEのNDBをいじっていて、わからないことが次々に出てくるんだけど、ネットでいろいろ調べていると、stackoverflowって海外のサイトと、公式のドキュメント、この2つが圧倒的に役に立つ。たまに英語のニュアンスがわからないくて、日本語のみで検索することがあるけど、情報量が違いすぎて、英語ネイティブとの差は大きいなと感じる。

で、特定のデータを消す方法だけど、NDBでは消したいデータのキーを取り出してから消去する、らしくて
X.key.delete()
みたいに書くらしい。

特定の条件に当てはまるデータを消したい場合は、delete_multiを使うといいらしくて

q1 = A.query()
q2 = q1.filter( >=を使ったフィルター ) # Filter
q3 = q2.filter( <=を使ったフィルター ) # Filter ndb.delete_multi(q3.fetch(keys_only=True)) みたいにしたら簡単に消したいデータだけ消すことができた。 keys_only=True というのは、fetchのオプションで、keys_only=Trueとすると、データ(エンティティ)を返すんではなくて、キーのみを返すらしい。 削除に必要なのはキーだけなので、あとは簡単にndb.delete_multiで一発で消去できる。