- Ruby / Rails関連
週刊Railsウォッチ: ruby/debug 1.2.0リリース、Railsにはthorが入っている、tendejitほか(20211006後編)
こんにちは、hachi8833です。
🔗Ruby
🔗 ruby/debug関連
どうもbyebug使うと挙動遅くなるなと思っていたら...ちゃんと理由があったのね。
どんどんRubyという言語単位でも成長していっているんだなぁ。#rubykaigihttps://t.co/RPMEf6gB0S
— バートリーのさいとう@エンジニア (@BartleySaito) September 18, 2021
つっつきボイス:「そういえばruby/debugをRails環境でちゃんと動かす機会がまだなかった」「う、私もまだでした」「Railsコンソールで少し動かしたりはしましたが、JetBrains IDEで使いたい気持ちがあります」
「早くもdebug 1.2.0が出たんですね(つっつき後v1.2.4まで出ました)」「早い」「バグ修正が多数入ったようです」「年末に出るRuby 3.1へのビルトインに向けてゴリゴリ作業しているんでしょうね」「Rails 7でマージされたのは現時点のgem形式のdebugということになりますね(ウォッチ20211004)」
Version 1.2.0 contains “many”
bug fixes 🙂 https://t.co/j6V20T0F4Q— Stan Lo (@_st0012) September 30, 2021
後でdebugのTODOファイルも見つけました↓。
以下はつっつき後に見つけたツイートです。
12月発売の改訂版「プロを目指す人のためのRuby入門」でも使い方を説明するデバッガをByebugからdebug.gem (ruby/debug) に置き換えました!(この時期の大幅な修正はNGなのに編集者さんに頼み込んだ😅)
Rails 7でbyebugがruby/debugに変更、GitHub Codespacesをサポートほかhttps://t.co/ZumdUrrpMz
— Junichi Ito (伊藤淳一) (@jnchito) October 5, 2021
🔗 tenderjit: 実験用Ruby製JITコンパイラ(Ruby Weeklyより)
つっつきボイス:「名前でもしやと思ったらやはりtenderloveさんだった」「tenderloveことAaron PattersonさんがYJITの設計を元にJITコンパイラをRubyで作ってみたそうです」「自分の名前を付けたところがナイス」「experimentalだけあって、まだgemですらないのね」「これがRubyKaigiに登場したらきっと楽しい」
以下はつっつき後に見つけたツイートです。
At some point I'll have to work on warmup time, but tenderjit can speed up iterative fibonacci now pic.twitter.com/PAADXGLJS0
— Aaron Patterson (@tenderlove) August 7, 2021
tenderjitの解説動画も見つけました。
参考: TenderJIT: A JIT compiler for Ruby with Aaron Patterson (tenderlove) | hexdevs
🔗 ThorがRailsに入っている話
Thor: 北欧神話のトール神。
つっつきボイス:「記事はrakeはもう古い、thorの方がいいという感じでした」「rakeが昔からあるのは確かですけどね」「そうそう」「rakeが使いにくいので自分はrails runner
を使ったりしてます」
「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使えるんですね😋」
# 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 2021 で講演いただける方を募集しています。
Rubyに関する取り組みを世界に向けて発表しませんか?奮ってのご応募をお待ちしております。・30分枠: 5枠程度
・15分枠: 5枠程度申込締切: 10月18日(月)
発表者の決定: 10⽉下旬予定#rubyworldhttps://t.co/JThvxzBCdc— RubyWorld Conference (@RubyWorldConf) September 27, 2021
そういえば、もし企業事例っぽいCFPを出して #kaigionrails では落選してしまった皆さんは、#rubyworld でリベンジを試みてもいいかもしれません(いろんな事例は大歓迎なはず…) https://t.co/G172lSmjXe
— Kakutani Shintaro (@kakutani) September 29, 2021
つっつきボイス:「RubyWorld Conferenceで募集しているのはRubyの活用事例が中心ですね」
「それにしても松江に行きたいな〜」「旅行したいです」「松江の飯と酒と人、何もかも恋しい: 島根名物の鯖の塩辛、とても塩辛いけどうまいんですよ」「私そこの出身ですけど食べたことなかったかも...」
参考: 鯖塩辛(松田十郎商店) - 松江のこだわりショップ 八百万マーケット
🔗DB
🔗 GitLabがPostgreSQLのサブトランザクション排除に1か月かかった理由
つっつきボイス:「記事に出てくるSAVEPOINT
、明示的に呼んだことはなかったかも」「ぽすぐれ固有かと思ったらMySQLにもあるんですね」「記事の解説をざっと見た感じでは、トランザクションのBEGIN
とEND
の間に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を使ってマルチスレッドで同じレコードを見えるようにしたい
「たとえばRSpecでbefore do
するときにSAVEPOINT
を持っておけば、そこにロールバックするだけで済むので、データを最初から入れ直す必要がなくなるでしょうね」「お〜たしかに!」「しかもbefore do
がネストする場合でも、それぞれのSAVEPOINT
をスタック的に持っておけばきれいにロールバックできるでしょうね(ちゃんと制御できればですが)」「なるほど」「SAVEPOINT
はコミットしないので、I/Oもできるだけ発生しないように動作するんじゃないかな」「へ〜!」「SAVEPOINT
はそういう便利な使い方が考えられます」
🔗クラウド/コンテナ/インフラ/Serverless
🔗 AWS ALBがNLBのターゲットに利用可能に
ついに来ました。NLBのターゲットにALBが指定可能に。何言ってるか意味わからないと思いますが、IPアドレス固定してALBが使えたり、PrivateLinkのエンドポイントの先にALBが使えます。 https://t.co/ihbIlheu7W https://t.co/fBPtTfs7Ro
— Yukihiro Kikuchi (@yukihirokikuchi) September 27, 2021
つっつきボイス:「そうそう、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がそれをやれるならいいと思います👍」
「R2は読み出しの帯域コストなしだけどデータを置くコストは必要みたいですね」「それが見合うかどうかは使い方にもよるでしょうね」「これでR2からの読み出しを無料でCloudflareのCDNに乗せられたら最強でしょうね: AWSのCloudFrontは高いしFastlyは凄いけどさらに高いので」
参考: Amazon CloudFront(グローバルなコンテンツ配信ネットワーク)| AWS
参考: Fastly | 最高の Web を支えるエッジクラウドプラットフォーム | Fastly
🔗その他
🔗 PLC再びか
つっつきボイス:「お〜、なつかしのPLC(Power Line Communication)が復活の兆しとは: 自分が学部生の頃に鳴り物入りで登場してその後消えた😆」「電波法が改正されて使いやすくなったんですね」
「三相交流でも使えるようになって、さらに屋外でも使えるようになったのは大きい!: 以前は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など)です。
週刊Railsウォッチについて
TechRachoではRubyやRailsなどの最新情報記事を平日に公開しています。TechRacho記事をいち早くお読みになりたい方はTwitterにて@techrachoのフォローをお願いします。また、タグやカテゴリごとにRSSフィードを購読することもできます(例:週刊Railsウォッチタグ)