CircleCIでprivateなリポジトリをgit submoduleでアクセス出来るようにする

Projectのページ開いて右の方にある Project Settings を開く

f:id:iwata_n:20201119134855p:plain

左のメニューから SSH Keys を選ぶ

f:id:iwata_n:20201119134908p:plain

User KeyAdd User Key を押す

f:id:iwata_n:20201119134918p:plain

こんな感じに追加されたらアクセス出来る状態になる

f:id:iwata_n:20201119134927p:plain

あとはCircleCIのymlでこんな感じのを追加して呼び出せばOK

  init_git_submodule:
    steps:
      - run:
          name: Git submodule
          command: git submodule update --init

SpekでgetMainLooperをMockする必要がある場合の対応方法

LiveData使ってるクラスのテストをSpekで書こうとするとよく出てくるエラー。

エラー内容

Method getMainLooper in android.os.Looper not mocked. See http://g.co/androidstudio/not-mocked for details.

テスト用のTaskExecutorを用意する

class TestArchTaskExecutor : TaskExecutor() {
    override fun executeOnDiskIO(runnable: Runnable) {
        runnable.run()
    }

    override fun isMainThread(): Boolean {
        return true
    }

    override fun postToMainThread(runnable: Runnable) {
        runnable.run()
    }
}

SpekのGroupBodyに拡張関数を追加

fun GroupBody.applyTestTaskExecutor(executor: TaskExecutor = TestArchTaskExecutor()) {
    beforeGroup {
        // AACのテスト用設定
        ArchTaskExecutor.getInstance().setDelegate(executor)
    }
    afterGroup {
        ArchTaskExecutor.getInstance().setDelegate(null)
    }
}

テストでSpekのBodyで拡張関数を呼び出す

internal object ViewModelTest : Spek({
    applyTestTaskExecutor()
    
    Feature("...") {}
}

aarに含まれるsoが見つからない

これが正しい

artifacts.add("default", file('libname.aar'))

こんな感じに拡張子名を忘れるとライブラリが見つからないとエラーになる

artifacts.add("default", file('libname'))

pandasでステップ状のグラフを書く

import pandas as pd
df = pd.DataFrame([1, 3 , 5])
df.plot(marker='.')
df.plot(marker='x', drawstyle='steps-post') # drawstyleで指定

drawstyleで steps-post を指定するとステップ状になる

指定なしの場合

f:id:iwata_n:20200807150213p:plain

指定ありの場合

f:id:iwata_n:20200807150228p:plain

格安HDMIキャプチャでRX100M3をWebカメラ化する

f:id:iwata_n:20200710102713j:plain

こいつを使ってMacとRX100M3をHDMIケーブルで接続することで簡単にWEBカメラ化できた。 ケーブルは携帯用のディスプレイについてきたマイクロHDMIで接続してるけども、下に紹介してるようなケーブルでよさそう あとはモニタアームにジェネリックなゴリラポッドでくっつけて程よい高さを確保した。 ほとんど遅延もないのでZoomとかであれば高画質な顔を見せつけれそうです

mockkでメソッド呼び出しが行われていないことを確認する

mockkのMockには wasNot Called が用意されているのでメソッドにも使えるかと思ってたけども実は違っていたのでメモ

// これは間違い
verify {
  mock.method() wasNot Called
}

// コレが正しい
verify(exactly = 0) {
  mock.method()
}

じゃあ wasNot Called はいつ使うのかというと以下のようにMock全体に対して呼び出しが行われていないことを確認する時に使う。

verify {
  mock wasNot Called
}

参考: Cannot verify a mocked class's method was not called. · Issue #349 · mockk/mockk · GitHub