Monthly archives: 3月, 2018

Firebase Analytics for Flutter

Firebaseコンソールにて

  • アプリ登録
  • パッケージとハッシュを入力。ハッシュ必須
  • googleさんから頂いたgoogle-services.jsonファイルをプロジェクトにイン!
    • google-services.json >> [project > android > app > google-services.json]

gradleに追加

  • 指示がでたとーりにproject > android以下のbuild.gradleを修正
...
buildscript {
    repositories {
        google()
        jcenter()
    }

    dependencies {
        classpath 'com.android.tools.build:gradle:3.0.1'
        classpath 'com.google.gms:google-services:3.1.2'// add
    }
}
...
...
//add to last of build.gradle
apply plugin: 'com.google.gms.google-services'

pubspec.yamlにプラグインを追加

...
dependencies:
  flutter:
    sdk: flutter

  firebase_analytics: ^0.3.0
...

importは analyticsとanalytics observer

  • あとFutureが帰ってくるので、import 'dart:async';も必要になる
...
    import 'dart:async';
	import 'package:firebase_analytics/firebase_analytics.dart';
	import 'package:firebase_analytics/observer.dart';
...

初期化処理

FirebaseAnalytics analytics = new FirebaseAnalytics();// add

void main() => runApp(new MyApp());

class MyApp extends StatelessWidget {
  @override
  Widget build(BuildContext context) {
    return new MaterialApp(
      title: 'Flutter Demo',
      theme: new ThemeData(
        primarySwatch: Colors.blue,
      ),
      navigatorObservers: <NavigatorObserver>[
        new FirebaseAnalyticsObserver(analytics: analytics)// add
      ],
      home: new MyHomePage(title: 'Flutter Demo Home Page', analytics: analytics),
    );
  }
}

使い方(すごく適当)

//for example to log
	//自由なイベント名でログを送信
    analytics.logEvent(name: "click_float");

	//パラメータにMapを追加してログを送信
	analytics.logEvent(name: "login_account", parameters: {"account": _googleSignIn.currentUser.email});

	//もともと用意されているイベント名を利用
	//例えばloginイベント
	analytics.logLogin();

動かないとき

  • package名!
  • ハッシュ!
  • build.gradle!2つとも!

Firebase > Analytics > DebugViewで見たいなら

adb -s [device] shell setprop debug.firebase.analytics.app [com.yourdomain.yourpackagename]


この記事のトラックバック用URL - http://mashi.exciton.jp/archives/329/trackback



Android開発時のAPKも実はしっかりと署名されてたりする

開発中のアプリも実は署名されてる

  • apkを端末やエミュレータで動かすにはたとえ AndroidStudioなんかで開発途中だったとしても署名が必要。
  • アプリの署名 | Android Studio

Android では、すべての APK はインストール前に証明書を使用してデジタル署名されている必要があります。

 

そんなのしたこと無い

  • 勝手に作られてるkeyfileで勝手に署名してくれてます。
  • リリース時は[Generate Signed APK]で明示的に署名をするが、それと同じことを勝手に裏でやってくれている

署名に使われてる証明書の場所

  • Windowsでも、Macでも、Linuxでも↓に相当する場所にあります。
  • $HOME/.android/debug.keystore

passwordとaliasは?

“”SDK ツールは事前に指定された名前とパスワードを使用してデバッグ キーストア/キーを作成します。
キーストア名 – 「debug.keystore」
キーストアのパスワード – 「android」
キーのエイリアス – 「androiddebugkey」
キーのパスワード – 「android」
CN – 「CN=Android Debug,O=Android,C=US」””

 

ハッシュ値が必要なんだけど

keytool -exportcert -list -v \
 -alias androiddebugkey -keystore ~/.android/debug.keystore
keytool -exportcert -list -v \
-alias androiddebugkey -keystore %USERPROFILE%\.android\debug.keystore
  • パスワードは[android]
  • MD5, SHA1, SHA256,を含めいろいろ情報が表示されます。

 

複数の環境で同じ署名にしたい

 


この記事のトラックバック用URL - http://mashi.exciton.jp/archives/294/trackback


FlutterのState, StatefulWidget, setState()について

StatefulWidget

  • StatefulWidgetがStateを内包する。
  • 状態を表す変数(ここではhogehoge)はStatefulWidgetではなくてStateが持つ
  • ここではbuild()もかかない
class MyWidget extends StatefulWidget {
  @override
  MyState createState() => new MyState();
}

 

 

State

  • StateはStatefulWidget(のサブクラス)ジェネリクスを持つStateを継承する
  • 状態を表す変数を持つ
  • レイアウトを構築するbuild関数をもつ。StatefulWidgetじゃなくてStateがレイアウトを構成する!
class MyState extends State<MyWidget> {
  int _hogehoge = 0; //状態を表す変数

  Widget build(BuildContext context) {
    return new Text("hogehoge is ${_hogehoge}");
  }
}

 

  • なんとなくStatefulWidgetがbuildをもっててレイアウトを構成していたほうが自然な感じはするが、オフィシャルではこういうやり方。

 

 

状態が変化した場合

  • StateのなかでsetStateを呼ぶ
  • 変数を変更してからsetState();しちゃいかんよ!
  • setStateに変数を変更するfunctionを渡すんだ!
class MyState extends State<MyWidget> {
  int _hogehoge = 0; //状態を表す変数

  void functionCalledByAnyone(){
    setState(() {
      _hogehoge += 1
    });
  }

  Widget build(BuildContext context) {
    return new Text("hogehoge is ${_hogehoge}");
  }
}

 

  • setStateについては変数を変更する前後でチェックが入ったり、適切なタイミングで変数の変更が行われるために、このような呼び方になっているみたい。
  • とはいっても、現状でこの程度のコードであれば何もしないfunction渡しちゃっても、別にフツーに動く。
  void functionCalledByAnyone(){
    _hogehoge += 1
    setState((){});
  }

 


どこのだれが変数を変更するか?


この記事のトラックバック用URL - http://mashi.exciton.jp/archives/268/trackback


SSH秘密鍵のSSH-AGENTをつかった管理ベストプラクティスを考えてみた

暗号化されたSSH秘密鍵のパスフレーズ入力を出来る限り省略、なおかつ安全に運用する

  • SSH秘密鍵のパスフレーズは必要
  • しかも11文字以上の長いものが推奨される
  • sshやgitのたびにパスフレーズをいちいち入力するのは大変
  • ssh-agentのプロセスを管理する
  • 必要なときにだけパスフレーズを入力(シェル起動時に入力とかしたくない)
  • ssh-addされた鍵を一定時間で自動消去

SSH秘密鍵にちゃんとパスフレーズをつけよう。

  • SSH接続に公開鍵認証を取り入れるのは当然ですが、秘密鍵にちゃんとパスフレーズつけてますか?
  • (※もちろんパスワードログインはちゃんとOFFにしてね!)
  • パスフレーズをめんどくさくて付けていない場合はPCやUSBメモリなんかに入った秘密鍵が漏れたら即アウトです。

パスフレーズちゃんとつけてます!

  • 何文字のパスフレーズを付けていますか?
  • 短いパスフレーズは↓くらいの時間で解除できるという実験結果もでてます。

SSH秘密鍵のパスフレーズは(つけるなら)11文字以上にしましょうねという話

CPU Intel Core i7 2.67GHz
(実験では1コアしか使っていない)

パスフレーズ文字数 解析にかかった時間
5文字 8秒
6文字 480秒
7文字 8時間
8文字 20日
9文字 3.3年
10文字 197年

ssh-agent

ssh-agentの問題点

  • 登録するときssh-addコマンドで秘密鍵ファイルを登録しなければいけない
  • 登録するとずっと生の秘密鍵が残ってしまい明示削除しなければずっと使える状態のまま
  • ssh-agentを一度起動すると、ログアウトしてもプロセスが残ったままになる
  • 解答された鍵ファイルはプロセスごとに残っているのでプロセスを再利用する必要がある

ssh-agentをプロセス管理して自動立ち上げ

  • .bashrcに書き込んで、シェル立ち上げ時にプロセスがなければ立ち上げる
  • 立ち上げたプロセスの情報を ~/.ssh-agent ファイルに保存
  • プロセスがあればそれを再利用
  • ファイルの有効時間を設定
#有効時間(好きな秒数に設定)
SSH_KEY_LIFE_TIME_SEC=3600
SSH_AGENT_FILE=$HOME/.ssh-agent
test -f $SSH_AGENT_FILE && source $SSH_AGENT_FILE > /dev/null 2>&1
if [ $( ps -ef | grep ssh-agent | grep -v grep | wc -l ) -eq 0 ]; then
    ssh-agent -t $SSH_KEY_LIFE_TIME_SEC > $SSH_AGENT_FILE
    source $SSH_AGENT_FILE > /dev/null 2>&1
fi

実際に使われるときにパスフレーズを入力させる設定

  • ~/.ssh/configのサーバー設定にAddKeysToAgent yes
  • .bashrcにてssh-agent -t secをしたのは.ssh/configには有効時間が設定できなかったため
    Host my-server
        HostName myhost.mydomain.jp
        User taro
        IdentityFile ~/.ssh/taro_secret_key
        AddKeysToAgent yes
    

ログオフの際にssh-agentのプロセスを終了させる。

このままだとログオフしても鍵が保存されたままになってしまうので、
ログオフ時にプロセスを自動で終了させる。

    ssh-agent -k

有効時間の前にssh-agentに登録されている鍵を削除する

  • 現在、登録されている鍵を一覧
    • ssh-add -l
  • 特定の鍵を削除
    • ssh-add -d [key_file_path]
  • 全削除
    • ssh-add -D


この記事のトラックバック用URL - http://mashi.exciton.jp/archives/250/trackback