算譜王におれはなる!!!!

偏りはあると思うけど情報技術全般についてマイペースに書くよ。

2017年のKotlinまとめ #ktac2017

f:id:ngsw_taro:20121129063626j:plain

今年も残すところ1ヶ月となりました。 街には色とりどりのイルミネーションが輝いています。 ピンクオンリーの電飾を最近見かけますが、なんだか桜を連想させて季節感がないなぁと思ってしまいます。 私は王道の黄色?の電飾が好きで、表参道に見に行きたいです。 クリスマスが楽しみですね!

ということで恒例のKotlinアドベントカレンダーが本日スタートしました! 初日はtak-ondaさんの「Kotlin サーバーサイド開発に採用した軽量 Web フレームワーク Jooby の紹介と採用理由」です。

…実は、今年はアドベントカレンダーを作成したのはいいものの、参加のタイミングを伺っている間に全枠が埋まってしまいました。 嬉しいですねぇ。 そのため、この記事はアドベントカレンダーに紐付いたものではありませんが、今年のKotlinについて簡単に振り返ってみたいと思います。

続きを読む

KotlinConf 2017に参加してきたよ〜!!

f:id:ngsw_taro:20171103005138j:plain

JetBrainsによるKotlinのカンファレンス「KotlinConf 2017」に参加してきました! 11月2日と3日の2日間開催で、場所はサンフランシスコです。 このような大規模なKotilnカンファレンスは初めての開催となります。 1,200枚のチケットは完売とのことです。

本エントリは、KotlinConf参加を含む雑な旅行記です。 技術的な話はCA.kt #4 (Kotlin Conf報告会)で発表します。 私は「Spring and Kotlin」というタイトルで発表する予定です。

続きを読む

Springで_methodがputやpatchのときにリソースオブジェクトに値がマッピングされない問題(解決済み)

対象はSpring framework 4.3.10, Spring Boot 1.5.5, 1.5.6。

こういう単純なREST APIがあります。

@SpringBootApplication
@RestController
public class DemoApplication {
    public static void main(String[] args) {
        SpringApplication.run(DemoApplication.class, args);
    }

    @PatchMapping("")
    public String patch(TestResource testResource) {
        return "PATCH: " + testResource.getValue();
    }
}

class TestResource {
    private String value;

    public String getValue() {
        return value;
    }

    public void setValue(final String value) {
        this.value = value;
    }
}

ちゃんとPATCHメソッドでリクエストを投げれば問題ないのですが

$ curl -X PATCH http://localhost:8080 -d 'value=HELLO'
PATCH: HELLO

POSTメソッド + _method=patch指定で投げるとTestResourceクラスのvaluenullになってしまいます。

$ curl -X POST http://localhost:8080 -d '_method=patch' -d 'value=HELLO'
PATCH: null

これはどうやらSpring自体のバグっぽくて(https://jira.spring.io/browse/SPR-15828)、Spring 4.3.11で修正されているので、Spring 4.3.10の使用を避けます。 スナップショットですがSpring Boot 1.5.7を使うか、Springのバージョンを4.3.11.BUILD-SNAPSHOTと直接指定してやればOKです。

Schooに出演してKotlin語って来たよ〜!詳しい回答つき

f:id:ngsw_taro:20170608110405j:plain

昨日、オンライン動画学習サービスのSchooさんの生放送授業に出演しました。

schoo.jp

Android開発言語にKotlinが正式に仲間入りというニュースがきっかけで、初めてKotlinを知ったという開発者も多くいらっしゃると思います。 そのような人たちのために、サクっとKotlin紹介みたいなノリで1時間お話しさせていただきました。

小さい勉強会でのLTから大きなカンファレンスでの講演まで数多く経験してきて、人前でしゃべることには緊張こそすれ慣れているつもりでした。 しかし「生放送」というものは初めての経験だったので、勝手がわからず緊張しているのかリラックスしているのか、よくわからないテンションで臨みました。

普通の勉強会は、聴衆の反応を直接感じることができ、臨機応変に振る舞えるものだと思います。 要は軌道修正やそのタイミングの察知が容易なのかなぁと。

一方、生放送という形は、リアルアイムで視聴者のコメントが届き、ある程度の反応はわかるものの、「楽しんでもらえてるかな?」とか「難しすぎないかな?」という不安を話しながら感じていました。 とはいえ、ネットを介すことでコメントや質問がしやすいようにも思えます。 リアル勉強会では最後の質問コーナーで、挙手して皆の前で質問する人は決して多くないのではないかと思います(多くても質問の数は3個とか4個)。 昨日の生放送では、20個くらいは質問をいただけたと思います。

特に主張したいことはないのですが、初めての形態での情報発信をできたことを純粋に楽しめたし、私自身 非常に勉強になりました!

いただいた質問を詳しく回答

いただいた質問に対して丁寧に回答したつもりでしたが、プログラミング言語のことなので、やはり言葉だけでは伝わりづらい部分もあるのだと思います。 なので、コードを添えて回答したいと思ったものを、この場で解説します。

Q. データクラスのプロパティの妥当性検証はできるのか?

できます。 Kotlinのクラスには「イニシャライザ」というものがあり、ここでインスタンス生成に関する事前条件の検証等を行います。

例えば人物を表すクラスPersonを考えます。次のような実装になるものとします。

data class Person(val name: String, val age: Int)

このような実装ですと、次のように年齢に負数をセットすることができてしまいます。

val taro = Person("Taro", -1)

このような不正な状態のインスタンスを生成したくありません。 そこで「イニシャライザ」の登場です。 クラスPersonを、次のように書き直します。

data class Person(val name: String, val age: Int) {
    init {
        if (age < 0)
            throw IllegalArgumentException("ダメ")
    }
}

この新しいPersonインスタンスを生成するときにPerson("Taro", -1)とコンストラクタを呼び出すと、例外がスローされます。 不正な状態のインスタンスを生成することを防げた、というわけです。

ちなみに、このような事前条件の検証を行うための便利な関数が標準ライブラリに含まれています。 それを使って書き直すと、こうなります。

data class Person(val name: String, val age: Int) {
    init {
        require(age >= 0, {"ダメ"})
    }
}

Q. データ隠蔽はできるか?

できます。 Kotlinのプロパティへのアクセスは一見、内部データに直接アクセスしているように見えますが、違います。 内部データは「バッキングフィールド」という形で保持しますが、外部からこれを直接触ることはできません。 すなわち内部データと、それへのアクセスを提供する窓口は別に提供されます。 デフォルトでデータ隠蔽できているのです。

class Foo {
  val foo = "Foo"
}
Foo().foo //=> Foo

プロパティfooへのアクセスは、内部データを直接見ているような感じがします(Javaに慣れている人なら特に)。 しかし、実はそうではないことを、次のコードで確認することができます。

class Foo {
    val foo: String = "Foo"
    get() {
        println("fooを返します")
        return field
    }
}
Foo().foo
// fooを返します
// Foo

fieldは暗黙の変数で、カスタムゲッターやカスタムセッターの中でのみアクセス可能です。 このfieldが内部データの正体です。外の世界からこいつに接触することはできません。

ひとこと

「髪短くしたね!」って言われるのを期待しているのに「黒くなったね!」とよく言われます。