読者です 読者をやめる 読者になる 読者になる

Learn to Live and Live to Learn

IT(たまにビジネス)に関する記事を読んで、考えて、使ってみたことをまとめる場。

データベースの中身を見る(Android)

データベースの中身を誰でも見られる場所に移動する

run-asをつけるとアプリユーザ(アプリ自身)としてコマンドを実行できます。
しかし、データベースの中身を見たいのは一般ユーザなので、run-asした状態で一般ユーザの見られるSDCardにデータベースをコピーします。
終わったらexitしてください。

$ ./adb shell
$ run-as {package_name} cat databases/<database_name>.db > /sdcard/<database_name>.db  
$ exit

データベース名が分からない場合はこちらで確認できます。

$ ./adb shell
$ run-as {package_name}
$ cd databases
$ ls

データベースをPCにプルする

$ ./adb pull /sdcard/<database_name>.db .

sqlite3で中身を確認する

sqlite3 <database_name>.dbしたあとは普通のSQLと同じ感じでいけました。

$ sqlite3 <database_name>.db 
sqlite> select * from <table_name>;

sqlite3が存在するかはwhich sqlite3とかで確認してください。
Macは標準であるっぽいです。

APK署名スキームv2を使い、インストール速度を向上させる(Android N対応)

Android Nから導入された署名スキームv2ではAPKの検証速度が大幅に向上している

Android 7.0 では、APK 署名スキーム v2 というアプリのインストール時間を高速化したり、APK ファイルに無許可の変更が行われないようにしたりする新しいアプリ署名スキームが導入されています。
公式より

署名はAndroid Studio or apksignerでできる

二通りの方法があります。
1). apksigner

$ cd {...}/Android/sdk/build-tools/{version}
$ ./apksigner sign --ks {YourApp}.keystore --v1-signing-enabled true --v2-signing-enabled true {YourApp}.apk

2). Android Studio 2.2 と Gradle 2.2 用の Android プラグイン(未確認)

確認はapksignerコマンドでできる

v1, v2ともに署名されていることが確認できます。
下位互換のため、今まで通りv1での署名も必要です。

$ ./apksigner verify -v {YourApp}.apk
Verifies
Verified using v1 scheme (JAR signing): true
Verified using v2 scheme (APK Signature Scheme v2): true
Number of signers: 1

参考

developer.android.com developers-jp.googleblog.com

影響力の武器 2.コミットメントと一貫性

影響力の武器 1. 返報性 - Learn to Live and Live to Learnの続きです。

一度コミットした立場を取り続けようとする一貫性の原理

私たちは言動を一貫したものにしたい心理を持っています。
なぜなら

  1. 一度コミットしたことで、自分はコミットしたような人間なのだと自己イメージができる(内部からの圧力)
  2. 一貫性がない=信頼できない、というイメージがあるので、自分が信頼できない人間と評価されたくない(外部からの圧力)
  3. 類似した課題に直面した時、以前と同じ立ち振る舞いをすることで、効率的に判断できる

からです。

一貫性の原理を逆手にとった交渉術が存在する

フット・イン・ザ・ドア・テクニック

セールスマンが訪問先でまず片足をドアに入れて閉まらないようにし、相手が商談を拒否できないようにする動作に由来する。

コトバンクより

段階的要請法とも呼ばれます。
小さなお願いを受け入れてもらったあとで大きなお願いをする手法です。
相手は最初にお願いを受け入れる立場をとっているので、一貫性を保つため大きなお願いも受け入れられやすくなります。

ローボール・テクニック

ローボールは低い球だから取りやすいことに由来しています(心理学で学ぶ頼み方③ ローボール・テクニック - ズボランドより)。
承諾先取り法とも呼ばれます。
悪い条件を隠し承諾を得たあとで、悪い条件を出す手法です。
承諾した時点で正当化する理由を他にも探すので、最初に隠していた悪い条件を出してきても、承諾を支える柱は他にもできていて承諾を取り消さないのです。

コミットメントを最大化するのは行動・公表・努力・自分の意志

朝鮮戦争時、中国軍はアメリカ軍捕虜に対し反アメリカ・親共産主義な意見を書くよう求めました。
そして、書いた文章を他の捕虜たちの前で読ませたり、ラジオで流したりしました。
そうしたアメリカ軍捕虜は帰国後、中国に対する理解を示していたそうです。
なぜなら、中国軍のとった行動にはコミットメントを最大化する4つの要因が全て含まれていたからです。

  1. 行動する(書く、発表する)
  2. 公表する(発表する、ラジオで流す)
  3. 努力する(書く)
  4. 自分の意志(アメリカ軍捕虜は強制されたわけではない)

回避するには「今、承諾した時に戻れるならどうするか」を考える

一貫性の原理を悪用した術中にハマっていないか調べたい場合は、時を遡ることです。
悪い条件を隠し承諾を求められた時、今と同じ情報を持っていたとしたらYesと言うだろうか、と想像します。
Yesと言わないなら断るべきでしょう。

参考

影響力の武器 | ロバート・B・チャルディーニ

ManifestMergerのログを見てみる

ManifestMergerとは

Android Gradle Pluginが提供するビルド時に自身のマニフェストファイルやライブラリプロジェクトのマニフェストファイルをマージしてくれる機能です。
だから、私たちはbuild.gradleに数行追加するだけで、ライブラリのダウンロードから依存解決・参照設定まで何も気にせず開発できます。
ただ、ManifestMergerが全てやってくれるので、ManifestMergerのことを知っておかないと、意図せぬパーミッション追加や(依存解決による)ライブラリダウンロードに気づけなくなるのです。

テストアプリを作ってみる

確認用テストアプリの為、build.gradleを書きます。

build.gradle

dependencies {
    compile 'com.google.android.gms:play-services:7.5.0'
}

上記でビルドしてみます。すると、書いた覚えのないパーミッションがマージ後のマニフェスに現れます。

module/build/outputs/intermediates/manifest/full/flavor/buildType/AndroidManifest.xml

<uses-permission android:name="android.permission.INTERNET" />

それでは、マージのログを見ていきましょう

ログは
module/build/outputs/logs/manifest-merger-buildVariant-report.txt
です。
以下はログの一部ですが、play-services-ads7.5.0からandroid.permission.INTERNETが付与されていることが分かります。

uses-permission#android.permission.INTERNET
ADDED from [com.google.android.gms:play-services-ads:7.5.0] 
app/build/intermediates/exploded-aar/com.google.android.gms/play-services-ads/7.5.0/AndroidManifest.xml:20:5-66
MERGED from [com.google.android.gms:play-services-analytics:7.5.0] app/build/intermediates/exploded-aar/com.google.android.gms/play-services-analytics/7.5.0/AndroidManifest.xml:21:5-67
MERGED from [com.google.android.gms:play-services-analytics:7.5.0] app/build/intermediates/exploded-aar/com.google.android.gms/play-services-analytics/7.5.0/AndroidManifest.xml:21:5-67
MERGED from [com.google.android.gms:play-services-appinvite:7.5.0] app/build/intermediates/exploded-aar/com.google.android.gms/play-services-appinvite/7.5.0/AndroidManifest.xml:19:5-67
MERGED from [com.google.android.gms:play-services-maps:7.5.0] 
app/build/intermediates/exploded-aar/com.google.android.gms/play-services-maps/7.5.0/AndroidManifest.xml:21:5-66
MERGED from [com.google.android.gms:play-services-maps:7.5.0] 
app/build/intermediates/exploded-aar/com.google.android.gms/play-services-maps/7.5.0/AndroidManifest.xml:21:5-66
MERGED from [com.google.android.gms:play-services-maps:7.5.0] 
app/build/intermediates/exploded-aar/com.google.android.gms/play-services-maps/7.5.0/AndroidManifest.xml:21:5-66
MERGED from [com.google.android.gms:play-services-wallet:7.5.0] 
app/build/intermediates/exploded-aar/com.google.android.gms/play-services-wallet/7.5.0/AndroidManifest.xml:20:5-66
MERGED from [com.google.android.gms:play-services-maps:7.5.0] 
app/build/intermediates/exploded-aar/com.google.android.gms/play-services-maps/7.5.0/AndroidManifest.xml:21:5-66

また、このmanidest-merger-buildVariant-report.txtは、ダウンロードしたライブラリとそのバージョンも見られるので、確認にとても便利です。

ちなみにtools:node=“remove"属性でマージから除ける

xmlns:tools="http://schemas.android.com/tools"を記載した上でtools:node="remove"を指定すればOKです。

<uses-permission android:name="android.permission.INTERNET"
        tools:node="remove" />

参考

Merge Multiple Manifest Files | Android Studio
Android Studioの落とし穴 ライブラリプロジェクト - リスクファインダーブログ

影響力の武器 1. 返報性

ロバート・B・チャルディーニ博士の『影響力の武器』を読んでいるのですが、良書だと思うので内容をまとめたいと思います😎

人間は固定的動作パターンをとることが多々ある

固定的動作パターンとは、信号刺激に対してとる決まった行動パターンです。

例えば、依頼するとき「〜ので」とつけた方が承諾した方がいいと思う、値段が高いと価値があると思う、値段の高いものを見た後に安いものを見るとより安く感じる(知覚のコントラスト)などがあります。

なぜ固定的動作パターンをとるかと言うと、情報の溢れる複雑な環境に生きる私たちは、時間や頭を効率的に使う必要があるからです。多くの場合、固定的行動パターンによる選択は正解なのです。

この固定的動作パターンのうち影響力の大きい6つをCLRASSの原理と言います。

CLRASSの原理

クラッサスと読みます。
以下の頭文字を取っています。

Consistency:一貫性
Linking:好意
Reciprocation:返報性
Authority:権威
Social proof:社会的証明
Scarcity:希少性

CLRASSの原理をうまく利用できると、相手にYesと言わせる承諾誘導が行えます。
今回は返報性(Reciprocation)を取り上げます。

返報性の原理とは、施しを受けた場合お返しをしなければならないという心理

人は他人から何らかの施しを受けた場合に、お返しをしなければならないという感情を抱くが、こうした心理をいう。この「返報性の原理」を利用し、小さな貸しで大きな見返りを得る商業上の手法が広く利用されている。
返報性の原理 - Wikipediaより

「Give and Take」という言葉が表す通り、私たちは恩を受けたら返さなきゃいけないと思っています。
そのお陰で、相手から何ももらっていなくても安心して相手に与えることができる、そんな社会が成り立っているのです。
問題があるのは固定的動作パターンを悪用する人間であって、固定的動作パターン自体でないことに注意が必要です。

返報性は実験によって証明されている

デニス・リーガン博士が行ったこんな実験があります。

見知らぬ二人の被験者を集め、二人一組で美術館を鑑賞し絵画を評価してもうらう実験を行いました。
しかしこの実験は実はフェイクで、片方の被験者は実験者の助手なんです。

被験者は2つのグループに分けられます。
A: 実験の休憩時間に助手がジュースを2本買ってきて、1本をもう一人の被験者にご馳走する
B: 実験の休憩時間に助手は自分の分のジュースだけ買ってくる

そして実験が終わった後、助手はもう一人の被験者に「自分は宝くじを売らなくてはいけない。多ければそれにこしたことはないが、いくらか買ってくれないだろうか?」と頼みます。

結果、ジュースをご馳走された方(A)がされなかった方(B)より、購入率が2倍も増えました。

ちなみに宝くじ購入に助手への好感度は関係ありませんでした。
また、この返報性で最初に受け取るものは、受け取る側がほしいものである必要はありません。つまりこの場合、真の被験者がジュースを求めている必要はないのです。

返報性の原理を利用した例として、ドア・イン・ザ・フェイス・テクニックがある

譲歩的依頼法とも言われます。
相手にお願いを拒否されてから譲歩した依頼(本来の依頼)をすると、本来の依頼の承諾率を上げられるテクニックです。

例えば、「3,000円のコンサートチケットを買ってくれませんか?」と頼み、断られたら「では、1,000円の映画チケットはどうですか?」と聞くと、3,000円の話をしなかった場合より相手の承諾率が上がるというものです。

なぜ承諾率が上がるかというと

  1. 相手が3,000円のチケットから1,000円のチケットに譲歩してくれたので、自分も譲歩で返さなくてはいけないと思う(譲歩=与えられたものという認識)
  2. 3,000円と1,000円との間でコントラストの原理が働き、1,000円がとても安く感じる(コントラストの原理とは、最初に提示したものと次に提示したものの差が、対比によってより大きく見えること)

からです。

仕事で頼み事をするときに使える

例えば

  • 仕事を依頼する時にチョコやジュースをプレゼントしてからお願いする(これは何の意図もなくやっていたw むしろ依頼しよう→お願いを聞いてくれるだろう→お礼をしなきゃという思考回路で私が返報性の原理の受ける側になっていたのだろうか
  • 相手の話を愚痴とか相談とかを聞いてから、自分の相談をする
  • 自分の得意分野で仕事を手伝ってから、他の仕事をお願いする
  • 大きめの開発依頼をして拒否されたら、それを細分化したタスクをお願いする

などで使えると思います。
効果があったらまた記事を書きます。

参考

影響力の武器[第三版]: なぜ、人は動かされるのか | ロバート・B・チャルディーニ, 社会行動研究会 |本 | 通販 | Amazon

アプリのOpenSSLバージョンを確認する

OpenSSLのバージョン確認は必要

脆弱性があるとお客様を危険に晒すことになるので大事なことです。
もちろんGoogle PlayのリリースではセキュリティスキャンとしてOpenSSLのバージョン確認も行われています。
アプリの OpenSSL の脆弱性への対処方法 - Google ヘルプによると、OpenSSL1.02f/1.01rより前のバージョンはだめとのことです。
fとかrの部分はアルファベット順で1.01qはNG、1.01sはOKという認識です。

OpenSSLとは、暗号通信プロトコルの機能を実装したオープンソースのライブラリ

セキュリティーを要求される通信のためのプロトコルである「SSLプロトコル」と「TLSプロトコル」を容易に実装できるオープンソースパッケージ。ソフトウェアライブラリ。

OpenSSLとは - はてなキーワードより

確認は、解凍したapkからOpenSSLでgrepする

$ cd {$project}/{$module}/build/outputs/apk
$ unzip -p {$name}.apk | strings | grep "OpenSSL"

unzipは解凍です。-pオプションでパイプ(stdout)に抽出してくれ、元ファイルがどうこうなることはありません。
stringsはプリント可能な文字列を検索してくれます。
grepgrep "hoge"hogeを検索します。

ちなみにGoogle Playのベータ版テストでリリース前にセキュリティスキャンができる

なので、Google Playは上手く使いこなしたいですね。
Google playでのベータ版配布機能について - Qiita

参考

OpenSSLの仕組みとは?初歩から解説! | Tech2GO
OpenSSLの説明

aarをローカルから読み込む

概要

aarをローカルから読み込む方法を知った(教えていただいた)ので、メモしときます。

🔍ちなみにaarとは
Android ARchiveの略です。
Androidリソースやマニフェストファイルを含めることのできるAndroidライブラリです。

作り方としては、[File] > [New] > [New Module] > [Android Library] > [Next] > 必要に応じて設定変更 > [Finish]で、{$project}/{$library_name}/build/outputs/aar/{$library_name}.aarができます。

対応方法

1. aarをモジュールのlibsディレクトリに置く

aarをドラッグ&ドロップで取り込めます。
初回にファイル形式を聞かたことが一度だけあります。aarがなくて困ったんですが、textを選んで問題なく進められました。

2. dirsにaarを探索するディレクトリをbuild.gradleからの相対パスで書く

{$module}/build.gradle

repositories {
    flatDir {
        dirs 'libs'
    }
}

3. nameに2からの相対パス、extに拡張子を書く

{$module}/build.gradle

dependencies {
    compile(name:'拡張子を除くaarファイル名', ext:'aar')
}

参考

Create an Android Library | Android Studio
aarの説明