第71回Kotlin dojoを開催した(最終回)

今週は第71回(最終回)を開催しました!

 

前回の様子はコチラ↓ 

kdnakt.hatenablog.com

 

 

[第71回の様子]

2021/7/7に第71回を開催した。

 

今週はたくさん人がきて、自分をいれて6名での開催。

PC不調のため自分はナビゲータ役で参加。

 

勉強会本編の内容としては、Kotlin/Native Concurrencyハンズオンの第6章Debuggingの残り半分ほどを完了して、このハンズオンを完了した。

 

最後に5分ほど時間をとって、次回やりたいことについて話し合った。

自分の案としては、なにか教材を探してKotlinを継続してやる、Kotlin/Nativeでhttpサーバーを作るやつの続きをやる、他の言語をやるの3案用意してみたところ、Rustをやりたいという意見があったのでRustをやることに。

 

というわけでKotlin dojoは今回が最終回となりますが、次週からRust dojoをやっていきます。

 

[学んだことや疑問点]

  • Kotlin/Native Concurrency: 6. Debugging
    • captureTooMuchInit()を実行してみるところから。
fun captureTooMuchInit() {
    val model = CountingModelEnsure() // 下記のinitでensure〜が呼ばれる
    model.increment() // backgroundが呼ばれてfreezeしようとしてkotlin.native.concurrent.FreezingException
    println("I have ${model.count}") //ここには到達しない
}

class CountingModelEnsure{
    init {
        ensureNeverFrozen()
    }

    var count = 0

    fun increment(){
        count++
        background {
            saveToDb(count)
        }
    }

    private fun saveToDb(arg:Int){
        //Do some db stuff
        println("Saving $arg to db")
    }
}
    • 事前にensureNeverFrozen()が呼ばれているオブジェクトに対してfreeze()しようとするとFreezingExceptionが発生するということのようだ
    • その他の問題として、IncorrectDereferenceExceptionがある
    • これは外部ライブラリや共有コードを利用する場合によく起こる:元々メインスレッドでしかテストされていないため
    • 例えば、iOS開発でKotlin/Nativeの外からコードが呼ばれる場合に問題が発生する
// Kotlin/Nativeの世界
fun callFromOutside(sd: SomeData){
    println("Passed $sd")
}

data class SomeData(val s:String)

// ここからSwiftの世界
// メインスレッドでSomeDataを宣言
let sd = SomeData(s: "ttt")
DispatchQueue.global(qos: .background).async {
  // 非同期処理で別スレッドからSomeDataにアクセス
  BreedModelKt.callFromOutside(sd: sd) // IncorrectDereferenceExceptionが発生する
}
    • ネイティブコードでスレッドをまたぐ場合は十分に注意が必要!

 

[まとめ]

モブプログラミング・スタイルで、Kotlin/Native Concurrencyハンズオンを完了した。

今週はプルリクエストなし。

 

1年半にわたり、Kotlinの基礎的な文法の学習に始まり、Kotlinの演習問題や、Kotlin/Nativeの並列処理ハンズオンに至るまで多様な学びを継続できた。

kdnakt.hatenablog.com

 

来週からはRustを学んでいくぞ!