- Ruby / Rails以外の開発一般
READ MORE
こんにちは、hachi8833です。今週はJavaScriptのニュースが目につきました。
個人的にはRegExpの高速化が気になりました。早くJavaScriptの正規表現がPCRE並になって欲しいものです。
Railsでよく使われるtherubyracerではlibv8が使われていますが、以前に比べると随分安定するようになったとの声がありました。libv8でググると当時ハマった人たちの声が多数見つかります。
現時点のレンダリングエンジン/ブラウザごとのJavascript engineがどれなのかわかりにくかったのでまとめてみました。
JavaScriptのスプレッド演算子はたとえば以下のようなものです。
//javascript spread operator
var arr1 = ['two', 'three'];
var arr2 = ['one', ...arr1, 'four', 'five'];
Rubyでの*
による配列展開と少し似た動作ですね。Rubyではスプラット演算子(splat operator)と呼ばれることもあります。
一同Rubyのスプラット演算子に慣れていることもあってJavaScriptのスプレッド演算子にどよめきの声がありました。Ruby(とPerl)では...
といえば範囲演算子なので、JavaScriptのこの記法にはとまどいを感じる人も多かったようです。
morimorihogeさんがJavaScriptの演算子の優先順位をその場で調べたところ、...
は代入よりも低くなっていました。
なお...
という記法はJavaやC++にもあるそうなので、これらが由来かもしれません。
scope_chain
が非推奨にtenderlove氏のPRがすっととおりました。map().flatten
よりflatten_map
の方がいいよというどこかで見た追伸もありました。
なお社内で聞いてみたところ、scope_chain
を使ったことのある人は見当たりませんでした。
miniTestのテスト実行中にワーニングを表示するかどうかを-w
(--warnings
)オプションで指定できるようになったとのことです。
ActiveRecord::SerializationTypeMismatch
で、エラーの発生した属性を知らせるようになった修正されたのはdeserializerではなくserializerでした。「エラーを出すのは普通deserializerでは?」と思って一同で追ってみると、serializerで処理できないデータをserializeしようとしたときのエラーでした。
なおActiveRecordのserializerで使われるデフォルトのcoder(データ形式)はyaml_columnです。
column_definitions()
クエリをシンプルに書き直して高速化変更箇所ではサブクエリがLEFT JOIN
に修正されています。
through_proxy
がリセットされないことがある問題を修正コミットメッセージより:
has_one :through
アソシエーションをnil
にするとthrough_record
はdestroyされるが、reload
かreset
を明示的に呼ぶまでthrough_proxy
での読み込み対象に含まれてしまう。
through_proxy
がリセットされないと、destroyした読み込み対象がfrozenのままになり、新規レコード作成時にRuntimeError: Can't modify frozen hash
が発生する。
RuntimeError
エラー回避のため、create_through_record
でdestroyされたthrough_record
を再読込する必要がある。
Sidekiqはバックグラウンド処理で広く使われているgemです。Rails 5.0との相性が改良され、Ruby 2.2.2未満のサポートが終了しました。
Sidekiq::Processor
で直接扱うようになるUSR1
からTSTP
に変更してJRubyに対応Sidekiqのオープンソース版gemはLGPLなので普通に利用できますが、バッチやマルチプロセスといった機能は有料です。
resque gemで間に合うことも多いかもしれませんね。
ROMは、ActiveRecordのO/Rマッピングのような感じでデータをオブジェクトとして扱うためのgemです。APIリストを見るとcsvやyamlなどさまざまなデータに対応しています。
それにしても「ROM」という名前はググりにくいですね。
JavaScriptで書かれています。ActionCableのAPIだけ欲しいならRailsでやるより軽くてよいかもしれないという声もありました。
Lite Cableはオープンソースですが、製品版のAny Cableもあります。ページをスクロールしたときのマスコットの動きがかなりかわいくて、私の中で一気にポイント上がりました。
ActionCableはRails以外でも注目を集めているようです。みんなこういうのが欲しかったということなのかもしれません。
nil
を使わずに書くコツを紹介しています。スクリーンキャストですが下にコードと解説があるので普通に読めます。
そういえばいっときnull安全という言葉が駆け巡ったり炎上したりしてました。
「Rubyistは割りとnil
に寛容かも」「nil
が飛んでくることに慣れすぎてしまうのも良し悪し」「Javaのnull
と違ってRubyのnil
はオブジェクトだしずっとタチがよいよね」という声もありました。
昨年の週刊Railsウォッチで取り上げた、Ruby 2.4のハッシュで導入されたオープンアドレス周りをがっつり解説しています。かなり歯ごたえありそうな記事です。
Percona Toolkitに含まれているpt-online-schema-change
コマンドを使ってActive RecordでMySQLのスキーママイグレーションを支援するツールです。
おぴによん記事です。リンク先にあるmatzとリチャード・ストールマンとおぼしきツーショットがコラになってることの方に注目が集まってました。以下はオリジナルです。
https://en.wikipedia.org/wiki/Yukihiro_Matsumoto#/media/File:Matz.jpgより
最初Learn how to achieve parallelism with Ruby MRI using I/O bound threadsにしようかと思ったのですが、同記事でリンクしていたこの記事の方がよかったのでこちらにしました。
同記事の「30秒でわかるGIL」より:
MRIにはGIL(global interpreter lock)と呼ばれるしくみがあり、Rubyコードの実行周りをロックする。これにより、マルチスレッドのコンテキストでは一度にひとつのスレッドしかRubyコードを実行できなくなる。
たとえば8コアのマシンで8つのスレッドが動作しているとすると、一度に1つのコアしか動かないことになる。GILはRuby内部を競合状態から守り、データの破損を防ぐためにある。
GILはGVL(Giant VM Lock)とも呼ばれます。
GILの例として、配列への追加が実装によってはスレッドセーフでないことが挙げられています。
# Nobody understands the GIL より
array = []
5.times.map do
Thread.new do
1000.times do
array << nil
end
end
end.each(&:join)
puts array.size
結果、MRIは正常に動作(「5000」が出力)しましたが、JRubyとRubinius(rbx)は正常に動作しませんでした。
私の環境でも同様の結果が得られました。
よくあるベンチマークサイトのようですが、聞いたこともないようなWebフレームワークやWebフレームワークと呼んでいいのかどうか迷うようなエントリが大量に並んでいます。眺めて首を傾げて楽しむ感じでしょうか。
上のサイトとは関係ありませんが、こんなツイートがありました。
@zaikoninnng ulib-postgresってweb frameworkなの?
— tetsuのクロック (@tetsu_614) 2015年6月17日
Go 1.8リリースを来週に控え、予定されている新機能などを紹介するスライドが公開されました。
スライドに出てきたSSAって何だろうと思ったら、静的単一代入のことでした。
今週は以上です。
ソースの表記されていない項目は独自ルート(TwitterやRSSなど)です。