oranie's blog

旧:iをgに変えると・・・なんだっけ・・・

開発中にAndroidアプリでSQLiteに格納したデータをデータファイルコピーせずに確認する方法

【追記】
このブログ書いた後に改めてググったら普通にこの方法見つかるね。俺が見逃していただけですな・・・。

                                                                                                                                    • -

表題のままで、開発中にAndroid アプリで定義したSQLiteスキーマをちゃんと確認したいとか、中にどんなデータが入ったかを確認したかったが、ググっても出てくるのが「SQLite3のファイルをローカルにコピーしてきて、それを見る」ばっかりだったので、面倒くせーと思ったらファイルコピーしなくても出来た。
環境はMac + Android Studio + Genymotion上のNexus端末なので、実機ではRoot権限を取らないと多分この方法はムリ。試しにやったらroot権限無くて対象のディレクトリに入れないので出来なかった。

方法としては

  • adb shellで端末に入る
  • cd /data/data/{アプリ名}/databases/してディレクトリを移動。
  • 中にあるSQLiteデータファイルを指定してSQLite3コマンドラインインターフェイスを起動。
  • 後は普通にクエリを実行して確認する
例えばexample-appという名前のアプリでexample-dbというテーブルを作成していた場合はexample-dbというデータファイルがあると思うので
# adb shell (PATH通っていないとかは知らん)
# cd /data/data/example-app/databases/
# sqlite3 ./exampl-db

SQLite version 3.7.11 2012-03-20 11:35:50
Enter ".help" for instructions
Enter SQL statements terminated with a ";"
で中に入れるので、
sqlite> .databases  
でdatabaseの一覧を見たり
sqlite> .schema example-db
でスキーマを確認したり
sqlite> select * from example-db;
で普通にSELECT文を実行出来る。

という流れになる。Android StudioのTerminalからadb shellを実行すれば良いので確認が楽になった。別に普通のTerminalからでも出来る。

ただ、以前までは普通にadb shellで端末に入れたのに実機のNexus7に一度繋げてから、Genymotionの端末に入ろうとadbコマンド実行すると

$ adb shell
adb server is out of date.  killing...
cannot bind 'tcp:5037'
ADB server didn't ACK
* failed to start daemon *
error: 

とかで入れなくて、これがAndroidの洗礼か・・・誰か助けて・・・。もちろんこの直前にはAndroidStudioからアプリを端末にインストール出来ている。

なので、こういう時はGenymotionを使って端末起動した場合、ps auxwwとかで確認するとそもそもshellで接続しているので

こんな感じ
 /Applications/Genymotion.app/Contents/MacOS/player.app/Contents/MacOS/tools/adb -s 192.168.56.101:5555 shell

このコマンドをコピペすると中に入れる。

fluentd + BigQuery pluginを利用する時に認証処理で「invalid_grant」エラーになる時の対処

結論から言うと、システム時間を確認しましょう。

環境はDocker上のfluentdで

2014-10-02 06:31:47 +0900 [error]: unexpected error error_class=Signet::AuthorizationError error=#<Signet::AuthorizationError: Authorization failed.  Server message:
{
  "error" : "invalid_grant"
}>

というエラーが出て起動出来なかった。でも認証情報は合っているし、GoogleDeveloperConsleで見てもAPIの許可とかはしている。で調べて見ると
https://github.com/abronte/BigQuery
にも記載があるが

Troubleshooting

If you're getting an "invalid_grant" error it usually means your system clock is off.

If you're getting unauthorized requested but you've been able to successfully connect before, you need to refresh your auth by running the "refresh_auth" method.

なので、Doker上の時間を確認するとズレまくっていた。とりあえず

ntpdate -q ntp.nict.jp

を実行して時間を合わせたらフツーに起動出来た。

という訳でDokerを使う場合は時間の確認もちゃんとしましょう。
http://stackoverflow.com/questions/24551592/how-to-make-sure-dockers-time-syncs-with-that-of-the-host
に書いてるように

docker run -v /etc/localtime:/etc/localtime:ro -i -t mattdm/fedora /bin/bash

とかでrunさせるのがベストプラクティスなんですかね。

AndroidでGoogle Maps API v2を叩く時に地図が表示されない時に確認する設定

ハマったのでメモ。環境はAndroid Studio使った。改めてググって見ると
http://9ensan.com/blog/smartphone/android/google-maps-android-api-v2-sample/
の解説が一番丁寧でこの通りになっていれば出来る。

Activityは表示れているっぽいけど、画面が真っ白になっているときは
http://stackoverflow.com/questions/17491400/failed-to-load-map-error-contacting-google-servers-issue-with-android-google-ma
とかで書かれているけど、Logcatに

Could not find class 'com.google.android.gms.location.internal.ParcelableGeofence', referenced from method glt.a

とかのログが出ているので、その場合にでAndroidManifest.xml

使いまわす場合は
Android applications
    Any application allowed
とかになっているか

などの確認をして問題が無いか確認しましょう。このエラーログでググるとstack overflowでヒットしまくるので、みんなもドハマりしている様ですね。

あと若干別件だが、build.gradeに

    compile 'com.google.android.gms:play-services:+'

って書くと端末側がGooglePlayサービスのアップデートをしようとするけど何故かアップデート出来なくて永久にアプリちゃんと起動出来ない問題があったので、

    compile 'com.google.android.gms:play-services:5.0.89'

って明示的にVer書いたら問題が出なくなったのもあった。

Android学習メモ-5

今研修で書いた糞コードをgithubにあげた。
https://github.com/oranie/AndroidStudy

コード自体は本を写経しているものが大半だけど、自分のあんちょこにはなるのでいいメモになる。
動くプロジェクトで見れるのが一番やね。(一部ビルド通らないヤツやまともに動いていないやつもあると思うけど)
現時点ではFragmentがほんとよーわからん。UI・描画周りがほんとダメダメ。思った通りのレイアウトが全然組めない。
データ操作はまあ簡単なやつしかやっていないので一応詰まりはなし。
やったけど
・adapter
・ListView
この辺はもう忘れている感ある。
なんだかんだ言って写経しただけのコードでもそれで実機が操作出来るのは嬉しいね。この辺はスマフォアプリの魅力。
Java自体はとりあえずIDEの力を存分に借りてなんとかってレベル。ただ、IDEのがエラー出している理由や補完候補に出しているものの理由を把握できていないので、Java力というよりEclipseにちょっと慣れた程度。写経力は向上した。

AndroidOpenTextbookが大変助かるというお話

Android初心者としてあるあるパターンの事としてはオフィシャルリファレンス
http://developer.android.com/reference/packages.html
を読んでも

  • それをどうやって呼び出すか
  • 中でどんな事すれば良いのか
  • そもそも英語が・・・

とかに良く行き着くわけですね。全体をまだ良くわかっていないから。例えばなんかのクラス使う時にhogeオブジェクト渡せとか書いているけど、これそもそもどこで作るんや?とか。なので一連の流れでどうやれば良いかというのが結構知りたい訳なんです。

で、色々サイト見たり本見たり社内のソース読んだりとかもしたけど、一番見たい「解説されている部分が最小限書かれていて動くプロジェクト」のソースを読みたいけど、本とかブログとかは結構特定部分のソースだけだったりする訳ですよ。まあここは対象としている人がそもそもJavaAndroidある程度分かっている解説とかならまあそうだよね、という感じですが。で、社内のソースはプロダクトのソースなので知りたい事以外の処理がてんこ盛りなので、今の僕だとこんがらがっちゃう訳です。まだ切り分け出来ていないので。

Twitterであー良く分からないービルド通らないー動かないー落ちたーとかワーワーやっていたら

を教えてもらいました。
https://github.com/TechBooster/AndroidOpenTextbook

全てを網羅している訳ではまだ無いけど、今後続々と充実して貰えると大変俺得です。今詰まっていたネットワーク通信(HTTPでGETするだけレベル)解説部分のサンプルソースがプロジェクトごと入っていたので大変助かりました。文章の方も画像もありコードを1行ずつ解説して貰えて細かく解説しているので大変助かりました。Android Studioだとそのままimportするだけでサンプルコードは動きました。
文章を生成するのが今はMacの手法しか書いていないので、まあMacで作ってWindowsで読めば良いんじゃないでしょうか。nodeとかでやっているからLinuxでも生成処理は動くのかな?依存しているライブラリとかまだ分かっていないので適当です。

こちらからは以上です。

【チラ裏】Android学習メモ-4

とりあえず入門書読んでからインターフェイス作ってMySQL操作クラスとRedis操作クラス作ったりしてfor文回して実行したりとかやったので、一旦Androidに戻ってみた。で、Javaの基礎文法の所はまあ・・・って感じになったけど、Android特有の所でやっぱりつまづきまくる。というか、はじめの頃Javaも分からんのに「まあなんとかなるかな?」と思ってよく手を出したな。アホかオレ。とりあえず入門書を一冊読みきってAndroid特有の考えとか用語に馴染みきっていないので、リファレンス本を追加購入しようと思う。オフィシャルのリファレンスだけでは無理。英語も分からんし。細かい所が全く理解できない。なので、また一冊読んでJavaの本をまた読みなおしてもう一度かな。

【チラ裏】Android学習メモ-3

Android学習とか書いておきながらこの3日間くらいはJavaの入門書をずっと読んでいた。今日はとりあえず車クラスとかやっていてもわけわからんので、馴染みのある題材としてMySQLに接続してデータ取ったりぶっ込んだりを書いた。とりあえずmainとそれ以外のクラスを分けて書いたり、コンストラクト書いたりメソッド書いたりインターフェイス書いてみたりをやった。syntax error出まくっては止まって・・なので、そもそもの理解の低さが再確認出来て良かった。明日はRedisとか他のデータストアとの接続・操作クラスを作成してその流れで抽象化やオーバーライドとかをやってみようと思う。