※ 「Ruby/Rails界隈ウォッチ」は2016年12月より週刊Railsウォッチにタイトルを改めました。
こんにちは、hachi8833です。今週も流浪のRailsウォッチです。
RubyFlow
constantize
は使い所に注意
Rails3から導入されたActiveSupport::Inflector#constantizeは、Stringオブジェクトのメソッドとして呼び出すと指定の名前で定数を探せますが、クラスも定数であるがゆえにクラス名の文字列からクラスオブジェクトを得ることもでき、お便利に使われることが多いようです。
この記事ではconstantize
の乱用は危険であると警告し、絶対安全な使い方などないとまで言い切ったうえで、代替手段について解説しています。
記事末尾のmorimorihogeさんによるコメントもご覧ください。
Ruby Prize 2016
Rubyの新人賞であるRuby Prize 2016の候補者募集中とのお知らせ。ただし英語情報は少し遅れていて、日本語ページでは既に候補者が発表されています。ここから3名にまで絞り込まれ、受賞は11月のRuby World Conferenceで発表されます。
Bullshit-Free Review
Samesite cookieで「Cross-site timing attack」を防ぐ
SameSiteはChromeやOperaで試験的に導入されているcookieの新しい属性であり、これを指定したcookieはクロスサイトなリクエストに送信されなくなります。自サイトがあえてクロスオリジンなリソースを提供しているのでない限り、SameSite cookieは常に利用すべきと指摘しています。
cross-site timing attackは目新しい用語ですが、リンク先ではいわゆるCSRF(Cross-site request forgery)の一種であると説明されています。
Rails 5のActionCableとRethinkDBでスプレッドシートを作る
Googleスプレッドシートでおなじみの、シート上のカーソル位置がダイナミックに共有される機能をRails 5のActionCableとRethinkDBで作ってみようという企画。RethinkDBはMongoDB的なデータストアですが、リアルタイムアプリに向いており、Ruby的な動的クエリ言語を装備しています。
Git bisect
バグの疑いがあるコミットを二分探索で高速検出するコマンドラインツールです(bisect=二等分)。
3分でわかるCSS Flexbox
Flexboxを非常に簡潔に解説しています。少し前に話題になったA Complete Guide to Flexboxの前に読むとよさそうです。Flexboxで噴出中のさまざまなバグも合わせてチェック。
ところで、こうした解説は図の描き方ひとつで大きく読みやすさが変わりますね。私たちはつい線画のボックスで何もかも描いてしまいがちですが、特にCSSのボックスモデルなどの説明ではこのように面と色で作図すると、読者の認知の負担がおおむね軽くなるように思います。
Ruby Weekly
このニュースサイトはまとまりがよいですね。
「Docker Composeによるオーケストレーション」が無料でダウンロード
英語ですがわずか19ページなのですぐ読めちゃいます。
Sidekiq 4.2で Rails 5をサポート
バックグラウンド処理でおなじみのSidekiqがRails 5に対応しました。Sinatraへの依存を解消してRackを直接使うようになったとあり、こっちの方が重要かもしれません。
少し前に話題になったKill Your Dependencyで相当メジャーなgemでも無駄なライブラリをインクルードしていることが指摘されていたのを思い出しました。個別のgemで重複するライブラリを機械的に解消するのは簡単ではなさそうですね。
HTTP APIで使うRESTとRPCの違いを理解する
RESTとRPCの違いを改めて確認するのによさそうです。コメント欄でMicrosoft のDarrel Miller氏がブログでRESTかRPCかは、URLとは関係ないと追記しています。
Ruby trunk
#12790 stdlibクラスの#inspectを良くしたい
たとえばBigDecimalが返す#inspectの結果が生々しすぎて読みづらいというissueです。DateTimeなど他にも何とかして欲しいという意見も。
現状:
<BigDecimal:128d34f4,'0.25E2',9(18)
理想:
<BigDecimal: 250> # もしくはsig.digをそのまま表示 <BigDecimal: 250 digits: 9(18)> <BigDecimal: 1.5E35> #大きい数値ならこれでもいい
#12788 #lstripと#stripを10倍速くしたった
Times before: 0.195159 and 1.918969
Times after: 0.013684 and 0.143966
So a bit more than 10x faster.
だそうです。
Hacker News
ripgrep
最速を謳って話題になっている新顔grepですが、むしろ「Unicodeフルサポートだぜ、常にオンだぜ」の方が重要だと思います。まだ試していませんが、さまざまなgrepツールで絵文字などのなるべく意地悪な文字をgrepしてみるといろいろわかって面白そうです。
Chromiumを脱Google化
Google寄りの機能を取っ払って透明性を高めたChromiumバリアントです。Starが1600個を超えています。
MITライセンスをきちんと読む
この種の法務文はほとんどの場合流し読みされてしまうものですが、英語日本語問わず、ライセンス条項のような文章をみっちりみっちり読む経験は一度しておいて損はないと思います。
関係ありませんが、義務教育で契約書の読み方・書き方といった単元がないのはおかしいとずっと以前から思っています。
Github Trending
md2key
RubyKaigi 2016ので小会議室から人があふれるほど盛況だったDockerネタでおなじみのK0kubunさんがまた新しいの作ってます。markdownでkeynoteが書けるんだそうです。早速やってみよ。
その他
https://browser-issue-tracker-search.appspot.com/
主要なブラウザのissueを追いかけるのに便利なバグトラッカーです。
alexflint/gallium
突然のGo言語で失礼します。GoとHTMLでデスクトップアプリケーションを書けると聞いて私カッとなって書いてしまいます。
alexflint/galliumは、Chromiumを使ってGoでデスクトップアプリをさらっと書けてしまう待望のアプリです。ファイルの履歴が10日足らずという信じがたい新しさにもかかわらず、既にStarが2500を超えているという、とてつもなく劇的な伸びようです。
Issueが現時点でわずか2件なのは新しさゆえでしょう。安定性などはこれからの課題ですね。
私、思えば今年の頭ぐらいからGo HTTPサーバーをElectronアプリに埋め込むという大変キモい作業をずっとやっておりましたが、即座に乗り換えを決意しました。ひとまず、手元でgo build
したワンバイナリからサンプルのGUIが動くことまでは確認できました。
現在はMac版のみのようですが、星の多さとSlackのGophers#galliumの盛り上がりからしてWindows/Linux版も遠くないように思ったのは私の願望でしょうか。そしてこの作りであれば、Android/iOSアプリ化もそれほど困難ではない気がします。これまで弱点と言われ続けていたGoのデスクトップGUIですが、これで流れが変わるかもしれません。
今週は以上です。
morimorihogeコメント
#constantize
を初めとしたリフレクション系のメソッドはユーザの入力パラメータを素通しするのは危険だよ、というのはRailsに限らずどんな言語でも注意しないといけないことかと思います。STI(Single Table Inheritance)を使ったフォームなんかを使う時には便利なので使うこともありますが、元記事の方でもあるように許可するクラスをどこかで定義してホワイトリスト許可するのが妥当な対策なのかなと思いました。
Ruby World Conferenceには今年も参加しますので、Ruby Prizeは楽しみですね。Ruby Prizeは実装に限らずRubyコミュニティに対する貢献が評価されるという珍しい賞なので、コミュニティに対する貢献を大事にするRubyコミュニティらしさが出ているのではないでしょうか。
Git bisectはGit標準ツールなので、知らなかったのであれば知っておくとバグ追跡でお世話になることもあるかもしれませんね。
Stop Cross-Site Timing Attacks with SameSite cookiesの件で言われている「Cross-Site Timing Attacks」についてはCSRFの亜種っぽいのは分かるのですが聞き慣れない単語なので具体的にどういうモノなのか、もうちょっと読んで把握してみたいと思います。まだ今一つ把握しきれていない(文中で言われる"cache"がどこでキャッシュされるものを指しているのかなどが読み取れない)ので、理解できたら解説してみようかなと思います。
他にも色々コメントしたかったのですがちょっと仕事の方で手が空かないので今日はこの辺で失礼します。