Learn to Live and Live to Learn

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

多段sshする際の秘密鍵配置やパスワード入力をなくす

ssh-agentを使って、サーバ間を楽々移動する

ssh-agentとは

公開鍵認証方式による認証を行っているSSHサーバへ接続する際、秘密鍵に設定されているパスフレーズの入力を代わりにやってくれるアプリケーション
server-memo.netより

サーバをあちこち移動するとき、毎回秘密鍵を配置してパスワード入力して…とするのは面倒なんで、ssh-agentを適切に利用してローカルへの鍵配置&一回のパスワード入力で済ませる方法を紹介します。
です。

Macでの動作です。ssh-agentの起動が必要なものもあるので、ご確認ください。
ssh-agentの使い方 - Qiitaがまとまっています。

秘密鍵を登録する

まずは

$ ssh-add -l

を打って秘密鍵の登録状況を確認します。 The agent has no identities.の場合は、秘密鍵が登録されていないので

$ ssh-add ~/.ssd/id_rsa

で登録します。

agent forwardingする

agent forwardingとは、多段sshするとき認証情報を転送する機能です。
例えば、ローカルから踏み台サーバにsshして踏み台から本番サーバにsshするとき、ローカルに鍵を置いてパスワードを入力すれば、踏み台や本番には鍵もパスワードも必要なくなります。
agent forwardingは-Aオプション

$ ssh -A <domain>

でOKですが、~/.ssh/configにForwardAgent yesを記載しとくと、毎回オプションを付けなくてよくなるのでおすすめです。

Host *
ForwardAgent yes

影響力の武器 4.好意

影響力の武器 1. 返報性 - Learn to Live and Live to Learn
影響力の武器 2.コミットメントと一貫性 - Learn to Live and Live to Learn 影響力の武器 3.社会的証明 - Learn to Live and Live to Learn
に続き、影響力の武器である好意をまとめます。

好意の要因には身体的魅力・馴染み・連合がある

好意を持っている対象が自分に対し大きな影響力を持っていることは、何となく想像しやすいと思います。
好意の要因は主に

  1. 身体的魅力
  2. 馴染み
  3. 連合

の3つです。 他にも、お世辞は分かっていても嬉しく好意を持てたり、共通目標を持って協力している人には仲間意識ができ好意に繋がったりします。

1. 身体的魅力

ハロー(後光)効果という現象があります。
ある対象を評価するとき、一つの望ましい特徴によって、他の特徴の評価が歪められることです。

その一つの特徴はえてして”外見”です。
大人しい外見の人を見て真面目そうとか、いい人そうと感じるのはまさに身体的魅力の影響を受けています。

2.馴染み

類似性のあるものには好意を持ちやすいです。

3.連合

連合の原理という法則があります。
ある対象への感情がその対象と連合しているものへ伝わることです。

企業が広告に人気タレントを起用するのもこのためです。人気タレントに向けられている好意を自社にも伝染させようとしているのです。

自分の通う大学の野球チームが勝つと「私たち(俺たち)のチームが優勝した」と言うのに対し、負けると「○○(チーム名)が負けたらしい」と他人事のような言い回しになるのは、自分と野球チームが連合することによって野球チームが自分の代理になっていることを本能として知っているからかもしれません。

原因ではなく結果に注意を払う

対策としては、好意の要因(原因)を探ろうとしても気付きにくいので、異常な好意(結果)が生まれていないかに気を配ることです。

例えば、私たち人間は感じの良いセールスマンが勧める商品をいいと思いがちです。しかし、出会ってたった数時間の人に好意を持っている違和感に気づけば(アンテナを張っておく必要はある)、セールスマンの良さと商品の良さは別であると区別して考えれ、その商品を正当に判断できるはずです。

参考文献

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

Android M パーミッション対応

Android 6 Marshmallowからパーミッションの取得タイミングが変わった

これまでGoogle Playでのインストール時に全てのパーミッションを要求されていました。
皆さんの中にも「このパーミッションは何に使われてるの?」と疑問に思われたことのある方や、「使わない機能で必要なパーミッションを求められている」と感じたことのある方がいらっしゃるのではないでしょうか。
Android 6(APIレベル23)以降ではそんな気がかりはなくなります。
Google Playでは何もせず、それぞれのパーミッションが必要なタイミングで要求できる(される)ようになります。

実装

実装方法はこんな感じです。(ちょっとややこしくなった感)

AndroidManifest.xml

<!-- RECORD_AUDIO=マイクのパーミッションを例とする -->
<uses -permission android:name="android.permission.RECORD_AUDIO" />

MainActivity.java

...
private static final int REQUEST_CODE = 1;
...
@Override
public void onCreate(Bundle savedInstanceState) {
    super.onCreate(savedInstanceState);
    setContentView(R.layout.activity_main);

    // 権限がない時
    if (PermissionChecker.checkSelfPermission(this, Manifest.permission.RECORD_AUDIO) != PackageManager.PERMISSION_GRANTED) {

        // 許可ダイアログの再表示判定
        if (ActivityCompat.shouldShowRequestPermissionRationale(this, Manifest.permission.RECORD_AUDIO) {
            new AlertDialog.Builder(this)
                .setTitle("パーミッションの追加説明")
                .setMessage("このアプリで○○するにはマイクのパーミッションが必要です。")
                .setPositiveButton("設定" new DialogInterface.OnClickListener() {
                    @Override
                    public void onClick(DialogInterface dialog, int which) {
                        // パーミッションを要求する
                        ActivityCompat.requestPermissions(MainActivity.this,
                            new String[]{Manifest.permission.RECORD_AUDIO},
                            REQUEST_CODE);
                    }
                })
                .create()
                .show();
            return;
        }

        // 一度もパーミッションの要求をしていない or 今後表示しないにチェックをした上で”許可しない”にした時
        // 今後表示しないにしている場合はrequestPermissionsしても何も起こらないので、実質初回パーミッション要求時の対応
        // 初回とは初回起動という意味ではなく、パーミッションのON/OFF切り替え時も含まれる
        ActivityCompat.requestPermissions(this,
            new String[]{Manifest.permission.RECORD_AUDIO},
            REQUEST_CODE);
        }
    }
}

@Override
// パーミッション要求の結果を受け取る
public void onRequestPermissionsResult(int requestCode, String[] permissions, int[] grantResults) {
    if (requestCode == REQUEST_CODE) {
            if (grantResults.length > 0 && grantResults[0] == PackageManager.PERMISSION_GRANTED) {
                // パーミッションが必要な処理
            } else {
                // パーミッションが得られなかった場合の対応
            }
        }
    }
}
...

参考になるサイト

システム パーミッションの使用 | Android Developers
CheckSelfPermissionの注意事項 - リスクファインダーブログ
初心者のためのM Permissions入門 | TechBooster

影響力の武器 3.社会的証明

影響力の武器 1. 返報性 - Learn to Live and Live to Learn
影響力の武器 2.コミットメントと一貫性 - Learn to Live and Live to Learn
に続き、影響力の武器である社会的証明をまとめます。

社会的証明とは、遂行する人の多いことを正しいと思う心理

例えば、バラエティ番組の笑い声を聞いて(嘘だと分かっていてもみんなが笑っているから)面白いと感じたり、売上No.1という売り文句を見て商品を選ぶのは、社会的証明が働いています。

社会的証明の影響を受けやすいのは、状況が不明確で類似性のある人たち相手のとき

私たちは状況が不明確で自分では判断できないとき、周囲の判断に頼りたくなります。

また、自分と似た人の判断に影響されやすいです。
これは小説『若きウェルテルの悩み』(本当にざっくり言うと、主人公ウェルテルが好きな女性に振られたために自殺する物語です)が出版されたとき、ウェルテルを模倣した自殺が相次いだことからも言えます。←ウェルテルと同じように悩まれていた方々が亡くなられたのだと推測します。

社会的証明による集合的無知という現象は、命に関わることもある

1963年、20代後半の女性が仕事帰り暴漢に殺害される事件がありました。
この事件の恐ろしいところは、38人の隣人がこの事件を目撃したにも関わらず、誰一人通報しなかったことです。
彼ら彼女らは、人が死ぬことを何とも思わない冷たい人間だったのでしょうか。
そうではありません。
理由は大きく2つあります。

1つ目は一人一人の責任が薄いことです。
誰かが助けてくれるだろうと思えたことです。

2つ目が集合的無知です。
どのくらい危険なのか、自分は何をすべきなのか、状況が不明確なとき私たち人間は社会的証明を求めます。
そして、他人はどうしているかうかがうのですが、注意すべきは他人も自分と同じ人間だということです。
他の人も状況が分からず、でも周りにうろたえているところを見られたくないので、無反応のまま周囲をうかがいます。
お互いに無反応な相手を見て、何もしなくていいのだと判断し、誰も助けられなかったのです。

対処法、使い道

それでは私たちは社会的証明にどう対応していけばいいのでしょうか。

社会的証明にミスリードされないための対処法としては

  • 社会的証明には私たちが思っている以上の影響力があることを意識する
  • 自分が危機的状況にあるときは、相手を特定し(例、○○さん、そこの青いTシャツの人)自分の状況と何をしてほしいかを伝える

ことです。

使い道としては、売りたいもののターゲット層の人に商品の推薦をしてもらうなどが考えられます。

参考文献・参考URL

影響力の武器 | ロバート・B・チャルディーニ
集合的無知とは?【社会的証明】 | 恋愛心理テクニックで人を見抜く方法

データベースの中身を見る(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・チャルディーニ