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

週刊Railsウォッチ: Rubyコンパイラの歴史動画、RubyのWebAssembly対応進む、ぼっち演算子の注意点ほか(20220126後編)

こんにちは、hachi8833です。昨晩体調を崩して銀座Rails#41に参加できず...😢

週刊Railsウォッチについて

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

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

🔗Ruby

🔗 RuboCopのRuby 3.1対応


つっつきボイス:「お〜、例のハッシュ値省略記法がRuboCopに追加された」「RuboCopのデフォルトは省略するスタイルになったんですね」「こうやって目を慣らしていくと新しい記法が使われるようになるかな」

# 同記事より
# EnforcedShorthandSyntax: always (default)

# bad
{foo: foo, bar: bar}

# good
{foo:, bar:}


# EnforcedShorthandSyntax: never

# bad
{foo:, bar:}

# good
{foo: foo, bar: bar}

参考: Hashの値の省略記法 - NaCl非公式ブログ

&だけで書ける無名ブロックの委譲、初めて見るとちょっと驚くかもしれないけど個人的には割と好き」「&にブロックが入ると思えばいいのかな」

# 同記事より
# EnforcedStyle: anonymous (default)

# bad
def foo(&block)
  bar(&block)
end

# good
def foo(&)
  bar(&)
end

# EnforcedStyle: onymous

# bad
def foo(&)
  bar(&)
end

# good
def foo(&block)
  bar(&block)
end

参考: プロと読み解く Ruby 3.1 NEWS - クックパッド開発者ブログ

🔗 ruby-nextがRuby 3.1に対応(RubyFlowより)

ruby-next/ruby-next - GitHub


つっつきボイス:「以前もウォッチ20191204で取り上げたruby-nextもRuby 3.1の新構文に対応したそうです」「ruby-nextは古いRuby構文に変換するポリフィルですね」

参考: Polyfill (ポリフィル) - MDN Web Docs 用語集: ウェブ関連用語の定義 | MDN

🔗 RubyとApache Arrow


つっつきボイス:「Red Data ToolsプロジェクトでRuby 向けのApache ArrowライブラリRed Arrowを手掛けているSpeeeの村田賢太さんと、クリアコードの須藤功平さんによる公開論文だそうです」「お〜興味深い内容: 情報処理学会のような学術団体がこういうのを公開するのは大事ですね」

参考: Red Data Tools - Rubyでデータ処理!
参考: Apache Arrowのご紹介 - クリアコード

🔗 VSCode向けSorbet拡張機能がリリース


つっつきボイス:「SorbetのVSCode拡張機能をリリースしたのは、やはりSorbetを作ったStripeですね」「あ、ほんとだ」

速報: Ruby向け型チェッカー「Sorbet」をStripeがオープンソース化

🔗 Rubyのぼっち演算子の注意点(Ruby Weeklyより)


つっつきボイス:「safe navigation operator(&.)は、ぼっち演算子のことですね」「ぼっち演算子に気をつけようみたいな記事かな」「ぼっち演算子は個人的にあまり使わないようにしてます」

「お、こんな罠が: 値が両方nilだとtrueが返ってしまう↓」「うわ、怖い」「Rubyではnil == nilがtrueになるからこうなりますね」「これは気をつけないと」

# 同記事より
  def owner?(explorer)
    explorer&.id == owner_id    # explorerとowner_idが両方nilだとtrueが返される
  end

Rubyのぼっち演算子はRailsの`Object#try`より高速(翻訳)

🔗 gemをアップデートしたら不要な課金が大量に発生(Ruby Weeklyより)


つっつきボイス:「gemをアップデートした直後に、普段はほとんど動きのなかったユーザーへの課金額が急上昇したそうです↓」「これは怖い」「即死...」「記事の最後は平謝りですね」


同記事より

「急いでStripeのAPIをロックしてgemをロールバックし、不要な課金をされた人に返金することで対応したんですね」「課金を扱うシステムはほんとに要注意: それと課金額もチェックするのが重要」「あ、たしかに」「Mongoid gem(Ruby向けMongoDBドライバ)をアップデートしたらorの挙動が変わって、本来不要な課金がStripeに送信されてしまったのか...」「うわー」

🔗 RubyのWebAssemblyのWASI対応が進む(Publickeyより)

元記事: RubyがWebAssemblyのWASI対応へ前進。ブラウザでもサーバでもエッジでもどこでもWebAssembly版Rubyが動くように - Publickey


つっつきボイス:「そういえばPublickeyに掲載されていたこのWebAssemblyの記事もよかった↑」「あ、st0012さんに以下のコミット↓があることを教わっていたのに危うく貼り忘れるところでした」

参考: Feature #18462: Proposal to merge WASI based WebAssembly support - Ruby master - Ruby Issue Tracking System

「記事は『これは何を意味するのでしょうか?』などを丁寧に解説していいですね👍」「WASI向け変更をコミットしたkateiさんという方がこのたびRubyコミッターに加わったそうです」「おめでとうございます🎉」

つっつき後に以下の記事が公開されていました。

🔗 Rubyアソシエーションの開発助成金

「そういえば昨年のRubyアソシエーション開発助成金でWasm対応のプロジェクトがありましたよね」「ほんとだ、『MRIのWebAssembly対応よるポータブルなRubyプログラムの実現』というエントリですね」

参考: 2021年度Rubyアソシエーション開発助成金 公募結果発表

「開発助成金の成果が実ったのが素晴らしい」「Rubyアソシエーションに寄付をする意義を実感できますね」「だいぶ前のRubyWorld Conferenceのときに自分も現地で寄付しました: 現地入りは寄付をする機会になりやすいと思います」「早く現地参加できるようになるといいですよね」

「ところで、GitHub Sponsors経由でもRubyアソシエーションに寄付できるといいな」「あ、たしかに寄付の動線が複数ある方が寄付しやすくなりますよね、GitHub Sponsors経由ならリポジトリにバッジも表示されますし」「もちろん今もRubyアソシエーションに寄付すれば芳名帳に掲載されます」

参考: GitHub Sponsors

🔗 Rubyコンパイラの歴史動画(Ruby Weeklyより)


つっつきボイス:「例のシェイプ記事やスタンプ記事↓の翻訳でお世話になったShopifyのChris Seatonさんが、昨年11月にコロラド州デンバーで開催されたRubyConf 2021で発表した動画だそうです」「なるほど、Rubyインタプリタ内で行われるコンパイラの歴史をたどる動画ですね: これはいい👍」「コアな話が面白そう」「歴史を把握している人が解説してくれているのがありがたいですね: 後でちゃんと見よう」

おそらく以前もウォッチで紹介した以下のサーベイを下敷きにしていると思われます↓。

参考: The Ruby Compiler Survey

Rubyオブジェクトの未来をつくる「シェイプ」とは(翻訳)

Rubyの整数オーバーフローチェックを「スタンプ」で一掃する(翻訳)

以下はつっつき後に見つけたツイートです。

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

🔗 AWSがRuby SDKコード生成ツールsmithy-rubyをdeveloper preview公開(Ruby Weeklyより)

awslabs/smithy-ruby - GitHub

smithing
{名} : 鍛造、金属工芸


つっつきボイス:「AWSがSmithyのRuby版をdeveloper previewで公開したそうです」「公式サイト↓を見ると、SmithyはIDL(インターフェイス記述言語)を書くとそれを元に各種言語向けのコードを生成してくれるツールのようですね」

// awslabs.github.io/smithy/ より
namespace example.weather

service Weather {
    version: "2006-03-01",
    resources: [City],
    operations: [GetCurrentTime]
}

resource City {
    identifiers: { cityId: CityId },
    read: GetCity,
    list: ListCities,
    resources: [Forecast],
}

参考: インタフェース記述言語 - Wikipedia

「AWS SDKはこのSmithyで作られているんじゃないかな」「そのようですね」「IDLで定義を書いてツールにかけるとさまざまな言語向けのマッパーを一気に生成するというのは、Javaなどでも複数言語対応や複数プロトコル対応などによく使われています」

参考: AWS SDK とツール
参考: Java IDL入門

「SmityはAWSがこれまで内部で使っていたものをオープンソースとして公開したんでしょうね: AWS内部での開発にはこの種のツールが不可欠なはずなので」「あれだけAPIがたくさんあるとツールは必要でしょうね」

「AWSがかつてすべてをAPI化すると決めたときに、APIは厳守する代わりにAPI内部の実装には何を使ってもよいと宣言したんですよ」「へ〜!」「だからこそIDLからコードを生成するツールが不可欠」「API内部の言語やフレームワークを問わないというのは開発者にとってはありがたいですね」「この種のツールはいろいろありますが、AWSの中で使われているものがオープンソース化されたというのは自分たちが使うかどうかは別にして面白いですね」

参考: The Secret to Amazons Success Internal APIs
参考: ASCII.jp:なぜAmazonはマイクロサービスに舵を切ったのか?


「ちなみに、AWSとは別にRuby向けのGemsmithとRubysmithというプロジェクトもあります↓」

bkuhlmann/gemsmith - GitHub

bkuhlmann/rubysmith - GitHub

🔗 AWS LambdaがES Modulesをサポート開始(Publickeyより)


つっつきボイス:「なるほど、AWS Lambdaでパッケージ化されたES Modulesもインポートできるようになったんですね」「今まではCommonJSのみだったのか」

参考: JavaScript モジュール - JavaScript | MDN
参考: CommonJS - Wikipedia

「こういうふうに拡張子が.mjsのES Modulesもバンドルして読み込めるようになったのね↓」

// https://aws.amazon.com/jp/blogs/compute/using-node-js-es-modules-and-top-level-await-in-aws-lambda/ より
// this file is named index.mjs – it will always be treated as an ES module
import { square } from './lib.mjs';

export async function handler() {
    let result = square(6); // 36
    return result;
};

// lib.mjs
export function square(x) {
    return x * x;
}

「こちらが従来のCommonJSの読み込みか↓: 今後は拡張子が.cjsだとCommonJSのモジュールとして扱われるので、同じバンドルzipファイルにES ModulesとCommonJSを両方含められるようになる」「なるほど」

// https://aws.amazon.com/jp/blogs/compute/using-node-js-es-modules-and-top-level-await-in-aws-lambda/ より
// CommonJS require syntax
const { SSMClient, GetParameterCommand } = require("@aws-sdk/client-ssm");

const ssmClient = new SSMClient();
const input = { "Name": "/configItem" };
const command = new GetParameterCommand(input);
const init_promise = ssmClient.send(command);

exports.handler = async () => {
    const parameter = await init_promise; // await inside handler
    console.log(parameter);

    const response = {
        "statusCode": 200,
        "body": parameter.Parameter.Value
    };
    return response;
};

「そしてES Modulesの方が速いらしい↓」「お〜」


Using Node.js ES modules and top-level await in AWS Lambda | AWS Compute Blogより

🔗JavaScript

🔗 Stimulusのベストプラクティス


つっつきボイス:「最近Stimulusが気に入ってしまって、またStimulus記事を拾いました」

「あとこちらのGlitchは、Stimulusの公式ドキュメントからリンクされていたWeb IDE環境で、Stimulusも使えるそうです↓」「NodeやReactやSQLiteなどはトップページでフィーチャーされているのにStimulusはなぜかフィーチャーされていませんけどね☺️」

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

🔗 AVIFフォーマット


つっつきボイス:「AVIFという画像ファイル形式は初めて見る」「AV1フォーマットのIフレームを静止画として表示するとは!」

AVIF は、ロイヤリティフリーなコーデックを目指して AOMedia が開発した AV1 を、画像に転用したものだ。AV1 Image File Format の略とされ、AV1 の I フレームを静止画として表示するイメージだ。
同記事より

参考: AV1 - Wikipedia
参考: 次世代型画像ファイル形式「AVIF」とは?概要やメリット・デメリット、将来性などを解説! | 株式会社ipe (アイプ)

「記事の中でGoogleのWebPフォーマットにも触れていますけど、WebPはもうだいぶ普及しているんでしょうか?」「直接使うことについてはわからないけど、アセットのコンパイルなどではサポートされていますね」

参考: WebP - Wikipedia

「ここでサンプル画像を見られる↓」

参考: WebP DEMO | labs.jxck.io

「AVIFだと元画像よりサイズが小さくなってますね」「お〜AVIFのlossyなサンプルではWebPとAVIFで画像に違いがあるし、しかもAVIFはアニメーションもできるのか」「アニメーションの圧縮率も高い!」

「従来のGIFアニメーションは効率もよくないし色数も制約されるし、今となってはいにしえの規格でしょうね」「たしかに」

参考: GIFアニメーション - Wikipedia

🔗言語/ツール/OS/CPU

🔗 Intel CPUとAMD CPU


つっつきボイス:「そうそう、この記事見た: libffiがマップされているはずが、AMDでRubyを動かすとsasscがマップされていたという」「IntelのAVX-512の命令が、そのとき使っていたAMD64に入っていなかったのか...」「はてブでもこんなコメントが付いていた↓: CPUアーキテクチャをまたがるとたまにこういうことが起きますね」

Intel CPUとAMD CPUの混在による問題に直面した話 | 開発ブログ | Elastic Infra

sasscはなぜかビルドオプションにデフォルトで -mtune=native つけてて狂ってるんだよな〜。まだそうだったのか

2022/01/16 07:57

sass/sassc - GitHub

「sassのissuesには上がってないみたい」「sasscのREADMEを見たら、sasscは非推奨になったのでDart Sassを使うようにと書かれていますね」

参考: Sass: Dart Sass

🔗 Vim作者のインタビュー


つっつきボイス:「Vimの作者ってこういう方なんですね」「意外に技術的な話は少なくて、最後に『夜ふかしすると生産性が落ちるよ』と書かれていました」「まあそうですけど😆」「Vimの強さについて語りたおすとかではなく?」「もともとお金にするつもりもなかったようで、意外に淡々とした調子でした」


後編は以上です。

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

週刊Railsウォッチ: Webpackerが公式に引退宣言、『Everyday Rails』日本語版がRails 7に対応ほか(20220124前編)

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

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

Ruby Weekly

RubyFlow

160928_1638_XvIP4h

Publickey

publickey_banner_captured


CONTACT

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