週刊Railsウォッチ(20190401-1/2前編)Rails 5.2.3/5.1.7がリリース、Railsdmの「Railsの正体」、Ruby 2.7のnumbered parameter、新元号「令和」ほか

こんにちは、hachi8833です。新元号が本日発表されたので早速単語登録しました。どことなくゼロサムっぽい響きを感じてしまいます。

参考: ゼロ和 - Wikipedia — 「れいわ」ではありませんが

追記(2019/04/01): 早速wareki gemが対応していました。

# lib/wareki/era_def.rb#23
-   Era.new("平成", 1989, 2447535, DAY_MAX),
+   Era.new("平成", 1989, 2447535, 2458604),
+   Era.new("令和", 2019, 2458605, DAY_MAX),

  • 各記事冒頭には⚓でパーマリンクを置いてあります: 社内やTwitterでの議論などにどうぞ
  • 「つっつきボイス」はRailsウォッチ公開前ドラフトを(鍋のように)社内有志でつっついたときの会話の再構成です👄
  • 毎月第一木曜日に「公開つっつき会」を開催しています: お気軽にご応募ください

週刊Railsウォッチ「公開つっつき会」第9回開催のお知らせ

次回の公開つっつき会は4/4(木)です。皆さまのお気軽なご応募をお待ちしております!🙇
RubyKaigi 2019の予習にもぜひどうぞ。

Rails: 先週の改修(Rails公式ニュースより)

今回は、リリース以外はRailsdmの@jeremy氏の発表スライドに一瞬映ったものを拾ってみました。


つっつきボイス:「jeremy氏のキーノートはほんと良かった❤️」「キーノートは元々30分ぐらいの予定が50分ぐらい話してましたね😆」「時間的にそろそろ終わりなのかなと思ったらまだ続くぞと😆」「でもその延びた20分の内容がとてもいいという🥰」「そうなんですよね☺️とてもよかった」

※2019/04/02 22:20 一部誤解を招きそうな表現について訂正いたしました by @morimorihoge

Rails 5.2.3/5.1.7がリリース

主にバグ修正とRails 6からのバックポートのようです。


つっつきボイス:「公式ページよりGitHubのreleaseページの方がChangelogが見やすいなと思ったので、そちらのリンクを張りました」「新しいところではActive SupportにActiveSupport::HashWithIndifferentAccess#assocが入った」「あそっく?」「いかにもassociationですね」「@kamipoさんの怒涛のバグ修正」

「とりあえずこのリリースにアップグレードする感じでいいと思う👍」

allowed hostsでDNSリバインディング攻撃を防止

# 同PRより

 # `www.product.com`や`beta1.product.com`などのサブドメインからのリクエストを許可
 Rails.application.config.hosts << /.*\.product\.com/

つっつきボイス:「DNS rebinding attackは前にも話したような気がする」「私もそんな気がしてTechRachoを検索したんですが見当たらなかったので初出かなと」「お、プルリクにがっつり取り消し線が😳」

「許可してないドメインからのリクエストをはじくみたいな?」「ホワイトリスト使ってるのでそのようです」「Man in the Middle(MITM)攻撃対策っぽい: こういうときは攻撃方法を調べるとよかったりしますね🧐」(ググる)

参考: 中間者攻撃 - Wikipedia

「ちょうどよさそうな記事あった↓」「読む前の予想だけど、攻撃対象のサーバーの近くにDNSを置いて、本物のDNSより先にレスポンスを返すみたいな攻撃手法かな?それならDNSのMITMだけど」

参考: DNS Rebindingを悪用してインターネットからプライベートネットワークへの攻撃 - 忙しい人のためのサイバーセキュリティニュース


同記事より

「攻撃者がサイトとDNSを用意して云々で…なるほど、DNSの再問い合わせをさせてると」「お〜😳」「で、TTLをうんと短くしてる(1sとか)のですぐ再問い合わせが発生して…」「ざっと見た感じでは、どうやらDNSリバインディング攻撃では、攻撃者が用意するDNSが標的のすぐ近くに存在する必要がありそう」「内部協力者的な?」「前提条件として、DNSを置くために何らかの方法で攻撃者が侵入する必要がありそうに見える」「ふ〜む」「でもそれだと普通のDNS MITMになっちゃうので何だか少し違う予感: もうちょっとこの記事をちゃんと読まないといけなさそう🤔」

「お、こっちのPDF↓を見ると、JavaScriptがホスト名で認証してるのがポイントらしい」「そっちですか!」「力武さんだ😍」「例のJavaScriptのsame-originポリシーを迂回する何からしい: 対策としてはconfig.hostsをちゃんと設定すればいいんだろうけど、攻撃の詳細の方は今度時間のあるときにでも読も📖」「時間もナニなので次へ〜」

参考: DNS rebinding attackの対策と考察


dnsrebinding-20071119.pdfより

参考: 同一オリジンポリシー - ウェブセキュリティ | MDN
参考: 同一生成元ポリシー - Wikipedia

新機能: ActiveRecord::Relation#annotateを追加

# 同コミットより
Post.where(id: 123).annotate("ここはコメント").to_sql
# SELECT "posts".* FROM "posts" WHERE "posts"."id" = 123 /* ここはコメント */

つっつきボイス:「#annotateって前からあったような気がしてたんですがウォッチ過去記事で見当たらなかったので」「ウォッチで扱ったかどうかは覚えてないけど、@jeremyのスライドを見て『へー、こんな機能が入ったのか』と思った覚えがあるからやっぱり初登場だと思う」「そうだったかも」「よく見たら2週間前のコミットだからめっちゃ新しい」「なら知らなくて当然か😆」

「うん、これはRailsのログにコメントが出せるということか」「おぉ〜なるほど😍」「確かにRailsのdebugログには発行したクエリが大量に出るけど、たとえばどのARリレーションがこのクエリを出したのか、みたいなものをその中から見つけるのは困難に近い: でもこの機能を使えばそういうのを特定するのがずっとやりやすくなる😋」「ですね〜、デバッグに便利な機能☺️」「複雑怪奇なスコープをたくさん作っちゃったときとかに助かりそう🥰」

前からあった気がしていたのは、マイグレーション時のテーブルコメント追加機能でした↓。

[Rails 5] マイグレーション時にデータベースのカラムにコメントを追加する

新機能: optimizer_hints

Arm Treasure DataではモンキーパッチでOptimizer Hintsを利用している(上のGist↑)。特にMAX_EXECUTION_TIME#31129)。
Optimizer HintsはMySQLのみならず多くのデータベース(AWS RDSのPostgreSQL、Oracle、SQL Serverなど)でもサポートされており、アプリの重いクエリを大規模にスケールするのに非常に有用。
同commitより

# 同commitより
class Job < ApplicationRecord
  default_scope { optimizer_hints("MAX_EXECUTION_TIME(50000) NO_INDEX_MERGE(jobs)") }
end

つっつきボイス:「Optimizer Hintsは確かに前からRDBMSにありますね」「この機能はRDBMS依存でしょうね」「MySQLの例とかがコミットに乗ってるし」

「そうそう、MySQLの追加機能って以下↓の/*+ ... */みたいに特殊なコメント形式で与えられることが多い印象」「へぇ〜😳」「逆にPostgreSQLは言語拡張でやることが多い印象: あくまで印象ですが」

# 同commitよりMySQLの例
  Topic.optimizer_hints("MAX_EXECUTION_TIME(50000)", "NO_INDEX_MERGE(topics)")
  # SELECT /*+ MAX_EXECUTION_TIME(50000) NO_INDEX_MERGE(topics) */ `topics`.* FROM `topics`

番外: ActiveRecord::Relationには<<でオブジェクトを追加できない

2016年のissueです。

# 同issueより
@hours << Hour.new()
#=> undefined method '<<' for #<ActiveRecord::Relation []>

つっつきボイス:「ちょうど今日社内Slackのrails板で『ActiveRecord::Relation<<でオブジェクトを追加する方法が知りたい』というのが話題になっていたので」「結局これは、できないという結論でいいのかしら?」「素のActiveRecord::Relationには<<使えないよね?🤔」

「で、このissueを見つけたんですが、@sgrifさんは『これはバグ』と書いた直後に『なお、たぶんバグじゃない』と書いてました↓」「おほ😆」「😆」


同issueより

「いずれにしろ、ActiveRecord::Relationはあくまでリレーションの抽象化であって、テーブルではないから、そのままでは<<はできないはず」「そうそう、そのはず」「どうしてもやりたかったら無理やり#to_aするとかね」「これがレコードセットだったら<<で追加できてもいいけど、リレーションに追加できちゃったらオカシイよね😆」「😆」

「仮にActiveRecord::Relation<<で追加できたとしても、もうそれはリレーションじゃないはずだし」「それはもう結果セットだし」「結果セットならarrayで戻ってくるだろうけど、そもそもやりたいのは本当にそれだったのかなぁ〜?なんてね😎」「結論は『ActiveRecord::Relationはそういうものじゃない』ということで☺️」

@sgrifさんもその先のコメントで類似の趣旨を述べていました。

That’s because an association is not the same thing as an arbitrary relation.
同issueより

Rails

「Ruby on Railsの正体と向き合い方」の素晴らしさ


つっつきボイス:「このスライドは先週のRailsdm記事にも軽く載せたんですが、今日のBPS社内勉強会でも繰り返し絶賛されていたので改めて取り上げてみました」「うん、このスライドはほんっっとうによくできている👍」「Rails以外のエンジニアにもおすすめできる、素晴らしいまとめ😍」「今までいろんなところで部分的に語られていたことを、よくぞここまでまとめましたよね」「熟練Rails開発者ならもうだいたいわかっていることなんですが☺️」「このスライド英訳すべきだと思います🇺🇸」

「ここ最近Railsをdisるのが流行ったりしてるけど、そうではないよ、という」「クリーンアーキテクチャとの比較も盛り込まれているし」

参考: クリーンアーキテクチャ(The Clean Architecture翻訳) | blog.tai2.net
参考: ヘキサゴナルアーキテクチャ(Hexagonal architecture翻訳) | blog.tai2.net

「このセッションが人がぎっしりで自分は入れなかったので、直後に廊下に行ってみると@joker1007さんがかなり盛り上がっていたんですが、どんな話してたのかまではわからなくて😅」「横で聞こえた限りではですが、たしかスライドで『Active Recordパターンが破綻する例』としてコントローラにトランザクションを書く例が挙げられていて、そこにjoker1007さんが『その例はこのスライドの文脈と違うのでは?』と指摘したところ、発表者が『そこはHanamiとの違いということで挙げてみました』という返答だったので『なるほど納得☺️』というような流れだったと思います(違ってたらゴメンナサイ)」「そうでしたか!」「Hanamiだとそれ用の概念があるんでしたっけ」

参考: HanamiのInteractorでValidationを使いやすくする - Qiita

「そういえば、スライドのこの図↓みたいなものを今回のRailsdmの他の発表でも2つか3つほど見かけましたね: 主にマイクロサービスのつらみとかどうやって分割するかという話」「ふむふむ」「自分もこの辺の気持ちはとてもよくわかる: というのも、大きく育ったRailsアプリをいきなり分割するのはやはりしんどいというのがあって😭、たとえばまずフロントとAPIサーバーとに分けて、完全に分けきってから、Rails APIモノリスをドメインに分割するといいんじゃないかという発表もありましたね」「おぉ」「他にも発表はあったんですが、これっぽい図が登場してたのが共通してましたね☺️」

「たぶんみんなはマイクロサービスがやりたいんじゃなくて、巨大モノリス化したRailsアプリを何とかして分割したいってことなんじゃないかなと🤣」「そうそうっきっとそう🤣」「🤣」「そうしないと死ぬから😆」「必ずしもマイクロサービス導入してドヤ顔したいわけではないと」「今回の発表は『ではどう分割するのがいいのか』というところを追っているものが多かった印象」

「たとえば切り分けにURLを使っているプロジェクトがあるとすると、手前のNginxでリバースプロキシしてモノリスとマイクロサービスに振り分ける、でマイクロサービスがまだなくてエラーになるとNginxがそれを自動的に古いモノリスの方にリダイレクトする、なんてことをしたり」「うはエグい、それ何ていうmethod_missing?🤣」「アーキテクチャレベルのmethod_missingというか🤣」「壮絶🤣」「やや変態的だけど😆、安全といえば安全」

「最終的にはキレイにドメイン分割されるのがもちろん理想ですが、ではそこに至るまでの中間形式をどうするのか、という悩みどころや手法が今回のRailsdmではいくつか語られていましたね」

「そして上の分割から先の話をしていたのがフロントエンド系の発表という感じ」「ふむふむ」「どこかの発表で、フロントエンドもマイクロサービス的にしたいみたいな話もあって、そちらはどちらかというとWeb Components的な話ではありますが」「そちら方面の話を聞いていると、どうやらフロントエンドもファットReactモノリス化したりしてるらしい🤣」「あかんやん🤣」「🤣」「今自分がやってるReactもコロッコロに太ってますよ〜🤣」

参考: Web Components | MDN

「フロントエンド側が、今はファットなReactモノリスをたとえばWeb Componentsを使って、このコンポーネントはVueで、このコンポーネントはAngularで、みたいにもしできたとしたら、開発チームが分割してもやりやすくできそうじゃないですか」「うんうん」「詳しいところはまだ自分も見えてないんですが、その辺の話が上の図でいう右のSoE(Frontend + BFF)の辺りに相当する感じ」「今回のRailsdmは、こういうアーキテクチャがらみの発表が目につきましたね」「みんな苦労してるんだな〜😅」

ロジックをActive Modelで書く

今日のBPS社内勉強会で、kazzさんが「最近Active Modelをincludeするクラスを作ってそこにロジックを書くのが好き」という話をしていたので探してみたのですが、上ぐらいしか見つからなかったので。以下はその後でたばこ中に聞いた走り書きです。

  • ちょうど、Form Objectをforms/ではなくmodels/モデル/の下に置く感じ
  • include ActiveModel::Modelを書く以外は普通のクラス
  • クラス名はビジネスロジックを表す名前
  • saveとかは自分で書く
  • コントローラからは普通のモデルのように扱う
  • ロジックがモデルをまたがるなら別途置き場所を考える

つっつきボイス:「こういう手法ってありそうでないのかなと思って」「ああ、これDataMapperじゃないかな☺️」「おぉ、名前があるんですね!」「ソウダッタノカ〜😆」「たぶんですけど😆」「DataMapperという言葉を知らないままで検索してたんじゃ見つからないわけだ😅」

参考: 第14回 DataMapperの使い方:Ruby Freaks Lounge|gihyo.jp … 技術評論社

「話を聞いた想像ベースですが、Active Recordモデルとは別にビジネスモデル的なDataMapperオブジェクトがあって、saveはそこでやって、コントローラからそのDataMapperにアクセスすると、そのDataMapperの中からキレイにデータベースを触りに行ってくれる、みたいな?」「それそれ!その中で複数のデータベースアクセスをトランザクションで囲むとかね😋」

「ついでにRailsのForm Objectでinclude ActiveModel::Modelって書くやり方を今頃知りました😅」「FormObjectの書き方はそれ以外にもいろいろありますけどね🧐: そうやって書くやり方『も』ある」「なるほど!」

「そもそもForm Objectはデザインパターン的に決められているものではないので、あくまでブラウザから見えるフォームのタグに対応するサーバー側のオブジェクト、ぐらいに考えるのがいいかと」「そうでしたか😅」「なのでinclude ActiveModel::Modelするやり方もあれば、Virtusやdry-rbなんかでやる方法もあります🧐」「そそ、どれでもやれる😋」

Rails: dry-rbでForm Objectを作る(翻訳)

「冒頭のActive Modelをincludeするクラスを作るやり方は、gemを足さないでやれるのがいいなと思いました」「そのときの意図としては、既存のActive Recordモデルが既に肥大化しまくってて、それに触らずに特殊な業務を足したいという感じ: オレが足したこのクラスしか触りたくないっ😤みたいな」

追記(2019/04/02): 以下の話に出てくる「バリデーション」は、正確には「型変換」(type casting)を指します🙇。

「Form Objectとしてだったら、自分なら入り口の型バリデーションをそこでやりたいかな: そうすれば後が楽になるし😋」「それもわかるっ」「というのも、Active Recordモデルって(レスポンスとして)入ってくるデータの型バリデーション機能がないじゃないですか」「そうそうっ😤」

「そういえばRails 5.2からでしたっけ、そういう入力のデータ型バリデーション機能が使えるようになったのって」「そうそう、こないだ社内で教えてもらった」「え、そんなのが入ってるのか😅」「これが使えるならそっちがいいですね」

ActiveModel::Attributesのことでした。

参考: ActiveModel::Attributes が最高すぎるんだよな。 - Qiita

「Virtusとかがありがたいのは、そのモデルが持っているパラメータ定義のところに、変数名の他にarrayやintegerといった型を指定しておけば、フォーム入力のパラメータをどかっと一括で渡したときにデータ型を入力の段階でバリデーションできることですね」「そうそう、フォームって特にチェックボックスがエグいものになりがち〜😭」「0と1とnullのどれかを返すみたいな悲しいフォームから悲しいデータがstrong parametersをすり抜けてやってきたりするわけですよ: そういうデータをあらかじめキレイにできるととても嬉しい😂」

「で、自分は当初そういうバリデーションをif文で一生懸命書いてたら『こういういいものがありますよ😎』『しかも5.2ならActiveModel::Attributesでもっと楽に書けますよ』って教えてもらったという😆」「Form Objectの流れで言うと、受け取った入力パラメータは全部文字列になってしまうので、そういう文字列データをできるだけ早い段階で文字列じゃないものにしたいというのがありますね😆」「それそれっ😋」

アプリケーションロジックとビジネスロジック

# 同記事より
class User < ApplicationRecord
  validates_presence_of :username, :email, :address
end

class RegistrationUser < User
  include ApplicationShape

  validates_confirmation_of :email
  validates_acceptance_of :terms_of_service
end

つっつきボイス:「アプリケーションロジックとビジネスロジックとはみたいな記事のようです」「こういうのはもう『お前がアプリケーションロジックだと思うものがアプリケーションロジックで、ビジネスロジックだと思うものがビジネスロジック』でいいんじゃね?😆」「そう言うしかないかと😆」

「記事の中でShape Objectというもの↑が登場しているんですが、他で見かけない言葉みたい」「これも記事の人がこしらえた概念っぽい😆」「独自の概念を作るとやりとりが大変になるんですよね〜」

POSTメソッドでリダイレクトしてやった(RubyFlowより)


つっつきボイス:「あーなるほど!リダイレクトなんだけどそれをPOSTメソッドでやりたいと」「ほほ〜」「たまにこういうことしたくなるときってあるし☺️」

「ということはPOSTでリダイレクトせざるを得ないときがあるんですね?」「よくあるのが、POSTしか受け付けない外部サーバー」「あ〜」「古い決済サービスとかにありがち😅」「たとえばある決済サービスが、ユーザーが最終的にPOSTで投げないといけないAPI仕様になっていて、でもその前に入力データを動的にゴニョゴニョしたいときとか」

「ところがたとえばAjaxで単にサーバーからリダイレクトしようとすると(ロケーションでforwardしているだけなので)GETしか使えない、そこが悩ましいところ」「そうそう」「で、どうやらこのgemはフロントのJavaScriptを使ってやっているっぽい: 実際にやれますし、自分もやったことあるし😆」「😆」「結局AjaxでやりとりしてからPOSTし直すんですが」

「元のRubyFlowの見出しでは、HTTP 1.1プロトコルの一部だからPOSTではやれないと従来言われていた、と書かれていました↓」「たしかに基本的には邪悪ですね、このやり方は👻」「邪悪👹」「邪悪なんだけど、自分たちが制御できない外部APIの仕様を自分たちのサーバーサイドだけで何とかするという縛りプレイでは、だいたいこうすることになるでしょうね」「なるほど〜」「まあよっぽど困ったときぐらいしか使いませんが😎」

There is a common question: – “Is it possible to redirect using a POST method?”
And the answer is: – “Redirection isn’t possible with POST requests – it’s part of the HTTP/1.1 protocol”.
RubyFlowより

「そういえば今日そういうサーバーと戦ってましたね😆」「そのサイトのURLの最後が.doだったですよ🤣」「あ〜察し🤣」「オールPOSTも納得の年代物感🤣」

参考: URLの最後が「.do」という拡張子で終わるページは、どういうプロ… - 人力検索はてな

「今のAPIなら普通にJSONで組み立てるところですが、こういうgemが求められたのってJavaScriptが今ほど信用されてなかった頃ですよね😆」「JSでパラメータ組み立てるの大変だった頃😆」「今ならBabelでコンパイルすればブラウザ間依存もないから、こうやってサーバー側で何とかしようとすることもほぼほぼないだろうけど、JSをどうしても書きたくない人とかが使いたいのかも🤣」「🤣」

「まあ今でこそJavaScriptがないとやっていけない感じですが、昔はJavaScriptがなくても動かないといけない(キリッ)とかでしたね」「今はW3Cでもそんなことは思ってませんし😆」「お、そうでしたか!👴」

金曜日にプルリク数が減るのは赤信号

Code Climateの記事です。


同記事より


つっつきボイス:「上のグラフみたいに金曜日だけやけにプルリクが少ないプロジェクトは、(技術的な問題に限らず)どこかに潜在的に問題を抱えている可能性があるかもしれないそうです」「そういう傾向は多かれ少なかれありそう: Code Climateはデータをいっぱい持っているのでこういう分析が得意ですよね😋」「この間も取り上げた自社のVelocity使って分析してるみたいです」「みんな買ってね、みたいな😆」


codeclimate.comより

schema.org: みんなが使っている名前を検索


schema.orgより

Railsdm 2019の「入門 名前」で、ネーミングに便利なサイトとしてごくあっさりと紹介されていました。


つっつきボイス:「他の人がどんなクラス名を付けているのかを知りたいときに便利そうでした」「以下は姉妹サイトのようです↓」


☄より> より

「まあこういういい名前をつけるスキルを伸ばすには、最終的に自分の語彙を地道に増やすしかないんじゃないかな☺️」「やっぱりそこに尽きますよね」「いろんなコードを読んだりとか、いろんなライブラリを見たりとか、いろんな英語ドキュメントを読んだりとか、要するにボキャブラリーって読んだ量で決まる😆」「たしかに〜」「employeeって知らなきゃ使いようないし😆」

「たとえばシソーラスを使ったとしても、そこにある語が本当にその文脈に合っているのか、という感覚って、今まで見たことがなかったら絶対わからないし」「載ってはいるけどホントにそれでいいのかが気になってまた調べなおしたりとか」

「今振り返っても、自分がどうやってこういう語彙を鍛えたのか自分でも思い出せないし: シソーラスのこの語とあの語のどっちが適切なのか、その辺は感覚としか言いようがないというか」「ポジティブな意味なのかネガティブな意味なのか中立っぽいのか、とか」「この辺は辞書だけだとホントわからない😅」「必死で例文見て考えたりとか」

「その意味では、辞書だけじゃなくて使われ方(コンテキスト)も一緒に見る方が間違いなく確実ですね: さっきのどうやって鍛えたんだろうという話も、いっぱい読むことで『たしかあそこで見た覚えがある』みたいな既視感を育てていたんだと思います」「あ〜そうかも!」

「自分の場合、英和辞典と和英辞典じゃなくて、もっぱらシソーラスと英英辞典を使ってるし: 英英を見ないと、語の雰囲気というか心に迫れる気がしないというか」「それはありますね😋」「私はコーパスもよく使います: 縦が揃うコーパスだとさらに見やすいし😋」

参考: コーパス - Wikipedia

「名前付けのセンスって自分はあんまり自信ないけどな〜」「でも逆にこの人は名前付けうまい!っていう人は見たことも聞いたこともありませんけどっ😆」「それはきっと、いい名前が付いていると身体にすっと入っていくから逆に良さに気づかないのかも😆」「あは〜そうかも😆」「いい名前は喉越しがいい🍺」「逆にダメな名前は目障りでイガイガして引っかかりがあるみたいな🤣」「コクがないのにキレもない名前🤣」「🤣」

Railsミニアンケート


同記事より


つっつきボイス:「Wroclove.rbというカンファレンスで取ったという短いアンケートですが、単純に楽しいので」「『Railsで幸せになれましたか』😆」「『before_*バリデーション使いますか』が意外にも真っ二つ😆」「あれま、自分大好きなんですけど🥰」

「『Deviseは善か悪か』も真っ二つ😆」「『factory派かfixture派か』はfactoryが圧勝😆」「『RSpec派かMinitest派か』もさすがにRSpec😆」「RSpecが主流の時期がありましたからね☺️」「RSpecがいいヤツだからRSpec、じゃない予感はするけどっ😆」

RSpecえかきうた

エレベーター渋滞の地道な解決


つっつきボイス:「yuguiさんがとても感心してたので読んでみたらとてもいい記事でした❤️」「そうそう、これはいい記事☺️」「へぇ〜、例の本↓でやってるみたいに鏡を置くとかじゃなくて?」「総務の人が混雑中のエレベーターにスタンバイして乗り降りを人力で制御しながら調査したんそうです」

「しかもエレベーターアルゴリズムを変えてABテストするとすごい金がかかるので💰、ボタンに紙を貼って塞ぐことでテストしたり」「それ天才すぎる!」「言ってみれば小中学生の夏休みの自由研究のようなノリなんですが、そこできっちり成果を出しているところがスゴい👍」「つまり、いわゆるKAIZENってこれでよかったりするんだよなって常々思うわけです☺️」「ホントにそう!」「何でもシステムだけで解決しようとするなと😆」「上流工程をやろうとする人は、このことを常に肝に銘じておきたいですね✨」

参考: 改善 - Wikipedia

その他Rails



つっつきボイス:「そうそう、chromedriver-helperが終わる」「そういえばRailsdmで誰かがWebpackerがらみの話の中で『最近はSelenium離れが進んでいる』って言ってた気がします」「自分も聞いたかも」「どうなんだろう、自分はそのセッションたぶん見てないけど、最近のフロントエンドのテスト方法が成熟してきて、今までのようにSeleniumをナマで使うことが減ってきたっていうことなんじゃないかな」「あ〜」

「フロントエンドはブラウザやJSが動いているところでやれるから、そもそもSeleniumで書く必要がありませんし: ただRailsなんかだと、Capybaraとかみたいにクライアント側とは違う言語で書きたいというのがあったのでSeleniumが必要だったと」「ふむふむ」「ただSeleniumがめちゃめちゃ重いというのはみんな言ってて😆、だからchromedriver使ったりwebdriverをじかに叩くということをするようになってきたと」「なるほど!」

「Seleniumはものすごく歴史長いので、そろそろ世代交代してもいいような気はしますが☺️」

Ruby

QuoraがRubyコミッター回答で盛り上がってる


つっつきボイス:「このところQuoraのプログラミング関連のQ&Aが何だか盛り上がっていて、Matzや卜部さんを含むRubyコミッターの皆さんがすごく熱心に答えているので」「そうそう」「個人的に好きなのが『なぜRuby開発者のまつもとゆきひろ氏は最近めっちゃへこんでるんですか?』というQ&Aでした😆」「なんつう😆」

「考えてみたら、今までこういう感じのことを聞ける場って意外になかったかもと思ったり」「それにしてもQuoraが今になって急に盛り上がっているのが謎: Quoraってだいぶ前に英語圏で爆発的にヒットしたけど日本版はずっと鳴かず飛ばずでしたし😆」「そうでしたよね」「やっぱり日本の文化に合わないのかななんて思っていたら、ここに来てこの一部での盛り上がりようは一体😆」「対照的に日本版スタックオーバーフローは未だに盛り上がらないけど🤣」「🤣」

「Quoraは案外Rubyコミュニティの中で第二の場として成長するのかなと思ったりしました」「Rubyコミュニティは元々名前出しで活動している人が多いからQuoraと合うかも」「Redmineとかもそうですし」

Rubyのメモリがあふれる原因(Ruby Weeklyより)


つっつきボイス:「記事冒頭のこの手書きのグラフ↓、他のRuby技術記事でもそっくりな画像を見た気がするんですけど、星の王子さまの似顔絵的に一種のテンプレになってるのかなと思って😆」「どうだろ😆」「メモリ溢れのグラフってたいていこういう感じで説明されますけどね☺️」「GCがメモリを回収しきれてないとだいたいこうなるし」「ともあれこういう記事はありがたい👍」「図もキレイで見やすいです😋」


同記事より

RailsをAWS LambdaとSAMで動かす(Ruby Weeklyより)

SAMってこれなんですね↓。

参考: AWS サーバーレスアプリケーションモデル (AWS SAM) の使用 - AWS Lambda


つっつきボイス:「SAMって何だろうと思ったら、AWSのServerless Application Modelsでした」「AWSのSAMはこういうのを簡単にできますみたいな触れ込みのサービスですね: SAMプロファイルとか使って」「へ〜」

「サーバーレスアプリを作ろうとすると、今までだったらLambdaを書いてAPI Gatewayを作ってあそことここをつないで、みたいなことをしてたんですが、SAMだとそれを一発でデプロイできたりします」「おぉ〜」「AWSのCloudFormationでやってもいいんですが、それだとトゥーマッチだったりすることもあるので、SAMはその辺をもっと簡単にやれるヤツだったと思う: もしかするとCloudFormationのインスタンスのひとつなのかもしれない」「ふむぅ」「SAMは割と若いサービスで、2〜3年前ぐらいに登場した気がします☺️: デプロイのインターフェイスも揃ってるし」

参考: AWS CloudFormation (設定管理とオーケストレーション) | AWS

「Railsがそこで動くということでしょうか?」「Lambdaなので基本Railsは動きませんね😆: この記事はSAMと組み合わせてそこを何とか動かしてみたのかな?ちゃんと見ないとわからないけど」「では次へ〜」

その他Ruby


同リポジトリより

Ruby trunkより

Ruby 2.7の新構文: numbered parameter(Ruby Weeklyより)

# 元記事より
[1, 2, 3].map { @1 + 3 }
=> [4, 5, 6]

つっつきボイス:「この間Slackのruby板に貼ったら『RubyがPerl化してるような気がする』と言ってた記事です」「そうそう😆、ブロックの中でこの@1みたいに秘密の変数が使えるようになるゾみたいな機能」「なんちゅう😆」「まあ使えると便利なのはワカル☺️」「自分はこれ欲しいと思ったことありませんでした😆」「ショートハンドで欲しいときがあるといえばあるかな」「いきなり使われるとちょっとビビるけど😆」「コワい〜🥺」


今回は以上です。

おたより発掘

バックナンバー(2019年度第1四半期)

週刊Railsウォッチ(20190319-2/2後編)BrowserStackは優秀、QuarkusとTruffleRubyとJRuby、最近のGPS事情ほか

今週の主なニュースソース

ソースの表記されていない項目は独自ルート(TwitterやはてブやRSSなど)です。

Ruby 公式ニュース

Rails公式ニュース

Ruby Weekly

RubyFlow

160928_1638_XvIP4h

Publickey

publickey_banner_captured

デザインも頼めるシステム開発会社をお探しならBPS株式会社までどうぞ 開発エンジニア積極採用中です! Ruby on Rails の開発なら実績豊富なBPS

この記事の著者

hachi8833

Twitter: @hachi8833、GitHub: @hachi8833 コボラー、ITコンサル、ローカライズ業界、Rails開発を経てTechRachoの編集・記事作成を担当。 これまでにRuby on Rails チュートリアル第2版の監修および半分程度を翻訳、Railsガイドの初期翻訳ではほぼすべてを翻訳。その後も折に触れて更新翻訳中。 かと思うと、正規表現の粋を尽くした日本語エラーチェックサービス enno.jpを運営。 実は最近Go言語が好きで、Goで書かれたRubyライクなGoby言語のメンテナーでもある。 仕事に関係ないすっとこブログ「あけてくれ」は2000年頃から多少の中断をはさんで継続、現在はnote.muに移転。

hachi8833の書いた記事

BPSアドベントカレンダー

週刊Railsウォッチ