- Ruby / Rails関連
週刊Railsウォッチ: Rubyでシリアルポートにアクセス、Active Record vs Sequelほか(20240313後編)
こんにちは、hachi8833です。
Railsの作者として有名なDHH氏がMacを捨ててWindows+WSL環境に変える宣言をしたのが話題になってるな。AppleのEUにおける一連のふぁっきんな対応にブチ切れたらしい😅
RubiestならばMacという雰囲気があったが、これでどうなることやらw /
Committing to Windows https://t.co/IMl32lPwQa— AOE Takashi (@aoetk) March 7, 2024
つっつきボイス:「Macを使わなくなるわけではなくてメインマシンをWindowsにするということみたい」「ところでDHHって最近までエディタにTextMate使っていたのね: 遠い昔にDHHが初めてRailsをお披露目したときの有名な動画↓でTextMateを使っていたこともあって、Macユーザーで使ってた人も割といた印象があるかな」「あの"15分でWebアプリを作る"動画ですね」
「自分が以前Sublime Textを使ってたときにTextMateを見かけたことはあったんですが、ついに使わないままVS Codeに乗り換えました」「TextMateは昔使ったことあったけど、日本語を入力するにはTextMate用のフォントを作ったりといろいろ手間かけないといけなかったんですよ」「TextMateってWindows版なかったのか...」
参考: TextMate: Text editor for macOS
参考: Macの定番テキストエディタ「TextMate」を入れてみたよ&日本語入力できるようにしたよ - bojovs blog
お知らせ: 来週の週刊Railsウォッチはお休みをいただき、通常記事を公開いたします🙇
🔗Rails
🔗 JSの昔の書き方をTurboで使いたい(Ruby on Rails Discussionsより)
つっつきボイス:「自分の管理下にない外部のJavaScriptコード(ここではgtag)を、書き方を変えずにTurboでやる方法がないかどうかを尋ねている書き込みを見つけました」「たぶんページ読み込みの時点で存在しているElementに対して最初に1回だけ一括でaddEventListener()
するような実装がいけないんじゃないかな」「Discussionの回答を見てもそのままでは無理っぽいですね」「extreme challengeとあるぐらいなのでめちゃくちゃ難しいということか〜」
// discuss.rubyonrails.orgより
console.log('current page: ', window.location.href)
document.addEventListener('click', function() {
console.log('document click')
})
document.querySelectorAll('a').forEach(function(a) {
a.addEventListener('click', function() {
console.log('a click')
})
})
「現代のWebフロントエンド環境ではDOM要素がちょくちょく再レンダリングされたりするので、addEventListener()
とかで現在あるDOM要素をイベントリスナーに登録するみたいな方法は現代だともしかしたら厳しいかも?」「う〜む」「こういうので現在のDOMにあるものを登録しても、DOMが更新されたらイベントリスナーごと消えてしまうので、たぶん他の現代的なフレームワークでもうまくいかなそうな気がする🤔」
参考: EventTarget: addEventListener()
メソッド - Web API | MDN
🔗 SprocketsからPropshaftに乗り換えたらサニタイザがHTML4
版にフォールバックした(その後修正)
期待する振る舞い
sprockets-railsを使うかどうかにかかわらず、
ActionView::Helpers::SanitizeHelper.sanitizer_vendor
はRails::HTML5::Sanitizer
になるはず。new_framework_defaults_7_1.rb
でもエラーにならない。実際の振る舞い
- 1.Railsを7.0から7.1にアップグレードする場合:
sprockets-rails
を削除してpropshaft
に置き換えると、new_framework_defaults_7_1.rb
のコードがuninitialized constant Rails::HTML
例外を発生する(rails-html-sanitizer
がデフォルトではrequire
されていないため↓)。
- 2. Rails 7.1でsprockets-railsを使わない場合:
sprockets-rails
ではなくpropshaft
を選択すると、Railsガイドに書かれている振る舞いと異なり、sanitizer_vendor
にRails::HTML4::Sanitizer
が設定される。
同issueより抜粋
参考: §3.11.21 config.action_view.sanitizer_vendor
-- Rails アプリケーションの設定項目 - Railsガイド
つっつきボイス:「ruby-jp Slackでたまたま見かけたissueです」「お、Rails 7.1からAction TextのサニタイザではデフォルトでRails::HTML5::SafeListSanitizer
が使われるようになった(ウォッチ20230802)けど、既存アプリをPropshaftにアップグレードしたらRails::HTML4::SafeListSanitizer
にフォールバックしたのか」「Rails 8でPropshaftがデフォルトになることが決まったので(ウォッチ20240228)、開発もPropshaftがメインになった感じかな」「issueと同じ方がプルリクも出していますね↓」
- PR: railties: configure sanitizer vendor in 7.1 defaults more robustly by flavorjones · Pull Request #51267 · rails/rails -- その後マージおよび7.1にバックポートされました🎉
🔗 RubyアプリでActive RecordとSequelのどちらを使うか
つっつきボイス:「SequelはJeremy Evansさんがずっと手掛けている、Active Recordのオルタナ的なgemですね」「Active Recordだとbelongs_to
とhas_many
で書くようなところを、Sequelだとone_to_many
とmany_to_one
というDSLで書くのね↓: この違いは興味深い」
# 同記事より
# models/product.rb
class Product < Sequel::Model
one_to_many :orders
end
# models/order.rb
class Order < Sequel::Model
many_to_one :product
end
# クエリ
product_orders_under_20 = DB[:orders].join(:products, id: :product_id).where { price < 20 }
「Sequelだと楽観的ロックをこんなふうに書けるのか↓」「Sequelが好きな人なら、Rails以外のRubyアプリでSequelを使うのは普通にありだと思います👍」
# 同記事より
# invoice.rb
class Invoice < Sequel::Model
plugin :optimistic_locking
end
🔗 その他Rails
https://t.co/qeSAGMHWL2 meetup Vol.28 / 既存アプリをTurbo8に対応させよう https://t.co/GnNfxajyD8
— TOKUHISA (@TOKUJPNNET) March 7, 2024
つっつきボイス:「3/14(木に)Hotwire Loveイベントがあるそうです」「既存アプリを新しいTurbo 8に対応させる話題なんですね」「盛り上がってますね〜」
🔗Ruby
🔗 Rubyからシリアルポートにアクセスする(Ruby Weeklyより)
つっつきボイス:「tenderloveさんがシリアルポートで遊んでみた記事です」「懐かしい、UARTは自分も使ったことありますよ」「コードで使っているuart gemもtenderloveさん作なんですね↓」
参考: UART - Wikipedia
# 同記事より
require "uart"
MASK = (~(3 << 14)) & 0xFFFF
UART.open ARGV[0], 115200 do |serial|
# turn on heartbeat
serial.write "<HEARTBEAT1>>"
loop do
if serial.wait_readable(2)
count = ((serial.readbyte << 8) | serial.readbyte) & MASK
p count
else
$stderr.puts "oh no, something went wrong!"
exit(1)
end
end
ensure
# make sure to turn off heartbeat
serial.write "<HEARTBEAT0>>"
end
「あれ、シリアル接続といえばRS-232Cは何を指すんでしたっけ?」「RS-232C自体はむかーしのPCに付いてたようなコネクタの規格のことで、広義のシリアル通信としてはRS-232Cでないものもあります: たとえばArduinoとかで使われてるようなマイコンだと、特定のピンをUART出力に割り当てることでそこからシリアルコンソールを取れたりしますが、こういうシリアルコンソール用のピンは基板上のパターンにだけ出ていたりするので、RS-232Cコネクタを使わないシリアル通信の口だったりします」
「基板によってはシリアルポートにアクセスすることでfastbootのプロンプトを取ってファームウェアを流し込んだりとか楽しいことができたりしますね」「そうそう、M5Stackあたりを触り始めると結局そうやって遊んだりしてます😆」
🔗 Ruby「公案」(Ruby Weeklyより)
つっつきボイス:「Koanって何かと思ったら禅の公案のことみたい」「サイトはWasmで動くRubyクイズサイトなんですね」「英語圏の禅文化好きって昔からあるけど今も根強いですね」
参考: 公案 - Wikipedia
つっつき後に以下のツイートを見つけました↓。Ruby Koansは実は昔からあって、それをブラウザ版に移植したんですね。
WIP: In memory of @jimweirich, inventor of Rake and RubyKoans who passed 10 years ago.
I ported the Ruby Koans to the browser. Learn Ruby by fixing tests.https://t.co/WZwEgWFPSu#buildinpublic #ruby@lucianghinda @marcoroth_ @skryukov_dev @ledsun @hasumikin @KuokkanenSampo pic.twitter.com/2NmcCRMzcV— Andi / アンディ (@largo) February 16, 2024
🔗 Rubyで乱数を生成するとき(Ruby Weeklyより)
つっつきボイス:「記事は定番の話ですが、Rubyで乱数が必要なときはKernel#rand
とかではなくsecurerandom gemを使うべきですね(追記2024/03/18: ご指摘に基づいて文面と見出しを修正しました)」「ちなみに言語付属のライブラリで、数値としての乱数だけでなくhexやUUID、BASE64形式のフォーマットまでしてくれるのは結構ありがたいですよ😋↓」
# 同記事より
require "securerandom"
SecureRandom.alphanumeric # "tpEnoWgScSJRU3YB"
SecureRandom.base64 # "0jHnJ7Yx5oTW0OY+YKgUog=="
SecureRandom.hex # "b51372ee8b93eb3e1f0035d9300c3e97"
SecureRandom.rand # 0.6053942880507039
SecureRandom.urlsafe_base64 # "OTHNscnomrNjjT0g_dzpdw"
SecureRandom.uuid # "f6f54bd8-fc5a-483f-8909-05428dea2290"
参考: class Random
(Ruby 3.3 リファレンスマニュアル)
🔗言語/ツール/OS/CPU
🔗 南京錠と木製からくり計算機
こういうことですか pic.twitter.com/bXSCELsCLF
— ᗝᗝᗝᗝᗝᱝ (@8Q6QP6GH_QJ) June 4, 2021
つっつきボイス:「南京錠のようなものを論理回路に見立てる遊びって昔からときどき目にしますね」
「直接関係ないけど、木で計算機を作る人を実際に見たことあったのを思い出しました↓」「お〜これはすごい!」「ちゃんと動くんですね」「レタリングや仕上げも丁寧なのが素晴らしいです」
参考: 「からくり計算器」「ゲームボーイシンセサイザー」「手のひらサイズお絵かきマシン」──“自作”の祭典「Maker Faire Tokyo 2019」で見た個性的な作品たち(1/2 ページ) - ITmedia NEWS
参考: 山宮隆 | Ogaki Mini Maker Faire 2022
参考: カラクリ計算器とは何か? - 言語ゲーム
後編は以上です。
バックナンバー(2024年度第1四半期)
- 20240306 method_missingの引数を'...'に置き換え、JRuby Prism、Sidekiqのしくみほか
- 20240228 Rails 8でSprocketsがPropshaftに置き換わる、devcontainerサポートほか
- 20240227後編 Turbo Nativeアプリ、書籍『Everyday Rails Testing with RSpec』新版執筆開始ほか
- 20240221前編 form_withのmodelオプションへのnil渡しが非推奨化、Dockerfileでjemallocが有効にほか
- 20240207後編 aws-sdk-rubyの全gemにRBSファイルが追加ほか
- 20240206前編 Pumaのデフォルトスレッド数変更、Rails 1.0をRuby 3.3で動かすほ
- 20240125後編 RailsコントローラのparamsはHashではない、ruby-enumほか
- 20240123前編 Railsの必須Rubyバージョンが3.1.0以上に変更ほか
- 20240119後編 Ruby 3.3でYJITを有効にすべき理由、Turbo 8の注意点8つほか
- 20240117前編 Rails 8マイルストーン、2023年のRails振り返り、Solid Queueほか
ソースの表記されていない項目は独自ルート(TwitterやはてブやRSSやruby-jp SlackやRedditなど)です。
週刊Railsウォッチについて
TechRachoではRubyやRailsなどの最新情報記事を平日に公開しています。TechRacho記事をいち早くお読みになりたい方はTwitterにて@techrachoのフォローをお願いします。また、タグやカテゴリごとにRSSフィードを購読することもできます(例:週刊Railsウォッチタグ)