Kotlin1.0のリリースを記念しSansan様で2016/03/24に開催された、「第2回Kotlin勉強会 @ Sansan」の参加レポートです。
概要
DroidoKaigi 2016でKotlin+Androidをテーマに発表された、@boohbahさんや@ngsw_taroさんなど、計7名の方がLTをされました。
ちなみにSansan様でのKotlin勉強会は2回目で、1回目は「AndroidでKotlin勉強会 @ Sansan」と題して、Androidメインで開催されました。
今回第2回はAndroidにこだわらず、Kotlinオールジャンルでの開催となりました。
ビールで乾杯
無料勉強会だったのですが参加者にビールとおつまみがふるまわれました。Sansan様、Coors様ご馳走様です。お酒の味をうまくは語れないのですが、Coors様のビールは、他のビールとぜんぜん違う香りでとてもおいしかったです!
Kotlinエバンジェリストの@ngsw_taroさんの乾杯でイベント開始です!
LT
次の7名の方がLTをされました。
- @boohbahさん : KotlinでPhantom Type
- @sys1yagiさん : Kotlin学習とライブラリ作成
- @operandoOSさん : Kotlinにお触り
- @kikuchyさん : 3分で作る Kotlin Friendly な API
- @dageziさん : JACK & JILL & KOTLIN もしくは「Kotlinはこの先生きのこることができるか」
- @hotchemiさん : khronos
- @ngsw_taroさん : knitで学ぶKotlin入門の次
その1 KotlinでPhantom Type
- 感想 : 「ジェネリクな型の型パラメータを具象化して、それに拡張関数を定義するの、なんかすごいのできそう!」
- 資料 : KotlinでPhantom Type
1人目は、DoroidKaigiでも登壇され、この勉強会の主催者でもある@boohbahさんが登壇されました。
Phantom Typeとは何でしょう?
下記のコードは@boohbahさんのスライド中のコードを元に、一部変数名等を変えたものです。
package example import example.State.Ready import example.State.NotReady sealed class State { class NotReady : State() class Ready : State() // これがPhantomタイプとのことです } data class Data<T : State>(val value: Int) // 型パラメータは実行時には消えてる。コンパイル時では使える。 fun Data<NotReady>.ready() = Data<Ready>(value) fun Data<Ready>.print() = print("I'm ready.") fun main(args: Array<String>) { val readyData = Data<Ready>(0) val notReadyData = Data<NotReady>(0) readyData.print() // notReadyData.print() コンパイルエラー // readyData.ready() コンパイルエラー notReadyData.ready() }
上記のコードでは、Data<NotReady>
型のみにready
という拡張関数を、Data<Ready>
型のみにsay
という拡張関数を定義しています。コンパイル時では型引数の情報が残っているため、それぞれのData<NotReady>
でしかready
を呼べませんし、Data<Ready>
でしかsay
を呼べません。
この他にも、SQL文を出力するDSLの例なども紹介されていました。
実はfun Iterable<Int>.sum(): Int
やfun Array<out Double>.average(): Double
など、型引数が具象型になっているジェネリク型の拡張関数は、kotlin.stdlibの中にもあります。
LTで発表されているような使い方をみると、いろいろ面白いことができそうですね。
その2 Kotlin学習とライブラリ作成
- 感想 : 「『ライブラリ作成をしながらKotlinを学習するといいんじゃないかなーという話です』、俺もそう思います!」
- 資料 : Kotlin学習とライブラリ作成
- kmockito(github)
Androidアプリ開発者のみなさんはご存知、お二人目の@sys1yagiさんは「Kotlin学習とライブラリ作成」というタイトルでご自身がつくられたkmockitoというライブラリの開発の話をされました。
は、とても参考になると思います!
トピックスは次のような感じです。
文法を学ぶだけでなく、実際にライブラリを書いてみることでそれを血肉とすることはとても大切だと思います。
業務や本番ではなかなか投入できなくても、まずライブラリで試すというの、大切ですね。
ところで、「isとかwhenとか、メソッド名がKotlinの予約語やキーワードとかぶる」というのにみなさん遭遇しますよね?この後の@ngsw_taroさんでも、これがまた出てきます。
その3 Kotlinにお触り
- 感想 : 「brewでインストールもできるのか!」
- 資料 : Kotlinにお触り
- Working with the Command Line Compiler(Kotlin公式)
Kotlin歴数時間の@operandoOSさん。LTの冒頭で
「僕はKotlinが大っ嫌い」
というスライドに驚き
「でした!!」
という次のページのスライドに安堵しました。
なぜ嫌いだったのが非常に気になったのですが、特に理由はないそうです。
IDEAやAndroidStudioでKotlinを書いている人がほとんどだと思っています。(Eclipseもほとんどいませんよね?)。@operandoOSさんはatomで書いてみたそうです。
多くのみなさんが、Kotlinのプロジェクトの設定は、GradleでやるかIDEA(or AndroidStudio)がよしなにしてくれる方法を使っていると思っていました。またGroovyを初めてとするJVM言語と同様にSDKMANを使ってインストールできるのも知っていました。
brewでインストールして使う、ということもできるのですね。なるほど。
その4 3分で作る Kotlin Friendly な API
- 感想 : 「『Kotlinは 短くかけて 読みやすい 5・7・5』俺もそう思います」
- 資料 : 3分で作る Kotlin Friendly な API
- kenin(Github)
すでにKotlinを実プロダクトで採用されていて、keninというテキストバリデーションツールを作られている@kikuchyさんの発表です。
この一句に全てが詰められているLTですね。
kenin(Github)をJavaからKotlinで書き換え、非常に短く簡潔になる過程が説明されています。
次のKotlinの文法を活用しているそうです。
- 拡張関数
- ()の省略
- thisの省略
- レシーバ指定関数
- 中置関数
こちらも「Javaでライブラリを作っていたけどKotlinで書きたい」、「なんかKotlinっぽい書き方ができない」という時に、ぜひ読むといいと思います。
その5 JACK & JILL & KOTLIN もしくは「Kotlinはこの先生きのこることができるか」
- 感想 : 「Kotlinはいらない子にはならないですよね!」
- 資料 : JACK & JILL & KOTLIN もしくは「Kotlinはこの先生きのこることができるか」
Kotlin歴7日の@dageziさんは、「Jack & Jill」とJava8とKotlinの話をされました。
「JACK & JILL」を用いることで、Androidでもラムダ式が使えるようになるそうです。(最新のAndroidでなくても!)しかし残念ながら、StreamクラスやOptionクラスが使えるようになるわけではないそうです。
また、INVOKEDYNAMIC (INDY)の話やinline修飾子の話しもされました。
java8と比較した際のKotlinの良さって、関数リテラルだけじゃないですしね。Kotlinはいらない子にならないと思っています。
(個人的にはJavaは、7から8の際に拡張関数を採用しなかったのがでかいと思っています。)
その6 khronos
- 感想 : 「khronos、Kotlinで時間を扱うときは使いたい!あと、名前超いい」
- 資料 : khronos
- khronos(github)
@hotchemiさんは「khronos」と題して、ご自身が作られたKotlin製の時刻を扱うライブラリについて発表されました。
Javaの時刻・日付を司るCalenderクラスやDateクラスを使うコードに対して、今まで扱いずらい・読みにくいと思ったことがある方も多いのではないでしょうか?
khronosは
- RubyのActiveSupport
- SwiftのTimepiece
という他のプログラミング言語のライブラリにインスパイアされた、時刻を扱うKotin製のライブラリだそうです。
- オペレーターのオーバーロード
- 拡張関数
- 拡張プロパティ
- 名前付き引数呼び出し、デフォルト引数
- Range
などのKotlinの言語機能を用いて、時刻に対して扱いやすく読みやすいコードを記述できるAPIを提供しています。
khronosは、JCenterにあがっているとのことです。ちなみに登壇(2016/03/24(木))時点では、できたてほやほやだとか。
ところで、「khronos」という名前、とても素敵な名前だと思います。
- KotlinだからKがついている
- 時刻を扱う名前だとすぐ伝わる
- かっこいい
こんなことを懇親会で、@ngsw_taroさんとも話していました。
ライブラリの名前は重要ですね。ライブラリの命名スキルは、メソッド名・クラス名の命名スキルのそれとはまた違うものスキルかもしれません。(他と区別かできるとか、一発で覚えられるとか。)
今すぐ、khronos(github)のコード読みましょう!
その7 knitで学ぶKotlin入門の次
- 感想 : 「たろーさんは、変態(的なコードを後半紹介されていましたね!)」
- 資料 : knitで学ぶKotlin入門の次
- knit(Github)
最後は@ngsw_taroさん。いつも「自称エバンジェリスト」って自己紹介されていましたが、今回は「黙認エバンジェリスト」って自己紹介されていましたね!
@ngsw_taroさんが開発された、JUnitの拡張ライブラリ、knitを紹介しつつ、Kotlinのいいところを紹介されました。knit
はニット
と読むそうです。
Kotlin
ではis
はキーワードになっています。そこで、Javaで書かれたライブラリのメソッド名でis
というものがあったら、クォートで囲わないと呼び出すことができません。
KotlinでJUnitのassertThat
を呼び出す場合、次のようにする必要があります。
assertThat(1 + 2, `is`(3))
Knitを用いることで、次のように記述できるようになります。
(1 + 2).should be 3
このようにknitを使うことで、テストをDSLライクに記述できるようになります。
また、コード自体もとても参考になると思います。とくにKotlinを用いて既存のライブラリやJavaライブラリをDSL形式で呼び出せるように拡張したいときですね。knitのコード自体は現在(2016/3/24次点)では、たったの5ファイル(1個ずつも小さい)で構成されていますが、学べるポイントはたくさんあると思います!
話はがらっと変わって後半は、実コードでは絶対に書かない、変態的なコードを紹介されました。ご本人も懇親会でこんな読みにくいコード絶対書かないとおっしゃっていました。Kotlinの文法を学ぶ際には参考になりそうですね。
僕は、まだ読めてないです。
懇親会の様子
@boohbahさんの音頭で乾杯!
おいしいビールとおつまみを、Sansan様、Coors様ありがとうございました。
懇親会、自分自身は、「JACK & JILL」のことを教えていただいたり、 Knit
って名前かわいいよね、とかKhronos
って名前かっこいいよね、とか話したりと非常に楽しかったです。
個人的にショックだったのは、Kollectionってライブラリを作っているのですが、『それだと口頭で話しているとき、「コレクションと区別つかないからわかりづらくない?」』と、@ngsw_taroさんに突っ込まれたことです。確かに...
盛り上がっている懇親会の様子!
まとめ
「Kotlin、なんとなく文法はわかった。けどうまくKotlinっぽいコードが書けない。あと、ほかの人が書いたライブラリはなんでこう書けるかわかんない。」そんな人は、今回の資料を片手に、今回紹介されているライブラリのコードを読みましょう。
Sansanの運営の皆様、登壇者の皆様、参加者の皆様、ありがとうございました。
もしKotlin勉強会 at Sansanの3回目、あったらまたお邪魔したいです。
おまけ
#Kotlin_Sansan 現着!
— むろほし (@RyotaMurohoshi) 2016年3月24日
早く着いてしまった
青山の都会感、アウェイ感
やばい pic.twitter.com/h89BRYIill
エレクトリカルパレードに、アラジンのやつに。
— むろほし (@RyotaMurohoshi) 2016年3月24日
エバンジェリストのあの方むけのBGMなのかな?
#Kotlin_Sansan まとめブログ、今日中に投稿できるようにがんばります
— むろほし (@RyotaMurohoshi) 2016年3月25日