- Ruby / Rails関連
週刊Railsウォッチ: CRuby 3.2にオブジェクトシェイプがマージ、Cloudflare R2ほか(20220927後編)
こんにちは、hachi8833です。
🔗Ruby
🔗 オブジェクトシェイプがCRuby 3.2にマージ
Jesus @JemmaIssroff, I paired w/you on your 2nd-ever Ruby commit and a year later you're committing stuff like this!?! https://t.co/ocrN4dKEut Outstanding.
— Nate Berkopec (@nateberkopec) September 17, 2022
つっつきボイス:「RubyKaigi 2022でも発表されましたが↓、Ruby 3.2のCRubyにオブジェクトシェイプがついにマージされました🎉」「TruffleRubyで実装されていた最適化機能がCRubyに入るのはいいですね👍」
参考: Implementing Object Shapes in CRuby - RubyKaigi 2022
🔗 curlメンテナーが出題した難解URL(Ruby Weeklyより)
"http://http://http://@http://http://?http://#http://"
is a legitimate URL
— daniel:// stenberg:// (@bagder) September 6, 2022
参考: 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より)
- サイト: Welcome to Bashly | Bashly - Bash CLI Framework
- サンプル: bashly/examples at master · DannyBen/bashly
つっつきボイス:「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より)
Cloud providers taught us to expect a data transfer tax every time we actually used the data we stored with them. Introducing R2, now Generally Available. R2 gives developers object storage minus the egress fees. https://t.co/SupFs8SRUg
— Cloudflare (@Cloudflare) September 21, 2022
つっつきボイス:「そうそう、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の互換機争いを思い出しちゃいました」「そんなこともありましたね」(しばらく互換機談義)
参考: ここから始まる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が今ひとつ流行っていないんですよ」
「NGINX Unitは使いやすいし軽いし問題が起きたこともないんですけど、情報が少なくていろいろ試行錯誤しました」「CloudflareがNGINX Unitを使わずにHTTPプロキシを自社開発した理由はわからないけど、そういう点も考慮したかもしれませんね」「特にHTTPプロキシは軽くて高速なことがとても大事なので、それに特化することを重要視してPingoraを開発したのかも」「Pingoraがそのうち公開されたら嬉しいですね」「それにしてもApacheが主流でなくなる時代が来るとは夢にも思わなかった」
参考: Apache HTTP Server - Wikipedia
🔗DB
🔗 Datastream for BigQuery(Publickeyより)
つっつきボイス:「MySQLやPostgreSQL側ではなくBigQuery側にレプリケーション機能が入ったんですね」「まだプレビューリリースだそうです」「スキーマ変更も反映されるのはよさそう👍」
「データ集計をメインでやる人にとって嬉しい感じですね」「記事からはわからないけど、コピーしないカラムを指定する機能とかもあるはず: そうでないと特にエンタープライズ用途で困るので」「たしかに」
BigQueryに対してMySQLやPostgreSQL、Oracle Databaseからニアリアルタイムで直接データのレプリケーションを可能になるらしい。
スキーマ変更も勝手に反映されるとの事。
Dataflowと無駄なGCS要らなくなる!https://t.co/FxZs2JFRfz— 宮田 航志 miyata koji @DMM.Web3 (@miyata_17_) September 19, 2022
🔗言語/ツール/OS/CPU
🔗 sudoとsetpriv
つっつきボイス:「これと似たような記事を昔書いた覚えがあります↓: このときはCentOS/Red Hat Enterprise Linuxだったのでsetpriv
ではなくrunuser
でしたが」
「ここを見ると、setpriv
はPAMを使わずに迂回するんですね↓」
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の世界は技術・ビジネスのスピードが早すぎて、ついていくのに大変ですが、第2弾の記事を書きました!
ご参考になれば。https://t.co/BqTaiaRbKp
— 柿沼 太一 (@tka0120) September 21, 2022
つっつきボイス:「この間の画像自動生成AIと著作権記事(ウォッチ20220906)の第2弾が出ました」「お〜、後で読まなきゃ」
後編は以上です。
バックナンバー(2022年度第3四半期)
- 20220920 Ruby 3.2.0 Preview 2とRack 3.0リリース、packwerkでアプリコードの境界を強制ほか
- 20220906後編 syntax_suggestがRuby標準ライブラリに追加、RubyのVisitorパターンほか
- 20220905前編 Herokuが無料プラン廃止を発表、Hotwire日本語コミュニティほか
- 20220830後編 RubyKaigi 2022タイムテーブル公開、viewport-extraほか
- 20220829前編 MinitestとRSpecの比較、商用版NGINXの重要機能がオープンソース化ほか
- 20220823後編 byebugからruby/debugへの移行ガイド、YJIT解説記事ほ
- 20220822前編 ビューテンプレートに渡せるローカル変数をマジックコメントでチェック可能にほか
- 20220802後編 RubyのGVLトレーサーgvl-tracing、casting gemでオブジェクトに振る舞いを追加ほか
- 20220801前編 “リーダブルテストコードについて考えよう”スライド公開、Evil Martiansが日本上陸ほか
- 20220726後編 中高生国際Rubyプログラミングコンテスト2022、W3Cの分散型識別子仕様が勧告にほか
- 20220725前編 RailsConf 2022の動画が公開、マイクロサービスのテスト戦略ほか(
- 20220719 RubyのGCが高速化、RuboCopのストレスを減らす4つの方法、Defensive CSSほか
- 20220711前編 AR::RelationにCTEを利用できるwithメソッドが追加、Propshaftアップグレードガイドほか
- 20220705後編 6月のRubyコア動向、Stack Overflowアンケート結果ほか
- 20220704前編 マイグレーションをStrategyパターンで拡張可能にほか
ソースの表記されていない項目は独自ルート(TwitterやはてブやRSSやruby-jp SlackやRedditなど)です。
週刊Railsウォッチについて
TechRachoではRubyやRailsなどの最新情報記事を平日に公開しています。TechRacho記事をいち早くお読みになりたい方はTwitterにて@techrachoのフォローをお願いします。また、タグやカテゴリごとにRSSフィードを購読することもできます(例:週刊Railsウォッチタグ)