こんにちは、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のsum
はinject
より速い
(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ではまったよ
- ソース: How requirements shaped my code, AKA Rails 5 and ActiveRecord before_destroy callbacks.(RubyFlowより)
before_destroy
に限らず、before_*系すべてのコールバックメソッドに関係する内容なのでご注意ください。要約すると、Railsアップグレードガイドの「Rails 5での非推奨事項」にある以下の指示に従う必要があったということのようです。
Active Recordのコールバックチェーンを止めるためにfalseを返すことを非推奨に指定。代わりにthrow(:abort)の利用を推奨。(Pull Request)
Rails 5.0へのアップグレード: Active Recordの非推奨事項より
FXRubyの拡張
- ソース: FXRuby Enhancement(RubyFlowより)
FXRubyはRubyでGUIアプリを作れるライブラリですが、随分古くからあります。それにしても古すぎです。
マルチプラットフォームのGUIアプリには個人的に惹かれるものがありますが、QtやElectronのような洗練されたマルチプラットフォームGUIを見てしまうと見劣りしてしまいますね。
WrenchMode: シンプルな「メンテナンス中画面」gem
いわゆる「現在メンテナンス中です」ページを表示したり文言をその場で更新したりできるgemですね。ドキュメントによるとrack上で動作するとのことなので、rackまでこけたらメンテページも表示できなくなるのか?とBPS社内でのRailsウォッチつっつき会でもツッコまれてました。
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アプリが公開されています。実はだいぶ前からあるのですが、私は初めて知りました。
REmacs: Rustで書かれたEmacs
- ソース: Rust ❤️ Emacs(GitHub Trendingより)
今年に入ってから、妙に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リリース
- ソース: Announcing Tokio 0.1(Hacker Newsより)
Tokioは、Rust言語でネットワーク系コードをすばやく書くためのプラットフォームであるとのことです。こちらの方が読みやすいです。
なおGitHubリポジトリを見るとReadmeとライセンスしかありませんが、☆が400個もあるのが気になりました。
Mac OSからUbuntuに移行してみたお
- ソース: From OSX to Ubuntu(Hacker Newsより)
同じような感じのWhy I switched from OSX to GNU/Linuxもランキング入りしてました。
LLVMソースコードのツアーガイド
LLVMのソースコードを読む機会がどのぐらいあるかはわかりませんが、コードの概要をざっくり説明してくれているのは非常にありがたいと思います。
Let's Encrypt 2016年に爆発的成長
Go 1.8 rc1リリース
1.8の一番の目玉は以下でしょうね。
すごい!!Go1.8RC1、go getでインストールできる!!!! #golang https://t.co/5L8q5tYSAF pic.twitter.com/kvWwkuyB0b
— 小野マトペ (@ono_matope) 2017年1月10日
TIOBEの言語ランキング2017
Go言語がぶっちぎりで急上昇して2016年度のアワードになり、死に馬と思われていたDartがなぜかかなり上昇しているとのことです。
例によってこの種のランキングは参考程度にとどめておくのがよいと思います。ランキングを見ても4位以下は2%〜3%台と大きな差はありません。
個人的にはグラフでC言語が急落して今にもC++を下回りそうなのと、アセンブラがなぜか上昇しているのが気になりました。
今週は以上です。
関連記事
- 週刊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の脆弱性ほか
今週の主なニュースソース
ソースの表記されていない項目は独自ルート(RSSなど)です。