Upgrade to Pro
— share decks privately, control downloads, hide ads and more …
Speaker Deck
Features
Speaker Deck
PRO
Sign in
Sign up for free
Search
Search
KC3「Re: ゼロから始めるサーバーサイドKotlin」
Search
トリナー
September 06, 2020
Programming
0
170
KC3「Re: ゼロから始めるサーバーサイドKotlin」
KC3 2020で発表した「Re: ゼロから始めるサーバーサイドKotlin」のスライドです。
トリナー
September 06, 2020
Tweet
Share
More Decks by トリナー
See All by トリナー
AWS CDKのKotlinラッパーを作った話
toliner
1
540
Other Decks in Programming
See All in Programming
Figma Dev Modeで変わる!Flutterの開発体験
watanave
0
140
cmp.Or に感動した
otakakot
3
200
とにかくAWS GameDay!AWSは世界の共通言語! / Anyway, AWS GameDay! AWS is the world's lingua franca!
seike460
PRO
1
900
카카오페이는 어떻게 수천만 결제를 처리할까? 우아한 결제 분산락 노하우
kakao
PRO
0
110
Why Jakarta EE Matters to Spring - and Vice Versa
ivargrimstad
0
1.1k
アジャイルを支えるテストアーキテクチャ設計/Test Architecting for Agile
goyoki
9
3.3k
Arm移行タイムアタック
qnighy
0
330
.NET のための通信フレームワーク MagicOnion 入門 / Introduction to MagicOnion
mayuki
1
1.7k
[Do iOS '24] Ship your app on a Friday...and enjoy your weekend!
polpielladev
0
110
受け取る人から提供する人になるということ
little_rubyist
0
250
聞き手から登壇者へ: RubyKaigi2024 LTでの初挑戦が 教えてくれた、可能性の星
mikik0
1
130
Jakarta EE meets AI
ivargrimstad
0
130
Featured
See All Featured
Designing the Hi-DPI Web
ddemaree
280
34k
CoffeeScript is Beautiful & I Never Want to Write Plain JavaScript Again
sstephenson
159
15k
Docker and Python
trallard
40
3.1k
Writing Fast Ruby
sferik
627
61k
The Cost Of JavaScript in 2023
addyosmani
45
6.8k
Faster Mobile Websites
deanohume
305
30k
The Pragmatic Product Professional
lauravandoore
31
6.3k
Building Better People: How to give real-time feedback that sticks.
wjessup
364
19k
Building an army of robots
kneath
302
43k
Dealing with People You Can't Stand - Big Design 2015
cassininazir
364
24k
Let's Do A Bunch of Simple Stuff to Make Websites Faster
chriscoyier
506
140k
"I'm Feeling Lucky" - Building Great Search Experiences for Today's Users (#IAC19)
danielanewman
226
22k
Transcript
Re: ゼロから始めるサーバー サイドKotlin • toliner
About me • トリナー @toliner_ (Twitter), @toliner (GitHub) • justInCase(@justInCaseHoken)でKotlin書くバイトやってます
• ♥ Windows 10, JetBrains IDE, Kotlin, ASUS, Firefox • ゲーム: R6S, Apex, Factorio, Arknights, SINoALICE, etc…
About me
質問等について • 質問 -> ZoomのQ&A機能を使って質問して下さい • 感想・意見等 -> できればTwitterで#kc3_2020を付けてツイートし てください。(Zoomのチャットでも良いです)
お品書き • Kotlin入門 ◦ IntelliJ IDEAでのプロジェクト作成 ◦ Kotlin文法 • サーバーサイドKotlin
◦ フレームワーク・ライブラリ等 ◦ 簡単なプロジェクトを作ってみる
Kotlin 入門
IntelliJ IDEAでのプロジェクト作成
Kotlin文法 お品書き • 基本構文 ◦ 関数・変数 ◦ 制御構文 ◦ クラス
• 応用構文 ◦ ラムダ式 ◦ 拡張関数 ◦ コルーチン
Kotlin 基本文法 – Hello World!
Kotlin 基本文法 – Hello World!
Kotlin 基本文法 – Hello World!
Kotlin 基本文法 – Hello World!
Kotlin 基本文法 – 関数 • Kotlinはクラス外(パッケージレベル、トップレベル)に変数・関数を 記述可能。 • Kotlinの関数は fun
名前(引数): 返り値の型 {} という形で記述する ◦ Kotlinにおいて、型定義は全て後置 • 何も返さない場合、返り値にはUnitという型を用いる ◦ Javaのvoid相当 ◦ 返り値の型がUnitの場合、省略可能
Kotlin 基本文法 – 関数 例1
Kotlin 基本文法 – 関数 • 1行で終わる関数(return文のみの関数)は{}とreturnを省略して=を用 いて記述できる。 • =を用いる場合は型推論が働くので返り値の型は省略可能 •
Javaのvoidと違い、Unitは値なので=の後にUnitを返す関数を利用 可能
Kotlin 基本文法 – 関数 例2
Kotlin 基本文法 – 関数 • Kotlinの関数では、デフォルト引数という物が指定できる。 • デフォルト引数が存在する場合、呼び出し側はその引数を省略する 事ができる。 •
デフォルト引数は引数の型の後に= 値 という形で記述する
Kotlin 基本文法 – 関数 例3
Kotlin 基本文法 – 変数 • 変数の宣言には、valとvarを用いる。 ◦ valは再代入不可、varは再代入可。 • val
変数名: 型 = 初期化式 の様に記述する。 ◦ 特別な場合を除き、変数は必ず宣言時に初期化しなければなら ない。 • 多くの場合、変数の型宣言は省略する事ができる。
Kotlin 基本文法 – 変数 例
Kotlin 基本文法 – 制御構文 • Kotlinに存在する制御構文はif式, when式, for文, while文の4つ。 •
forは少し特殊で、CやJavaスタイルのforは存在しない。 ◦ JavaやC#におけるfor-each構文に相当する物のみ。 • Ifとwhenは式なので、値を返す事ができる。
Kotlin 基本文法 – 制御構文 例1
Kotlin 基本文法 – 制御構文 例2
Kotlin 基本文法 – クラス • 基本的にはJavaと似ているが、コンストラクター周りが特殊 • プライマリコンストラクターはinit {}という形で宣言する •
セカンダリーコンストラクターは constructor(引数): 別のコンスト ラクター() という形で書ける。 • なお、Kotlinでコンストラクタを書くことは稀である。 • Kotlinにおいて、クラスのフィールドをプロパティと呼ぶ。 ◦ プロパティはJavaのフィールドと異なる性質を持つ。
Kotlin 基本文法 – クラス - プロパティ • Kotlinにおけるプロパティは、Javaのフィールド + Setter/Getter
の組み合わせである。 ◦ C#のプロパティに近い。 • カスタムSetter/Getter, プロパティの委譲, 委譲を用いての遅延初 期化等ができる。 • クラスのプライマリーコンストラクタでプロパティを宣言できる。
Kotlin 基本文法 – クラス 例
Kotlin 応用構文 – ラムダ式 • Kotlinにおいて、関数は第一級オブジェクとして扱われる。 ◦ つまり、Int等のプリミティブ(っぽい)型や、ユーザー定義型の オブジェクトと同等に扱える。 ◦
具体的には、関数に対する関数呼び出しや、関数を引数に取る 関数、関数を返す関数、関数のプロパティ等を作れる。 • 「関数オブジェクト」を作成する構文がラムダ式。
Kotlinの応用構文 – ラムダ式 • 関数もオブジェクトとして扱えるから、当然型が必要である。 • 関数を表すインターフェースとして、Kfunctionという物が存在す る ◦ 主な用途はリフレクション
• 関数の型は (引数リスト) -> 返り値の型 という形で記述できる。 ◦ 引数部分の名前の指定の有無は自由
Kotlinの応用構文 – ラムダ式 • ラムダ式自体は、 { 引数リスト -> 中身 }
という形で記述する。 • ラムダ式においては、関数とは異なり最後の式の値が返り値として 扱われる ◦ returnは不要。微妙に分かりづらい事がある。 • 引数が1つの場合、引数リストは省略可能 ◦ その場合、引数の名前はitとなる。
Kotlinの応用構文 – ラムダ式 • 関数を引数に取る関数を呼び出す場合、主にラムダ式を用いて引数 を与える。 ◦ 別な関数や関数型のプロパティに対する参照を渡す事もできる。 • 関数の引数にラムダ式を用いる場合、その引数が最後の引数なら、
関数の引数リスト()の後ろにラムダ式を記述する事ができる。 ◦ 文字で説明しても分かりにくいので例を参照
Kotlinの応用構文 – ラムダ式 例
Kotlinの応用構文 – 拡張関数 • Kotlinには、拡張関数という、クラスに対して外部から関数を生や す機能がある。 • 生やされたクラスのオブジェクトをレシーバーと呼ぶ。 • 拡張関数はコンパイルされるとレシーバーを第一引数にとる関数に
変換される。 ◦ そのため、privateなプロパティ等にはアクセスできない。 • 頑張れば拡張プロパティも生やせる。
Kotlinの応用構文 – 拡張関数 • 拡張関数は fun レシーバーの型.名前(引数リスト): 返り値の型 とい う形で記述できる。
• 拡張関数にも当然型は存在する。 ◦ レシーバーの型.(引数リスト) -> 返り値の型 という形で記述 • 拡張関数の拡張関数の拡張関数の拡張関数なんていうアホな物も作 れる
Kotlinの応用構文 – 拡張関数
Kotlinの応用構文 – コルーチン • 非同期処理を軽量に行うための仕組み ◦ 言語仕様として導入されているのはsuspend関数のみで、ほと んどの実装はkotlinx.coroutinesというライブラリに存在。 • 簡単な仕組みとしては、中断可能な関数を作り、スレッドプール内
で順番に動かしてる感じ。 • JVM実装の場合は、JSの非同期処理とは異なりちゃんとマルチスレ ッドで動く。
Kotlinの応用構文 – コルーチン • コルーチンの詳細説明は長くなるので割愛します。 • 非同期処理である事と、以下の事のみ覚えてくれれば大丈夫 • コルーチンで非同期処理をする関数は、suspend修飾子を付けなけ ればならない。
• Suspend修飾子が付いた関数をsuspend関数と呼ぶ。 • 通常の関数内でsuspend関数は呼べない。 • Suspend関数内で通常の関数とsuspend関数は両方呼べる。 • Suspendのラムダ式も作れる(引数リストの前にsuspendと書く)
サーバーサイドKotlin
サーバーサイドKotlin • フレームワーク・ライブラリ等 ◦ サーバーサイドのフレームワークについて ◦ Kotlinのサーバーサイドフレームワーク ◦ その他のライブラリ •
簡単なプロジェクトの作成 ◦ セットアップ ◦ 簡単なHttpリクエストを処理する
サーバーサイドのフレームワークについて • Httpの処理は面倒くさい。 ◦ TCP通信とか面倒だし、非同期にやろうとするとかなり難しい • そのため、Http通信部分やルーティング、パラメーターのパース等 を行うフレームワークが色々生まれる。 • JavaのServletも一種のフレームワークだし、Http通信のみを行う
低レベルのフレームワークやそれをラップした高レベルなフレーム ワークなんかも存在する
Kotlinのサーバーサイドフレームワーク • Spring/Spring Boot ◦ Javaでも有名で人気なフレームワーク。Kotlin用の拡張モジュ ールが存在。 • Ktor ◦
実質Kotlin公式のフレームワーク。 • Http4K ◦ Ktorの対抗馬っぽいサードパーティーのフレームワーク。某ベ ンチマークの性能ではKtorより上。
Kotlinのサーバーサイドフレームワーク • 今回はKtorを採用 • Kotlin公式のフレームワークである • 一番書きやすく読みやすい(主観) • バイト先で使ってるので慣れ親しんでる
その他のライブラリ • kotlinx.serialization ◦ Kotlin公式の汎用データシリアライズライブラリ。Jsonは標準 対応。
プロジェクトのセットアップ • build.gradle.ktsを編集してリロードしてしばらく待てばGradleと IntelliJが勝手にやってくれます。
build.gradle.kts
Ktorの使い方 • Ktorはマイクロフレームワークで、基礎では最小限の機能しか無い。 • 様々なFeatureをinstall()する事で機能を追加していく。 • src/main/resourcesにapplication.confという設定ファイルが必要 ◦ 主にKtorのエンジンに関する設定を行う •
主要なWebフレームワークとしての機能は組み込みでFeatureが存 在したり、Ktor公式でモジュールが存在してたりする
application.conf
Main.kt
単純なテキストを返してみる
単純なテキストを返してみる • ルーティングはHttpメソッド名の関数を用いる • ApplicationCallというインターフェースがClientからのリクエスト やServerからのレスポンスを司る • call.respond◦◦系の関数でレスポンスを返す
単純なテキストを返してみる
単純なテキストを返してみる
簡単なHTMLを返してみる
簡単なHTMLを返してみる • call.respondHTML: KotlinでHTMLを記述し、その結果を返す関数 • Kotlinx.htmlというライブラリがあり、HTMLのタグに相当する関 数を呼び出す事でHTMLを記述する事ができる。 • 型安全でかつ補完が効くので、HTML初心者にもやさしい!
簡単なHTMLを返してみる
Jsonの入力を受けてJsonを返してみる
Jsonの入力を受けてJsonを返してみる • call.receive()を用いて、入力を様々な形で受け取る事ができる。 ◦ 今回はContentNegotiation Featureをinstallしているので、そ れを用いてjsonをオブジェクトのデコードしている。 • call.respondText()でjsonのContentTypeを指定し、返す値は kotlinx.serializationsを用いてjsonにエンコードする。
Jsonの入力を受けてJsonを返してみる
Jsonの入力を受けてJsonを返してみる
Ktor.io
Kotlin & Ktor最高! みんなでサーバーサイドで 遊ぼう
ご清聴ありがとうございました
おまけ • FPS(R6S, Apex)やる人募集してます。 ◦ https://discord.gg/NaXA2tS • Factorio, Craftopia等やる人とKotlinプログラマー募集してます。 ◦
https://discord.gg/TGXYqA4