- 開発
週刊Railsウォッチ(20170303)5.0.2正式リリース、メタプログラミングに懲りた話、bundler 1.12のバグ、すぐ試せるWebアノテーションほか
こんにちは、hachi8833です。ひな祭りにもいつものように週刊Railsウォッチをお送りいたします。今回は公式以外の情報を多めにしてみました。いつも同じ情報源だと、ボットがかき集めるニュースのように縮退してしまうので。
Rails 5.0.2正式リリース
3月1日に5.0.2が正式にリリースされました。お疲れさまでした。5.0.1からのコミットログは149件です。
そういえば最近のリリースではハッシュがSHA-1からSHA-256に変更されていますね。
早速ローカルでインストールしました。
Rails 5.0.1 + Ruby 2.4のときに表示されていたRails起動時のFixnumのdeprecation warningがきれいになくなったのがうれしいところです。
collection proxyの委譲先をmerge!
からscope
に変更した(Rails公式より)
Rails公式ニュースからのトピックはTechRacho記事「5.1 beta1リリースノートに見るRails 5.1の姿」に含まれていないものに絞り込みました。
merge!
はパフォーマンス上不利であるとのことです。active_record/associations/collection_proxy.rbのこのあたりが改修の中心のようですが、ActiveRecordの全貌を把握しないと真の意図を読み取るのは難しいことを痛感しました。
環境変数に応じたデータベース接続を3段階まで指定できるようになった(Rails公式より)
#27611: new database.yml formatで行われたdatabase.ymlフォーマット改定のひとつです。aconnection_handler_test.rbのテストコードにあるように、database.ymlでcommon/primary/readonlyの3種類の接続を記述できるようになるようです。その後#28095がまたオープンされているので、また変わるかもしれません。
# connection_handler_test.rb より
@handler.establish_connection(:common)
@handler.establish_connection(:primary)
@handler.establish_connection(:readonly)
一同でこの改修をチェックしていて、従来だと複数のデータベース接続の使い分けには以下のようなgemを導入することがよくあったという話が出ました。
- schoefmann/multi_db -- BPSのRails開発で利用実績あり
- thiagopradi/octopus
- eagletmt/switch_point
multi_db gemはslaveを複数指定でき、octopusはより多機能なようです。
なおoctopus gemのREADME冒頭でshardingという用語を見つけました。以下のリンクによると、大規模なデータベースを分割してスケーリングする手法のひとつであるとのことです。
- 参考: Microsoft Azureドキュメント データベース シャーディングの基本
- 参考: #6「Shardingマジ怖い」tech.kayac.com Advent Calendar 2012
ActiveSupport::TimeWithZoneインスタンスをfreezeすると#to_datetime
を呼べない問題を修正(Rails公式より)
修正のため、freezeの際にutc
やtime
の他に#to_datetime
も呼ぶことでActiveSupport::TimeWithZoneのインスタンス変数をプリロードするように変更されました。修正後のコードを以下に示します。
def freeze
# freezeの前に以下をプリロード
period; utc; time; to_datetime
super
end
#quoted_id
が非推奨になった(Rails公式より)
ActiveRecord::Sanitization#quoted_idは文字どおりidを引用符で囲んで返します。devdocs.ioでは出てこないことから、Railsでの内部利用が主と思われます。今後は型変換での対応が推奨され、実際の削除はRails 5.2で行われる予定です。
その他の細かな修正・変更(Rails公式より)
- Issue: #28112: ActiveJobのinfoログにJobIDを出力するようになった
- Issue: #28158: ActiveSupport::Gzip.decompressでgzipフッタがないかをチェックするようになった
- Issue: #28138:
HashWithIndifferentAccess#compact
がnilでない場合にnilを返すことがあった問題を修正
#28138でHashWithIndifferentAccess
がHWIAと略されているのがもう何がなんだかですね。
Heroku: 古いBundler 1.12のRubyバージョン指定のバグによる不具合
Herokuのブログ記事です。#4627によると、bundler 1.12まではGemfileで指定したRubyのバージョンとGemfile.lockのバージョンで互換性が取れなくなることがあり、bundle install
してもRubyのバージョンが変更されないという不具合がありました。
この問題はbundler 1.13で修正されましたが、Herokuユーザーの中にはローカルで古いbundlerを使い続けている人もそこそこいたらしく、Heroku側で1か月前にbundlerを1.13.7にアップデートしたところ、Your Ruby version is <X>, but your Gemfile specified <Y>
エラーが発生したユーザーから多数の問い合わせを受けたそうです。
私も念のためローカルでマイアプリのgem install bundler
を実行してbundlerを最新バージョンにアップデートしましたが、今度は別の問題が起きた...明日修正しよう。
Rubyコード: こういう書き方はもうやめた
Rails開発を8年やった著者が動的なプログラミングのやりすぎを反省している記事です。
send
とmethod_missing
でメタプログラミングしすぎると後からのリファクタリングやgrepが困難になる- Hashのkeyを動的に組み立てるのも同じ理由でもうやりたくない
- ActiveSupportの
constantize
やunderscore
を使ってAbc::Xyz
からCSSクラスabc_xyz
を動的に生成するのもやめたいと思っている
何だかニコチン中毒患者の告白みたいに見えてきました。
社内有志一同で記事をチェックしていて「こうやってメタにささっと書きたい気持ち、わかる!」「でも後で死ぬよね」と次々に共感の声があがりました。
JVMはそこまで重くなんかないお
とある技術系Slackで議論を呼んだ「Clojureが嫌なのはJVMが重いから」という意見への反論です。コメント欄もずいぶん伸びています。
一同からは「JVMはとっくの昔から速くなってるじゃない」と一斉にツッコミがありました。
devbattles.comのITトーナメント
https://www.devbattles.com/en/tournaments/indexのSlack imageより
またしてもプログラミングのクイズサイトです。開発者同士のSNSも兼ねているようです。
instacartにオープンソースソフトウェアのコーナー
- Webサイト: Open Source at Instacart
instacart.comは米国の食料品宅配サービスですが、なぜかその一隅にオープンソースソフトウェアも並んでいます。といってもそのほとんどはankaneことAndrew Kane氏のリポジトリからのものです。
ankane氏はGitHubにソフトウェアやドキュメントを多数公開していて、かつその多くが大量の☆を獲得しています。
中でも有名なのはchartkickでしょう。Railsで1行書くだけでJavaScriptの美しいグラフを作成できるgemで、日本でも使っている人が結構いるようです。
ankane氏のRailsアプリ開発とセキュリティのベストプラクティス
- リポジトリ: ankane/production_rails
- リポジトリ: ankane/secure_rails
そのankane氏がGitHubに公開している、Railsのアプリ開発やセキュリティのベストプラクティス集です。
自身の開発したgemもさりげなく織り込んであったりしますが、特にセキュリティはチェックリストとしてかなり役に立ちそうです。ぜひ一度チェックしてみてください。
CloudFlareのリバースプロキシが初期化されてないメモリをダンプしてる(HackerNewsより)
3/2の時点でHackerNewsダントツトップです。BingにまだCloudFlareのキャッシュが残っているという別記事もエントリしています。
MozillaがPocketを買収(HackerNewsより)
記事そのものは見出しのとおりですが、文中でリンクされている技術ブログ「Context Graph: It’s time to bring context back to the web」を経由して、Mozillaが推進しているContext Graphという一種の「コンテンツの自動推薦システム」にたどりつきました。
FirefoxのActivity Streamがその実装のひとつであるようです。
SHA-1コリジョンアタックについてLinus Torvaldsからのコメント(HackerNewsより)
- MLでのコメント: Re: SHA1 collisions found
SHA-1コリジョンアタック騒ぎで「Gitは大丈夫なのか」という意見への返信ですが、さすが落ち着いています。
BPS社内では、むしろapt-getでミラーサイトからdebパッケージを取ってくるようなときの方が心配だとの声もありました。いずれにしろSHA-1をどうにかすることについては避けては通れない流れですね。
生産性が10倍高いプログラマーはたぶんここが違う(HackerNewsより)
著者のantirezはRedisの中の人ですね。以下は著者の20年のプログラマー経験を元にした「たぶんここが違う」リストです。エッセイなのでエビデンス云々は気にしないようにします。
- Bare programming abilities: getting sub-tasks done
- Experience: pattern matching
- Focus: actual time VS hypothetical time
- Design sacrifice: killing 5% to get 90%
- Simplicity
- Perfectionism, or how to kill your productivity and bias your designs
- Knowledge: some theory is going to help
- Low level: understanding the machine
- Debugging skills
冒頭で「プログラミングスキルの成長は線形ではない」というような見解を述べています。1つめはpairでもbearでもなく"bare programming abilities"でした。ここでは「地の」とか「素の」ぐらいの意味ですね。
W3C Web AnnotationがRecommendedになった(HackerNewsより)
Web AnnotationはW3Cが進めている規格のひとつで、あらゆるWebサイトにコメントできる機能を目指しています。電子書籍にも関連する部分がありそうで気になるところです。
日本では国の科学技術プラットフォームからつい先ごろ「W3C、Webアノテーションに関する3文書を公開」がアナウンスされたところです。おや、リンク先の文字が微妙に足りないような気が。
Webアノテーションを推進するhypothes.is
これに関連して、少し前の国立国会図書館のアナウンスに、Webアノテーションを推進するhypothes.isという団体について言及されているのを見つけました。WebアノテーションについてはこのWebサイトがわかりやすそうです。
hypothes.isで試せるWebアノテーション
hypothes.isのトップページにChrome extensionのインストールボタンがあり、それをクリックすればChromeブラウザにWebアノテーション機能を即座に追加できます。ユーザー登録してメールのリンクをクリックすると、https://hypothes.is/searchでいろんな人がいろんなWebサイトにつけたコメントを見ることができます↓。
Chrome extensionをオンにすると、Webページ右上隅にボタンが表示され、ここでコメントを追加したり見たりできます。少々邪魔ですね。
コメントは一般公開しないようにもできるようです。
果たして今後どのように普及し、どのように使われるようになるでしょうか。
Rasberry PIがWiFi/Bluetooth付きで10ドル(HackerNewsより)
https://www.raspberrypi.org/blog/raspberry-pi-zero-w-joins-family/より
日本円にして1000円ですよ奥さん。
一同で基板の写真を眺めながら、USBの給電が割りと不安定なこと、PoEでのEthernetケーブル給電は上位製品なら安定しているがハブ側の対応が必要、などの話題が出ました。今PoEのリンク先を見ると「活線挿抜で火花が散ることがある」とありました。電力系と信号系の共存は個人的にどきどきしちゃいます。
morimorihogeさんが「Googleの「サーバー1台ごとにバッテリー持たせた方がUPSより効率的」には本当に驚いた」という記事を思い出し、そこからサーバーセンターでの直流給電やバッテリー導入について、果てはUPSが原因でPCが煙を吹いた思い出などについても話題が広がりました。
今週は以上です。
関連記事
- 週刊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など)です。