こんにちは、hachi8833です。今週のGitLabサイトダウンからの回復劇は大変な盛り上がりでした。それでは今週のRailsウォッチをお送りいたします。
臨時ニュース: W3CとIDPFの統合が完了
ソース: W3C公式
電子書籍業界にとっては胸熱なニュースですね。IDPF(国際デジタル出版フォーラム)とW3Cの統合計画が報じられたのが昨年5月で、当時の計画通りに統合完了しました。
当時公開された「W3CとIDPFは統合したほうが良いか?」(Dave Cramer)で、IDPF時代における電子書籍の苦心がしのばれます。
⭐AnyLogin gem: 開発中のRailsに別ユーザーとして再ログイン⭐
- ソース: AnyLogin - gem to quickly login as any user(RubyFlowより)
- リポジトリ: https://github.com/igorkasyanchuk/any_login
これはデモサイトを見るのが早いでしょう。
画面左下のボタンにずらり表示されるユーザーをクリックして即ログインを切り替えられます。定番のDeviseはもちろんのこと、Authlogic、Clearance、Sorceryでもすっと使えます(いずれもUserモデルがあることが条件)。
「これかなりいいんじゃない?」というざわめきがありました。開発中に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
は上のようにbegin
とend
の間でしか使えなかったのかと思ったら、begin
とend
なしでも使える状況がある↓ことをmorimorihogeさんから教わりました。
ActionMailerのbefore_actionでparamsが利用可能に
- ソース: #27825Offer the option to use parameterization for shared processing of headers and ivars(Rails公式ニュースより)
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エンジンが変更される
従来のErubisがErubiに置き換わるそうです。確かに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開発ツール
- ソース: TTY 0.6.0 release with new website!(RubyFlowより)
- リポジトリ:piotrmurach/tty
リッチなncursesというか、以前の週刊Railsウォッチでご紹介したtty-prompt gemと似ていますが、TTY gemの方が☆が多いですね。
たとえば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を使う方法も見つけました。ぽい。
おまけ
とりあえず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/で見るのが早いと思います。
リストの右にはさりげなく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 リリース
- ソース: Wine HQ: Wine Announcement(HackerNewsより)
忘れた頃のメジャーアップデートですが、MacでWindowsのゲームをやるときにはお世話になることが多いと思います。MacではExcelをWine上で動かすほうがネイティブのExcelより速い(その代わり相当不安定)との小ネタを教えてもらいました。
Linuxパフォーマンス測定に便利なクイックリファレンス
- ソース: Linux Performance(HackerNewsより)
Linuxを構成する要素ごとにどんな測定ツールを使えばよいのかを図で調べられる便利なサイトです。いざというときに思い出したいですね。
後半の動画がことごとくNETFLIXになっているところに一同ウケました。
morimorihoge注(2017/02/04 01:00)
ウケたというのはちょっとニュアンスが間違って伝わってそうですので捕捉すると、NETFLIXはこの手の論文や対外発表をあちこちでやっているので「やっぱNETFLIXすげー」という感じです。米国系の会社は自社サービスのロビー活動的な面もあるとは思うのですが、商業目的の企業でも自社の技術やノウハウを対外発表するところが多いのが良い流れできてるよなーと思います。
いにしえのハッカー常識: VDTとかRS232CとかUUCPとか
Eric S. Raymondのエッセイなので、見つけた私と同様お年を感じてしまいました。この記事にはありませんが、放電プリンタなんて完璧にロストテクノロジーですね。
なお、morimorihogeさんに先週教えてもらったASCIIコードの秘密はさらに濃厚で読み応えがあります。
今週は以上です。
関連記事
- 週刊Railsウォッチ(20170127)わかりやすいAWSサービス名、Rails DBは便利、TruffleRubyの驚異的速度ほか
- 週刊Railsウォッチ(20170120)Ruby 2.5.0 devリリース、古いMySQLのサポート終了、uniqメソッドが削除ほか
- 週刊Railsウォッチ(20170116)Ruby 2.4の詳細、範囲指定したsumメソッドは速い、rescueの挙動を動的に変更ほか
- 週刊Railsウォッチ(20170110)ReactをRailsに置き換える、Ruby 2.4の新機能ほか
- 週刊Railsウォッチ(20161224)Float#roundの動作変更を取り消し、Rails 5.0.1/Ruby 2.4.0-rc1リリースほか
- 週刊Railsウォッチ(20161218)Ruby 2.4ではFloat#roundの動作が変わる、デフォルトのプライマリキーをBIGINTに変更ほか
- 週刊Railsウォッチ(20161209)Active Supportの非推奨メソッド廃止、RailsのjQueryへの依存を廃止ほか
- 週刊Railsウォッチ(20161125)Railsのデータベース・ベストプラクティス、SQLインジェクション解説ほか
- 週刊Railsウォッチ(20161117)DockerホスティングのHyper.sh、accepts_nested_attributes_for殺すほか
- 週刊Railsウォッチ(20161109)bundler audit gemは超おすすめ、CIAのFactbook gemほか
- 週刊Railsウォッチ(20161102)HTML 5.1正式勧告、CSS中央揃えに便利なサイトほか
- 週刊Railsウォッチ(20161027)LinuxカーネルのDirty COW脆弱性、DeviseはWikiを読めほか
- 週刊Railsウォッチ(20161019)ObjectSpaceモジュール活用法、Capybara統合、コミッターを撮影するソフト
- 週刊Railsウォッチ(20161012)RubyのHashの詳細、RethinkDBの会社が終業ほか
- 週刊Railsウォッチ(20161005)Mac OS SierraとRubyの問題、Learning Gitほか
- 週刊Railsウォッチ(20160928)constantizeの注意点、GoのGUI “gallium”登場ほか
- 週刊Railsウォッチ(20160921)クールなHTMLエディタ「Mozilla Thimble」他
- 週刊Railsウォッチ(20160913)MySQLの脆弱性ほか
今週の主なニュースソース
ソースの表記されていない項目は独自ルート(TwitterやRSSなど)です。