週刊Railsウォッチ(20170203)AnyLogin gemで開発中に楽々再ログイン、イベント数ベース課金の監視サービスRollbarほか

こんにちは、hachi8833です。今週のGitLabサイトダウンからの回復劇は大変な盛り上がりでした。それでは今週のRailsウォッチをお送りいたします。

臨時ニュース: W3CとIDPFの統合が完了

ソース: W3C公式

電子書籍業界にとっては胸熱なニュースですね。IDPF(国際デジタル出版フォーラム)とW3Cの統合計画が報じられたのが昨年5月で、当時の計画通りに統合完了しました。

当時公開された「W3CとIDPFは統合したほうが良いか?」(Dave Cramer)で、IDPF時代における電子書籍の苦心がしのばれます。

⭐AnyLogin gem: 開発中のRailsに別ユーザーとして再ログイン⭐

これはデモサイトを見るのが早いでしょう。

画面左下のボタンにずらり表示されるユーザーをクリックして即ログインを切り替えられます。定番のDeviseはもちろんのこと、AuthlogicClearanceSorceryでもすっと使えます(いずれもUserモデルがあることが条件)。


AnyLoginデモサイトより

「これかなりいいんじゃない?」というざわめきがありました。開発中にChromeでえっちらおっちらプロファイルを切り替えることも1Passwordをテストアカウントで汚す必要もなくなります。developer環境限定だと思いますが、用途を厳選すれば、本番での一種のなりすまし機能にも使えそうですね。

今週の⭐を進呈します。おめでとうございます。

月刊卜部さん(最近のruby-core)

特濃の連載がひと月ぶりのうれしい再開に社内でも盛り上がりました。卜部さんの連載に刺激されてPythonコミッターによる最近のPython-dev連載も始まったそうです。

詳しくはリンク先をお読みいただくに限るのですが、その中からいくつかピックアップいたしました。この章のリンクは卜部さん記事にしました。

環境を閉包しないlambdaを別に作ろうという提案

morimorihogeさんから「RSpecなんかではまさにlambda外からlambdaの中にinjectionするようなコードが大量にあるので、現在のlambdaの挙動を変えるのではなく亜種を作るのは理解できますね」とのコメントがありました。

do…endブロック内でもrescueできるようになった

rescue修飾子という扱いです。

lambda do
  begin
    raise 'err'
  rescue
    $! # => #<RuntimeError: err>
  end
end.call

従来のresqueは上のようにbeginendの間でしか使えなかったのかと思ったら、beginendなしでも使える状況がある↓ことをmorimorihogeさんから教わりました。

ActionMailerのbefore_actionでparamsが利用可能に

ActionControllerのbefore_actionのように、ActionMailerでもparamsとしてあらかじめ変数を渡しておいてbefore_action等でまとめて処理できるようになったようです。

class InvitationsMailer < ApplicationMailer
  before_action { @inviter, @invitee = params[:inviter], params[:invitee] }
  before_action { @account = params[:inviter].account }

  default to:       -> { @invitee.email_address }, 
          from:     -> { common_address(@inviter) },
          reply_to: -> { @inviter.email_address_with_name }

  def account_invitation
    mail subject: "#{@inviter.name} invited you to their Basecamp (#{@account.name})"
  end

  def project_invitation
    @project    = params[:project]
    @summarizer = ProjectInvitationSummarizer.new(@project.bucket)

    mail subject: "#{@inviter.name.familiar} added you to a project in Basecamp (#{@account.name})"
  end

  def bulk_project_invitation
    @projects = params[:projects].sort_by(&:name)

    mail subject: "#{@inviter.name.familiar} added you to some new stuff in Basecamp (#{@account.name})"
  end
end

これで、以下のように呼び出せるとのことです。

InvitationMailer.with(invitee: person).account_invitation.deliver_later

morimorihogeさんが参考までにActionArgsというgemを教えてくれました。コントローラでparams[]を書かずにリクエストパラメータを引数として受け取れるようになります。

RubyのERBエンジンが変更される

従来のErubisErubiに置き換わるそうです。確かにErubisは2011年以来更新されていませんね↓。Erubiはまだ☆60個程度ですが、この発表の影響かGitHub Trendingでも急上昇しているようです。

今回ErubisからErubiに置き換わる理由におおっと思ってしまいました。

  • Ruby’の--enable-frozen-string-literalオプションが使える
  • メモリ使用量が88%も改善される
  • 自由すぎるパッチを使ってない(ErubisはKernelクラスにメソッドを追加してたお…)
  • わずか1ファイル、150行未満という驚異のシンプルさ(コメントは除く)
  • オープンな開発体制(ErubisにはGitリポジトリもバグトラッカもないお…)
  • 生きて動いている(Erubisは2011から動きないお…)

なお私はhamlで書きたい方ですが、ERBの方がメジャーなんですね。

TTY gem: RubyのCLI開発ツール

リッチなncursesというか、以前の週刊Railsウォッチでご紹介したtty-prompt gemと似ていますが、TTY gemの方が☆が多いですね。

たとえばTTY::Spinnerを使うとこんなことができるようです。


TTY::Spinnerより

Spreadsheet Architect: RubyでExcel XLSX/ODX/CSVを簡単に作成

#to_xlsx#to_csvができます。

# Rails ActiveRecord Model
Post.order(name: :asc).where(published: true).to_xlsx
Post.order(name: :asc).where(published: true).to_ods
Post.order(name: :asc).where(published: true).to_csv

# Plain Ruby Class
Post.to_xlsx(instances: posts_array)
Post.to_ods(instances: posts_array)
Post.to_csv(instances: posts_array)

# One Time Usage
headers = ['Col 1','Col 2','Col 3']
data = [[1,2,3], [4,5,6], [7,8,9]]
SpreadsheetArchitect.to_xlsx(data: data, headers: headers)
SpreadsheetArchitect.to_ods(data: data, headers: headers)
SpreadsheetArchitect.to_csv(data: data, header: false)

この種のExcelファイルをどうにかするgemは現れては消えたりしますが、以下がよく使われているようです。

  • zdavatz/spreadsheet: 出力専用、割りと手軽、一番メジャーかも
  • randym/axlsx: 出力専用、がんばればグラフも作れたりする
  • roo-rb/roo: 読み込み専用、以前はEmpact/rooだったのが名前変わった

なお、JavaだとPOIというApacheのライブラリが定番で、OLE2操作などもでき、おそらくもっとも強力だそうです。jRubyからPOIを使う方法も見つけました。ぽい。

参考: RailsでExcelを扱うGemまとめ

おまけ

とりあえずspreadsheet_architectを以下のコードで試してみました。

#!/usr/bin/env ruby -
# encoding: UTF-8

require 'spreadsheet_architect'

File.open('/Users/hachi8833/deve/ruby/test.xlsx', 'wb') do |f|
  headers = ['Col 1','Col 2','Col 3']
  data = [[1,2,3], ['見ざる','言わざる','聞かざる'], ['?','?','?']]
  f.write SpreadsheetArchitect::to_xlsx(data: data, headers: headers)
end

デフォルトで1行目を見出しらしくしてくれるところに個人的に好感を持ちました。スタイルもいろいろ設定できるようです。VBAでがんばるよりずっといい気がしてきます。

ところで日本名物「セル内改行」を鬼のように使いたがるのって少なくとも英語圏ではめったに見かけないのですが、あれはいったい誰の仕業なのでしょう?

遅いSQLクエリをEXPLAIN ANALYZEでデバッグ

EXPLAIN ANALIZEを使ったクエリプランの調べ方についての記事です。

より総合的な最適化・高速化が必要になったらPercona Toolkitのような本格的なツールを使うことになります。

morimorihoge注(2017/02/04 01:00)
Percona Toolkitは昔はMaatkitという名前の基本MySQL向け(最近はMongoDBもいけるらしい)ツールキットですが、PostgreSQLには対応していません。PostgreSQLでPerconaみたいに「1つ1つのクエリは軽いけど呼び出される数が膨大なクエリ」を掘り出すのってどういうツールを使うんでしょう?気になる、気になる。QueryReviewer Gemとかでいけるのかなあ?

Rollbar: エラーの可視化・通知・アラートサービス

AirBrakeに似たサービスのようです。https://rollbar.com/demo/demo/で見るのが早いと思います。


https://rollbar.com/demo/demo/より

リストの右にはさりげなくRubyとRailsのアイコンがエラーソースとして表示されています。

morimorihogeさんが料金表を早速チェックしてみると、Rollberは期間中のイベント数のみで制限をかけています。


Rollbar.com料金プランより

たとえばNew Relicはもっと多機能ですがサーバ数ベースの課金なので、項目を絞って多数のサーバーを監視したい場合には相当お得かもしれないとのことでした。よさげです。

DHH: 2017年もRailsを学ぶ価値がある理由

DHHがQuoraで直接書いています。Quoraでは多数の著名人が名前を出した記事を書いています。

offline-geocoder: オフラインで位置情報を取れるgem

緯度経度情報から位置情報を得られます。位置情報にはgeonames.orgのフリーなデータ↓を取ってきて使います。

日本語の地名はあったりなかったりです。

Searchkick gem: Elasticsearch向けバルクアップデート

Wine 2.0 リリース

忘れた頃のメジャーアップデートですが、MacでWindowsのゲームをやるときにはお世話になることが多いと思います。MacではExcelをWine上で動かすほうがネイティブのExcelより速い(その代わり相当不安定)との小ネタを教えてもらいました。

Linuxパフォーマンス測定に便利なクイックリファレンス

Linuxを構成する要素ごとにどんな測定ツールを使えばよいのかを図で調べられる便利なサイトです。いざというときに思い出したいですね。


Linux Performanceより

後半の動画がことごとくNETFLIXになっているところに一同ウケました。

morimorihoge注(2017/02/04 01:00)
ウケたというのはちょっとニュアンスが間違って伝わってそうですので捕捉すると、NETFLIXはこの手の論文や対外発表をあちこちでやっているので「やっぱNETFLIXすげー」という感じです。米国系の会社は自社サービスのロビー活動的な面もあるとは思うのですが、商業目的の企業でも自社の技術やノウハウを対外発表するところが多いのが良い流れできてるよなーと思います。

いにしえのハッカー常識: VDTとかRS232CとかUUCPとか

Eric S. Raymondのエッセイなので、見つけた私と同様お年を感じてしまいました。この記事にはありませんが、放電プリンタなんて完璧にロストテクノロジーですね。

なお、morimorihogeさんに先週教えてもらったASCIIコードの秘密はさらに濃厚で読み応えがあります。

今週は以上です。

関連記事

今週の主なニュースソース

ソースの表記されていない項目は独自ルート(TwitterやRSSなど)です。

Rails公式ニュース

RubyFlow

160928_1638_XvIP4h

Ruby Weekly

OpenRuby

Hacker News

160928_1654_q6srdR

Github Trending

160928_1701_Q9dJIU

Ruby on RailsによるWEBシステム開発、Android/iPhoneアプリ開発、電子書籍配信のことならお任せください この記事を書いた人と働こう! Ruby on Rails の開発なら実績豊富なBPS

この記事の著者

hachi8833

Twitter: @hachi8833、GitHub: @hachi8833 コボラー、ITコンサル、ローカライズ業界、Rails開発を経てTechRachoの編集・記事作成を担当。 これまでにRuby on Rails チュートリアル第2版の半分ほど、Railsガイドの初期翻訳ではほぼすべてを翻訳。その後も折に触れてそれぞれ一部を翻訳。 かと思うと、正規表現の粋を尽くした日本語エラーチェックサービス enno.jpを運営。 実は最近Go言語が好き。 仕事に関係ないすっとこブログ「あけてくれ」は2000年頃から多少の中断をはさんで継続、現在はnote.muに移転。

hachi8833の書いた記事

週刊Railsウォッチ

インフラ

BigBinary記事より

ActiveSupport探訪シリーズ