8月24日(土)に行われたKotlinFest2019に参加してきました。
KotlinFestとは
Kotlinに関する知見の共有と、Kotlinファンの交流の場を提供する技術カンファレンスです。
今年はMPPのセッション多め
MPPそのものであったり、Kotlin/Native、Kotlin/JSなどのMPPの一部にあたるセッションが多めな印象でした。
逆にAndroid関係は少なめ。
私は普段Androidの開発しかして無いですが、マルチプラットフォーム、特にKotlin/JS触ってみようかなという気になりました。
会場の雰囲気
- 参加者にはトートバッグが配られ、このトートバッグがすごい可愛い。Kotlin可愛い。
- 軽食の提供があり、時間帯によって出ているものが代わり、ホワイエに出てコミュニケーションが活発になるような気遣い?などを感じた。
美味しそうだな〜🍔 https://t.co/hgYd7oxKk5
— kako@Android開発 (@kako_351) 2019年8月24日
ホワイエのスナックコーナーには、恐竜と団子が出てきたようです(^^)
— mixi engineers (@mixi_engineers) 2019年8月24日
ミクシィブースにも、ひよ子が待っています٩(๑❛ᴗ❛๑)۶#Kotlin #KotlinFest pic.twitter.com/5knUEx3esw
続々と美味しそうなデザートが搬入されてます🍰🍮🧁🍭#kotlinfest pic.twitter.com/gHvEBCVJmJ
— shoco310 / Kotlin Fest 2019 (@satoshoco) 2019年8月24日
企業ブースも複数出ており、セッションの合間のホワイエはいつも人でいっぱいだった。
スタッフの方の気配りや盛り上げで何もストレスなく気持ちよく参加できた。
懇親会のパックマンルールは今年も提唱されてた。 (懇親会未参加でしたが、オープニングで案内がありました。いいルールですよね。)
見たセッション
基調講演
Svetlana Isakovaさんによる基調講演がありました。めちゃ貴重。
What's new in Kotlin?
- 200万人以上がKotlinを使用
- 2010年にKotlinプロジェクトに参加したが、想像以上に大きくなった。
- Androidによって公式に採用されたことが大きい
Kotlinの歴史
1.1 Couroutine導入大きな変革 -> 1.3 でstableに 1.2 MPP
KEEP
KEEP = Kotlin Evolution and Enhancement Process
- keeping the language modenrn
- comfortable updates
- feedback loop
今のコードを壊さず進化をするバランスが大事
Experimental features
- 現時点で試せるKotlinの機能
- 実際に使った人からのフィードバックを得る
Inline Classes
- 何かのラッパークラスを使うとき、オーバーヘッドやヒープをクラスを呼ぶたびに使ってしまいパフォーマンスに影響がある。
- その問題を解決するためのInlin Class
- allocationを不要に増やすことないメリット
- val propertyを1つのみ定義可能
- 上手に使いたい
Contracts
- isNullOrEmptyで1.3からContract導入
- nullチェックしてもスマートキャストされなかったのがさるように
Immutable Collections
- 完全に変更不可能なListを追加した
- builder()でCollectionのImmutableを生成
- いずれ標準になる
Flows
- asPublisher
- asFlow
良さそうだけど、あんまり使いすぎてもごちゃつきそうなので、rxJavaやめてCoroutineに移行するのが良さそう。 移行できないほどの時などに使う感じかなという印象。
MPP
アプリケーション全体を共有することは目指していない 一部のみビジネスロジックのみを共有などを目指している
expect
actual
現在ですでに利用されている事例
- Ktor
- coroutines
- serialization
More about Kotlin
Kotlin コルーチンを理解しよう 2019
コルーチンとは何か
- 中断と再開を通常の関数に導入する
- コルーチン同士で協調的に動作する
- 今は、非対称コルーチン
- 親コルーチン。子コルーチン。
何が嬉しいのか
- 継続状況を表現しやすい
- スレットより軽量
Kotlinのコルーチンの仕組み
- suspend
- 普通の関数からsuspend関数は呼べない
- 最初どうやって呼ぶ
- supend() -> Unit
コルーチンライブラリ
- キャンセル
- 実行
基本
- コルーチンスコープ
- launch 結果を返さない
- async 結果を返す
runBlocking ブロッキングでコルーチンを実行
- runBlokingのScopeでlaunchすれば実行を待ってくれる
- job.cancel()
実行コンテキスト
- withContext CoroutineDispathcerを引数に渡す
- suspend try{}catch{}
スコープと構造化された並行性
- 並列化するには、CoroutineScopeでくくる
- コルーチンと設計
コルーチンスコープとアプリケーションライフサイクル
- スコープライブラリで、使うスコープを間違えない
- メインスレッドじゃないsuspend作るとき、メインスレッドから呼び出しても問題ならないようにする
Not Good
ViewModelScope.launch(Dispatchers,IO)
Good
ViewModelScope.launch {}
- テスト
- まだこうするべきというアプローチはない
- suspend関数のテスト
- runblocking
- Main以外のDispathreを書き換えられるようにしておく
- Roomの場合
- setQueryExecutor
改めて学ぶContracts
Constractって?
なんでできたのか
- 過度なコンパイラの制御
annotationでルールを加える
;
で区切り条件を複数指定できる
課題
- if/whenに対応してない
- try{}catchも対応していない
今後のサポート
- 変更あるかもしれない
- 1.4ではDeprecatedにはならなさそう
- KotlinConf2019で発表があるかも
- stableになるかどうかはわからない
Checked exceptions
- 一部の機能に対して例外を投げる
- Transactions
- sage builders
Kolin Multiplatform Project入門
- Napier
- Timber likeなLtlin Mppプロジェクト
MPP
Kotlin/Natiec ≠ Multiplatform Project 🙅♂️
Kotlin/Natiec ⊂ Multiplatform Project 🙆♂️
Kolin/JVM
- Android,Server
普段のKotilnのイメージに近い
Kotlin/Native
Kotlin/JS
- Kotlin→JavaScript
- DOMの操作もできる
- 動的型付け→静的型付けなので型情報は失われる
- TypeScriptは将来的にするかも
- dynamic型
- Any?
MPPのメリット・デメリット
メリット
デメリット
仕組み
- Commonモジュール作成
- Grafleのライブラリモジュール
- expect, actual
- abstract overrideと考えるとわかるかも
- MVPが推奨されている
フロントエンドもKotlinで描きたい
- JSコードに変換のうなKotlin標準ライブラリ
- Gradleプラグイン
- nmp/Webpackのコマンドを実行するGradleプラグイン
Kotlin1.1
- frontend-plugin は古い情報なので注意
最終的な成果物
- JSファイル、Webpackのバンドルファイル
実際のサイト(小鳥さんの自習室
https://github.com/subroh0508/otonashi-kotlin.dev
- Kotlin/JSでReact
- extarnal修飾子
まとめ
- MPP楽しそう。特にKotlin/JSは興味惹かれる。
- MPPの目指すところがビジネスロジックなど一部を共通化するだけという点が好印象
- Coroutineちゃんとやらなきゃという気持ちになる。
- この日の前日にKotlinのバージョンアップされてその対応の話などライブ感味わえるの会場だけ。
Kotlin可愛い。