雰囲気でTwitterクライアントを作った

この記事はCPS Lab Advent Calenderの21日目の記事です。20日目の記事はものづくりの一年〜2017年を振り返ってみて〜です。22日目の記事はコーディングで編曲をした話です。

たこです。最近はラボで怪しい笛を吹いています。

2018-12-08 追記

この記事は古いので、現状ではこの構成でできないと思います。 ストリーミングAPIや、Twitter kitのサポートは終了しています。

つくったもの

CiderというTwitterクライアントです。
ぜんぜん完成とは言えない状態です。でもまあリリースしよう!と考えていたのですが、User Stream廃止日が決定してしまい、何ともタイミングが悪いです。名前のCiderはすっきりして使いやすいようなイメージから付けました。

f:id:takorras:20171221154814p:plain:w300 f:id:takorras:20171221154844p:plain:w300 f:id:takorras:20171221154731p:plain:w300 f:id:takorras:20171221155107p:plain:w300

Android開発

これまで大した開発をしたことがなかった私ですが、モバイルアプリケーション開発を始める事にしました。特にAndroidにする理由はなかったのですが、手元で動くと楽しいかと思って始めました。

使用した技術

Kotlin

JetBrains製の、JVMで動く言語です。JavaというよりはSwiftっぽいモダンな書き方ができて、サクサク書くことができます。
詳しい仕様は調べるとたくさん出てくるので割愛しますが、知見や公式のドキュメントが充実しているので、学びやすいと思います。
書いていると、いつの間にかJava書きたくなくなってきます。

更にKotlinにはKotlin Android Extentionという便利なプラグインがあります。ButterKnifeとかDataBindingとかfindViewByIdみたいに、レイアウトとコードを結びつけてくれます。…今回は使用してないけど。

Kotlin Android ExtensionsでfindViewByIdにサヨナラする

Twitter kit for Android

本当にあっさりTwitter APIを使う事ができます。

脳死チュートリアルに従うだけで認証からツイート、読み込みまでできますが、考えなしにこれだけでクライアントを作ろうとすると、公式の劣化版みたいになってしまいそうな印象でした。

Twitter kitから使用できるのはREST APIのみで、Streaming APIは使用する事はできません。もしStreaming APIを使いたい場合はTwitter4jなど導入する必要があります。

Twitter kit内部ではRetrofit2というライブラリを使用して非同期処理を行っています。
Retrofit2のデフォルトでは、返り値をコールバックで処理するようになっています。よく言われるコールバック地獄は避けたかったので、レスポンスをRxJava2で処理するよう組み合わせました。

RxJava2

RxJava2を使用するメリットは色々ありますが、実際書いて良かったと思うことは、データの加工が楽になった事と、ネストが減り可読性が向上したことです。デメリットとしては、学習コストがかかる事と、メソッドチェーンによる塊感に個人差があるかもしれないです。個人的には導入して良かったと思っています。

Retrofit2のインスタンス作成時にRxJava2CallAdapterFactoryを与える事で、レスポンスをRxでのObservable等にラップする事ができます。

Twitter4j

上記の通り、Streaming APIを使用するために導入しました。もちろんAPIのキーやトークンはTwitter kitと同じ物を使います。

Streaming APIもRxJava2を用いて、Observableとして使用しました。TwitterのSteaming APIは1トークンにつき1本しか生やす事ができないので、複数のタブを使用しているCiderではその1本を共有する必要があります。RxにはHotとColdという考え方があって、これにはHot Observableを用いて対処します。 RxのHotとColdについて

Circle CI

継続的インテグレーションと言われるやつです。今回やってもらっている内容は、GitHubにpushした内容をCircle CIがビルドし、その結果をslackで教えてもらう…といったところです。もっとconfigを書いて様々な処理をしたいのですが、まだいじれていないです…。

インターン先で知ったのですが、モバイルではBitriseというCIツールが良さそうです。ビルド、テスト内容や使用するサービス(slackやDeployGate、テストなど)をグラフィカルに決める事ができるので、便利でした。

Glide

画像など活用するためのライブラリです。これもかなり手軽に使い始める事ができます。

Realm

モバイル向けのデータベースです。扱いやすく、高速な事がウリですが、今回はほとんど活用できていないです。これもかなり手軽に使い始める事ができました。

ハマりポイント

  • Androidフレームワークの理解
    時間がかかりました。 書いてはググってを繰り返してました。

  • 非同期処理
    AsyncTask?Volley?Retrofit2?
    Androidアプリケーションは、メインのスレッドでネットワーク処理を行おうとすると怒られます。非同期処理は避けては通れない道でした。
    Kotlinにはコルーチンの機能があるので、async/awaitで非同期処理を行う事ができます。これを利用してみるのもアリかもしれないです。 入門Kotlin coroutines

  • ライフサイクル
    ライフサイクルを覚えるというよりも、何をしたいか明確にした上で、どのタイミング(ライフサイクル)を使えばいいのか調べています。

余談

1ヶ月以上放置してた言い訳はたくさんありますが、モチベーションが維持できなかったからです。最初のやる気である程度まで進める事ができても、その先も続けていくモチベーションの維持はもっと難しいような、簡単なような気がします。
あと、後々やりたくなった時ナニコレ…とならないように設計とか可読性とかコメントとかメモ書きは意識したいです。

このアプリにはない💀、新規性は1つのモチベーション維持方法として重要だと思いました。

所感

文字ばっかりで読みづらかったと思います…。かなり説明を端折る所もあったので、気になった方はぜひ検索してみてください。

先日インターンに行ったのですが、RxJava2を利用してFluxアーキテクチャで実装していたり、イケイケな感じでかなり刺激を受けました。講義課題が一段落したら自分もイケイケなアプリ作りたいです。

Android開発はコードだけでなく、画面レイアウトも作成するので学ぶ所が多かったです。ライブラリは触り程度だったので、RxとかKotlinの機能をガッツリ使って書こうと思います。