- 開発
週刊Railsウォッチ(20170526)増えすぎたマイグレーションを圧縮するsquasher gem、書籍「Complete Guide to Rails Performance」ほか
こんにちは、hachi8833です。いつの間にかもう5月が終わろうとしています。
それでは今週のRailsウォッチいってみましょう。
Rails: 今週の改修(Rails公式より)
今回はRailsコミット系を1トピックにまとめてみました。タイトルは一応韻を踏んでいます。
リサイクル可能なキャッシュキーを追加
- issue: #29092 Recyclable cache keys
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.
追記
rails consoleコマンドからirbオプションを渡せるようになっていたのは、Rails 5からではなくもっと前から(Rails 3とかの頃には渡せたんじゃないなあ)で、個人的な感覚では、渡せたのは偶々という印象https://t.co/pZYrgvAgAf
— U+1F410 (@y_yagi) May 31, 2017
データベースのダンプで'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/のスライドがポイントのようですが、おっきな字ばっかりでよくわかりません。
つっつきボイス: 「高橋メソッドはこうやって読むには向いてないなー」
akioさんが同記事の中から見つけた「HAL - Hypertext Application Language」の方がどうやらずっとよくまとまっていますね。HAL、覚えておこう。
Polyfill: 古いRubyで新しい機能を使えるようにするgem(RubyWeelkyより)
- リポジトリ: AaronLasseigne/polyfill
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パーサー
- LTSV公式サイト: Labeled Tab-separated Values
- リポジトリ: sonots/lltsv
morimorihogeさんが見つけました。JSONよりお手軽そうです。
私も、個人的にCSVよりもタブ区切りテキストを好んでいる(=表計算にそのまま貼り付けられるから)ので、LTSVに期待しちゃいます。
Squasher: 増えすぎたマイグレーションを圧縮するgem(RubyFlowより)
- 元リンク: Squasher is Rails 5.1 ready now
- リポジトリ: jalkoby/squasher
年月を経てずらりと増えたマイグレーションを1つのコマンドに集約するgemです。★600越えと人気のほどがうかがえます。
うまく使うとマイグレーションファイルの整理に役立ちそうです。
「実行前にはspringとかzeusは止めておきましょう」と注意書きがあります。
つっつきながら、「これとよく似たgemがあったはずだけどなー」という話になり、調べてみたところridgepoleというgemでした。こちらはRails標準のマイグレーションの代わりに使う、より本格的なスキーマ管理向けだそうです。
参考: ridgepole {名} : 《建築》棟木
つっつきボイス:「ridgepole、そういえば某プロジェクトで知らないうちに入ってたことありましたよ」
Napsack: CIでテストをノードに分割して比較可能にするgem
- リポジトリ: ArturT/knapsack
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セキュリティアップデート
- フォーラム: golang-announce
1.8.2では暗号化の楕円関数あたりが修正されましたが、直後に1.8.3がリリースされました。めまぐるしいです。
HPEが160テラバイトのメモリ空間を持つ「The Machine」のプロトタイプを発表
テラバイト、ペタバイト、エクサバイト、ゼタバイトの次はヨタバイトなんですね。
今週は以上です。
関連記事
- 週刊Railsウォッチ(20170519)Rails 5.1.1/5.0.3リリース、RailsでAPIサーバーを作る、HackerNewsでトップになるチャンス?ほか
- 週刊Railsウォッチ(20170512)Rubyの不思議な挙動「シャドウイング」、コードレビュー作法を定めるDanger gemほか
- 週刊Railsウォッチ(20170428)Rails 6.xでの’#form_for’と
#form_tag
廃止決定のその後、deviseの5.1対応はこれから、ほか - 週刊Railsウォッチ(20170421)RailsConfが来週アリゾナで開催、コントローラを宣言的に書けるdecent_exposure gemほか
- 週刊Railsウォッチ(20170414)サーバーを危うくする1行のコード、PostgreSQL 10の新機能ほか
- 週刊Railsウォッチ(20170407)N+1問題解決のトレードオフ、Capybaraのテスト効率を上げる5つのコツほか
- 週刊Railsウォッチ(20170331)PostgreSQLの制約機能を使えるRein gemはビューも使えるほか
- 週刊Railsウォッチ(20170324)Ruby 2.4.1リリース、GAEがついにRubyに対応、このgemがないと生きていけない27選ほか
- 週刊Railsウォッチ(20170317)Railsパフォーマンスチューニング本、DBレコード存在チェックの最速メソッド、RubyのUnicode正規化ほか
- 週刊Railsウォッチ(20170310)クールなDocker監視ツールCtop、RailsがGoogle Summer of Code 2017に正式参加、Unicode 10.0.0ドラフト発表ほか
- 週刊Railsウォッチ(20170303)5.0.2正式リリース、メタプログラミングに懲りた話、bundler 1.12のバグ、すぐ試せるWebアノテーションほか
- 週刊Railsウォッチ(20170227)Rails 4.2.8リリース、SHA-1コリジョンアタック、便利なハッシュ変換ツールほか
- 週刊Railsウォッチ(20170217)Rails 4.2.8.rc2リリース、Ruby 2.4正規表現とActiveSupportのnormalizeほか
- 週刊Railsウォッチ(20170210)JRubyやRubiniusの配列への追加はスレッドセーフではないほか
- 週刊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など)です。