1人Webサービス開発で使っているGemfileそのまま公開

最近個人的に作った写真共有サイトを公開しました。

[photoll - スポット写真共有サイト](http://photoll.jp)

この写真共有サイトで実際に使っているおすすめGemを晒してみます。
あと、おまけで使ってないけど便利そうなGemとかも紹介。

一人で1からWebサービスを作る過程を書いた拙作のブログエントリもよかったら見てください。
[【1人でWebサービス開発】新米Railsエンジニアが無謀にも写真共有サイトを作りました](http://s3pw.com/milestoner/2014/05/how-to-create-photoll/)
　

だいぶ長いですが、Gemfileをそのまんま載せました。簡易説明付き。
主要なGemをあとで説明します。

```rb:Gemfile
source 'https://rubygems.org'

gem 'rails'
gem 'mysql2'
gem 'haml-rails'               # HTMLを簡潔に書ける
gem 'sass-rails'               # CSSを効率的に書ける
gem 'bootstrap-sass'           # Twitter Bootstrapが使える
gem 'compass-rails'            # Sassの機能拡張
gem 'uglifier'                 # JavaScriptの圧縮
gem 'coffee-rails'             # JavaScriptを簡潔に書ける
gem 'jquery-rails'             # jQueryが使える

# Authentication
gem 'omniauth'                 # 外部アカウントでログインできる
gem 'omniauth-twitter'         # Omniauthを使ってTwitterログインできる
gem 'omniauth-facebook'        # Omniauthを使ってFacebookログインできる

# Uploader
gem 'carrierwave'              # 画像アップローダ
gem 'mini_magick'              # CarrierWaveでリサイズなどができるようになる
gem 'fog'                      # CarrierWaveでAmazon S3に保存できるようになる

gem 'jbuilder'                 # JSONレスポンスを効率的に書ける
gem 'draper'                   # Presenterレイヤーを追加して、ビューを効率的に書ける
gem 'acts-as-taggable-on'      # タグ機能を実装できる
gem 'kaminari'                 # ページャ
gem 'rails_autolink'           # URLの自動リンク化
gem 'rails_config'             # 定数管理
gem 'dotenv-rails'             # 環境変数管理
gem 'sitemap_generator'        # サイトマップ生成
gem 'whenever', :require => false   # cronを登録できる
gem 'exception_notification'   # エラーが発生したらメールを送ってくれる
gem 'newrelic_rpm'             # パフォーマンス監視サービスを利用できる

group :development do
  gem 'thin'                   # 開発用サーバ 
  gem 'rails-erd'              # モデルのER図をPDFで出力してくれる
  gem 'spring'                 # RspecなどでRailsをプリロードする
  gem 'rails_best_practices'   # Railsのベストプラクティスを教えてくれる
  gem 'annotate', git: 'git://github.com/ctran/annotate_models.git' # テーブル情報をモデルファイルに追記してくれる
  gem 'capistrano'             # デプロイツール
  gem 'bullet'                 # 余計なSQLを検出できる
  # gem 'guard'                # ファイルの変更を監視して作業を自動化 ※bundlerを使わないほうがいいためコメントアウト
  gem 'guard-rspec'            # ファイルが変更されたらRsepcを自動実行
  gem 'guard-livereload'       # ファイルが変更されたらページを自動リロード
  gem 'quiet_assets'           # アセットログの抑制

  # debug
  gem 'better_errors'          # エラー画面を見やすくする
  gem 'binding_of_caller'      # better_errorsのエラー画面でREPLが使える
  gem 'tapp'                   # プリントデバッグがしやすくなる
  gem 'pry-rails'              # railsでpryが使える
  gem 'pry-byebug'             # pryでデバックコマンドが使える
  gem 'awesome_print'          # プリントデバッグの出力を整形
  gem 'hirb'                   # SQLの結果を見やすく整形してくれる
  gem 'hirb-unicode'           # hirbの日本語対応
end

group :test do
  gem 'rspec'                  # テストツール
  gem 'rspec-rails'            # RailsでRspecが使える
  gem 'factory_girl_rails'     # テストデータの生成
  gem 'database_cleaner'       # テスト実行後にDBをクリア
  gem 'capybara'               # ブラウザでの操作をシミュレートしてテストができる
end

#== pending ====
# gem 'unicorn'                # HTTPサーバ
# gem 'powder'                 # 開発用サーバ
# gem 'pry-remote'             # powでデバッグできるようになる
```


## omniauth

https://github.com/intridea/omniauth

外部アカウントにOauthで認証してくれます。
対応している外部アカウントは以下のページに書いてあるのですが、めっちゃあります。
[List of Strategies · intridea/omniauth Wiki](https://github.com/intridea/omniauth/wiki/List-of-Strategies)
ただこのGemがやってくれるのは認証までなので、新規ユーザの作成やログイン状態の管理などは自分で実装する必要があります。
一通りの認証機能を実装したい場合は[Devise](https://github.com/plataformatec/devise)を使うといいかな。

[OmniAuthで認証機能を作る - RuntimeError](http://tech.hatenadiary.jp/entry/2013/05/01/OmniAuth%E3%81%A7%E8%AA%8D%E8%A8%BC%E6%A9%9F%E8%83%BD%E3%82%92%E4%BD%9C%E3%82%8B)
　

## carrierwave

https://github.com/carrierwaveuploader/carrierwave

画像アップローダ。
同じものだと[paperclip](https://github.com/thoughtbot/paperclip)も有名。
複数のサイズの画像を作れたり、S3にアップロードするのも簡単です。
これで便利なのが、画像のURLを指定すると保存できる機能があるので、Omniauthで取得したユーザのプロフィール画像を簡単に保存できます。

[Rails 超お手軽な画像アップローダー CarrierWave の使い方 | Workabroad.jp](http://www.workabroad.jp/tech/1118)
　

## acts-as-taggable-on

https://github.com/mbleigh/acts-as-taggable-on

タグ機能を実装できます。
タグ機能を自分で実装しようとしていたけど、相当めんどくさくて、これを使ったらすぐに実装できました。
これを使うときは、[jQuery Tag-it!](http://aehlke.github.io/tag-it/)を一緒に使うのがオススメです。
jQueryのタグの入力支援プラグインなのですが、ActsAsTaggableOnとのシームレスな連携に感動しました。

[#382 Tagging - RailsCasts](http://railscasts.com/episodes/382-tagging?language=ja&view=asciicast)
　

## newrelic_rpm

[Application Performance Management & Monitoring | New Relic](http://newrelic.com/)

全然まだ使っていないですが、ちょー便利だとちまたで噂のモニタリングサービスです。
パフォーマンスやリソースなどの情報をNew Relicのウェブサイトから見れて、無料でも使えます。
これが活躍するほどのサービスにしたいなー

[Rails + New Relic ならレスポンスタイム等のパフォーマンス監視が簡単にできるよ - 彼女からは、おいちゃんと呼ばれています](http://blog.inouetakuya.info/entry/20121216/1355656214)
　

## rails-erd

[Rails ERD – Entity-Relationship Diagrams for Rails](http://rails-erd.rubyforge.org/)

モデルのER図をPDFで出力してくれます。
開発し始めの頃とかはモデルの関係があやふやなので役に立ちます。

[Rails ERDを試してみた - rochefort's blog](http://rochefort.hatenablog.com/entry/20110308/p1)
　

## rails_best_practices

https://github.com/railsbp/rails_best_practices

[Rails Best Practices | rails best practices list](http://rails-bestpractices.com/)
このサイトで紹介されているRailsのベストプラクティスに則っているか自動でチェックしてくれます。
今回は勉強も含めてWebサービスを作ったので、いろいろ参考になります。
　

## capistrano

https://github.com/capistrano/capistrano

Railsのデファクトスタンダードのデプロイツール。
僕の所感はなんかクセのあるツールだと思いますが、いつの間にかデプロイが終わってると感じるぐらいに簡単にデプロイできます。
ただバージョン2と3で大幅な変更がされて、古いドキュメントが多々あるので注意してください。
　

## bullet

https://github.com/flyerhzm/bullet

Railsで起きがちな「N+1 問題」を検出してくれます。
これも新米Railsエンジニアには助かります。

[» Railsライブラリ紹介: N+1問題を検出する「bullet」 TECHSCORE BLOG](http://www.techscore.com/blog/2012/12/25/rails%E3%83%A9%E3%82%A4%E3%83%96%E3%83%A9%E3%83%AA%E7%B4%B9%E4%BB%8B-n1%E5%95%8F%E9%A1%8C%E3%82%92%E6%A4%9C%E5%87%BA%E3%81%99%E3%82%8B%E3%80%8Cbullet%E3%80%8D/)
　

## guard

https://github.com/guard/guard

ファイルの変更を監視して、登録しておいた動作を実行できます。
私はRspecの自動実行と、[LiveReload](http://qiita.com/TAKAyuki_atkwsk/items/737066dd15b9886f5dad)を使ってます。
LiveReloadいいですよー

[Guardでファイル変更を監視して作業を自動化する - Tech-Sketch](http://tech-sketch.jp/2013/01/guard.html)
　

## better_errors

https://github.com/charliesome/better_errors

エラー画面がめっちゃリッチになります。
デフォルトのエラー画面はかなり質素なのですが、それがすごい見やすくなり、`binding_of_caller`を入れるとREPLも使えます。

[Railsならbetter_errorsを入れるとデバッグがはかどるなぁ - (ﾟ∀ﾟ)o彡 sasata299's blog](http://blog.livedoor.jp/sasata299/archives/51937655.html)
　

## pry-rails

https://github.com/rweng/pry-rails

Railsでpryが使えます。
`binding.pry`でブレークポイントを置くことができるし、便利機能がたくさんあるし、これがないと開発ができないです。

[Happy Elements Labs: Rubyist必携 pry-railsを使いこなせば幸せになれる](http://blog.happyelements.co.jp/2012/10/rubyist-pry-rails-irb-up.html.html)
　

## powder

[Pow: Zero-configuration Rack server for Mac OS X](http://pow.cx/)

開発用サーバPowのためのGem。
`rails s`なんてしなくてもサーバが使えます。
めっちゃ便利なんだけど、powでpryが使うための`pry-remote`がうまく動かなくて今は保留中。
また今度試す。

[開発サーバをThinからPowに切り替えて開発効率アップ！ (Mac限定) - 酒と泪とRubyとRailsと](http://morizyun.github.io/blog/pow-guard-rails/)
　
　

# おまけ・よくある機能のGem

僕は勉強のために自前で実装していますが、よくある機能を実装するのに使える(かもしれない)Gemを紹介
　

## コメント

自分でコメント機能を作ったときはポリモーフィック関連の勉強になりました。
実装する手間を省きたいなら以下のGemがいいかもです。

https://github.com/jackdempsey/acts_as_commentable
シンプルなコメントシステム

https://github.com/elight/acts_as_commentable_with_threading
返信などの階層構造を持つコメントシステム
　

## ソーシャル

今回作ったWebサービスではTwitterライクのフォロー機能もあります。
新米Railsエンジニアにはなかなか厳しかったですが、このチュートリアルで乗り切りました。
[Ruby on Rails チュートリアル：実例を使って Rails を学ぼう](http://railstutorial.jp/)
これも実装する手間を省きたいなら以下のGemがいいかもです。

https://github.com/cmer/socialization
フォロー・ライク・メンションができるみたい。
　
https://github.com/tcocca/acts_as_follower
こちらはフォローとブロックができるようです。
　

## タイムライン

https://github.com/pokonski/public_activity
誰が何をしたかが時系列で流れるタイムライン機能。
軽く一読した限り、すぐに使い方がわからなかったのでちょっと難しそう。

https://github.com/ledermann/unread
未読・既読をつけられる　
　

***
　

ひとまずこれが公開時点のGemfileです。
なんか自分のGemfileをさらすとか少し恥ずかしい気分ですが、参考になれば幸いです。