Kotlin Fest 2024 で驚いたところメモ

多分聞き間違えたりしているところがあると思いますが、面白かったり驚いたところを太字にしたりして、共有します。

Kotlinを愛でようというコンセプト。

## KotlinConf 2024 を後から256倍楽しむためのヒント
@ masaruhr さん

### キーノートは？

K2:
コンパイル時間、ハイライトまでの時間が短くなる。文法的な変更は最小限に。"K2のKotlin IDEプラグインの中を覗いてみよう♪"で聞けそう。

Multiplatform:
Fleetという多言語対応のIDEを出している。Swiftとかも触れる。

IDEの生成AIの機能など

### どうやって見るか？

**タイトルとChatGPTのサマリーを見て、良さそうだったら動画を見るというのがおすすめ。以下にまとまっている。**

https://docs.google.com/spreadsheets/d/1v1BTe7zIE84uY8i97XfE98mCmY-8OlsPnKKiY-8k4KQ/edit

JetBrainsはコミュニティ支援を色々やっているという話。イベント開くとライセンスがもらえるなど。

# 今こそ始めたい！Compose Multiplatform

[Kotlin Multiplatform Wizard](https://kmp.jetbrains.com/)で始めるのがダウンロードして始めるのが簡単でおすすめ

Previewできない問題。
androidMainにPreview置くか、commonMainにPreviewをおいてFleetを使う。
(以下のような方法もある。)

https://x.com/new_runnable/status/1804343240692314171

iOSではBackHandlerやDeeplinkは未サポート。
以下のようなツイートもあった。

https://x.com/yuu1111main/status/1804343932702331052

iOSのUIAlertControllerをComposeから表示したりもKotlinで書いて実装できる。

DIはinterfaceをcommonMainにおいて、プラットフォームで実体を入れたりして行う。

## サーバーサイドKotlin

### 最近のサーバーサイドKotlinで使えるフレームワーク

#### Ktor
軽量。プラグイン機能により、柔軟な機能追加ができる。

#### Micronaut
マイクロサービス、サーバーレスアプリケーションのためのJavaフレームワーク。Ktor構文もサポート。

#### gRPC-Kotlin。
protobufからKotlinコードを作って、使うことができる。
gRPCを使わない場合はMicronautとか考えられる。

(Ktorを選択、軽量高速。アップデート追従など。発展途上ではある。)

### DI

Daggerは複雑などがあり、Koinを選んだそう。

こんなツイートも。

https://x.com/tokuhirom/status/1804353051660292356

### O/Rマッパー

#### Exposed: JetBrainsのO/Rマッパー
SQLっぽくかけるDSLか、DAOか2つのアクセス方法がある
昔からあるが、今年中に1.0に

#### JOOQ: もともとJavaのフレームワーク。
テーブルスキーマからコード生成できる。Kotlinも生成可能。
R2DBCによるノンブロッキングI/O対応。

#### Ktorm
JDBCに基づいたKotlin用の軽量 O/Rマッパー


どれを選んだか？JOOQ。テーブルスキーマからコード生成できるのが大きい。成熟している。
Exposedは今後有力な選択肢になるかもしれない。


### テストフレームワーク
#### Kotest
裏側はJUnit
データ駆動テストなど強力な機能がある。
DescribeSpecを使うと階層化して、テスト書ける。良さそう。

#### Spek
BDD形式で書ける
Spek 2.xではマルチプラットフォームも念頭において開発された。
ただ、最新リリースが2年前。
DescribeSpecと同じものが使える。

(技術選定をした理由を話しているいいセッションだったので、サーバーサイドの開発をKotlinでしている人は一回見ておくと参考になりそうです)


#### Kotlinの未来
サーバー開発において、一番人気ではない。
言語の利便性やクオリティが高い
やっていき

## KotlinのLinterまなびなおし2024

detektはルールがKtLintの3倍ぐらいある。

detektのフォーマッターは拡張機能で、detektのformatはissueで議論されているので気をつけたほうが良さそう。

Composeのカスタムルールセット: Jetpack Compose Rulesというがある。KtLintでもDeteKtでも使える。(30種)。もともとのTwitter社のものはアップデートされていないので注意が必要。

大きな規模ではDetektでそれ以外はKtLintがいいのではということだった。

Konsistはアーキテクチャや宣言の検査。
例えばUseCaseのクラス名や、クラス内にメソッドは一つ。パッケージ間の依存関係など。
**Konstは別でモジュールを作ってそこから参照して、管理するのがおすすめらしい。**

## Building Kotlin Multiplatform Libraries in 2024

なぜKotlin Multiplatformでライブラリを作るか？ ライブラリが、Android専用かーみたいになってしまう。

Library authors guidelineというKotlin公式のガイドが更新された。

APIの互換性。ビルド時のエラー。
ABIの互換性。実行時のエラー。
挙動の互換性。想定外の挙動。

ABIの互換性を担保するには、data classを使ってはいけなかったり、関数の引数を増やさないなど。
kotlin binary-compatibility-validator を入れて確認するのが良い。

**Kotlin nativeのクロスコンパイルのissueはこれとその関連issue。現状はmacosビルドが必要でその対応が検討されている。(これ気になっている情報だったのでありがたい)**
https://youtrack.jetbrains.com/issue/KT-52666/Kotlin-Multiplatform-libraries-without-platform-specific-code-a.k.a.-Pure-Kotlin-libraries-Universal-libraries

新規ユーザーはpublish方法が変わって、サードパーティのpublishのGradleを入れないといけない。このスピーカーの方が作った方法もあるそう。
ライブラリを作ったら以下で宣伝できる。
https://libs.kmp.icerock.dev/
Kotlin Foundation Grantsなどのお金がもらえるプログラムもある。

# K2時代のKotlin Compiler Plugin開発

コンパイラで行われるフェーズの説明があった。

**色々メモを書いたんですが、まとめると、FrontendとBackendのフェーズがあって、Extensionというのを使うとCompiler Pluginでそのフェーズの拡張ができる。例えばgreet関数を増やしたければ、functionを追加するExtensionを使うとFrontendのフェーズで関数定義を追加し、別のExternsionを使ってBackendでその関数の実装の追加を行ったりする。**
**おすすめのセッションです。**

<details>
大きく分けてFrontendとBackendがある。Frontendは意味解決など。Backendは割と最適化やプラットフォームのためのやつが多い。

Compiler PluginはFontendもBackendも介入できる。
FirSupertypeGenerationExtensionを使うとスーパータイプの追加ができたりなど。
FrontendのSuperTypeフェーズに介入したりする。
FirDeclarationGenerationExtensionだと複数のフェーズに介入し、独自のコードをいれるなど。

FirExtensionが上のExtensionたちの基底クラス。FirSessionComponentがFir拡張の実装に必要な情報を提供する。
Predicateを基軸に実装されている。Predicate = シンボルのマッチングパターン。アノテーションベースに処理対象を特定する。

2種類のPredicate、LookupPredicateマッチするシンボルを返却。
DeclarationPredicateは宣言がマッチするかを判定 (true false)

Predicateの利用パターン。@ Markerというのを使っていたら、annotated(FqName("Maker"))で取り出せたり、parentAnnotated(FqName("Maker"))でメソッドをとりだしたりできる
Predicateはアノテーションベースで動くので、アノテーションはTYPESフェーズで動くので、COMPILER_PREQUIRED_ANNOTATIONSで先にアノテーションを登録しておく必要がある。

バックエンドに関してはIrGenerationExtensionを使って介入できる。IRノードの変換などができる。IRの改変はIrElementTransformerを使ったりする。

Pluginのアーキテクチャ。SubpluginOptionがKotlinが受け取って、CompilerでCompilerConfigurationにマッピングする。

### 例
@ Greetableをつけるとgreetメソッドが生えて挨拶してくれるPluginを例に話す。

モジュールはアノテーションとコンパイラープラグインとテストを作る。
テストのモジュールででkotlinCompilerPluginClasspPathでコンパイラープラグインのモジュールを指定する。
Frontend拡張の実装では、GreetablePredicateを定義して、DeclarationPredicate.createでアノテーションのpredicateを作る。FirDeclarationGenerationExtensionを継承して、getCallableNamesForClassを実装し、そこでpredicateをみて、アノテーションがついていればマッチするように返して、genreateFuctionも実装して、createMemberFunctionという関数で関数を生やす。
その追加した関数の中身を実装はバックエンドでやる。IrGenerationExtensionのgenerateを実装し、Transformerを渡す。Transformerの実装ではIrElementTransformerVoidを実装し、pluginContext.referenceFunctionsでprintlnのsymbolを作成し、それをvisitSimpleFunctionで、処理対象をフィルタリングして、plluginKeyっていうので、フロントエンドで生成したものを特定できたりする。
symbolにIrBuilderでirBuilder.irBlockBody {}内でprintlnを実装する。printlnの関数呼び出しはirCallを行う。

これらのExtensionをCompilerPluginRegistrarで登録する。
</details>

### 活用例

Composeなど
Time Travel Debuggingプラグインというのを作った、過去の状態をキャプチャして、再現できる。
これをWeb Soketで実現している。

https://github.com/kitakkun/back-in-time-plugin

## Ask the speaker

(ここでAsk the speakerでセッションから離脱)

> どうやってこのフェーズの情報得たの？

そういうコメントがたくさん書いてあるファイルが有った。

> Time Travel DebuggingのあのUIのツーリングどうしている？

Flipperプラグインを使っている。つなげる仕組みが使える。依存してしまうのはややこしいがiOSでも使えそう。今はそのあたりの開発をしている。

> Compiler Pluginって今IDEに読み込まれるの？

今実はgreeting関数はIDE上では赤くなったりする。
JetBrainsの方: Alphaのやつでいけるようになると思う。


(ここから"K2のKotlin IDEプラグインの中を覗いてみよう♪"の発表をしたJetBrainsの方がいらしたのでその方とのメモ)

> Kotlinで公式フォーマッター作らないの？

とりあえずインスペクターだとQodanaあるので見てみて。

> (スクショテストのライブラリ作ってるんだけど、)Kotlinコンパイラって割とコードダンプベースのテストだけど辛くない？

PRを小さくすることと、割と再生成することで大丈夫だよ。

> K2ってmainブランチで開発したの。？

フラグ + フォルダ分けで開発されてた。

> Amberって結局拡張したくなるんじゃない？？

そういうのも考えてる。


## K2のKotlin IDEプラグインの中を覗いてみよう♪

以前のIDEプラグインは解析エンジンを共有するのは決まっていたが、どうやって共有するのかが決まっていなかった。**キャッシュして、Lazyにしてやっていた。スレッドでロックしてしまっていたりして、そのロックが外せなかったのを、解決しようとした。**
**フェーズ分けして、並列化できるようにした。今はlockがない。パフォーマンスが良くなった。また今までできないことができるようになった。今まではfind usageを解析している間は、ハイライトされなかったが、ちゃんとされるようになった。**
今までは何かを消したときに、すべてのモジュールのグラフの情報を消して作り直していた。それが改善されたりした。ソースコードだけでなくライブラリも。
Metadataにprotobufにデータ入れて、IDEなどから受け取っていたが、それが今まではLazyで受け取っていた。ただ、Classの情報でStubだけにした。今まではメモリモリモリで開発していたが、2GBで割と動くようになった。

one more thing
**Kotlin Analytics API。おそらく初めての発表。Kotlinコードを解析するライブラリ。ドキュメントがあり、マイグレーションガイドもある。 CLIでコマンドラインでも使えるようになる。KSP, Dokkaなどでもう利用されている？そう**

## Kotlinの歴史を可視化する

**分析の原則ととして以下がある**
**Overview first, zoom and filter, then details-on-demand**

分析手法を学べるセッション。
いつ頃からSwift対応が始まったかなどがわかる。

# 感想

会場での印象として、スポンサーでもかなりいたりして、意外とサーバーサイドでKotlin使っている人の割合が意外と多いのではと思いました。
Compose Multiplatformなども話題に上がっていて、Kotlinの今後の可能性に期待したいですね。