第2回 かわいいKotlin勉強会 #jkug でLTしてきた

7/4に開催された「第2回 かわいいKotlin勉強会」で、人生初のLTをしてきました。

第2回 かわいいKotlin勉強会 #jkug on Zusaar

当日は、KotlinのEclipseプラグインについて話してきました。

Kotlin Eclipse Plugin

こんなネタで大丈夫かな……という不安が発表が近づくに連れて膨らんできて最初はどうしようかと思ってたけど、Emacs用のkotlin-modeを作って発表してた方もいて、IntelliJ IDEA以外の環境でKotlinを動かしたいという需要は一定数あるみたい。このネタで持っていった意味はあったようなので少し安心しました。ウケも取れたし。

会場はリクルートマーケティングパートナーズさんのところだった。いい感じの雰囲気の会場で、ソファーとかあってリラックスできた。社内にこんなスペースがある職場が現実に存在するのか……って思ってた。

そういえば第1回はスーツの人がいっぱいいたって話を聞いて、みんなそんな感じかなと思って行ったらほぼみんな私服で、スーツは自分含めて3,4人いたぐらいだったと思う。

LT童貞捨てたり、Kotlinのステッカーもらったり、懇親会でKotlinの話とか、Swiftの闇の話とか、Androidの話とか、GoogleIOの話で盛り上がったり、充実した勉強会だった。

当日の他に発表された方のスライドはこちら。

Kotlinウォークスルー

KotlinでAndroidアプリケーションを作ってみた2014初夏

明日からちょっとKotlinでAndroidが書きたくなるかもしれない? SAM変換と拡張関数

当日の発表の様子がYouTubeに上がってます。

HabitBrowserカスタマイズしたらはてブが捗った

はてブアプリ使いづらい

はてブデビューしてから3,4ヶ月なんだけど、どうもAndroidはてなブックマークは微妙に使いづらい。ページの描画部分の使い勝手がいつものブラウザと変わってしまうのが難点。文字サイズが変えられなかったり、UA変更したりとかできないし……。

それならということで、設定で「外部ブラウザで開く」を有効にしてみたけど、ブックマークボタンは当然外部ブラウザには無いわけで、これはこれで使いにくい。

そこで、Android4.x系にしてから使っている「HabitBrowser」をカスタマイズしたら、だいぶ使いやすくなったので、設定方法をメモしておく。

実現できたこと

  • はてブアプリで新着&人気エントリーの一覧を開く
  • 読みたい記事をタップしていつものブラウザで記事を読む
  • いつものブラウザから1ボタンで直接はてブアプリのブクマ画面に飛ぶ

設定方法

いるもの

はてなブックマーク側の設定

  • メニュー→設定→外部ブラウザにチェック

HabitBrowserの設定

設定できる場所多すぎるので、とりあえず画面下部のアクションツールバーへの設定だけ。

  1. 設定→詳細→アクションツールバー
  2. 「+」ボタンを押して、アクション設定画面を開く
  3. 「□ なし」を押す→アプリを実行する→共有する→はてなブックマークで開く
  4. はてブアプリ起動を設定するには3.の"共有する"の代わりに"アプリケーション"を選択

自分は左端のスクリーンショットの設定にしてる。

他に設定できる場所

設定方法は各自で何とかしてください。

  • アドレスバーのサイドボタン
  • メニュー
  • スピードダイヤル
  • ジェスチャー
  • クイックメニュー

設定した結果

はてなブックマークの内蔵ブラウザで表示したものと、HabitBrowser+自分好みの設定で表示したものを比べてみた。

個人的には文字が小さめのほうが読みやすいし、画面内に収まる文章量が多いほうが記事全体の流れを把握・理解しやすいので、この方法を使ってる。

それと、はてブアプリから開いた記事じゃなくても、TwitterのTLに流れてきたURLを開く→ブクマとか、ググって開いたページをブクマするとか、そういった操作がスムーズになった。

さらに今回の設定は別にはてブに限らずなんでも応用できるので、PocketやEvernoteにぶち込むとか、TwitterへのPostとか、よく使う操作を登録しておけば、1ステップの操作で済むようになる。

クロス×レガリア 吸血姫の護りかた

Kindleで読みました。なんかAmazonKindle角川書店セールやっててめっちゃ安くなってるって話を聞いて、なんかそこまで重厚でもなくかっこ良くておもしろいのあれば読みたいなーって思って探してて、三田誠なら良さそうと思って買った。

高校生でボディーガードをしている戌見馳郎が、中華街の路地裏で倒れていた"鬼仙"のナタを拾って、吸血鬼側の面倒事に巻き込まれるっていう話。全体的にはボーイミーツガール×中華っぽい吸血鬼的な何か×バトルみたいな感じ。

三田誠は以前に読んだイスカリオテが好きで、あれはなんだか笑っちゃうぐらい厨二臭い感じだったのが、こっちのクロス×レガリアはそこまででもないです。今の自分にはそれが合ってた。

馳郎の普段から格好いいってわけじゃないけどちゃんと自分なりの信念を持ってるところは安心して見ていられる。自分の手に余るものに意地でも流されず、ついには自分の選択でそれを手にするところはやっぱり格好良かったです。

あとナタがずるいよね。何万年も生きているので達観した感じの物言いなくせに、いきなり一目惚れだし、制服に着替えて馳郎の前に出てくるシーンなんかすごいあざといしわかってるけどかわいかった。

面白かったです。一気に読んでしまった。Kindleで6巻まで全部買ったので、続きもどんどん読もうと思う。

2013年下半期ライトノベルツイッター杯に投票しました

さっきまですっかり忘れてて危なかった。まだ間に合うので投票忘れてた人はいますぐ@ranotwiに投票作品をリプライ!

2013年下半期ライトノベルツイッター杯 概要説明 - ライトノベルツイッター杯

下半期投票した作品と、ついでに今年読んだ本まとめみたいなの書きます。

既存

マグダラで眠れ (4) (電撃文庫)

マグダラで眠れ (4) (電撃文庫)

まあこの辺りはなんだかんだ言ってやっぱり毎回おもしろいので良い感じ。2作ともにこの調子で長く続いてくれるといいなー。

新規

きんいろカルテット! 1 (オーバーラップ文庫)

きんいろカルテット! 1 (オーバーラップ文庫)

神曲プロデューサー

神曲プロデューサー

異世界因果のトラベローグ 1 (オーバーラップ文庫)

異世界因果のトラベローグ 1 (オーバーラップ文庫)

神曲プロデューサー」はラノベか?って話もあるんだけど、主人公の年齢がちょっと高いだけでほぼラノベだった。それと正直なところ今年はラストで石川博品が全部持っていった感がある。

とはいえ特筆すべきは待望の姫ノ木あくラノベデビューであるってところであることは強調しておきたい!2巻がとても待ち遠しいです。

既刊

生徒会探偵キリカ4 (講談社ラノベ文庫)

生徒会探偵キリカ4 (講談社ラノベ文庫)

上半期作品なのでもちろん投票していないんだけど今年読んだものとしてはあとはこの2作。

キリカを最近4冊全部一気に読んだ。4巻がすごく面白かった。選手宣誓シーン、久々に最高にかっこいいと思えるシーンをラノベで見た気がする。こういう言葉で圧倒するのって、割と杉井光の得意分野だよね。

あと一つの大陸の物語は5月に読んだんだけど、もうこの表紙からして感慨深い。今までのシリーズキャラ全員でやりたい放題やりましたって感じでとてもおもしろかった。

というわけで

今年はこんな感じでした。2013年は17冊しか読んでないので、今年はもうちょっと増やしたいな。

2013年と2014年

2013年のこと

1クール目

  • ラブライブ!
  • 入籍。婿入りなので、妻の地元の町役場へ婚姻届を提出。帰りに時期外れの記録的大寒波に見舞われ、大雪で新幹線と在来線が止まる中12時間かけて帰る。
  • 西新宿のJava案件から外れて自社に戻る。今思えばここが一番まともだったかもしれない。Java7使ってたし。自社では新人のandroidアプリ開発の研修担当みたいなことをやってた。

2クール目

  • ゆゆ式に救われる
  • 新居に引っ越し。
  • 技術系AdventCalendarの存在を知って、JavaとかAndroidのを読み漁る。
  • μ's 3rd Anniversary LoveLive!で伝説を目撃。

3クール目

  • 7月あたりから上野のJ2SE1.4炎上案件に放り込まれる。
  • 結婚式。BGMでやりたい放題やる。
  • 艦これにハマるも3ヶ月で飽きる。
  • C84。準備できてなくて多方に迷惑をかけつつもなんとかラノベオフ幹事をこなす。
  • JVM系の関数型言語(Groovy, Scala, Kotlin)に手を出す。

最終クール

  • Kotlin触ってた。Project Euler解いたりとか。
  • はてブを活用し始めた。
  • はてなブログにしてからブログをまともに書き始めた(気がする)。
  • 晴海の某所に出向。セキュリティ厳し過ぎてイントラ内しか繋げられない。
  • JJUG CCC 2013 Fallで、技術系イベント童貞を捨てる。
  • コミケ不参加で絶望の年末を過ごす。ラノベオフ2回目。

まとめ

2014年のこと

Input / Output増やしたい

技術系お勉強会とか、イベントに積極的に参加していきたい。

それと年始に日経ソフトウェア初めて買って読んでみたけど面白かったので、WEB+DB PRESSとか、Software Designとかも読んでみようかな、と思いました。

あとイベントでLT参加してみたい。あがり症気味なのでちょっと怖いけど。

プログラミング言語とか

JVM系はKotlinを頑張りつつ、現段階で実用的な言語であるScalaもやる感じで。最近JavaScriptも好きなのでそっちも。もちろんJavaも。

あと、文法がJavaっぽくない言語って、アセンブリ言語以外触ったことないので、触ってみたいな。LISPとか、Haskellとか。こわいやつ。

本読むペースとか

ラノベは最近作家固定になってきて、読んだことない作家とか新人に手が伸びない感じがする。しかも去年は終わりのクロニクルとか、最近ウィザーズ・ブレインに手を出してみたりして既刊読むのに忙しくなってきた。

で、ラノベは既刊新刊合わせて月に7冊ぐらい読めれば、あと技術系の本とか雑誌とか合わせて10冊ぐらいになればちょうど良いかな?

ラブライブ!

2月頭にSSA4thライブ、4月にアニメで終わったらまたライブあると思うし今年もラブライブ!の1年になりそう。

2013年冬ラノベオフレポート

あけましておめでとうございます。

今回はコミケに行かなかったのでずいぶん気の抜けた年末でした。実家でだらだらと。正月は妻の実家でだらだらと。

ラノベオフれぽ

もう去年になってしまいましたが2013/12/29(日)に、毎コミケ恒例のラノベオフを開催しました。去年の冬に幹事を引退した平和さん(id:kim-peace)から幹事を引き継いで、2回目のラノベオフでした。前回割とぐだぐだだったのを何とかしたいなあと思っていたら変に緊張して開始直後は背中痛くなってました。

参加人数としてはだいたい50人前後。1人もドタキャンなくて良かったんだけど、人数確定後に10人ぐらい増えたのでご飯が足りなくなってしまった感じ。

ラノベオフでは、自由参加の企画として「最近読んで面白かったラノベアンケート」を毎回やっているのですが、今回はそれに加えて、まあクリスマスが近かったこともあり「ラノベ限定プレゼント交換会」をやりました。

ラノベプレゼント交換会について

「プレゼント交換会なんかあるといいかも」ってラノベオフ申し込みフォームの回答に書かれてて、じゃあクリスマスも近いしやってみますかーって感じで。

交換会ではだいたい30人ぐらいの人が参加してくれました。意外に被りが少なかったですね。TKGとかも1冊で済んで良かった……というかネタ本の量もなかなかちょうど良かったのでは。

交換会のやり方としてはくじ引き方式でやりました。受付時に預かった本に紙をはさんで、その半券的なものを参加者に持ってもらい、交換会開始時に抽選箱に半券を入れてもらって、半券くじを引く流れ。

うまくテンポ良く引いてもらう感じに流していけるだろうかって不安に思ってたんだけど、みなさん勝手にほいほい箱渡して引いてってくれたので助かりました。ちなみに交換会のくじ引き方式と紙を用意してくれたのはサブ幹事であるうちの妻です。

喋ってきたこと

やっぱり幹事ということもあり会話の時間は多く取れなかったけれども、つい最近「後宮楽園球場 ハレムリーグ・ベースボール」が発売された石川博品については限定卓作って充分喋れたので良かったかな。喋りたい欲が多少爆発し過ぎたかもしれない……。

それとこれは二次会でなんだけど、最近読んだ生徒会探偵キリカの4巻についても喋れたのも良かった。あの4巻はやっぱりすごいよなーって。

あと乾杯の時の挨拶でWHITE ALBUM 2の話やめろって言ったのに話しまょうって言われてやっぱり話しちゃったんだけど悪いのは私ではないはず。

ラノベオフの今後

ラノベオフこわくないよ、ってことで今後も参加の敷居を低くしてやっていきたい。特に初参加の人をどんどん歓迎していきたい。

やっぱり一番でかいのは開催時間と参加費をどうするかって話なんだけど、3500円以上は個人的にも高いと感じる反面、2時間だと短いのかな、とかね。とはいえどうせ二次会行く人は行くし2時間でも充分なのでは?みたいな話もあり。

これに関しては割とみんなの意見を聞きたいです。あとこの会場割と安いのでおすすめ、とかいう情報もあったら教えてくれると嬉しいです。もちろん今回のようなこんな企画やりたい案も、次回以降も参加者の意見を取り入れつつやっていきます。

個人的な次の目標としては、マイクの使い方かな……。もうなんか乾杯終わった時点で声枯れて汗だくだったんですけど、終わったあとにそんなに叫ばなくてもマイク聞こえるよーってアドバイス頂いたので次回以降に反映していきたい。いやこれは本当にありがとうございます。

というわけで

2013年冬コミ合わせラノベオフ、参加していただいた皆さんありがとうございました!

KAnnotatorでJavaライブラリでもNull-Safety機能を使う #Kotlin

Kotlin Advent Calendar 2013 22日目のエントリです。

Javaのライブラリ使いたい

Kotlin使ってて普通にサードパーティ製のライブラリ使いますよね。例えばJoda-Time使ってこんな感じで。

fun main(args: Array<String>) {
    val today = LocalDate.now()
    val first = today!!.dayOfMonth()!!.withMinimumValue()
    println(first!!.toString("mm/dd"))
}

すごい勢いある感!!

fun main(args: Array<String>) {
    val today = LocalDate.now()
    val first = today?.dayOfMonth()?.withMinimumValue()
    println(first?.toString("mm/dd"))
}

すごい疑問ある感?

便利な機能であるはずのKotlinのNull-Safety機能ですが、Javaライブラリでメソッドチェーンしたいときなんかは、どうしても微妙な感じになります。そのメソッド絶対null返さないから!って言いたくなる、なんかめっちゃnull不安な人のコードみたい。空気読んで欲しいですよね。

External Annotations

これを解決する手段として、JetBrainsが用意している型アノテーションがあります。Java側のコードで@NotNull*1、@Nullable*2が付いていると、KotlinではこれをNull-Safety機能として解釈してくれます。*3

ただ、だからと言ってJoda-Timeとか既存ライブラリいじって@NotNull付けて使うかと言われれば、そんなめんどくさいこと毎回やってたら大変だよね……ってところで登場するのが「External Annotations」です。

External Annotationsは、ライブラリを改変せずにXMLで「このメソッドに対してこのアノテーションを付ける」みたいな感じでアノテーションを外部定義できます。IntelliJ IDEAの機能の1つです。*4

Joda-Timeのnowメソッドまで移動して、おもむろにAlt+Enterを押します。

なんかそれっぽいの出ました。「Annotate method 'now' as @NotNull」を選択します。たぶん初回はExternal AnnotationsのXMLを保存する場所を聞かれるので、適当に選びましょう。

選択したディレクトリの中にパッケージ構成分のディレクトリが出来ています。そこにannotations.xmlというファイルがあって、中身はこんな感じになっているはず。

<root>
    <item name='org.joda.time.LocalDate org.joda.time.LocalDate now()'>
        <annotation name='org.jetbrains.annotations.NotNull'/>
    </item>
</root>

元のコードに戻ると、警告出てますね。

これで、Joda-Timeには何一つ手を加えることなく、メソッドに@NotNullアノテーションを付けて、Kotlin側からもnowメソッドの戻り値はNull-Safe型で扱えるようになりました。

でもこれdayOfMonth、withMinimumValue、さらに他のメソッドも全部同じことするかって言われれば、そんなめんどくさいことやってられないよね。

KAnnotator

External Annotations便利なんですが、それを一つ一つやるのはさすがに狂気の沙汰です。しかも@NotNull、@Nullableのアノテーションを選択するのは自分なので、ミスる可能性もあります。そこで「KAnnotator」の登場です。

KAnnotatorは 任意のライブラリに含まれる全メソッドの中身を推論し、External Annotationsを生成する IntelliJ IDEAのプラグインです。GitHubで管理されていて、IntelliJ IDEAのプラグインリポジトリからインストールできます。

新規プラグインインストールで検索ボックスに"Kotlin"と入力する*5とKAnnotatorが出現するので、インストールします。

ちなみにこれ、エントリ書いてる時点ででKotlinのDowndowd数が26000ぐらいに対してKAnnotatorが1650件ぐらいです。あんまり知られてない?

インストールが終わって再起動したら、メニューのAnalyzeに「Annotate Jar Files...」って項目が追加されてるので選択します。

ちょっと加工してますがこんな感じのウィンドウが出てくるので、Joda-Timeのライブラリにチェックを入れて、OK押します。そんなに待たずにExternal Annotationsの生成が完了します。

生成したXMLを見てみると、大量のメソッドに対して@NotNullのExternal Annotations定義が書かれています。@NullableのExternal Annotationsはわざわざ定義していないようです。*6

再度コードを見てみると、他の安全呼び出しにも警告が出ています。

というわけで、これでKotlinは空気を読めるようなりました!やったー!

KAnnotator / External Annotations のすごいところ

  • JavaライブラリでNull-Safety機能が簡単に使える!!!
  • ライブラリ側の対応を待たずに、@NotNull, @Nullableアノテーションが使える
  • アノテーションが大量でコードがぐちゃぐちゃ!みたいな感じにならない
  • ライブラリ側でExternal Annotationsを提供すればKotlin側で何の違和感もなく使える
  • Kotlin+External AnnotationsでJava側からは型アノテーションついてるように見える

今後Java8が正式リリースされて、Kotlinではなくとも型アノテーションを活用するシーンはいろいろ増えてくると思うので、そういう場合も簡単に対応できそうなのがいいですね。JetBrainsの公式でも「Annotate The World」なんて言ってますし。

現状KAnnotatorはNullabilityアノテーションしか対応していないみたいですが、今後は@Mutable, @ReadOnlyなどの他アノテーションへの対応や、@NonNullと@NotNullの違いの吸収とか、そのへんも対応してほしい!

Javaの標準ライブラリのExternal Annotations

このエントリを書くためにIntelliJ IDEAセットアップしてて今更気づいたんですけど*7、標準ライブラリってnullを返さないメソッドはNull-Safe型が返るようになってたんですね。

たとえばこんなコードとか。

fun main(args: Array<String>) {
    val cal = Calendar.getInstance();
    cal.set(Calendar.DATE, cal.getActualMinimum(Calendar.DATE))
    println("${cal.get(Calendar.MONTH) + 1}/${cal.get(Calendar.DATE)}")
}

変数calから呼び出してるメソッドの前には?がいるはず。これもExternal Annotationsでやってました。

Project Structure開いて→Platform SettingsのSDKs→Annotationsタブを開くと、Intellij IDEA側で持ってるJDKのExternal Annotationsと、KotlinのExternal Annotationsがインポートされてます。

ちなみにこれ、Files.get(String, String...)が@NotNullじゃないっぽいんですけど、あれってnull返す可能性あるんだっけかな……?

まとめ

KotlinでJavaライブラリ使うならKAnnotator使わない理由ない気がしてきた!試してないけどAndroidSDKのライブラリも対応できそう。

今回試したコードGitHubにあげたのでURL貼っておきます https://github.com/clomie/KotlinKAnnotatorTest

個人的には、コードがよりシンプルに書けるはずのKotlinで、言語機能の売りであるNull-Safety機能がJavaライブラリで微妙な感じになってしまうのがKotlinの残念な部分だと思っていたので、それが解決できた今Kotlin最強なんじゃないかと思ってきました。

Kotlin最強!Kotlinかわいい!\ホノカチャーン/

あとこんなに長いエントリ書いたの久々なのでちょっと疲れました。

参考URL

Using External Annotations | Project Kotlin

Kotlin M4 is Out! | Project Kotlin

*1:org.jetbrains.annotations.NotNull

*2:org.jetbrains.annotations.Nullable

*3:以前こういう機能あればいいのにみたいな話をしてたんですが、実はM3あたりから出来るようになってたらしい

*4:たぶん

*5:KAnnotatorでもOK

*6:たぶん……

*7:だからこそこのエントリ書いてる