週刊Railsウォッチ(20170116)Ruby 2.4の詳細、範囲指定したsumメソッドは速い、rescueの挙動を動的に変更ほか

こんにちは、hachi8833です。2017年第2回目の週刊Railsウォッチをお届けします。

Rails公式ニュースがつい先ごろ更新されましたが、こちらは次回取り上げます。

2017年初頭のRailsの傾向

例によってこの種の情報はどうやっても「観測範囲」にしかとどまれないので、参考止まりにしておくのがよいと思いますが、新年らしい記事ということで。

morimorihogeさんも「素性の良いRailsアプリしかチェックしていないのでは?」と疑いの眼差しでした。

Ruby 2.4の新機能

2.4の機能の多くはRailsウォッチでもお伝えしており、前回のRailsウォッチでもRuby 2.4の新機能紹介記事をお伝えしましたが、また少し違う角度で見てみるとよいかもしれません。

Linear Congruence Generatorなんてのもあるんですね。線形合同法と訳されます。

ただ、Float#round挙動変更について言及されていますが、既に昨年末のRailsウォッチでお知らせしたようにその後取り消されています

Ruby 2.4のsuminjectより速い

(1...1000000000000000000000000000000).sum           # 断然速い
(1...1000000000000000000000000000000).inject(:+)

Enumerable#sumで範囲演算子...が使われている場合、高校数学でおなじみの三角数の公式を使うようです。

(range.max-range.min+1)*(range.max+range.min)/2  # 元はC言語だがだいたいこんな感じ

#injectではそうした最適化ができないので愚直に足しています。

やはりガウスは偉かったということで。

バックグラウンドジョブの実装上の注意

英語タイトルは無駄に派手ですが、時間のかかるジョブを「遅延実行」に切り替える場合の注意、といった小ネタですね。

Rails 5.1ではアクションに応じてパラメータのエンコードを変えられるようになる?

masterブランチにマージされた#26092を発見したという記事です。もしかすると5.1で以下のように書けるようになるかもですね。

class ActionParameterEncodingController < ApplicationController
  parameter_encoding :param_in_win_encoding, :action_name, Encoding::WINDOWS_1250
  parameter_encoding :param_in_iso_encoding, :action_name, Encoding::ISO_8859_1
...
end

今どき非UnicodeでPOSTするようなAPIサーバーはさすがに減ったと思いますが、何かのときに役立ちそうです。

Rails 5のActive Recordのbefore_destroyではまったよ

before_destroyに限らず、before_*系すべてのコールバックメソッドに関係する内容なのでご注意ください。要約すると、Railsアップグレードガイドの「Rails 5での非推奨事項」にある以下の指示に従う必要があったということのようです。

Active Recordのコールバックチェーンを止めるためにfalseを返すことを非推奨に指定。代わりにthrow(:abort)の利用を推奨。(Pull Request
Rails 5.0へのアップグレード: Active Recordの非推奨事項より

FXRubyの拡張

FXRubyはRubyでGUIアプリを作れるライブラリですが、随分古くからあります。それにしても古すぎです。

マルチプラットフォームのGUIアプリには個人的に惹かれるものがありますが、QtElectronのような洗練されたマルチプラットフォームGUIを見てしまうと見劣りしてしまいますね。

WrenchMode: シンプルな「メンテナンス中画面」gem

いわゆる「現在メンテナンス中です」ページを表示したり文言をその場で更新したりできるgemですね。ドキュメントによるとrack上で動作するとのことなので、rackまでこけたらメンテページも表示できなくなるのか?とBPS社内でのRailsウォッチつっつき会でもツッコまれてました。


blog.wrenchmode.comより

Railsアプリのホスティングを得意とするheroku.comですぐ使えるアドオンもあるので、利用目的によってはなかなか便利そうです。

rescueのちょっとしたテクニック

rescueでの比較には、内部で比較演算子===が使われているので、===をオーバーライドすることでrescueの挙動を動的に変えられるそうです。

class SevereMatcher
  def self.===(exception)
    exception.message =~ /severe/    
  end
end

begin
  raise RuntimeError, "Something severe happened"
rescue SevereMatcher
  # メッセージに "severe" という文字があれば、クラスにかかわらずすべての例外をrescueする
end

Rescue’s Elegant Trick for Knowing Which Exceptions to Catchより

Conclusionで著者が認めるとおり、やりすぎると無残なことになりそうですね。例外処理における#===の挙動がRubyデフォルトであることを前提としたgem(exeption_notifierなど)があると、そうしたgemが思わぬ影響を受けるかもしれません。

ここはrescueの挙動を理解するにとどめておき、productionで使うのは控えるのがよさそうです。

参考: Rubyの比較演算子===について

Rubyの比較演算子===の動作を以下にまとめてみました。

左辺が単独の文字列や数値の場合
==と同じ動作
左辺がクラスの場合:
右辺がそのクラスのインスタンスであるかどうかを比較する
Rangeクラスはこれで比較できる
左辺が正規表現の場合:
右辺とマッチするかどうかを取れる

これまた同じ記事にあるコードから引用します。

(1..10) === 5             # true  (Rangeクラスのインスタンスかどうか)
('a'..'f') === "z"        # false (Rangeクラスのインスタンスかどうか)

String === "hello"        # true
String === 1              # false

/[0-9]{3}/ === "hello123" # true
/[0-9]{3}/ === "hello"    # false

今さらですが、Rubyの比較演算子===はJavaScriptの厳密比較演算子である===!==とは異なり、むしろRubyの==よりフレキシブルな演算子ですね。

公式ドキュメントには以下の記述があります。

特殊な等号演算子。Object#===での説明:「このメソッドは case 文での比較に用いられます。 デフォルトはObject#==と同じ働きをしますが、 この挙動はサブクラスで所属性のチェックを実現するため 適宜再定義されます」。たとえば、Range#===はotherが範囲内に含まれている時に真を返します。
Rubyで使われる記号の意味: ===より

TabularプラグインとRailsでデータベースを表にする

TabularはjQueryプラグインです。よくあるデモページを見るのが早いと思います。


デモページより

この種のテーブルjQueryとRailsとの組み合わせは見た目にはビューティフルで便利そうですが、実際に細かいところを触ってみると不親切な挙動が発生しやすく、その辺りを手動で例外対応するのが割りと大変というツッコミがありました。

オープンソースなRailsアプリ

実際に使われているRSpecテストコードが欲しくて探しているうちに見つけました。opensourcerails.com/にはソースがオープンなRailsアプリが公開されています。実はだいぶ前からあるのですが、私は初めて知りました。


opensourcerailsより

REmacs: Rustで書かれたEmacs

今年に入ってから、妙にRustの動きが活発な気がします。

ところでSpaceemacsなるオールインワン&設定済みEmacsがありますが、その中に入っているevimがかなり邪魔っけだそうです。

exercism.io: プログラミング言語の問題集

公式サイトの対応言語を見ると結構充実しているようです。

Macならbrew install exercismでCLIクライアントをインストールし、exercism fetch rubyすると~/exercismディレクトリに問題が作成されます。後はコマンドラインで問題を解いてsubmitまでできます。よい感じですね。

AtlassianがTrelloを買収

リンク先を見るとAtlassianによる買収はこれで18回目だそうです。Trelloの愛用者にとっては、どの機能が今後も使えるのか気が気でないことでしょう。

開発者はシスアドも経験すべき

開発者に他の業務経験を求めるときりがありませんが、少なくともデプロイやプロビジョニングといったインフラ周りの作業経験は開発者にとってきっと実になると私も思います。

直接関係ありませんが、morimorihogeさんが見つけた 「フルスタックではなく資質」「テックブログは効果大」nanapiのCTOに聞く、エンジニア採用のコツという記事は非常に参考になりました。

tokio 0.1リリース

Tokioは、Rust言語でネットワーク系コードをすばやく書くためのプラットフォームであるとのことです。こちらの方が読みやすいです。

なおGitHubリポジトリを見るとReadmeとライセンスしかありませんが、☆が400個もあるのが気になりました。

Mac OSからUbuntuに移行してみたお

同じような感じのWhy I switched from OSX to GNU/Linuxもランキング入りしてました。

LLVMソースコードのツアーガイド

LLVMのソースコードを読む機会がどのぐらいあるかはわかりませんが、コードの概要をざっくり説明してくれているのは非常にありがたいと思います。

Let’s Encrypt 2016年に爆発的成長

2016 review
Let’s Encrypt 2016 In Reviewより

Go 1.8 rc1リリース

1.8の一番の目玉は以下でしょうね。

TIOBEの言語ランキング2017

Go言語がぶっちぎりで急上昇して2016年度のアワードになり、死に馬と思われていたDartがなぜかかなり上昇しているとのことです。

例によってこの種のランキングは参考程度にとどめておくのがよいと思います。ランキングを見ても4位以下は2%〜3%台と大きな差はありません。

個人的にはグラフでC言語が急落して今にもC++を下回りそうなのと、アセンブラがなぜか上昇しているのが気になりました。


TIOBE Index for January 2017より

今週は以上です。

関連記事

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

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

RubyFlow

160928_1638_XvIP4h

Ruby Weekly

Hacker News

160928_1654_q6srdR

Github Trending

160928_1701_Q9dJIU

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

この記事の著者

hachi8833

Twitter: @hachi8833 コボラー、ITコンサル、ローカライズ業界を経てなぜかWeb開発者志願。 これまでにRuby on Rails チュートリアルの大半、Railsガイドのほぼすべてを翻訳。 かと思うと、正規表現の粋を尽くした日本語エラーチェックサービス enno.jpを運営。 仕事に関係ないすっとこブログ「あけてくれ」は2000年頃から多少の中断をはさんで継続、現在はnote.muに移転。

hachi8833の書いた記事

週刊Railsウォッチ

インフラ

Rubyスタイルガイドを読む

BigBinary記事より

ActiveSupport探訪シリーズ