こんにちは、hachi8833です。今週はJavaScriptのニュースが目につきました。
V8 JavaScript エンジン5.7がリリース
- ソース: V8公式ブログ
- パフォーマンス向上
- ES2015の改良
- RegExpが15%高速化
- ライブラリの新機能
- WebAssemblyが有効になった
- V8 APIをさらに追加
個人的にはRegExpの高速化が気になりました。早くJavaScriptの正規表現がPCRE並になって欲しいものです。
Railsでよく使われるtherubyracerではlibv8が使われていますが、以前に比べると随分安定するようになったとの声がありました。libv8でググると当時ハマった人たちの声が多数見つかります。
現時点のレンダリングエンジン/ブラウザごとのJavascript engineがどれなのかわかりにくかったのでまとめてみました。
- Blink(Chrome、Opera)
- V8
- Gecko(Firefox)
- SpiderMonkey
- WebKit(Safari、 PhantomJS)
- JavaScriptCore(Nitro)
- Trident(IE、Edge)
- Chakra(オープンソースのChakraCoreもある)
JavaScriptスプレッド演算子の技6種
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++にもあるそうなので、これらが由来かもしれません。
ActiveRecord reflectionの改良にともなってscope_chain
が非推奨に
tenderlove氏のPRがすっととおりました。map().flatten
よりflatten_map
の方がいいよというどこかで見た追伸もありました。
なお社内で聞いてみたところ、scope_chain
を使ったことのある人は見当たりませんでした。
miniTestでテスト実行中の警告表示オプションを追加
miniTestのテスト実行中にワーニングを表示するかどうかを-w
(--warnings
)オプションで指定できるようになったとのことです。
ActiveRecord::SerializationTypeMismatch
で、エラーの発生した属性を知らせるようになった
修正されたのはdeserializerではなくserializerでした。「エラーを出すのは普通deserializerでは?」と思って一同で追ってみると、serializerで処理できないデータをserializeしようとしたときのエラーでした。
なおActiveRecordのserializerで使われるデフォルトのcoder(データ形式)はyaml_columnです。
PostgreSQL向けの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 5.0.0beta1がリリース
- ソース Mike Perhamブログ
Sidekiqはバックグラウンド処理で広く使われているgemです。Rails 5.0との相性が改良され、Ruby 2.2.2未満のサポートが終了しました。
- ジョブのログ出力やリトライを
Sidekiq::Processor
で直接扱うようになる - Delayed Extension API(delay、delay_in、delay_until)がデフォルトで無効になる
- quiet signalを
USR1
からTSTP
に変更してJRubyに対応 - Rails 3.2とRuby 2.1のサポート終了
- JSONが壊れている場合に即時終了
Sidekiqのオープンソース版gemはLGPLなので普通に利用できますが、バッチやマルチプロセスといった機能は有料です。
resque gemで間に合うことも多いかもしれませんね。
Ruby Object Mapper(ROM)3.0がリリース
ROMは、ActiveRecordのO/Rマッピングのような感じでデータをオブジェクトとして扱うためのgemです。APIリストを見るとcsvやyamlなどさまざまなデータに対応しています。
- rom
- rom-cassandra
- rom-couchdb
- rom-csv
- rom-event_store
- rom-git
- rom-http
- rom-influxdb
- rom-json
- rom-kafka
- rom-lotus
- rom-mongo
- rom-neo4j
- rom-rails
- rom-redis(リンク切れ ´・ω・`)
- rom-repository
- rom-rethinkdb
- rom-roda
- rom-sql
- rom-yaml
- rom-yesql
それにしても「ROM」という名前はググりにくいですね。
Lite Cable: Railsなしで動くActionCable実装
- ソース: palkan/litecable(RubyWeeklyより)
JavaScriptで書かれています。ActionCableのAPIだけ欲しいならRailsでやるより軽くてよいかもしれないという声もありました。
Lite Cableはオープンソースですが、製品版のAny Cableもあります。ページをスクロールしたときのマスコットの動きがかなりかわいくて、私の中で一気にポイント上がりました。
ActionCableはRails以外でも注目を集めているようです。みんなこういうのが欲しかったということなのかもしれません。
Rubyのnilを駆逐する2つの方法(スクリーンキャスト)
nil
を使わずに書くコツを紹介しています。スクリーンキャストですが下にコードと解説があるので普通に読めます。
そういえばいっときnull安全という言葉が駆け巡ったり炎上したりしてました。
「Rubyistは割りとnil
に寛容かも」「nil
が飛んでくることに慣れすぎてしまうのも良し悪し」「Javaのnull
と違ってRubyのnil
はオブジェクトだしずっとタチがよいよね」という声もありました。
Rubyのハッシュは2.4で3倍速くなってる
昨年の週刊Railsウォッチで取り上げた、Ruby 2.4のハッシュで導入されたオープンアドレス周りをがっつり解説しています。かなり歯ごたえありそうな記事です。
Percona Migrator: MySQLマイグレーション用ActiveRecordアダプタ
- ソース: Percona Migrator Announcement(RubyWeeklyより)
- リポジトリ: redbooth/percona_migrator
Percona Toolkitに含まれているpt-online-schema-change
コマンドを使ってActive RecordでMySQLのスキーママイグレーションを支援するツールです。
RailsエンジニアがReactを学ぶべき理由
おぴによん記事です。リンク先にあるmatzとリチャード・ストールマンとおぼしきツーショットがコラになってることの方に注目が集まってました。以下はオリジナルです。
https://en.wikipedia.org/wiki/Yukihiro_Matsumoto#/media/File:Matz.jpgより
RubyのGIL(global interpreter lock)問題を考える
最初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)は正常に動作しませんでした。
私の環境でも同様の結果が得られました。
- 参考: CRubyのGVLとビジーループ
TechEmpowerのWebフレームワークベンチマーク
よくあるベンチマークサイトのようですが、聞いたこともないようなWebフレームワークやWebフレームワークと呼んでいいのかどうか迷うようなエントリが大量に並んでいます。眺めて首を傾げて楽しむ感じでしょうか。
上のサイトとは関係ありませんが、こんなツイートがありました。
@zaikoninnng ulib-postgresってweb frameworkなの?
— tetsuのクロック (@tetsu_614) 2015年6月17日
Go言語の現状(2017年2月)
- ソース: The State of Go
Go 1.8リリースを来週に控え、予定されている新機能などを紹介するスライドが公開されました。
スライドに出てきたSSAって何だろうと思ったら、静的単一代入のことでした。
- 参考: Go1.7からSSAが導入された
今週は以上です。
関連記事
- 週刊Railsウォッチ(20170203)AnyLogin gemで開発中に楽々再ログイン、イベント数ベース課金の監視サービスRollbarほか
- 週刊Railsウォッチ(20170127)わかりやすいAWSサービス名、Rails DBは便利、TruffleRubyの驚異的速度ほか
- 週刊Railsウォッチ(20170120)Ruby 2.5.0 devリリース、古いMySQLのサポート終了、uniqメソッドが削除ほか
- 週刊Railsウォッチ(20170116)Ruby 2.4の詳細、範囲指定したsumメソッドは速い、rescueの挙動を動的に変更ほか
- 週刊Railsウォッチ(20170110)ReactをRailsに置き換える、Ruby 2.4の新機能ほか
- 週刊Railsウォッチ(20161224)Float#roundの動作変更を取り消し、Rails 5.0.1/Ruby 2.4.0-rc1リリースほか
- 週刊Railsウォッチ(20161218)Ruby 2.4ではFloat#roundの動作が変わる、デフォルトのプライマリキーをBIGINTに変更ほか
- 週刊Railsウォッチ(20161209)Active Supportの非推奨メソッド廃止、RailsのjQueryへの依存を廃止ほか
- 週刊Railsウォッチ(20161125)Railsのデータベース・ベストプラクティス、SQLインジェクション解説ほか
- 週刊Railsウォッチ(20161117)DockerホスティングのHyper.sh、accepts_nested_attributes_for殺すほか
- 週刊Railsウォッチ(20161109)bundler audit gemは超おすすめ、CIAのFactbook gemほか
- 週刊Railsウォッチ(20161102)HTML 5.1正式勧告、CSS中央揃えに便利なサイトほか
- 週刊Railsウォッチ(20161027)LinuxカーネルのDirty COW脆弱性、DeviseはWikiを読めほか
- 週刊Railsウォッチ(20161019)ObjectSpaceモジュール活用法、Capybara統合、コミッターを撮影するソフト
- 週刊Railsウォッチ(20161012)RubyのHashの詳細、RethinkDBの会社が終業ほか
- 週刊Railsウォッチ(20161005)Mac OS SierraとRubyの問題、Learning Gitほか
- 週刊Railsウォッチ(20160928)constantizeの注意点、GoのGUI “gallium”登場ほか
- 週刊Railsウォッチ(20160921)クールなHTMLエディタ「Mozilla Thimble」他
- 週刊Railsウォッチ(20160913)MySQLの脆弱性ほか
今週の主なニュースソース
ソースの表記されていない項目は独自ルート(TwitterやRSSなど)です。