iMarketをRails 5.2に移行してGitHubで公開した

株式投資Webサービス iMarket(適時開示ネット) を、Rails 5.2に移行してGitHubソースコードを公開しました。

github.com

Rails 5.2にする際に使わなくなった機能のコードやGemを削除し、アプリケーションサーバUnicornからPumaに変更しました。

残っているコードは2013年から2014年に書かれたものが主で、古い部分が多々ありますがご容赦下さい。

公開した理由

iMarketは直近ではDocker化してGCPに移行した以外めぼしい開発トピックはなく、外からは見えにくい個人開発の成果を公開する意味合いが強いです。

GitHubに草を生やしやすくなるということですね。

iMarketをGCPに移行した

2013年から運用している株式投資Webサービス iMarket(適時開示ネット) をさくらVPSからGCPに移行しました。

去年からDockerの本番運用の事例も増えてきて、コンテナを使う流れにキャッチアップするためiMarketもDockerでコンテナ化しています。

嬉しい誤算としてレスポンスが速くなってるみたいですね。

さくらVPSSandy BridgeでGCEがBroadwellだから、3世代!も違うわけでそれで速くなったのかな。

performance
パフォーマンス比較

これからクラウドは全てGCPにするつもり。無料枠のBigQueryのスキャンが毎月1TBあるなど、大盤振る舞いなところも素敵です。

Container Builderがお気に入り

GCPでコンテナを扱う際に欠かせない(と私が思っている)のがContainer Builderです。

本来はYAMLの定義ファイルを書いてビルドフローを制御するもののようですが、GitHubへ特定のブランチやタグのpushを契機としてコンテナをビルドし、Container Registryにイメージを保存する機能があります。

例えば手元でインスタンスを立ち上げる時は、最新のビルドになるよう以下のようなシェルを書いて使ってます。

CONTAINER_RAILS=gcr.io/xxxxxxxx/github-tynmarket-imarket:`git show origin/docker | grep commit | awk '{print $2}'`

create_app_instance() {
  gcloud beta compute instances create-with-container $1 \
        ...
        --container-image=$CONTAINER_RAILS \
        ...
}

# rails-1という名前で起動
create_app_instance rails-1

Slackで通知も受け取れるようで、色々使いこなせると便利そうです。

費用の変化とさよならJenkins

1ドル110円の月 24 * 31 時間とするとサーバ代は1445円増加。

+527 - Railsインスタンス(f1-micro)
+1845 - MySQLインスタンス(g1-small)
-972 - Jenkinsサーバ(さくらVPS

最近は放置されがちだったJenkinsサーバは移行を期に退役。差し引き1500円程度なら負担感は少ないかな。

100GBを超えるPDFファイル問題

iMarketでは過去数年分の決算短信などのPDFファイルを配信しており、その総量が100GBを超えるという頭の痛い問題があります。

ディスクの容量を食うことも然ることながら、クラウドのネットワークに乗せるとトラフィックの料金がかかるのも気になります。

200GBのディスクに3CPU + 2GBメモリがついてくるので、とりあえずVPSを1つ配信サーバとして残しました。

Railsのログが見えない

STDOUTに出したRailsのログはDockerのgcpログドライバ経由でStackDriver Loggingに送られるはずなのですが、なぜか送られてきません。

これは後で調べないと。。

まとめ

GCPに移行して良かったです。

コンテナはVMのスナップショットより作って壊してが楽だし、他のGCPのサービスを使って色々できそうなのも楽しみです。

SerenadeというAndroidのTwitterクライアントを開発した

念願だったネイティブアプリ、やっと出せました。

Webかネイティブかに囚われることなくサービス開発を行いたいと思っていて、その一歩が踏み出せました。

せっかく作るんだから自分が使うものにしたいよね、てことで題材にはTwitterクライアントを選びました。公式にも非公式にも改善したい部分があったのでちょうど良かったです。

作り始めるにあたって考えたことを3行にまとめると、

  • Pull to Refreshあまり好きじゃないから、FABワンタップでリフレッシュしたい
  • もういっそのことタイムラインといいねだけで事足りるのでは
  • Twitterカードは表示したい、画面が賑やかになるし

となります。

home timeline and favorite list
タイムラインといいね

詳細については先日書いた一般向け告知をご参照いただければ。

tynmarket.hatenablog.com

開発期間

プロダクトのコードを書いていたのは主に12月末〜5月初旬です。総所要時間はバックエンドのAPIサーバも含めて450時間くらいと思います。

まず、昨年@karino2012さんがAndroidを支える技術という本を出されて、今がAndroidに取り組むべきタイミングなんだと思って開発に向けて動き出しました。

春から夏にかけて〈I〉と〈II〉を買って通勤中に読み、その後はWINGSさんのはじめてのAndroidアプリ開発とあんざいゆきさんのAndroid Pattern Cookbookの必要な部分を写経してAndroid開発の基本を覚えました。

言語

言語はJavaです。モダンなAndroid開発はほぼKotlinということは分かっていたのですが、今回は最短でリリースまで走りきることを優先して仕事で書いたことのあるJavaを選びました。

実際開発してみるとJavaでもそんなにストレスなく開発できて、多分Java 8でラムダ式が導入されたのとAndroid Studioが優秀だったからですね。

技術選定

アーキテクチャはMVPでもMVVMでもないです。

Android Architecture Components的にはMVVMがスタンダードになっていくのかなと思いつつ、リリース後に落ち着いたタイミングでMVVMでリファクタリングしようかなと。

ライブラリの選定などは@kobakeiさんのAndroid開発における定番ライブラリ22選にお世話になりました。

APIサーバ

Twitterカードに表示するタイトルや画像のURLを取得するクローラ兼キャッシュサーバをGoで書いてGCPに載せました。

Goをちゃんと使ったのは初めてなのですが、Goいいですね。何度か書き直していくとchannelを上手く使えば無闇にロック取る必要がないことに気がついて、なるほどこれが言語デザインなのかと感心します。

あとGCPも使いやすかったです。GitHubのレポジトリにDockerfileを置いておくと、pushしてContainer Registryでビルド ⇒ GCEにポチポチデプロイ ⇒ StackDriver LoggingからログをBigQueryに流し込む ⇒ Data Studioで可視化みたいなのがサクッとできます。

余計なサーバ建てなくてもいけるとか最高かよってなります。個人開発者にとっては福音です。

最後に

リリース直前にProGuardの設定で詰まった時にDroidKaigiのconference-app-2018を眺めてたら落ちる原因が分かって、ほぼオンスケで無事リリースできました。

作ってくれた人ありがとう!

Serenadeを作るまで使っていたTwidereに習って先のAPIサーバと合わせてソースコードGitHubに公開しました。

GitHub - tynmarket/Serenade: One tap refresh twitter client for android

GitHub - tynmarket/ogpserve: Open Graph Protocol / Twitter Cards meta data cache server written in go

それと、他の人に使ってもらうことを考えると通知機能は必要だったかなと思います。UI/UXも含めて今後の課題ですね。

play.google.com

Serenade for Twitterをリリースしました

Serenade for TwitterはとてもシンプルなAndroidTwitterクライアントです。

公式クライアントの美しさを損なわずに、タイムラインのリフレッシュを簡単に行えるようにデザインしました。

また、Twitterカードの表示にも対応しています。

play.google.com

タイムラインといいねの2つのタブ

Serenadeは左側にタイムライン、右側にいいねの2つのタブのデザインです。

ツイートを流し読みしながら気になるツイートはいいねして後で見る、そんな人にピッタリのTwitterクライアントです。

favorite listhome timeline
タイムラインといいね

右下のボタン(FAB)をタップしてタイムラインをリフレッシュ

右下のボタンはタイムラインのリフレッシュに割り当てています。

ツイートの投稿よりも閲覧がメインのユーザにとっては、引っ張って更新するよりワンタップで更新できた方が便利と思います。

Twitterカードの表示にも対応

他の非公式Twitterクライアントにはない機能として、Twitterカードの表示にも対応しています。

以下のサイトは公式クライアントのように大きなTwitterカードが表示されます。

ニュース系 + 金融系 + ブログ系 + エンジニア向けを幾つかピックアップしました。

対応サイトはサーバの負荷を見ながら今後も増やしていく予定です。

nikkei for Twitter Cardnhk for Twitter Card
日経とNHKTwitterカード

スワイプでメニューを表示

タイムラインのタブを開いた状態で右にスワイプするとメニューが開きます。

メニューにあるツイートの投稿、リスト・通知・ダイレクトメッセージを見るといった機能は、公式クライアントを通して行います。

公式クライントも合わせてインストールしていただくと、Serenadeをより快適にお使いいただけます。

navigation menupost a tweet
メニューからツイート投稿

Serenade for Twitterのこれから

今のところSerenadeには通知を取得する機能がありません。

Twitterのアプリ作者向けの機能が有料に移行するタイミングのため、最初のリリースでは通知を取得する機能を盛り込むことは見送りました。

これからSerenadeの開発を続けていく中で、リアルタイムに通知を取得する機能も追加したいと思います。

最後に

Serenade for Twitterを末永くご愛用いただければと思います。