Kotlin Koansを一通りやってみて気付いたこと

これはKotlin Advent Calendar 2014の23日目の投稿になります。

もう1年近くKotlinを触ってない身なのですが、是非カレンダー書いてくれ!と言われたので、ない知見を絞り出して書こうとしたのですが、気付いたらカレンダーも全部埋まり、みんなどんどん書いてくるのでKotlinの未来は変態安泰だなと思いました。

そんなことなので、とりあえずリハビリ的にKotlin Koansというのをやってみることにしました。いわゆるチュートリアルです。みなさんはもうやっていましたらすみません。

Kotlin Koansは、githubにリポジトリがあるので、それをcloneしてテストを流しながら課題を説いていったらKotlinのことわかるかもよ?ということだと思います。英語なので何言ってんのかわからないものもあったりしたのですが、とりあえずテストが通るようにしていけばいいんじゃないでしょうか。masterリポジトリが課題で、resolutionsリポジトリが答え(解答例)になります。わからないものは、解答例を見ながら考えてみるといいのではないかと思います。

とりあえず解きながら、その中で得られた知見をツラツラと書いていこうと思います。

i_introduction > _5_Nullable_Types

fun todoTask5(client: Client?, message: String?, mailer: Mailer) = TODO(
“””
Task 5.
Rewrite JavaCode5.sendMessageToClient to kotlin (using only one ‘if’).
Declarations of Client, PersonalInfo and Mailer are given below.
“””,
references = { JavaCode5().sendMessageToClient(client, message, mailer) }
)

JavaCode5.sendMessageToClientをKotlinで書き直せ(ただし、ifは1回な!)
だそうです。

public class JavaCode5 extends JavaCode {
    public void sendMessageToClient(@Nullable Client client, @Nullable String message, @NotNull Mailer mailer) {
        if (client == null || message == null) return;

        PersonalInfo personalInfo = client.getPersonalInfo();
        if (personalInfo == null) return;

        String email = personalInfo.getEmail();
        if (email == null) return;

        mailer.sendMessage(email, message);
    }
}

最初は特になにも考えずにおりゃーと書いてみたのですが、下のような感じ。

fun sendMessageToClient(
        client: Client?, message: String?, mailer: Mailer
) {
    if (client == null || message == null) return
    val personalInfo = client.personalInfo!!
    val email = personalInfo.email!!
    mailer.sendMessage(email, message)
}

こんな感じで書いたらテストで!!のところでぬるぽが発生してダメでした。
目的のデータは、emailなわけです。なので、以下のように書いてみました。

fun sendMessageToClient(
        client: Client?, message: String?, mailer: Mailer
) {
    if (client?.personaiInfo?.email == null || message == null) return
    mailer.sendMessage(client?.personalInfo?.email, message)
}

if式以降はclient?.personalInfo?.emailはnullでないことが証明されているのでこれでよかったんや!!めっちゃ短くなりました。Kotlinすごい。

iii_properties > 19_LazyProperty

遅延評価を行うには、Delegates.lazyを使うのが普通と思っていました。
しかし、課題はDelegates.lazyを使わずに遅延評価してみろというものでした。
以下のようにすれば、できるようです。

class LazyProperty(val initializer: () -> Init) {
    private val lazyValue: Int? = null
        get() {
            if ($lazyValue == null) $lazyValue = initializer()
            return $lazyValue
        }
    val lazy: Int
        get() = lazyValue!!
}

iii_properties > 20_DelegatesExamples

Delegates.mapVarとかDelegates.mapValとか初めて知りました。
プロパティをHashMapに委譲できるので便利ですね!

class Commodity(data: MutableMap<String, Any?>) {
  // data.get("description")の値を取得
  val description: String by Delegates.mapVal(data)
  // data.get("price")の値を取得
  var price: Int by Delegates.mapVar(data)
  // data.get("isAvailable")の値を取得
  var isAvailable: Boolean by Delegates.mapVar(data)
}

iv_builders > 24_TheFunctionWith

withメソッドで変数を囲むことで、ブロック内のスコープ上でその変数がthisになります。builderのような処理だと何度も書いたりすることがあるので、これは良さそうですね。

fun buildString(): String {
    val builder = StringBuilder()
    with(builder) {
        append("Numbers: ")
        for(i in 1..10) {
            append(i)
        }
    }
    return builder.toString()
}

syntax > classesObjectsTraits

Kotlinはクラス定義がコンストラクタになるから、プライベートコンストラクタを作るとき、このように書くようです。
クラス名の直後にprivateと書くのはなんか忘れてしまいそう…。

class ClassWithPrivateConstructor private(val bar: Int) {
    class object {
        fun newInstance() = ClassWithPrivateConstructor(9)
    }
}

その他、一通りやってみました。collectionのところなどは、filterメソッドやmapメソッドを使って簡潔に書く方法などを、テストを通して学ぶ事ができるので、間違っているかどうかもすぐにわかります。

久々にKotlinを書いてみましたが、コレクションの扱いなどはやりやすくてやっぱりいい言語だなーと思います。
普段はRubyばかり書いているのでなかなか触る機会が少ないのですが、来年は!来年こそは!!


ActiveRecordでリレーション先の項目があるのを必須にする

毎度毎度忘れてしまうので、メモとして書いておこう。

例えば、コメントを保存する場合に、存在する記事IDを必須にする場合は、
以下のようにhas_many側にinverse_ofを付けること。

class Article
  has_many :comments, inverse_of: :article
end
class Comment
  belongs_to :article

  validates :article, presence: true
end

パトランド紹介 その3

これは大都会岡山Advent Calendar 2014の19日目の記事です。

前日は@sakie_boondockさんの「津山っていいところなのよ。」でした。
明日は@mako_wisさんです。

金曜日担当もこれが最後。
先々週にパトランド紹介 その1を書きました。
先週、パトランド紹介 その2を書きました。
今回でラストになります。

その7.寝室のシェルランプ3つ

CIMG3375

先日、ようやく届いたので追加しました。寝室の反対側の壁のランプです。小さめのシェルランプ3つで、ちょうどいい明るさです。風で揺れるとシャラシャラと気持ちいい音を立ててくれます。ケーブルが長すぎたので、魚の形をしたケーブル収納を使ってみました。シェルランプと相まって、予想以上にいい感じです。

CIMG3378

近くに寄ったところです。いい雰囲気です。

その8.玄関

CIMG3371

はい、突然の外です。玄関です。玄関のドアは緑色で爽やかな感じです。両袖にガラスがあって大きく見えます。が、これ実はフレームがアルミでガンガンに冷気が伝わってきてて困っています。窓系は全て樹脂素材で断熱されていると思っていたのですが、サービスで無料で玄関に付けられると言われて付けたこの両袖がまさかのアルミとは…。

それはそうと、メインで撮っているこの箱は、宅配ボックスです。この箱の中に宅配物を入れてもらったらシャチハタが押せるようになり、留守の時でも荷物を受け取ることができます。なかなか大きいサイズでも入るので、よくネットで注文する私たち的には非常に重宝しそうです。すでに何回か利用されている模様(嫁談)。

その9.全体像

CIMG3369
そして、これが我が家の全体像になります。屋根と駐車場の屋根で太陽光発電をしています。家の形は広さを重視したので長方形です。シャッターのところは、まだあんまり手がつけられていないのですが、自転車部屋の予定のところです。これも整備できたらまた写真アップしていきたいなーと思います。ですが、それはまた別の機会に…。

3週間にわたりご覧いただき、ありがとうございました!
大都会岡山にほとんど関係なかったですが、この家で、来年は勉強会を開催していこうと思います(Ruby, Kotlin, Androidなど)。その際には是非ご参加ください!


合同勉強会に参加してきたよ

今年も合同勉強会 in 大都会岡山 2014 Winter & 忘年会議2014 に参加してきました。
これを迎えると「あぁ、もう年末か」という感じがします。

togetterまとめがあるので、リンクをはっておきます。

合同勉強会 in 大都会岡山 -2014 Winter- & 忘年会議2014 まとめ #gbdaitokai #忘年会議

自分があんまり追っていなかった情報について色々知ることができるので、こういう勉強会は有意義だなぁと思います。
Golangのこととか、Java8のこととか、関数型言語のこととか。
また、イケメンこと@yusukeさんのbitcoin支払いに対応したという話は、全然触れる機会のないbitcoinの謎な部分がわかって面白かったです。

私はNemCaの宣伝LTをしてきたのですが、忘年会議のスライドで皆さんがNemCaを使ってくれてたので、うれしかったです!こんな機能があるといいなーとか色々ご意見いただけると助かります。

NemCa – 名札作成サイト –


パトランド紹介 その2

これは大都会岡山Advent Calendarの12日目の記事です。

前日は@ryosmsさんの大都会岡山を楽しむための用語集2014_追加.xlsでした。
明日は@mako_wisさんです。

先週、パトランド紹介 その1を書きました。
今回はその2になります。

3つずつ紹介していこうと思うので、今回は4つ目からです。

その4.階段と手すり

二階への階段。手すり付き。
まずは二階に続く階段です。開放感を出すために、3段目までを広くとっています。さらに、縦の手すりを付けています。これも妻のこだわりです。洗面室側から階段を上るときにこの手すりを掴んでクルッと回れるようにしています。割とよく使っていて、便利な手すりです。

その5.フリースペース

フリースペース。ヒノキの無垢の床。
二階に上がるとフリースペースが広がります。ヒノキの無垢の床です。写真は引越し前に撮ったものなので、なんにもありません。今は実際はちょっと引越しの荷物でゴタゴタしてます。
家を建てる時、デッドスペースをあんまり生まないようにするために、なるべく廊下を無くそうと思っていました。部屋を多くしようかと考えたときもあったのですが、開放感があるほうがいいということで、書斎の予定だったところの壁を取り去りました。無垢の床は素足だと気持ち良いです!ただ、まだ照明がついていません。今のところ、レールだけついています。

その6.寝室とベッド

寝室のベッド。
寝室です。寝室も壁の照明以外はまだ付けていないです。反対側の壁と天井は淡い緑色です。カーテンも緑色になっていて落ち着く部屋です。
図らずもこだわりの品になってしまったのが、ベッドです。このベッドは広島県府中市にある佐々木木工さんが販売しているものです。このベッド、実は特許のあるすのこのベッドなのですが、ガチッと固定されているわけではなく、すのこが体重によってしなるようになっています。それがものすごく寝心地がよかったのと、デザインがカッコよかったので衝動買いのように買ってしまいました。色違いのシングルベッドを2つ並べたら、見た目もいい感じです。
一般にはあまり流通していないそうですが、佐々木木工さんのショールームで試すことができます。ベッド以外にもこだわりの家具が数多くありました。丁寧に説明してくださってとてもいいお店です。福山方面へドライブがてら寄ってみてはいかがでしょうか。

以上が2になります。

来週もお楽しみに!