今週は第71回(最終回)を開催しました!
前回の様子はコチラ↓
[第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の並列処理ハンズオンに至るまで多様な学びを継続できた。
来週からはRustを学んでいくぞ!