iMarketをRails 5.2に移行してGitHubで公開した
株式投資のWebサービス iMarket(適時開示ネット) を、Rails 5.2に移行してGitHubでソースコードを公開しました。
Rails 5.2にする際に使わなくなった機能のコードやGemを削除し、アプリケーションサーバをUnicornからPumaに変更しました。
残っているコードは2013年から2014年に書かれたものが主で、古い部分が多々ありますがご容赦下さい。
公開した理由
iMarketは直近ではDocker化してGCPに移行した以外めぼしい開発トピックはなく、外からは見えにくい個人開発の成果を公開する意味合いが強いです。
GitHubに草を生やしやすくなるということですね。
iMarketをGCPに移行した
2013年から運用している株式投資のWebサービス iMarket(適時開示ネット) をさくらVPSからGCPに移行しました。
去年からDockerの本番運用の事例も増えてきて、コンテナを使う流れにキャッチアップするためiMarketもDockerでコンテナ化しています。
嬉しい誤算としてレスポンスが速くなってるみたいですね。
さくらVPSがSandy BridgeでGCEがBroadwellだから、3世代!も違うわけでそれで速くなったのかな。
これからクラウドは全て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に移行して良かったです。
SerenadeというAndroidのTwitterクライアントを開発した
念願だったネイティブアプリ、やっと出せました。
Webかネイティブかに囚われることなくサービス開発を行いたいと思っていて、その一歩が踏み出せました。
せっかく作るんだから自分が使うものにしたいよね、てことで題材にはTwitterクライアントを選びました。公式にも非公式にも改善したい部分があったのでちょうど良かったです。
作り始めるにあたって考えたことを3行にまとめると、
- Pull to Refreshあまり好きじゃないから、FABワンタップでリフレッシュしたい
- もういっそのことタイムラインといいねだけで事足りるのでは
- Twitterカードは表示したい、画面が賑やかになるし
となります。
詳細については先日書いた一般向け告知をご参照いただければ。
開発期間
プロダクトのコードを書いていたのは主に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
それと、他の人に使ってもらうことを考えると通知機能は必要だったかなと思います。UI/UXも含めて今後の課題ですね。
Serenade for Twitterをリリースしました
Serenade for TwitterはとてもシンプルなAndroidのTwitterクライアントです。
公式クライアントの美しさを損なわずに、タイムラインのリフレッシュを簡単に行えるようにデザインしました。
また、Twitterカードの表示にも対応しています。
タイムラインといいねの2つのタブ
Serenadeは左側にタイムライン、右側にいいねの2つのタブのデザインです。
ツイートを流し読みしながら気になるツイートはいいねして後で見る、そんな人にピッタリのTwitterクライアントです。
右下のボタン(FAB)をタップしてタイムラインをリフレッシュ
右下のボタンはタイムラインのリフレッシュに割り当てています。
ツイートの投稿よりも閲覧がメインのユーザにとっては、引っ張って更新するよりワンタップで更新できた方が便利と思います。
Twitterカードの表示にも対応
他の非公式Twitterクライアントにはない機能として、Twitterカードの表示にも対応しています。
以下のサイトは公式クライアントのように大きなTwitterカードが表示されます。
- 日経新聞
- NHK
- ウォール・ストリート・ジャーナル
- note
- Medium
- GitHub
- SpeakerDeck
ニュース系 + 金融系 + ブログ系 + エンジニア向けを幾つかピックアップしました。
対応サイトはサーバの負荷を見ながら今後も増やしていく予定です。
スワイプでメニューを表示
タイムラインのタブを開いた状態で右にスワイプするとメニューが開きます。
メニューにあるツイートの投稿、リスト・通知・ダイレクトメッセージを見るといった機能は、公式クライアントを通して行います。
公式クライントも合わせてインストールしていただくと、Serenadeをより快適にお使いいただけます。
Serenade for Twitterのこれから
今のところSerenadeには通知を取得する機能がありません。
Twitterのアプリ作者向けの機能が有料に移行するタイミングのため、最初のリリースでは通知を取得する機能を盛り込むことは見送りました。
これからSerenadeの開発を続けていく中で、リアルタイムに通知を取得する機能も追加したいと思います。
最後に
Serenade for Twitterを末永くご愛用いただければと思います。