くうと徒然なるままに

モバイルアプリを作りながらバックエンドも作っています。

Azure Functions を NodeJS で動かす時には NodeJS のバージョンを8 or 10 にしなければいけない

NodeJS の LTS は 6,8,10 がリリースされています。 f:id:kuxumarin:20190319165300p:plain

nodejs.org

Azure Functions は開発ポリシーでLTS しかサポートされないそうです。

github.com

解決策

NodeJS のバージョンをNVM とかで切り替えれば良さそうですね。

Gradle 公式が出している kotlin-dsl のサンプル集リポジトリが良さそう

Kotlin-DSL を書こうとしていて色々つまづくことがあります。そんな時に参考にすると良さそうなリポジトリ

プレーンなやつからBuildSrc を利用したりするやつまである程度揃ってる。

github.com

Spek/Kotlin を使っている時に LiveData を利用した Unit Test を記述する

Live Data を使ったコードのテストを記述する場合にはメインスレッドで実行しなければいけない

Live data をUnit Test であれこれする時には、 MainThread で実行しなければいけないという制限が問題になります。 具体的には、 LiveData の setValue メソッドを呼び出す時には ArchTaskExecutor.getInstance().isMainThread() を呼び出して現在がメインスレッドで実行されているかの確認を行い、メインスレッドであれば実行するみたいなことをしてます。

Unit Test で実行する場合には、メインスレッドで実行されないため、問題になります。

普通にテスト記述していく場合には、 下記のようにaac の core-testing library に存在する InstantTaskExecutorRule() をTaskExecuter に当てはめてあげれば実行できるかと認識しています。

    @Rule
    @JvmField
    val instantTaskExecutorRule = InstantTaskExecutorRule()

Spek で実行する場合の問題点

Spek で Unit Test を記述していく場合の問題点として、「Spek ではSpekのコンストラクタに Lambda を渡し、その中に DSL 等を含みテストコードを記述していく」というものが存在します。

object MyTest: Spek({
    group("a group") {
        test("a test") {
            ...
        }

        group("a nested group") {
            test("another test") {
                ...
            }
        }
    }
})

spekframework.org

仮に書いたとしてもこんな感じで表示される.

f:id:kuxumarin:20190318084407p:plain

Spek で LiveData を利用した時にメインスレッド以外でもテストを実行できるようにする方法

上記で記したように ArchTaskExecutor というクラスを置き換えることで(?)普通のJUnit でLive Data なクラスを実行する時には実現してます。

実は、 ArchTestExecutor には、Executor を独自のものに置き換えれるメソッドが生えています。ということでそれを使い実行していけば大丈夫です。 具体的には以下のようなコードで大丈夫です。

    beforeEachTest {
        ArchTaskExecutor
            .getInstance()
            .setDelegate(object : TaskExecutor() {
                override fun executeOnDiskIO(runnable: Runnable) {
                    runnable.run()
                }

                override fun isMainThread(): Boolean {
                    return true
                }

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

            })
    }

    afterEachTest {
        ArchTaskExecutor.getInstance().setDelegate(null)
    }

GMO ペパボでインターンシップをしていました。やっていき💪

タイトルの通り最近何かと話題なGMO ペパボでインターンシップをしていました。

技術的な話はにゃーんなことが含まれてるとにゃーんなので基本的には書いません。

どんな感じ?

ポジションは minne の Android アプリ版開発です。

いわゆる業務のタスクを取ってよしなに開発を進めていく感じでした。

申し込んだ理由

以下の二つの理由より申し込んでみました。

両方の目的は達成できました。

開発について

微力ながらプロダクトの機能を追加・改善したりできました。

技術的にわからないところもありましたが、メンターの @ntsk さんに教えていただきながら~みたいな感じです。

感想

インターネットが好きな人が多そう。

インターネットというかTwitterですね。

心理的安全でやっていきとのっていきできる

会社には常に心理的安全が満ち溢れていて働いていてやっていきしやすい環境が整ってると感じました。

また、GMO yours というところで飲食できるのですが、ホント最高。(太った

いい感じの時期に ViewPager2 が話題になってたので 技術検討のissue に ViewPager2 の以降してはどうか?みたいなのを残してきました。

縁があれば将来ペパボで導入作業したいものですね。

GMO ペパボの人が書いた記事はこちら。

hr.pepabo.com

kotlin で lambda 関数の呼び出しログと回数を記録できる便利クラスを作ってみた。

Unit Test 等で lambda 関数 を使用しているところで呼び出しログと呼び出し回数を記録したいことはたまによくあると思います。

そこで、記録できる便利クラスを書いてみました。

機能

  • 呼び出しログの記録
  • 回数の記録と検証(指定された回数呼び出されてなかったらエラーになるように。

AwaitableLambda.kt

import java.util.*
import java.util.concurrent.CountDownLatch
import java.util.concurrent.TimeUnit
import java.util.concurrent.TimeoutException

class AwaitableLambda<T>(
    count: Int = 1,
    val Func: (T) -> Unit = {}
) : (T) -> Unit {

    private val latch = CountDownLatch(count)

    private val _callStack = Stack<T>()
    val callStack: List<T> = _callStack

    fun isComplete(count: Long = 1, unit: TimeUnit = TimeUnit.SECONDS): Boolean {
        if (!latch.await(count, unit)) {
            throw TimeoutException()
        }
        return true
    }

    override fun invoke(p1: T) {
        Func(p1)
        latch.countDown()
        _callStack.push(p1)
    }
}

一応、Unit Test も雑に書いてみた

internal class awaitableLambdaTest {
    @Test
    fun 関数が一度呼び出される検証を行う() {
        val awaitableLambda = AwaitableLambda<String>()

        awaitableLambda("")

        assert(awaitableLambda.isComplete())
    }

    @Test(expected = TimeoutException::class)
    fun 関数が一度も呼び出されないテスト() {
        val awaitableLambda = AwaitableLambda<String>()
        awaitableLambda.isComplete()
    }

    @Test
    fun 関数が過剰に呼び出されるテスト() {
        val awaitableLambda = AwaitableLambda<String>()
        awaitableLambda("")
        awaitableLambda("")
    }

    @Test
    fun 初期状態ではコールスタックに何も積まれていないテスト() {
        val awaitableLambda = AwaitableLambda<String>()
        Assert.assertEquals(0, awaitableLambda.callStack.count())
    }

    @Test
    fun コールスタックに1つ積まれるテスト() {
        val awaitableLambda = AwaitableLambda<String>()
        awaitableLambda("Hello")
        Assert.assertEquals("Hello", awaitableLambda.callStack.elementAt(0))
    }

    @Test
    fun コールスタックに複数個積まれるテスト() {
        val awaitableLambda = AwaitableLambda<String>()
        awaitableLambda("Hello")
        awaitableLambda("Work")
        Assert.assertEquals("Hello", awaitableLambda.callStack.elementAt(0))
        Assert.assertEquals("Work", awaitableLambda.callStack.elementAt(1))
    }
}

Kotlinで文字列から雑にDate のインスタンスを作れる拡張関数

必要そうだったから書いてみた。エラー処理とかないので場所に応じて使うべし。

fun String.toDate(format: String = "yyyy/MM/dd HH:mm"): Date = SimpleDateFormat(format, Locale.JAPAN).parse(this)

ex

"2019/1/2 3:4".toDate()

やっていきって何? :yatteiki: の謎を追ってみた!

導入

渋谷とか六本木とかにあるIT企業で働いてる人が良く使い言葉に「やっていき」というものがあります。
私もTwitterなどでノリで使っています。
とはいえどの雰囲気で使っておりどのような意味を持つ日本語なのかよくわからないため調べてみました。

使用例

私が観測している中では、 GMO ペパボさん、サイバーエージェントさん、メルカリさんあたりの人たちが使っている印象があります。(それ以外の会社でも使っていたら教えてください。

ペパボ

june さんのツイートを検索!

twitter.com

サイバーエージェント

メルカリ

twitter.com

ググってみた

辞書にはのってなさそう

www.weblio.jp

wikipedia

f:id:kuxumarin:20190311181051p:plain

CAでの用法

yatteii.fm というものが存在する!

yatteiki.fm

すんばらしい資料が!

www.wantedly.com

物事を前に進めていく、良くしていく

ペパボの人事のあちゃさんから教えていただきました。

結論

おそらくGMOペパボの社内で使われていた言葉が各社の交流に乗ってひろがっていったのかな??

やっていきとのっていきでいいじゃん!(うまくまとめたつもり

Android でプログレスリングを表示する方法。

そういえば、毎回ググってたなぁと思って書いた。

覚えるほどではないのに使うんですよね。。

<ProgressBar
                    android:layout_width="wrap_content"
                    android:layout_height="wrap_content"
                    style="?android:attr/progressBarStyleLarge"
            />