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

週刊Railsウォッチ(20210608後編)RubyでAppleのLZFSE圧縮データ解凍、AWS Lambda Extensionsが正式リリース、unixgame.ioほか

こんにちは、hachi8833です。

週刊Railsウォッチについて

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

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

🔗Ruby

🔗 object_tracer: 旧TappingDeviceがリネーム(Ruby Weeklyより)

st0012/object_tracer - GitHub


つっつきボイス:「以前@st0012さんが作ったTappingDevice gemがリネームされていたのをRuby Weeklyの記事で知りました」「TappingDeviceという名前でだいぶ違うものを想像していましたけどデバッガーなんですね」「オブジェクトにアタッチして動きをtappingするイメージだからそこから命名していたのかも」

tapping(名詞)傍受、盗聴

「考えてみればこのgemの機能はトレーサーなので、新しい名前の方がいいですね👍」「そうですね」「前の名前はアタッチするための手段が使われていましたけど、新しい名前はgemのユースケースや振る舞いを表していて的確」「なるほど、何をするためなのかという目的がわかる名前ですね」「tappingはあくまで手段のはず」

「ちなみに以下は最近のruby/debugへのマージ回数で、st0012さんが今のところトップです」「この調子でruby/debugに参加する人が増えてさらに使いやすくなるといいですね」

ruby/debug - GitHub

🔗 提案: Rubyのバックトレースに位置情報を含める


つっつきボイス:「@mameさんからの提案は、1行内でHashの添え字アクセスがメソッドチェインで複数回発生するとき、どのオブジェクトへのメソッド呼び出しの時点でエラーが出たのかを特定できるようにThread::BacktraceLocationを拡張するというもの: どこで発生したかがわかりにくいundefined methodメッセージってすごくありがちなので、これが欲しい気持ちわかる」「発生場所がわかるなら教えて欲しいヤツ」「ここだよ、ここですね(古)」

# 同issueより
# どこがundefinedかわかりにくい
data["data"].first["field"] #=> undefined method `[]` for nil:NilClass

# こうやって発生位置を知らせる
$ ruby -r ./sample/no_method_error_ext.rb err1.rb
err1.rb:2:in `<main>': undefined method `[]' for nil:NilClass (NoMethodError)

data["data"].first["field"]
                  ^^^^^^^^^

「Rust言語のエラーメッセージがこういう位置情報を丁寧に出してたのを思い出しました↓」「もしかするとそういうのを意識したのかもしれませんね」

参考: Improved error messages - The Edition Guide

// doc.rust-lang.orgより
error[E0506]: cannot assign to `x` because it is borrowed
 --> foo.rs:4:5
  |
3 |     let y = &x;
  |              - borrow of `x` occurs here
4 |     x += 1;
  |     ^^^^^^ assignment to borrowed `x` occurs here

error: aborting due to previous error

For more information about this error, try `rustc --explain E0506`.

🔗 Arbre: RubyコードでHTML生成(Awesome Rubyより)

activeadmin/arbre - GitHub

# https://activeadmin.github.io/arbre/ より
html {
  head {
    title "Welcome page"
  }
  body {
    para "Hello, world"
  }
}

つっつきボイス:「アーブレ?」「HTML on Rubyとあるので、上のようなDSLからHTMLを生成できるということですね」「一度は作ってみたくなるヤツかも」「ArbreはActive Admin gem↓から切り出されたそうです」

activeadmin/activeadmin - GitHub

🔗 Appleの圧縮フォーマットで遊んでみた(Hacklinesより)

woodruffw/lzfse.rb - GitHub


つっつきボイス:「マニアックそうな記事です」「なるほど、LZFSE圧縮されているシステムファイルをRubyで解凍したりしてる」「著者が作ったruby-machoというgemもありますけど、マッチョかと思ったらマークオーでした」「Mach-Oバイナリを追いかけるとは強い」「使い慣れたRubyでやってみたということでしょうね」

# 同記事より
require "lzfse"

# LZFSE (de)compression
LZFSE.lzfse_compress
LZFSE.lzfse_decompress

# LZNV (de)compression
LZFSE.lznv_compress
LZFSE.lznv_decompress

参考: Mach-O - Wikipedia
参考: LZFSE - Wikipedia

Homebrew/ruby-macho - GitHub

🔗 Rubyの文字列削除メソッドの速度比較


つっつきボイス:「Railsのパフォーマンス最適化でもこの種の情報を見かけますね」「同記事では文字列のサイズも変えて試してるようです」「実装にも影響されるでしょうね」

「用途が限定的なほど速く汎用的なほど遅い、そうそう↓」「特定の用途に特化したメソッドほど速くなる傾向はありますね」

測定その 1 の考察
メソッドを速い順に並べると String#delete, String#tr, String#sub, String#gsub, String#remove の順番でした。用途がより限定的なメソッドは速く、より汎用的なメソッドは遅いという結果となりました。便利な String#gsub をいつも使うのではなく、用途に合わせて適切なメソッドを使うことが良いということですね。
同記事より

「測定その2では、文字列が長くなると結果が変わるのね」「正規表現を使うと遅くなる、ごもっとも」「正規表現好きですけどホントそのとおりです」

🔗DB

🔗 書籍『Production Ready GraphQL』


つっつきボイス:「GraphQLの本!」「GraphQL API側の設計に関する書籍みたい: GraphQLが登場してからだいぶ経ってきたこともあってベストプラクティスがだいたい固まってきた感じはありますね」

目次を見た感じではGraphQLの一般的なスキーマ設計を扱っていて、graphql-rubyとかには言及してなさそうかな」

rmosolgo/graphql-ruby - GitHub

「graphql-rubyを詳しいノウハウを解説している本があったら欲しいと思っているんですよ: GraphQL Rubyの公式サイト↓にリファレンスも一応あるんですけど、現場で使おうとするとまだまだ大変」

「どの辺がつらいんでしょうか?」「テストの書き方などはGraphQL Rubyサイトにひととおり載っていますけど、作り始めてみると、自分が欲しいスキーマを得るにはRuby側でどのように書けばいいのかという部分が意外に難しい」「あ〜」「GraphQL単体の情報はApollo↓とかに割とあるんですけどね」

「サーバー側の実装言語に依存せずにGraphQLスキーマを設計するという視点であれば良さそうな本だと思います👍」


「探しているうちにGraphQL::Proというのを見つけた↓」「上のGraphQL Rubyの関連サイトみたいですね」「CanCanCanやPunditとのインテグレーションもできるらしい」「年900ドルか」

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

🔗 AWS Lambda Extensions(Publickeyより)


つっつきボイス:「お、Lambda Extensionsが正式リリースされた」「前からあったかと思ったら去年からなんですね」「以前ウォッチで扱ったのをこの図↓で思い出しました(ウォッチ20201021)」


同記事より

「Lambda Extensionsは、コンテナのライフタイムに合わせたAPIを持っていて、Lambdaと違うのはLambdaの関数が起動する前や終了後などにもアタッチして監視などを行える点ですね」「そういえばそうだったかも」「記事にDatadogやNew Relicといった監視サービスが名を連ねているのも、これができるから: 先週話したようなOpenTelemetry(20210601)のような監視を行うと、コンテナのライフサイクルも含めて監視したくなるものなんですよ」「なるほど」

「Lambda Extensionsがないとできないこともあるので、正式版になったことで安心して使えるようになったのはいいですね👍」

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

🔗 QUICがRFC 9000に


つっつきボイス:「ついにQUICにRFC番号が付与された🎉」

参考: HTTP/3の基盤となる「QUICプロトコル」の標準化プロセスが完了、IETFの「RFC 9000」として - Publickey

「ところで以下の図↓を見ていて、前方互換性さえ保てれば本当はUDPもQUICで上書きしたかったんじゃないかなと想像しました」「😆」「さすがにそれをやると、IP層より上のプロトコル番号をチェックするファイアウォールのようなL4機器を通れなくなってしまいますけどね」


www.publickey1.jpより

「SCTPが流行らなかったのもそれと同じ理由じゃないかな〜」「SはセキュアのSでしょうか?」「ストリームのSですね: SCTPは、HTTP/2のようなマルチストリーム、つまり1個のSCTP接続の中に複数のストリームを同時に流せるプロトコルで、しかもネットワーク経路の異なる複数の接続を一つのSCTPストリームとして扱えます(いわゆるマルチホーム)」「へ〜」

参考: Stream Control Transmission Protocol - Wikipedia
参考: HTTP/2 - Wikipedia

「HTTP/3はまだ詳しく追っていませんが、QUICを取り込みつつ他にも機能があるようですね」「HTTP/3勉強しないといかんな〜」「よほどエッジなWebサービスとかでないとHTTP/3になったときの影響はすぐには見えてこないかもしれませんね」

参考: HTTP/3はどうやってWebを加速するか? TCP、TLS、HTTP/2の問題とHTTP/3での解決策~Fastly奥氏が解説(前編) - Publickey
参考: HTTP/3はどうやってWebを加速するか? TCP、TLS、HTTP/2の問題とHTTP/3での解決策~Fastly奥氏が解説(後編) - Publickey

🔗 Chromeの10080番ポートが使えなくなっていた


つっつきボイス:「これびっくりしましたね」「10080番、普通に使ってるのに😢」

「どうして使えなくしたんでしょうか?」「記事によればNAT Slipstreaming v2という攻撃手法で10080番ポートがよく使われるかららしいですね(1191)」

参考: NAT Slipstreaming v2 攻撃とブラウザ側の対策 - ASnoKaze blog

「こんな理由でブラウザのポートが塞がれるのはちょっと不本意」「この調子で8080番や3000番もダメということになったらたまりませんよね」「気軽にfetch APIにアクセスできなくなる」「ポートを変えればいいのはわかっているんですけど」

「443->10443みたいに本来のwell-knownポートの番号を10000台に変えて使うことはよくありますよね」「私も使ってます」「この問題を踏んだときにブラウザに表示してくれるならいいけど、そうでなかったら知らない人が踏んだときになかなか原因がわからないでしょうね」「こういうことが起きる可能性もあるんだなと改めて感じました」

「このissueが掲載されているfetchって、WHATWGのリポジトリのようですけど、fetchって何でしょうか?」「fetchはWeb API標準のひとつですね: MDNのドキュメントを見れば↓、Web APIの中にFetch APIも含まれています」「なるほど」

参考: Fetch API - Web API | MDN

whatwg/fetch - GitHub

参考: Fetch Standard
参考: Web Hypertext Application Technology Working Group - Wikipedia — WHATWG

🔗言語/ツール/OS/CPU

🔗 Mouse without Borders


つっつきボイス:「Windowsで複数PCの間でマウスが共有できるんですね」「Mouse without Borders、私は割と前から使ってますよ」「サードパーティ製品ではすごく昔からありますけど、標準で入ってるんですか?」「自分でダウンロードして追加インストールする必要がありますけど、ちゃんとしたマイクロソフトのソフトウェアですね」「複数のブラウザにまたがってチェックしたいときとかに便利そう」


その後、ちょうど本日macOS Montereyが発表されましたが、それに入っている「Universal Control」がちょっとMouse without Bordersを思わせますね。

参考: Mac向けの最新OS「macOS Monterey」が発表、Macの隣にiPadを置くだけで1つのマウスですべてを操作可能に - GIGAZINE

🔗 組版処理システムTwight


つっつきボイス:「リポジトリは公開されてないようですが、TeXのようなテキストベースの組版処理システムというのが目を惹きました」「印刷業界の中の人ではなく筑波大に在籍してるんですね」「よく作ったな〜」「以下と同じ人だそうです↓」

参考: 筑波大の授業DB代替ツールを作った学生、「未踏」のスーパークリエータに認定 オープンソースの組版処理システム開発で(ITmedia NEWS) - Yahoo!ニュース

「Twightは弊社の超シリーズと方向性近いのかな?Slackで聞いてみよう」「(Slackで返信)見た感じTwightは”制作ツール”のようです: 弊社の超シリーズで作っているのはビューアが中心なのでターゲット層は違うでしょうね」「なるほど、ありがとうございます!」

参考: EPUBで縦書きや組版を綺麗に表示する電子書籍ソリューション | BPS株式会社

業界随一の仕様準拠性:EPUB3 ビューア「超縦書」Windows版 無料公開のお知らせ

🔗 unixgame.io


つっつきボイス:「BPS社内Slackにも貼りましたけど、Nokiaのベル研が出しているunixgame.ioはなかなか楽しめました」「お〜、ScratchみたいなGUIでUnixシェルワンライナーを解くんですね」「やってみるとわかりますけど、GUIなので使えるコマンドが限定されているので、普段使い慣れたコマンドを使わずに解くしかないところがパズルとして面白い」「なるほど、シェルの縛りプレイ」「おかげで普段使わないコマンドを知ることができました: 正規表現を使わずにtrコマンドで大文字小文字変換するとか」「そうそう」「シェルを普通に使いこなしている人でも楽しめるのがいいですね👍」

「このGUIはどんなライブラリを使っているのかな?」「ソースを見てみるとBlockly↓というのを使ってる」「Googleのライブラリなんですね」「Blockly昔使ったことあります!」

参考: Blockly  |  Google Developers


後編は以上です。

バックナンバー(2021年度第2四半期)

週刊Railsウォッチ(20210607前編)ActiveRecord::Relationのone?とmany?が高速化、RubyKaigi Takeout 2021登壇者募集開始ほか

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

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

Ruby Weekly

Awesome Ruby

Hacklines

Hacklines

StatusCode Weekly

statuscode_weekly_banner

Publickey

publickey_banner_captured


CONTACT

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