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

週刊Railsウォッチ: 書籍『Programming Ruby 3.2 (5th Edition)』、ReDoSチェックサイトほか(20221102後編)

こんにちは、hachi8833です。StimulusをStimlusと書いてしまいがちです。

週刊Railsウォッチについて

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

TechRachoではRubyやRailsなどの最新情報記事を平日に公開しています。TechRacho記事をいち早くお読みになりたい方はTwitterにて@techrachoのフォローをお願いします。また、タグやカテゴリごとにRSSフィードを購読することもできます(例:週刊Railsウォッチタグ)

お知らせ: 来週は週刊Railsウォッチはお休みとし、通常記事を公開いたします。

🔗Ruby

🔗 書籍『Programming Ruby 3.2 (5th Edition)』


つっつきボイス:「お、出ましたね🎉」「Ruby 3.2、まだ出ていないのにタイトルに入ってる」「目次を見た感じではRubyが初めての人を対象としているっぽい」「Pragmatic Bookshelfの技術本は、オライリーのよりも情報密度が小さくてページ数が多い分読みやすい傾向はありますね」

参考: Pragmatic Bookshelf: By Developers, For Developers

🔗 MatchDataにdeconstructdeconstruct_keysが追加


つっつきボイス:「deconstructdeconstruct_keysが追加されたことで、正規表現マッチ結果で名前付きキャプチャをパターンマッチのinで扱ったりできるようになったそうです」「ツイートを見ると、今までrefine MatchDataのようにrefinementを使う必要があった書き方が公式に取り入れられた感じですね👍」


同ツイートより

参考: class MatchData (Ruby 3.1 リファレンスマニュアル)

RubyのRefinement(翻訳: 公式ドキュメントより)

後でRuby 3.2.0-devでやってみました。

$ ruby -v
$ ruby 3.2.0dev (2022-11-01T02:40:32Z master aa8c6759ee) [arm64-darwin22]
$ irb
>> m = /(?<a>foo).+(?<b>baz)/.match("foobarbaz")
=> #<MatchData "foobarbaz" a:"foo" b:"baz">
>> m.deconstruct_keys([:a, :b])
=> {:a=>"foo", :b=>"baz"}
>> m.deconstruct_keys([:a, :c]) # 存在しないキャプチャ名は無視される
=> {:a=>"foo"}
>> /(?<a>foo).+(?<b>baz)/.match("foobarbaz") in { a:, b: }
=> true
>> /(?<a>foo).+(?<b>baz)/.match("foobarbaz") in { a:, c: } # 存在しないキャプチャ名があるとfalse
=> false

Ruby 3.1.2では動きません。

$ ruby -v
ruby 3.1.2p20 (2022-04-12 revision 4491bb740a) [arm64-darwin21]
$ irb
>> m = /(?<a>foo).+(?<b>baz)/.match("foobarbaz")
=> #<MatchData "foobarbaz" a:"foo" b:"baz">
>> m.deconstruct_keys([:a, :b])
(irb):2:in `<main>': undefined method `deconstruct_keys' for #<MatchData "foobarbaz" a:"foo" b:"baz"> (NoMethodError)
    from /Users/hachi8833/.anyenv/envs/rbenv/versions/3.1.2/lib/ruby/gems/3.1.0/gems/irb-1.4.2/exe/irb:11:in `<top (required)>'
    from /Users/hachi8833/.anyenv/envs/rbenv/versions/3.1.2/bin/irb:25:in `load'
    from /Users/hachi8833/.anyenv/envs/rbenv/versions/3.1.2/bin/irb:25:in `<main>'
>> /(?<a>foo).+(?<b>baz)/.match("foobarbaz") in { a:, b: }
=> false

🔗 RubyKaigi 2022のリンク集


つっつきボイス:「ScrapboxでRubyKaigi 2022のリンク集が作られていました」「感想ブログの量がめちゃくちゃ多いですね😳」「これをまとめた情熱がすごい」「日本語記事だけでこのボリュームなので、海外の感想ブログも含めたらさらに増えそう」

🔗 その他Ruby

以下のツイートはつっつき後に見つけました↓。

🔗 設計・セキュリティ

🔗 バッチ処理プラクティス


つっつきボイス:「昨年の記事ですがはてブでバズっていました」「バッチ処理は定番のテーマですね」「morimorihogeさんも以前以下の記事を書いていましたね↓」

Webのバッチ処理とオンライン処理のポイントとシステムの応答性能を学ぶ#1(社内勉強会)

「バッチ処理は、たとえばどの要素がどのぐらい重要なのかとか、システムの規模やデータの大きさによって大きく変わってくるので、一般性の高い形にまとめるのが大変」「いくらでも書くことが増えそうですよね」「しかもどんなに書いてもすべてを完全にカバーするのは無理」

🔗 市場調査の無料情報

つっつきボイス:「スレッドで他にも紹介されていました」「e-stat.go.jpなどは参照してみたことがありますね: CSVなどでエクスポートできたけど、情報の書式が必ずしも揃っていなかった覚えがあります」「それありそう」「無料の情報は便利だけど特に非上場企業の情報だと限度もあるし、少なくとも更新のタイミングをチェックしたり他の情報とも突き合わせたりする必要はあるでしょうね」「たしかに」「もちろん情報源が増えるのはいいこと👍」

🔗クラウド/コンテナ/インフラ/Serverless

🔗 Rancher Desktop


つっつきボイス:「社内で話題になっていたので取り上げてみました」「たぶん"らんちゃー"って読むんでしょうね」

rancher: 〈米・豪〉農場(牧場)の経営者(労働者)

「比較的新しいDockerオルタナティブですね: もともとKubernetes向けのソフトウェアですが、Kubernetesを扱えるということはバックエンドでDockerコンテナを扱っているのでDockerの管理にも使えるでしょうね」「Mac環境だとまだ遅いらしいとかいろいろ噂は見かけますね」

参考: Kubernetes -- プロダクショングレードのコンテナ管理基盤

🔗 DockerのWebAssembly対応(Beta版)


つっつきボイス:「Dockerのドキュメントを読んでてたまたま見つけました」「お〜、WasmアプリケーションをDockerのwasi/wasm32プラットフォームで動かすんですね」「これは面白い」「まだテクニカルプレビュー状態なんですね」

# https://docs.docker.com/desktop/wasm/ より
services:
  app:
    image: michaelirwin244/wasm-example
    platform: wasi/wasm32
    runtime: io.containerd.wasmedge.v1
    ports:
      - 8080:8080
# https://docs.docker.com/desktop/wasm/ より
$ docker image inspect server | grep -A 3 "Architecture"
        "Architecture": "wasm32",
        "Os": "wasi",
        "Size": 3001146,
        "VirtualSize": 3001146,

「WasmのVMが増えるのか〜」「"Architecture": "wasm32"ですもんね」「こういうのを見ているとJVMを思い出してしまう」「言われてみれば方向性も同じですよね」

参考: Java仮想マシン - Wikipedia

「アーキテクチャはwasm32になっても、IOやファイルシステムとのやりとりはWasmの範疇ではないんですよね」「そのあたりをWASIでやろうとしているみたいですね」「そういう移植性が今後どうなるかが気になるところ」

参考: 興味のおもむくままにWASM/WASIらへん

🔗JavaScript

🔗 Lyra: TypeScriptで書かれたWebサイト内検索エンジン

LyraSearch/lyra - GitHub


つっつきボイス:「これもBPS社内で話題になっていたので取り上げられました」「LyraはAWS Lambdaなどでも使えるあたりがなかなかよさそう👍」

参考: AWS Lambda(イベント発生時にコードを実行)| AWS

「ところでLyraはWebサイト内を検索するエンジンということですけど、Algolia↓みたいに外部APIを呼び出すタイプとは違うんでしょうか?」「Lyraは検索するデータをメモリに保持する形で動作して、プロセスが終了すればデータも消えますね」「なるほど、別の方法なんですね」「たとえばLambdaのコールドスタートではデータを一気にメモリに読み込んで、ホットスタートでは読み込み済みのものを使うなどすれば十分高速に動くんじゃないかな」

インタビュー: 超高速リアルタイム検索APIサービス「Algolia」の作者が語る高速化の秘訣(翻訳)

🔗 Turbopack

vercel/turbo - GitHub


つっつきボイス:「これもBPS社内で話題になっていました」「Turbopackはwebpackの後継に当たるモジュールバンドラーで、webpack互換にはしないそうです」「webpackの作者も開発に加わっているんですね」「Rustで書かれているのか」「誰か使ってみて欲しい」

参考: Vercel、Rustで開発したWebpackの後継モジュールバンドラー「Turbopack」を公開|CodeZine(コードジン)

🔗CSS/HTML/フロントエンド/テスト/デザイン

🔗 Chrome DevToolsのDOMブレークポイント機能


つっつきボイス:「babaさんあたりはもう知っていそうな機能かなと思いつつ貼ってみました」「ブレークポイントを仕掛けてDOMが変化したときにデバッガが起動するのはよさそう👍」

参考: ドキュメントオブジェクトモデル (DOM) - Web API | MDN

「ところでイベントリスナーのデバッグってつらいですよね」「DOMを作り直したらイベントハンドラが消えちゃいますし」「そういうのがつらい人たちがReactに移動した感はあるかも」

🔗言語/ツール/OS/CPU

🔗 iPhoneのUSB-C化


つっつきボイス:「これはEUお手柄🎉」「義務化、前からEUはやるやるって言ってましたね」「今のM1 Macbook ProのUSBがどのUSBかもわかってませんでした😅」「最近のMacはUSB-C/Thunderbolt 4しか付いていないはずですね」

参考: Thunderbolt 4とはどんな規格? USB-Cや3との違いも丁寧に解説! | マクリン

🔗 recheck: 正規表現のReDoS脆弱性チェッカー

makenowjust-labs/recheck - GitHub


つっつきボイス:「前回取り上げた正規表現のReDoSの理論解説記事(ウォッチ20221026)の執筆メンバーが作ったWebサービスとリポジトリです: Playgroundに脆弱な正規表現サンプルが出てくるのですぐ試せます」「元の記事でも書かれているように、このチェックが完全とは限らないし時間がかかりすぎる可能性もあるけど、脆弱性の大半を検出できるだけでもありがたい🙏」「このrecheckをバッチでかけたくて最近手元でコンパイルしようとしたときに、Scala言語で書かれていることに気づきました」

参考: Scala - Wikipedia


後編は以上です。

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

週刊Railsウォッチ: Packwerkの詳しい解説書『Gradual Modularization for Ruby and Rails』ほか(20221101前編)

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


CONTACT

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