Rails CHANGELOG "2019-11-04".."2019-11-09"

この期間の CHANGELOG.md へのコミットは5件。

ActionPackに関しての3件、ActiveJobに関して2件。

ActionPack

process_action.action_controller の notifications に Location レスポンスヘッダを含めるようにした

コミット: Add :location to process_action.action_controller payloads · rails/rails@7222594

周辺知識がなさ過ぎてよくわからん。

process_action.action_controller の notifications」ってなんじゃ。

ActiveSupport::Notifications.instrument("process_action.action_controller", raw_payload) do |payload|
  result = super
  payload[:status]   = response.status
  payload[:location] = response.filtered_location
  result
ensure
  append_info_to_payload(payload)
end

引用: rails/instrumentation.rb at 722259444ae3a2dbdea7df50b4652e9d4aaaccdb · rails/rails

ふむ。 ActiveSupport::Notifications ってのがあるんすね。payloadの :locationresponse.filtered_location を入れてる。

responseActionDispatch::Response だ。

ActionDispatch::Response のなかで ActionDispatch::Http::FilterRedirect を include している。

filtered_locationActionDispatch::Http::FilterRedirect の中で定義されてる。

memo: そもそもLocationレスポンスヘッダ

Location レスポンスヘッダーはリダイレクト先の URL を示します。 3xx (リダイレクト) または 201 (created) ステータスレスポンスを返すときのみ意味を成します。

引用: Location - HTTP | MDN

process_action.action_controller の notifications に uuid も含めるようにした

コミット: Add :uuid to process_action.action_controller payloads · rails/rails@8ec75a1

さっきと似たような修正。 payloadの :uuidrequest.uuid を含めるようになった。

uuidActionDispatch::Request クラスの uuid で、request_id のaliasだ。

一意なリクエストidを notifications に含めることでデバッグしやすくなったりするよ、ということかなぁ。

process_action.action_controller の notifications に request を丸ごと含めるようにした

コミット: Provide the whole request · rails/rails@32b99f9

さっき uuid を含めるようにしたけど、「もういっそのこと request 全部含めちゃえばよくね??」となってる。

uuid を含める処理は決して、代わりに request(= ActionDispatch::Request クラスのインスタンス)をまるっと、payloadの :request に含めるようにしている。

ActiveJob

ジョブをキューに入れて実行するとき、引数のログを無効にするオプションを追加した

コミット: Add an option to disable logging for jobs with sensitive arguments · rails/rails@ce085f6

これまでは引数のログが出ちゃってたんだよなぁ。確かにそうだった。

例えば個人情報を含む引数を渡した時にログに出てしまうとあまりよろしくないわけだ。

class SensitiveJob < ApplicationJob
  self.log_arguments = false

  def perform(my_sensitive_argument)
  end
end

引用: Add an option to disable logging for jobs with sensitive arguments · rails/rails@ce085f6

self.log_arguments = false を指定するだけで良いんだ。便利。

ぱっと見、logを非表示にしたい引数を個別に指定できるともっと便利そうだなぁと思った。けどそんなに需要ないかぁ。

Fix Typo

コミット: Fix small typo in activejob changelog · rails/rails@d6a7aab

arguments のスペルが間違ってたので修正された

"越境" について考えている

今月末に鹿児島Ruby会議01がある。

鹿児島での初の地域Ruby会議。

テーマは「越境」

k-ruby.github.io

プログラミング言語Rubyを通して越境する

実行委員長 黒瀧悠太 (GMOペパボ株式会社 テクニカルリード)

私がK-Rubyに何回か参加して思ったのは、大学の先生がふらっとコミュニティに参加していたり、自分達で会社を作ってRubyを書いている人が多くいらっしゃいました。東京から来た自分はその光景に驚きました。もう一つ驚いたことは女性のエンジニアが少ないという事、これは鹿児島だけの話ではないかもしれませんが、都内で女性のエンジニアが多く活躍されているのを沢山見て来たので新鮮な光景でした。

プログラミングRubyの楽しみを通じて、県内から県外へ、九州から日本へ、世界へ、人種とか性別とか生まれた場所を越えていけたらもっとおもしろい未来が見える気がしました。

鹿児島のコミュニティの方がやっている事を他の県の人にも知ってもらいたい、他の県でやっている事を知りたい。これからもお互いにRubyというプログラミング言語を通して交流を深めていければ嬉しいです。

みなさんのRubyを使ったアイデアで”何かを越えた!”という発表をお待ちしています。

「越境」は「境界は無いぜ」という意味じゃなくて「境界があることを受け止めた上で越えていこうぜ」という意味だと捉えている。

それぞれ様々なバックグラウンドを持っていて、それぞれは誰一人同じじゃなくて、みんな違っている。

その中で、似ている部分・共通している部分があったり、全く違う部分があったりする。

「似ている部分・共通している部分を認識して理解を深める」

その上で

「全く違う部分を見せあって語り合って、お互いの幅を広げていく」

そんな想いがこの「越境」という言葉にはありそうだなぁと思った。

自分は鹿児島Ruby会議に運営スタッフとして関わっていて、この「越境」というテーマに沿った何かをしたいなぁと思っている。

当日まであと3週間。準備を進めよう。

福岡 RailsGirls Fukuoka 2nd に行ってきた

f:id:tanaken0515:20191104144350p:plain

11/01~02 に開催されたRails Girls Fukuoka 2ndでコーチをしてきた。

コーチ陣で入念な準備をしていたおかげで無事に初日のインストールdayを乗り越え、2日目のアプリ開発も無事に全員Herokuへのデプロイまで完了することができた。

インストールdayを乗り越える過程でWindowsへのRuby, Railsの環境構築を完全に理解した。

2日目のアプリ開発で、完全に初めて開発をする人に対して説明してみて、「ああ、膨大な知識量なんだなぁ」と感じた。

自分の中で当たり前になっていること、染み付いていることを、改めて言語化して、相手にわかるように説明しようとするとすごいおしゃべりすることになる。

What(何をやっているのか) Why(なぜやっているのか)をなるべく端的に、なるべく理解してもらえるように説明するのは、脳トレっぽかった。

brew install した時にターミナルに🍺絵文字が出て「この🍺は何ですか?」と聞かれて、ああそうか、初見だったら気になるよなぁ〜、と和んだ。

最初から全てを理解してもらうのは難しいと認識していたけど、ガールズは一生懸命「理解しよう」と話を聞いたり質問してくれるので、自分を含めコーチ陣はみんな一生懸命「理解してもらおう」と話をしていたと思う。それが、なんか、とてつもなく『良い空間』だった。

参加してくれたガールズには「なんか詳しいことはよくわからなかったけど、コーチと一緒にやったら自分で作ったRailsのやつをインターネットに公開できた!」という感触を持ち帰ってもらえていたら嬉しいな。

この成功体験があるのと無いのとじゃ、心持ちがだいぶ違う気がする。何かに壁にぶち当たった時に「必ず成功する方法があって、一度は自分でそれができた」という体験があると、自信を持ってその壁に立ち向かえる。

というか、分からないことや出来ないことがあったらRailsGirlsのSlackで「コーチとやった時は出来たんですけど〜〜!」と聞けばだいたい教えてくれるから最高だよなぁ笑

RailsGirlsへの初参加&初コーチだったけど、学びのある楽しい2日間だった。

大感謝。

鹿児島 K-Ruby#24 に行ってきた

https://k-ruby.connpass.com/event/151523/

10/31に開催されたK-Ruby#24に行ってきた。

LTのタイトル一覧

  1. 持田捷宏 「マジックリンク認証やってみた」
  2. 平石太郎 「エンジニアの知的生産術という本の紹介」
  3. 岩丸慎平 「エッジデバイスとObject Detection」
  4. 福重章太 「高卒未経験からweb系エンジニアへの転職」
  5. 長重佑  「Flutter+Railsで爆速アプリ開発
  6. 林健太郎「"Kenkenize"で触れるRubyの中身」
  7. 中島成博 「Railsで開発したアプリの紹介とReactについて」
  8. 下園幸一 「CentOS 8でのRuby環境」

K-Ruby自体がLTのテーマを幅広く募集していることもあってか、多彩なトークテーマ。

エッジコンピューティングやFlutterの話が出てくるとは思っていなかった。

あとはエンジニアのキャリアの話もちらほら。平石さん、福重さん、中島さん。お三方ともエンジニアとして勉強や仕事を始めてまだ日が浅いとのことで、経験や知識が少ない中でエンジニアとしてのキャリアを進んでいく上での体験や想いを発表していた。自分が同じような状況の時に、こういう場でLTをする勇気?度胸?はなかったと思う。

栗林さん(あんちぽさん(弊社CTO))がしていたLTはメタプロっぽい話で、あまりこれまで触れてこなかったので興味を持つ良いきっかけになった。帰りの新幹線でコードリーディングしてたらバグみっけたので速でプルリク出した。我ながら良い速だったと思っている。

K-Rubyは大学の先生や学生さんの発表が多くてユニークだなぁと思った。また参加したい。

Rails CHANGELOG "2019-10-28".."2019-11-03"

この期間の CHANGELOG.md へのコミットは1件。

ActionMailerに関しての1件のみ。

ActionMailer

テストヘルパーの assert_enqueued_emails メソッドが ActionMailer::Parameterized::DeliveryJob に対して期待通りに動作しない不具合を修正した

コミット: Fix ActionMailer assertions don't work for parameterized mail with le… · rails/rails@37b72ff

具体的に起きていた問題はこのissue assert_enqueued_emails does not work when sending a parameterized email · Issue #37605 · rails/rails に書いてある。

読んでみると ActionMailer::DeliveryJob を使ったこれ↓はテスト通るけど、

assert_enqueued_emails 1 do
  SubscriptionMailer.welcome.deliver_later
end

ActionMailer::Parameterized::DeliveryJob を使ったこれ↓はテスト通らない、

assert_enqueued_emails 1 do
  SubscriptionMailer.with(User.first).welcome.deliver_later
end

という問題が起きていたらしい。

ふむふむ。

ActionMailer::DeliveryJob は非同期でメール送信を行ないたい場合に使うやつ。

ActionMailer::Parameterized::DeliveryJobActionMailer::DeliveryJob を継承している。

ざっくりいうとこの2つは .with(params) でパラメータを渡すかどうかの違いしかない(雑)

ActionMailer::DeliveryJob

def perform(mailer, mail_method, delivery_method, *args) #:nodoc:
  mailer.constantize.public_send(mail_method, *args).send(delivery_method)
end

引用: rails/delivery_job.rb at f5050d998def98563f8fa4b381c09f563681f159 · rails/rails

ActionMailer::Parameterized::DeliveryJob

def perform(mailer, mail_method, delivery_method, params, *args)
  mailer.constantize.with(params).public_send(mail_method, *args).send(delivery_method)
end

引用: rails/parameterized.rb at 5d6578d15bb5d3bfe3751a6493b9e3fe99618408 · rails/rails

なんで同じようなことやってるのに後者だとテスト落ちるの?という話。

原因はActionMailer::TestHelper でジョブクラスを判定する際に使われている delivery_job_filter メソッド。 ActionMailer::Parameterized::DeliveryJob の考慮が漏れていた。


ちなみに ActionMailer::DeliveryJob を使うと「Rails 6.1系で消す予定だよ〜、代わりに MailDeliveryJob を使ってね〜」とwarningが出る。

before_perform do
  ActiveSupport::Deprecation.warn <<~MSG.squish
    Sending mail with DeliveryJob and Parameterized::DeliveryJob
    is deprecated and will be removed in Rails 6.1.
    Please use MailDeliveryJob instead.
  MSG
end

引用: rails/delivery_job.rb at f5050d998def98563f8fa4b381c09f563681f159 · rails/rails

この記事 Rails6 のちょい足しな新機能を試す41(MailDeliveryJob 編) - Qiita を読むと理解が捗った。

Rails CHANGELOG "2019-10-21".."2019-10-27"

この期間の CHANGELOG.md へのコミットは1件。

ActiveRecordに関しての1件のみ。

ActiveRecord

where 句に空配列が渡された時にクエリを発行せずに空配列を返すようにした

コミット: Add changelog for IN empty array · rails/rails@54f3e67

修正自体はこのプルリク Avoid making query when using `where(attr: [])` by jhawthorn · Pull Request #37266 · rails/rails でやってる。

修正前

> User.where(id: [])
  User Load (0.3ms)  SELECT "users".* FROM "users" WHERE 1=0
[]

引用: Avoid making query when using `where(attr: [])` by jhawthorn · Pull Request #37266 · rails/rails

修正後

> User.where(id: [])
[]

引用: Avoid making query when using `where(attr: [])` by jhawthorn · Pull Request #37266 · rails/rails

無駄なクエリが発行されなくなって嬉しいすね〜

Rails CHANGELOG "2019-10-14".."2019-10-20"

この期間の CHANGELOG.md へのコミットは3件。

ActiveRecordに関して1件, ActiveSupportに関して2件。

ActiveRecord

MySQLprimary_key を取得する処理を高速化した

コミット: Fixed the performance regression for `primary_keys` introduced MySQL 8.0 · rails/rails@77f4ae0

ActiveRecord::ConnectionAdapters::AbstractMysqlAdapter#primary_keys の修正。

issueはこれ Fixed performance regression introduced MySQL 8.0 by alpaca-tc · Pull Request #37465 · rails/rails

MySQL8.0でメタデータのストレージが metadata files から data dictionary に変わり、その結果 information_schema.key_column_usage の速度が下がった。

primary_keys メソッドでは information_schema.key_column_usage を使っているので影響を受けていた。

この修正では、代わりに information_schema.statistics を使うことで高速化している。

ActiveSupport

ActiveSupport::EncryptedFilecontent_path に symbolic link を使えるようにした

コミット: Keep symbolic link after editing credentials.yml.enc · rails/rails@6db6432

symbolic link を作ったあとに credentials.yml.enc を編集すると、 symbolic link が消えて通常のファイルで上書きされてしまうのを修正している。

@content_path = Pathname.new(content_path)

@content_path = Pathname.new(content_path).yield_self { |path| path.symlink? ? path.realpath : path }

ActiveSupport.parse_json_timestrue の場合に、 ActiveSupport::Messages::Metadata.verify がエラーにならないよう修正した

コミット: Fix Messages::Metadata#fresh? to handle parse_json_times = true · rails/rails@6e0aa18

verifyメソッドで使っている fresh? メソッドで、 Time.iso8601(@expires_at) となっていた。 ActiveSupport.parse_json_timestrue の場合は @expires_at が String ではないのでエラーになる。

  def fresh?
-   @expires_at.nil? || Time.now.utc < Time.iso8601(@expires_at)
+   @expires_at.nil? || Time.now.utc < @expires_at
  end

ん、これ ActiveSupport.parse_json_timesfalse の場合はどうなるの。よくわかってないけど。Stringが渡ってくるんじゃないの?

と思っていたら別コミットで修正されてた。

Follow-up 6e0aa1887d: So we do need the wrapper, doh · rails/rails@37e87fd