- 開発
週刊Railsウォッチ(20171013)Ruby 2.5.0-preview1リリース、RubyGems 2.6.14でセキュリティバグ修正、Bootstrap 4.0がついにBetaほか
こんにちは、hachi8833です。
Rails: 今週の改修
新機能: HTTP/2プッシュ用のEarly Hintsを実装
Aaron Patterson氏のロングインタビュー↓でも言及されていた「アーリーレスポンス」がHTTP 103 Early Hintsとして実装されました。
[インタビュー] Aaron Patterson(後編): Rack 2、HTTP/2、セキュリティ、WebAssembly、後進へのアドバイス(翻訳)
とにかく、Kazuhoは新しい標準化を提案することを思いつきました。それは新しいレスポンスコードで、私はそれが101か110だと思っています。これはアーリーレスポンスと呼ばれるもので、HTTP/1の普通のレスポンスコードなのですが、本質的にプッシュ(HTTP/2プッシュ)と同じものです。使っているプロキシがこのレスポンスコードを理解し、それをHTTP/2プッシュに変換するというわけです。
この方法の良い点は、HTTP/1で動くサーバーがあり、そのサーバーの通信相手であるプロキシがHTTP/2で話せるなら、プッシュを行いたいということをプロキシが理解できるという点です。本質的にHTTP/1とHTTP/2のいいとこ取りができるので、HTTP/1サーバーにまったく影響を与えずに引き続きプッシュを行えます。
つっつきボイス: 「上のロングインタビュー時点では@kazuhoさんから提案中だったのが、Aaronさんの期待どおり見事採用されてる」「HTTP/2 Early HintsはRailsに限らない話で、プロトコルが拡張されたことの方が大きい」「ほほー、レスポンスコードは?」「103番ですね」
「Early Hintsについてはこちらのブログ↓見ればひととおりわかります。Web開発者必読」
- blog.jxck.io: HTTP の新しいステータスコード 103 Early Hints
「しかし103番とは随分と若い番号」「HTTP 1xx番台はInformationalなのか: ところでこのWikipediaにはまだ103は書き足されてないから更新必要ですね」
「変更は意外にシンプルだった↓」「環境変数で指定できる: デフォルトはnil
だそうです」
# actionpack/lib/action_dispatch/http/request.rb
+ def send_early_hints(links)
+ return unless env["rack.early_hints"]
+
+ env["rack.early_hints"].call(links)
+ end
存在しないAction Cableサブスクリプションの解除メッセージをわかりやすくした
actioncable/lib/action_cable/connection/subscriptions.rb
def remove(data)
logger.info "Unsubscribing from channel: #{data['identifier']}"
- remove_subscription subscriptions[data["identifier"]]
+ remove_subscription find(data)
end
つっつきボイス: 「これは普通にリファクタリングですね」
テストでRuby 2.5の未使用変数warningが出たのを修正
# railties/test/generators/argv_scrubber_test.rb
- message = nil
scrubber = Class.new(ARGVScrubber) {
- define_method(:puts) { |msg| message = msg }
+ define_method(:puts) { |msg| }
}.new ["new", "--rc=#{file.path}"]
args = scrubber.prepare!
assert_equal ["--hello", "--world"], args
文言修正系PR
# activerecord/lib/active_record/connection_adapters/postgresql_adapter.rb
- raise(ArgumentError, "Postgres requires advisory lock ids to be a signed 64 bit integer")
+ raise(ArgumentError, "PostgreSQL requires advisory lock ids to be a signed 64 bit integer")
- # NOTE: This won't affect any <tt>ActiveSupport::TimeWithZone</tt>
- # objects that have already been created, e.g. any model timestamp
- # attributes that have been read before the block will remain in
- # the application's default timezone.
+ # NOTE: This won't affect any <tt>ActiveSupport::TimeWithZone</tt>
+ # objects that have already been created, e.g. any model timestamp
+ # attributes that have been read before the block will remain in
+ # the application's default timezone.
つっつきボイス: 「修正と関係ありませんが、英語圏の人ってPostgresって書くの好きですね: 私は翻訳のときは常にPostgreSQLと書き直してます」「日本語のポスグレは口頭でしか使わない感じですね」
compatibility.rbのリファクタリング(DRY化)
コミットメッセージどおり、重複したコードをprivateにまとめています。
# activerecord/lib/active_record/migration/compatibility.rb
if block_given?
- super(table_name, options) do |t|
- class << t
- prepend TableDefinition
- end
- yield t
+ super do |t|
+ yield compatible_table_definition(t)
end
else
...
private
+ def compatible_table_definition(t)
+ class << t
+ prepend TableDefinition
+ end
+ t
+ end
Rails
Rails 5とGriddlerとMailgunでメールを受信してパースする(RubyFlowより)
つっつきボイス: 「ほほー、自前のメールサーバーを使わずにRailsでメール受信トリガの処理を実行する方法か: 普通メール受信をトリガにして何かするときは、postfixとか使って.forwardあたりでスクリプトに受信メールを流し込んで実行したりするけど」
「なおAWSを使っていいのであれば、SES(Simple Email Service)でS3に受信できるので、S3のfile createのイベントをLambdaに流して同じことができるはず」
そこからNAT越え(NAT traversal)の話題になりました。
「ngrokというサービスとプログラムを使うと、双方ともNATの裏にいてもtunnelingできるらしい」「ご家庭でゲームのためにUPnPのNAT越え頑張ったりしますね」「UDPホールパンチングなんてのも」「ゲームやらない人なのでこのあたり知らないことだらけ」
shioyamaさんのMobility gem記事
- 元記事: Mobility 0.2: Now with Plugins
- リポジトリ: shioyama/mobility
以前のウォッチでもご紹介したRails多言語化gemです。Module Builderパターンの実例についてここでも熱心に解説されています。
この方の英文は(内容の難しさと量は別にしても)とても読みやすいと思います。
Skinny: Scalaで書かれたRails的フレームワーク
- リポジトリ: skinny-framework/skinny-framework
- サイト: skinny-framework.org
- Wikipedia-ja: Scala
ちょっと珍しいので拾ってみました。★も600越えと意外に伸びています。
つっつきボイス: 「これ見てて思ったけど、Railsの方法論はいろんなフレームワークに広がりましたね」
「Railsが流行ってから他のWebアプリケーションフレームワークも軒並みCLIのscaffold的なgeneratorとかを搭載するようになったし、つくづくRailsの影響は大きかったと思う」「以前PHPフレームワークのSymfony使ってたけど、v2はもうホントRailsっぽいCLI」
Ruby
Ruby 2.5.0-preview1がリリース(Ruby公式ニュースより)
- プレスリリース: Ruby 2.5.0-preview1 Released
新機能
Finally! Ruby 2.5 prints backtrace messages in reverse order. No more scrolling. https://t.co/GsW6qyHzYQ
— DailyRubyTip (@dailyrubytip) October 11, 2017
- バックトレースを逆順で見やすく表示
- トップレベルの定数探索を廃止
do
/end
ブロック内でrescue
/else
/ensure
を使えるようになったyield_self
その他2.4以降の変更
- Onigmoの非包含演算子(absence operator)
- Bundlerが標準ライブラリの仲間入り
- rubygemsが2.6.13に
- rdocが6.0.0.beta2に、従来のIRB lexerに代えてRipperを導入し高速化
- Unicode 10.0.0をサポート
2.5.0preview1 の RubyGems は 2.6.14 ということになっていますが正体は 2.7.0 相当なのと、Bundler の stdlib 化でおそらく buggy な部分があると思うのでみなさん試しておかしいところはバグレポートお願いします。
— SHIBATA Hiroshi (@hsbt) October 10, 2017
つっつきボイス: 「Ruby 2.5はbundlerがbundleされた点がとてもうれしいので、ぜひ早く安定版が出て欲しい」
RubyGems 2.6.14でセキュリティバグ修正
Aaron Pattersonさんが書いています。RubyGems 2.6.14にアップデートするには以下を実行します。
gem update --system
良いRubyコードを書くためのあまり知られていない7つの技(RubyFlowより)
良記事です。つっつきも大いに盛り上がりました。このRubyGuidesというサイトの他の記事もよさそうです。
つっつきボイス:
Integer#digits
「桁をバラして配列で取り出せるのかー: 使いみち思いつかないけど」「数学パズルとかに使えるかな?」#tap
「このメソッドは、使う人はすごく使うけど使わない人は全然使わないですね: こんなふうに1回だけ#tap
するのは気持ちわかる」
User.new.tap { |user| user.name = "John" }
「でもこのサンプルコードみたいにチェインするのは好きじゃない」「う、読みづらい...」
"hello".bytes.to_a.tap {|arr| p arr }
.collect {|byte| byte.to_s(16) }.tap {|arr| p arr }
#=> [104, 101, 108, 108, 111]
#=> ["68", "65", "6c", "6c", "6f"]
#values_at
「Arrayの何番目と何番目と指定していっぺんに取り出せるんですね」「これ、Hash#values_at
の方が便利そう↓」「params
のこれとこれだけ取り出したりできるのか」
h = {1=>"a", 2=>"b", 3=>"c"}
p h.values_at(1,3,4) #=> ["a", "c", nil]
# [h[1], h[3] ,h[4]] と同じ
#transform_values
「!
付きの#transform_valuesもあるけど、!
なしの方が便利そうかな」「ワイも!
なしが好き」
h = { a: 1, b: 2, c: 3 }
h.transform_values {|v| v * v + 1 } #=> { a: 2, b: 5, c: 10 }
h.transform_values(&:to_s) #=> { a: "1", b: "2", c: "3" }
h.transform_values.with_index {|v, i| "#{v}.#{i}" }
#=> { a: "1.0", b: "2.1", c: "3.2" }
Kernel#itself
「自分自身にアクセスしたいことってたまにある」「これは考えて使わないとよく分からなくなりそう」
string = 'my string' # => "my string"
string.itself.object_id == string.object_id # => true
- Enumerable#cycle「テストデータを無限に生成するのとかに使えるかも」
a = ["a", "b", "c"]
a.cycle {|x| puts x } # print, a, b, c, a, b, c,.. forever.
a.cycle(2) {|x| puts x } # print, a, b, c, a, b, c.
「あー良い記事でござった」「little-knownダナ確かに」
RubyのGILを理解する
GILといえば卜部さんのブログにこんなことが書いてありました。
GVL (じーぶいえる) GILとも。Global VM Lock。嫌われもの。だがパフォーマンスを犠牲にしつつもみんなを[BUG]から守ってくれてるんだぞ。もっと感謝すべきだ。
‘10年代のRubyコア用語集より
つっつきボイス: 「よく話題になるやつです: ↑ホントこのとおり」「GってGiantのGだったりもしますね」「まあ意味は変わりませんが」「せっかくスレッドがCPUに分割されてもGILが発生すると一斉に一時停止しちゃう」
RubyのSymbolってなくせないの?
We tried & failed.
Link: Could we drop Symbols from Ruby? | Arkency Blog https://t.co/um0xnWSpcQ— Yukihiro Matsumoto (@yukihiro_matz) October 5, 2017
つっつきボイス: 「RubyのSymbolって私好きなので、問題だと思ってませんでした」「frozen_string_literal
がある今となっては、もしかするとSymbolっていらないのかも」
「Symbolを持つ言語はLispやSmalltalkなど他にもあるけど、おそらくRubyのSymbolって当初の概念からかなり踏み出して独自路線になっちゃったのかも: Symbol#to_s
できちゃうとか」「確かに: Symbolをputs
するにはto_s
が必要だけど、それが当初の想定を超えて文字列代わりにどんどん使われたり」「RailsのHashWithIndifferentAccessなんてのができたり」
「JavaにはSymbolないので、キーの文字列がたまに一意にならなくて数値に変えたりとつらかったなー」
Ruby Rogueポッドキャスト: Martin FowlerとRubyコードをリファクタリングしよう
Ruby Rogueはこの間のウォッチでも軽くご紹介しました。
Martin Fowler氏はRefactoring -- Ruby Editionの著者です。この本の日本語版があったのに今は絶版なのが何とも残念。
つっつきボイス: 「お、目次もあるし、内容もいい感じ」「このポッドキャストは月一ぐらい?」「もっと頻繁みたいです」「それは凄い: 長く続いてるのは大事」
「そういえば日本語だとrebuild.fmという音声ポッドキャストが随分長くやってますね」「rebuild.fmは毎回いろんなベテランエンジニアの話が聴けるのがよくて、BPS社内にも愛聴者がいたと思う」
「Ruby Rogueも同じ感じでやってるようです: DHHインタビューとか、かと思うと元ストリートパフォーマーからRails開発者に転身した人の話とか、盛りだくさんですね」「字幕があれば英語ヒアリング練習にもいいかも」
bolt: SSHやWinRM経由で多数のコマンドを実行するgem(GitHub Trendingより)
- リポジトリ: puppetlabs/bolt
$ bolt command run 'ssh -V' --nodes neptune,mars
neptune:
OpenSSH_5.3p1, OpenSSL 1.0.1e-fips 11 Feb 2013
mars:
OpenSSH_6.6.1p1, OpenSSL 1.0.1e-fips 11 Feb 2013
Ran on 2 nodes in 0.27 seconds
つっつきボイス: 「capあれば同じことできますね」「capって何でしたっけ」「capistranoのコマンド」「あ、そうだった」
「この種のツールはやっぱりsingle binaryで動いてくれる方がうれしいので、自分は使わないかな: Go言語とかで作られてる方が便利だなあ」「perlのスクリプトとか、環境が変わると微妙なバージョン違いで動かなかったりしますね」
- capistrano -- Rubyで書かれたデプロイ/サーバー操作ツール
Rubyはどうやって開発を進めているか
違います。事前の青写真も緻密な計画もありません。#SOSL
— Yukihiro Matsumoto (@yukihiro_matz) October 11, 2017
つっつきボイス: 「伽藍とバザールですね: そうとう昔のですが、今日のOSSの歴史を辿るとまず間違いなく参照される文書: これ以外で伽藍という用語を見たことないけど」
「90年代にオープンソースの隆盛を予言したやつですね: 当時騒いだのは開発者より文化人の方が多かったような覚えが」
「伽藍が読めなかった」「がらん、って大聖堂とかの方がわかりやすいかも」「cathedralだからカテドラルか」
そういえば伽藍という言葉を覚えたのは西遊記でした。六丁六甲、五方掲諦、四値功曹、護駕伽藍。
Ruby trunkより
提案: ファイルが存在する場合にx
モードで開いたらraiseすべき->#11258と重複
# C言語: file.txtを作成するが、既に存在していたらraiseする
open('file.txt', 'wx') {|f| f.puts("Some text") }
つっつきボイス: 「openのx
モードとか知らなかったー」「wx
って最初意味分からなかった」「PHPだけどこんなの見つけた↓」
'x' 書き込みのみでオープンします。ファイルポインタをファイルの先頭に置きます。 ファイルが既に存在する場合には fopen() は失敗し、 E_WARNING レベルのエラーを発行します。 ファイルが存在しない場合には新規作成を試みます。 これは open(2) システムコールにおける O_EXCL|O_CREAT フラグの指定と等価です。 このオプションはPHP4.3.2以降でサポートされ、また、 ローカルファイルに対してのみ有効です。
http://php.net/manual/ja/function.fopen.phpより
「manではこう↓」
open(2) システムコールにおける O_EXCL|O_CREAT
「あった、これこれ↓」
O_EXCL
この呼び出しでファイルが作成されることを保証する。このフラグが O_CREAT と 一緒に指定され、 pathname のファイルが既に存在した場合、 open()は失敗する。
https://linuxjm.osdn.jp/html/LDP_man-pages/man2/open.2.htmlより
「他の言語と同じようにPOSIXのopen()
に準拠しようよ、ってことか」
そこからPOSIXのシステムコールの名称の話題になりました。
「O_EXCL
とかO_CREAT
とかO_TRUNC
みたいな、本体が5文字の短いシステムコールは古くからあるやつで、O_NOFOLLOW
みたいに長いのはたぶん後から追加されたやつです」「へええ」「昔はこういうところをケチらざるを得なかったんですね」
JavaScript
async
とawait
を4つの例で学ぶ(JavaScript Liveより)
// 同記事より
async function startSynchronous() {
try {
const pentaCodeAvatarUrl = await getPentaCodeAvatar();
const reactAvatarUrl = await getReactAvatar();
const totalURL = pentaCodeAvatarUrl + reactAvatarUrl;
console.log(totalURL);
} catch (e) {
console.error('Error in startSynchronous (Async Await Based)', e);
}
}
startSynchronous();
つっつきボイス: 「出たなPromise
」「async
やawait
をガンガン使うようなJSコード、納期が超緩い案件ならやってみたい」
amatudaさんのRubyConf Malaysia 2017スライド
Here are the slides from my opening keynote at RubyConf Malaysia 2017 "Ruby, Community, and You" https://t.co/0lDwiL6s2u #rubyconfmy
— Akira Matsuda (@a_matsuda) October 12, 2017
CSS/HTML/フロントエンド
Bootstrap 4.0が「ついに」Beta版に
つっつきボイス: 「公式サイトのトップ画面がついに変わった!」「Bootstrap 4.0で長く待たされた人たちはみんな仏の境地になってますね」「ちょうど今年の学生に『Bootstrap 4.0は当分先です』と教えたところだった」
リモートつっつき: 「Formの書き方が変わり、-xs
が廃止になってアイコンフォントも標準付属でなくなったので、3からそのまま入れ替えるとめちゃくちゃに壊れますが、ブレークポイント4段なのがとても良い☺️」
「アイコンフォントの分離は、require(‘boostrap’);
時にcssの@import
を辿ってWebpackがフォントを読み込もうとして😞 になるのを回避できるので逆に良い」
5分でタイポグラフィを改善するコツ(HackerNewsより)
デザイン寄りの記事です。
つっつきボイス: 「こういうの、日本語の縦書きやルビになると全然違ってきますよねー」「確かに」
Go言語
caddy: Let's Encryptの証明書を自動で使えるHTTP/2サーバー(GitHub Trendingより)
- リポジトリ: mholt/caddy
1か月足らずで驚異の★14,000超えです。
つっつきボイス: 「single binaryで動くので良さそう」「OpenSSLとかもbundleされてるなら嬉しいな」
supervisord: Goで書かれたsupervisor(GitHub Trendingより)
- リポジトリ: ochinchina/supervisord
$ supervisord -c supervisor.conf -d
$ supervisord ctl status
$ supervisord ctl stop <worker_name>
$ supervisord ctl start <worker_name>
$ supervisord ctl shutdown
つっつきボイス: 「本家のsupervisord↓と名前が同じでさえなければなー: このままじゃ議論になったときも区別が大変」「コマンドとかconfigは互換保とうとしてるっぽいけど、完全に同じでないと実際に運用しようとするときに問題になりそう」
- 参考: Supervisorの使用方法
rat: シェルコマンドを組み合わせてターミナルアプリを作るツール(GitHub Trendingより)
- リポジトリ: ericfreese/rat
tig的なCLIツールを作れます。
wow: Go CLI用のかわいいスピナー(GitHub Trendingより)
- リポジトリ: gernest/wow
その他
fd: 改良版findコマンド(GitHub Trendingより)
- リポジトリ: sharkdp/fd
find -iname '*PATTERN*'
fd PATTERN // 書式がシンプル
Rustで書かれています。カラー表示がうれしいです。
sorting.at: ソートのビジュアル表示
- 元記事: SORTING
最初Hacker NewsのSorting Visualizationsにしようかと思いましたがこちらの方がずっと美しくて明快だったので。
つっつきボイス: 「ソートのアルゴリズムを学んでない人にはよさそう」
「ところでソートといえばこの名作動画を思い出しますね↓」「こ、これはw」「なごむー」
cosmos: さまざまな言語で書かれたアルゴリズムとデータ構造コレクション
- リポジトリ: OpenGenus/cosmos
# https://github.com/OpenGenus/cosmos/blob/master/code/search/binary_search/binary_search.rb より
=begin
Part of Cosmos by OpenGenus Foundation
=end
def BinarySearch(arr, l, r, x)
if x.nil?
return -1
end
if r >= l
mid = (l + r)/2
if arr[mid] == x
mid
elsif arr[mid] > x
BinarySearch(arr, l, mid-1, x)
else
BinarySearch(arr, mid+1, r, x)
end
end
end
arr = [3,5,12,56,92,123,156,190,201,222]
number = 12
puts "Position of #{number} is #{BinarySearch(arr, 0, arr.length-1, number)}"
Rubyが少ないのが残念。主催はOpenGenusという団体です。
番外
RoBozzle: 子供も大人も楽しめるパズルゲー
- サイト: robozzle.com
Hacker Newsのコメント欄で見つけました。まだ遊んでませんが、ちょっと倉庫番を思い出しました。
つっつきボイス: 「これで思い出したけど、codecombatっていう、ゲームでプログラミングを学ぶサイトも面白いですよ↓: お、今見てみたら前よりずっと進化してる」「ローカライズもかなり頑張ってる感じですね」
今週は以上です。
バックナンバー(2017年度)
週刊Railsウォッチ(20171006)PostgreSQL 10ついにリリース、Capybaraコードを実画面から生成するnezumiほか
- 20170929 特集: RubyKaigi 2017セッションを振り返る(2)Ruby 2.3.5リリースほか
- 20170922 特集: RubyKaigi 2017セッションを振り返る(1)、Rails 4.2.10.rc1リリースほか
- 20170915 Ruby 2.4.2リリースで脆弱性修正、strong_migrations gemでマイグレーションチェック、書籍『Mastering PostgreSQL』ほか
- 20170908 Rails 5.1.4と5.0.6リリース、コード書換え支援gem「synvert」、遅いテストを分析するTestProfほか
- 20170818 RailsとYarnでTypeScript、Rails新コミッタにkamipoさんも、CSVにSQLクエリをかけられるツールほか
- 20170804 Rails 5.1.3と5.0.5が正式リリース、GitHubでローカライズ基盤サービス、正規表現で迷路を解くほか
- 20170623 gemを見極める7つのコツ、mixinがよくない理由、重いページをrender_asyncで軽減ほか
- 20170616 railsdiff.orgはアップグレードに便利、RubyのDSLとかっこの省略、TerraformをRubyで制御ほか
- 20170609 ついにtherubyracerからmini_racerへ、注意しないとハマるgem、5.1でのVue.jsとTurbolinksの共存ほか
- 20170602 チームが喜ぶ19のgem、Bundler 1.15が高速化&機能追加、Deviseに挑戦する新認証gem「Rodauth」ほか
- 20170512 Rubyの不思議な挙動「シャドウイング」、コードレビュー作法を定めるDanger gemほか
- 20170428 Rails 6.xでの’#form_for’と
#form_tag
廃止決定のその後、deviseの5.1対応はこれから、ほか - 20170421 RailsConfが来週アリゾナで開催、コントローラを宣言的に書けるdecent_exposure gemほか
- 20170414 サーバーを危うくする1行のコード、PostgreSQL 10の新機能ほか
- 20170407 N+1問題解決のトレードオフ、Capybaraのテスト効率を上げる5つのコツほか
- 20170331 PostgreSQLの制約機能を使えるRein gemはビューも使えるほか
- 20170324 Ruby 2.4.1リリース、GAEがついにRubyに対応、このgemがないと生きていけない27選ほか
- 20170317 Railsパフォーマンスチューニング本、DBレコード存在チェックの最速メソッド、RubyのUnicode正規化ほか
- 20170310 クールなDocker監視ツールCtop、RailsがGoogle Summer of Code 2017に正式参加、Unicode 10.0.0ドラフト発表ほか
- 20170303 5.0.2正式リリース、メタプログラミングに懲りた話、bundler 1.12のバグ、すぐ試せるWebアノテーションほか
- 20170227 Rails 4.2.8リリース、SHA-1コリジョンアタック、便利なハッシュ変換ツールほか
- 20170217 Rails 4.2.8.rc2リリース、Ruby 2.4正規表現とActiveSupportのnormalizeほか
- 20170210 JRubyやRubiniusの配列への追加はスレッドセーフではないほか
- 20170203 AnyLogin gemで開発中に楽々再ログイン、イベント数ベース課金の監視サービスRollbarほか
- 20170127 わかりやすいAWSサービス名、Rails DBは便利、TruffleRubyの驚異的速度ほか
- 20170120 Ruby 2.5.0 devリリース、古いMySQLのサポート終了、uniqメソッドが削除ほか
- 20170116 Ruby 2.4の詳細、範囲指定したsumメソッドは速い、rescueの挙動を動的に変更ほか
- 20170110 ReactをRailsに置き換える、Ruby 2.4の新機能ほか
今週の主なニュースソース
ソースの表記されていない項目は独自ルート(TwitterやRSSなど)です。