カテゴリ : 開発ツール

先日のエントリーでGoogle App Engine(以下GAE)での制限、特にDatestore Read Operation(以下DRO)の制限がキツイということを書いたけど、割と驚いてしまう事実が発覚した。

あの後、とりあえずMemcacheを使って必要最低限のデータアクセスで済む様にプログラムをチューンアップしてみて、実際にデータストアへの接続回数は改善された。が、どうにも改善されすぎている・・・。ー昨日は半日も持たずにDROが臨界点に達していたのに、昨日確認すると2%ほどしか消費されていない。Googlebotの巡回の量が減ったのかな?と思ったのだけど、そこまで目立った変化は無さそうだし、どうにも解せない。プログラムでコンテンツを表示する以上、キャッシュを使うといっても限度があり、普通に考えてそこまでの成果が出るとは考えにくい(厳密には他にもチューニングはしてるのだが)。

あれこれ考えてみて、一昨日はGAEの管理コンソール上でDatestore Viewerでデータの中身を確認していたことに思い出し、それが何か関係しているのかと調べてみたら、やっぱり管理コンソール上での作業もデータアクセスとみなされる模様。しかも管理コンソール上では、データは20件ずつ表示されるのだが、これはどうも全件取得してからそのうちの20件を表示すると言うような動きをしているみたい。(GQLコンソールを確認すると“SELECT FROM ***”でデータ取得を行っていた)

僕が保持しているデータストアの総数は1000件以上あるわけだけど、全件見ようとしたら1000×50でこれだけで一日のDROを消費されてしまうというからくりということが分かった。

公開して日も短く、Googlebot以外には殆どユーザーのアクセスが無い状況でこれだったので、途方にくれていたけど、まだGAEに関しては何とかなりそうで少し安心。むしろ早い段階でプログラムのチューンアップをする機会になってよかったと思う。

後はAmazon Product Advertising API のリクエスト制限(2000/h)の問題だけど、こればっかりはどうしたもんか・・・。



仕事をやめてから、今までろくろく出来なかったプログラミングを習得しようと職業訓練校に通ったことは以前のエントリーで記入したが、その後自前で簡単なWebサービスを作り一応公開をしている。


WEBサービスを作るにあたって最も苦慮した点としては、やはりサーバー等の準備だろう。PHPなどと違って、Javaは無料のレンタルサーバーで利用が可能なケースが殆どなく、あったとしても審査がかなり厳しかったりなどハードルは決して低くは無かった。そういう事情もあって取れる選択肢が実質的に“Google App Engine(以下GAE)”一択だった訳だが、どうにもこれが相当に使いにくい。

第一に、GAEではRDBが使えない(課金すればMySQLが使えるみたいだが)、第二にプログラミング上で様々な制約がある、そして第三に無料で使える要領が相当にタイト、ということが挙げられる。

RDBが使えないことについては正直慣れの問題で、もともとプログラマでもない僕にとっては、にわか仕込みで身に付けたMySQLからJDO(GAEで採用しているデータ格納の形式)に鞍替えするのには正直そこまで苦労はしなかった。今では手続きが簡素で、データ型にコレクションクラスが使えるJDOの方がやりやすいとまで感じている。プログラミング上の制約についても、利用可能なクラスが制限されていたりするが、基本的にはそこまで問題ではなかった。

しかし、三番目の無料で使用できるリソースについてはかなり厄介だ。現時点で躓いてしまい、回避方法を模索中だが、中々に根深いと感じる。因みに今躓いているところはタイトルにもあるとおり、“Datastore Read Operations( データストアに格納されているデータの読み込み )”についての制限だ。GAEのガイドラインには一日に0.05M回(つまり50,000回)が限度とされており正直ここいらへんは最初にざっと読み通していただけ出し、「5万回もありゃ充分やん」程度にしか考えていなかった。しかし、ここが落とし穴でこのRead Operationがどの単位で行われているかを理解しなかったため、本日サービスの一時停止という憂き目にあってしまった。

最初読み通していたときには、5万回データ取得が可能という風に考えていたが、実際には一回のデータアクセスでも1回に1000件のデータを抽出したとすると1000回分のOperationが実行されたとカウントされるようだ。

なので一度の多くのデータを抽出することを前提にアプリを作っていると、あっという間に許容量をオーバーしてしまい、一時的にサービスが停止してしまう。もっとも課金すれば上限を増やせるらしいのだが、サービスが軌道に乗るまではあまりお金を掛けたくないというのが実情。

また、setRange()メソッドで抽出するデータ量の制限を掛けたところでも、内部的に全件取得してから該当するレンジのデータを抽出するという形をとっているみたいで、これでも結果は変わらないという報告も出ている。

そうなると、“Select From ***(データベース名)”という実行の仕方ではいかんともしがたく、“Select From *** where id == ● ● ”みたいな形でデータを取得する必要がありそう。しかし、これだとかなり窮屈なつくりになってしまうのでもう何手間か必要になってきそう。

現時点で考えられる手法としては、

1.MemCache使ってデータストアへのアクセス必要最低限にとどめる

2.XMLデータストアとは別に読み込み専用のデータ用意定期的にデータストアと同期する

といったところだろうか。

なんにせよ、GAEを使ってまともなアプリを作るのはかなり難易度が高いということだと思う。

CosPa!



Androidのスマートフォンを機種変更したらやっておきたいことということで書いていきますが、簡単に言ってしまうと、各キャリアの縛りから開放される&以下にスムーズに機種変前の環境を復元できるかというのが肝になります。 

その1:プリインストールされてあるキャリア謹製ホームアプリを変更する

auやソフトバンクにはあるのかどうか実はわからないのですが、2011年の夏モデル以降のNTTドコモのスマートフォンには『docomo Palette UI』というホームアプリがプリインストールされており、デフォルトでは有無を言わさずこのアプリが起動することになります。人によってはこのアプリを気に入っている方もいらっしゃるかもしれませんが、肌感覚では、動作が鈍くなったり通常よりメモリを消費したりなどパフォーマンスが低下しているように感じます。しかもこのホームアプリ、Root権限がないと削除も無効化も出来ないというのだから、仕方なく使っている人も多いんじゃないでしょうか?
ただ、キャリアが作ったホームアプリではなく端末標準のホームアプリを使うことが出来ないかというとそうではなく、ちゃんと方法は用意されています。
僕が持っている端末(Xperia Z)を例に挙げると、設定画面からXperiaという項目を選択、優先アプリ設定の画面を開き、一括もしくは個別かで優先的に使用するアプリを選択します。
xpeiraz01xpeiraz02
xpeiraz03xpeiraz04
他のスマートフォンでは、当然設定方法が違うと思いますが、大体にして似たような操作方法だと思います。
どうしてもやり方が分からない場合は、設定、アプリから実行中の『docomo Palette UI』を選択し、強制停止ボタンを押してホームに戻ると、どちらのホームアプリを利用するかポップアップで尋ねてくるので、それを選択するというのもでOKかと思います。

その2:使わないプリインストールアプリを削除する

これは以前に、これ単体を記事にしました。詳しくはそちらを参照して頂きたいのですが、大雑把にとれる手段は3つあり、「(ICS以降に限る)アプリの無効化」「ホームアプリを別途ダウンロード」「adbコマンドを使う」の3点です。
使わないプリインストールアプリを非表示にする方法
バックグラウンドで動き続けるアプリもあるため、邪魔なだけではなく、パフォーマンスにも影響しますので、これは是非やってみたほうが良いとおもいます。今後発売される端末はAndroid4.1.1からになるかと思いますので、機種変更の際はどの方法でも可能かと思います。

その3:機種変更の場合)前端末で利用していたアプリの設定を新端末に引き継ぐ

これも以前にこのブログで記事にしたトピックスですが、ICS以降はadbコマンドを使って出来ることが多くなり、その中でもメリットが高そうなのが、設定を含めたフルバックアップが可能になったということです。
ICS以降対応のadbコマンド「adb backup」を使ってrooted無しでバックアップを可能に
リンク元の記事ではシステムファイルを含めた全体について書いていますが、アプリごとにバックアップを取ることも出来ます。その方法を使えば、設定を引き継いだ状態でアプリを利用できるので手間を抑えることが出来ます。詳細についてはリンク元を参照して頂ければと思いますのでかいつまんで説明します。
adb backup -f “バックアップファイル名.ab” -apk “バックアップを取りたいアプリ”
もっと具体的に書いてみます。例えばLineのアプリを設定を引き継いだ状態で取得する場合、以下のような記述になります。
adb backup -f line.ab -apk jp.naver.line.android
といった具合になります。adbコマンドがうまく実行されれば、端末側でパスワード設定が求められるので、それを設定します。その後は新しいスマホとPCをつないで以下のコマンドを実行します。
adb restore line.ab

 パスワードを入力すればこれで設定そのまま引継ぎ完了となるはずです。はずというのもかなりあいまいな表現ですが、実は前端末である『Xperia NX』はこのadbコマンドを使っても、はたまたXperia用管理ソフト「PC Companion」のバックアップメニューを使っても失敗するため、確信を持ってお話できないというジレンマがあるのですよ。。 以下のサイトがわかりやすくて参考になるのでリンクを貼っておきます。

Android版 パズドラを機種変更でバックアップ&データ移行方法


その他、端末によってやるべきことは変わってきますが、以上を覚えておくと便利だと思いますよ。