Tech Racho エンジニアの「?」を「!」に。
  • 開発

週刊Railsウォッチ(20170526)増えすぎたマイグレーションを圧縮するsquasher gem、書籍「Complete Guide to Rails Performance」ほか

こんにちは、hachi8833です。いつの間にかもう5月が終わろうとしています。

それでは今週のRailsウォッチいってみましょう。

Rails: 今週の改修(Rails公式より)

今回はRailsコミット系を1トピックにまとめてみました。タイトルは一応韻を踏んでいます。

リサイクル可能なキャッシュキーを追加

DHH提案の新しい内部機能です。コミットを見るとけっこう大きな改修になっています。

# actionpack/lib/abstract_controller/caching/fragments.rb#L86
+      def combined_fragment_cache_key(key)
+        head = self.class.fragment_cache_keys.map { |k| instance_exec(&k) }
+        tail = key.is_a?(Hash) ? url_for(key).split("://").last : key
+        [ :views, (ENV["RAILS_CACHE_ID"] || ENV["RAILS_APP_VERSION"]), *head, *tail ].compact
+      end

DHHのPRメッセージの中ほどをざっくり日本語にしてみました。

この問題は、明確なバージョンを分離してキーを安定化することで解決できる。従来だと"projects/1-20170202145500"のようにキーを組み合わせていたが、"products/1"や関連するバージョン("20170202145500"など)といった組み合わせてないキーを安定して利用できるようになる。"projects/1"にどれほど頻繁にアクセスしようとも、単に同じキャッシュキーに書き込まれる。つまりこれがリサイクル部分になる。

つっつきボイス: 「#combined_fragment_cache_key自体はそもそもかなりraw levelなメソッドだし、キャッシュにはCacheHelper経由でアクセスするのが普通だから、普通なら直接触ることはないよ、ということか」「less-frequently-accessed-but-still-valid keysって書いてあるのがポイントかな。アクセス頻度は低くてもcache outしたくないようなデータをどうにかしたいと」「fetchにコストや時間がかかるようなデータなら永続化してもいいくらいのことってありますね」「cache versionとcache keyの管理を分離したい、という感じ」

rails consoleコマンドからirbにオプションを渡せるよう再修正

Rails 5からの機能だったのがいつの間にか消えていたので修正したそうです。

つっつきボイス:「↓これかー」「誰だっARGV.clearなんか足したのはw」

# railties/lib/rails/commands/console/console_command.rb#L82
-        ARGV.clear # Clear ARGV so IRB doesn't freak.

追記

データベースのダンプで'SchemaDumper.ignore_tables'が効くように修正

# activerecord/lib/active_record/tasks/mysql_database_tasks.rb#L60
         args.concat(["--routines"])
         args.concat(["--skip-comments"])
         args.concat(Array(extra_flags)) if extra_flags
+
+        ignore_tables = ActiveRecord::SchemaDumper.ignore_tables
         if ignore_tables.any?
+          args += ignore_tables.map { |table| "--ignore-table=#{configuration['database']}.#{table}" }
+        end
+
         args.concat(["#{configuration['database']}"])

         run_cmd("mysqldump", args, "dumping")

MySQLのほか、PostgreSQLやSQLiteも同様に修正されています。

つっつきボイス:「この機能、あれば使うかも」

キャッシュ機能にunless_existオプションを追加

# activesupport/lib/active_support/cache/strategy/local_cache.rb#L117
          def write_entry(key, entry, options)
-            local_cache.write_entry(key, entry, options) if local_cache
+            if options[:unless_exist]
+              local_cache.delete_entry(key, options) if local_cache
+            else
+              local_cache.write_entry(key, entry, options) if local_cache
+            end
+
             super
           end

unless_exist、つまりキャッシュが既にあれば上書きしないという処理です。

つっつきボイス: 「この修正ってキャッシュのatomicityがちゃんと保証されているのかな?」「できるかどうかはキャッシュエンジンに依存しそうだし」「unless_existチェックが終わってから書き込むまで間に別のプロセスが書き込むとかありえる」

Rubyのバックエンドパフォーマンス改善(RubyWeelkyより)

RailsConf 2017で行われたパネルディスカッションです。40分ほどの動画と概要が紹介されていて、パフォーマンスについていろいろ参考になります。

途中にこんなことも書いてあります。

Always

Be

Benchmarking

元記事では最後にThe Complete Guide to Rails Performanceをおすすめしています。3月17日のRailsウォッチでもこの書籍のことを簡単に取り上げました。

morimorihogeさんが「お、これはよさそう。『FASTとは何か』の定義から始まってて、ちゃんとしてそうに見える」と早速購入方法を調べ始めました。


http://schneems.com/2017/05/17/ruby-backend-performance-getting-started-guide/より

みっちり読む甲斐がありそうです。まともに買うと99ドルですが、頑張ってクーポンを探すともっと安く買えそうです。

補足

ご多分に漏れず、RailsConf 2017の動画がごっそりYouTubeにアップされていますね。後でチェックしてみようっと。


https://www.youtube.com/results?search_query=RailsConf+2017より

ハイパーメディアクライアントをRubyで書く(RubyWeelkyより)


https://robots.thoughtbot.com/writing-a-hypermedia-api-client-in-rubyより

「ハイパーメディアって何ぞや?」という点が気になりました。http://steveklabnik.github.com/hypermedia-presentation/のスライドがポイントのようですが、おっきな字ばっかりでよくわかりません。


http://www.steveklabnik.com/hypermedia-presentation/#1より

つっつきボイス: 「高橋メソッドはこうやって読むには向いてないなー」

akioさんが同記事の中から見つけた「HAL - Hypertext Application Language」の方がどうやらずっとよくまとまっていますね。HAL、覚えておこう。

Polyfill: 古いRubyで新しい機能を使えるようにするgem(RubyWeelkyより)

JavaScriptの方のPolyfillsを思い出してしまいました。Ruby 2.4、2.3、2.2をターゲットにしています。

つっつきボイス:「ここまでして古いRuby使わなきゃいけないんだろうかw」「Kernelにパッチ当てて新しいRubyのメソッドを使うよりはましなのかな?」

morimorihogeさんが「コード側でRubyバージョンをRUBY_VERSIONで調べて切り替えていたら、おそらくこのgemは効かないのではないか」と指摘しました。「Rubyバージョンをrespond_to?でチェックしているコードならこのgemとやっていけるだろうけど」「いったんconflictしたら根が深そう」とも。

Railsは最新のRubyが推奨されるので、よほど古いRailsアプリでなければ普通にRubyをアップグレードする方がよさそうですね。

RubyでUnicodeを修正する


https://blog.daftcode.pl/fixing-unicode-for-ruby-developers-60d7f6377388より

元記事の著者は名前を見るだけで一発でポーランド人とわかります。Lの小文字に斜めの線が入っているような文字が特徴です。

Unicode絵文字が普及したおかげで、日本を含むアジア方面ではおなじみの文字コードの苦労がやっと海外でも共有され始めているようです。私も珍しく「ふふ、ふふふ、もっと、もっと苦しむがよい」という気持ちが湧き上がってしまいました。

lltsv: LTSVパーサー

morimorihogeさんが見つけました。JSONよりお手軽そうです。

私も、個人的にCSVよりもタブ区切りテキストを好んでいる(=表計算にそのまま貼り付けられるから)ので、LTSVに期待しちゃいます。

Squasher: 増えすぎたマイグレーションを圧縮するgem(RubyFlowより)

年月を経てずらりと増えたマイグレーションを1つのコマンドに集約するgemです。★600越えと人気のほどがうかがえます。
うまく使うとマイグレーションファイルの整理に役立ちそうです。
「実行前にはspringとかzeusは止めておきましょう」と注意書きがあります。

つっつきながら、「これとよく似たgemがあったはずだけどなー」という話になり、調べてみたところridgepoleというgemでした。こちらはRails標準のマイグレーションの代わりに使う、より本格的なスキーマ管理向けだそうです。

参考: ridgepole {名} : 《建築》棟木

つっつきボイス:「ridgepole、そういえば某プロジェクトで知らないうちに入ってたことありましたよ」

Napsack: CIでテストをノードに分割して比較可能にするgem

Pro版もあるそうです。CIや監視がらみはPro版あり多いですね。類似のgemにrrrspecがあることを教わりましたが、また違うアプローチのようです。

Rubyで学ぶグラフ理論の初歩(RubyFlowより)

あきれるほど短い記事なので、グラフ理論のとっかかりによいと思います。心なしか字も大きめなので読みやすいと思います。あくまでとっかかりですが。

つっつきボイス:「Practical Graph Theoryと名乗るほどの内容じゃないかなー」

Electrino: Chromiumの代わりにChromeブラウザを使うJSアプリフレームワーク

なぜ今までなかったんだと思ってしまいました。20日で★2000越えの快挙です。「まだ機能がろくにないけど」と謙遜気味のREADMEです。

名前からElectronの縮小版ということがわかります。Chromiumエンジンを丸呑みしているElectronだと100MB越えなのに、Electrinoだと100kBクラスですよ、閣下。

つっつきボイス:「cookieやプロファイルはブラウザと共用するのかな」「それはないな、プロファイルはちゃんと仕切られるはず」

私はnativefierというElectronでWebページをアプリ化するのをよくやりますが、Electrinoに乗り換えてほしいものです。

Go言語1.8.2、1.8.3セキュリティアップデート

1.8.2では暗号化の楕円関数あたりが修正されましたが、直後に1.8.3がリリースされました。めまぐるしいです。

HPEが160テラバイトのメモリ空間を持つ「The Machine」のプロトタイプを発表

テラバイト、ペタバイト、エクサバイト、ゼタバイトの次はヨタバイトなんですね。


今週は以上です。

関連記事

今週の主なニュースソース

ソースの表記されていない項目は独自ルート(TwitterやRSSなど)です。

Ruby 公式ニュース

Rails公式ニュース

Ruby Weekly

RubyFlow

160928_1638_XvIP4h


CONTACT

TechRachoでは、パートナーシップをご検討いただける方からの
ご連絡をお待ちしております。ぜひお気軽にご意見・ご相談ください。