# Kotlin Fest 2019 ざっくりまとめ @TaikiFnit [Kotlin Fest 2019 セッション一覧](https://docs.google.com/document/d/e/2PACX-1vSrhqi78mkNdsW0GN3otMfb8pznZ0_yTcich85KcsDnuWkz-FbydNIwO_0mXBAEPdbHY_Iupg2taZVb/pub) ## Keynote by Svetlana Isakova Jetbrains DeveloperのIsakovaより ### What’s new in kotlin #### Kotlin evolution Kotlin 1.1 でCoroutinesがexperimental Kotlin 1.2 : begin multi platform prject, kotlin native… #### Pragmatic evolution(実用的な発展)の原則 * モダンに保つ * kotlinではopen sourceにしてオープンなディスカッション * 快適なアップデート * 非推奨の警告 * アップデートの自動マイグレーション * フィードバックを取り入れるループ * kotlin loves the community ### Experimental features 今日から試せるKotlinのベータ機能! 新しい機能をアーリーアダプターにいち早く届けます #### Experimental Languageについて * 将来的に変わるかも * 使うにはExperimental機能を有効にする必要あり #### Experimental API * APIを使うには @Experimental などのアノテーションをclass等につける ``` @UseExperimental(xxxAPI) class ... ``` #### inline class #### Duration API duration and time measurement api for instance ``` fun greetAfterTimeout(millis: Long) greetAferTimeout(2) // meaning 2 secouds? ``` このような書き方だとわかりにくい 2が何を意味するかわかりにくい ``` fun greetAfterTimeout(millis: Long) fun greeAfterTimeoutSeconds(seconds: Long greetAferTimeout(2) // too verbose greetAferTimeout(Duration(2)) // 無駄なクラスも許容しちゃう ``` たくさん関数. 冗長的ー ここでインラインクラス登場 ``` inline class Duration(val value: Long ``` valによって宣言 例えば.. Creating Duration する場合 ``` val Int.seconds fun greetAfterTimeout(duration: Duration) greetAfterTimeout(2.seconds) ``` でかける これによって, No extra object is allocated #### Contracts 標準ライブラリで `String?.isNullOrEmpty(): Boolean`を呼び出す場合… ``` // brefore kotlin 1.3 var s: String? = "" if (!s.isNullOrEmpty()) { s.first() } // Compiler error only safe(?.) or non-null ... // using Contracts if (s != null && s.isNotEmpty() { s.first() // accepted } ``` ``` val anser: Int run { answer = 42 } // compier error println(answer) ``` Contractsはセマンティクスを伝える役割 ``` // using Contracts val anser: Int run { answer = 42 } println(answer) ``` なぜコンパイラは暗黙的にセマンティクス的な情報を伝えられないのか * 暗黙的に変わる可能性があるから * … ##### Contracts まとめ * runやisEmptyOrNullが楽になる * DSLも楽になる #### Immutable Collections Standard library: CollectionsのListはread-onlyでMutableListがmutable これを ImmutableListを導入してtrulyにimmutableなListを実装 それを継承したPersistantListはcan be modificate Persistant Collection Modificates * Modification operation は new collectionをreturnする. (originalのListを利用) * 既存のmethodsも利用可能 #### Flow suspend-based reactive stream ``` flow { emit(value) } .map { transform(it) } .filter ( condition(it) } .catch { exception -> log(exception) } .collect { process(it) } ``` 的な感じで書きたい ##### Integration with RxJava * flow.asPublisher() * publisher.asFlow() coroutines libraryに登場する予定 #### Muti platform Project Hugeで大切なストーリー expect / actual keywordの頂上 what is this. Multi platform projects … common codeを server, android, browser, ios で ビジネスロジックのみを共有し, UIはプラットフォーム依存 * expect 修飾子は, 共通のインターフェースを定義し, 実装はそれぞれのプラットフォームごとにそれぞれの独自APIを使いながら実装できる * actual 実装はプラットフォームごとに共有できる(?) ##### Multiplatform project まとめ ### Kotlinをもっと学びたいなら… Kotlin In Action がおすすめ Atomic Kotlinもね ( 自著紹介 and Kotlin course at Coursera フリー?の動画で学びましょう Hands-onで学びたいなら kotl.in/hands-on Have a nice Kotlin! ## Server-side Kotlin by Ktor by @kaonash_ B holl ### Server-side Kotlinの現状 * Java製ライブラリ使えるからJavaと同じエコシステムでスッキリ書ける * でもJava製ライブラリを使うと, 戻り地がT!型になってしまう. <- nullableかどうかわかんないけどとりあえずT型っぽい * null-safetyの世界が壊れる * Kotlin製のライブラリがあれば別に大丈夫 * あるの? <- 1,2年で実用レベルのライブラリが増えてきた * Kotlin, Ktor server, Exposed, Ktor client, Jackson, MockK などの技術スタックでやってる(弊社) ### Ktor について * Jetbrains製軽量・非同期Web Framework * けいたー * Pure Kotlin * Pluggable * #### 比較 ##### SpringBoot * Java界のデファクトスタンダード. * Kotlin対応 * 全備入りなので重い * Clean Architectureの視点から見ると, WebFrameworkはビジネスロジックから切り離すべきものであり, Springを使うと全てに依存してします ##### Jooby * 軽量高速 * Pluggable * Java micro framework #### 感想 * 起動が早いのは最高 * 必要なものは一通り揃っている ### 実践Ktor #### Hello World Gradleでktorを追加して以下のコードを実行するだけ ``` kotlin fun main(args: Array<String>) { val server = embeddedServer(Netty, port = 8080) { routing { get("/") { call.respondText("Hello World!", ContentType.Text.Plain) } get("/demo") { call.respondText("HELLO WORLD!") } } } server.start(wait = true) } ``` 本番環境等で利用する場合は拡張・設定が容易なEngineMain Classを利用 #### Routing StringでURL parameterなどを取り出せる #### Locations (experimental) parameterをtype safeで扱える [KtorのRouting定義のベストプラクティスを考えてみる - BizReach Tech Blog](https://tech.bizreach.co.jp/posts/324/ktor-routing/) #### 認証 * Basic, Digest, JWT, LDAP, OAuthをサポート * Routing定義にて認証が必要なrouteに対してのみ `authenticate` blockで囲めばok #### DI * DIはKtorは搭載してないので好きにライブラリ * Kodeinを使ったサンプル * [GitHub - Kodein-Framework/Kodein-DI: Painless Kotlin Dependency Injection](https://github.com/Kodein-Framework/Kodein-DI) #### Testing * RoutingのテストはKtorのTestEngine * withTestApplication()で仮想的にAPIのテストが可能 ##### MockKとKoinを使ったMocking DIされたModel.findをmock化するためには? [GitHub - mockk/mockk: mocking library for Kotlin](https://github.com/mockk/mockk) ## 今からはじめる Android Kotlin by @yanzm Master of Dagger at 技術書典7 **If you’re starting a new project, you should write it in Kotlin;** by Google io blog ### 公式サイト Watch your self ### Android StudioでKotlinをはじめる Android Studio 3.0以降はKotlin Pluginはインストール済み LanguageでKotlin選ぶだけ #### 既存プロジェクトでKotlin Android Studioに設定を追加してもらう1 : Choose Configure…でKotlin Android Studioに設定を追加してもらう2 : Kotlinファイル追加するだけでauto configure -> すると, build.gradleに kotlinが追加される mavenCentralやcompile(古い指定方法)が勝手に追加されたりする ので, 自分でbuild.gradleに追加したほうが良い #### Android Library モジュールで利用 New ModuleのLanguageでKotlin こっちの方法は, build.gradleを変更する必要なし #### Library ModuleでKotlinを使う場合 Java libraryしかないので, 一旦それで作ってKotlinに変換するとpure kotlinのLibrary完成 ### Kotlin Style Guide * [Coding Conventions - Kotlin Programming Language](https://kotlinlang.org/docs/reference/coding-conventions.html) * [Kotlin style guide  |  Android Developers](https://developer.android.com/kotlin/style-guide) * おすすめ guideに合わせる IDE のset fromからpredefined style #### Ktlint [GitHub - pinterest/ktlint: An anti-bikeshedding Kotlin linter with built-in formatter](https://github.com/pinterest/ktlint) ### JavaとKotlinの共存 * 既存のJavaコードをKotlinに変換する作業は学習効率が良い * `Convert Java File to Kotlin File` で愚直に変換できる * Kotlinの機能はあまり使われない * nullも適当 * このコードにKotlinらしさを出していくと学習にもなるし, 可読性も上がる #### Convert Java to Kotlin * !!などが残る * 便利な標準関数などは使われない * 標準関数は一通りチェックしよう * Kotlin.collections など #### Platform type @NonNull, @Nullable アノテーションがついていない時代のコードはPlatform typeになる nullがかえる可能性 ### frequency 誤解 * 最初からKotlinしなきゃ? * 途中からでも部分的でも * JavaのクラスはKotlinで使えるし, KotlinのクラスはJava ### Annotation Processing Kotlinでアノテーションを使うには -> Kapt Kaptを使うとDaggerが使えたり ### Kotlin Android Extensions findViewById使うと, textViewとかは自分で指定しなきゃいけない <- そういうのを解決するために[Butter Knife](https://jakewharton.github.io/butterknife/)とかがある KotlinではKotlin Android Extensionsがある importするだけで, textView.textのように参照できる. #### View binding findViewByIdを毎回呼び出すのではなくcacheしてくれる機能 by Kotlin Android Extensions ##### LayoutContainer(experimental) * 使わない場合 * `itemView.textView` で参照できるがキャッシュなし * 使う場合 ``` class viewHolder() : ... { bind() { item.textView // キャッシュされる } } ``` ### Parcelable implementations generator Javaの@parcelableに対応 ### Android KTX android framework や android x 向けのkotlin extensions集 ラムダや名前付き引数など * Core ktx : shred preferenceのeditをラムダにできたり * fragment-ktx * livedata-ktx * viewmodel-ktx * Android Architecture ComponentsのViewModelに対するextensions KTXは当たり前のように使われるので, まずは存在を知ることが大事 ### Android Studio Kotlin関係の機能 * kotlin plugin channel * early access使いたいときはこちら * Kotlin REPL * 対話できるよ * Show Kotlin Bytecode * コンパイルした結果見れるよ ( bytecodeにしてdecompileするとJava codeになる ) * Intenions * コードヒント * templete * テンプレート * Postfix Completion * コード補完 * `list.for`とかくと, `for (i in list) { }`が出てくる的な * Live Template * スニペット * `fun1`と書くと `fun (….) {}`が出てくるなど * language injections * 出てくる文字列が正規表現, SQLだよーとIDEに教えることでhighlightしてくれる * コメントで教えたり, Annotationしたり, 勝手に認識されたり * **正規表現なら, Check RegExpを右クリックで出すとvalidateができる** ### まとめ * 新規はKotlin! ## Deep Dive into Kotlin DSL by Junpei Matuda Kotlin DSL is Not Only Kotlin DSL ### DSL Domain Specific Language * A computer lang specialized to a particular application domain #### なんのために必要 * to simlify complex code * more readable, fluent * to improve productivety and reduce human error * get a power of type system etc. * 例えば, ドメインで方チェッカーがない場合DSLが役にたったり #### Definition * External DSL * SQL, CSS, reg exp… * Internal DSL * html, mock libs, di container… * **Kotlin DSL** * based on the host language * so not is a a #### Ktlinx.html * one of Kotlin DSL * DSL for html domain * generate html from kotlin syntax ### Tech of Kotlin DSL #### 言語の特徴1: Kotlinは静的型付け. なのでその恩恵を受けられる e.x. 動的型付けのGroovyをKotlin DSLで書くとコンパイル時にエラーを検出できる #### 言語の特徴2: syntax 関連の恩恵 ラムダ式使える ラムダ式便利だけどレシーバーとかも指定できたらもっときれいに書けるよね #### Tech of Kotlin : Break * スクラッチで簡単に書ける * タイプセーフ, ラムダきれいにを簡単に ### Kotlin DSLをより深く #### Extension Method Kotlin DSLにとっての継承の恩恵: * 3rd party libraryを変更せずにDSLsを書ける * 色々なテクニック使える * Kotlinx.html - Dom tree generator in Kotlin * +演算子でhtmlの属性をくっつけたり #### Operator Overload Kotlin DSLにとっての継承の恩恵: DSLのメソッドを演算子としてわかりやすくしたり #### Infix notation 中置関数. もDSLを使いやすくする様々なテクニック #### Delegation * KotPref (DSL for android shared preefrences) を使えばDelegateを使ってshared Preferencesを構造化し, type safe に美しく書ける #### Kotlin DSL for Java Javaのコードをインポートした時レシーバーで*this*が使えなかったり <- annotationを使えて, Kotlin DSLを使えば解決 #### Pseudo Dom tree builder 例えば, このKotlin DSLを使えばhtmlのhtmlの中しかheadができないなどのバリデーションをしてくれるなどができる #### DSLMarker DSLを使うために必要なライブラリ 便利だけどどこかでも言っていたようにレシーバーにアノテーションが必要なので既存のライブラリで使えなかったり. ## Deep Dive into Kotlin DSL by Junpei Matuda Kotlin DSL is Not Only Kotlin DSL ### DSL Domain Specific Language * A computer lang specialized to a particular application domain #### なんのために必要 * to simlify complex code * more readable, fluent * to improve productivety and reduce human error * get a power of type system etc. * 例えば, ドメインで方チェッカーがない場合DSLが役にたったり #### Definition * External DSL * SQL, CSS, reg exp… * Internal DSL * html, mock libs, di container… * **Kotlin DSL** * based on the host language * so not is a a #### Ktlinx.html * one of Kotlin DSL * DSL for html domain * generate html from kotlin syntax ### Tech of Kotlin DSL #### 言語の特徴1: Kotlinは静的型付け. なのでその恩恵を受けられる e.x. 動的型付けのGroovyをKotlin DSLで書くとコンパイル時にエラーを検出できる #### 言語の特徴2: syntax 関連の恩恵 ラムダ式使える ラムダ式便利だけどレシーバーとかも指定できたらもっときれいに書けるよね #### Tech of Kotlin : Break * スクラッチで簡単に書ける * タイプセーフ, ラムダきれいにを簡単に ### Kotlin DSLをより深く #### Extension Method Kotlin DSLにとっての継承の恩恵: * 3rd party libraryを変更せずにDSLsを書ける * 色々なテクニック使える * Kotlinx.html - Dom tree generator in Kotlin * +演算子でhtmlの属性をくっつけたり #### Operator Overload Kotlin DSLにとっての継承の恩恵: DSLのメソッドを演算子としてわかりやすくしたり #### Infix notation 中置関数. もDSLを使いやすくする様々なテクニック #### Delegation * KotPref (DSL for android shared preefrences) を使えばDelegateを使ってshared Preferencesを構造化し, type safe に美しく書ける #### Kotlin DSL for Java Javaのコードをインポートした時レシーバーで*this*が使えなかったり <- annotationを使えて, Kotlin DSLを使えば解決 #### Pseudo Dom tree builder 例えば, このKotlin DSLを使えばhtmlのhtmlの中しかheadができないなどのバリデーションをしてくれるなどができる #### DSLMarker DSLを使うために必要なライブラリ 便利だけどどこかでも言っていたようにレシーバーにアノテーションが必要なので既存のライブラリで使えなかったり. ## Kotlin/Nativeはなぜ動くのか by @youta1119 ### Kotlin/Nativeとは KotlinのコードをNative Binaryに変換 using LLVM * 各プラットフォーム向けバイナリ生成 * Cinterop: Cとの互換性 * Objcinterop: objc, swiftとの五感 ### なぜ動く? Runtimeがあるから動く -> KotlinはJVMで動く予定. だからメモリ管理等はJREにおまかせ このメモリ管理等を行うのがRuntime #### 標準ライブラリ Kotlin NativeではKotlin Native用に標準ライブラリを1から実装 with C++ ( Kotlinのみでの実装やKotlinで関数の定義, 実装はC++) 実装の例: print ``` kotlin // Kotlin側 @SymbolName("Kotlin_io_...print") // 関数の実体のシンボル名(C++関数名) external public fun print() // 関数の実体は外部にあるという修飾子 ``` #### メモリ管理 * GC * Cのライブラリを使うときは自前で #### プログラムランチャー * Kotlinのプログラムを起動するために利用 * Why needed? : プラットフォームによってKotlinプログラムの起動方法が違うから ### プラットフォームライブラリ * 各プラットフォーム固有のAPI. CInteropによって実装されている * CInterop: CとKotlinのブリッジ ### Kotlin NativeのソースがどのようにNative Binaryに変換されているか 知るためには, `kotlinc-native -Xlist-phases` #### Frontend Phase AST(構文木)に変換 (psi) psi viewerで見れる #### Psi2IR Phase ASTをKotlin-IRという中間言語に変換 #### backend phase Kotlin-IRをLLVM-Bitcodeに変換 (IRをbinary(2値)にしたもの ) ##### LLVMとは コンパイラのためのframework コンパイラはLLVM-IRという中間言語を出力するだけで各CPU Architectureにのっとった機械語を生成してくれる #### Linker Phase LLVM-Bitcodeからオジェクトファイルの生成 オブジェクトファイルは他の依存ファイルとリンクされて機械語に変換される