Upload
yy-yank
View
1.709
Download
2
Embed Size (px)
Citation preview
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 のアップ / ダウンストリームに合わせてライフ・サイクルが形成されているPreRequestPreExecusionPostExecusionPostRequestError
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!") })
wasabiRequestの処理
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 らしさを求めるならプルリクか自作だ
まとめ