- Ruby / Rails関連
READ MORE
こんにちは、hachi8833です。2017年第2回目の週刊Railsウォッチをお届けします。
※Rails公式ニュースがつい先ごろ更新されましたが、こちらは次回取り上げます。
例によってこの種の情報はどうやっても「観測範囲」にしかとどまれないので、参考止まりにしておくのがよいと思いますが、新年らしい記事ということで。
morimorihogeさんも「素性の良いRailsアプリしかチェックしていないのでは?」と疑いの眼差しでした。
2.4の機能の多くはRailsウォッチでもお伝えしており、前回のRailsウォッチでもRuby 2.4の新機能紹介記事をお伝えしましたが、また少し違う角度で見てみるとよいかもしれません。
Linear Congruence Generatorなんてのもあるんですね。線形合同法と訳されます。
ただ、Float#round
の挙動変更について言及されていますが、既に昨年末のRailsウォッチでお知らせしたようにその後取り消されています。
sum
はinject
より速い(1...1000000000000000000000000000000).sum # 断然速い
(1...1000000000000000000000000000000).inject(:+)
Enumerable#sum
で範囲演算子...
が使われている場合、高校数学でおなじみの三角数の公式を使うようです。
(range.max-range.min+1)*(range.max+range.min)/2 # 元はC言語だがだいたいこんな感じ
#inject
ではそうした最適化ができないので愚直に足しています。
やはりガウスは偉かったということで。
英語タイトルは無駄に派手ですが、時間のかかるジョブを「遅延実行」に切り替える場合の注意、といった小ネタですね。
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サーバーはさすがに減ったと思いますが、何かのときに役立ちそうです。
before_destroy
に限らず、before_*系すべてのコールバックメソッドに関係する内容なのでご注意ください。要約すると、Railsアップグレードガイドの「Rails 5での非推奨事項」にある以下の指示に従う必要があったということのようです。
Active Recordのコールバックチェーンを止めるためにfalseを返すことを非推奨に指定。代わりにthrow(:abort)の利用を推奨。(Pull Request)
Rails 5.0へのアップグレード: Active Recordの非推奨事項より
FXRubyはRubyでGUIアプリを作れるライブラリですが、随分古くからあります。それにしても古すぎです。
マルチプラットフォームのGUIアプリには個人的に惹かれるものがありますが、QtやElectronのような洗練されたマルチプラットフォームGUIを見てしまうと見劣りしてしまいますね。
いわゆる「現在メンテナンス中です」ページを表示したり文言をその場で更新したりできる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の比較演算子===
の動作を以下にまとめてみました。
==
と同じ動作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はjQueryプラグインです。よくあるデモページを見るのが早いと思います。
デモページより
この種のテーブルjQueryとRailsとの組み合わせは見た目にはビューティフルで便利そうですが、実際に細かいところを触ってみると不親切な挙動が発生しやすく、その辺りを手動で例外対応するのが割りと大変というツッコミがありました。
実際に使われているRSpecテストコードが欲しくて探しているうちに見つけました。opensourcerails.com/にはソースがオープンなRailsアプリが公開されています。実はだいぶ前からあるのですが、私は初めて知りました。
今年に入ってから、妙にRustの動きが活発な気がします。
ところでSpaceemacsなるオールインワン&設定済みEmacsがありますが、その中に入っているevimがかなり邪魔っけだそうです。
公式サイトの対応言語を見ると結構充実しているようです。
Macならbrew install exercism
でCLIクライアントをインストールし、exercism fetch ruby
すると~/exercism
ディレクトリに問題が作成されます。後はコマンドラインで問題を解いてsubmitまでできます。よい感じですね。
リンク先を見るとAtlassianによる買収はこれで18回目だそうです。Trelloの愛用者にとっては、どの機能が今後も使えるのか気が気でないことでしょう。
開発者に他の業務経験を求めるときりがありませんが、少なくともデプロイやプロビジョニングといったインフラ周りの作業経験は開発者にとってきっと実になると私も思います。
直接関係ありませんが、morimorihogeさんが見つけた 「フルスタックではなく資質」「テックブログは効果大」nanapiのCTOに聞く、エンジニア採用のコツという記事は非常に参考になりました。
Tokioは、Rust言語でネットワーク系コードをすばやく書くためのプラットフォームであるとのことです。こちらの方が読みやすいです。
なおGitHubリポジトリを見るとReadmeとライセンスしかありませんが、☆が400個もあるのが気になりました。
同じような感じのWhy I switched from OSX to GNU/Linuxもランキング入りしてました。
LLVMのソースコードを読む機会がどのぐらいあるかはわかりませんが、コードの概要をざっくり説明してくれているのは非常にありがたいと思います。
1.8の一番の目玉は以下でしょうね。
すごい!!Go1.8RC1、go getでインストールできる!!!! #golang https://t.co/5L8q5tYSAF pic.twitter.com/kvWwkuyB0b
— 小野マトペ (@ono_matope) 2017年1月10日
Go言語がぶっちぎりで急上昇して2016年度のアワードになり、死に馬と思われていたDartがなぜかかなり上昇しているとのことです。
例によってこの種のランキングは参考程度にとどめておくのがよいと思います。ランキングを見ても4位以下は2%〜3%台と大きな差はありません。
個人的にはグラフでC言語が急落して今にもC++を下回りそうなのと、アセンブラがなぜか上昇しているのが気になりました。
今週は以上です。
ソースの表記されていない項目は独自ルート(RSSなど)です。