Clik here to view.

こんにちは、hachi8833です。RubyKaigi 2019はもう目前ですね。
- サイト: RubyKaigi 2019
つっつきボイス:「(つっつき時点→)RubyKaigiもう来週ですか!」「早いな〜Image may be NSFW.
Clik here to view.」「改めて説明すると、RubyKaigiはRubyのコアな話を3日間にわたって聞ける年1回開催のカンファレンスです」「ここ数年は日本の地方都市を巡回していて、今年は博多で開催されます」「今回は参加しませんが、もし行ってたらコアな話についていけるかしらImage may be NSFW.
Clik here to view.」「そこも楽しさのひとつだと思いますImage may be NSFW.
Clik here to view.: 『ここまでやる人がいるんだ』みたいな驚きがありますし」「個人の感想ですがImage may be NSFW.
Clik here to view.、参加するたびにモチベが急上昇しましたImage may be NSFW.
Clik here to view.: 自分も何かやれるんじゃないかという気持ちが沸々とわいてくるというか」
RejectKaigi2019も東京と博多の同時開催で盛り上がったようです。
先日のRejectKaigiでのRubyKaigiタイムテーブル徹底解説のメモを書きました。
全然メモしきれてないのですが、わたしみたいなRubyKaigi初心者の方の、少しでもお役に立てば大変幸いです!https://t.co/nDp0eshbj5— makicamel (@makicamel) April 14, 2019
- 各記事冒頭にはImage may be NSFW.
Clik here to view.でパーマリンクを置いてあります: 社内やTwitterでの議論などにどうぞ
- 「つっつきボイス」はRailsウォッチ公開前ドラフトを(鍋のように)社内有志でつっついたときの会話の再構成ですImage may be NSFW.
Clik here to view.- 毎月第一木曜日に「公開つっつき会」を開催しています: お気軽にご応募ください
Image may be NSFW.
Clik here to view.
Rails: 先週の改修(Rails公式ニュースより)
今回はコミットログから見繕いました。
Image may be NSFW.
Clik here to view.
モデルJOINのbelongs_toのautosave: true
で無効なレコードが保存される問題を修正
autosave: true
の循環を修正インスタンス変数ではなく、
activerecord/lib/active_record/autosave_association.rb
のsave_collection_association
メソッドでローカルな変数を使うようにする。以前は、
autosave: true
がいくつも循環していた場合に、has_many
関連付けのコールバックが、同じ関連付けの同じコールバックの別のインスタンスが実行完了していないにもかかわらず、実行されてしまっていた。
コールバックの最初のインスタンスに制御が戻った時点でインスタンス変数が改変され、以後、関連するレコードが正しく保存されなかった。特に、has_many
に対応するbelongs_to
のIDフィールドがnil
になる。
同PRより大意
つっつきボイス:「autosave: true
ってやったことないImage may be NSFW.
Clik here to view.」「↓ここがポイントのようです」
# activerecord/lib/active_record/autosave_association.rb#L385
+ # インスタンス変数をローカル変数に保存することで
+ # コールバック全体をリエントラントにして#28080を修正する
+ new_record_before_save = @new_record_before_save
...
- if records = associated_records_to_validate_or_save(association, @new_record_before_save, autosave)
+ if records = associated_records_to_validate_or_save(association, new_record_before_save, autosave)
「インスタンス変数をいったんローカル変数に入れる…?パッと見あまり意味がなさそうに見えるけど、マルチスレッドの文脈でインスタンス変数が共有されておかしくなってたのを修正したとかそんな感じかな?Image may be NSFW.
Clik here to view.」「インスタンス変数が他から変更されてたのに保存できちゃってたとか」「そういう感じですね」「その割には
dup
してないしな〜: インスタンス変数を引き回さないという意味でこの書き方は正しいんだけど、これでバグが直るのかどうかまだピンとこないImage may be NSFW.
Clik here to view.」「とりあえず次行きましょう〜」
よく見たら2017年2月にオープンしたプルリクなので長い旅でしたね。久しぶりにy-yagiさんブログを覗いてみました。
参考: rails commit log流し読み(2019/04/10) - なるようになるブログ
autosave: trueが指定されている、かつ、参照が循環しているassociationがあった場合に、idの指定が無い不正なjoin recordが生成されてしまうバグがあったのを修正しています。
同ブログより
Image may be NSFW.
Clik here to view.![⚓]()
==
とハッシュメソッドのアロケーションを削減
# 同PRより
Warming up --------------------------------------
Orginal == 66.978k i/100ms
Orginal #hash 38.182k i/100ms
New == 165.441k i/100ms
New #hash 145.549k i/100ms
Calculating -------------------------------------
Orginal == 846.966k (± 4.4%) i/s - 4.287M in 5.073426s
Orginal #hash 457.440k (± 7.2%) i/s - 2.291M in 5.038573s
New == 2.877M (± 7.3%) i/s - 14.393M in 5.032400s
New #hash 2.366M (± 8.1%) i/s - 11.789M in 5.018887s
つっつきボイス:「3倍から5倍ぐらい速度改善してますねImage may be NSFW.
Clik here to view.」「ダブルイコール!」「改善前は
attributes_for_hash
でいっぱいオブジェクトが作られてたということかな?」
# activerecord/lib/active_record/connection_adapters/column.rb#L64
def ==(other)
other.is_a?(Column) &&
- attributes_for_hash == other.attributes_for_hash
+ name == other.name &&
+ default == other.default &&
+ sql_type_metadata == other.sql_type_metadata &&
+ null == other.null &&
+ default_function == other.default_function &&
+ collation == other.collation
end
alias :eql? :==
def hash
- attributes_for_hash.hash
+ Column.hash ^
+ name.hash ^
+ default.hash ^
+ sql_type_metadata.hash ^
+ null.hash ^
+ default_function.hash ^
+ collation.hash
end
+ protected
+
+ def attributes_for_hash
+ [self.class, name, default, sql_type_metadata, null, default_function, collation, comment]
+ end
end
「#==
の修正後は&&
で結んでますね」「個人的にはここで&&
で結ぶのはあまり好きじゃなくて、attributes_for_hash
で書きたい方ではある: 項目がどんどん増えたらここに足すのってあまり見た目が麗しくないというか」「それもそうですね」「これ以上項目が変わらないならともかくですがImage may be NSFW.
Clik here to view.」
「#hash
の方は^
でつないでますね」「^
ってなんだっけ…論理演算か」「XOR!」「attributes_for_hash.hash
の右の#hash
は、ハッシュ値のハッシュですね: 左はRubyのデータ構造としてのハッシュ」「右と左でhashの意味が違うってややこしい〜Image may be NSFW.
Clik here to view.」「こわ〜いImage may be NSFW.
Clik here to view.」
「attributes_for_hash
が削られたということはコストが高かったんかな〜: attributes_for_hash
って配列を返してたから、配列のコストが高かった?」「あーそうか!変更後みたいに直に比較しちゃえばアロケーションが発生しないと」「個人的にはmap
でやってもいいんじゃね?と思ったりもするけどっImage may be NSFW.
Clik here to view.」
「項目が固定しているから直接比較しようという、絵に描いたようなチューニングですね: 業務コードとかだとこう書きたくはない気持ちImage may be NSFW.
Clik here to view.」「どうやらここではメモ化も効かなさそうか」
「これまで話を聞いてきてだんだん見えてきたんですけど、最初から最適化でやろうとしないのが大事なんですね」「そうそうImage may be NSFW.
Clik here to view.: 最初から変に速度出そうとすると、ぴよコードImage may be NSFW.
Clik here to view.が量産されちゃって読むのも直すのもつらくなるから、最初は素直に書こうねImage may be NSFW.
Clik here to view.」
Image may be NSFW.
Clik here to view.
ルーティングに named_capture
を追加
- PR: Adds named_captures to MatchData to emulate Regex by baweaver · Pull Request #35913 · rails/rails
# actionpack/lib/action_dispatch/journey/path/pattern.rb#L139
+ def named_captures
+ @names.zip(captures).to_h
+ end
つっつきボイス:「ビーバー大好きな@baweaverさんが足した、名前付きキャプチャだけ取り出す機能みたいです」「名前付きキャプチャって何だっけImage may be NSFW.
Clik here to view.」「正規表現でたまに使う、かっこ
()
内のマッチを$1
とか\1
みたいに登場順序の数字で参照する代わりに、たとえば(?<名前>正規表現)
と書くと\k名前
みたいに名前で参照できるヤツですね」「それか!」「名前付きキャプチャは使いすぎると読みづらくなるし、正規表現ごとに方言があってめんどくさいんで自分はあまり使いませんがImage may be NSFW.
Clik here to view.」
# actionpack/test/journey/path/pattern_test.rb#L284
+ def test_named_captures
+ path = Path::Pattern.from_string "/books(/:action(.:format))"
+
+ uri = "/books/list.rss"
+ match = path =~ uri
+ named_captures = { "action" => "list", "format" => "rss" }
+ assert_equal named_captures, match.named_captures
+ end
「それを、正規表現の方で名前さえ付けておけばいきなりハッシュで取れるということねImage may be NSFW.
Clik here to view.」「名前付きキャプチャをいちいち正規表現で取り出さなくても、最初からハッシュの形で取れるのがよさそうImage may be NSFW.
Clik here to view.」「ショートハンド増やした感」「
zip
は引数を配列の配列に変換するのか」「それをto_h
してるだけ」
参考: instance method Array#zip (Ruby 2.6.0)
自身と引数に渡した配列の各要素からなる配列の配列を生成して返します。 生成される配列の要素数は self の要素数と同じです。
ブロック付きで呼び出した場合は、 self と引数に渡した配列の各要素を順番にブロックに渡します。
ruby-lang.orgより
# ruby-lang.orgより
p [1,2,3].zip([4,5,6], [7,8,9])
# => [[1, 4, 7], [2, 5, 8], [3, 6, 9]]
Image may be NSFW.
Clik here to view.
Zeitwerkの互換用ActiveSupport::Dependencies
でのautoloaded_constants
やautoloaded?
の実装をやめた
Zeitwerkの
ActiveSupport::Dependencies
の互換性インターフェイスでautoloaded_constants
やautoloaded?
を実装しなくなった(元々ドキュメントないし)。実験したところ、introspectionのユースケースはさして多くないし、トラブルシュートはログで行われる。この設計上のトレードオフにより、どの環境でもメモリ使用量が削減される。
Xavier Noria
# activesupport/lib/active_support/dependencies/zeitwerk_integration.rb#L24
- def autoloaded_constants
- cpaths = []
- Rails.autoloaders.each do |autoloader|
- cpaths.concat(autoloader.loaded_cpaths.to_a)
- end
- cpaths
- end
-
- def autoloaded?(object)
- cpath = object.is_a?(Module) ? object.name : object.to_s
- Rails.autoloaders.any? { |autoloader| autoloader.loaded?(cpath) }
+ def to_unload?(cpath)
+ Rails.autoloaders.main.to_unload?(cpath)
end
つっつきボイス:「こういう改修するにはいいタイミングかもImage may be NSFW.
Clik here to view.」「ZeitwerkはRails 6で新しく入るオートローダーです↓」「と週刊Railsウォッチに書いてあったImage may be NSFW.
Clik here to view.」
「morimorihogeさんの説明を記憶ベースで再現すると、現在のRailsでは名前空間とか定数読み込み順序で、たまにとてもわかりにくいバグが発生することがあって↓、Zeitwerkはそのあたりを解決するためのものだそうです」
週刊Railsウォッチ(20181022)Railsの名前空間地獄とrequire_dependency、PostgreSQL 11がリリース、clean-rails.orgほか
「Zeitwerk(ツァイトヴェルク)という名前はスイスの時計メーカーから取ったようで、日本的な感覚で言うとセイコーみたいな感じでしょうかImage may be NSFW.
Clik here to view.」「それ以前に文字から発音がわからないですImage may be NSFW.
Clik here to view.」「ドイツ語のZ(ツェット)って英語のZ(ズィー、ゼット)よりずっと軽くて、逆にSの方がズみたいに濁る感じですね」「逆さま感Image may be NSFW.
Clik here to view.」「あとドイツ語のWは英語のVに近い感じで、Wolfもドイツ語っぽく言うとヴォルフみたいな音になりますね: そういう変換をかけるとドイツ語っぽくなるといえばなりますImage may be NSFW.
Clik here to view.」
参考: Z -ツェット- - Wikipedia
参考: 誤用戦士ガンダム・荒野を走るニセドイツの列! | ドイツ情報満載 − Young Germany Japan by ドイツ大使館 — 名エッセイですImage may be NSFW.
Clik here to view.
Image may be NSFW.
Clik here to view.
カラムオブジェクトからtable_name
を削除して身軽に
# activerecord/lib/active_record/connection_adapters/column.rb#L5
module ConnectionAdapters
# An abstract definition of a column in a table.
class Column
- attr_reader :name, :default, :sql_type_metadata, :null, :table_name, :default_function, :collation, :comment
+ attr_reader :name, :default, :sql_type_metadata, :null, :default_function, :collation, :comment
つっつきボイス:「kamipoさんのconnection_adapter修正です」「リファクタリング?」「table_name
を削ってるから違うっぽい」「オブジェクトひとつ削ったけど他でできるからいいよね、みたいな」
「カラムはテーブル名と依存関係が元々あるから、カラムにいちいちtable_name
置かなくてもわかるでしょというのはワカル」「たしかに〜」「カラムはテーブルに紐づくんだからカラム単独で何かするというのも考えにくいし、単独で使ったとしてもそこでtable_name
が欲しいとも考えにくいし」「今までカラムの数だけtable_name
持ってたとしたら冗長ですね」「設計上はカラムでtable_name
持つ可能性がないわけではないけど、実用上いらないんじゃね?という感じImage may be NSFW.
Clik here to view.」
Image may be NSFW.
Clik here to view.
Doc: t.integer
をt.bigint
に修正
# guides/source/association_basics.md#L394
create_table :accounts do |t|
- t.integer :supplier_id
+ t.bigint :supplier_id
t.string :account_number
t.timestamps
end
つっつきボイス:「ドキュメントのt.integer
をt.bigint
に書き換えるという修正です: これ、ある時期に変わってましたよね?」「そうそう、変わってた↓」「うっかり真似されないようにしないとImage may be NSFW.
Clik here to view.」
そういえばこんなツイート↓を昔のウォッチに貼りました。
Friends don't let friends use INT as a primary key. Btw you can find out where you accidentally did this, run $ heroku pg:diagnose
— Richard Schneeman Image may be NSFW.
Clik here to view.(@schneems) May 13, 2016
「integerだと基本的に桁数が足りなくなる可能性があるんですよ」「IDとかはbigintにしておかないと、最初のうちはよくても忘れた頃に足りなくなるみたいな」「なのでデータベースのIDでintegerは割とマズいですねImage may be NSFW.
Clik here to view.」
「その意味で、UUIDって型できないかな〜Image may be NSFW.
Clik here to view.って思うし」「それ欲しいかも!」「特にRailsだとURLに出てくることが多いから、UUIDの方が適切な場合ってあるんですよね」「記事のページぐらいだったらURLに数字出てもいいけど、ユーザーIDとか生で出したくないし」
参考: PostgreSQL 10.5文書 8.12. UUID型
参考: UUID()
— MySQL :: MySQL 5.6 リファレンスマニュアル :: 12.18 その他の関数
参考: Rails の UUIDプライマリキーを試す - Qiita
Image may be NSFW.
Clik here to view.
Rails
Image may be NSFW.
Clik here to view.
マイグレーションで本番データに触る方法(Ruby Weeklyより)
# 同記事より
class AddSlugsToPosts < ActiveRecord::Migration[5.2]
# 最初に、データのマイグレーションに使うモデルを定義
class Post < ActiveRecord::Base
belongs_to :user
end
class User < ActiveRecord::Base
has_many :posts
end
def up
# 次にカラムを追加してNULL許容にする
add_column :posts, :slug, :string, null: true
# 次に新しいカラムがモデルに拾われるようにする
Post.reset_column_information!
Post.includes(:user).find_each do |post|
# 次にslugをセットしてpostをsave
post.slug = post_slug(post)
post.save!
end
# 次にカラムをNull非許容にする
change_colum_null :posts, :slug, false
end
def down
remove_column :posts, :slug
end
def post_slug(post)
# 重要: productionのモデルから、マイグレーションの書き込みに使った
# title-to-slugアルゴリズムをコピーすること
end
end
つっつきボイス:「この記事の人は、マイグレーションの中でActive Recordモデルを作るというやり方をしてるみたいです」「あ〜こういうのをマイグレーションの中で使ってるのか: 何だかよくない気はするけど、やりたい気持ちはワカル気がする」
「記事の中でreset_column_information!
ってのやってるImage may be NSFW.
Clik here to view.: こんなのあったのね↓」
参考: migration の中で model を触ったら必ず reset_column_information する - onk.ninja
「どうやらこの人がやりたいのはデータマニピュレーションなのね」「スキーマではなく、ということなのでそうみたいです」「う〜ん、これはマイグレーションでやることと違う気がするな〜: 自分はRailsのマイグレーションにはDDL(データ定義言語)を書くべきであって、DML(データ操作言語)は別のところに書くべきだと思ってるし」「DDLやDMLって、データベーススペシャリストの試験問題に出てきましたね」「そうそう、SELECTやINSERTやUPDATEやDELETEがDMLに相当しますImage may be NSFW.
Clik here to view.」
参考: SQLの種類(DDL、DML、DCL) | 酒と涙とRubyとRailsと
「記事の人はpost_slug(post)
を書いてるからマニピュレーションしたいんだと思うんですが、マイグレーションでこれをやるのはアブナイ気がするImage may be NSFW.
Clik here to view.」「こういう操作はやっぱりバッチを書くべきですか?」「自分だったらバッチ書くな〜: まあそういう運用のシステムがないとも言えませんけどImage may be NSFW.
Clik here to view.」
babaさんの以前の記事↓にも『Active Recordのモデルをマイグレーションで使わない方がいい』と書かれていたのを思い出しました。
「そうそう、記事にもあるけど、テーブルにカラムを追加したときってたいてい値が入ってて欲しいんですよ〜: こうやってみたい気持ちはワカル」「デフォルト値とか?」「でもデフォルト値では間に合わないこともあったりするんで、そういうときは2回マイグレーションしたりするんですよ」「あー、以前のウォッチ↓で、巨大なテーブルへのマイグレーションでいきなりデフォルト値とかの制約を付けると本番でその間テーブルがロックされるから作業を分割しよう、みたいな話がありましたけど、それですね」「そうそうImage may be NSFW.
Clik here to view.」
週刊Railsウォッチ(20190121)Rails 6.0.0 beta1リリース、Railsは2019年も「あり」か、Jetsでサーバーレス、ES2018の新機能、RSpecの心ほか
「たとえば最初はNOT NULL制約なしでカラムを追加して、別途バッチで値を入れて、それからNOT NULL制約を付ける、みたいにやるのが安全」「ですよね」「それをやりたくないとたぶんこの記事みたいなやり方になるImage may be NSFW.
Clik here to view.」「Image may be NSFW.
Clik here to view.」「いい悪いということじゃないんだけど、自分は作業を分割しないとコワいImage may be NSFW.
Clik here to view.」
Image may be NSFW.
Clik here to view.
Image may be NSFW.
Clik here to view.
still_life: テストの画面HTMLをRailsバージョンごとに保存(Ruby Weeklyより)Image may be NSFW.
Clik here to view.![🌟]()
- リポジトリ: amatsuda/still_life
@amatsudaさんがheavens_doorに続いてまた新しいgemを作りました。
- リポジトリ: amatsuda/heavens_door
つっつきボイス:「amatsudaさんの新作です: これヒットじゃないかと思うんですがどうでしょう?」「おぉ?」「Railsをバージョンアップするときにこれでテストを走らせて、そのバージョンで吐き出されるHTMLをバージョン名を付けて保存しておくというもののようです」「お〜なるほど!これはワカル〜Image may be NSFW.
Clik here to view.」
# 同リポジトリより
% STILL_LIFE=rails52 rails test:system test
% tree tmp/html
tmp/html
└── rails52
└── test
├── controllers
│ ├── users_controller_test.rb-14.html
│ ├── users_controller_test.rb-20.html
│ ├── users_controller_test.rb-27.html
│ ├── users_controller_test.rb-32.html
│ ├── users_controller_test.rb-37.html
│ ├── users_controller_test.rb-43.html
│ └── users_controller_test.rb-9.html
└── system
├── users_test.rb-14.html
├── users_test.rb-18.html
├── users_test.rb-21.html
├── users_test.rb-25.html
├── users_test.rb-26.html
├── users_test.rb-29.html
├── users_test.rb-32.html
├── users_test.rb-36.html
├── users_test.rb-37.html
└── users_test.rb-9.html
4 directories, 17 files
「たとえばRails 5.1のとき、Rails 5.2のとき、とこうやって画面HTMLが保存されていれば、差分がないかどうかをチェックすることで無事バージョンアップされたかどうかを確認できるということですね」「テストがあればの話だろうけどっImage may be NSFW.
Clik here to view.」
「これならローカルでも気軽に動かせるし、結果が勝手にたまっていってくれるし、うん、これはいいですね~Image may be NSFW.
Clik here to view.」「今までこれがなかったのが不思議」「画面出してくれるテストがあれば、それ以上みっちり書かれてなくてもやれますしね」「やってみたらバージョンアップでやんなるほど差分が出て目を覆いたくなったりしてImage may be NSFW.
Clik here to view.」「これは有能Image may be NSFW.
Clik here to view.」「標準で入っててもいいぐらいかも」
久しぶりにImage may be NSFW.
Clik here to view.を進呈いたします。ありがとうございます。
Beyond Compare↓とかWinMergeとかを使えばディレクトリごと差分をさっとビジュアルチェックできますねImage may be NSFW.
Clik here to view.。
Rolling Stonesの昔のライブ盤のタイトルが「Still Life」(平穏な生活)でしたね。
「前回のheavens_doorという名前も音楽ネタっぽかったんですが、今回のももしかしてそうかなと思って: amatsudaさんの音楽の趣味についてはまったく知らないので憶測ですImage may be NSFW.
Clik here to view.」「heavens_doorはアニメ系でちょくちょく見るような気もImage may be NSFW.
Clik here to view.: JOJOにもヘブンズドアー出てくるし」「あーそっちかも!」「でもJOJOの元ネタがだいたいもろその時代のロックだったりするしImage may be NSFW.
Clik here to view.」「ですよね: 今やキングクリムゾンってJOJOの方が知られてますしImage may be NSFW.
Clik here to view.」
参考: 岸辺露伴のスタンド「ベブンズ・ドアー」は最強なのか!?能力考察まとめ
参考: キングクリムゾンのスタンド能力って結局なに?【ジョジョ5部ラスボスが強すぎる】 │ NazeNani JillTone
少し前に、本家King Crimsonのツイート↓にJOJOのそれが出てきて軽く話題になったのを思い出しました。
King Crimson's official facebook did a JoJo reference
i dont even know how to react to thishttps://t.co/fuTQ2tYi8f pic.twitter.com/HIgW1TdHk5
— muro Image may be NSFW.
Clik here to view.(@kisomuro) January 7, 2017
Image may be NSFW.
Clik here to view.
react-rails: RailsでReactをスマートに使う(React Statusより)
- リポジトリ: reactjs/react-rails
gem 'webpacker'
gem 'react-rails'
つっつきボイス:「react-railsって初めて見たんですが、WebpackerにもSprokectsにも対応してて、TypeScriptやES6やCoffeeScriptやJSXとも共存できると言ってます」「マジか!じゃ今やってるヤツにこれ入れればReactさっと使える?Image may be NSFW.
Clik here to view.」「今更gemかというのは置いといてもImage may be NSFW.
Clik here to view.、★5000超えてるし」
リポジトリをよく見ると、reactjs公式なんですね。最も古いコミットは2013年でした。
「後はどこまで使えるかですねImage may be NSFW.
Clik here to view.」「どうなってもいいようなアプリで誰か試してみないかなImage may be NSFW.
Clik here to view.」「どっかで使ってみよ」「React自体がアップグレードしたときにどうなるかも気になりますImage may be NSFW.
Clik here to view.」「それはあるImage may be NSFW.
Clik here to view.」
参考: ReactをRailsと共に使う方法 - Qiita
「ところでJSXって何でしたっけ?Image may be NSFW.
Clik here to view.」「MSXではない(キリッ」「前にウォッチでJSXを取り上げたとき、JSXが2つあることに当時気づかなかったのを思い出しましたImage may be NSFW.
Clik here to view.」「どっちだったか忘れたけど、ちょっとキモい書き方だった気がするImage may be NSFW.
Clik here to view.(ウォッチ)」「あ〜、タグの中にコード…イヤな予感Image may be NSFW.
Clik here to view.」「ヤな予感しかしないImage may be NSFW.
Clik here to view.」「ちっちゃく作る前提ならいいんでしょうけどImage may be NSFW.
Clik here to view.」
参考: Introducing JSX – React — ReactのJSX
参考: JSX - a faster, safer, easier JavaScript — DeNAが開発したJSX言語
Image may be NSFW.
Clik here to view.
よく見るRails APIは?
- サイト: Ruby on Rails API
追いかけボイス:「このエントリをつっつくのを忘れてましたImage may be NSFW.
Clik here to view.」「そうだったかもImage may be NSFW.
Clik here to view.」「api.rubyonrails.orgでよく見るAPIって何かあります?」「そうねぇ、APIでというわけじゃないけど
HashWithIndifferentAccess
あたりはよくググるかも」「どもですっ♪」
参考: ActiveSupport::HashWithIndifferentAccess
Image may be NSFW.
Clik here to view.
その他Rails
group :test do
- gem 'selenium-webdriver'
- gem 'chromedriver-helper'
+ gem 'webdrivers'
# other test-only dependencies ...
end
つっつきボイス:「chromedriver-helper
がwebdrivers
に置き換わるというアナウンスが正式に出ました」「ドライバ周りは幸いあまりかかわりなかったしImage may be NSFW.
Clik here to view.」
Image may be NSFW.
Clik here to view.
Ruby
Image may be NSFW.
Clik here to view.
Rubyコードフォーマッター対決(Ruby Weeklyより)
つっつきボイス:「RuFoとplugin-rubyとrubyfmtあたりのフォーマッタを比較しています」「rubyfmtが2種類あるし」
- リポジトリ: ruby-formatter/rufo
- リポジトリ: prettier/plugin-ruby
- リポジトリ: wojtekmach/rubyfmt — gofmtを元にしているけど5年間更新なしImage may be NSFW.
Clik here to view. - リポジトリ: samphippen/rubyfmt — 上とは無関係の新しいgem
つっつきボイス:「RuboCopやRipperの話なんかも混じえて…で結果は『ものによる』Image may be NSFW.
Clik here to view.」「結論じゃないしImage may be NSFW.
Clik here to view.」「判定を避けるImage may be NSFW.
Clik here to view.」「『個人的にはRuboCopかRuFo』だそうですImage may be NSFW.
Clik here to view.」
「rubyfmtはgemですらないスクリプトファイル、RuFoはもう少し洗練されてて、pritter-rubyは最近JSで人気のprettierで動くみたいです」
- リポジトリ: prettier/prettier
Image may be NSFW.
Clik here to view.
Rubyにパッチを当ててテストを高速化(Ruby Weeklyより)
// https://bugs.ruby-lang.org/attachments/download/7717/ruby_gc_malloc_trim.patchより
diff --git a/configure.ac b/configure.ac
index d251da9915..5e2a67db1b 100644
--- a/configure.ac
+++ b/configure.ac
@@ -1825,6 +1825,7 @@ AC_CHECK_FUNCS(lstat)
AC_CHECK_FUNCS(lutimes)
AC_CHECK_FUNCS(malloc_usable_size)
AC_CHECK_FUNCS(malloc_size)
+AC_CHECK_FUNCS(malloc_trim)
AC_CHECK_FUNCS(mblen)
AC_CHECK_FUNCS(memalign)
AC_CHECK_FUNCS(memset_s)
diff --git a/gc.c b/gc.c
index 1331ef21dc..12caa162e7 100644
--- a/gc.c
+++ b/gc.c
@@ -6660,7 +6660,15 @@ gc_start(rb_objspace_t *objspace, int reason)
gc_prof_timer_start(objspace);
{
- gc_marks(objspace, do_full_mark);
+ gc_marks(objspace, do_full_mark);
+#ifdef HAVE_MALLOC_TRIM
+ /* [Experimental] Explicitly free all eligible pages to the kernel. See:
+ *
+ * - https://www.joyfulbikeshedding.com/blog/2019-03-14-what-causes-ruby-memory-bloat.html
+ * - https://bugs.ruby-lang.org/issues/15667
+ */
+ if (do_full_mark) malloc_trim(0);
+#endif
}
gc_prof_timer_stop(objspace);
つっつきボイス:「テスト高速化のためにRubyにパッチ当ててみたそうです」「いかにもメモリをゴニョゴニョしてる感」「malloc_trim()
とか何だかコワいもの持ち出してるしImage may be NSFW.
Clik here to view.」「テストだからと割り切ってザクザク切り刻んでるんでしょうねImage may be NSFW.
Clik here to view.」「わかる〜」「普段はこれでテストちっちゃく回して週一くらいは普通のを回すとか」「どのぐらい信頼できるんでしょうImage may be NSFW.
Clik here to view.」「記事を見ると、メモリ方面の強い人たちといっぱい議論したっぽいですImage may be NSFW.
Clik here to view.」
参考: Man page of MALLOC_TRIM
参考: Cables vs. malloc_trim, or yet another Ruby memory usage benchmark - DEV Community Image may be NSFW.
Clik here to view.Image may be NSFW.
Clik here to view.
Image may be NSFW.
Clik here to view.
その他Ruby
「mrubyバイトコードハンドブック」、きっと書いてあること全部知っているという意味では、私に必要ないけど、せっかく書いてもらった解説を読みたいという意味では、とても欲しい本。
— Yukihiro Matsumoto (@yukihiro_matz) April 9, 2019
つっつきボイス:「mrubyバイトコードハンドブックは技術書典に出る本らしいです」
参考: [DL版]mrubyバイトコードハンドブック - Kishima Craft Works - BOOTH
Rubykaigi参加のためゼミを休む旨をゼミの先生に伝えたら、「面白そうなカンファレンスですね。期間中、ぜひゼミのTwitterアカウントでそれについてツイートしてください」という返信が来た。肯定的な反応をもらえて嬉しいImage may be NSFW.
Clik here to view.— たま い (@a_ta_tama) April 5, 2019
つっつきボイス:「いい先生ですよねImage may be NSFW.
Clik here to view.」
Image may be NSFW.
Clik here to view.
Ruby trunkより
Image may be NSFW.
Clik here to view.
Rustのビルダーが欲しい
つっつきボイス:「RubyのC拡張みたいにRust拡張をビルドしたいということみたいです」「そのうち出てくるかも?」
Image may be NSFW.
Clik here to view.
Unicode 12.1.0がfinalに
つっつきボイス:「Unicode 12.1.0は、Unicode Consorciumが令和年号のためだけにわざわざリリースすることになってたヤツですね」「お世話かけてます!」「お疲れさまです!」「さーせん!」「Image may be NSFW.
Clik here to view.」
参考: Unicode 12.1.0 — 現時点ではDRAFTです
「ちなみに年号はeraですね(Japanese era name)」「era知らないとリリースノート意味わからないしImage may be NSFW.
Clik here to view.」
Image may be NSFW.
Clik here to view.
番外
Image may be NSFW.
Clik here to view.
ブラックホールの撮影に世界で初めて成功
参考: First Image of a Black Hole — GoogleのDoodleにも早速取り入れられています
つっつきボイス:「ニュースでも話題になってましたが、撮影そのものは2年ぐらい前で、それをビジュアライズするための数式に2年かかってたどり着いたということだそうです」「おぉ〜なるほど♪」
あのブラックホール観測では、天文学者ではなくコンピュータサイエンティストである彼女の貢献が大きかったとのこと。研究者の分野横断的協力は今後も大切。Meet Katie Bouman, one woman who helped make the world's first image of a black hole https://t.co/zRkrEKYj3I
— Masahiro Hotta (@hottaqu) April 11, 2019
「あと、一般相対性理論を外宇宙で確認できたという意義もあったみたいです」「相対性理論を覆すのはなかなか大変Image may be NSFW.
Clik here to view.」
皆さまお聞きかしら? 「残念なことに」相対論のほころびが見つからなかったんですのよ。定説が確認されただけだと残念なんですのよ〜〜〜Image may be NSFW.
Clik here to view.— 宇宙物理たんbot@学術系VTuber (@astrophys_tan) April 10, 2019
「これだけ高い確率だと、「今日のオヤツはポンデリングよ」とお母さんがブラックホールを差し出してきても騙される事はないで安心ですね」って千尋の谷に子を突き落とすImage may be NSFW.
Clik here to view.より怖いImage may be NSFW.
Clik here to view.https://t.co/aUWXSc2Yzu
— Dan Kogai (@dankogai) April 12, 2019
今回は以上です。
おたより発掘
おおーほしいやつ
> Railsをバージョンアップするときにこれでテストを走らせて、そのバージョンで吐き出されるHTMLをバージョン名を付けて保存しておくというもののようです https://t.co/C9zBHQY3oO— しいたけ (@shitake4) April 18, 2019
バックナンバー(2019年度第2四半期)
週刊Railsウォッチ(20190408-1/2前編)RubyKaigiの予習資料、Rails「今年ベストのプルリク」、numbered parametersの議論ほか
- 20190408-1/2前編 RubyKaigiの予習資料、Rails「今年ベストのプルリク」、numbered parametersの議論ほか
- 20190402-2/2後編 Apache Arrowとは何か、prop drillingはアンチパターン、Node-REDほか
- 20190401-1/2前編 Rails 5.2.3/5.1.7がリリース、Railsdmの「Railsの正体」、Ruby 2.7のnumbered parameter、新元号「令和」ほか
今週の主なニュースソース
ソースの表記されていない項目は独自ルート(TwitterやはてブやRSSなど)です。
※初出時、
@2はない
といった記述がありましたがミスでした、申し訳ありません。正確には numbered形式(itやthisなどの単語形式ではない)だと@2以降も参照できるが、実際にはそれほど@2以降には需要がないのでは?という話の流れのなかで「需要がない」を「存在しない」に混同したのだと思われます。ご指摘いただいた@pink_bangbiさん、ありがとうございました。