Born Too Late

Yuya's old tech blog.

文書校正支援 Web アプリ Torutsume を作った

2014-01-06 00:39:59

[caption id="attachment_2368" align="alignnone" width="300" caption="Torusume で赤入れっぽいことしてる様子"]Torutsume デモ[/caption]

いわゆるウェブ系で働いていると、外向きに、それなりにしっかりした文書を書くことが日々あると思います。
メルマガだったり、プレスリリースだったり。
そういうのを社内で周囲の人間がレビューしてなおしたりとかあると思うんですが、あるときはメールやチャットでここはこうした方がよくない? とか言ったり、またあるときは紙に印刷して赤入れしたり。
まぁそういうのダルいと思う訳です。

そこであるとき、こういうの GitHub の Pull Request を使ったコードレビューみたいな感じにできると楽しいんじゃないか、って思ったのを、この正月休みを利用して作ってみました。

Torutsume: Git-based proofreading tool on the Web

ウェブサービスとしての公開ではなくて、あくまでデモサイトなので、ある日突然消えるかもしれません。
企業等、特定の組織内でプライベートな環境での使用を想定しているので、イントラとかに各自インストールして使う感じになってます。
ウェブサービスになってるとそれはそれで面白いと思うんですが、そうなるとプライベート投稿機能とか、組織を管理する機能とか必要になってくると思うのですが、そこまで作り込むモチベーションは今のところ無いのでした。

Torutsume の機能・特徴

とりあえず最小限の機能となってます。
コミットログで修正履歴とかも追えるといいと思いますが、とりあえず後回し。
あとは一度見えなくなったコメントを表示する手段もないので、その辺もなんとかしたいところです。

技術的な話

言語・フレームワーク・ライブラリ

Ruby 2.0.0 で Rails4 を使って実装しています。

ライブラリとしては FriendlyId とか Devise とか Omniauth とか Figaro とか。

この辺は去年作った Web アプリでも使ったんですが、ほとんど似たような実装を行ったので、ボイラープレートみたいなのを用意しておくと、便利何じゃないかと思っています。

CSS フレームワークには Twitter Bootstrap 3 を使っています。
Bootstrap は大変便利ですが、Rails に組み込むためのライブラリはいろいろあり過ぎてどれ使っていいのかわからないですね。
今回は bootstrap-sass-rails というのを使っています。
Devise や scaffold で生成されたフォームに Bootstrap を適用していくのに、地味に時間かかってます。

あとは開発用のものとしては rspec-rails とか guard-rspec とか pry-rails とか better_errors とか factory_girl_rails とか database_rewinder とか。
guard-rspec はいつのまにか spring に対応してたので、サクサク動いてよかったです。
CI では Travis CI と Coveralls 使ってます。

Git の操作

Git の操作には Rugged という libgit2 の Ruby バインディングを利用しています。
ライブラリを使うといっても、Git の操作を行うには Git の仕組み自体をそれなりに知っている必要があるので、作っていく段階でいろいろ勉強になってよかったです。
ディレクトリはツリーオブジェクトで、そこにファイルとしての blgb オブジェクトやサブディレクトリとして別のツリーオブジェクトがひもづいていて... とか。

リポジトリについては、プロジェクトディレクトリ内の repo ディレクトリ内にポコポコできます。
リモートの Git サーバを参照できるようにした方がいいとは思うものの、イントラでちょこっと使いたい程度なのでとりあえず手抜き。
時間あれば Gitlab あたりの実装を参考にしようと思います。

DI コンテナ

そして、各種ライブラリの利用には、先日リリースした dee-rails を使っています。
Git の複雑な操作を抽象化すべく、細かく階層化してモジュール (アプリケーションサービス) 化しているため、オブジェクトの生成はそれなりに複雑になっていたんですが、DI コンテナを通して利用する限りにおいては、そういった複雑性を忘れられました。
モジュールの実装は、とりあえず動けばいいやの適当なものになっていますが、テストもそれなりに書いてるので追々直していければという感じです。

作ってみて、やはり Ruby/Rails でも DI コンテナは便利だという印象です。
これが最良の方法かどうかはわかりませんが、まぁ悪くない感じにはなってます。
今までだと ApplicationController に以下のようなメソッドをいくつも実装していたのを、サービスプロバイダとして整理することができるようになっています。

# 今まで Rails でやっていた、サービス的なクラスの生成
class ApplicationController < ActionController::Base
  def some_benri_service
    @some_benri_service ||= SomeBenriService.new
  end
end

デモサイトのデプロイ

デモサイトはフロントに Nginx、App サーバに Unicorn という構成で、EC2 の micro インスタンス 1 台に載せてます。
DB は RDS で MySQL です。
プロビジョニング・デプロイには Chef Solo を使ってます。
相変わらず伊藤直也さんの本にお世話になりました。

Chef 便利ですが、新しい環境を構築するとなると、僕にとってはまだまだ一日仕事になってしまいます。
経験値の問題が大きいとは思いますが。
特定のバージョンの Ruby のインストールには ruby_buildrbenv のクックブックを使うのが便利でした。
Unicorn の実行にも既存のクックブックを使えればよかったんですが、rbenv で入れた Ruby を使う方法がよくわからなかったので、冪等性的には微妙な感じのクックブックを手書きで済ませてます。
MySQL のユーザやデータベースの作成には database クックブックが便利でした。

まとめ

文書校正支援 Web アプリ Torutsume を紹介しました。
そのうち社内用にインストールして使ってみつつ、モチベーション続く限り機能追加等していこうと思います。