画竜点睛を衝く@mapyo

日々やった事をつらつらと書くブログです

2017年の振り返り

立ててた目標の振り返りと、どんな事やってたかざっくり振り返っていきたい。

目標の振り返り

2017年の目標はこちら

2017年の目標は大きく3つだった

  1. Androidがんばる
  2. プルリク駆動勉強
  3. 運動

それぞれ1つずつ振り返っていこう

1. Android頑張る

主に3つを目標として上げていた。

これら3つは今の会社に入社してバリバリやれている。 今の会社だと、ほぼほぼkotlinで書いてるし、RxJavaも結構使っているし、クリーンアーキテクチャっぽいやつで書かれている。 胸を張ってめっちゃ出来るぜ!!と言えるほどではないけど、そこそこ出来てきた。といえるのではないだろうか。

2. プルリク駆動勉強

やりたいやりたいと思って、全然出来なかった。。。 Android Studioのバージョンアッププルリクや、細かいlintを直したプルリクくらいだった。 これは引き続き来年への課題である。

3. 運動

今年の途中から1駅分歩くようになって、多少は運動できている。今年の最初の方はゆるい感じで糖質制限をしてた。 1年前に比べると確実に2kgくらいは痩せているので、多少は効果あった気がする。 途中から減らなくなったし、食事も特に気にせず食べるようになったので、現状維持な感じ。

やったこと

ブログとかtwitterからやった事ベースで雑に振り返っていく。 年々、ブログ書く頻度が下がってるけど、書いとくと何やったか思い返せていいですね。

1月

  • 前職を退職して、現職に入社した。といっても、前職の最終出社は有給の消化があったので12月末頃。
  • 新年の目標を立てたら、その時のTweetに「数値目標以外はダメだ」とリプ頂いたのを見つけたw来年の目標は数値目標を入れようw

2月

  • ブログ特に書いてなかったし、記憶がない

3月

  • DroidKaigiで発表してきた。めっちゃ緊張した。
  • RxJavaとKotlinをバリバリやってる
  • CircleCIの4G制限に苦しんでた気がする
  • ポテチにオーディエンスとして参加してた

4〜6月

  • 難読化について調べてた
  • BLEとかやってたのかも
  • 今必要なものを変化に対応できる形で作れるのいいよなとか考えてた

7月

  • fastlaneでGoogle Playのベータ版にアップするようにしてた。これは、本当にやってよかったと思える事だったので、やってないAndroid開発者の方がいらっしゃったら絶対にやった方がいい。
  • Pythonのコードとも一時戯れていた。
  • ちょっと工数かかるけど、この方法でやるしかないか。。。と思って頑張って実装していて、完成直前までいってたけど、発想の転換でシュッとやればそんな事しなくていいしシンプルになると気がついて切ない気持ちになりながらシュッとやってた気がする

8月

  • 仕事大変だった気がする

9月

  • ずっとVysor使ってたけど、OpenSTFを自分のMacで使うようにしたらすんごいよかった

10月

  • ターミナルで実行した時に、時間がかかるコマンドが終了したら通知してくれるようにした。これは意外とよかった。ビルドとかしてる間にブログ書けるよ。
  • USBネタでDroidKaigiのCFP出した。出したの9月だったかも。
  • 仕事で始めてiOSアプリの修正を行った。大変だった。大変だった事をブログ書こうとしてたら忘れてた。

11月

  • DroidKaigiのCFPが無事通った。やっほい。

12月

  • 粛々と実装してた気がする。BLE接続周りについて、ゼロから実装してる。
  • ビルド途中にブロク書くのが流行ってたので、ビルド途中に会社のアドベントカレンダーのネタを書いたりしてた。
  • PS4地球防衛軍5を買って永遠とやってた。そのせいで腰を痛めた。

まとめ

2017年はいろいろあったけど、一番よかったのはKotlinやRxJavaや設計やBLEやUSBについて、それなりにやれた事だったのではないかと思う。他は、iOSを全くやった事がなかったけど、ちょっとでもやれたのがよかった。 新しい事をやるというのは、それだけでやる前とくらべて知識量が増えているのでいい感じ。 UI周りに関しては前職の方がしっかり出来てた気がする。

今年やってめっちゃ良かったことがもう一つあった。 Google Playのベータ版にアップロードするやつを自動化するのは、絶対にやった方がいい。本当にリリース作業が楽になったし、心理的な不安も少なくなりました。もしやってないところがありましたら、やりましょう。僕に飲みを2回分くらいおごってもらえたら僕が代わりにやってもいいくらいです(笑)

ずっと思ってることだけど、あれやりたいー。これやりたいー。と思ってメモしたりpocketに保存するんだけど、気がついたら月日がたって、やらなかったりする事が多い。この辺を上手くする方法ないのかな。結局はやりたい事をリストに書き出して、優先順位つけて日々コツコツやっていくしかないのかなぁ。

あとは、ここ最近ずっとAndroid開発してたけど、アプリよりもサーバの方がやりたい気持ちが高まってきた。アプリよりもサーバサイドの方が俯瞰してサービスを見れる気がするのと、サーバサイドは基本的にどのプロジェクトにも存在するのと、最近のクラウドサービスをいい感じに使った開発をやっときたいというところ。前にサーバサイドやってた時はオンプレだったので。

そんな事をやったり、思った2017年だった。思い返すと色々とあったなぁ。2018年に何をやっていきたいかは年明けて書いていこう。

Android plugin for Gradle 3.0.0からは、buildToolsVersionを指定しなくてもよくなったっぽい

https://developer.android.com/studio/releases/build-tools.html

このページの一番上に以下のように書いてあった。

You should always keep your Build Tools component updated by downloading the latest version using the Android SDK Manager. If you're using Android plugin for Gradle 3.0.0 or higher, your project automatically uses a default version of the build tools that the plugin specifies. To use a different version of the build tools, specify it using buildToolsVersion in your module's build.gradle, as follows:

Android SDK Managerを使ってBuild Tools componentの最新バージョンを使いましょう。 Android plugin for Gradle 3.0.0以上を使ってたら自動的にデフォルトのバージョン使ってくれますよ。もし違うバージョンを使っていたら以下のように指定して下さい。

なのでbuildToolsVersionは消してもいいのかなという感じ。

最近ブログあんまり書いてないから小ネタを刻んでいきたい。

時間のかかるコマンドの実行が終了した時にディスプレイに通知する

10秒とか20秒とか1分とか時間のかかるコマンドを実行する事はしばしばある。 この間ずっとiterm2を目視しているわけにもいかず、何か別の事をする。しかし別の事をしていると、コマンドが終わった時に気が付けない。10秒くらいで終わるコマンドを実行しているのに、気がついたら5分くらい別の事をしてた。なんてあるあるだ。

なのでコマンドの実行が終わったら通知して欲しい。

探したらいいのを見つけた。

qiita.com

そして、参考サイトのコピペするだけで動いた!

function notify_precmd {
    prev_command_status=$?

    if [[ "$TTYIDLE" -gt 1 ]]; then
        notify_title=$([ "$prev_command_status" -eq 0 ] && echo "Command succeeded \U1F646" || echo "Command failed \U1F645")
        osascript -e "display notification \"$prev_command\" with title \"$notify_title\""
    fi
}

function store_command {
  prev_command=$2
}

autoload -Uz add-zsh-hook
add-zsh-hook preexec store_command
add-zsh-hook precmd notify_precmd

さらに、これのいいところは、1秒より長いコマンドを実行した時には自動的に実行してくれるので、短いコマンドで無駄に通知されることもない。 これでちょっと便利になったー。

[追記] 実際にしばらく使ってみてはいるが、たまに通知してくれない時もあるようだ。。。

戦略とか戦術とか

あれ、どっちがどっちだっけ?と迷った時に、よくこのブログを思い出して検索する

d.hatena.ne.jp

不意に読もうという気持ちになってさくっと購入して読んでみた。

booth.pm

さくっと読めるのでオススメ。この中に戦略的設計と戦術的設計が出てきたのでブログを検索して読み直してみたのだった。 そんな今日この頃。

VysorからOpenSTFに乗り換えた

今まではVysorを使っていた

Vysor

Androidの実機をPCから操作したい時に主に使っていた。 ディスプレイにうつして他の人にデモしたり、テキストを入力する時に便利。

しかしながら、無料版だといくつかの欠点があった

  • 画質が悪い
  • たまに広告が勝手に起動する

特に音が出るアプリを開発している時は、スマホのボリュームをある程度上げている。その状態で音声つきの広告が再生されるとびっくりする事があった。 いろいろと考えてみると、OpenSTFを普通にMacにインストールして、自分専用にして使えばいいんじゃないか。。?と思ったので試してみた。

導入はMacであれば、基本的に

github.com

これを見ながらやればOK

よかったこと

  • 画質が荒くなく、普通にいい
  • PCでコピーしたURLをスマホのブラウザで開く時に便利(好きなブラウザで開くための機能がある。Vysorでもコピペして入れればOKだったが、機種によってはちゃんとコピペが出来ない時もあって不便だった)

わるかったこと

  • PCと接続すると、STFService is runningの通知がずっと出っぱなしになって結構気になる
  • ↑がアンインストールするまで消えない。
  • 何故かマナーモードにしていても、PCと接続すると勝手に解除されて音がちょっと出るようになる
  • 悪くはないけど、Vysorではスクロールで画面が移動していたのだがOpenSTFは出来なかった。。

こんな感じ。わるかったことに関しては今後、対応出来るものであれば対応していきたいけど、ざっと調べた時は出来なさそうな感触ではあった。。。 そんな今日この頃。

RxJavaでPublishSubjectをsubscribeした時にonErrorが呼ばれるとそれ以降動かなくなる

サンプルコード

        subject.subscribe ({ number ->
            println(number.toString())

            if (number == 3) throw RuntimeException()
        }, {
            println("onError")
        }, {
            println("onComplete")
        })

        subject.onNext(1)
        subject.onNext(2)
        subject.onNext(3)
        subject.onNext(4)
        subject.onNext(5)

実行結果

1
2
3
onError

4と5が表示されない

所感

onErrorに入った時にちゃんと気がつけないと、何故かいきなり動かなくなってる。。。! という辛みがあるので注意。

fastlaneを使ってGoogle Playのベータ版にアップする

http://mapyo.hatenablog.com/entry/2017/07/23/032630

この辺で日々のビルドをするためにfastlaneを使ったので、次はGoogle Playにアップするところで使ってみる。

いきなり本番は流石に辛いのでベータ版にアップする部分を自動化して、手元で確認してから、Developer Console上で操作して本番に公開という流れをとりたい。

fastlane的なbetaとFabricのBetaとデベロッパーコンソールのBetaといろいろ混同しそうなので注意。

基本的な導入周りはこの辺でいい感じに出来てる

http://qiita.com/gupuru/items/9ddeff0906b02d779ed9

公式ドキュメントも参照

https://docs.fastlane.tools/getting-started/android/setup/

認証情報の設定

https://docs.fastlane.tools/getting-started/android/setup/#collect-your-google-credentials

この辺を見ればOK。内容的には同じだけど、僕のメモを書いとく

  1. Google Play Consoleにアクセス https://play.google.com/apps/publish/
  2. 左上のハンバーガーメニューをクリック
  3. 設定→APIアクセス
  4. サービスアカウントを作成をクリック
  5. ダイアログが表示されて、説明に書いてある通りにGoogle Api コンソールに移動
  6. サービスアカウントを作成
  7. サービスアカウント名を入れる。役割はプロジェクト→サービスアカウントアクターを選択
  8. 新しい秘密鍵の提供にチェックを入れる。キーのタイプはJSON(デフォルトでそうなってた気がする)
  9. 作成をクリック
  10. 秘密鍵が作成されてダウンロードされるので、大事に保存しときましょう
  11. Google Play Consoleに戻って、出てたダイアログの完了をクリック
  12. 新しいサービスアカウントが出来てる事を確認
  13. 新しく出来たやつの、アクセスを許可をタップ
  14. 権限で、「アルファ版とベータ版の APK の管理」以外の権限すべてをOFFにする。これで安心。
  15. ↑と思ったら、「表示設定」の権限は最低限必要だった。アプリ個別に設定するか、全体に設定するかが必要そう。
  16. 終わったらユーザを追加をクリック(しかし、何で権限の変更をしたつもりがユーザの追加になるんだ?権限の設定が終わって初めてユーザを追加するという意味なのかな。)

という感じでもろもろ設定が終わり。権限を絞っているので、何か起きたとしてもアルファ版かベータ版がどうにかなるだけなので、ある意味安心出来る(笑)

ダウンロードしたjsonを好きな場所に置いて、

fastlane/Appfile

ここに追記すればOK

fastlane側の設定

https://docs.fastlane.tools/getting-started/android/beta-deployment/#supported-beta-testing-services

この辺を見て設定する

今回追加したlaneはこちら

  lane :googleplay_beta do
    gradle(task: "clean assembleRelease")
    supply(track: 'beta')
  end

ハマったところは、ここの設定じゃないんだけど、サンプル用にGoogle Play上にアプリを作ったんだけど、公開するために必要なものを一通り設定して、1回でも公開(ベータ版でも可)しないとapiでアップする事が出来なかった。。。

mapping.txtとかどうするの?

BITRISEを使っていると、 deploy-to-bitrise-ioというstepをとりあえず実行しとけば apkとかも含めてそのビルドに保存してくれるので楽。

所感

これでgoogle playのベータにアップするところが自動化出来て最高。という感じ