読者です 読者をやめる 読者になる 読者になる

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

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

#DroidKaigi でKotlinハンズオンの講師をしたよ〜!

Android Kotlin イベント/カンファレンス

f:id:ngsw_taro:20170315105718j:plain:w600

3/9(木)、3/10(金)にDroidKaigiに行ってきました。 2日目にはKotlinハンズオンの講師を務めました。 KotlinとAndroidを絡めたハンズオンをやるのは実は初めてで、結果的にはおおむね成功でしたが、課題がいくつか残りました。

90分という枠にいろいろ詰めすぎたことを一番反省しています。 RetrofitとDagger、async/awaitはスコープに含めるべきではありませんでした。 これらを盛り込んだ理由は、RetrofitやDaggerなど AndroidJavaで便利に使えるライブラリをKotlinからも難なく使えるんだよ ってことを示したかったからです。 async/awaitは、DroidKaigiより1〜2週間前にKotlin 1.1がリリースされたこともあり「せっかくだから紹介しよう」というノリで入れてしまいました。

ご協力いただいたチューターの方々のブログもご覧ください。

サンプルプロジェクトはGithubで公開しています(https://github.com/ntaro/github-client-for-droidkaigi)。 スライドはこちら↓

次回ハンズオンの宣伝

日本Kotlinユーザグループ x teratail でお送りするKotlinハンズオンが4/15(土)に開催されます! 3/22(水)から募集開始です。 レベル感としては「Kolintは初めてだけど他の言語でプロダクト作ってるよ」って人を対象としています。 ぜひお越しください!

kotlin.connpass.com

Kotlin 便利なプラグインが2つ登場しRealmが捗るよ〜

Kotlin

blog.jetbrains.com

Kotiln 1.0.6がリリースされました! 同時に面白いプラグインが2つリリースされました。 all-open compiler pluginとno-arg compiler pluginです。

all-open compiler pluginは、指定したアノテーションがついたクラスが自動でopen指定されるという機能を持ちます。 no-arg compiler pluginは、指定したアノテーションがついたクラスに、自動でデフォルトコンストラクタ(引数を持たないコンストラクタ)を生成してくれます。

導入方法は、冒頭に示したKotlin公式ブログを参照してください。

今回はこれらのプラグインを用いることで、Realmが使いやすくなることを示したいと思います。

プラグインなし

まずは普通にKotlinだけを使って、Realmオブジェクトを定義してみます。

open User(@PrimaryKey open var id: Long = 0,
          open var name: String = ""): RealmObject

うひゃー、おまじないだらけですね。

openが3回も登場していますが、RealmがこのUserクラスを継承して面白い機能を追加するために必要なのです。

また、Realmはデフォルトコンストラクタを要求します。 そのためUserクラスのプライマリコンストラクタでデフォルト引数を与えることで、引数なしのコンストラクタを提供しているというわけです。

ともかく、本来であれば無視してもよいことに注意しなければならないのですね〜。

all-open compiler pluginを使う

all-open compiler pluginを使って、open修飾子を退治しましょう。 プラグインの設定として、下記をbuild.gradleに記述します。

allOpen {
    annotation('io.realm.annotations.RealmClass')
}

この設定により、@RealmClassアノテーションが付いたクラスが、自動でopen指定となります。

@RealmClass
User(@PrimaryKey var id: Long = 0,
     var name: String = ""): RealmObject

no-arg compiler pluginを使う

次にno-arg compiler pluginを使って、デフォルト引数を毎回記述する退屈な作業から解放されましょう。 プラグインの設定として、下記をbuild.gradleに記述します。

noArg {
    annotation('io.realm.annotations.RealmClass')
}

all-openのときと同じように、@RealmClassが付いたクラスを対象に、デフォルトコンストラクタの自動生成を設定します。

ついにやりました! 謎のopenもデフォルト引数も、キレイに消えたコードが手に入りました!

@RealmClass
class User(@PrimaryKey var id: Long,
           var name: String) : RealmObject()

おまけ

no-argで自動生成したデフォルトコンストラクタは、Kotlinのリフレクション機能を使ってもアクセスすることはできないようです。 一方Javaのリフレクション機能を使うとアクセスできます。

@MyAnnotation // このアノテーションに対してno-arg設定
data class Hoge(val value: String)
Hoge::class.constructors.forEach(::println)
println("----------")
Hoge::class.java.constructors.forEach(::println)
println("----------")
println(Hoge::class.java.newInstance())

実行すると...

fun <init>(kotlin.String): Hoge
----------
public Hoge()
public Hoge(java.lang.String)
----------
Hoge(value=null)

App Shortcuts 実装方法と実際の応用例

Android

f:id:ngsw_taro:20161207211521p:plain:w400

一昨日くらいにAndroid 7.1.1のOTAが開始されましたね。 私のNexus5Xにも届いたので、早速インストールしました。

Android 7.1で目玉の機能となるのは、App Shortcutsなのではないでしょうか! ということで試してみました。 公式のAPIガイドを見てやれば、すごく簡単に実装できます!

App Shortcuts 概略

App Shortcutsは、欲しい情報にすぐにアクセスするための機能です。 ランチャーアイコンを長押しすることで、ショートカット一覧が表示されます。 ショートカットを押せば、そのアプリの特定の画面にすぐにたどり着けるというものです。

続きを読む

2016年のKotlinまとめ #ktac2016

Kotlin

f:id:ngsw_taro:20121129063626j:plain

今年もアドベントカレンダーの季節がやって参りました。 ということでKotlin Advent Calendar 2016、1日目の記事です。

2011年にKotlinプロジェクトが発表され、2012年に実装が公開されました。 2013年は知る人ぞ知る言語という位置付けで、2014年、2015年は時折バズっては徐々にファンを増やしていった時期です。 そして、2016年最大の出来事は何と言ってもver 1.0のリリースです。 勉強会や開発事例、求人情報も増え、「実用の年」と言えるかもしれません。 本記事では2016年のKotlinにまつわる出来事を振り返りたいと思います。

Kotlinの成長

2月に新しいロゴとともに、ver 1.0.0がリリースされました。 さらに、同じタイミングでSpring BootのKotlinサポートがリリースされました。

3月にはAndroidにおける、Jack and JillやJava8に対してのKotlinとJetBrainsの姿勢について言及がありました。

5月にGradleのビルドスクリプトをKotlinで書けるようになるよという話もありました。

で、いろいろあって(特に目立ったイベントはなく)、現在はver 1.0.5までリリースされており、いくつかのバグ修正、改善とツールまわりの対応がなされました。 そして次のver 1.1のマイルストーンは、3番目がリリースされています。

ver1.1での目玉は、コルーチンのサポートでしょうか。 型エイリアス、Bound Callable Referenceも大きな改善です。 型エイリアスは、その名の通り型に別名を与えます。 Bound Callable Referenceは、例えばval f: (Int)->Char = "foo"::getのようにメソッドをレシーバと結びつけた上で関数化することができる機能です。

その他にもデータクラスの継承サポート、シールドクラスのルール緩和、委譲プロパティの対象拡大、ラムダ式の引数での分解などが加わります。

日本のコミュニティ

今年は今までで一番コミュニティが盛り上がった年でもあります。 connpassでKotlinを検索すると、現時点で47件もの勉強会がヒットします。 去年が7件であることに対し7倍近く増えています。

Sansanさん主催のKotlin勉強会は、非常に存在感が大きいです。 第1回が1月に行われ、そのときは幸運なことに、JetBrains Kotlinチームの人にご登壇いただきました。 第2回、第3回は勉強会スタート時からビール片手に発表を聞けるというスタイルで、なごやかな雰囲気で楽しかったです。 そして、今月13日に第4回が開催予定です!

今月、もう一つKotlin勉強会があります。 Rettyさん主催の勉強会で、今回はKotlinのテーマらしいです。 私は私用につき途中で退出しますが、登壇者枠、ブログ枠ともに空いているので、ぜひご参加ください!

関西にKotlinコミュニティ Kansai.ktが誕生しました。 やはり勉強会は東京に集中してしまいがちなので、活動を応援したいです!

Kotlinエバンジェリストを自称しているだけあって、登壇オファーをたくさんいただきました。 上記のSansan勉強会、Retty勉強会に加え、Kotlin/GoデベロッパーミーティングHacker TackleLightweight Language of Thingsたろうさんと学ぼうKotlin入門ビズリーチ社内勉強会関西Kotlin勉強会など、たくさんお声いただき、ありがとうございます。 登壇、執筆依頼はいつでもお受けしますので、お気軽にお声掛けください!

書籍

手前味噌ですみませんが、今年の7月に「Kotlinスタートブック」なるKotlin入門書を出しました。

Kotlinスタートブック -新しいAndroidプログラミング

Kotlinスタートブック -新しいAndroidプログラミング

おわりに

来年はさらに盛り上がるでしょう。 ver 1.1のリリースが控えており、JDK9、Spring 5.0などのリリースもあります。

前述の通り、connpassでKotlin勉強会を検索すると47件ヒットしますが、目指せ100件超え!ですね。 Wantedlyで「シゴト」をKotlinで検索すると現時点で112件ヒットします。 1年後には何件に増えているのか、楽しみです。

明日の担当は@lVlA0805さんです。お楽しみに!