僕はここだ!

読書記録とか、ポエムとか、メモとか、コードスニペットとか。まとまったのはQiitaにも書きます。(http://qiita.com/RyotaMurohoshi) 掲載内容は個人の見解であり、所属する企業を代表するものではありません。

「第2回Kotlin勉強会 @ Sansan」に参加してきた!

 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様のビールは、他のビールとぜんぜん違う香りでとてもおいしかったです!

f:id:MRStar:20160325180518j:plain

 Kotlinエバンジェリスト@ngsw_taroさんの乾杯でイベント開始です!

f:id:MRStar:20160325180439j:plain

LT

 次の7名の方がLTをされました。

その1 KotlinでPhantom Type

  • 感想 : 「ジェネリクな型の型パラメータを具象化して、それに拡張関数を定義するの、なんかすごいのできそう!」
  • 資料 : KotlinでPhantom Type

 1人目は、DoroidKaigiでも登壇され、この勉強会の主催者でもある@boohbahさんが登壇されました。

f:id:MRStar:20160324194836j:plain

 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(): Intfun Array<out Double>.average(): Doubleなど、型引数が具象型になっているジェネリク型の拡張関数は、kotlin.stdlibの中にもあります。

 LTで発表されているような使い方をみると、いろいろ面白いことができそうですね。

その2 Kotlin学習とライブラリ作成

 Androidアプリ開発者のみなさんはご存知、お二人目の@sys1yagiさんは「Kotlin学習とライブラリ作成」というタイトルでご自身がつくられたkmockitoというライブラリの開発の話をされました。

  • Kotlinの文法は基本抑えたけどどう使うのかなーって人
  • なにか既存のJavaのライブラリを拡張したい人
  • Kotlin勉強したいけど、資料がAndroidの知識前提だから辛いよ!って人

 は、とても参考になると思います!

 トピックスは次のような感じです。

  • トップレベルに(クラスの中でなく名前空間下に)拡張関数
  • inlineとreifiedで型パラメータを扱う
  • 拡張プロパティをうまく使う(メソッド呼び出しの()も省略できる)
  • 多重宣言を活用する

 ぜひコードも見てみましょう。githubこちら

 文法を学ぶだけでなく、実際にライブラリを書いてみることでそれを血肉とすることはとても大切だと思います。

 業務や本番ではなかなか投入できなくても、まずライブラリで試すというの、大切ですね。

f:id:MRStar:20160325180426j:plain

 ところで、「isとかwhenとか、メソッド名がKotlinの予約語やキーワードとかぶる」というのにみなさん遭遇しますよね?この後の@ngsw_taroさんでも、これがまた出てきます。

その3 Kotlinにお触り

 Kotlin歴数時間の@operandoOSさん。LTの冒頭で

 「僕はKotlinが大っ嫌い」

 というスライドに驚き

 「でした!!」

 という次のページのスライドに安堵しました。

f:id:MRStar:20160325180232j:plain

 なぜ嫌いだったのが非常に気になったのですが、特に理由はないそうです。

 IDEAやAndroidStudioでKotlinを書いている人がほとんどだと思っています。(Eclipseもほとんどいませんよね?)。@operandoOSさんはatomで書いてみたそうです。

 多くのみなさんが、Kotlinのプロジェクトの設定は、GradleでやるかIDEA(or AndroidStudio)がよしなにしてくれる方法を使っていると思っていました。またGroovyを初めてとするJVM言語と同様にSDKMANを使ってインストールできるのも知っていました。

 brewでインストールして使う、ということもできるのですね。なるほど。

その4 3分で作る Kotlin Friendly な API

すでにKotlinを実プロダクトで採用されていて、keninというテキストバリデーションツールを作られている@kikuchyさんの発表です。

 この一句に全てが詰められているLTですね。

f:id:MRStar:20160325180206j:plain

 kenin(Github)JavaからKotlinで書き換え、非常に短く簡潔になる過程が説明されています。

 次のKotlinの文法を活用しているそうです。

  • 拡張関数
  • ()の省略
  • thisの省略
  • レシーバ指定関数
  • 中置関数

 こちらも「Javaでライブラリを作っていたけどKotlinで書きたい」、「なんかKotlinっぽい書き方ができない」という時に、ぜひ読むといいと思います。

その5 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の際に拡張関数を採用しなかったのがでかいと思っています。)

f:id:MRStar:20160325180133j:plain

その6 khronos

  • 感想 : 「khronos、Kotlinで時間を扱うときは使いたい!あと、名前超いい」
  • 資料 : khronos
  • khronos(github)

 @hotchemiさんは「khronos」と題して、ご自身が作られたKotlin製の時刻を扱うライブラリについて発表されました。

f:id:MRStar:20160325214110j:plain

 Javaの時刻・日付を司るCalenderクラスやDateクラスを使うコードに対して、今まで扱いずらい・読みにくいと思ったことがある方も多いのではないでしょうか?

 khronosは

という他のプログラミング言語のライブラリにインスパイアされた、時刻を扱うKotin製のライブラリだそうです。

  • オペレーターのオーバーロード
  • 拡張関数
  • 拡張プロパティ
  • 名前付き引数呼び出し、デフォルト引数
  • Range

 などのKotlinの言語機能を用いて、時刻に対して扱いやすく読みやすいコードを記述できるAPIを提供しています。

 khronosは、JCenterにあがっているとのことです。ちなみに登壇(2016/03/24(木))時点では、できたてほやほやだとか。

 ところで、「khronos」という名前、とても素敵な名前だと思います。

  • KotlinだからKがついている
  • 時刻を扱う名前だとすぐ伝わる
  • かっこいい

 こんなことを懇親会で、@ngsw_taroさんとも話していました。

 ライブラリの名前は重要ですね。ライブラリの命名スキルは、メソッド名・クラス名の命名スキルのそれとはまた違うものスキルかもしれません。(他と区別かできるとか、一発で覚えられるとか。)

 今すぐ、khronos(github)のコード読みましょう!

その7 knitで学ぶKotlin入門の次

 最後は@ngsw_taroさん。いつも「自称エバンジェリスト」って自己紹介されていましたが、今回は「黙認エバンジェリスト」って自己紹介されていましたね!

 @ngsw_taroさんが開発された、JUnitの拡張ライブラリ、knitを紹介しつつ、Kotlinのいいところを紹介されました。knitニットと読むそうです。

 Kotlinではisはキーワードになっています。そこで、Javaで書かれたライブラリのメソッド名でisというものがあったら、クォートで囲わないと呼び出すことができません。

KotlinでJUnitassertThatを呼び出す場合、次のようにする必要があります。

assertThat(1 + 2, `is`(3))

 Knitを用いることで、次のように記述できるようになります。

(1 + 2).should be 3

 このようにknitを使うことで、テストをDSLライクに記述できるようになります。

 また、コード自体もとても参考になると思います。とくにKotlinを用いて既存のライブラリやJavaライブラリをDSL形式で呼び出せるように拡張したいときですね。knitのコード自体は現在(2016/3/24次点)では、たったの5ファイル(1個ずつも小さい)で構成されていますが、学べるポイントはたくさんあると思います!

f:id:MRStar:20160325220315j:plain

 話はがらっと変わって後半は、実コードでは絶対に書かない、変態的なコードを紹介されました。ご本人も懇親会でこんな読みにくいコード絶対書かないとおっしゃっていました。Kotlinの文法を学ぶ際には参考になりそうですね。

 僕は、まだ読めてないです。

懇親会の様子

 @boohbahさんの音頭で乾杯!

 f:id:MRStar:20160325180401j:plain

 おいしいビールとおつまみを、Sansan様、Coors様ありがとうございました。

 f:id:MRStar:20160325180547j:plain

 懇親会、自分自身は、「JACK & JILL」のことを教えていただいたり、 Knitって名前かわいいよね、とかKhronosって名前かっこいいよね、とか話したりと非常に楽しかったです。

 個人的にショックだったのは、Kollectionってライブラリを作っているのですが、『それだと口頭で話しているとき、「コレクションと区別つかないからわかりづらくない?」』と、@ngsw_taroさんに突っ込まれたことです。確かに...

 盛り上がっている懇親会の様子!

 f:id:MRStar:20160325180059j:plain

まとめ

 「Kotlin、なんとなく文法はわかった。けどうまくKotlinっぽいコードが書けない。あと、ほかの人が書いたライブラリはなんでこう書けるかわかんない。」そんな人は、今回の資料を片手に、今回紹介されているライブラリのコードを読みましょう。

 Sansanの運営の皆様、登壇者の皆様、参加者の皆様、ありがとうございました。

 もしKotlin勉強会 at Sansanの3回目、あったらまたお邪魔したいです。

おまけ