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

週刊Railsウォッチ: ruby/debug 1.2.0リリース、Railsにはthorが入っている、tendejitほか(20211006後編)

こんにちは、hachi8833です。

週刊Railsウォッチについて

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

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

🔗Ruby

🔗 ruby/debug関連


つっつきボイス:「そういえばruby/debugをRails環境でちゃんと動かす機会がまだなかった」「う、私もまだでした」「Railsコンソールで少し動かしたりはしましたが、JetBrains IDEで使いたい気持ちがあります」

「早くもdebug 1.2.0が出たんですね(つっつき後v1.2.4まで出ました)」「早い」「バグ修正が多数入ったようです」「年末に出るRuby 3.1へのビルトインに向けてゴリゴリ作業しているんでしょうね」「Rails 7でマージされたのは現時点のgem形式のdebugということになりますね(ウォッチ20211004)」

後でdebugのTODOファイルも見つけました↓。

以下はつっつき後に見つけたツイートです。

🔗 tenderjit: 実験用Ruby製JITコンパイラ(Ruby Weeklyより)

tenderlove/tenderjit - GitHub


つっつきボイス:「名前でもしやと思ったらやはりtenderloveさんだった」「tenderloveことAaron PattersonさんがYJITの設計を元にJITコンパイラをRubyで作ってみたそうです」「自分の名前を付けたところがナイス」「experimentalだけあって、まだgemですらないのね」「これがRubyKaigiに登場したらきっと楽しい」

[インタビュー] Aaron Patterson(前編): GitHubとRails、日本語学習、バーベキュー(翻訳)

以下はつっつき後に見つけたツイートです。

tenderjitの解説動画も見つけました。

参考: TenderJIT: A JIT compiler for Ruby with Aaron Patterson (tenderlove) | hexdevs

🔗 ThorがRailsに入っている話

Thor: 北欧神話のトール神


つっつきボイス:「記事はrakeはもう古い、thorの方がいいという感じでした」「rakeが昔からあるのは確かですけどね」「そうそう」「rakeが使いにくいので自分はrails runnerを使ったりしてます」

参考: rails runner のススメ - Qiita

ruby/rake - GitHub

「rakeはシンプルでいいんですが引数が使いづらいんですよ: thorだと以下のように明らかに可読性が高い」

# 同記事より
require "thor"

class MyTask < Thor
  desc "hello", "says hello"
  option :names, required: true, type: :array
  def hello
    options[:names].each do |name|
      say "Hello there #{name}"
    end
  end
end

# Running it
thor my_task:hello --names "Obi-Wan" "General Grievous" "Qui-Gon Jinn"
Hello there Obi-Wan
Hello there General Grievous
Hello there Qui-Gon Jinn

「たしかthorも昔からありましたよね?」「そうそう」「この記事に『Railsにもthorがこっそり入ってるよ』とあったので調べてみると、昔はhttps://github.com/erikhuda/thorにあったのが、いつの間にかRailsのリポジトリに引っ越していました」「どれどれ、railtiesに入っている?あ、ホントだ!」「お〜、じゃRailsでさくっとthor使えるんですね😋」

rails/thor - GitHub

# railties/lib/rails/command/base.rb
# frozen_string_literal: true

require "thor"
require "erb"

require "active_support/core_ext/string/filters"
require "active_support/core_ext/string/inflections"

require "rails/command/actions"
...

「こういうふうに.thorで取って使えるのか↓」「これはへ〜という気持ち」「機会があったら使ってみようかな」

# 同記事より
# /Thorfile
require File.expand_path("../config/environment", __FILE__)

Dir["./lib/tasks/**/*.thor"].sort.each { |f| load f }

🔗 その他Ruby


つっつきボイス:「RubyWorld Conferenceで募集しているのはRubyの活用事例が中心ですね」

「それにしても松江に行きたいな〜」「旅行したいです」「松江の飯と酒と人、何もかも恋しい: 島根名物の鯖の塩辛、とても塩辛いけどうまいんですよ」「私そこの出身ですけど食べたことなかったかも…」

参考: 鯖塩辛(松田十郎商店) - 松江のこだわりショップ 八百万マーケット

🔗DB

🔗 GitLabがPostgreSQLのサブトランザクション排除に1か月かかった理由


つっつきボイス:「記事に出てくるSAVEPOINT、明示的に呼んだことはなかったかも」「ぽすぐれ固有かと思ったらMySQLにもあるんですね」「記事の解説をざっと見た感じでは、トランザクションのBEGINENDの間にSAVEPOINTを書けるのね: そういえばどこかで見た気がする」

参考: PostgreSQL 13ドキュメント SAVEPOINT
参考: MySQL :: MySQL 5.6 リファレンスマニュアル :: 13.3.4 SAVEPOINT、ROLLBACK TO SAVEPOINT、および RELEASE SAVEPOINT 構文

--- 同記事より
--- トランザクション開始
BEGIN
SAVEPOINT active_record_1
--- アカウントを探索
SELECT * FROM credit_accounts WHERE customer_id = 1
--- アカウントをINSERT: 重複のために失敗する可能性あり
INSERT INTO credit_accounts (customer_id) VALUES (1)
--- ロールバックしてこれをabortする
ROLLBACK TO active_record_1
--- ここでリトライ: 新しいサブトランザクションを開始
SAVEPOINT active_record_2
--- 新規作成したアカウントを検索
SELECT * FROM credit_accounts WHERE customer_id = 1
--- データを保存
RELEASE SAVEPOINT active_record_2
COMMIT

「上のSQLで言うと、SAVEPOINT active_record_1を作っておいて、失敗したときにROLLBACK TO active_record_1でその場所までロールバックできる、RELEASE SAVEPOINTで解放する、なるほど」「トランザクション内でSAVEPOINTを自分で指定できる感じでしょうか?」「トランザクション全体をロールバックする代わりに、カレントのトランザクション内の任意の場所にSAVEPOINTを置いてトランザクション内からロールバックできるようですね」「それでサブトランザクションなのか、なるほど理解です」「記事ではサブトランザクションのリトライが多数発生してクエリが遅くなったということみたい」

参考: PostgreSQL 13ドキュメント ROLLBACK TO SAVEPOINT

「上のドキュメントによるとSAVEPOINTへのロールバックはカーソル位置には影響しないのか: 知らないとハマりそう」


「ところでSAVEPOINTを明示的に使うことってあるんでしょうか?」「たしかRailsのテストログで見た覚えがあるので、テスト周りで使われているかも(検索): 以下の記事↓を見ると、database_cleaner gemあたりに関連しているようですね」

参考: RSpecとDatabaseCleanerを使ってマルチスレッドで同じレコードを見えるようにしたい

DatabaseCleaner/database_cleaner - GitHub

「たとえばRSpecでbefore doするときにSAVEPOINTを持っておけば、そこにロールバックするだけで済むので、データを最初から入れ直す必要がなくなるでしょうね」「お〜たしかに!」「しかもbefore doがネストする場合でも、それぞれのSAVEPOINTをスタック的に持っておけばきれいにロールバックできるでしょうね(ちゃんと制御できればですが)」「なるほど」「SAVEPOINTはコミットしないので、I/Oもできるだけ発生しないように動作するんじゃないかな」「へ〜!」「SAVEPOINTはそういう便利な使い方が考えられます」

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

🔗 AWS ALBがNLBのターゲットに利用可能に


つっつきボイス:「そうそう、NLBのターゲットでALBを使う機能、こういうニーズがたまにあるんですよ」「ALBでIPアドレスを固定して使いたいとき、ふむふむ」「NLBならEIPで固定IPを割り当てられるんですが、ALBはIPアドレスが変わる可能性があるのでDNSで名前を割り当てることしかできなかった」「あ、そういうことですか」「従来はNLBターゲットにALBが使えなかったので、ALBで固定IPを使うには別途リバースプロキシを固定IPで立てる必要があったんですよ」

参考: Network Load Balancer とは? - Elastic Load Balancing
参考: Application Load Balancer とは? - Elastic Load Balancing
参考: Elastic IP アドレス - Amazon Elastic Compute Cloud

「ALBで固定IPが欲しいときってあるんでしょうか?」「結構ありますよ: リバースプロキシの都合でドメイン名で指定できない場合とか」「あ〜そういう環境の場合ですか」「ALBを使うということはドメイン名で指定することになるので、ルーターやスイッチなどで設定するとアクセス時にDNSでの名前解決が必要になって遅くなるんですよ: そういうときに固定IPが欲しい」「なるほど」「リバースプロキシによっては一度名前解決で取得したIPアドレスを手元でキャッシュしてしまうものがあって、そういうソフトを使っているとALBのIPアドレス変更に追随できずエラーになる、といったケースもあります」

「今まではそのためにNLBが必要で、NLBとALBの役割分担とかも複雑になりがちでしたが、それが不要になったことで選択肢が増えたのはいいですね👍」

🔗 CloudflareのR2(Publickeyより)


つっつきボイス:「記事の最後に『Cloudflare R2は現在開発中』とありますね」「S3はたしかに高いので、Cloudflareがこういうのを出すことにしたのはありがたい」「可用性がS3と同じイレブンナインなのが強そう」「自分たちがS3を使う理由は、そこに置いたものが消えないという安心感なので、Cloudflareがそれをやれるならいいと思います👍」

参考: イレブンナイン - Wikipedia

「R2は読み出しの帯域コストなしだけどデータを置くコストは必要みたいですね」「それが見合うかどうかは使い方にもよるでしょうね」「これでR2からの読み出しを無料でCloudflareのCDNに乗せられたら最強でしょうね: AWSのCloudFrontは高いしFastlyは凄いけどさらに高いので」

参考: Amazon CloudFront(グローバルなコンテンツ配信ネットワーク)| AWS
参考: Fastly | 最高の Web を支えるエッジクラウドプラットフォーム | Fastly

🔗その他

🔗 PLC再びか


つっつきボイス:「お〜、なつかしのPLC(Power Line Communication)が復活の兆しとは: 自分が学部生の頃に鳴り物入りで登場してその後消えた😆」「電波法が改正されて使いやすくなったんですね」

参考: 電力線搬送通信 - Wikipedia

「三相交流でも使えるようになって、さらに屋外でも使えるようになったのは大きい!: 以前はPLCが通っている電源ラインが屋外に出ているだけで違法だったんですよ」「え、そうだったんですか?」「外置きの洗濯機のコンセントもダメだったのか」「分電盤で仕切られた電源ラインならいいんですが、そのまま屋外には出せなかった」

参考: 三相交流 - Wikipedia

「コンセントを使ってなくてもですか?」「スプリアス、いわゆる漏れ電波が問題なので、配線が屋外に出ていること自体がダメだったんですよ」

参考: スプリアス領域 ‐ 通信用語の基礎知識

「それだと普及は難しそうですよね」「PLCは本来、一軒家や神社仏閣や歴史的建築物のように後からネットワーク配線を通しにくい建物で有用なはずだったのに、そういうところに屋外コンセントがあるのが普通なので、PLCがまったく普及しなかった原因のひとつはそれだと思っています」「ありゃ〜」

「電波法が改正されたのは、AMラジオがFMに移行しつつあるみたいに電波帯域の割り当て移動が近年増えているのと関係あるかも」「もう遅いかもしれないけど今からでもPLC普及して欲しいですね」

参考: 総務省 電波利用ホームページ|周波数割当て|周波数帯ごとの主な用途と電波の特徴
参考: 民放AMラジオ44局が2028年秋までにFM化へ、在京3局はAM停波も目指す | 日経クロステック(xTECH)


後編は以上です。

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

週刊Railsウォッチ: Rails 7でbyebugがruby/debugに変更、GitHub Codespacesをサポートほか(20211004前編)

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

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

Ruby Weekly

Publickey

publickey_banner_captured


CONTACT

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