- Ruby / Rails関連
週刊Railsウォッチ: RBS関連記事、Ruby formatterプロジェクト、Google Cloud Runほか(20220406後編)
こんにちは、hachi8833です。
🔗Ruby
🔗 RBS関連記事
つっつきボイス:「先週(ウォッチ20220328)に続いてRBS関連記事です」「2本目はRBSを実際に導入してみたんですね: RBSをすべてに適用することはないと思うので、可能な部分から始める感じで」「rbs_railsも導入されてますね↓」
「RBSのエディタサポートは今どんな感じですか?」「知っている範囲では、VSCodeやRubyMineでは継続的にサポートが増えていますね」「なるほど、TypeScriptにすっかり慣れた身としてはRubyのリファクタリングがつらくて」「自分もたまにTypeScript触ってからRubyに戻ると軽くそんな気持ちになるかも」「実行時までどんな型の値が入るかわからないのは不安です」「型を静的にチェックできると迷う部分が減るのはたしかですね」
🔗 gem-compare: gemのバージョン差分を表示(Ruby Weeklyより)
- 元記事: gem-compare goes 1.0
つっつきボイス:「gem-compareというgemが1.0になったという記事です」「gem compare rails 6.2.0 7.0.0 -k
のようにバージョンを指定すると比較情報が取れるんですね」「1.0からは--diff
オプションでdiffも出してくれるようになった↓」
「gemごとにいちいちGitHubのリポジトリでCompareボタンを押さなくてもよくなる」「RubyMineなら右クリックでdiffは出せますけどね」「Rails 6と7だとdiff大きくなりそう」
「自動でgemのバージョンを上げるCIが失敗したときに、gemのdiff情報を出すようにしておくのにいいかも」「手元にコードを引っ張って来ずにやれるようなので、手入力でgemのdiffを取るのに使いたいかな」「gemをアップデートするかどうかを検討するのにもよさそう👍」
🔗 Ruby Associationの「Ruby formatter」プロジェクト(Ruby Weeklyより)
つっつきボイス:「Ruby Associationの助成金を受けている、Ruby formatterプロジェクトの最終レポートだそうです」「Rubyだけでフォーマッタを作るプロジェクト、聞いたことあるかも」「Rustで書き直す方が個人的には嬉しいかな😆」
参考: 2021 Ruby Association Grant selection result --「Ruby formatter」
「記事ではRipperやPrettyPrintの更新やLanguage Serverの話などもしていますね」「ここまでの成果は以下のリポジトリにもあるそうです↓」
「お〜、こういう感じでコードを解析できるらしい↓」「SVGのロゴが素敵」「Rubyだけで解析できるということはYJITがよく効きそう👍」
# 同リポジトリより
$ stree ast program.rb
(program
(statements
...
参考: class PrettyPrint
(Ruby 3.1 リファレンスマニュアル)
🔗 curl-to-ruby(Ruby Weeklyより)
つっつきボイス:「curlコマンドをRubyコードに変換するサイトだそうです」「入力するとリアルタイムでnet/httpを使うコードに変換するのね↓」「BASIC認証やJSONなんかにも対応している」「使うかどうかは別にして楽しい🤗」
参考: library net/http
(Ruby 3.1 リファレンスマニュアル)
🔗 Chrome DevToolsにもcurlコマンド生成機能がある
「そういえばChromeのDevToolsにもcurlコマンドのショートカットがありますね: Networkタブで適当なリクエストを右クリックすると出てくる↓」「お〜、前はcurlとHARぐらいしかなかったような気がするけど、いつの間にかいろいろ増えてる」「PowerShellやNodeJS fetchとかまでありますね」「リクエストをまとめて取れるcopy all as cURL
も増えてるのエラい」
「これでコピーしたcurlコマンドを上のサイトに貼り付ければ、Rubyでちょっとしたスクレイピングのコードを書くのに便利かも」「なるほど〜」「Rubyはあるけどcurl
がないような制限された環境で手っ取り早く内部APIを叩きたいときなんかにも使えそうですね👍」
「ところで、このサイトでさらにWebAssemblyベースのRubyが直接動いたら面白いですよね」「いいですね〜」
🔗 その他Ruby
つっつきボイス:「ruby-jp Slackで見かけたんですが、-0.0
のobject_id
の結果が毎回違うことに気づいたそうです(コードは編集部で再実行したものです)↓」「ちょっとびっくり」「謎の挙動」「これを試そうと思ったのがスゴい」「-0.1
や0.1
では起きませんね」「-0
や0
でも起きない」「-0.0
のときだけobject_id
の結果がやけに短い」
$ ruby -v
ruby 3.1.1p18 (2022-02-18 revision 53f5fc4236) +YJIT [x86_64-darwin21
$ irb
irb(main):001:0> -0.0.object_id
=> 7160
irb(main):002:0> -0.0.object_id
=> 8900
irb(main):003:0> -0.0.object_id
=> 11200
irb(main):004:0> 1.0.object_id
=> -36028797018963966
irb(main):005:0> 1.0.object_id
=> -36028797018963966
irb(main):006:0> 1.object_id
=> 3
irb(main):007:0> 1.object_id
=> 3
irb(main):011:0> -0.object_id
=> 1
irb(main):012:0> 0.object_id
=> 1
参考: Object#object_id
(Ruby 3.1 リファレンスマニュアル)
🔗クラウド/コンテナ/インフラ/Serverless
🔗 Google Cloud Run
つっつきボイス:「Cloud Runはなかなかよさそう: AWSにこういうのが欲しい気持ち」「わかります」「ECSタスクはいろいろ面倒が多いんですよ」「ちょうどECSタスクと戦っているところですけど、やること多くてたしかに面倒😅」「リソース作ってIAMロール割り当てて...とかね」
参考: Cloud Run: コンテナを秒単位で本番環境にデプロイ | Google Cloud
参考: CloudRunからはじめるGCP - Qiita
参考: Amazon ECSの タスク定義 - Amazon Elastic Container Service
「自分たちに必要なのはCloud Run的なものなのかもしれない」「前にも話したかと思いますが、Cloud Runは利用者側の利便性を指向しているとすれば、AWSのサービスはインフラエンジニアの利便性を指向している」「AWSは材料は用意したからピタゴラスイッチで頑張ってねという感じ」「Googleのクラウドは、これとこれをポチポチすれば利用できるものをまず提供するあたりが利用者側の気持ちに寄り添っている感じですね: その分舞台裏が見えにくいのでインフラエンジニアが勉強しにくい」
「ECSタスクはコードのビルドやらデプロイやら、やること多すぎて面倒」「そうそう、VPCエンドポイントが未設定だとECSタスクを起動するのにもインターネット経由でプルするから通信料金がかかるし」「Lambdaの話だけど、publicなサブネットに置くとNATゲートウェイを置かないとインターネットに出られないのも納得いかない」「ほんとに」「あとCodeBuildもVPCに置くとインターネットに出られない」
参考: プライベートサブネットにおいて Fargate で Amazon ECS タスクを実行する
参考: ネットワークアドレス変換 - Wikipedia
参考: AWS CodeBuild(継続的スケーリングによるコードのビルドとテスト)| AWS
🔗 AWS Lambdaの/tmpが10GBに増量(Publickeyより)
つっつきボイス:「/tmpが10GBまで使えるのはいいですね👍」「AWS Lambdaの/tmpはホットスタートすれば以前の内容が残るのでキャッシュに使える」「S3に置いた巨大データを取ってきて/tmpに置くとか普通によくやるので、ありがたい」
「ECSタスクとLambdaは利便性で言えばLambdaの方がずっと使いやすいんですが、Lambdaには時間制限があるのが残念」「そうそう、ECSタスクにはそういう制限はありませんね」「今Lambdaでバッチを作ろうとしているんですけど、15分以上かかるバッチが作れなくて😢」
「逆に言えばLambdaから時間制限がなくなればECSタスクは不要ですよね」「欲しいのはやっぱりそれですね」
🔗 長時間かかるバッチをLambdaで実行する
「ちなみに自分たちがECSタスク的なことを行うときは、バッチサーバーに内部からだけアクセスできるAPIエンドポイントを用意しておいて、Lambdaからそこにリクエストを送信することでバックグラウンドジョブをSidekiq経由で実行する、という方法をよく使いますね」「あ、その手があったか〜」
「元々Sidekiqのワーカーは立てているので、そのSidekiqワーカーのインスタンスに内部APIを付けてLambdaから起動する」「なるほど、スケーリング不要ならそういうのもありですね」「Lambdaから起動できるようになればEventBridgeが使えるのでcron的なタスクも実行できるし、エンドポイントのURLにリクエストを送信して起動すればCloudWatchにログも残せます」
参考: Amazon EventBridge (サーバーレスイベントバスでアプリ同士を簡単に接続) | AWS
参考: Amazon CloudWatch(リソースとアプリケーションの監視と管理)| AWS
「ひと手間かけてバッチジョブ実行専用のURLエンドポイントを作り、Lambaで叩いて起動するというのは、最近の自分のベストプラクティスかな」「なるほど」「もちろん、こういうURLエンドポイントに攻撃を受けると非常に危険なので、セキュリティには十分注意が必要」「ですよね」「APIキーを設定することもありますけど、そこを攻撃されるとしたら既にAPIキーも環境変数から奪われている可能性が高いので、APIキーがあってもあまり変わらないんですよ」
「ちなみにLambdaはどの言語で書きますか?」「コンテナのRubyではなくAWSのRubyですね」「つまりRuby 2.7ですか」「そうそう、gemのビルドが必要なときはコンテナのRubyにすることもありますが」「Goとかじゃないんですね」「JavaScriptでもいいんですが、Rubyに慣れているのでRubyでやってます」
🔗JavaScript
🔗 SPA vs MPA
つっつきボイス:「年に数回は盛り上がる定番の話題」「ツイートでもバズってますね」「自分は『4. セキュアなデータを流出する可能性の高低』だけは違うと思います: 単にAPIの設計に問題があるだけ」「SPAとMPAの違いとかではないですよね」
「mizchiさんのこのツイートは自分も共感↓」「URLの冪等性の話、たしかに」
MPA => SPA の移行はかなり困難で、URLの冪等性を捨てない限り事実上不可能といっていいんだけど、SPAをMPAに移行するのはさほど難しくない。ただSPA自体を正しく作るコストはそれなりに高かった、昔は。Next/Nuxt のおかげで今は現実的に選択肢になってる、という現状をどう捉えるかになってる
— mizchi (@mizchi) March 31, 2022
🔗 GraphQLよもやま
「そういうデータ流出の問題はむしろGraphQLで感じるかも: 出してはいけないデータを出さないように正しく設計するのは難易度が高い気がする」「GraphQLのそういう面はそれほどでもないけど、知らずにコストの高いクエリを作ってしまう可能性の方が気になるかな」
「でもGraphQLで出していいものといけないものを権限に応じて確実に判断するのって難しくありませんか?」「実はBPS WebチームのkazzさんがRailsでそこをうまくやってくれるフィルタを社内向けに作ってくれたんですよ」「へ〜」「Railsとgraphql-ruby↓で、現在ログイン中のユーザーのコンテキストに応じてカラムをフィルタするというモジュール」「いいな〜」「友達の友達みたいな権限まできちんと扱おうとすると大変そうですね」「リソースごとに権限を付与するのはどうやっても大変...」
以下はつっつき後に見つけたツイートです。
XSSとかはSPAの方が対策しやすいと思うけど、まだSPAのセキュリティに関するベストプラクティスが知られていないので脆弱性が入りやすいというのはある / “なぜ僕が「SPAはコストが高い」と考えているのか” https://t.co/Z0gxxRZGs5
— 徳丸 浩 (@ockeghem) March 31, 2022
後編は以上です。
バックナンバー(2022年度第2四半期)
週刊Railsウォッチ: Ruby 3.2.0 Preview 1リリース、Rails向けDocker環境ジェネレータ、scientist gemほか(20220404前編)
今週の主なニュースソース
ソースの表記されていない項目は独自ルート(TwitterやはてブやRSSやruby-jp SlackやRedditなど)です。
週刊Railsウォッチについて
TechRachoではRubyやRailsなどの最新情報記事を平日に公開しています。TechRacho記事をいち早くお読みになりたい方はTwitterにて@techrachoのフォローをお願いします。また、タグやカテゴリごとにRSSフィードを購読することもできます(例:週刊Railsウォッチタグ)