Slide 1

Slide 1 text

Re: ゼロから始めるサーバー サイドKotlin ● toliner

Slide 2

Slide 2 text

About me ● トリナー @toliner_ (Twitter), @toliner (GitHub) ● justInCase(@justInCaseHoken)でKotlin書くバイトやってます ● ♥ Windows 10, JetBrains IDE, Kotlin, ASUS, Firefox ● ゲーム: R6S, Apex, Factorio, Arknights, SINoALICE, etc…

Slide 3

Slide 3 text

About me

Slide 4

Slide 4 text

質問等について ● 質問 -> ZoomのQ&A機能を使って質問して下さい ● 感想・意見等 -> できればTwitterで#kc3_2020を付けてツイートし てください。(Zoomのチャットでも良いです)

Slide 5

Slide 5 text

お品書き ● Kotlin入門 ○ IntelliJ IDEAでのプロジェクト作成 ○ Kotlin文法 ● サーバーサイドKotlin ○ フレームワーク・ライブラリ等 ○ 簡単なプロジェクトを作ってみる

Slide 6

Slide 6 text

Kotlin 入門

Slide 7

Slide 7 text

IntelliJ IDEAでのプロジェクト作成

Slide 8

Slide 8 text

Kotlin文法 お品書き ● 基本構文 ○ 関数・変数 ○ 制御構文 ○ クラス ● 応用構文 ○ ラムダ式 ○ 拡張関数 ○ コルーチン

Slide 9

Slide 9 text

Kotlin 基本文法 – Hello World!

Slide 10

Slide 10 text

Kotlin 基本文法 – Hello World!

Slide 11

Slide 11 text

Kotlin 基本文法 – Hello World!

Slide 12

Slide 12 text

Kotlin 基本文法 – Hello World!

Slide 13

Slide 13 text

Kotlin 基本文法 – 関数 ● Kotlinはクラス外(パッケージレベル、トップレベル)に変数・関数を 記述可能。 ● Kotlinの関数は fun 名前(引数): 返り値の型 {} という形で記述する ○ Kotlinにおいて、型定義は全て後置 ● 何も返さない場合、返り値にはUnitという型を用いる ○ Javaのvoid相当 ○ 返り値の型がUnitの場合、省略可能

Slide 14

Slide 14 text

Kotlin 基本文法 – 関数 例1

Slide 15

Slide 15 text

Kotlin 基本文法 – 関数 ● 1行で終わる関数(return文のみの関数)は{}とreturnを省略して=を用 いて記述できる。 ● =を用いる場合は型推論が働くので返り値の型は省略可能 ● Javaのvoidと違い、Unitは値なので=の後にUnitを返す関数を利用 可能

Slide 16

Slide 16 text

Kotlin 基本文法 – 関数 例2

Slide 17

Slide 17 text

Kotlin 基本文法 – 関数 ● Kotlinの関数では、デフォルト引数という物が指定できる。 ● デフォルト引数が存在する場合、呼び出し側はその引数を省略する 事ができる。 ● デフォルト引数は引数の型の後に= 値 という形で記述する

Slide 18

Slide 18 text

Kotlin 基本文法 – 関数 例3

Slide 19

Slide 19 text

Kotlin 基本文法 – 変数 ● 変数の宣言には、valとvarを用いる。 ○ valは再代入不可、varは再代入可。 ● val 変数名: 型 = 初期化式 の様に記述する。 ○ 特別な場合を除き、変数は必ず宣言時に初期化しなければなら ない。 ● 多くの場合、変数の型宣言は省略する事ができる。

Slide 20

Slide 20 text

Kotlin 基本文法 – 変数 例

Slide 21

Slide 21 text

Kotlin 基本文法 – 制御構文 ● Kotlinに存在する制御構文はif式, when式, for文, while文の4つ。 ● forは少し特殊で、CやJavaスタイルのforは存在しない。 ○ JavaやC#におけるfor-each構文に相当する物のみ。 ● Ifとwhenは式なので、値を返す事ができる。

Slide 22

Slide 22 text

Kotlin 基本文法 – 制御構文 例1

Slide 23

Slide 23 text

Kotlin 基本文法 – 制御構文 例2

Slide 24

Slide 24 text

Kotlin 基本文法 – クラス ● 基本的にはJavaと似ているが、コンストラクター周りが特殊 ● プライマリコンストラクターはinit {}という形で宣言する ● セカンダリーコンストラクターは constructor(引数): 別のコンスト ラクター() という形で書ける。 ● なお、Kotlinでコンストラクタを書くことは稀である。 ● Kotlinにおいて、クラスのフィールドをプロパティと呼ぶ。 ○ プロパティはJavaのフィールドと異なる性質を持つ。

Slide 25

Slide 25 text

Kotlin 基本文法 – クラス - プロパティ ● Kotlinにおけるプロパティは、Javaのフィールド + Setter/Getter の組み合わせである。 ○ C#のプロパティに近い。 ● カスタムSetter/Getter, プロパティの委譲, 委譲を用いての遅延初 期化等ができる。 ● クラスのプライマリーコンストラクタでプロパティを宣言できる。

Slide 26

Slide 26 text

Kotlin 基本文法 – クラス 例

Slide 27

Slide 27 text

Kotlin 応用構文 – ラムダ式 ● Kotlinにおいて、関数は第一級オブジェクとして扱われる。 ○ つまり、Int等のプリミティブ(っぽい)型や、ユーザー定義型の オブジェクトと同等に扱える。 ○ 具体的には、関数に対する関数呼び出しや、関数を引数に取る 関数、関数を返す関数、関数のプロパティ等を作れる。 ● 「関数オブジェクト」を作成する構文がラムダ式。

Slide 28

Slide 28 text

Kotlinの応用構文 – ラムダ式 ● 関数もオブジェクトとして扱えるから、当然型が必要である。 ● 関数を表すインターフェースとして、Kfunctionという物が存在す る ○ 主な用途はリフレクション ● 関数の型は (引数リスト) -> 返り値の型 という形で記述できる。 ○ 引数部分の名前の指定の有無は自由

Slide 29

Slide 29 text

Kotlinの応用構文 – ラムダ式 ● ラムダ式自体は、 { 引数リスト -> 中身 } という形で記述する。 ● ラムダ式においては、関数とは異なり最後の式の値が返り値として 扱われる ○ returnは不要。微妙に分かりづらい事がある。 ● 引数が1つの場合、引数リストは省略可能 ○ その場合、引数の名前はitとなる。

Slide 30

Slide 30 text

Kotlinの応用構文 – ラムダ式 ● 関数を引数に取る関数を呼び出す場合、主にラムダ式を用いて引数 を与える。 ○ 別な関数や関数型のプロパティに対する参照を渡す事もできる。 ● 関数の引数にラムダ式を用いる場合、その引数が最後の引数なら、 関数の引数リスト()の後ろにラムダ式を記述する事ができる。 ○ 文字で説明しても分かりにくいので例を参照

Slide 31

Slide 31 text

Kotlinの応用構文 – ラムダ式 例

Slide 32

Slide 32 text

Kotlinの応用構文 – 拡張関数 ● Kotlinには、拡張関数という、クラスに対して外部から関数を生や す機能がある。 ● 生やされたクラスのオブジェクトをレシーバーと呼ぶ。 ● 拡張関数はコンパイルされるとレシーバーを第一引数にとる関数に 変換される。 ○ そのため、privateなプロパティ等にはアクセスできない。 ● 頑張れば拡張プロパティも生やせる。

Slide 33

Slide 33 text

Kotlinの応用構文 – 拡張関数 ● 拡張関数は fun レシーバーの型.名前(引数リスト): 返り値の型 とい う形で記述できる。 ● 拡張関数にも当然型は存在する。 ○ レシーバーの型.(引数リスト) -> 返り値の型 という形で記述 ● 拡張関数の拡張関数の拡張関数の拡張関数なんていうアホな物も作 れる

Slide 34

Slide 34 text

Kotlinの応用構文 – 拡張関数

Slide 35

Slide 35 text

Kotlinの応用構文 – コルーチン ● 非同期処理を軽量に行うための仕組み ○ 言語仕様として導入されているのはsuspend関数のみで、ほと んどの実装はkotlinx.coroutinesというライブラリに存在。 ● 簡単な仕組みとしては、中断可能な関数を作り、スレッドプール内 で順番に動かしてる感じ。 ● JVM実装の場合は、JSの非同期処理とは異なりちゃんとマルチスレ ッドで動く。

Slide 36

Slide 36 text

Kotlinの応用構文 – コルーチン ● コルーチンの詳細説明は長くなるので割愛します。 ● 非同期処理である事と、以下の事のみ覚えてくれれば大丈夫 ● コルーチンで非同期処理をする関数は、suspend修飾子を付けなけ ればならない。 ● Suspend修飾子が付いた関数をsuspend関数と呼ぶ。 ● 通常の関数内でsuspend関数は呼べない。 ● Suspend関数内で通常の関数とsuspend関数は両方呼べる。 ● Suspendのラムダ式も作れる(引数リストの前にsuspendと書く)

Slide 37

Slide 37 text

サーバーサイドKotlin

Slide 38

Slide 38 text

サーバーサイドKotlin ● フレームワーク・ライブラリ等 ○ サーバーサイドのフレームワークについて ○ Kotlinのサーバーサイドフレームワーク ○ その他のライブラリ ● 簡単なプロジェクトの作成 ○ セットアップ ○ 簡単なHttpリクエストを処理する

Slide 39

Slide 39 text

サーバーサイドのフレームワークについて ● Httpの処理は面倒くさい。 ○ TCP通信とか面倒だし、非同期にやろうとするとかなり難しい ● そのため、Http通信部分やルーティング、パラメーターのパース等 を行うフレームワークが色々生まれる。 ● JavaのServletも一種のフレームワークだし、Http通信のみを行う 低レベルのフレームワークやそれをラップした高レベルなフレーム ワークなんかも存在する

Slide 40

Slide 40 text

Kotlinのサーバーサイドフレームワーク ● Spring/Spring Boot ○ Javaでも有名で人気なフレームワーク。Kotlin用の拡張モジュ ールが存在。 ● Ktor ○ 実質Kotlin公式のフレームワーク。 ● Http4K ○ Ktorの対抗馬っぽいサードパーティーのフレームワーク。某ベ ンチマークの性能ではKtorより上。

Slide 41

Slide 41 text

Kotlinのサーバーサイドフレームワーク ● 今回はKtorを採用 ● Kotlin公式のフレームワークである ● 一番書きやすく読みやすい(主観) ● バイト先で使ってるので慣れ親しんでる

Slide 42

Slide 42 text

その他のライブラリ ● kotlinx.serialization ○ Kotlin公式の汎用データシリアライズライブラリ。Jsonは標準 対応。

Slide 43

Slide 43 text

プロジェクトのセットアップ ● build.gradle.ktsを編集してリロードしてしばらく待てばGradleと IntelliJが勝手にやってくれます。

Slide 44

Slide 44 text

build.gradle.kts

Slide 45

Slide 45 text

Ktorの使い方 ● Ktorはマイクロフレームワークで、基礎では最小限の機能しか無い。 ● 様々なFeatureをinstall()する事で機能を追加していく。 ● src/main/resourcesにapplication.confという設定ファイルが必要 ○ 主にKtorのエンジンに関する設定を行う ● 主要なWebフレームワークとしての機能は組み込みでFeatureが存 在したり、Ktor公式でモジュールが存在してたりする

Slide 46

Slide 46 text

application.conf

Slide 47

Slide 47 text

Main.kt

Slide 48

Slide 48 text

単純なテキストを返してみる

Slide 49

Slide 49 text

単純なテキストを返してみる ● ルーティングはHttpメソッド名の関数を用いる ● ApplicationCallというインターフェースがClientからのリクエスト やServerからのレスポンスを司る ● call.respond○○系の関数でレスポンスを返す

Slide 50

Slide 50 text

単純なテキストを返してみる

Slide 51

Slide 51 text

単純なテキストを返してみる

Slide 52

Slide 52 text

簡単なHTMLを返してみる

Slide 53

Slide 53 text

簡単なHTMLを返してみる ● call.respondHTML: KotlinでHTMLを記述し、その結果を返す関数 ● Kotlinx.htmlというライブラリがあり、HTMLのタグに相当する関 数を呼び出す事でHTMLを記述する事ができる。 ● 型安全でかつ補完が効くので、HTML初心者にもやさしい!

Slide 54

Slide 54 text

簡単なHTMLを返してみる

Slide 55

Slide 55 text

Jsonの入力を受けてJsonを返してみる

Slide 56

Slide 56 text

Jsonの入力を受けてJsonを返してみる ● call.receive()を用いて、入力を様々な形で受け取る事ができる。 ○ 今回はContentNegotiation Featureをinstallしているので、そ れを用いてjsonをオブジェクトのデコードしている。 ● call.respondText()でjsonのContentTypeを指定し、返す値は kotlinx.serializationsを用いてjsonにエンコードする。

Slide 57

Slide 57 text

Jsonの入力を受けてJsonを返してみる

Slide 58

Slide 58 text

Jsonの入力を受けてJsonを返してみる

Slide 59

Slide 59 text

Ktor.io

Slide 60

Slide 60 text

Kotlin & Ktor最高! みんなでサーバーサイドで 遊ぼう

Slide 61

Slide 61 text

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

Slide 62

Slide 62 text

おまけ ● FPS(R6S, Apex)やる人募集してます。 ○ https://discord.gg/NaXA2tS ● Factorio, Craftopia等やる人とKotlinプログラマー募集してます。 ○ https://discord.gg/TGXYqA4