Tech Racho エンジニアの「?」を「!」に。
  • Ruby / Rails関連

週刊Railsウォッチ(20201222後編)TypeProfプレイグラウンド、Ruby 3リリースイベント、Ruby 3は3倍速くなったかほか

こんにちは、hachi8833です。2020年度最後の週刊Railsウォッチをお送りします。来年もどうぞよろしくお願いします🙇。

  • 各記事冒頭には⚓でパーマリンクを置いてあります: 社内やTwitterでの議論などにどうぞ
  • 「つっつきボイス」はRailsウォッチ公開前ドラフトを(鍋のように)社内有志でつっついたときの会話の再構成です👄
  • お気づきの点がありましたら@hachi8833までメンションをいただければ確認・対応いたします🙇

Ruby

@mameさん作のRuby 3 TypeProfプレイグラウンド


つっつきボイス:「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で型の不一致を検出できるということですね」「こういうのをさっと動かして実感できるのありがたい🙏」

「上は@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に初めてクラスというものが導入されたときもありましたね」「それ覚えてます」「当時はコンストラクタってあったかな?」「あの頃自分でデストラクタを実装した覚えもちょっとあります」(以下延々)

参考: PHP: クラスの基礎 - Manual


なお、同記事のコメント欄にもNoah Gibbsさんが「Railsのエンドツーエンドの速度が1.7倍速くなったのは本当に凄いこと: これは覚えておいて欲しい」とコメントを書いていました。

Ruby 3.0リリースイベント


つっつきボイス:「12/26(土)にRuby 3.0リリースイベントがオンライン開催されるそうなので申し込みました」「お、自分も申し込んどこう」「パネリストが豪華!」「ああ、もう年末なんですね」(以下帰省の話など)

その他Ruby



つっつきボイス:「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歳の誕生日を迎える

以下で知りました。

参考: 週刊気になったITニュース(2020/12/05号) - masa寿司の日記


つっつきボイス:「サイトを開くと昔懐かしのNetscapeっぽい画面!」「昔のブラウザってこうでしたよね」「今25歳のエンジニアがJavaScriptと同い年ってことか、はぁぁ」「1995生まれですね😆」

参考: Netscapeシリーズ - Wikipedia

「上からスクロールしていくと、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は発明されなければならなかった


つっつきボイス:「!!Con West 2019というカンファレンスで発表されたものだそうです」「そういえばRubyでもifthenを使う書き方は一応できますね、あまり使われませんけど」「thenは使わないですね」

参考: !!Con West

「これも歴史ものかな?」「英語の接続詞として使われることのないelseがどこから来たかなどを調べたりしてるようです」「プログラミングではif-then-elseと当たり前のように書いてますけど、言われてみればたしかに英語の話し言葉や書き言葉ではそういう言い回しはしませんよね」「会話でのelseというと思い付くのはsomeone elseぐらいかも」

「記事ではその辺の歴史をひもといているみたいですね」「何だかすっごく昔の知らない言語がいろいろ出てきてるんですけど」「WHENEVEROR WHENEVERとかOTHERWISEとか、いろんな書き方があったんですね」「プログラミング言語好きな人にはきっとたまらない内容❤️」「ALGOL 60という言語のこのif文の構造↓がカオスすぎる😆」「この飛び方はエグい😆」

参考: ALGOL - Wikipedia


後編は以上です。

良いお年をと言うにはまだ早いですね。どうぞ皆さまよいクリスマス、よいRuby 3.0、よいRails 6.1を!

バックナンバー(2020年度第4四半期)

週刊Railsウォッチ(20201221前編)aws-sdk-rails gemの機能をチェック、RubyWorld Conference 2020のDHHインタビューほか

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

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

Ruby Weekly

StatusCode Weekly

statuscode_weekly_banner


CONTACT

TechRachoでは、パートナーシップをご検討いただける方からの
ご連絡をお待ちしております。ぜひお気軽にご意見・ご相談ください。