こんにちは、hachi8833です。中途半端な季節が続きましたがやっと本格的に春になりましたね。
今週はRubyとRailsの公式情報の更新はありませんでした。RubyWeeklyは昨日最新版が公開されましたが、本日は追いきれないので来週お伝えいたします。
Chromeブラウザにヘッドレスモード
morimorihogeさんが昨晩fetchしました。
!!! chrome --headless !!!https://t.co/knIfp0putc
— Urabe, Shyouhei (@shyouhei) 2017年4月13日
ヘッドレス/サーバー環境でChromiumを使えるようになります。ページの読み込み、DOMなどのメタデータの展開、ページコンテンツからのビットマップ生成などに利用できます。
以下のように起動することでChromeをヘッドレスモードで起動できます。
chrome --headless --remote-debugging-port=9222 https://chromium.org
サーバーを危うくするたった1行のコード(Ruby Weeklyより)
セッションシークレットの扱いを主題にした、Railsに限定しないセキュリティ記事です。以下は同記事のサイドバーにある危険なセッションシークレットの例です。
- Djangoのsettings.py
SECRET_KEY = 'super secret'
- Playのapplication.conf
play.crypto.secret = "super secret"
- Expressのserver.js
secret: 'super secret'
目次
- 脆弱なセッションシークレットのクラック方法
- 辞書攻撃
- 注意事項
- 影響
- アプリケーションを乗っ取る
- 影響
- サーバーを乗っ取る
- サーバーでコマンドを実行する
- サーバーからデータを抜く
- 影響
- 防止策
- アプリケーション開発者のできる防止策
- ライブラリ・フレームワーク作者のできる防止策
- 結論
補足
以下はBPS Webチームリーダーのmorimorihogeさんの解説です。
この手のsecret keyは、どんなに長い引数を渡してもOpenSSLのdigestとかでハッシュ化すると同じ長さになるので、長さとかあまり気にせずに以下のような感じで適当にランダム文字列をぶち込むのが良いと思います。
head -c20 /dev/urandom | base64
複数台構成時にはそれぞれのsecrets.ymlに同じ値を入力しないといけなくなることがありますが、secrets.ymlに直接秘密キーを書くのはどうしてもはばかられます(ましてやGitリポジトリに登録してはいけません)。そういうわけで、近年のインフラ界隈では、AWSやDockerのインスタンス・コンテナ起動時にこの手の秘密の文字列を環境変数経由で渡すのが流行りです。
AWSの場合、秘密キーの渡し方として例えば以下のような方法が考えられますね。
- AMIに入れておいて、普通にファイル管理する(楽だけど、AMIが抜かれると死亡)
- EC2 instanceの起動時オプションで環境変数として突っ込む
- EC2 instanceのタグ情報として入れておき、ec2 metadataから拾う
- privateなS3とかにデータを置いておき、AMI起動時にそこから取ってくる
dockerなら
-e
オプションです。
月刊卜部さん
詳しくはリンク先をご覧いただくに限ります。その中からいくつかを(リンク先は同記事のトピックです)。
#13072 Dateライブラリがメンテナンスされてない問題
ある意味衝撃でした。「Timezoneに影響されないDateはそれはそれで必要になるときもあるんじゃね?」などの意見がありました。
#13045 キーワード引数に文字列keyのハッシュを使いたい=>却下
最近TechRachoで記事にすることの多いRubyキーワード引数ですが、「文字列keyのキーワード引数を言語レベルでサポートするのは確かに抵抗があるなー」と卜部さんに一同うなずきました。
- 参考: Techracho キーワード引数関連の記事
#13241 Unicode文字の文字クラスを返すメソッドが欲しい
どうなんでしょうね、この機能誰が使うんでしょうか。
同記事より
文字コード厨の私もそういうメソッドが欲しいと思ったことはごくたまにしかありませんでした。
言語ごとにえっちらおっちら実装するより、unicode.orgが公式のAPIを用意してくれる方がありがたい気がします。
なお、Unicode文字から文字クラスなどの情報を知るのにはfileformat.infoが今のところ便利です。
#13077 String#fstring
でString#@-
のdupを抑制
Ruby 2.3からString#@-
というものがあったことを初めて知りました。文字列の前に@-
というのは、知らなかったらとまどいそうです。
- self -> String | self
self
が freeze されている文字列の場合、self
を返します。 freeze されていない場合は元の文字列の freeze された複製を返します。
Railsで巨大データを複製するには(RubyFlowより)
- 元記事へのリンク: Deduplicating Large Data With Rails
ログファイルを例にした巨大データの容量節約方法についての記事です。
ログエントリのほとんどは内容が同じであることに着目し、UserのログエントリをDigest::MD5.hexdigest
でハッシュ化し、同じエントリが既にあれば保存しないようにすることで、同一の大量ログエントリによる容量増大を防ぐ手法を紹介しています。UserモデルとLogモデルとのリレーションの間にUserLogモデルを置くのがポイントです。
それに対し、社内で「そもそもDBにログを保存するという発想をやめるべき」というツッコミがありました。もっともでした。
RailsのPumaのマルチスレッド時ベンチマーク(Ruby Weeklyより)
記事冒頭で、以前のRailsウォッチでも取り上げたRubyのGIL(global interpretation lock)問題に触れています。
同記事ではPumaのスレッド数が16になると急速に応答速度が低下したことが示されており、Pumaスレッド数などを適切にチューニングすることでパフォーマンス低下を回避できる可能性があると述べています。社内でも「これはよい話!」という声がありました。Puma最適化に関心のある方向け。
なお、セクション見出しの「Per Aspera Ad Astra」はラテン語の格言「苦難を通じて栄光へ」だそうです。
- 参考: Wikipedia-ja グローバルインタプリタロック
Bundler 1.14の新機能(Ruby Weeklyより)
アップデートするgemが依存している他のgemアップデートをupdate --conservative
で抑制、すべてのgemでのチェックサムバリデーション実行、バイナリ版gemをforce_ruby_platform
で強制的にコンパイル&インストール、など多くの改良が加えられました。
同記事によると、rubygems.orgでインデックスフォーマットが改定されたことでupdate --conservative
できるようになったそうです。
gemを1つアップデートしただけで連鎖反応的に依存gemがごっそりアップデートされてトラブルの原因になるのはよくある話ですが、そんなときにupdate --conservative
が使えるのはありがたいことです。
Bundlerは思っていたよりも動きが激しいですね。
AWS LambdaとCloudwatchでSidekiq監視するときのコツ(Ruby Weeklyより)
lambdaでカスタムメトリクスを定義するという、AWSにおけるbest practice的な記事です。
morimorihogeさん曰く「auto scalingのトリガメトリクスなんかはCPUとかだと指標としてぶれすぎるので、こうやってカスタムメトリクスを作る方がよいかもしれないですね」とのことでした。
「特異なRuby」シリーズ(Ruby Weeklyより)
- サイト: Idiosyncratic Ruby
Stringオブジェクトの作り方210種やグローバル変数リストなどのRubyトリビアが多数紹介されています。
なにしろトリビアなので、実用を置き去りにした「よくこんなこと調べたな」的なマニアックなリストだらけです。「茶飲み話にいいかもね」との声も。
GraphQL: Facebookが開発した一般性の高いAPIクエリ言語
- 公式サイト: http://graphql.org/
- リポジトリ: rmosolgo/graphql-ruby
nettofarah/graphql-query-resolverというgemからたどりました。SQLをJSON化したような趣で、型も扱えます。
「この手のクエリ言語は山ほどあるので、自分好みで選べばよいんじゃね?」や「どちらかというと『この言語で実現できないAPIは書かないようにしよう』みたいに考えれば糞APIを作らずにすむかもね」などの意見がありました。
- 参考: GraphQLについて調べてみた
小ネタ: Rails vs PHP(Ruby Weeklyより)
PHPをダシにしたRailsプロモーション動画シリーズです。
日本のIT系の会社でこういうことってなかなかやりませんね。「ジャーはJarということでJava vs Railsの方が韻を踏んでていいんじゃね?」という声もありました。
Slack的なチャットアプリはオープンソースコミュニティには不向き(HackerNewsより)
元記事の作者は、Slack/HipChat/Gitterなどの即座の返信を前提とするチャットアプリの利用がオープンソース界隈で増えていることについて問題を感じています。この手のアプリは社内チャットなどであれば非常によいが、オープンソースコミュニティでは「クローズドなのでTwitterにリンクひとつ貼れない」「議論を後から追いかけて参加しにくい」などの欠点が目立つので、メーリングリストやissue trackerやフォーラムの方がまし、という意見。
個人的にはGitのIssue trackerがやっぱり好きです。
PostgreSQL 10の新機能(HackerNewsより)
リリースの近いPostgreSQL 10で導入が予定されている新機能です。今ざっとだけリストアップします。
- テーブルパーティション機能
- 論理レプリケーション
- パラレルクエリの強化
- SCRAM-SHA-256認証
- 高速化
- ハッシュインデックスの改善
- ICUのコレーションをサポート(参考: ICUのコレーション)
この他にも新機能・改良が盛り沢山なようです。近日中に別記事で追ってみたいと思います。
夜でも昼間のようにフルカラーで撮影できるカメラ(HackerNewsより)
スターライトスコープのような暗視装置やサーモグラフィーや赤外線カメラは、その性質上自然なカラー表示が不可能でした。
この記事で紹介されているのは、ごくわずかな光さえあれば昼間のように自然なカラーで撮影できる驚異的なカメラです。急に強い光を当てたらやっぱり壊れるんでしょうか。
今週は以上です。
関連記事
- 週刊Railsウォッチ(20170407)N+1問題解決のトレードオフ、Capybaraのテスト効率を上げる5つのコツほか
- 週刊Railsウォッチ(20170331)PostgreSQLの制約機能を使えるRein gemはビューも使えるほか
- 週刊Railsウォッチ(20170324)Ruby 2.4.1リリース、GAEがついにRubyに対応、このgemがないと生きていけない27選ほか
- 週刊Railsウォッチ(20170317)Railsパフォーマンスチューニング本、DBレコード存在チェックの最速メソッド、RubyのUnicode正規化ほか
- 週刊Railsウォッチ(20170310)クールなDocker監視ツールCtop、RailsがGoogle Summer of Code 2017に正式参加、Unicode 10.0.0ドラフト発表ほか
- 週刊Railsウォッチ(20170303)5.0.2正式リリース、メタプログラミングに懲りた話、bundler 1.12のバグ、すぐ試せるWebアノテーションほか
- 週刊Railsウォッチ(20170227)Rails 4.2.8リリース、SHA-1コリジョンアタック、便利なハッシュ変換ツールほか
- 週刊Railsウォッチ(20170217)Rails 4.2.8.rc2リリース、Ruby 2.4正規表現とActiveSupportのnormalizeほか
- 週刊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など)です。