Tech Racho エンジニアの「?」を「!」に。
  • 開発

週刊Railsウォッチ(20170227)Rails 4.2.8リリース、SHA-1コリジョンアタック、便利なハッシュ変換ツールほか

こんにちは、hachi8833です。今週は公式サイト以外からの情報も少し多めにしようかと思いましたが、4.2.8リリース記事を優先しました。

臨時ニュース: SHA-1のコリジョンアタック手法が見つかったとGoogleから発表

Slackでbabaさんの書き込みから第一報を知りました。早くも日本語ニュースが出ていますので、詳しくはそちらをどうぞ。

HackerNewsのスレ「Announcing the first SHA-1 collision (googleblog.com)」では、PDFをドロップするだけでSHA-1コリジョン問題を手軽にチェックできるhttps://shattered.it/サイトが大賑わいになっています。問題の要点がよくまとまっていて助かります。


https://shattered.it/より

同サイトにはお試し用のPDFも2つ置かれています。「アップロードしたファイルを保存したりなんかしませんのでご安心を(Rest assured that we do not store uploaded files.)」とあります。なお、https://shattered.it/の証明書はLet's Encryptでした。

同サイトによると、署名/ファイル整合性チェック/ファイル識別にSHA-1を使っている以下のようなアプリケーションにはこの問題の影響を受ける可能性が潜んでいるかもしれないとのことです。

  • 電子証明書の署名Digital Certificate signatures
  • メールのPGP/GPG署名
  • ソフトウェアベンダーの署名
  • ソフトウェア更新
  • ISOチェックサム
  • バックアップシステム
  • 重複除外(deduplication)システム ←この言葉を初めて知りました
  • Git
  • などなど

⭐ emn178.github.io/online-tools: SHA/MD5/Base64などをリアルタイム変換できるWebツール ⭐

上述のSHA-1問題に関連してBPSアプリチームのu-ichiさんが見つけました。今週の⭐を進呈いたしましたので先にご紹介します。

これすごく便利です。思いつく限りのハッシュ/CRCチェックサム/HTMLエンコードをブラウザ上で変換できます。


https://emn178.github.io/online-tools/index.htmlより

おまけにその場で結果を確認できるシンタックスハイライトまであります。

何も足さない・何も引かないを体現したような、徹底的に素朴なデザインです。強いて言うならツール名が「Online Tools」とあまりにそっけなさすぎるのでググりにくいぐらいでしょうか。

これに私が普段から愛用している万能変換Webツールhttp://r12a.github.io/apps/conversion/と合わせれば、たいていの文字コード変換処理はこなせそうです(海外ツールなのでShift_JISやEUC関連などはご勘弁を)。

Rails 4.2.8リリース

先週rc2だったのが正式にリリースされました。Ruby 2.4で修正されたDateTime#to_time#12189)に伴う修正が中心です。なお私のRails 4.2.7アプリにはすとんとインストールできました。

Readme記載の変更点のみ以下にまとめます。Railsウォッチでも既出のものがちらほら見当たりますね。普段から追い続けているとだんだん見えてくるのがうれしいです。

Rails 4.2.8のRailtiesの修正

#24617
to_timeを呼んだときにレシーバのタイムゾーンを変更しないようになった
#22742
ActionDispatch::IntegrationTest#open_session作成後にセッションを直接リセットするようになった
#19880
Rails::Applicationからアプリケーション定数が継承された後、なる早でbefore_configurationを実行するようになった

追伸: before_configurationとfigaro gem

before_configurationなんてフックがあったんだ!」「before_initializeってのもあるけどどう違うんだ?」と一同の間で驚きがありました。起動時に環境変数などのチェックをしたい場合にはこのような起動のごく初期段階で呼ばれるフックが必要になりそうですね。

このあたりの初期化フックについてはRailsガイドの初期化プロセスに詳しく載っています(日本語版が追いついていないので英語版にリンクしました)。

上のフックに関連して、Railsの起動時の環境変数周りを制御できるfigaroというgemも見つけました。development/test/productionごとに切り替えたい定数がある場合によさそうです。主にHerokuでの利用が想定されていますが、他でも使えます。

Rails 4.2.8のActiveSupportの修正

修正
ActiveSupport::TimeWithZoneDateTime#getlocal#getutcが常にTimeのインスタンスを返すようになった

ActiveSupport::TimeWithZoneDateTimeを返していたためにto_timeで呼び出しスタックが深くなりすぎてエラーになる可能性があった問題が修正されました。

新メソッド: DateTime#subsec
秒の分数をRationalで返す
追加
ActiveSupport::TimeWithZoneTimeにもDateTime#utcのエイリアスを追加
新メソッド: DateTime#localtime(とそのエイリアスgetlocal
システムのローカルタイムゾーンをTimeのインスタンスで返す
新メソッド: Time#sec_fraction
秒の分数をRationalで返す
#24617
to_timeでのタイムゾーンの扱いを設定するオプション ActiveSupport.to_time_preserves_timezoneを追加

Ruby 2.4以降では、to_timeレシーバのタイムゾーンを変更しないようにするためにローカルシステムのタイムゾーンに変換するようになりました。この設定オプションはデフォルトではfalseに設定されるので、従来のRailsアプリを4.2.8にアップグレードしても設定を変更するまでは直接の影響はありません。

>> ENV['TZ'] = 'US/Eastern'

>> "2016-04-23T10:23:12.000Z".to_time
=> "2016-04-23T06:23:12.000-04:00"

>> ActiveSupport.to_time_preserves_timezone = true

>> "2016-04-23T10:23:12.000Z".to_time
=> "2016-04-23T10:23:12.000Z"
#26296 新メソッド: #init_with
ActiveSupport::TimeWithZone and ActiveSupport::TimeZoneに追加

3aa26cfで行われたタイムゾーン関連の修正によってシリアライズのYAMLフォーマットの日付文字列がUTCに変更されます。これを一時的に取り消したい場合のためのinit_withが導入されました。

#26580
ActiveSupport::TimeWithZone#inのサマータイム(DST)前後の動作を修正

従来の#inmethod_missing経由でTime#sinceに渡されていましたが、Time#sinceがサマータイムに対応していなかったので、サマータイムに対応できるActiveSupport::TimeWithZone#sinceをエイリアスしました。

Time.zone = "US/Eastern"

t = Time.zone.local(2016,11,6,1)
# => Sun, 06 Nov 2016 01:00:00 EDT -05:00

t.in(1.hour)
# => Sun, 06 Nov 2016 01:00:00 EST -05:00

Rails 4.2.8のActiveRecordの修正

修正
mysql2が接続に失敗した後に「connection is closed」エラーメッセージを出力するようになった(従来はundefined methodエラー)
修正
カラム情報をリセットしたときにModel.attribute_namesキャッシュを破棄するようになった
修正
型情報がリセットされた時のクエリのキャッシュの動作が修正された(Rails 5.0の修正をついでにバックポート反映)
#13775
joinsを正常にunscopedできるようになった
#25978
マッピング関連メソッドがすべてHashに実装されていればcomposed_ofのセッターにハッシュを再度渡せるようになった

追伸: composed_ofについて

一同でリリースノートをチェックしていて、このActiveRecordのcomposed_ofというメソッドにkazzさんが熱い視線を注いでいました。composed_ofについてはいつか別記事で追ってみたいと思います。

instrument nameのキャッシュをfreezeして高速化(Rails公式ニュースより)

ここからはいつもどおり、今後のRailsでの更新情報です。

ActionMailer::Base#instrument_nameActionController::Base#instrument_nameはキャッシュ後に頻繁に使われることが多いので、呼ばれるたびにStringを#newするのをやめてfreezeしたそうです。修正はピンポイントです。

primary_keys()をシンプルにしてPostgreSQL向けに最適化(Rails公式ニュースより)

@kamipoさんの#27997の続きです。unnestから返される値の順序が一定していないので、PostgreSQL 8.4から利用できるようになったgenerate_subscriptsを使って最大64%まで高速化されたそうです。

続: ネストしたRailsエンジンでのrails generateの動作を修正(Rails公式ニュースより)

週刊Railsウォッチ(20170120)でも取り上げた#27550 Fix generator command for nested (namespaced) rails engineに再度修正が行われました。

b6ffb5eで行われた別の修正namespaced_pathがStringの一部として扱われるようになったので、#27550ではnamespaced_pathがArrayを返していたのをStringで返すように変更しました

expression indexもremove_indexで削除できるようになった(Rails公式ニュースより)

これも@kamipoさんのお仕事です。expression indexって何かと思ったらPostgreSQL固有の機能だったんですね。テーブルの他のカラムから算出したスカラー値をインデックスで使えるというものです。

Difference between MySQL and PostgreSQL ( MySQL Vs PostgreSQL )によるとMySQLではexpression indexをサポートしていないそうです。

データベースをRAMディスク化してCIビルドを高速化(OpenRubyより)

MySQLにRAMディスクを導入してみたところCIのビルドが32%速くなったそうです。短いのですぐ読めます。

AWSのRuby SDKとDynamoDBでテスト駆動開発してみる

RSpecを使ってテスト駆動開発という記事です。前書きは飛ばしてよいと思います。
むしろこの記事をきっかけに以下を見つけました。

k1LoW/awspecは数少ないAWS向けのRSpecテストgemです。


https://github.com/k1LoW/awspecより

Azure App Web Service on Linux上でRubyを使うには(OpenRubyより)

Microsoftの公式記事です。RubyをApp Web Service on Linuxサービス上で動かす方法の解説です。Railsとは書いてありませんが、Rubyが動くならRailsも動きそうです。

使ったことはありませんが、Microsoft Azure自身はかなり以前からRuby on Railsに対応しています: Windows AzureがRuby on Railsに対応。次々とオープンソースを取り込むWindows Azure(2009年の記事)

DHHの2017セッションのまとめ

他でも読める内容ですが、韓国語のRails記事が珍しかったので目に止まりました。Google翻訳は便利ですね。

おまけ: Google翻訳の日本語<=>韓国語翻訳はかなりすごい

Google翻訳の日本語<=>韓国語翻訳は、日<=>英翻訳が話題になるよりずっと前からかなり質の高い訳文を生成できます。

それより前は日<=>韓機械翻訳は内部で英語を経由していたようなふしがありましたが、7、8年ほど前から中間言語を経由しないネイティブになったように思えました。

マジで、マニュアルレベルだったら日<=>韓機械翻訳は下訳として使えてしまうほどです。両言語は語順が同じで、敬語の概念もかなり似ているので、機械翻訳が効きやすいのかもしれません。

Google SpreadsheetにPythonでアクセス


Google Spreadsheets and Python
より

Googleオフィススイートのスクリプティングは、従来ならGoogle Apps Scriptという名称のJavaScriptでやるのが定番でしたが、Pythonでもできるんですね。

Excel VBAで書いたスクリプトはOfficeがアップグレードするたびに動かなくなってさみしい気持ちになったのを思い出します(´・ω・`)。

KahnAcademyでアルゴリズムを学ぶ(HackerNewsより)


KahnAcademy: COMPUTER SCIENCE - Algorithmsより

この種の他サイト同様、デザインも見せ方も秀逸ですね。動画や文章による解説のほかにクイズや練習問題もあり、質疑応答も受け付けています。
Dartmouth大学と提携して作成された本格的な内容です。

KahnAcademy: COMPUTER SCIENCE - Algorithmsより

引用回数の多い機械学習系論文(HackerNewsより)

Awesome系の中ではかなり頑張ってる感じです。機械学習系の研究は新しいアルゴリズムがたった1年で陳腐化したりするぐらい異常に足が速いらしいので、こういうメモ書きでもありがたいのだと思います。

外野から見ていると、機械学習系の研究者はスプリントレースの速度でマラソンしながら宝探ししているようなデスレースっぽい世界でしのぎを削っているような塩梅ですね。知力の他に頑健な基礎体力もないとやっていけないかもです。ご自愛ください。

GitHub Trendingなどでちょくちょく見かける「Awesome」で始まるタイトルは日本で言うまとめサイト的な情報ですが、思ったほどいい情報でもなかったり、あっという間に古びてしまうことが多いので、Railsウォッチの情報収集ではたいていスルーしていました。Awesomeは英語圏だと割りとバズらせやすい安易な言葉になりつつあるような気がします。

おまけ

WebチームのtazuさんがGitHubで上のAwesomeタグを表示する方法を見つけました↓。

JavaScriptはどのぐらい人気か

StackOverflowとGitHubでの人気をそれぞれ縦横に配置しています。JavaScript以外にもRubyやPythonやC#やObjective-Cがトップ群にいます。

Opal: Ruby->JavaScriptコンパイラ

昨日・2月23日に渋谷で開催されたRuby Business Users Conferenceでの@matzの基調講演でも取り上げられていたそうです。


http://opalrb.org/より

玉虫色のルビーがシンボルマークになっていて、このソフトウェアの性質と位置づけをうまく表していると思います。


http://opalrb.org/try/より

番外1: 40光年離れた恒星で7つの地球型惑星が見つかる

既に日本語でも報じられていますのでご存じの方も多いと思います。

最近のNASAの発表は「今夜重大な発表があります」という前フリがつくことがやけに多いのですが、予算削減と戦うための手段なのかなと思ってしまいました。

番外2: 手書きの画像をそれっぽい写真にフェイクする

BPS社内でもたちまち流行しました。手書きのネコ画像がみるみるグロい謎のリアル画像に変化しました。

番外3: www.w3c.orgにW3Cバリデータかけてみたお

BPS WebチームのebiさんがふとW3CのCSSバリデータにwww.w3c.orgをかけてみたところ、以下の結果が得られました。

自サイトの正規化が間に合わないほどCSSの仕様改定が激しいという一面もありそうですね。文句を言うのは簡単ですが、これほどの規模の仕様のメンテがどれだけハードかを想像してしまいます。カスケード(継承)をやめるかうんと減らしてdelegate的に欲しい機能だけをブラウザのデフォルトスタイルシートで持つようにしたらだめなのかな(´・ω・`)。

W3Cのバリデータサービスを激しく使うと数時間ほど外部IPアドレス単位でアクセスできなくなることがあるので、みなさんもそおっと使ってあげてください。面白半分のアクセスを増やさないため、この項ではあえてW3Cとバリデータにリンクを張っていません。

今週は以上です。

関連記事

今週の主なニュースソース

ソースの表記されていない項目は独自ルート(TwitterやRSSなど)です。

Rails公式ニュース

OpenRuby

RubyFlow

160928_1638_XvIP4h

Hacker News

160928_1654_q6srdR

Github Trending

160928_1701_Q9dJIU


CONTACT

TechRachoでは、パートナーシップをご検討いただける方からの
ご連絡をお待ちしております。ぜひお気軽にご意見・ご相談ください。