それがいいことの序章です

楽しいことならいっぱい夢見ることならめいっぱい

KotlinでGsonでStringをBooleanにする

やったこと

AndroidでRetrofit + Gsonを使っているときのおはなし。
APIレスポンスにStringで"0"、"1"が返ってくる場面に出くわして
これをBooleanとして扱いたくってTypeAdapterを使ったよ。

なにが起きたか

{
    "is_success": "1"
}

みたいなやつをBooleanで扱うぞと思って

data class Response(
    @SerializedName("is_success")
    val isSuccess: Boolean
)

というふうにしてたら全部trueになった。全てが正になった困った。

どうやったか

パッと思いついたのはコンバータクラス作って

// レスポンスはStringで受ける
// data class Response(
//     @SerializedName("is_success")
//     val isSuccess: String
// )

object ResponseConverter {
  fun convert(res: Response) = Item(isSuccess = res.isSuccess == "1")
}

fun Response.convert() = ResponseConverter.convert(this)

みたいにするのだけど、毎回するのアレだよな〜と思って調べたら
TypeAdapterなるものを知った。詳しくは説明しないけど便利。

ということで

class IntToBooleanTypeAdapter : TypeAdapter<Boolean>() {
    override fun write(out: JsonWriter, value: Boolean?) {
        if (value == null) {
            out.nullValue()
            return
        }

        out.value(if (value) 1 else 0)
    }

    override fun read(`in`: JsonReader): Boolean {
        if (`in`.peek() == null) return false
        return `in`.nextInt() == 1
    }
}

というふうにしてあげて、レスポンスを

data class Response(
    @SerializedName("is_success") @JsonAdapter(IntToBooleanTypeAdapter::class)
    val isSuccess: Boolean
)

のようにしてあげることで、無事変換された!!

おわりに

Gsonがどのようにうまいこと変換してくれるかまで
調べるのに手が回ってないので時間ができたら調べる。

Gsonなのか、Kotlinの型の問題なのかわすれちゃった。。
Javaのときはできてたような…できてなかったような…

調べたら追記するかも。明日はDroidKaigi。

使わないパラメータでWarningを出さない for Kotlin

Androidの話。
MVVMアーキテクチャで開発をしていると、ViewModelにクリックメソッドを実装する事が多い。
その際、

fun onClickHoge(view: View) {
  someThing()
}

のように定義するんだけど、このviewというパラメータはそこまで使わない。

使わないパラメータで警告を出さないようにしようと

fun onClickHoge(@SuppressWarnings("unused") view: View) {
  someThing()
}

としてたんだけど、これでは警告が抑えられていなかった。

調べてみると、これはJavaの書き方のようで、Kotlinだと@Suppressを使うらしい。
そこで、

fun onClickHoge(@Suppress("unused") view: View) {
  someThing()
}

としたんだけど、これでも警告が抑えられていなかった。

調べてみると、unusedじゃなくてUNUSED_PARAMETERを使うらしい。 そこで、

fun onClickHoge(@Suppress("UNUSED_PARAMETER") view: View) {
  someThing()
}

とすると、警告が抑えられた!🙌

conclusion

困ったらalt + Enterだ 🙏 f:id:rmakiyama:20180126140801p:plain

DroidKaigi conference-app-2018にコントリビュートした

このブログをはじめるきっかけにもなったDroidKaigi 2017。
一番最初のブログで、こんなことを言ってた。

来年もまたあったら絶対にコントリビュートする!と心の中で誓う私。

DroidKaigi 2017 is awesoooome!!! - イニシャルがリムーブ

コントリビュートした💪

有言実行。簡単なissueを拾ってコントリビュートさせて頂いた。

github.com
このissueをこう。
github.com
やったぜ!

すごい :+1: の飛び交う雰囲気でとてもあたたかくて
PR出すまで緊張してたけどとっても嬉しかった!

もういっちょ

あとは見ていてコードでの知見もだがUI的にも参考になる。
ぜひとも見て触って欲しいと思う。集合知である。

触ってたら


なんて事もあって1行入れ替えのPRを出したら
爆速でマージしていただいてさらに良い経験になった!

github.com

英語が本当にひどいので頑張ろうと思った。
けど、こんな英語でも怒られることはない!(?)

やってみて所感

今回のコントリビュートで、OSSに関わるって
楽しいし夢があるし学びしかないと身を持って感じれたのが
1番の収穫だったと思う!機会があれば狙っていきたい!

今がチャンス

easyタグのissueが増えた今がチャンス!
ぜひこの体験をあなたも!あなたも!

github.com


P.S.
2週間に1記事が聞いて呆れるけど、気にせず続けていきます🙌

RxKotlin2.2.0での注意点

ギリギリ前回から2週間以内。あまり重く考えず、会社の休憩中に書いていきます。

RxKotlin

軽く紹介すると、RxJavaはRxのJava実装ですが、RxKotlinはRxのKotlin実装ではなく RxJavaに便利な拡張関数を追加できる軽量ライブラリです。

約一ヶ月半前のことです。バージョン2.1.0のリリースノートを見て、「最高かよ…」と思い 用法用量を社内コンフルにまとめて、さっそく実務投入しました。

そして12月に差し掛かったある日。

f:id:rmakiyama:20171218142733p:plain

困ったというかビックリしました、、

2.2.0での注意点

バージョン2.2.0のリリースノートに書かれたことが全てです。

(個人的に)大きく変わったところは、singlemaybeto~メソッドが削除されたところです。

// hoge()の処理からSingleを生成
Single.just("hoge")

// RxKotlin 2.1.0
"hoge".toSingle()

簡易的にSingleMaybeを生成する場合に重宝するかなと思っていた部分だったのですが どうやら他のライブラリなどと競合する部分もありなくなったようです。

あまりいないかもしれませんが、使っている方は注意。

私の2.1.0での勘違い

指摘されるまで気づかず使っていたのですが、toSingle()メソッドの定義は以下のようになっていました。(2.1.0では)

// ver.2.1.0 -> https://github.com/ReactiveX/RxKotlin/blob/2.1.0/src/main/kotlin/io/reactivex/rxkotlin/single.kt
fun <T : Any> T.toSingle(): Single<T> = Single.just(this)
fun <T : Any> Future<T>.toSingle(): Single<T> = Single.fromFuture(this)
fun <T : Any> Callable<T>.toSingle(): Single<T> = Single.fromCallable(this)
fun <T : Any> (() -> T).toSingle(): Single<T> = Single.fromCallable(this)

あるメソッドをストリームに載せたい場合に安易に

hoge.toSingle()

としていたのですが、これではSingle#justメソッドが呼ばれるためストリームに乗らないのでした。 勝手にSingle#fromCallableが使われていると思っていました。とんだ間違いでした。。

※ 現在(ver 2.2.0)はtoSingleメソッドは一掃されて存在しません。

まとめ

  • ライブラリアップデートでBreakingな変更はウォッチしよう!
  • ライブラリは内部実装もある程度読んで、動きを把握した上で使おう!

アウトプットが怖くなくなりたい

DroidKaigiで気分がよくなってブログを始めてみたのが遠い記憶です。
いいきっかけだと思い始めたものの、なかなか続かないものだなと身をもって知りました。

なぜ続かないのか

アウトプットは積極的にしたい!と思うものの、なかなか腰が重いのです。
なんで続かないんだろう、答えは簡単です。

  • 書くネタがない

これを言ってしまうとおしまいなんですよね。思考停止しています私。
もう少しない頭を使ってみます。

書くネタがないとは、

もはや、そもそも書くネタとはなんでしょうか。
簡単に思ったことを列挙してみます。

  • みんなにとって有用な情報
  • 誤りのない正確な情報
  • 他の人が書いていない情報
  • 旬な情報

なるほど、偏った考えだということがわかります。

本当に続かない理由

ほげほげ言い訳を放ったものの、本当に続かない理由はひとつでした。

  • アウトプットが怖い

「自分が書いても誰の特にもならないのでは、、」
「間違った情報かもしれない、、」
「これは色んな人が書いてるし自分なんかが、、」
「今更こんなこと書いてもしかたなくないか、、」

無駄に何かに怯えている自分がいました。でも怖いですよね。
誰に攻撃されるわけでもないのに守りに入っています。怖くなくなりたい。

怖くても書く意味

先日、「ブログを書く技術」を発表したという記事を読みました。

そんなことを言う暇があったら書く

分かってても難しい。それでもせっかくこういった記事を読んでいいなと思ったので
それだけでいいんです、書いていこうと思います。意味は後追いしてくれればいいんです。

続けた末に…

こんなの考える前に書けって話なんですが、続いたとして、振り返ってみて
達成できてたらやったぜ!ってネタにもなるので書いておきます。

  • 自分の外部記憶装置としての役割を果たす
  • 伝える/伝わる文章が書けるようになる
  • 理解が深まっている(言語化できる)

というわけで

絶対に!最低でも!2週間に1回は!ブログを!書くぞ!!

続きを読む