- Ruby / Rails関連
週刊Railsウォッチ(20200825後編)Rubyクラスライブラリをgem化、Rubyテストフレームワークrr、ChromebookでWindowsが動くほか
こんにちは、hachi8833です。jnchitoさんのブログで週刊Railsウォッチをおすすめいただきました。ありがとうございます!
今日書いたブログです。これといった銀の弾丸はないかもしれませんが、僕が今までやってきたことはこんな感じです〜。
【Ruby初心者向け】伊藤さんってなんでそんなにRubyについて物知りなんですか?への回答 - give IT a try https://t.co/4xAdq0m27E
— Junichi Ito (伊藤淳一) (@jnchito) August 24, 2020
- 各記事冒頭には⚓でパーマリンクを置いてあります: 社内やTwitterでの議論などにどうぞ
- 「つっつきボイス」はRailsウォッチ公開前ドラフトを(鍋のように)社内有志でつっついたときの会話の再構成です👄
⚓Ruby
⚓Rubyのキーワード引数でdouble splat **
を使う(Hacklinesより)
# 同記事より
class Action::AnalyseDiff
def initialize(before: nil, after:, repository:, **kwargs)
@before = before
@after = after
@repository = repository
end
def call
# git_diffで何か解析する
end
private
def git_diff
@git_diff ||= if single_commit?
# コミットを1件取得
else
# beforeとafterの間のコミットを取得
end
end
def single_commit?
@before.present?
end
end
event_1 = {
action: 'push',
after: 'a-sha-of-a-git-commit',
repository: 'MikeRogers0/SampleRepo',
# ..
}
event_2 = {
action: 'pull_request',
before: 'a-sha-of-a-git-commit',
after: 'a-sha-of-a-git-commit',
repository: 'MikeRogers0/SampleRepo',
# ..
}
Action::AnalyseDiff.new(**event_1.to_h).call
Action::AnalyseDiff.new(**event_2.to_h).call
つっつきボイス:「ハッシュを渡すときはdouble splat(**
)を付けないと互換性を取れないというのはこれまでもさんざん指摘されてましたね↓」「最近になってRubyを2.7にアップグレードした人が慌ててこの辺の記事を見に来てたりして」
参考: Separation of positional and keyword arguments in Ruby 3.0
⚓rr: Rubyのテストダブルフレームワーク
以下のツイートで知りました。
Ryzenのマシンを手に入れたら、AMD CPUではrrが動作しないことを発見した。これはよくない。
— Yukihiro Matsumoto (@yukihiro_matz) August 20, 2020
つっつきボイス:「rrっていうテストダブルフレームワークを初めて知ったので」「使ったことはないかもだけど見たことはあるかも」「モックとかスタブとかはひととおり持ってるみたい」
# メソッドにexpectationを1つ作成
mock(object).foo
mock(MyClass).foo
# メソッドにexpectationを1つ作成し、常に値を返すようスタブ化
mock(object).foo { 'bar' }
mock(MyClass).foo { 'bar' }
# メソッドにexpectationを特定の引数付きで1つ作成し、それで呼ばれたときに常に値を返すようスタブ化
mock(object).foo(1, 2) { 'bar' }
mock(MyClass).foo(1, 2) { 'bar' }
「どこで使われているんでしょう?」「Wikiを見ると、RubyGems.orgとかKaminariとかCanCanとかで使われてるということはそれなりにメジャーなのかも?」「お〜」「Wikiの日付が2014年なので今はもっとあるかもしれませんけど」「使わなくなったものもあったりして」
RR use a special performance counter only intel CPU have. I’ll talk about that on my RubyKaigi talk.
— Lin Yu Hsiang (@johnlinvc) August 20, 2020
「上のツイート↑がrrがAMDで動かなかった理由だそうです」「あ〜なるほどCPUのパフォーマンスカウンタね!」
「パフォーマンス測定のときに通常の時分秒を使うと粒度が荒すぎて正確に測定できないので、インテルCPUのパフォーマンスカウンタのレジスタから値を取ってきて実行の命令数を調べるというのはよく行われるんですよ」「そうそう」「インテルCPUのレジスタから値を取ってきているので、当然インテルCPUじゃないと動かないでしょうし」「rrにはまだこのissueが上がってないみたい👀」
「こうやってCPUのレジスタから値を取るというのは一種のベストプラクティスとして広く行われているので、AMDで動かない問題は他のところでも影響出るかもしれませんね」
「回答者はこのネタでRubyKaigiで話すんですって」
追記(2020/08/25): 以下のご指摘をいただきました。冒頭のrrとrr-projectは別物でした。訂正いたします。
週刊Railsウォッチ(20200825後編)Rubyクラスライブラリをgem化、Rubyテストフレームワークrr、ChromebookでWindowsが動くほか https://t.co/KGSduq6PSj
AMDで動かない rr はテストフレームワークgem ではなく↓ですhttps://t.co/8YTAHrRB32— Yukihiro Matsumoto (@yukihiro_matz) August 25, 2020
⚓Rubyの変数
Quoraはじめて使って質問を投稿しました / Rubyで未定義のローカル変数を呼び出すとNameErrorになり、未定義のインスタンス変数を呼び出すとnilが返る理由はなんですか? - Quora https://t.co/NLgkgnZjLB
— ima1zumi (@ima1zumi) August 18, 2020
つっつきボイス:「ああ、この質問は定期的に話題になりますね」「それにMatzが自ら答えているのがスゴい」「いきなり天からのお告げを受けたみたいな⛩」「未定義のローカル変数を呼ぶとエラーだけど未定義のインスタンス変数だとnilになるというのは、もう『Rubyではそうなっているから』としか言いようがない」「今さら変えられなさそうな仕様ですね...」
A: Ruby開発開始時からの基本的な原則として、宣言されるもの(定数、ローカル変数、メソッド)は未定義アクセスはエラー、宣言されないもの(グローバル変数、インスタンス変数、HashやArrayの要素)の未定義アクセスはnilという風に決めました。すごく深い理由があったわけではなくて、Perlを参考にしただけですが。
今思えば、ここをnilでなく、エラーにしておけば間違いが見つけやすかったかもしれませんね。でも、initializeで毎回すべてのインスタンス変数の初期化が強制されるのは、やっぱりRuby的ではなかったかもしれません。
「ローカル変数の宣言?」と思った人もいるかもしれませんが、Rubyの文法上、そのスコープでの最初の代入がローカル変数の宣言になります。
Quoraより
⚓Rubyのクラスライブラリをgem化しよう(Hacklinesより)
つっつきボイス:「libの下とかに置いているクラスライブラリをgem化しようぜという記事ね」「可能ならgemにするのはいいでしょうね👍」「kazzさんもRailsでこうやってgemに切り出すのが好きですね」「プライベートgemにするとアクセス権限の扱いとかがちょい面倒になったりはしますけど、それでもgemにする方が美しいし、Railsアプリのコードがひたすらファットになるよりはgem化する方がいいでしょうね」
⚓その他Ruby
RubyKaigi Takeout 2020の公式ノベルティの配布(販売)を開始しました!
今回はオンライン開催のため、参加者の皆様におかれましては、必要なノベルティは各自オンラインで確保してください。
お値段は基本実費ですが、Kaigiの運営をご支援いただけるスペシャルな課金アイテムもご用意しております! https://t.co/HX89I1HalF— Akira Matsuda (@a_matsuda) August 19, 2020
つっつきボイス:「おっと、ノベルティまだ買ってなかった」「ピザグッズ買うとRubyKaigiに貢献できるんですよね」
「Tシャツの周りにアイコンが飛び交ってる↓けど、買うと出るのかな?それとも何か押すと出るのかな?」「どっちだろう?」「ちりばめられたい方はご購入よろしく〜」
⚓言語/ツール/OS/CPU
⚓書籍『作ろう!CPU』(予約受付中)
つっつきボイス:「まだ発売されてないんですけど、サポートページがえらく充実してたので買う気になっちゃいました」「FPGAのキットを買えば自分もCPUを組めるようになるという感じの本みたい」「老眼なので本当はKindleで欲しいんですけど」「みんなKindleでいいと思われると紙の本が出版できなくなったりして」「私は紙の本がいいです(キリッ」
参考: FPGA - Wikipedia
「そういえば同人誌でCPU自作する人たちがいましたけど、もしかすると彼ら...?」「それこそ東大にはガチでCPUを作る授業があったりしますね↓」「『ほんとうの』が付いてるのがスゴい😳」
参考: 東大 理学部情報科学科/大学院情報理工学系研究科|情報科学科NAVIgation
参考: CPU実験 -- ほんとうのコンピュータ自作(PDF)
「通称『CPU実験』、CPU作るだけじゃなくてコンパイラまで作ったりするという東大の名物授業」「ハードもソフトも全部作るって、クレイのスパコンみたいなことやってるんですね」「最後はチームごとに速度を競ってるし🏎」「いいな〜楽しそうだな〜」
⚓その他
⚓ChromebookでWindows
つっつきボイス:「ChromebookでWindowsが動くというのは、要するにParallels DesktopがChromebookで動くようになるということね」
⚓Chromebookよもやま話
「ところでChromebook Enterpriseって、Chromebookでここまでやるか?みたいなスペックですよね」「高いんでしょうか?」「メモリ32GBとか、スペックがもうノートPC並ですし」「32ですか〜?!」「Chromebookの安かろう遅かろうみたいなイメージを吹っ飛ばしてくるところはありますね」「インテルCPUだけかと思ったらx64のAMDもあるのね」「値段が気になります〜」
参考: ビジネス向け Chrome 搭載デバイス | Chrome Enterprise | Google Cloud
参考: x64 - Wikipedia
「社内でも話題にしたんですけど、Chromebookって通常のノートPCと比べてキッティングがすごくやりやすいじゃないですか: ノートPCを作業者に渡すとできることが多すぎるので、アプリのほかにセキュリティソフトやらシステム管理ソフトやらを1台ずつセットアップしてからじゃないと渡せなくて管理が面倒なんですけど、ChromebookならG-Suiteかストアを使ってもっと楽にキッティングできるんでしょう、きっと」
参考: キッティングとは - 意味の解説|ITトレンドのIT用語集
参考: Chromebooks for Business -- 管理された Chromebook を使う(PDF)
「社員がChromebookで十分作業できるなら、大きな企業や組織のシステム管理部門は確実に今までより楽できるでしょうね」「特に昨今のようにコロナでリモートワーク化した企業で大変そうに思えたのはそういうキッティング部門ですし」「物理PCをキッティングしてからユーザーに配布するとなると担当者はどうしても出社しないといけなくなりますし」「ですよね」「しかもリモートワーク前なら社内で使うからよかったけど、今だと社員の自宅に発送する業務まで乗っかってきますし」「キッティングでノートPCに機密データを入れてたら、それの管理やらトラッキングやらでさらに大変そう...」
「Chromebook、企業のキッティング担当者が泣いて喜びそうですよね」「Chromebookなら紛失や盗難のときもOSの標準機能で管理者がリモートでロックしたりデータを消去したりできるでしょうし」「Chrome OSはOSレベルでそういう機能があるからいいですよね: Windowsでもそれ用のソフトを入れればやれますけど」
参考: 紛失したスマートフォンまたはパソコンをロックする、データを消去する - Google Chrome ヘルプ
参考: Google Chrome OS - Wikipedia
⚓番外
⚓数学市民化プロジェクト
つっつきボイス:「数学系の動画チャンネルって思ったよりあるんだなと思って、あとでサブスクしようかなと」「数学系YouTuberとは一体😆」「そこ気になります😆」「数学市民化プロジェクトという企画の一環みたいですね」
「数学の市民化って想像がつきませんけど」「いわゆる『リベラルアーツ』の一科目としての数学ならありそうですけどね」「それならありかも」「リベラルアーツでは、隷属しない自由な市民になるための必要な科目をリストアップしてますけど、そのなかに数学もあったはず」「Wikipediaを見ると文法学・修辞学・論理学の3学、算術・幾何・天文学・音楽、の自由七科ですって」「音楽も入ってるとは」「物理とか化学みたいな科目はリベラルアーツを修めてからだったという」「話はそれからだ、みたいな」「やべ〜何の話だかわからない〜😆」(以下リベラルアーツで延々)
後編は以上です。
バックナンバー(2020年度第3四半期)
週刊Railsウォッチ(20200824前編)「Active Jobスタイルガイド」は有用、SiderがGitLabに対応、eager loading時のselectを修正ほか
- 20200818後編 ruby_jardデバッガがスゴい、RubyオンラインマニュアルにEdit機能が追加、Ruby 2.7のBundlerを消す方法ほか
- 20200817前編 お盆も続くRails改修、Rails 6.1にManyモナドが入る?rails-auth gemでクライアント認証ほか
- 20200811山の日短縮版 RSpec Queueでパラレルテスト、カロリーメイトとRubyのコラボ、Rubyのcoercionほか
- 20200804後編 「RubyKaigi Takeout 2020」9月オンライン開催、メールバリデータtruemail、Gitのmasterが変更可能にほか
- 20200803前編 書籍『パーフェクトRuby on Rails』増補改訂版、マルチDBで抽象クラスをscaffold生成、GitLabがPumaに乗り換えほか
- 20200721後編 『パーフェクトRuby on Rails』増補改訂版発売間近、scan_left gemでレイジーなinjectほか
- 20200720前編 10月開催「Kaigi on Rails」CFP募集中、enumにデフォルト値設定機能、RailsでBitemporal Data Modelほか
- 20200714後編 ruby-warning gemでワーニングを手軽に抑制、rubocop -aの振る舞いが変わる、書籍『MySQL徹底入門 第4版』ほか
- 20200713前編 rspec-openapiでスキーマ自動生成、Rails Architect Conf動画、
where()
ハッシュキーに比較演算子条件を書ける機能ほか - 20200707後編 Rubyで無名structリテラル提案、書籍『AWS認定ソリューションアーキテクト』、21世紀のC言語ほか
- 20200706前編 Railsでのマルチテナンシー実装戦略を比較、Railsでサブクエリを使う、URI.parserが非推奨化ほか
今週の主なニュースソース
ソースの表記されていない項目は独自ルート(TwitterやはてブやRSSやruby-jp SlackやRedditなど)です。