週刊Railsウォッチ(20171006)PostgreSQL 10ついにリリース、Capybaraコードを実画面から生成するnezumiほか

こんにちは、hachi8833です。暑がりさんなので今日も扇風機にあたっています。

それでは10月最初のウォッチ、いってみましょう。なお「Rails: 今週の改修」は本家で更新がありませんでした。

号外: PostgreSQL 10が正式リリース

9月後半にPostgreSQL 10 RC1がリリースされていたので記事にしようと思っていましたが、昨晩正式版がリリースされたので急遽差し替えました。

記念写真を取るためにとりあえずインストールして動かしてみました。MacのHomebrewでインストールしていたPostgreSQL 9をbrew services stop postgresqlでいったん止め、BigSQLのパッケージマネージャでインストールしました。このパッケージマネージャは関連ファイルを1つのフォルダにまとめてくれるので散らからないところが便利でした。

ちょうど11/3文化の日にPostgreSQL Conference Japan 2017が開催されるので、そちらも盛り上がることでしょう。


つっつきボイス: 「PostgreSQL 10の導入は、Rails(特にActiveRecord)でひととおりバグが取れるまで様子見かな」

Ruby trunkより

Tempfile.open()の挙動がおかしい=>バッファならそうなる(却下)

>> Tempfile.open() { |f| (1..10000).each { |i| f.puts i }; `tail -n1 #{f.path}` }
=> "8416"
>> Tempfile.open() { |f| (1..100000).each { |i| f.puts i }; `tail -n1 #{f.path}` }
=> "98835"
>> Tempfile.open() { |f| f.puts "Test\n"; `tail -n1 #{f.path}` }
=> ""

つっつきボイス:(1..10000).eachを回してtail -n1でラス1行だけ取ろうとしたのか: f.puts iでバッファされるから取れる保証がない」「パッチモンスターことnobuさんがツッコんでたバッファってそこなのか」

Ruby

Rubyのヒープをビジュアル表示(Ruby Weeklyより)


tenderlovemaking.comより

RubyとRailsを両方手がけるAaron Pattersonさんの記事です。つい最近日本語ツイートがバズって外部でも有名になりましたね。

# 同記事より
require 'objspace'

x = 100000.times.map { Object.new }
GC.start
File.open('heap.json', 'w') { |f|
  ObjectSpace.dump_all(output: f)
}

つっつきボイス: 「おー、これはこの間のRubyKaigi 2017のスピーチ「Compacting GC in MRI」で使ったテクニックを解説している感じか」「GC(ガベージコレクション)も出てくる」

週刊Railsウォッチ(20170929)特集: RubyKaigi 2017セッションを振り返る(2)Ruby 2.3.5リリースほか

[インタビュー] Aaron Patterson(前編): GitHubとRails、日本語学習、バーベキュー(翻訳)

ガイジン向けRubyKaigiガイド(Ruby Weeklyより)


schneems.comより

とても面白い読み物です。日本人開発者はあまりガイジンに話しかけてくれないということに気づくのに時間がかかったそうです。(゚⊇゚)ガイジソー


つっつきボイス: 「これは翻訳するとよさそう」「はいよろこんでー

来年のRubyKaigiあたりでどなたか試していただきたいのですが、ガイジンの皆さんにコンビニの肉まん食べさせてみたらきっと半分以上の人がハマると思います。次回は5月なのでコンビニにないかな。

著者のRichard Schneemanさんのプロフィールに「2016年度のRuby Hero」とあったので、つっつきメンバーで探してみました。


つっつきボイス: 「Ruby Heroって初めて聞いた」「↓おーこれか」「Code Schoolがスポンサー」


rubyheroes.comより

ヒーローリストにamatsudaさんやko1さんやいろんな人いる」「どうやって選出しているでござるか?」「nominateってリンクがあるから他薦ですね」「く、このリンク効かない…」「選出の時期が来たらフォームが開くんでしょうね」「米国のRailsConferenceで発表されるんですね: 以前のウォッチ↓でも紹介しましたが、今年の開催は4月でした」

週刊Railsウォッチ(20170421)RailsConfが来週アリゾナで開催、コントローラを宣言的に書けるdecent_exposure gemほか

OptCarrotはCPUベンチマークにいいぞ


engineering.appfolio.comより

表示がわかりにくいのですが、RubyKaigi 2017でHow Close is Ruby 3×3 For Production Web Apps?をスピーチしたNoah Gibbsさんの記事でした。TechRachoの翻訳記事でもお馴染みかと思います。

米国から見た日本のRuby事情(翻訳)


つっつきボイス:OptCarrotはRubyで書かれた任天堂のファミコンのエミュレータです」「英語圏だとNES(Nintendo Entertainment System)って呼ばれているのは知ってたんですが、NESの写真みたのはこの記事が初めてでした: ファミコンと相当見た目違う」

「RubyKaigiやいろんなところで、RubyのベンチマークにOptCarrot使ってるのを見かけるので、これを標準原器的に使うという暗黙のコンセンサスがあるのかなと思ってました」「まあ、OptCarrotで好結果を出したとしてもそれによってたとえばRailsが速くなるかというと、ボクはとっても疑問ですけどねw」

「なお言語の処理そのもののパフォーマンスをチェックするときは、ディスクアクセスやネットワークアクセスみたいな二次的な要素はできるだけプログラムから排除しないと、言語のパフォーマンスチェックのはずがネットアクセスのチェックになったりしかねないんですよ」「あー、なるほど: こういうエミュレータならサイズも小さいし継続的に適度な負荷もかかるしネットアクセスもないし」「見てて楽しいし」「この記事でもまさにそういう話してるみたいですね」

Mac OS High SierraのforkでPumaなどに問題が生じる(Ruby Weeklyより)

# エラーメッセージ
objc[81924]: +[__NSPlaceholderDictionary initialize] may have been in progress in another thread when fork() was called.
objc[81924]: +[__NSPlaceholderDictionary initialize] may have been in progress in another thread when fork() was called. We cannot safely call it or ignore it in the fork() child process. Crashing instead. Set a breakpoint on objc_initializeAfterForkError to debug.

つっつきボイス: 「よく見つけたなーこれ: High Sierraまだ入れてないけど」「私も」「ワイもまだ」「Puma以外にも影響出そうだし、そもそもfork()の挙動を変えたとなるともっと影響範囲でかいんではなかろうか」

同issueで参照されているObjective-C and fork() in macOS 10.13には以下の記述があります。

As of macOS 10.13, the Objective-C runtime now supports use between fork() and exec() in applications built with the 10.13 SDK. There are restrictions involving +initialize methods. Previously incorrect code may now be correct, or it may fail consistently due to +initialize behavior.
Note that the Objective-C classes defined by the OS frameworks remain fork-unsafe. As a first approximation it is still incorrect to do anything between fork() and exec().

ページを失念してしまいましたが、このあたりの記事のリンクを追っているうちにFFIという言葉が出てきました。

「FFIって何でしたっけ?」「Foreign function interfaceですね」
ちょうどつっつき会を覗いていたゲストの方から教わりました。ありがとうございます。

RubyのHashインスタンスの奇妙な動作(Ruby Weeklyより)


kate.ioより

# 同記事より#1
class Integer
   def eql?(other)
     true
   end

  def hash
     0
  end
end

table = {}
table[1] = 'one'
table[5] = 'five'
puts table
#=> {1=>"one", 5=>"five"}

つっつきボイス: 「#1のdef hashみたいなことは普通まずしないなー」「#2のキー複製もしないでござる」「そもそもHashのキーを書き換えたいことってあるんだろうか: Hashの実装をhackして遊ぶって感じの記事ですね」
「そういえば以前RubyのHashがらみの記事書いたの思い出した: これこれ↓」「Fixnum, Symbol, String#hashはCの組み込みで、オーバーライドできないと公式ドキュメントに書かれていたんですよ」

RubyにおけるHashの実装を詳しく:(前編)#hashと#eql?とActiveSupport::HashWithIndifferentAccess

Object#tryは有害である(Ruby Weeklyより)

「Considered Harmful」という釣りタイトルっぽいですが、これも良記事です。Object#tryはRailsのActiveSupportにあります。
なお「Do. Or Do Not. There Is No Try」は例によってヨーダのセリフをそのまま使っています。


つっつきボイス: 「まあわかる、ボクも#tryキライだし: でも使いたいときってあるよね」
「Railsのビューなんかで#tryをチェインしまくったりすると後の人がどんどんツラくなっていく: 見たことあるでしょ?」

以下の記事によると#try&.と書くこともでき、少し挙動が異なるそうです。

dry-rb: 次世代Rubyライブラリgem群

日本語情報はあまり見かけませんが、英語圏では人気上昇中のようです。

RubyKaigi 2017でも発表した@shioyamaさんの記事「The Ruby Module Builder Pattern」によると、このdry-rbシリーズでもModule Builderパターンが大々的に使われているそうです。


つっつきボイス: 「悪くなさそう: 使えそうなものあったら使ってみてもいいかな」「RailsとかではなくRubyでプログラム書きたい人向けっぽいですね」
dry-typesのサンプル↓見てると、active_attrとかvirtusを思い出す」

# dry-rb.orgより
class Person < Dry::Struct
  attribute :name, Types::Strict::String
  attribute :age, Types::Strict::Int
end

Person.new(name: "Jane", age: 30)
# => #<Person name="Jane" age=30>

active_attrやvirtusについては以下の記事もどうぞ。

Railsフレームワークで多用される「options = {} 」引数は軽々しく真似しない方がいいという話

Codebeat: コードの自動レビューサービス


codebeat.coより

リポジトリにあるコードを自動レビューしてくれるようです。GitHubやBitBucketあたりは当然として、GitLabも対応しているのがうれしいです。今のところ以下の言語をサポートしています。


codebeat.coより


つっつきボイス: 「お、価格見るとpublicなリポジトリなら無料か: 自分が個人的に何か書くときに使ってみようかな」「ライバルはCodeClimateでしょうね↓」


codeclimate.comより

「関係ないんですが、このCodeClimateという名前、とてもいいと思ってます: プロジェクトに晴れの日もあれば雨の日もあるみたいな実感がこもってて」「一雨来そうだったり、荒れ模様だったり」「名前大事でござる」

Copy-on-Writeの限界: Rubyのメモリ割り当て(Roobykon Ruby Digestより)


brandur.orgより


つっつきボイス: 「これもいい記事: こんなに丁寧にソースと対応して説明してくれてる記事は割とレアかも、特に新しいRubyでというところが」「CRubyのソースを読みたい人向け」
「記事出てくるEdenって面白い名前ですね」「オブジェクトの置かれるヒープのことですね: 探し求めてエデンの園にたどりついた、みたいな意味がこもってるのかな」

「そういえばRubyのsymbolってGCされないんでしたっけ?」「いや、GCはされるけど、メモリアドレスと一体化してるから移動ができない: :hoge.hashとかやってみるとアドレスを表示できます↓」「あと、Cの方でmalloc()したものなんかも移動できない」

[1] pry(main)> :hoge.hash
=> 2920655367118037262

Bundler 2.0の互換性問題


つっつきボイス: 「Bundler 2.0で非互換の変更がいくつかあるみたいです」

「semantic versioningといえば、表面上そうなってても運用が残念なgemってありますね」「たとえばtherubyracerは使うライブラリの参照方法が偶数バージョンと奇数バージョンで違ってたりしてて知らずにアップデートするとドハマリするとか」

Ruby 10年以上やってるけどPythonコードを5倍速くしてみた


schneems.comより

Total time: 1.17439 s
File: perf.py
Function: get_legal_moves_fast at line 53

Total time: 5.80368 s
File: perf.py
Function: get_legal_moves_slow at line 69

つっつきボイス: 「RubyとかPythonというよりリファクタリングが中心かな」

Rails

⭐nezumi: RSpecやCapybaraのテストコードを実画面から生成するChrome拡張(GitHub Trendingより)⭐


つっつきボイス: 「これはとてもよい: 動画を見ればひと目で仕組みわかるし」「おお、モーションまでその場でCapybaraちゃんのコードになってくれる: これならCapybaraで画面テスト書く気になれそう」「即インストールしました」「テスターにもうれしいと思う」
「ただこれで生成したテストコードはコードレビューで直に読むのつらそうなんで、一言『nezumiで生成しました』とどこかに書いておいて欲しいですね」
「それにしてもなぜnezumi?」「capybaraがげっ歯類だからじゃないですかね: 日本人にはもうちょっと清潔感のある名前がよかったかな」

今週の⭐を進呈いたします。おめでとうございます。

GitHubはいかにしてapi.github.comでKubernetesを導入したか

8月のGitHubブログ記事です。


githubengineering.comより


つっつきボイス: 「おー、GitHubもKubernetesしてるのか: 大規模にDockerコンテナ使うとこなら使いたいやつだと思う。Googleが使っている実績があるし」「Kubernetesは設定UIをもうちょっと頑張って欲しいけど」

RailsのCSRF保護を深掘りする


つっつきボイス: 「フレームワーク使ってればCSRFチェックを自力で実装する必要は今どきなくなってきたので、嗜みとして知っておくのにいい内容だと思います」「以前のRailsはCSRFトークンを使いまわしてましたが、セキュリティ上の理由でしなくなった」

Railsのsecret_key_baseを理解する


つっつきボイス: 「こういうsalt生成とかジェネレータ周りのコードは、連番にならず重複もしないコードを書きたいときに便利なので、知っておくといいですよ」
「ただし単独システムならそれでいいけど、Twitterのような大規模に分散したシステムでユーザーIDをユニークにしたい、みたいな用途ならsnowflakeあたりを使うのがメジャーな方法かな」

モスクワで9/23に開催された「RailsClub 2017」

RAILSCLUB 2016 from Evrone.com on Vimeo.

プログラムがロシア語版の方にしか見当たらないので、機械翻訳に手伝ってもらってタイトルだけ取り出してみました。今回のセッション動画はまだ見当たりません。

  • スロット1
    • スレッドは悪ではない
    • Rom-rb 4.0
    • テストも速くなければならない
    • 型の問題を解決する
    • Ruby Masteryへの長い旅
    • Rubyを使った関数プログラミングウェブ
    • Ruby Is Dead
    • バックグラウンドタスクのためのフレームワークのアーキテクチャ
    • アプリケーションを設定する正しい方法
    • エコシステムの構築に必要なもの
  • スロット2
    • Elixir: Rubyではなく、Rubyよりよい
    • Kubernetesクラスタ内のRubyアプリケーション
    • Trailblazerでレガシーコードを取り除く
    • 言語相対性ルビー(「Rubyのここが好きでない」みたいな話?)
    • RubyのVM
    • 同期パラダイムと非同期パラダイムの話

つっつきボイス: 「ロシアとか東欧ってRubyやRailsが盛んという印象ですね」「そういえばDHHもあのあたりの出身だったような気が」

今ぐぐってみたらデンマークでした。

SQL/データベース

MySQL 8.0はUnicode 9.0サポート/スキーマレスJSONなどを追加(DB Weeklyより)

MySQL 8.0.3 rcもリリースされたそうです。


つっつきボイス: 「AWSのAuroraはどうなるかなー: 元になってるMySQLのバージョンが割りと古いけど、Auroraはがっつり本気で作られてるから追従してくれそうな気がする」

100万レコードのテーブルを効果的にページネーション(DB Weeklyより)


つっつきボイス: 「100万レコードはたいていつらいでござる」「記事はMySQLベースですね」
「こういう部分はRDBMSによって変わるところがあるからなー」

PGAudit: PostgreSQLの監査ツール(Postgres Weeklyより)

pghero: PostgreSQLのパフォーマンスチェック用gem

ankaneさんの作です。


github.com/ankane/pgheroより


つっつきボイス: 「簡易パフォーマンス監視に便利そうに見えたので: explainとかもできるし」「NewRelicがあれば足りるかなと思うけど、開発者とは別にDB管理者がいる案件とか、インフラエンジニアがミドルウェアチューニングまでやる場合なんかは事前にインストールしておくといいかも」


newrelic.comより

PostgreSQLでカラムを取り替える: part 1(Postgres Weeklyより)

# 同記事より
update pages
set ordering = case name
                 when 'Red' then (select ordering from pages where name = 'Blue')
                 when 'Blue' then (select ordering from pages where name = 'Red')
               end
where name = 'Red' or name = 'Blue';

つっつきボイス: 「カラムの順序を取り替えるのかと思ったら、カラム内の値を取り替える方でござった」「業務でこういう作業はあまりないと思うけど」

JavaScript

Draggable.js: Shopifyのドラッグ&ドロップライブラリ(HackerNewsより)


shopify.github.io/draggableより

アートワークと色彩がとてもきれいです。サイト自体が楽しいデモになっていて、図形をドラッグ&ドロップで移動したり移動先の色に同化したりします。


つっつきボイス: 「いつもならjQuery.DroppablejQuery.Draggable使うけど、気が向いたら使ってみようかな」「衝突判定もしてるぞな」

CSS/HTML/フロントエンド

HTML 5.1の2nd EditionがRECに

whatwgの仕様との齟齬が取沙汰されて久しいですが、一応。

参考: W3Cのは『欠陥フォーク』!? HTMLスナップショット2016 ── HTML5 Conference 2016セッションレポート

iPhone用ARKitでダンス練習アプリ(JavaScript Liveより)


つっつきボイス: 「これって踊りながらスマホ見られないんじゃ?」

CSS Gridを理解してブロックを自在に操る(Frontend Focusより)

See the Pen 5. 12 column grid with grid layout by rachelandrew (@rachelandrew) on CodePen.

Go言語

Go 1.8.4と1.9.1がリリース: セキュリティ修正

matcha: iOSとAndroidの両方で動くモバイルアプリをGoとReact.jsで書くフレームワーク(GitHub Trendingより)


gomatcha.ioより

今のところMac OSでないとビルドできないそうです。

その他

「この世界はコンピュータシミュレーションではない」らしい

本質的に無理と証明したのかなと思ったら、宇宙全体をメモリーにしても追いつかないぐらい計算が爆発するからそんなシミュレーション無理、という量的な論拠っぽいです。

日本語解説記事: 「我々はコンピューターのシミュレーションの中で生きているわけではない」と研究者

teachable-machine: 機械学習の様子をビジュアル表示/コーディング不要(GitHub Trendingより)


teachablemachine.withgoogle.comより

Googleがやってるそうです。なお、サイトでカメラとマイクをオンにすると自分の顔のキャプチャが始まって素材にされます。後で遊んでみます。

Ruby技術者認定試験は海外にも進出している

どうやらこれのようです↓。

番外

ノーベル物理学賞は重力波の検出、化学賞は原子レベルの生体物質顕微鏡

参考: LIGO、3度目の重力波検出

定番ネタ


つっつきボイス: 「わかるー」「そういえばちょうどこんな記事↓見つけたんだけど、MR出す人は最低でも1.の『変更の目的を書く』と3.の『変更によって期待される結果を書く』はぜひぜひやって欲しいですね: こういう部分はコードだけ読んでもわからないので」
「あとスクショもですね」「Slackや他のところに貼ったスクショをもう一度貼っても全然構わないし、むしろそうして欲しい: 探しに行くの大変なので」


今週は以上です。

バックナンバー(2017年度)

週刊Railsウォッチ(20170929)特集: RubyKaigi 2017セッションを振り返る(2)Ruby 2.3.5リリースほか

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

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

Ruby 公式ニュース

Rails公式ニュース

Ruby Weekly

Awesome Ruby

RubyFlow

160928_1638_XvIP4h

Postgres Weekly

postgres_weekly_banner

Frontend Weekly

frontendweekly_banner_captured

Hacker News

160928_1654_q6srdR

Github Trending

160928_1701_Q9dJIU

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探訪シリーズ