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

週刊Railsウォッチ: CRuby 3.2にオブジェクトシェイプがマージ、Cloudflare R2ほか(20220927後編)

こんにちは、hachi8833です。

週刊Railsウォッチについて

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

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

🔗Ruby

🔗 オブジェクトシェイプがCRuby 3.2にマージ


つっつきボイス:「RubyKaigi 2022でも発表されましたが↓、Ruby 3.2のCRubyにオブジェクトシェイプがついにマージされました🎉」「TruffleRubyで実装されていた最適化機能がCRubyに入るのはいいですね👍」

参考: Implementing Object Shapes in CRuby - RubyKaigi 2022

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

🔗 curlメンテナーが出題した難解URL(Ruby Weeklyより)

参考: cURL - Wikipedia


つっつきボイス:「curlのメンテナーであるDaniel Steinbergさんの記事です」「な、何だこれは?」「このhttp://http://http://@http://http://?http://#http://が合法なURL?」(答えを見る前にしばらく議論)

「たぶんこういう感じなのかな?」「記事でもそうなってますね」

  • http://: プロトコル(スキーム)
  • http://http://@: BASIC認証のユーザー名とパスワード
  • http:: ホスト名とポート
  • //http://: パス
  • ?http://: クエリ
  • #http://: フラグメント(アンカー)

参考: URLとプロトコル

「ホスト名http:にコロンだけ含めるってありなの?」「ポート番号みたいだけど」「どうやらポート番号に:だけ書くとデフォルトの80番になるみたいですね」「へ〜!」

「記事ではcurl以外のURLパーサーやブラウザがcurlと同じようにこのURLを解析できるかどうかも調べていますね」「試しにこのURLをSlackに貼り付けてみたら予想通りパースに失敗した」「こういうのは楽しいですね☺️」

RubyWeeklyの紹介文ではRubyと直接関係ないせいか載せるかどうか迷ったようです。なお、コメント欄でRubyのURI.parseにも言及されていました↓。

# 同コメントをRuby 3.1.2p20で再現
>> require 'uri'
#=> true
>> uri = URI.parse("http://http://http://@http://http://?http://#http://")
#=> #<URI::HTTP http://http//http://@http://http://?http://#http://>
>> uri.path
#=> "//http://@http://http://"

参考: URI.parse (Ruby 3.1 リファレンスマニュアル)

🔗 bashly: シェルスクリプト生成フレームワーク(Ruby Weeklyより)

DannyBen/bashly - GitHub


つっつきボイス:「Rubyで書かれたシェルスクリプト生成・実行フレームワークだそうです」「デモ動画にGitHub Actionsっぽい書式のYAMLファイルが見えたので、GitHub Actionsの定義ファイルと同じようにスクリプトYAMLをリポジトリで管理できそう」

# 同ドキュメントより
# Generate a minimal configuration:
$ bashly init --minimal

# Generate the bash script:
$ bashly generate

# Run the script:
$ ./download hello --force

「サンプルYAMLを見るとやっぱりGitHub Actionsっぽいですね↓: 使ってみたい人はどうぞ」

# 同ドキュメントより: bashly.yml
name: download
help: Sample minimal application without commands
version: 0.1.0

args:
- name: source
  required: true
  help: URL to download from
- name: target
  help: "Target filename (default: same as source)"

flags:
- long: --force
  short: -f
  help: Overwrite existing files

examples:
- download example.com
- download example.com ./output -f

🔗 設計・セキュリティ

🔗 スライド『ユーザーの「欲しい」に惑わされない本当のインサイトを見つけるUXデザイン・UXリサーチ』


つっつきボイス:「これはいいスライド👍: よいUXデザインを行うための"こうしておきさえすればいい"という手法はないということがとてもよくわかる」

「こういう質問↓作りでも、yes/noで答える質問にすると会話が深まらないので避けるといった工夫は採用面接のような場面でも有効ですね: UXに限らず人間を相手にする仕事でいろいろ役に立つので、学ぶきっかけによいと思います」

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

🔗 Cloudflare R2が正式サービスに(Publickeyより)


つっつきボイス:「そうそう、Cloudflare R2が正式になりましたね」

参考: Cloudflare R2 | エグレス料金ゼロの分散型オブジェクトストレージ | Cloudflare | Cloudflare

「記事にもありますけど、Cloudflare R2はAWS S3と完全互換で、サンプルコードでもS3クライアント(client-s3)をそのまま使っているほど↓」「endpointがCloudflareという以外は同じコードで、転送無料かつ10GBまで無料ですか、強い」

// https://blog.cloudflare.com/r2-ga/より
import {
  S3Client,
  PutObjectCommand
} from "@aws-sdk/client-s3";

import { getSignedUrl } from "@aws-sdk/s3-request-presigner";

const S3 = new S3Client({
  region: "auto",
  endpoint: `https://${ACCOUNT_ID}.r2.cloudflarestorage.com`,
  credentials: {
    accessKeyId: ACCESS_KEY_ID,
    secretAccessKey: SECRET_ACCESS_KEY,
  },
});

// With getSignedUrl we can produce a custom url with a one hour expiration which will allow our end user to upload their dog pic
console.log(
  await getSignedUrl(S3, new PutObjectCommand({Bucket: 'my-bucket-name', Key: 'dog.png'}), { expiresIn: 3600 })
)

参考: S3 Client - AWS SDK for JavaScript v3


「ところでAWSのエンドポイントでないと使えないようにAWSがクライアントを変えたりしませんかね?」「それをやったらlocalstack↓のようなS3クライアント互換のサードパーティにまで影響してしまうので、少なくとも競合のクラウドがあるうちは技術的には可能でもやらないと思いますけどね」「何だか大昔のNECとEPSONの互換機争いを思い出しちゃいました」「そんなこともありましたね」(しばらく互換機談義)

localstack/localstack - GitHub

参考: ここから始まるNECとEPSONとの新たなる戦い「EPSON PC-286MODEL 0」 - AKIBA PC Hotline!

🔗 CloudflareのRust製のHTTPプロキシ「Pingora」(Publickeyより)


つっつきボイス:「CloudflareがRust製のHTTPプロキシも開発したとは」「いろいろ頑張ってますね」

「考えてみれば、HTTPプロキシが欲しいだけの場合だと、NGINXは機能が多すぎてコンフィグを書くのも大変なんですよ」「そうそう」「数年前に大々的にリリースされたNGINX Unit↓は大きく改良されたので、当時EnvoyとNGINX Unitのどちらを使うかを考えた末にNGINX Unitを使ったことがあります(ウォッチ20220201)」「EnvoyもHTTPプロキシ的に使えるんですね」「ただその後、NGINX Unitが今ひとつ流行っていないんですよ」

新しいRubyアプリサーバー「NGINX Unit」を調べてみた(翻訳)

参考: Envoy Proxy - Home

「NGINX Unitは使いやすいし軽いし問題が起きたこともないんですけど、情報が少なくていろいろ試行錯誤しました」「CloudflareがNGINX Unitを使わずにHTTPプロキシを自社開発した理由はわからないけど、そういう点も考慮したかもしれませんね」「特にHTTPプロキシは軽くて高速なことがとても大事なので、それに特化することを重要視してPingoraを開発したのかも」「Pingoraがそのうち公開されたら嬉しいですね」「それにしてもApacheが主流でなくなる時代が来るとは夢にも思わなかった」

参考: Apache HTTP Server - Wikipedia

🔗DB

🔗 Datastream for BigQuery(Publickeyより)


つっつきボイス:「MySQLやPostgreSQL側ではなくBigQuery側にレプリケーション機能が入ったんですね」「まだプレビューリリースだそうです」「スキーマ変更も反映されるのはよさそう👍」

「データ集計をメインでやる人にとって嬉しい感じですね」「記事からはわからないけど、コピーしないカラムを指定する機能とかもあるはず: そうでないと特にエンタープライズ用途で困るので」「たしかに」

🔗言語/ツール/OS/CPU

🔗 sudoとsetpriv


つっつきボイス:「これと似たような記事を昔書いた覚えがあります↓: このときはCentOS/Red Hat Enterprise Linuxだったのでsetprivではなくrunuserでしたが」

CentOS/RHELの起動スクリプト内ではsudoではなくrunuserを使う

「ここを見ると、setprivはPAMを使わずに迂回するんですね↓」

参考: Manpage of SETPRIV

su(1) と runuser(1), と比較して、 setpriv(1) は PAM を使わず、パスワードのプロンプトも出さない。 これは単純なプログラムで、 execve(2) の set-user-ID をしないラッパーであり、特権を削除するために使われる。 これは daemontools の setuidgid(8)、 runit の chpst(8) など、他のサービスマネージャーと一緒に提供される同様のツールと同じように 行われる。
ysatoautonomous.github.ioより

「PAMって何でしたっけ?」「Linuxに大昔からある認証システムです(Pluggable Authenticaton Modules)↓」

参考: PAM - Linux技術者認定 LinuC | LPI-Japan

「昔頑張って学んでみたSELinuxのenforcingモードはこういうrootでの作業が一切できなくなるわけですけど、結局流行りませんでしたね」「窮屈だし使いにくかったですよね」「コンテナが主流になったのはいい進化だと思います」

参考: Security-Enhanced Linux - Wikipedia

🔗 WSLがsystemdに対応


つっつきボイス:「Windowsユーザーとしては嬉しいニュース」「これで無茶なハックをしなくて済みますね😂」

systemd を利用するには、pMicrosoft Store 版の Windows Subsystem for Linux Preview](https://www.microsoft.com/store/productId/9P9TQF7MRM4R) バージョン 0.67.6 以降が必要だ。そのため、OS は Windows 11 が必要であり、 このバージョンを Microsoft Store からインストールするには Windows Insider Program を有効にする必要がある。ただし、バージョン 0.67.6 をGitHub でダウンロードしてインストールすれば非 Insider の Windows 11 環境での利用も可能だ。
WSL で systemd が利用可能に | スラド Linuxより

🔗 その他ツール


つっつきボイス:「この間の画像自動生成AIと著作権記事(ウォッチ20220906)の第2弾が出ました」「お〜、後で読まなきゃ」


後編は以上です。

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

週刊Railsウォッチ: Rack 3アップグレードガイド、Stimpack gemほか(20220926前編)

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

Ruby Weekly

Publickey

publickey_banner_captured


CONTACT

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