週刊Railsウォッチ(20160928)constantizeの注意点、GoのGUI “gallium”登場ほか

※ 「Ruby/Rails界隈ウォッチ」は2016年12月より週刊Railsウォッチにタイトルを改めました。

こんにちは、hachi8833です。今週も流浪のRailsウォッチです。

RubyFlow

160928_1638_XvIP4h

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でスプレッドシートを作る

spreadsheet-full

Googleスプレッドシートでおなじみの、シート上のカーソル位置がダイナミックに共有される機能をRails 5のActionCableとRethinkDBで作ってみようという企画。RethinkDBはMongoDB的なデータストアですが、リアルタイムアプリに向いており、Ruby的な動的クエリ言語を装備しています。

Git bisect

バグの疑いがあるコミットを二分探索で高速検出するコマンドラインツールです(bisect=二等分)。

3分でわかるCSS Flexbox

Flexboxを非常に簡潔に解説しています。少し前に話題になったA Complete Guide to Flexboxの前に読むとよさそうです。Flexboxで噴出中のさまざまなバグも合わせてチェック。

ところで、こうした解説は図の描き方ひとつで大きく読みやすさが変わりますね。私たちはつい線画のボックスで何もかも描いてしまいがちですが、特にCSSのボックスモデルなどの説明ではこのように面と色で作図すると、読者の認知の負担がおおむね軽くなるように思います。

160928_1651_R0B7cQ

Ruby Weekly

160928_1641_BubfCD

このニュースサイトはまとまりがよいですね。

「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

160928_1649_IkaWyb

#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

160928_1654_q6srdR

ripgrep

最速を謳って話題になっている新顔grepですが、むしろ「Unicodeフルサポートだぜ、常にオンだぜ」の方が重要だと思います。まだ試していませんが、さまざまなgrepツールで絵文字などのなるべく意地悪な文字をgrepしてみるといろいろわかって面白そうです。

Chromiumを脱Google化

Google寄りの機能を取っ払って透明性を高めたChromiumバリアントです。Starが1600個を超えています。

MITライセンスをきちんと読む

この種の法務文はほとんどの場合流し読みされてしまうものですが、英語日本語問わず、ライセンス条項のような文章をみっちりみっちり読む経験は一度しておいて損はないと思います。

関係ありませんが、義務教育で契約書の読み方・書き方といった単元がないのはおかしいとずっと以前から思っています

Github Trending

160928_1701_Q9dJIU

md2key

RubyKaigi 2016ので小会議室から人があふれるほど盛況だったDockerネタでおなじみのK0kubunさんがまた新しいの作ってます。markdownでkeynoteが書けるんだそうです。早速やってみよ。

その他

https://browser-issue-tracker-search.appspot.com/

主要なブラウザのissueを追いかけるのに便利なバグトラッカーです。

alexflint/gallium

160928_1703_BdFM8t

突然の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”がどこでキャッシュされるものを指しているのかなどが読み取れない)ので、理解できたら解説してみようかなと思います。

他にも色々コメントしたかったのですがちょっと仕事の方で手が空かないので今日はこの辺で失礼します。

関連記事

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の書いた記事

週刊Railsウォッチ

インフラ

BigBinary記事より

ActiveSupport探訪シリーズ