Slide 1

Slide 1 text

kotlinxライブラリの歩き方 〜 Kotlin公式エコシステムを使いこなす〜 2025年10月10日 Server-Side Kotlin Meetup vol.16 関根 純 @jsoizo

Slide 2

Slide 2 text

2 経歴 インターネット業界でソフトウェアエンジニアとして働いています。 スケーラブルなシステム、プログラムを作ることが好き。 自己紹介 関根 純 せきね じゅん 2023.01 コドモンに開発エンジニアとして入社 2024.01 育児休業(6ヶ月) 様々な副作用と向き合う 2025.01 新規プロダクトや基盤開発に従事

Slide 3

Slide 3 text

3 今日話すこと kotlinxについて server side kotlin meetupなので、 サーバサイドでの使われ方について絞って話します

Slide 4

Slide 4 text

4 今日話すこと kotlinxってなに? ライブラリの紹介 kotlinxライブラリの使い所 1 2 3

Slide 5

Slide 5 text

5 今日話すこと kotlinxってなに? ライブラリの紹介 kotlinxライブラリの使い所 1 2 3

Slide 6

Slide 6 text

6 CONFIDENTIAL - © 2022 CoDMON Inc. 6 突然ですが、kotlinxライブラリ山手線ゲーム Kotlin GitHub orgのリポジトリのうち、 名前にkotlinxを含むものはどれだけある??

Slide 7

Slide 7 text

7 CONFIDENTIAL - © 2022 CoDMON Inc. 7 こたえ: 17個 kotlinx-atomicfu kotlinx.serialization kotlinx-kover kotlinx-rpc kotlinx.coroutines kotlinx-benchmark kotlinx-browser kotlinx.collections.immutable kotlinx-io kotlinx-datetime kotlinx.html kotlinx.reflect.lite kotlinx-knit kotlinx-cli kotlinx-nodejs kotlinx.dom kotlinx.support https://github.com/orgs/Kotlin/repositories?language=&q=kotlinx&sort=&type=all グレーの背景はdeprecatedなものです

Slide 8

Slide 8 text

8 CONFIDENTIAL - © 2022 CoDMON Inc. 8 kotlinxのまえに, Kotlin stdlibのスタンス Kotlin言語の標準ライブラリ方針 (v1.0リリースノートより) “Kotlin has an extensive standard library that makes everyday tasks easy and smooth while keeping the bytecode footprint low.” ≒ 日常的な(頻出の)コードを簡単に書けるが、バイトコードを小さく

Slide 9

Slide 9 text

9 CONFIDENTIAL - © 2022 CoDMON Inc. 9 実用性(Pargmatism) Kotlin言語の標準ライブラリ方針 (v1.0リリースノートより) For us, pragmatism is about creating a user experience, not a language or a library alone. Many of the language design decisions were made under constraints like “Won’t this impede incremental compilation?”, “What if this increases APK method counts?”, “How will the IDE highlight this as you type?” ≒ 開発者体験や制約(Androidのメソッド数64K上限)をもとに言語設計する

Slide 10

Slide 10 text

10 CONFIDENTIAL - © 2022 CoDMON Inc. 10 なぜkotlinxが存在している? stdlibには入らないが便利な言語拡張。という立ち位置。以下の特徴をもつ (何がkotlinxなの?という明確な定義は公式ドキュメントには見つからず) ● stdlibには入らないがスコープ限定で実用的な機能を提供する ○ シリアライズ : serializaiton ○ コルーチンの”実装” : coroutines ○ 並行処理用プリミティブ : atmicfu ● Kotlin開発の支援ツールの提供 ● KMPで開発をしたいときの実現性不足を埋める ● Kotlin言語と独立した各ライブラリの機能改善サイクル

Slide 11

Slide 11 text

11 CONFIDENTIAL - © 2022 CoDMON Inc. 11 Multiplaformサポート よく使われるものはNativeな環境でも使えるようになっており、 クロスプラットフォームでKotlinを使うメリットを享受しやすくしている。 JetBrains製のAIエージェントフレームワークのKoogもKMP製 ↓は各ライブラリのサポート状況をLLMでまとめたもの

Slide 12

Slide 12 text

12 CONFIDENTIAL - © 2022 CoDMON Inc. 12 ktorやexposedはkoxlinxではない あくまで個人の解釈だが、 いわゆるJetBrains謹製FW, ライブラリたちとは明確に線引きがある。 kotlinxライブラリは基本的にkotlin.stdlibにのみ依存することが多く、 ランタイムの固有の標準パッケージ以外への依存を少なくしている。  (benchmarkとかrpcとかすべてがその限りではない)

Slide 13

Slide 13 text

13 今日話すこと kotlinxってなに? ライブラリの紹介 kotlinxライブラリの使い所 3 1 2

Slide 14

Slide 14 text

14 CONFIDENTIAL - © 2022 CoDMON Inc. 14 実際どういう物がある? kolitnxシリーズはおおよそ以下に分類される。 ● Kotlinアプリケーション実装のためのライブラリ ○ serialization, coroutines, atmicfu, immutable collection, html, rpc, browser, io, datetime, cli ● Kotlinアプリケーション開発支援のライブラリ(やGradleプラグイン) ○ kover, benchmark, knit 次頁から独断と偏見で選んだものをご紹介

Slide 15

Slide 15 text

15 CONFIDENTIAL - © 2022 CoDMON Inc. 15 kotlinx.serialization ● @Serializableなどのアノテーションを付与してKotlinの値を 任意のフォーマットに対してシリアライズ/デシリアライズする ● コミュニティ製も含めて様々な フォーマット に対応している ○ 公式かつstableなのはJSONのみ ○ 拙作ですがPHP Serialize用をOSSとして公開しています ● コンパイラプラグインによりシリアライズ処理を生成する ○ リフレクション不要である点がJacksonやGson比で良い部分 ○ これによりMultiplatformで同じコードが動くという恩恵が得られる

Slide 16

Slide 16 text

16 CONFIDENTIAL - © 2022 CoDMON Inc. 16 kotlinx.serialization @Serializable data class User(val id: Int, val name: String) val user = User(1, "John") !/ JSON val jsonEncoder = Json() val encoded = jsonEncoder.encodeToString(user) !/ {"id": 1, "name": "John"} !/ PHP val phpEncoeder = PHP() val encoded = phpEncoeder.encodeToString(user) !/ "O:4:\"User\":2:{s:2:\"id\";i:100;s:4:\"name\";s:4:\"John\";}"

Slide 17

Slide 17 text

17 CONFIDENTIAL - © 2022 CoDMON Inc. 17 kotlinx.coroutinesの前にstdlibのcoroutinesの話 Kotlin言語としては非同期処理に関する低レベルAPIを最小限だけ持つ ● suspend 修飾子による中断可能な関数の定義 ● Continuationインターフェースによる継続の表現 ● suspend 関数の中断/再開時のスレッドへの割当(dispatch) これらを完全に理解したうえでコードを書かないといけないの?? → No. そこでkotlinx.coroutines 参考: 内部実装から理解する Kotlin Coroutines:suspend関数・Continuation編

Slide 18

Slide 18 text

18 CONFIDENTIAL - © 2022 CoDMON Inc. 18 kotlinx.coroutinesの前にstdlibのcoroutinesの話 coroutineの機能を簡単に使えるようにし、 複雑なことを実現可能にするための高レベルなAPIを提供するライブラリ ● coroutineの概念を知らなくても非同期処理が書ける ○ launch, async/await ● 非同期処理を実装するための周辺領域 ○ テストの仕組みの提供(runTest, TestScope等) ○ デバッグツールの提供(DebugProbes)

Slide 19

Slide 19 text

19 CONFIDENTIAL - © 2022 CoDMON Inc. 19 kotlinx.coroutines !/ launch: 結果を返さない並行実行 launch { delay(1000); println("タスクA完了") } launch { delay(500); println("タスクB完了") } !/ async/await: 結果を取得する並行実行 val user = async { delay(800); "User: Alice" } val order = async { delay(600); "Order: #12345" } println("結果: ${user.await()}, ${order.await()}") !/ awaitで結果取得 !/ 複数API並行呼び出し val results = listOf( async {fetchData("foo")}, async {fetchData("bar")} ).awaitAll()

Slide 20

Slide 20 text

20 CONFIDENTIAL - © 2022 CoDMON Inc. 20 kotlinx.coroutines coroutineの機能を簡単に使えるようにし、 複雑なことを実現可能にするための高レベルなAPIを提供するライブラリ ● 非同期なストリーミング処理(Flow) ● 複数コルーチンの利用(Channel) ● スレッドプールの管理(Dispatchers) ● etc…

Slide 21

Slide 21 text

21 CONFIDENTIAL - © 2022 CoDMON Inc. 21 kotlinx.coroutines !/ 複雑な例: リアルタイムセンサーデータの処理パイプライン 適当に華氏で生成した気温値を間引いて出力 fun sensorDataFlow() = flow { repeat(10) { emit((-20!.120).random()); delay(50) } } sensorDataFlow() .filter { it > 50 } !/ 閾値フィルタ .map { (it - 32) * 5 / 9 } !/ 摂氏→華氏変換 .buffer(10) !/ バックプレッシャー .take(5) !/ 最初の5件のみ .collect { println("気温: $it°C") } !/ 複数Flowの合成 val flow1 = flow { repeat(3) { emit("A$it"); delay(100) } } val flow2 = flow { repeat(3) { emit("B$it"); delay(150) } } merge(flow1, flow2).collect { println("マージ: $it") }

Slide 22

Slide 22 text

22 CONFIDENTIAL - © 2022 CoDMON Inc. 22 kotlinx-datetime ● おなじみjava.timeパッケージを参考にしたKotlin版 ○ JVM用の実装はjava.timeのラッパー ○ 他プラットフォーム用はそれぞれjava.timeと仕様が揃うように実装 ● kotlinx.serializationでシリアライズ可 ○ クライアント, サーバでそれぞれKotlinであれば型が揃えられる ○ Android x JVMだと使う旨味はないのでjava.timeで充分 ■ java.timeのほうが機能が多かったはず(未確認)

Slide 23

Slide 23 text

23 CONFIDENTIAL - © 2022 CoDMON Inc. 23 kotlinx.collections.immutable ● いわゆるイミュータブルなコレクション ● listOf(): List で配列を宣言するとき... ○ JVMの場合だと実装はjava.util.Arrays.ArrayListとなる ○ mutableListOf(): MutableList も同様

Slide 24

Slide 24 text

24 CONFIDENTIAL - © 2022 CoDMON Inc. 24 kotlinx.collections.immutable data class Order( val items: List ) { init { require(items.isNotEmpty()) !/ 最低1つの商品が必要 } } val order = Order(listOf(item1, item2)) !/ 外部からルールを破ることができてしまう (order.items as MutableList).clear() order.items.isEmpty() !/ true

Slide 25

Slide 25 text

25 CONFIDENTIAL - © 2022 CoDMON Inc. 25 kotlinx.collections.immutable data class Order( val items: ImmutableList ) { !/ itemsの条件は同じなので省略 !/ 追加 fun add(item: OrderItem): Order { return copy(items.add(item)) } !/ 削除 fun remove(orderItemId: OrderItemId): Order { val newItems = items.filter{ it.id != orderItemId }.toPersistentList() return copy(newItems) } }

Slide 26

Slide 26 text

26 CONFIDENTIAL - © 2022 CoDMON Inc. 26 kotlinx-atomicfu (beta) ● アトミックな値の更新をするためのライブラリ ○ JavaでいうAtomicIntegerなどと同じ目的 ○ JVMで動かすならAtmicIntegerなどをそのまま使えば充分 ○ ないしstdlibのkotlin.concurrent.atomics/AtomicInt ■ AtomicIntはJVM実行時に内部にAtmicIntegerのフィールドを持つ ● コンパイル時に最適化されたコードに変換を行う ○ kotlinx.coroutinesの内部で利用しており、メモリ効率が求められるためstdlibの Atomicではなくこちらを利用している(自信ない)

Slide 27

Slide 27 text

27 今日話すこと kotlinxってなに? ライブラリの紹介 kotlinxライブラリの使い所 1 2 3

Slide 28

Slide 28 text

28 CONFIDENTIAL - © 2022 CoDMON Inc. 28 kotlinxライブラリを使うシチュエーション ● Kotlin開発用ツールが必要 ○ テストカバレッジ計測(kover) ○ マイクロベンチマーク(benchmark) ● Full Kotlinスタックである ○ 非同期処理をする場合にcoroutineが第一の選択肢となる ○ JSON変換も同様でserializationを使うのが手っ取り早い ● モバイルアプリ等でKMP(≒iOS)を利用している ○ データ型のFrontend-Backend間での共有 ○ serialization, rpc ● Kotlin製ライブラリ開発者である(後述)

Slide 29

Slide 29 text

29 CONFIDENTIAL - © 2022 CoDMON Inc. 29 Java製のアレでよくない? Spring Boot等Java製フレームワーク(FW)を使っている場合 デフォルトでJava製のライブラリが選択されがちである。 ● AutoConfigureまわりがいい感じに動く ● starterエコシステムの存在 ○ ライブラリを組み合わせるのではなくFWが提供するものを選ぶスタイル 非同期処理などもFWの文化に応じてReactor使ったり、 強い目的意識がないとkotlinxなライブラリを積極的に使う必要もない。 いい意味でBetter JavaとしてJava資産を使うほうが合理的。

Slide 30

Slide 30 text

30 CONFIDENTIAL - © 2022 CoDMON Inc. 30 だけど、いちkotlinエンジニアとして 極論、”Kotlinらしいコードが好きだから” という理由だけで選択しても良い デバッグ時やサンプルコードなど、 実際の業務においてはコードを書く時間より読む時間のほうが長い。 その時もっとも開発者が読みやすいコードで実装されていることは重要 僕の場合はJavaを業務で書いたことがなく KotlinやScalaのコードに慣れているのでKMPを使わないとしても積極的に Kotlin製ライブラリを選択する意思が強い。

Slide 31

Slide 31 text

31 CONFIDENTIAL - © 2022 CoDMON Inc. 31 Kotlinコミュニティとして ~OSS開発の観点から~ kotlin-csvの例 ● 当初はKotlin/JVM専用でファイルIO周りがjava.ioと結合した状態 ● コミュニティからKMP対応が求められる ● 互換性をある程度維持しながらkotlinx-ioベースへ変更を計画中 ○ https://github.com/jsoizo/kotlin-csv/issues/149 ○ なかなか時間が取れていないので仲間募集中...

Slide 32

Slide 32 text

32 CONFIDENTIAL - © 2022 CoDMON Inc. 32 Kotlin Native, Wasmなら活きそう Kotlinを用いた開発のイメージをくつがえして tooling, ホビー用途でKotlin(Native, Wasm)を選択することができる ● 簡易CLIツール作る : kotlinx-cli + 諸々 ○ Kotlinの”実用的な”言語としてのメリットを活かす ○ Goで良くないか?とは言わない ● エッジコンピューティング x SQLite互換DBaaS ○ Cloudflare Containers x D1, turso ■ Scalaだと先行事例がある ○ Next.jsで良くないか?とは言わない

Slide 33

Slide 33 text

33 CONFIDENTIAL - © 2022 CoDMON Inc. 33 まとめ ● kotlinxはstdlibに含まれない言語としての公式な拡張 ● 並行処理やシリアライゼーション等のライブラリを提供 しておりFull Kotlin環境においてはファーストチョイス ● Kotlin/JVMにおいて絶対的な選択肢ではない... ● が、ホビー用途などの他のサーバサイドの可能性が広がる

Slide 34

Slide 34 text

34 ご清聴ありがとうございました!

Slide 35

Slide 35 text

35 コドモン採用ページ 開発ブログ コドモンでは一緒に働きたい仲間を募集しています!

Slide 36

Slide 36 text

No content