- Ruby / Rails関連
週刊Railsウォッチ(20201222後編)TypeProfプレイグラウンド、Ruby 3リリースイベント、Ruby 3は3倍速くなったかほか
こんにちは、hachi8833です。2020年度最後の週刊Railsウォッチをお送りします。来年もどうぞよろしくお願いします🙇。
- 各記事冒頭には⚓でパーマリンクを置いてあります: 社内やTwitterでの議論などにどうぞ
- 「つっつきボイス」はRailsウォッチ公開前ドラフトを(鍋のように)社内有志でつっついたときの会話の再構成です👄
- お気づきの点がありましたら@hachi8833までメンションをいただければ確認・対応いたします🙇
⚓Ruby
⚓ @mameさん作のRuby 3 TypeProfプレイグラウンド
» Ruby TypeProf Playground https://t.co/MTvG7UKF2R
— Yukihiro Matsumoto (@yukihiro_matz) November 26, 2020
つっつきボイス:「Ruby 3のTypeProfをすぐ試せるプレイグラウンドを@mameさんが作ってくれたそうです」「お〜これは凄い!」「バグレポート用のボタンも用意されていますね」
「デフォルトのサンプルコードで早速Analyzeボタンを押すと以下のようにエラー行が出力された↓」
# Errors
test.rb:6: [error] failed to resolve overload: String#+
# Classes
class Object
private
def hello_message: (User user) -> String
def type_error_demo: (User user) -> untyped
end
## Version info:
## * Ruby: 2.7.2
## * RBS: 0.20.1
## * TypeProf: 0.10.0
「RBSで以下のようにage: Integer
と型が記述されていて、それが静的チェックで元コードの"The age is " + user.age
に対して上のfailed to resolve overload: String#+
を表示したんですね」
class User
def initialize: (name: String, age: Integer) -> void
attr_reader name: String
attr_reader age: Integer
end
「def type_error_demo: (User user)
が出力でuntyped
と認識されてる」「では元コードを"The age is " + user.age.to_s
のようにto_s
でStringに変換してみると...エラーも消えた🎉」「おぉ〜」
「こうやってコードに対応するRBSで型を記述しておくことで、コード実行前にTypeProfで型の不一致を検出できるということですね」「こういうのをさっと動かして実感できるのありがたい🙏」
TypeProfの期待を上げすぎてしまったか。ライブラリのRBSが揃ってない現状ではライブラリのコードも解析するのでめっちゃ解析遅いし、推論はすぐuntyped(TSでいうany)に落ちるし、そのくせエラー発見ツールとしてはfalse positive多すぎます。改善は続けるので、期待しすぎずに長い目で見てね……
— Yusuke Endoh (@mametter) December 14, 2020
「上は@mameさんの別のツイートです」「ライブラリのRBS整備、言われてみればたしかに」「Stringのところにうっかり数値を入れるなどはありがちなので、自分が作るコードでこうやってチェックできるだけでも大きいと思います👍」「人間が気づかないところはコンピュータにお任せしたい」「Rubyの型推論はこれからですね」
⚓ Ruby 3は3倍速くなったか(Ruby Weeklyより)
つっつきボイス:「RubyやRailsのベンチマークでおなじみのNoah Gibbsさんの記事です」「Ruby 2.0と比べてRuby 3.0がどのぐらい速くなったかという記事のようですね」「ざっと流し読みした限りでは、細かくはいろいろ述べられていますけど、Ruby 3.0は2.0と比べておおむね3倍速を達成したと思うそうです」「3倍速来た!」「RailsはRuby 2.0から3.0で70%(1.7倍)程度の高速化だそうです」
「いやほんとに、Ruby 2.0の頃から比べると今のRubyは随分速くなりましたよね」「記事によるとRuby 2.0〜2.6のときの高速化が大きかったそうです」「Ruby 1.9の頃のRubyは今思い出しても遅かった」
「Ruby 2.7から3.0ではどのぐらい速くなったのかな?」「今の話からするとRuby 2.7から3.0の高速化は2.0〜2.6のときほど大きくはなさそうですね」「2倍速くなるだけでもプログラミング言語としては凄い達成だと思いますよ」
「Rubyが遅いと言われがちだったのも、1.9のような昔の遅さの印象がアップデートされていないことが多い気がします」「メインで使ってないプログラミング言語やフレームワークの情報や印象がアップデートされないままになるのは自分たちも含めてよくあることなので、そこはしょうがないでしょうね」「ですよね、いろいろ思い当たります」
「PHPも書かなくなって随分経つので最近の様子はわからないです」「もうPHPは書かないんですか?」「業務上読むことはたまにありますけど、モダンなPHPは書けない」「PHPも今は8なんですね」「自分が一番PHPを書いてたのは4系の時代だったかな」「自分も5系が多かったかも」「その頃PHPに初めてクラスというものが導入されたときもありましたね」「それ覚えてます」「当時はコンストラクタってあったかな?」「あの頃自分でデストラクタを実装した覚えもちょっとあります」(以下延々)
なお、同記事のコメント欄にもNoah Gibbsさんが「Railsのエンドツーエンドの速度が1.7倍速くなったのは本当に凄いこと: これは覚えておいて欲しい」とコメントを書いていました。
⚓ Ruby 3.0リリースイベント
Ruby 3.0 release event - connpass: Ruby 3.0 がきっと 12/25 にリリースされるので、Ruby 3.0 を記念するイベントを zoom でオンラインで開催します。 Matz と Ruby コミッタがパネリストとして登壇します。また、参加者の皆様からのご質問も歓迎します。… https://t.co/L6OMnIeE4z [ruby]
— overleo (@overleo) November 21, 2020
つっつきボイス:「12/26(土)にRuby 3.0リリースイベントがオンライン開催されるそうなので申し込みました」「お、自分も申し込んどこう」「パネリストが豪華!」「ああ、もう年末なんですね」(以下帰省の話など)
⚓ その他Ruby
Link: The Evolution of Ruby Strings from 1.8 to 2.7 | by Mehdi Farsi | RubyCademy | Medium https://t.co/zfFw4jTQWW
— Yukihiro Matsumoto (@yukihiro_matz) December 13, 2020
つっつきボイス:「RubyのStringの移り変わりを追っている記事です」「そうそう、こういうふうにUTF-8文字の中にinvalidな文字があるときにencode("UTF-8", invalid: :replace)
のような方法で除去したいときってありますよね」「2.1より前はinvalidな文字を検出できなかったけど、2.1から検出できるようになったのか」「�
という文字、ときどき見かけます」「なおこの�
という文字は:replace
オプションで変えられますよ」
# 同記事より
# in ruby <= 2.0.x
content = "Is your pl\xFFace available?".force_encoding("UTF-8")
content.encode("UTF-8", invalid: :replace) # => "Is your pl\xFFace available?"
# in ruby 2.1.x
content = "Is your pl\xFFace available?".force_encoding("UTF-8")
content.encode("UTF-8", invalid: :replace) # => "Is your pl�ace available?"
「RubyのStringは非常によく使うので、こうやって歴史を概観できるのはいいですね👍」
⚓クラウド/コンテナ/インフラ/Serverless
⚓ AWSのカオスエンジニアリング機能: AWS Fault Injection Simulator
つっつきボイス:「AWS Fault Injection Simulator、まだ詳しく見てなかったけどどういう感じでできるのかな?」
参考: カオスエンジニアリングの原則 - Principles of chaos engineering
「このニュースでBPS CTOのbabaさんが喜んでいました」「stagingで確認できることが増えるのはいいですよね: DBのレプリケーションが詰まったらどうなるかを確認するとか」「ですよね」
「少しググってみた感じでは、AWS Fault Injection Simulatorの具体的な機能はリリースされてないみたい」「あ、まだ発表止まりですか」「今はComing soonで、2021年に登場予定らしい↓」「障害率とかを設定したりテストシナリオのテンプレートを使ったりできるのかなと予想はしていますけど、詳しくはリリースされてからですね」「そうですね」
参考: AWS Fault Injection Simulator – Fully managed chaos engineering service – Amazon Web Services
⚓ AWS Auroraにもある障害シミュレーション機能
「ちなみに、AWSのAuroraにも障害シミュレーション用のクエリが使える機能がありますよ」「あ、そうなんですか!」「やったことなかった」「AuroraのコンソールでALTER SYSTEM CRASH
にオプションを指定して実行することで、DBクラッシュやレプリカやディスクの障害のような特定の障害状況をシミュレーションしてテストしたりできます」「こんなのやれるとは知らなかった」「これはAurora専用ですけどね」
参考: 障害挿入クエリを使用した Amazon Aurora のテスト - Amazon Aurora
「DBは壊れたときの影響が非常に大きいので、こういう障害シミュレーション機能を使って障害時にどんな振る舞いになるかを事前に確認できるのは大事」
⚓JavaScript
⚓ JavaScriptが25歳の誕生日を迎える
25 milestones to celebrate JavaScript's 25th Anniversary:https://t.co/8NSBjie4xg pic.twitter.com/Nk58xtbZpo
— Open Anniversary (@OpenAnniv) December 4, 2020
以下で知りました。
参考: 週刊気になったITニュース(2020/12/05号) - masa寿司の日記
つっつきボイス:「サイトを開くと昔懐かしのNetscapeっぽい画面!」「昔のブラウザってこうでしたよね」「今25歳のエンジニアがJavaScriptと同い年ってことか、はぁぁ」「1995生まれですね😆」
「上からスクロールしていくと、LiveScriptという初期の言語名やMicrosoftのJScript、いろいろ見られる」「ECMAScript 1が1997年から始まってたというのは思ったより早いかも」「これは歴史ですね」「出たXMLHttpRequest!」「まだAJAXという言葉がなかった頃ですね」「それまではXMLHttpRequestを生で使ってたの思い出しました」「そのAJAXの登場が2005年だったとは」
参考: XMLHttpRequest - Wikipedia
参考: Ajax - Wikipedia
「他にもAngularjs、Mozilla登場、jQuery、React、Vuejs、Next.jsなどなど」「こうやって歴史をコンパクトに辿れるのはいいですね👍」
⚓言語/ツール/OS/CPU
⚓ if-then-elseは発明されなければならなかった
One of the things I really like about Ruby is how it gives me the right blend between a computer language and a natural language.
— Peter de Chair Baker (@peter_baker) December 14, 2020
つっつきボイス:「!!Con West 2019というカンファレンスで発表されたものだそうです」「そういえばRubyでもif
でthen
を使う書き方は一応できますね、あまり使われませんけど」「then
は使わないですね」
参考: !!Con West
「これも歴史ものかな?」「英語の接続詞として使われることのないelse
がどこから来たかなどを調べたりしてるようです」「プログラミングではif
-then
-else
と当たり前のように書いてますけど、言われてみればたしかに英語の話し言葉や書き言葉ではそういう言い回しはしませんよね」「会話でのelseというと思い付くのはsomeone elseぐらいかも」
「記事ではその辺の歴史をひもといているみたいですね」「何だかすっごく昔の知らない言語がいろいろ出てきてるんですけど」「WHENEVER
やOR WHENEVER
とかOTHERWISE
とか、いろんな書き方があったんですね」「プログラミング言語好きな人にはきっとたまらない内容❤️」「ALGOL 60という言語のこのif文の構造↓がカオスすぎる😆」「この飛び方はエグい😆」
後編は以上です。
良いお年をと言うにはまだ早いですね。どうぞ皆さまよいクリスマス、よいRuby 3.0、よいRails 6.1を!
バックナンバー(2020年度第4四半期)
週刊Railsウォッチ(20201221前編)aws-sdk-rails gemの機能をチェック、RubyWorld Conference 2020のDHHインタビューほか
- 20201216後編 Ruby 3.0.0-rc2とRuboCop 1.6がリリース、Ruby 3の静的型解析記事、CentOS 8のEOLが短縮ほか
- 20201214前編 Rails 6.1の直近コミットを見る、RuboCop Rails 2.9リリース、ar_lazy_preload gemほか
- 20201209後編 Ractorベンチマーク記事、Railsで複合主キーを使う、AWS re:Invent 2020ほか
- 20201208前編 レガシーRailsアプリを引き継ぐときの6つの作業、サーバーレスプロジェクトをRailsに移行ほか
- 20201202後編 Rails 6.1 RC2リリース、Ruby STMの詳細な解説記事、RSpecのdiffを見やすくするsuper_diff gemほか
- 20201201前編 switch_pointがActive Record 6.0でサポート終了、Rails DBトランザクションの落とし穴ほか
- 20201124 strict loading violationの振る舞いを変更可能に、Railsモデルのアンチパターン、quine-relayとさまざまなクワインほか
- 20201117後編 Rubyのパターンマッチングが3.0で本採用に、AWS Lambdaサイズを縮小する、AppleのM1チップほか
- 20201116前編 6.1のActive Storageでimage_processing gemが必須に、Webアプリ設計の変遷とフロントエンド領域の再定義ほか
- 20201111後編 RubyConf 2020が11/17〜19オンライン開催、GitHub Container Registryベータ開始、スマートロックほか
- 20201110前編 Rails 6.1 RC1がリリース、Railsアプリに最適なEC2インスタンスタイプ、n_plus_one_control gemほか
- 20201028後編 RuboCop 1.0.0 stable版がリリース、Ruby DSLのGUIフレームワークGlimmer、Keycloakほか
- 20201026前編 Shopifyのerb-lint gem、Form Objectを使いやすくするyaaf gem、railsrcの機能追加ほか
- 20201021後編 webpack 5リリースでWebpacker対応開始、AWS Lambda Extensions発表、Pythonにマクロ構文追加提案ほか
- 20201020前編 Percona Toolkitは優秀、Active Admin非公式ガイド、Railsをリアクティブにするガイドほか
- 20201013後編 ruby-type-profilerがtypeprofにリネーム、AWS API Gatewayの実行ログは便利、M5Stackほか
- 20201012前編 Railsの隠し機能routing visualizer、action_args gem、N+1用goldiloader gemほか
- 20201006後編 Rubyの
defined?
キーワード、Ractorベースのジョブスケジューラ、Caddy Webサーバーほか - 20201005前編 Ruby 2.7.2がリリース、Shopifyのモジュラー化gem「packwerk」、stimulus_reflexほか
今週の主なニュースソース
ソースの表記されていない項目は独自ルート(TwitterやはてブやRSSやruby-jp SlackやRedditなど)です。