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
560
Other Decks in Programming
See All in Programming
Alba: Why, How and What's So Interesting
okuramasafumi
0
210
Flatt Security XSS Challenge 解答・解説
flatt_security
0
730
技術的負債と向き合うカイゼン活動を1年続けて分かった "持続可能" なプロダクト開発
yuichiro_serita
0
300
20年もののレガシープロダクトに 0からPHPStanを入れるまで / phpcon2024
hirobe1999
0
1k
Итераторы в Go 1.23: зачем они нужны, как использовать, и насколько они быстрые?
lamodatech
0
1.4k
ATDDで素早く安定した デリバリを実現しよう!
tonnsama
1
1.9k
ErdMap: Thinking about a map for Rails applications
makicamel
1
640
2025.01.17_Sansan × DMM.swift
riofujimon
2
560
PHPで学ぶプログラミングの教訓 / Lessons in Programming Learned through PHP
nrslib
4
1.1k
「とりあえず動く」コードはよい、「読みやすい」コードはもっとよい / Code that 'just works' is good, but code that is 'readable' is even better.
mkmk884
6
1.4k
生成AIでGitHubソースコード取得して仕様書を作成
shukob
0
630
AWS re:Invent 2024個人的まとめ
satoshi256kbyte
0
100
Featured
See All Featured
Scaling GitHub
holman
459
140k
Stop Working from a Prison Cell
hatefulcrawdad
267
20k
Code Reviewing Like a Champion
maltzj
521
39k
Designing Experiences People Love
moore
139
23k
Producing Creativity
orderedlist
PRO
343
39k
The Cult of Friendly URLs
andyhume
78
6.1k
The Language of Interfaces
destraynor
155
24k
Visualization
eitanlees
146
15k
Being A Developer After 40
akosma
89
590k
JavaScript: Past, Present, and Future - NDC Porto 2020
reverentgeek
47
5.1k
Making the Leap to Tech Lead
cromwellryan
133
9k
Adopting Sorbet at Scale
ufuk
74
9.2k
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