こんにちは、hachi8833です。HackerNewsにあがってたHOW BANK OF AMERICA GAVE AWAY MY MONEYをつい読んでしまいました。いかにもコントやショートショートにありそうな話ですが、実際に起きるとめちゃ怖いですね。たぶんそのうちどこかの海外ネタサイトに載ると思います。
Ruby 2.1のサポート終了(Ruby公式ニュースより)
- 公式発表: Support of Ruby 2.1 has ended
- 日本語版: Ruby 2.1 公式サポート終了
発表日が4/1だったので、すわエイプリルフールかと思いきや、1年前の予告どおりのスケジュールでの発表でした。
昨年 3 月末の Ruby 2.1.10 のリリース後、Ruby 2.1 系列はセキュリティメンテナンス期間に入っていましたが、予定の 1 年が経過しましたので、2017 年 3 月 31 日をもって、公式サポートを終了します。 以後、単なるバグの修正はもちろん、セキュリティ上の問題が発見された場合も、Ruby 2.1 系列については新たなリリースは行われません。 現在、Ruby 2.1 系列を使用中のユーザーは、速やかに、より新しいバージョン系列へと移行されるようお願いします。
Ruby 2.1 公式サポート終了より
メンテナンスポリシーはソフトウェアによってさまざまですが、Rubyの場合、ライフサイクルをどのように決定するかというはっきりした原則が今のところ見当たらないようです。一同でチェックしながら、現在のバージョンのライフサイクルをいつ終了させるかはコミュニティ任せなのかもしれない、という話題になりました。
Railsのアップグレードはそれなりに手がかかりますが、Railsで使われるRubyのアップグレードはスムーズにできるので、古いRailsでもRubyだけは最新にしている方も多いと思います。私も先日オレオレRails4アプリでRubyだけは2.4.1にアップグレードしましたが、Rubyが新しくなるたびにじわじわと速くなっているのを実感できます。
rails new
から--javascript
オプションが削除される(Rails公式ニュースより)
JavaScript周りの変更にともない、Rails 5.1で--javascript
オプションが削除されます。
従来Railsで使われていたJS系gemには「xxx-rails」といった名前のものがよく目につきますが、Rails 5.1でyarn管理に移行した後、「xxx-rails」系gemの多くがdeprecatedになるのかもしれないといった話題になりました。
- 参考: rails new の --javascript= に指定できるもの --2014年の記事です
driven_by
がオーバーライド可能に(Rails公式ニュースより)
Rails 5.1への導入が決まっているCapybaraを活用した新しいブラウザ表示テスト用クラスであるSystemTestCaseで、テスト中に動的にseleniumやrack_testといったドライバを#driven_by
で切り替えられるようになりました。
# https://github.com/rails/rails/pull/28586より
class ApplicationSystemTestCase < ActionDispatch::SystemTestCase
driven_by :selenium, using: :chrome, screen_size: [1400, 1400], options: {url: "http://chrome:4444/wd/hub"}
end
class WithJavascriptTest < ApplicationSystemTestCase
end
class WithoutJavascriptTest < ApplicationSystemTestCase
driven_by :rack_test # ドライバの切り替え
end
複数ブラウザの表示とJavaScriptのテストはどうしても面倒になりがちですが、ブラウザ間の挙動の違いをSystemTestCaseでテストするのが少し楽になりそうです。
- 参考: Rails 5.1のSystemTestCaseを試してみた --jnchitoさんの記事です
reverse_merge
のエイリアスwith_default
が追加(Rails公式ニュースより)
Railsウォッチ(20170317)でお伝えしたreverse_merge
とreverse_merge!
の追加(#28355)の続きです。
メソッド名にエイリアスを追加しただけというシンプルな内容ですが、reverse_merge
という生々しすぎて挙動を推測しづらいメソッド名に、strong_parametersにデフォルト値を追加できることがはっきりわかるwith_defaults
というエイリアスを追加したことで使いやすくなりました。
alias_method :with_defaults, :reverse_merge
...
alias_method :with_defaults!, :reverse_merge!
「こういう改修って大事だよね!」という声多数でした。名前は大事。
rails-ujs.jsのUMDモジュールサポートを修正(Rails公式ニュースより)
従来のjquery-ujsがjQuery依存脱却にともないrails-ujsと名称が変更されましたが、それに伴いUMDが使えなくなっていた問題が修正されました。今回知りましたが、UMD(Universal Module Definition)はクライアントとサーバーの両方で動作するJavaScriptモジュール定義のことでした。
jquery-ujsはRuby on Rails用に開発されたjQueryライブラリですが、jquery-railsと違い最新のjQueryを取ってくることまではしません。今に始まった話ではありませんが、JavaScript周りはgem名もいろいろあってわかりにくいですね。
参考
- Wikipedia-jp 控えめなJavaScript
- jquery-ujs.js(rails.js)便利だよって話
- Modular JavaScript , CommonJs, AMD, UMD について
N+1問題とメモリの問題を同時に解決できない理由(RubyWeeklyより)
N+1問題についての解説記事です。よい感じです。
記事をチェックしていて、「bullet gemに怒られそうだけど、確かにN+1問題はどんな場合にもバッドプラクティスというわけではないよね」という話題になりました。元記事でも、N+1問題を解決したために、使いもしないオブジェクトが大量に生成されてメモリを逆に圧迫してしまう問題と、対処の方法について触れられています。
たとえば巨大なデータを扱うバッチ処理を小分けにするといった状況では、N+1問題を修正することが必ずしも善とは限らないことを教わりました。
Rubyの一部のコードにシンボル処理を追加して高速化(RubyWeeklyより)
- 元記事1: Performance comparison of Ruby's Array and Set with strings and symbols
- 元記事2: Making Ruby's Array.include? faster for symbols
- ベンチマーク: pawelniewie/benchmark-set-array-contains
Rubyのパフォーマンス測定とパッチ当ての話なのでC言語が中心です。一同でチェックしていて「よく見つけたなこれ」と驚きの声が上がりました。
最終的に、vm_insnhelper.cでシンボルがまったく処理されていないことを突き止め、以下のように修正しています。
その後修正は一発でmergeされました。殊勲賞あげたくなっちゃいました。
同記事で参照しているRuby C APIガイドもよい資料ですね。
ポルトガルのRubyカンファレンスは今年は休み(RubyWeeklyより)
「今年で終わりではないが、ポルトガルでのコミュニティが今ひとつ盛り上がってないから」だそうです。ざっとググってみたところ、Rubyはポルトガル語圏ではそれほど盛り上がっていないようです。
Rubyのサブクラスをregistryに変更してリファクタリング(RubyWeeklyより)
これもよい感じですね。一同でチェックしていて「継承より委譲」という言葉が出てきました。
その後、「学校や教科書でオブジェクト指向を教えるときに、最初に継承を教えるのはあまりよくないかも」「実際に使うのはコンポジションとかの方が多いし」「他の項目との関連もあるから、継承を先に教えるのはある程度仕方がないけどね」などと話題が広がりました。
Mobility: 多言語の訳文をクラスの属性として利用できるgem(RubyWeeklyより)
- リポジトリ: shiomaya/mobility
Railsウォッチ(20170217)でご紹介したsvenfuchs/i18n-active_recordと同様の、多言語対応gemです。
# https://github.com/shioyama/mobility より
class Word < ApplicationRecord
include Mobility
translates :name, type: :string
translates :meaning, type: :text
end
こんなふうに多言語をActiveRecordの属性として扱えるようになります。脱yamlの多言語化の流れが加速していることを実感します。
word = Word.first
I18n.locale = :en
word.name
#=> "mobility"
word.meaning
#=> "(noun): quality of being changeable, adaptable or versatile"
I18n.locale = :ja
word.name
#=> "モビリティ"
word.meaning
#=> "(名詞):動きやすさ、可動性"
Mobilityのチェック中に、Webチームリーダーのmorimorihogeさんが「これ、同じようなのを随分前にbabaさんと作ったことある!」と、その場で社内GitLabのコードを見せてくれました。
BPSが長年運営している漫画翻訳サイト「MANGA REBORN」はRuby on Railsで構築されていますが、当初から2人によってがっつりと多言語化を意識した設計がなされていることを、私たちもその場で初めて知りました、マジで。
見せてもらったコードでは、漫画の日本語/英語タイトルといった属性を多言語コンシャスでモデル設計に盛り込み、かつ#__send__
などのメタプログラミングを駆使したコードになっていて、予想より遥かにシンプルでした。
morimorihogeさんいわく「当時ActiveRecordを知って『Railsってこんなことできるんだー!』と感激した勢いで作ったのを思い出した」そうです。
5年以上も前にRailsアプリでここまで多言語化を追求していたとは...自称多言語厨の私も脱帽でした。
deep_pluck: ネストした関連付けでもeager loadingせずに#pluck
を使えるgem
- リポジトリ: khiav223577/deep_pluck
Railsのカラムを配列で取るのに多用される#pluck
を、ネストした関連付けでeager-loadingせずに行えます。パフォーマンスもいいですね。
# https://github.com/khiav223577/deep_pluck より
User.where(:name => %w(Pearl Kathenrie)).deep_pluck(
:name,
:email,
'posts' => [:name, 'post_comments' => :comment],
'contact' => :address,
)
これは知っていて損はないgemですね。今さらですがpluckは「むしる、つまみ取る」という動詞です。
LittleBoxes: 依存性注入gem
- リポジトリ: manuelmorales/little-boxes
Rubyで依存性注入を行うフレームワークだそうです。
# https://github.com/manuelmorales/little-boxes より
module MyApp
class MainBox
include LittleBoxes::Box
let(:port) { 80 } # 注入
letc(:server) { Server.new } # 依存関係を指定して注入
end
class Server
include LittleBoxes::Configurable
dependency :port
end
end
box = MyApp::MainBox.new
# => #<MyApp::MainBox :port, :server>
box.server.port
# => 80
「JavaならわかるけどRubyで使うところあるかな?」という意見もありました。Javaではロガーを書くときなどにこうした依存性注入がよく使われるそうです。ご興味のある方はどうぞ。
geared_pagination: ページに応じて項目数が可変になるページネーションgem
- リポジトリ: basecamp/geared_pagination
1ページ目は30件、2ページ目は50件というふうにページによって件数を変えるgemだそうです。ネーミングからして、自動車などの変速ギヤのイメージですね。
「こういうのより、下までスクロールしたら件数が追加される方がいいと思う」「でもスマホだと一番下の [PC版に切り替える] がどんどん逃げて押せないサイトあるよねw」といった話題になりました。
ご興味のある方はどうぞ。
Capybaraのテスト効率を上げる5つのコツ(RubyFlowより)
短いですが良い記事です。CapybaraやRSpecはチートシートが無味乾燥だったりマッチャを覚えるのが面倒だったりするので、こういう具体的なノウハウ集は助かりますね。
ただ、JavaScriptのイベント完了を待つ手法は「それはちょっとなー」と一斉に声が上がりました。
Pluto: RSSフィードから静的Webサイトを生成するgem(RubyFlowより)
少々変わり種のgemです。RSSフィードから静的なWebページを生成します。ERBを書いてmiddlemanばりのカスタマイズもできます。
# http://feedreader.github.io/ より
<% site.feeds.each do |feed| %>
<%= feed.url %> or <%= feed.link %>
<%= feed.title %> or <%= feed.name %>
<%= feed.title2 %>
<%= feed.feed_url %> or <%= feed.feed %>
<% end %>
どこかでちょっとした使いみちがありそうな気がします。過去ブログのアーカイブ化やデジタルサイネージなどに使いみちあるかもという意見がありました。
tty-progressbar: CLIプログレスバーgem(RubyFlowより)
- リポジトリ: piotrmurach/tty-progressbar
RubyでCLIのプログレスバーを作るgemです。今どきらしく色をつけるなどのカスタマイズがいろいろできます。
Piotrrrrr
downloading [======================= ]
MathJaxのCDNが今月いっぱいで閉鎖
たまたま見つけました。数式表示用JavaScriptライブラリMathJaxのCDNが閉鎖されます。代替としてcdnjs.comを推奨しています。
数式表示にMathJax CDNを使っている有名ブログサイトはあちこちにあった気がするので要注意ですね。
Jupyter 5.0リリース(HackerNewsより)
ブラウザ上でコードを実行・記録可能なドキュメントシステムとして、機械学習系を中心に急速に人気が高まっているJupyterのバージョン5.0がリリースされました。もともとPython用でしたが、あっという間にRubyを始めさまざまな言語に対応しました。
- ファイルリストを画面上でソート
- キーボードショートカットのカスタマイズ
- Cell tag機能で、コード中のプレースホルダに画面から値を入力・実行できる↓
研究以外にも、社内研修、教育、プレゼンなどに役に立つツールだと思います。
C言語1000行足らずでシンタックスハイライト付きのテキストエディタ書いたった(HackerNewsより)
手元でgit clone
してmake
したらちゃんと動きました。終了はCtrl-Q連打で。
それだけならよくあるサイトなのですが、本人によるソースコード解説がものすごく詳細なのに驚きました。コード量より文章量の方が明らかに多いですね。凄い。
Twitter Lite発表(HackerNewsより)
https://lite.twitter.com/でPCでもモバイルでも使えます。
確かに従来より軽快です。これいいですね。
教師なし感情ニューロンを開発(HackerNewsより)
これはマジで驚きです。Amazonレビューの文章をサンプルに用いて、次にどんな文字が来るかを感情ニューロンに予測させる研究中に、レビューに含まれる書き手の感情(ポジティブまたはネガティブ)を高い精度で検出できたのだそうです。教師なし(unsupervised)なので、人間が手取り足取り指示しなくてもデータを食わせるだけで違いを学習したということですね。
以下のように、好意的な文を緑、否定的な文を赤でハイライトするアニメーションGIFも掲載されています。
機械学習系の成果でよくあることですが、これも原理はまだよくわかっていないようです。
こういう機能が近々Rubygemなどで利用できるようになるかもしれません。
小ネタ: forty_two
ドキュメントの引用が間違っていた(Rails公式ニュースより)
Silly method gets a silly doc fix,
「アホなメソッド名でアホなドキュメント修正」だそうです。fourty twoというメソッド名については以下をどうぞ。
参考: RailsのArray拡張にforty_twoがいる謎
今週は以上です。
関連記事
- 週刊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など)です。