Server Side Kotlin
Kotlin Webフレームワークの現状
第3回 かわいいKotlin勉強会 #jkug
@yy_yank
自己紹介
こいつです
・vimmerなのに
サクラエディタアイコン
・小物SIer
・JavaとKotlinが好き
ヤンク(@yy_yank)
・関西Kotlin勉強会参加(2014/09)
・Kotlinアドベントカレンダー2014とか書いた
・逆引きKotlinというサイトを作った
・twitterでKotlinで検索して巡回(毎日)
僕のKotlin活動
What is Server Side?
・Client Side <-> Server Side
・Http (Get,Post,Put,Delete...)
・MVC 2.0
・Component
・REST
・Servlet
・Apache Stru…
What is Server Side?
Web Frameworkの話
をしよう
・KotlinのWebフレームワーク
・JavaのWebフレームワークとかも考える
・まとめ
Agenda
KotlinのWebフレーム
ワーク、いくつ知って
ますか?
・Kara
・wasabi
・Node.kt
・Kool
・vertx-kotlin
Kotlin製のWebフレームワーク
・Kara
・wasabi
・Node.kt
・Kool
・vertx-kotlin
Kotlin製のWebフレームワーク
・Kara
・wasabi
・Node.kt 6 months ago
・Kool 3 years ago
・vertx-kotlin 3 years ago
Kotlin製のWebフレームワーク
誰も保守しない
オレオレフレーム
ワークやない
か!!!
・GitHubでKotlinを検索すると、
3 years agoとか2 years agoが多い
・我々は今を生きている
Kotlin製のWebフレームワーク
・Kara
・wasabi
・Node.kt
実質はこの3つ
・Kara
・wasabi
・Node.kt
Kotlin製のWebフレームワーク①
・名前通りNode.jsの模倣的なもの
・ベースはNetty
・Node.ktは割とActiveな方だが
大体wasabiで同等の機能が網羅されている
・独自にベーシック認証や暗号化復号化機能を
持っているぐらい
Node.ktは正直微妙
何が微妙かってソース
が汚い
Node.ktは正直微妙
fun listen(port: Int? = null) {
var aPort = port;
if (aPort == null) {
aPort = get("port") as Int
}
if (aPort == null) {
throw IllegalStateException("hogehoge")
Node.ktは正直微妙
fun listen(port: Int? = null) {
var aPort = port;
if (aPort == null) {
aPort = get("port") as Int
}
if (aPort == null) {
throw IllegalStateException("hogehoge")
デフォルト値
がnull
2回目のnull
チェック
変数使いまわ
して代入
しぶい
せめてこうとか…
fun listen(port: Int?) {
var aPort = port ?: get("port")?.toInt()
if (aPort == null)
throw IllegalStateException("hogehoge")
}
・Kara
・wasabi
・Node.kt
Kotlin製のWebフレームワーク②
・JetBrainsのHadi Haririのプロジェクト
・Http FrameWork(らしい)
・ベースはNetty
・Interceptorが優秀
・ModelやViewは含まれず、かなり軽量
・WebSocketにも対応したっぽい?
wasabi
・Nettyのアップ/ダウンストリームに合わせ
てライフ・サイクルが形成されている
PreRequest
PreExecusion
PostExecusion
PostRequest
Error
wasabi
server.get("/", {
val log = Log()
log.info("URI requested is${request.uri}")
next()
},{ response.send("Hello World!") }
)
wasabi
server.get("/", {
val log = Log()
log.info("URI requested is${request.uri}")
next()
},{ response.send("Hello World!") }
)
wasabi
ルーティング
server.get("/", {
val log = Log()
log.info("URI requested is${request.uri}")
next()
},{ response.send("Hello World!") }
)
wasabi
Requestの
処理
server.get("/", {
val log = Log()
log.info("URI requested is${request.uri}")
next()
},{ response.send("Hello World!") }
)
wasabi
Response
の処理
・逆引きKotlinをwasabiで作ってみました(宣
伝)
Html + bootstrap + wasabiという感じ
https://github.com/yyYank/kotlin-rev-
solution-wasabi
wasabi
・Kara
・wasabi
・Node.kt
Kotlin製のWebフレームワーク③
・TinyMissionというアメリカのミネソタ州の
Webサービスとモバイル系の会社が開発開始
・(M)VCフレームワーク
・全てが.ktになる(htmlもcssもロジックも)
・Jetty + kootstrap(bootstrapのKotlin版) +
Kotlin製Htmlテンプレートエンジン
Kara
( ˘⊖˘) 。o(ん、待てよ
…?)
JetBrains
JetBrains
JetBrains
JetBrains
JetBrains
TinyMission
_人人人人人人人人人人_
> ほとんどJetBrains <
 ̄Y^Y^Y^Y^Y^Y^Y^Y^Y ̄
‘’Currently, it is actively developed by JetBrains,
the company behind Kotlin.‘’
Kara
・現在Karaを引っ張っているのは
JetBrains
( ˘⊖˘) 。o(あんしん)
Get("/test")
class Test() : Request({
TextResult("This is a test action, yo")
})
Get("/crash")
class Crash() : Request({
error("This resource crashes")
})
Karaのルーティング
Get("/test")
class Test() : Request({
TextResult("This is a test action, yo")
})
Get("/crash")
class Crash() : Request({
error("This resource crashes")
})
Karaのルーティング
ルーティング
Get("/test")
class Test() : Request({
TextResult("This is a test action, yo")
})
Get("/crash")
class Crash() : Request({
error("This resource crashes")
})
Karaのルーティング
Response
の処理
Get("/test")
class Test() : Request({
TextResult("This is a test action, yo")
})
Get("/crash")
class Crash() : Request({
error("This resource crashes")
})
Karaのルーティング
Viewのクラス
table {
setClass(fields)
tr {
td {
setClass(cLabel)
labelFor("title")
}
td {
submitButton("Submit")
}
}
}
}
KaraのView
table {
setClass(fields)
tr {
td {
setClass(cLabel)
labelFor("title")
}
td {
submitButton("Submit")
}
}
}
}
KaraのViewのメリット
・タグの対応が簡単
・もちろん静的型付け
→書き間違いなし!!
table {
setClass(fields)
tr {
td {
setClass(cLabel)
labelFor("title")
}
td {
submitButton("Submit")
}
}
}
}
KaraのViewのデメリット
デザイナーさんとの分
業とかだとちょっと覚
えてもらう必要がある
…。
table(fields) {
td {
padding = box(6.px, 3.px)
}
td.c(cLabel) {
textAlign = TextAlign.right
}
td(cLabel, top) {
verticalAlign = VerticalAlign.top
}
KaraのCSS
なぜ、Kotlinライブラ
リとして、vert.xや
node.jsライクにやろ
うとするのか
・ルーティング処理などの関数の引数として関
数渡しをするようなシグネチャが作りやすい
->必然的にnode.jsのような書き方になる
関数リテラルと相性が良い
inline fun HtmlBodyTag.table(contents:
TABLE.() -> Unit) = contentTag(TABLE(this),
contents)
大体こういう感じ
inline fun HtmlBodyTag.table(contents:
TABLE.() -> Unit) = contentTag(TABLE(this),
contents)
大体こういう感じ
・ライブラリ実装
TABLE.() -> Unit
・使う側
table {
}
大体こういう感じ
その他も考える
・Spring Boot
・JAX-RS(JSR339)
・MVC 1.0(JSR371)
JavaのWebフレームワーク
・Spring Boot
・JAX-RS(JSR339)
・MVC 1.0(JSR371)
JavaのWebフレームワーク①
・やってみた
【Kotlin】KotlinでもJava EE 8 の
MVC1.0(Ozark)は動くよ
・結構辛さあった
MVC1.0(JSR371)
・Spring Boot
・JAX-RS(JSR339)
・MVC 1.0(JSR371)
JavaのWebフレームワーク②
・うらがみ(backpaper0)さんがやってた
KotlinでJAX-RS + おまけ
・あんまりJavaと変わらなかった
JAX-RS(JSR339)
・Spring Boot
・JAX-RS(JSR339)
・MVC 1.0(JSR371)
JavaのWebフレームワーク③
・しおしお(@_siosio_)さんがやってた
KotlinでSpring Bootしてみた
・Hadi Haririもやってた
Creating a RESTful Web Service with Spring
Boot
・地味に辛さあるけどまあまあ
Spring Boot
・Java EEはJavaで使ったほうが良い
・使うとしたらSpring Bootかも知れない
JavaのWebFW with Kotlin?
・Karaの低レイヤな部分が参考になりやすいの
でそれをベースに作ってみるのも良いかも
-> HttpServletを継承してその上にApplication
クラスを上乗せするような形
情報の受け渡しはApplicationContextがやって
いる様子
自分でつくるから安心!負担は増える!
オレオレWebフレームワーク
・一番手厚くて今後見込みありそうなのはKara
・wasabiもすでに完成形なので使えるけどフル
スタックというよりは軽量なもの
・Spring Bootもまあまあアリ
・更なるKotlinらしさを求めるならプルリクか
自作だ
まとめ
Server Side Kotlin

Server Side Kotlin