おもしろwebサービス開発日記

Ruby や Rails を中心に、web技術について書いています

第19回 ginza.rb ミートアップ

第19回目の ginza.rb ミートアップを開催しました。

Ginza.rb 第19回 だれが一番?Railsアプリサーバ徒競走!&Ruby2.2について話そう - Ginza.rb | Doorkeeper

raptor と rhebok のパフォーマンスをみる

第17回ミートアップ で、Rack サーバの比較をしましたが、その時はまだ raptor の実装が公開されていませんでした。

今回は raptor(Passenger5) のベンチマークがとれるようになったので、ベンチを取ってみました。さらに、unicorn の2倍早いという rhebok というサーバも登場したので、それも一緒に。

@y_yagi さんが、第17回に利用したengine yardさんのアプリを使ってベンチをとってくれました。多謝!

結果としては、比較対象としてベンチをとった unicorn と Passenger4 が安定しているなという印象。rhebok や raptor はまだ不安定な気がします…。

あとは、raptor の sleep(sleep 1 してから render するアプリ)の結果の爆速ぶりが異常。多分HTTPサーバのレベルでキャッシュをして、それを返しているのだと思いますが、現時点でキャッシュを返す条件のドキュメントがないので詳細がわからず。

続いては raptor のキャッシュ機能、Turbocaching についてのブログ記事があったのでその内容についてシェア。

Researching a potential new form of HTTP caching optimization - Phusion Blog

簡単にまとめると、Cookieの"一部の"値を利用して、ユーザ種別を判別し、ユーザに応じたキャッシュを返すようにして高速化を図っています。Varnish などのキャッシュ−サーバにも似たような機能があるのですが、Cookie全体の値を利用するため、サードパーティーCookieを利用したアプリなどでは想定するような高速化はできないとのこと。

この機能を使うと、

  • 大多数の人が同じ画面をみるアプリ(ブログなど)
  • 一部だけがユーザ個別のアプリ(ログインユーザの名前の表示部分だけが異なるアプリなど)

の高速化が見込めます。詳細は元記事を参照してください。 たぶんこの記事以外にもTurbocachingの機能があると思うので、それに期待しています。

Ruby 2.2.0 について話す

Ruby 2.2.0 の関連の記事を読みました。

個人的には

{"hoge": "fuga"}

という書き方ができるようになったのが嬉しいです。

次回

次回は2/17(火)です。お題はコーディング規約です。いろんな会社の規約を見ながらワイワイ話しましょう!

pry-remote について

Pow などを利用して開発を行う際に、pry-remote は欠かせないツールです。

binding.pry_remote でブレークポイントを設定し、コンソールで pry-remote コマンドを使うと pry のようにデバッグができます。

しかし、pry-byebug の 2.0.0 になってから、pry-remote が利用できなくなってしまいました。pry-byebug の仕様変更が原因のようです。Issue を見る限り、対応には時間がかかりそうなので次のようにして対応しました。

gem 'pry-byebug', '1.3.3'

refile というファイルアップロード用 gem がよさそう

File Uploads with Refile | GoRails を見ての感想文です。

carrierwave の作者が作った後継 gem refile がなかなかよさそうな感じです。

  • S3へのブラウザからの直接アップロードのサポート
  • サムネイルの動的生成サポート
    • アップロード時じゃなくて、ブラウザからリクエスト来た時に生成
    • もちろん本番時はCDNなどと併用しないとダメです
  • ファイルを選択したら即アップロードのサポート

など、carrierwave にあったらいいなーと思っていた機能が盛り込まれています。あとは参考記事に書いてある文章を読む限りでは、ソースコードも見やすくなっているぽいですね(carrierwaveのソースコード追うのは結構辛かった記憶があります)。

次ファイルアップロード機能をつけるときには使ってみようと思います。

GoRails

GoRails、スタート当初は railscasts と似た内容しかなかったので登録していなかったのですが、今日見たらだいぶ良い感じになっていたのでこのたび課金ユーザになりました。

参考

Refile: Fixing Ruby File Uploads — Elabs

追記

課金ユーザ向けに、refile でファイル選択後即アップロードと、アップロード進捗を表示する動画が上がってたのでそちらも見ました。なかなか手軽に実装できるようでまた良い感じ。

Upload Progress with Refile Javascript | GoRails

このブログのデザインをBootstrap 3.3.1 にした

このブログは lokka & heroku で動いています。lokka の theme を Bootstrap 2.1系 で作っていたのですが、このたび最新の 3.3.1 にしました。

メンテがダルいのではてなブログに出戻りたい気持ちがあるのですが、既存の記事をうまく移行する方法が思いつかないので、このままもうしばらく頑張ります…。

とりあえずデザインをもう少しまともな感じにしたいですね( ˘ω˘)

SendGrid 使うときの注意点

Rails で、text.erb 形式のみでメールテンプレートを作った場合は、テキストメールになるはず。でもなぜかHTML形式で受信してしまう…。

調べたら、使っているメール送信用のサービスSendGridのデフォルトの設定に、テキストメールをHTMLメールに変換して送るというものがあるのですね…知らなかった。変換を外すようにチェックを付けて設定を変更したらテキストメールになりました。

sendgrid.png

Gimei が住所対応しました

@miyohide さんの協力により、ランダムで日本人の名前を返す gem Gimei が住所に対応しました。次のようにすると、それっぽい住所を返します。

address = Gimei.address
address.kanji                 # => 岡山県大島郡大和村稲木町
address.to_s                  # => 岡山県大島郡大和村稲木町
address.hiragana              # => おかやまけんおおしまぐんやまとそんいなぎちょう
address.katakana              # => オカヤマケンオオシマグンヤマトソンイナギチョウ

address.prefecture.kanji      # => 岡山県
address.prefecture.to_s       # => 岡山県
address.prefecture.hiragana   # => おかやまけん
address.prefecture.katakana   # => オカヤマケン

address.city.kanji            # => 大島郡大和村
address.city.to_s             # => 大島郡大和村
address.city.hiragana         # => おおしまぐんやまとそん
address.city.katakana         # => オオシマグンヤマトソン

address.town.kanji            # => 稲木町
address.town.to_s             # => 稲木町
address.town.hiragana         # => いなぎちょう
address.town.katakana         # => イナギチョウ

どうぞご利用ください。

また、この機能を入れる際に大幅にリファクタリングした結果、他の機能を追加するのもだいぶ簡単になりました。こんな機能も欲しい!と思ったらお気軽に Pull Request お願いします。

第17回 ginza.rb ミートアップで Rack サーバについて学んだ

昨日、第17回目の ginza.rb ミートアップを開催しました。

Ginza.rb 第17回 二本立て!Rackサーバ比較&Awesome Ruby - Ginza.rb | Doorkeeper

Rackサーバ比較

Rackサーバに関する記事をいくつか読んで感想を話していたら1時間あっという間にたってしまった感じです。@y_yagi さんが Engin Yard さんの記事にあったベンチマーク(関連記事を参照のこと)を表にまとめておいてくれたお陰で捗りました。所感をまとめると

  • Passenger 4 結構頑張っている
    • 有料版によい機能が多い
    • これが無料版にあれば…><
  • unicorn & nginx はやはり安定している
  • puma、早いしよさそうだけど unicorn や Passenger と比べると安定性に少し欠ける印象
    • あとMRIで使うのなんかもったいない感じ

あとはもうじき公開される予定の Raptor について。Raptor は Unicorn の 4 倍、puma の 2 倍早いとうたっている、現在最も注目を集めているサーバです。具体的にどんな感じなのかは関連記事を読んでもらうとして、すごくざっくりまとめると

  • nginx 的なフロントエンドのHTTPサーバと、unicorn 的なプロセスベースなアプリケーションサーバをまとめたもの
    • 有料版はスレッドベースも対応する予定
  • 速くするために機能を絞りまくっている
    • gzip 圧縮や静的ファイル配信は未サポート
  • いろいろチューニングがんばってる

と、こんな感じです。個人的にはスレッドベースのサーバはちょっと手を出しにくい気がしているので、プロセスベースで速い(らしい) Raptor にはとても期待しています。本当に速くてかつ安定しているのであれば、来年の今頃はみんな nginx + unicorn から Raptor に乗り換えている可能性もありますね。

バックエンドジョブ系の gem について

@y_yagi さんが、Rails 4.2 から導入される Active Jobs が対応している、バックエンドジョブ系の gem についてまとめてくれました。sidekiq や resque などの定番以外は尖った gem が多くて(postgres専用だったり、インメモリだったり)なかなかおもしろかったです。

資料はこちら。

Ruby_backend_jobs

次回

今年最後の ginza.rb ミートアップは、基本に立ち返ってソースコードリーディングで締めることになりました。spring を読む予定です。気になる方は Doorkeeperfacebookグループ に登録していただけると捗ると思います!

関連記事