週刊Railsウォッチ(20161218)Ruby 2.4ではFloat#roundの動作が変わる、デフォルトのプライマリキーをBIGINTに変更ほか

こんにちは、hachi8833です。

ちょいと日曜日にずれこんでしまいましたが、Railsウォッチ今週もいってみましょう。

余談: Railsウォッチつっつき会について

なおBPSのWebチームでは、いつの頃からかRailsウォッチの公開前に有志でぶらっと集まり、ドラフト記事を読みながら気軽にコメントしたりプルリクを追ってみたり重要なポイントを発見したりする通称「つっつき会」が催されるようになっています。

もともとRailsウォッチの公開前チェックだったのですが、小一時間程度の気楽な催しなので、つっつきながら雑談が思わぬ方向に発展したり、普段聞こうと思って忘れていたことを記事で思い出して、思い切って質問してみたりと、今ではこれが毎週の楽しみになっています。

このつっつき会は私にとっても強烈に勉強になっていて、毎回たくさんの新発見があります。英文情報などを一人で黙々と集めたりRailsのソースコードを全部読んだりして技術力向上に努めるのもよいですが、こういう肩のこらない形で共有することで、自分一人だけで頑張る場合と比べて効果が数倍アップすると思います。

だいたい技術記事って、読むだけだとその場でふむふむと納得して終わって、その後スカッと忘れてしまったりしますよね。読んだ技術情報が血となり肉となるには何らかの形で出力するに限るのですが、コードを書いたり記事を書いたりプレゼンしたりする時間もなかなか取れない昨今、つっつき会のような場なら短時間で大きな効果を得られることに後から気が付きました。

つっつきながら主にmorimorihogeさんがSlackに要点を流し、しかも私がそれを記事にするので、「楽しく雑談して終わり」にならず、ちゃんと情報として残るのも大きなメリットです。

発展系として「オレもこんな記事見つけたぜ」とか「この本すっごくよかった」みたいなこともこういう場なら気楽に言えますね。

もくもく会やハッカソンは一定時間内に何らかの成果を出すという場という感じですが、つっつき会はまた違う効果がある場だと思います。

Railsウォッチをお読みいただいている皆様も、たまにはチームでRailsウォッチを肴にツンツンしてみてはいかがでしょうか。

有志の皆様いつもありがとうございます!

Rails公式ニュース

#27300 yarnをデフォルトにしてvendor/assetsを廃止することに

DHHがyarnを大歓迎しています。yarnは以前のRailsウォッチでもご紹介しましたが、まだ登場後半年も経っていないのにこの普及ぶりはすごいですね。

サムアップがめちゃ集まっています。反対らしい反対もなく、ストンとマージされています。

なおvendor/assetsには一部のgemがアセットを置くことがあるようなので、今後そうしたgemがアップデートされることになりそうです。

Issueで、package.jsonファイルはプロジェクトのルートに置くべきだという意見が出されており、つっつき会でも皆うなずいていました。

#27288 webpacker gemの改良始まる

yarnデフォが決まってまた動きが激しくなりました。機能がかぶるwebpackとwebpackerをどうするかという点ですが、webpackの機能をwebpackerにも移植して強化を図ります。

#26266 デフォルトのプライマリキーをBIGINTに変更

この変更はかなりでかそうです。「テーブルがロックされるーw」という小さな悲鳴も聞こえてきました。

こんなツイートも紹介されています。

#25451新機能: NOT NULL violation時にActiveRecord::NotNullViolationをraiseする

このプルリク@kamipoさんだったんですね。データベース関連では有名な方です。

morimorihogeコメント
今まではnullを渡してもActive Recordを通過してしまい、SQLでやっとエラーになってましたね。
エラーメッセージがわかりやすくなるので、初心者とかあんまりRailsに慣れていない人たちにはありがたい修正だと思います。地味に良いですね。

#27271 RSpecの結合テストが40%高速化

digest cacheをクリアしないようになったことでRSpecを高速化したとのことです。

#27248 after_commitコールバックを冪等化

after_commitってどんなときに使うんだ?」と皆で思ったりしましたが、要求のシビアな案件などで必要になるかもしれないというコメントもありました。

今さらですが「冪等」は「ばくとう」ではなく「べきとう」と読みます。英語ではidempotentですね。もともとはもろに数学用語で、冪等化行列は「方程式E2=Eを満たす行列」を指します。

#28303 テンプレートでblockという名前の変数を使えるようにした

変数名がblockってあまり筋がよくなさそうな気がします。

morimorihogeさんがソースから予約語を扱っている部分を掘り当てました。RailsやERBってこういう感じで予約語を管理しているのを初めて知りました。

RUBY_RESERVED_KEYWORDS = %w(alias and BEGIN begin break case class def defined? do
...
locals = @locals - Module::RUBY_RESERVED_KEYWORDS

Ruby Weekly

SidekiqのSinatraをRackに置き換える

Sidekiqはバックグラウンドジョブを扱うgemですが、今まではRailsにSidekiqをインストールするとSinatraまでインストールされていたということがわかり、思わず一同顔を見合わせてしまいました。

SinatraはRailsよりも軽量なRubyのWebフレームワークですが、RailsにSinatraがインストールされるのは明らかに冗長なのでこの修正は助かりますね。

つい「畸形嚢腫」という言葉を思い出してしまいました。私の年代ではピノコのことですね!

AWSの新サービスRekognitionをRubyから使う

こういう機械学習系のサービスがgemで導入できるようになったんですね。

Ruby 2.4の新機能

つっつき会でもっとも反響があったのがこの記事でした。

  • Float#roundのデフォルトの動作が変わる
# Ruby 2.3
(2.5).round
3

# Ruby 2.4
(2.5).round
2

四捨五入の変更はきついですね。「SQLでの四捨五入とRubyの四捨五入がずれたりするかもしれない」との声もありました。要注意です。

最近接偶数への丸め
最近接偶数への丸め (round to the nearest even; RN) は、端数が0.5より小さいなら切り捨て、端数が0.5より大きいならは切り上げ、端数がちょうど0.5なら切り捨てと切り上げのうち結果が偶数となる方へ丸める。JIS Z 8401で規則Aとして定められていて、規則B(四捨五入)より「望ましい」とされている。
四捨五入ではバイアスが発生する、端数0.5のデータが有限割合で存在する場合でも、バイアスがないのが特徴であり、多数足し合わせても丸め誤差が特定の側に偏って累積することがない(偶数+0.5は現れるが奇数+0.5は現れない、といったような特徴があるデータであれば、やはりバイアスはあらわれる)。
単に「偶数丸め」「最近接丸め」とも呼ばれる。JIS Z 8401で定められていることから「JIS丸め」、あるいは同様にISO 31-0で定められていることから「ISO丸め」ともいう。英語では、誤差の累積を嫌い銀行家が好んで使ったため「銀行家の丸め (bankers’ rounding)」、「銀行丸め」ともいう。5が切り捨てられたり切り上げられたりするので「五捨五入」と呼ばれたり、端数がちょうど0.5の場合に整数部分が偶数なら切り捨て奇数なら切り上げるので「偶捨奇入」と呼ばれたりもする。
Wikipedia: 端数処理より

その他の新機能は以下のとおりです。

  • IOのメソッドにChompフラグを追加
  • Pathname#empty?
  • compare_by_identity
  • Kernel#sendBasicObject#sendSymbol#to_procの改良
  • Hash#transform_values
  • Kernel#cloneでオプションのキーワード引数を利用可能に
  • Thread.report_on_exception
  • Binding#irb

最後のBinding#irbは、pryBinding#pryと同等のデバッグ機能をpryなしでも使えるので便利そうですね。

参考 from morimorihoge

Ansistrano

CapistranoをAnsibleに移植したことで、PHP/Python/RubyなどのアプリをCapistrano風にAnsibleでデプロイできるとのことです。

Railsのレガシーコントローラのリファクタリング

Rails-MVC

MVCのコントローラにターゲットを絞ったリファクタリング記事です。

コントローラのコードはできるだけ少なくするのが定番なので、コントローラが膨れ上がっていたり、コントローラのテストがやけに多かったりするのはそれだけでやばい臭いがしますね。

RubyFlow

160928_1638_XvIP4h

PolyBelongsTo gem

PolyBelongsTo gemはActive Recordのリレーションを拡張するメソッド群です。

MyObject.pbtなど、さすがにメソッド名の付け方はブーイングの嵐でした。

morimorihogeコメント
複雑に絡み合ったモデルの関連や階層を取り出すに使えそうなメソッドがいろいろあるので、調査用ツールを作るのに向いてそうですね。

Rails開発で役立つpry活用術

短くて拍子抜けしそうな記事ですが、その分すぐ読めるので英文慣れしてない方向け。

Pry#wtf?は直前に発生した例外を追うのに便利そうです。

openruby.com

openruby.com

openruby.comをニュースソースに加えてみました。ときどき日本語記事も流れてくることもあるようです。

gemとnpmのバージョン管理方法の違い

diff gem-npm

上の表はリンク先記事からのものですが、バージョン表記の解釈がgemとnpmで見事に違っているのがよくわかります。これが時に困った問題を引き起こしてしまいます。

つっつきでは「gemのバージョン指定方法ってなんであんなにわかりにくいんだ」との声もありました。

Hacker News

160928_1654_q6srdR

lanchaco.com

lanchao.com

画面をポチポチするだけで、ドメイン名取得も含めてレスポンシブなWebサイトを無料で作れるようです。お便利サービスもここまで来たかと。悪いことに使っちゃやーよ。

BOSEのHearphone

BOSEの新製品Hearphoneは、ノイズをカットして会話を聞き取りやすくしたり、大きな音を和らげたり、コンサートの音質を変えたりできるようです。

darkpatterns.org

ユーザーをだますためのUIをあれこれ集めた動画です。既に日本語ニュースサイトでも紹介されているようですね。

Goの間

Go 1.8ではhttpサーバーのgraceful shutdownが導入される

これ地味にありがたいです。群雄割拠するGo製Webフレームワークたちはgraceful shutdownがあったりなかったりするので、スペックだけ見てフレームワークを選ぶとこういうところで小さく困ってしまいます(&困ってます)。

あなたの知らないGo向けツール

この中では、interfaceの型を調べてくれるinterfacerが気になりました。Go言語のinterfaceではいつも迷ってましたが、自分だけではなかったと知ってちょっと安心しました。

無印枠

USBに挿すとLinuxマシンになるXtra-PC

「古いマシンを再生できる」が売りのようで、WinでもMacでもOK、本体HDは読み取りのみなのでデータも壊れず、HDがなくてもいい、だそうです。

案外トラブルシューティングに便利かもしれないと思ってしまいました。

時間は現実ではない: あらゆる事象は同時に生起している

日本語でも出回っているニュースですね。タイトル前半のおかげでSEO的にバズってますが、個人的にはタイトルの後半に力点があるように思えます。

英語圏のプログラミング言語擬人化

Webチームのtakanekoさん情報です。これはもう説明するだけ野暮というものでしょう。

takanekoさんによるともともとDHHが以下をリツィートしたのがバズったきっかけのようです。Ruby on Railsの擬人化だけ女子高生だからじゃないのかとのツッコミもありました。

今週は以上です。

関連記事

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の書いた記事

BPSアドベントカレンダー

週刊Railsウォッチ

インフラ

BigBinary記事より

ActiveSupport探訪シリーズ