- 開発
週刊Railsウォッチ(20170519)Rails 5.1.1/5.0.3リリース、RailsでAPIサーバーを作る、HackerNewsでトップになるチャンス?ほか
こんにちは、hachi8833です。fishをそおっとインストールしてみましたがとりあえず元に戻しました。
番外
- サイエンスライターの森山和道さんの「あれこれ新聞」にTechRacho記事を掲載いただきました。ありがとうございます!
-
パーフェクトRuby(改訂2版)が発売されました。Ruby 2.4対応だそうです。おめでとうございます。早速ポチりました。
早くもRails 5.1.1と5.0.3がリリース(Rails公式ニュースより)
バグフィックスが中心なので急いでインストールする必要はないとのことです。
5.0.2 -> 5.2.35.0.3のコミット
5.1.0 -> 5.1.1のコミット
今回は5.1.1の修正点を中心に追いました。Railsウォッチで取り上げたもの、バージョン変更、スペルミスなどのコミットは省略しました。
#29029: rake -T
でtest環境ではなくdevelopment環境をデフォルトで読み込むよう修正
# railties/lib/rails/test_unit/railtie.rb
require "rails/test_unit/line_filtering"
if defined?(Rake.application) && Rake.application.top_level_tasks.grep(/^(default$|test(:|$))/).any?
- ENV["RAILS_ENV"] ||= "test"
+ ENV["RAILS_ENV"] ||= Rake.application.options.show_tasks ? "development" : "test"
end
rake -T
そのものは、定義されているrakeタスク一覧を出力します。テスト環境のrakeタスクと知らなかったらはまりそうです。
その場でmorimorihogeさんから、bundle exec rake middleware
でRailsのミドルウェアをリストアップできることを教わりました。「このミドルウェアの読み込み順序が変わると問題が発生することあるんですよ」とのことです。
#29034: Rescuable#rescue_with_handler
で例外の原因チェーン(cause chain)を扱えるよう修正
Ruby 2.4.1だとこの現象を再現できなかったそうです。cause chainという言葉をどう扱おうかと思いましたが、ひとまず「原因チェーン」にしてみました。
# activesupport/lib/active_support/rescuable.rb
- def rescue_with_handler(exception, object: self)
+ def rescue_with_handler(exception, object: self, visited_exceptions: [])
+ visited_exceptions << exception
+
if handler = handler_for_rescue(exception, object: object)
handler.call exception
exception
elsif exception
- rescue_with_handler(exception.cause, object: object)
+ if visited_exceptions.include?(exception.cause)
+ nil
+ else
+ rescue_with_handler(exception.cause, object: object, visited_exceptions: visited_exceptions)
+ end
end
#29040: ActionController::Parameters#delete
にブロックを渡せるよう再修正
# actionpack/lib/action_controller/metal/strong_parameters.rb
- def delete(key)
- convert_value_to_parameters(@parameters.delete(key))
+ def delete(key, &block)
+ convert_value_to_parameters(@parameters.delete(key, &block))
end
もともと#20868でHash#delete
を継承してブロックを渡せるようになっていたのが、どこかで継承されなくなっていたとのことです。
#29043: FinderMethods#exists?
でemptyの場合のeager loadingを抑制
kamipoさんによる#29025の修正です。
# activerecord/lib/active_record/relation/finder_methods.rb
- return false if !conditions
+ return false if !conditions || limit_value == 0
+
+ relation = self unless eager_loading?
+ relation ||= apply_join_dependency(self, construct_join_dependency(eager_loading: false))
- relation = apply_join_dependency(self, construct_join_dependency(eager_loading: false))
return false if ActiveRecord::NullRelation === relation
#28995: Capybaraがマイナーバージョンアップした場合にも追従できるよう変更
2.13.0でロックされてたんですね。
-gem "capybara", "~> 2.13.0"
+gem "capybara", "~> 2.13"
つっつきボイス「これ悩ましい問題だよね」「semantic versioningに対して挙動の違うgemがあるとこうやってハマる」
#29002: テストコードの引数に丸かっこを追加
# activerecord/test/cases/quoting_test.rb
def test_quote_with_quoted_id
- assert_deprecated /defined on \S+::QuotedOne at .*quoting_test\.rb:[0-9]/ do
+ assert_deprecated(/defined on \S+::QuotedOne at .*quoting_test\.rb:[0-9]/) do
assert_equal 1, @quoter.quote(QuotedOne.new)
end
- assert_deprecated /defined on \S+::SubQuotedOne\(\S+::QuotedOne\) at .*quoting_test\.rb:[0-9]/ do
+ assert_deprecated(/defined on \S+::SubQuotedOne\(\S+::QuotedOne\) at .*quoting_test\.rb:[0-9]/) do
assert_equal 1, @quoter.quote(SubQuotedOne.new)
end
end
テストのワーニング解消です。その場では「正規表現の開始終了文字/
でワーニングが出ていたのかな?」「それともブロックの有無で出るのかな?」という話題どまりでしたが、BPS Webチームのakioさんが翌日再確認したところ、前者の引数の/正規表現/
を丸かっこで囲まないことに対してのワーニングでした。
//
の場合: 「ambiguous first argument; put parentheses or a space even after `/' operator」(//)
の場合: warningなし%r//
の場合: warningなし
akioさんいわく「Railsの修正も%r//
を使った方がスマートだったかなー」とのことでした。ありがとうございます!
5a6091: テストコードでrubygems 2.6.12を一時的に差し止め
rubygemsのバグですが、原因不明なのでとりあえず2.6.11を使うようにしました。「rubygemsで起きるとはつらいねー」と思わず声が上がりました。
- - "gem update --system"
+ - "gem update --system 2.6.11"
#28978、#28337: Railsガイドのディレクトリパスがおかしいのを修正
ロケールが重複していたのを修正しています。韓国の開発者のようです。
Before:
source_dir: "source/ko/ko"
output_dir: "output"
After:
source_dir: "source/ko"
output_dir: "output/ko"
#28943: rails new
の-p
オプションより環境変数が優先されていたのを修正
def port
- ENV.fetch("PORT", options[:port]).to_i
+ options[:port] || ENV.fetch("PORT", DEFAULT_PORT).to_i
end
ポート番号を環境変数で指定すると-p
オプションが効かなくなっていた問題の修正です。
つっつきボイス「-p
は臨時の指定だからやっぱりこちらが効いてくれないとねー」
#28939:マイグレーションを忘れたときのメッセージを見やすく変更
マイグレーションを忘れてRailsを起動したりすると表示されていた大量のバックトレースを抑制しました。
つっつきボイス「これにびびった初心者多いだろうねw」
#28941: package.json
が誤って削除されることがあるのを修正
# railties/lib/rails/generators/rails/app/app_generator.rb
def create_vendor_files
build(:vendor)
-
- if options[:skip_yarn]
- remove_file "package.json"
- end
end
つっつきボイス「Issueタイトルが「Remove unnecessary package.json
deletion」なのでdeletionのremoveとかややこしいなー」「コードを見れば一目瞭然だけどね」
#28920: remove_possible_method
がrequire
漏れだったのを修正
# activesupport/lib/active_support/core_ext/date_time/compatibility.rb
require "active_support/core_ext/date_and_time/compatibility"
+require "active_support/core_ext/module/remove_method"
先週の#28835に続くrequire漏れ修正です。ActiveSupportが巨大なのでなかなか目が届かなさそうです。
Rails: action_controller_base
とaction_controller_api
を追加(Rails公式ニュースより)
ここからはいつもの進行です。
ActiveSupportには#run_load_hooksというメソッドがあり、起動時の読み込みを絞り込むのに使われていることを知りました。
このメソッドで指定できるライブラリの中にaction_controller
もありますが、もう少し細かく指定できるようaction_controller_base
とaction_controller_api
を追加したということです。
# actionpack/lib/action_controller/api.rb
ActiveSupport.run_load_hooks(:action_controller_api, self)
# actionpack/lib/action_controller/base.rb
ActiveSupport.run_load_hooks(:action_controller_base, self)
Rails: フィクスチャのアクセサメソッドに引数を渡さない場合にすべてのフィクスチャを返すよう変更(#railsnews)より)
# activerecord/lib/active_record/fixtures.rb
...
- instances.size == 1 ? instances.first : instances
+ return_single_record ? instances.first : instances
...
従来は空の配列[]
が返されていました。
Rails: HashWithIndifferentAccess
にfetch_values
を実装(Rails公式ニュースより)
# activesupport/lib/active_support/hash_with_indifferent_access.rb
+ def fetch_values(*indices, &block)
+ indices.collect { |key| fetch(key, &block) }
+ end if Hash.method_defined?(:fetch_values)
Issueによると、Ruby 2.3.0という比較的最近の時期にHash#fetch_values
が実装された(#10017)ので、それに合わせてActiveRecordのHashWithIndifferentAccessクラスでも使えるようにしたそうです。
このクラスは以下のようにハッシュのキーに文字列でもシンボルでも与えられるようにするものです。indifferentは人間に対して使うと「無関心」「無頓着」というニュアンスですが、ここでは「寛容」のニュアンスですね。
rgb['white'] = '#FFFFFF'
rgb[:white] # => '#FFFFFF'
rgb['white'] # => '#FFFFFF'
Rails: 有効なコネクションを初期化後にクリアするよう修正(Rails公式ニュースより)
# activerecord/lib/active_record/railtie.rb
+ initializer "active_record.clear_active_connections" do
+ config.after_initialize do
+ ActiveSupport.on_load(:active_record) do
+ clear_active_connections!
+ end
+ end
+ end
スレッドが変わってもコネクションを使いまわせるようにするためだそうです。
Rails: JSレスポンスパーサーのバグを修正(Rails公式ニュースより)
今度はCoffeeScriptのAjax周りです。document.body
ではなくdocument.head
に追加するように修正されています。
# actionview/app/assets/javascripts/rails-ujs/utils/ajax.coffee
if typeof response is 'string' and typeof type is 'string'
if type.match(/\bjson\b/)
try response = JSON.parse(response)
- else if type.match(/\bjavascript\b/)
+ else if type.match(/\b(?:java|ecma)script\b/)
script = document.createElement('script')
- script.innerHTML = response
- document.body.appendChild(script)
+ script.text = response
+ document.head.appendChild(script).parentNode.removeChild(script)
else if type.match(/\b(xml|html|svg)\b/)
parser = new DOMParser()
type = type.replace(/;.+/, '') # remove something like ';charset=utf-8'
Rails: dependent: :destroy
を指定した場合のbefore_destroy
の挙動についてドキュメントを修正(Rails公式ニュースより)
以下が追加されました。Railsガイド「Active Record コールバック」の3-3. オブジェクトのdestroyに該当します。
注:
before_destroy
コールバックは、dependent: :destroy
にともなってレコードが削除される前に実行されなければならないので、dependent: :destroy
関連付けより前に実行するか、prepend: true
オプションを指定すること。
参考: Rails API Active Record Callbacks
Rails: input文字列のfreeze
を修正(Rails公式ニュースより)
コメントから:
- 「条件節やfreezeのtrue/falseまでdupしないといけないのはちとイケてない」
- 「同意、でもブランチでの変更量は割りと少なくてすみそう」
k0kubunさんがRubyコミッターに
- 本人のブログ: Ruby コミッターになりました
前からコミッターだったような気がしていましたが、今回からだったんですね。おめでとうございます!
Google Summer of Code 2017に参加する学生が決定(Rails公式ニュースより)
- Rails公式ニュース: Google Summer of Code 2017 Students
以下の2名に決まったそうです。おめでとうございます。
Sinatra 2.0がリリース(RubyWeeklyより)
- リポジトリ: sinatra/sinatra
Changelogがどこにあるかややわかりにくいのですが、https://github.com/sinatra/sinatra/blob/v2.0.0/CHANGELOG.mdにありました。
普段Sinatraを追っていませんが、Changelogの最後にIndifferentHash
というものを見つけました。
上でも取り上げたActiveSupport::HashWithIndifferentAccess
がちょうどBPSの社内勉強会でも一瞬話題になったので気になりました。
SinatraではSinatra::IndifferentHash
なんですね。APIドキュメントの冒頭が泣かせます。
# A poor man's ActiveSupport::HashWithIndifferentAccess, with all the Rails-y
# stuff removed.
つっつきボイス「ActiveSupportでかいからね」「Sinatra的には使ったら負け、なのかな?」「SinatraはRailsのマウンタブルエンジンにもできるよ」
RailsPanel: Rails開発を支援するChrome拡張機能(RubyWeeklyより)
- リポジトリ: dejan/rails_panel
RailsPanelは以前から人気の高いツールです。SQL文を見やすく整形してくれるあたりがうれしいですね。私も以前インストールしたことがある気がするのですが、クリーンインストールのときに消してしまったようです。
Railsアプリにmeta_request gemを追加してChromeウェブストアからインストールするだけで使えるようになります。
group :development do
gem 'meta_request'
end
ActiveAdminが1.0でRails 5.1に対応(RubyWeeklyより)
- 元記事: Active Admin 1.0
- リポジトリ: activeadmin/activeadmin
- 公式サイト: ActiveAdmin
つっつきボイス「管理画面系gemはカスタマイズしようとすればするほどハマる傾向があるなー」「カスタマイズなしで使える案件ってたぶんないでしょw」
Rackが404で返すヘッダにX-Runtime
があるのヤバくね?(RubyWeeklyより)
HTTP/1.1 404 Not Found
Cache-Control: private, no-cache
Content-Type: text/html;charset=utf-8
Date: Mon, 29 Aug 2016 16:49:52 GMT
Request-Id: b3ca4a2c-1adf-4244-4cb0-17fbbc9deb06
Server: nginx/1.8.1
Strict-Transport-Security: max-age=31536000; includeSubDomains
Vary: Accept-Encoding
X-Content-Type-Options: nosniff
X-Frame-Options: SAMEORIGIN
X-Runtime: 0.018023806 <-コレ
X-Xss-Protection: 1; mode=block
Content-Length: 0
Connection: keep-alive
このヘッダを生成しているのが、Railsを縁の下から支えているRackです。
# https://github.com/rack/rack/blob/master/lib/rack/runtime.rb#L12 より
class Runtime
FORMAT_STRING = "%0.6f".freeze # :nodoc:
HEADER_NAME = "X-Runtime".freeze # :nodoc:
...
ユーザーが存在する場合としない場合でX-Runtime
が1桁近く違うので、これを使ってタイミング攻撃(この場合は辞書を食わせるなどしてユーザー名を特定)ができるのではないかという主張です。
# ユーザーが存在する場合
X-Runtime: 0.093990008
X-Runtime: 0.088857339
X-Runtime: 0.09251876
X-Runtime: 0.089843447
X-Runtime: 0.091845765
X-Runtime: 0.101260549
# ユーザーが存在しない場合
X-Runtime: 0.027787351
X-Runtime: 0.018023806
X-Runtime: 0.020997733
X-Runtime: 0.021645124
X-Runtime: 0.016645836
X-Runtime: 0.021828831
X-Runtime: 0.022211143
著者はこの問題をHerokuで見つけましたが、Heroku、BugCrowdともにあまり取り合ってもらっていない感じです。
つっつきボイス「影響の大きさ次第かな」「productionでX-Runtime
を表示しないぐらいはしてもいいかも」
引数にtrue/falseフラグを与えるのはコードが臭う前兆(RubyWeeklyより)
記事はそのまんまですが、そこからRubyMineの最近の機能であるparameter name hinting↓の話題に発展しました。
つっつきボイス「この機能、嫌いじゃない」「見た目のインデントが崩れるのいやだからオフにしてる」「デフォルトではパラメータ名と引数名が一致していれば表示されない」「挿入時にカーソルが置きにくい」
チュートリアル: RailsアプリをElastic Beanstalkにデプロイする(RubyWeeklyより)
元記事:
- Step 1 - Setup VPC: Deploying a Rails Application to Elastic Beanstalk
- Step 2 - Setup Elastic Beanstalk: Deploying a Rails Application to Elastic Beanstalk
よくある記事ですが一応。
Active Model SerializerでRails APIサーバーを作る(RubyFlowより)
rails new
で--api
してからカバレッジまでをひととおりカバーしています。
つっつきボイス「これ結構役に立ちそう」「Active Model Serializerについてあまり書かれてないけどねw」
Ralyxa: Amazon Alexaにアクセスするフレームワーク
- リポジトリ: sjmog/ralyxa
Sinatraベースだそうです。AlexaはAmazon Echoのバックエンドにも使われているクラウド音声認識サービスです。
日本語版がいつ使い物になるかですね。
Rubyでバイナリデータを扱う(RubyFlowより)
Rubyによるビット操作、エンコードの検出、ビッグエンディアン・リトルエンディアンなどを解説しています。
そこから、Rubyはバイナリデータのハンドリングがイケているという話題になりました。私はテキスト処理がほとんどだったのでこのあたりは知りませんでした。
morimorihogeさんが「RubyでShiftJISのファイルを扱う(1.9.3, 2.0系対応版)」という記事を書いたことを思い出しながら、もっと前にJavaでやったときには「素のJavaにunsignedがないのでビット操作が不自由だったなー」「それ用のライブラリを使えば違ったかもしれないけど」と当時を回想していました。
他の記事もよい感じです。
Railsのテンプレートレンダリングのしくみ(RubyFlowより)
Railsで必ずといっていいほどお世話になっているビューテンプレートですが、実装はかなり生い茂っていることでも有名です。このあたりの解説はあまり見ないのでありがたいです。
スライドを見ていて「これ、Crafting Rails 4 Applicationsと構成が似ている気がするw」とmorimorihogeさんが気づきました。私も一応読んだはずなのに元ネタに気づけませんでした。そういえばこの本、未だに日本語化されていませんね。
著者のStan Loは台湾の人ですが、もしやと思ったら先週のウォッチで紹介したGobyの人でした。スライドを最後まで見るとわかります。
先のk0kubunさんもそうですが、RubyとGoを両方やっている人って意外にいますね。Goのppやpecoなどもk0kubunさん作です。
JRubyのバグを見つけた話(RubyFlowより)
なにしろJRubyなのでJavaコードがほとんどです。
インテルが不揮発性メインメモリアーキテクチャのデモを公開
今朝morimorihogeさんがこのニュースを社内のSlackに流して一気に盛り上がりました。そのときの記事は日本語でしたが、意地で英語記事のリンクを貼りました。どんなふうに使おうかと夢は広がる一方です。
同記事には、まさにそのときのためにあるとしか思えないPersistent Memory Programmingというサイトも紹介されています。
そして意外にも、このニュースが現時点でHacker Newsにまったく上がっていません。珍しいですね。
今から数時間以内ぐらいにHacker Newsに英語でタレこめばトップ取れるかもしれません。チャレンジャーは誰だ。
番外: 言語には人間性が反映される(RubyFlowより)
主にJRuby方面でご活躍のAlex Coles氏が、Sheffield Ruby User Groupの4月のカンファレンスでRubyや言語一般について自由に話している、雑学的に楽しい内容です。40分近くありますが、字幕も文字起こしもあり、日本人には聞き取りやすい英語だと思います。
個人的に、左のほっぺたのところのタトゥーが何の絵なのかが気になってしまいました。描いてる途中?
Wikipedia-ja: シェフィールド
今週は以上です。
関連記事
- 週刊Railsウォッチ(20170512)Rubyの不思議な挙動「シャドウイング」、コードレビュー作法を定めるDanger gemほか
- 週刊Railsウォッチ(20170428)Rails 6.xでの’#form_for’と
#form_tag
廃止決定のその後、deviseの5.1対応はこれから、ほか - 週刊Railsウォッチ(20170421)RailsConfが来週アリゾナで開催、コントローラを宣言的に書けるdecent_exposure gemほか
- 週刊Railsウォッチ(20170414)サーバーを危うくする1行のコード、PostgreSQL 10の新機能ほか
- 週刊Railsウォッチ(20170407)N+1問題解決のトレードオフ、Capybaraのテスト効率を上げる5つのコツほか
- 週刊Railsウォッチ(20170331)PostgreSQLの制約機能を使えるRein gemはビューも使えるほか
- 週刊Railsウォッチ(20170324)Ruby 2.4.1リリース、GAEがついにRubyに対応、このgemがないと生きていけない27選ほか
- 週刊Railsウォッチ(20170317)Railsパフォーマンスチューニング本、DBレコード存在チェックの最速メソッド、RubyのUnicode正規化ほか
- 週刊Railsウォッチ(20170310)クールなDocker監視ツールCtop、RailsがGoogle Summer of Code 2017に正式参加、Unicode 10.0.0ドラフト発表ほか
- 週刊Railsウォッチ(20170303)5.0.2正式リリース、メタプログラミングに懲りた話、bundler 1.12のバグ、すぐ試せるWebアノテーションほか
- 週刊Railsウォッチ(20170227)Rails 4.2.8リリース、SHA-1コリジョンアタック、便利なハッシュ変換ツールほか
- 週刊Railsウォッチ(20170217)Rails 4.2.8.rc2リリース、Ruby 2.4正規表現とActiveSupportのnormalizeほか
- 週刊Railsウォッチ(20170210)JRubyやRubiniusの配列への追加はスレッドセーフではないほか
- 週刊Railsウォッチ(20170203)AnyLogin gemで開発中に楽々再ログイン、イベント数ベース課金の監視サービスRollbarほか
- 週刊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など)です。