- Ruby / Rails関連
週刊Railsウォッチ(20210608後編)RubyでAppleのLZFSE圧縮データ解凍、AWS Lambda Extensionsが正式リリース、unixgame.ioほか
こんにちは、hachi8833です。
🔗Ruby
🔗 object_tracer: 旧TappingDeviceがリネーム(Ruby Weeklyより)
つっつきボイス:「以前@st0012さんが作ったTappingDevice gemがリネームされていたのをRuby Weeklyの記事で知りました」「TappingDeviceという名前でだいぶ違うものを想像していましたけどデバッガーなんですね」「オブジェクトにアタッチして動きをtappingするイメージだからそこから命名していたのかも」
tapping(名詞)傍受、盗聴
「考えてみればこのgemの機能はトレーサーなので、新しい名前の方がいいですね👍」「そうですね」「前の名前はアタッチするための手段が使われていましたけど、新しい名前はgemのユースケースや振る舞いを表していて的確」「なるほど、何をするためなのかという目的がわかる名前ですね」「tappingはあくまで手段のはず」
「ちなみに以下は最近のruby/debugへのマージ回数で、st0012さんが今のところトップです」「この調子でruby/debugに参加する人が増えてさらに使いやすくなるといいですね」
🔗 提案: 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より)
# https://activeadmin.github.io/arbre/ より
html {
head {
title "Welcome page"
}
body {
para "Hello, world"
}
}
つっつきボイス:「アーブレ?」「HTML on Rubyとあるので、上のようなDSLからHTMLを生成できるということですね」「一度は作ってみたくなるヤツかも」「ArbreはActive Admin gem↓から切り出されたそうです」
🔗 Appleの圧縮フォーマットで遊んでみた(Hacklinesより)
つっつきボイス:「マニアックそうな記事です」「なるほど、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
🔗 Rubyの文字列削除メソッドの速度比較
つっつきボイス:「Railsのパフォーマンス最適化でもこの種の情報を見かけますね」「同記事では文字列のサイズも変えて試してるようです」「実装にも影響されるでしょうね」
「用途が限定的なほど速く汎用的なほど遅い、そうそう↓」「特定の用途に特化したメソッドほど速くなる傾向はありますね」
測定その 1 の考察
メソッドを速い順に並べるとString#delete
,String#tr
,String#sub
,String#gsub
,String#remove
の順番でした。用途がより限定的なメソッドは速く、より汎用的なメソッドは遅いという結果となりました。便利なString#gsub
をいつも使うのではなく、用途に合わせて適切なメソッドを使うことが良いということですね。
同記事より
「測定その2では、文字列が長くなると結果が変わるのね」「正規表現を使うと遅くなる、ごもっとも」「正規表現好きですけどホントそのとおりです」
🔗DB
🔗 書籍『Production Ready GraphQL』
読んだ。GraphQLのこうあるべき To-Be が詳細にかかれててとてもよかった。ただGitHub, Shopifyのような超大規模でのベストプラクティスと我々の現実のAs-Isとは落とし所が異なるのでそれは各自が探っていかないと行けないなぁと感じた / Production Ready GraphQL https://t.co/kjoBqabmHW
— さぼ@EBILAB (@saboyutaka) June 1, 2021
つっつきボイス:「GraphQLの本!」「GraphQL API側の設計に関する書籍みたい: GraphQLが登場してからだいぶ経ってきたこともあってベストプラクティスがだいたい固まってきた感じはありますね」
「目次を見た感じではGraphQLの一般的なスキーマ設計を扱っていて、graphql-rubyとかには言及してなさそうかな」
「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機器を通れなくなってしまいますけどね」
「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 Standard
参考: Web Hypertext Application Technology Working Group - Wikipedia -- WHATWG
🔗言語/ツール/OS/CPU
🔗 Mouse without Borders
複数のPCを同時に使っているのですが、MS社員が開発したMouse without Borders、初めて使ってみたけど滅茶苦茶良いです。Win同士ならこれだけでマウスとキーボードを共有できます。キーボードはUS/JP混在にすると混乱してしまいますが。https://t.co/IAZbDUOvJr
— 高梨陣平 (@jingbay) May 31, 2021
つっつきボイス:「Windowsで複数PCの間でマウスが共有できるんですね」「Mouse without Borders、私は割と前から使ってますよ」「サードパーティ製品ではすごく昔からありますけど、標準で入ってるんですか?」「自分でダウンロードして追加インストールする必要がありますけど、ちゃんとしたマイクロソフトのソフトウェアですね」「複数のブラウザにまたがってチェックしたいときとかに便利そう」
その後、ちょうど本日macOS Montereyが発表されましたが、それに入っている「Universal Control」がちょっとMouse without Bordersを思わせますね。
参考: Mac向けの最新OS「macOS Monterey」が発表、Macの隣にiPadを置くだけで1つのマウスですべてを操作可能に - GIGAZINE
🔗 組版処理システムTwight
2020年度 IPA未踏事業「強力なグラフィック機能を備えた日本語組版処理システムの開発」にて開発しましたTwightの成果報告会での動画が掲載されています。
ぜひご視聴いただけますと幸いです!https://t.co/SUnDLwzN39 pic.twitter.com/oDjIjQhQnq— Yuto Wada (@kyoto_ysfh) May 1, 2021
- 元記事: 未踏IT人材発掘・育成事業:2020年度採択プロジェクト概要(和田PJ):IPA 独立行政法人 情報処理推進機構
- 元記事: CSS 組版 Vivliostyle ユーザーと開発者の集い 2021 春 - アカベコマイリ
つっつきボイス:「リポジトリは公開されてないようですが、TeXのようなテキストベースの組版処理システムというのが目を惹きました」「印刷業界の中の人ではなく筑波大に在籍してるんですね」「よく作ったな〜」「以下と同じ人だそうです↓」
参考: 筑波大の授業DB代替ツールを作った学生、「未踏」のスーパークリエータに認定 オープンソースの組版処理システム開発で(ITmedia NEWS) - Yahoo!ニュース
「Twightは弊社の超シリーズと方向性近いのかな?Slackで聞いてみよう」「(Slackで返信)見た感じTwightは"制作ツール"のようです: 弊社の超シリーズで作っているのはビューアが中心なのでターゲット層は違うでしょうね」「なるほど、ありがとうございます!」
参考: EPUBで縦書きや組版を綺麗に表示する電子書籍ソリューション | BPS株式会社
🔗 unixgame.io
Nokiaの研究所製のUNIXシェルワンライナー学習?ゲーム。フリー入力なら答えがすぐに出るのに部品が限定されることで経験者にもちゃんと考えさせられるものになってるのが面白い https://t.co/qutICNAtzF
— Masato Mori (@morimorihoge) May 30, 2021
つっつきボイス:「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登壇者募集開始ほか
- 20210601後編 Python使いから見たRuby、MySQLのインデックス解説、GitHubが採用したOpenTelemetryほか
- 20210531前編 RailsConf 2021の動画が公開、GraphQLのN+1を自動回避、Ruby 3のJITとRailsほか
- 20210525後編 Rubyのオブジェクトアロケーション改善、RubyKaigi Takeout 2021開催日発表、AWS App Runnerほか
- 20210524前編 Active Supportの知られてなさそうな機能5つ、RSpecの歴史、書籍『Practicing Rails』ほか
- 20210518後編 RubyのGCを深掘りする、Psych gemのbreaking change、11月のRubyConf 2021ほか
- 20210517前編 Bootstrap 5リリース、productionでSQLiteがwarning表示、rails-ujsの舞台裏ほか
- 20210511後編 AWS Lambda関数ハンドラをDSLで書けるyake gem、VPC Peeringが同一AZ転送量無料化ほか
- 20210511後編 AWS Lambda関数ハンドラをDSLで書けるyake gem、VPC Peeringが同一AZ転送量無料化ほか
- 20210510前編 属性メソッドをキャッシュして最適化、Railsのガバナンスに関する声明、bundle install高速化ほか
- 20210427後編 RactorでUDPサーバーを作る、JSONシリアライザalba gem、AppleのAirTagほか
- 20210420後編 ShopifyのJITコンパイラYJIT、PicoRuby、DynamoDBの3つの制約ほか
- 20210419前編 RailsのN+1クエリを定番以外の方法で修正する、GitLabのセキュリティ修正リリースほか
- 20210413後編 RubyMineのRBSサポートとCode With Me、GitHub ActionとDockerレイヤキャッシュほか
- 20210412前編 Active Record属性暗号化機能がRails 7にマージ、RailsNew.ioでrails newオプションを生成ほか
今週の主なニュースソース
ソースの表記されていない項目は独自ルート(TwitterやはてブやRSSやruby-jp SlackやRedditなど)です。
週刊Railsウォッチについて
TechRachoではRubyやRailsなどの最新情報記事を平日に公開しています。TechRacho記事をいち早くお読みになりたい方はTwitterにて@techrachoのフォローをお願いします。また、タグやカテゴリごとにRSSフィードを購読することもできます(例:週刊Railsウォッチタグ)