こんにちは、hachi8833です。暑がりさんなので今日も扇風機にあたっています。
それでは10月最初のウォッチ、いってみましょう。なお「Rails: 今週の改修」は本家で更新がありませんでした。
号外: PostgreSQL 10が正式リリース
- プレスリリース: PostgreSQL 10 Released
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より)
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リリースほか
ガイジン向けRubyKaigiガイド(Ruby Weeklyより)
とても面白い読み物です。日本人開発者はあまりガイジンに話しかけてくれないということに気づくのに時間がかかったそうです。(゚⊇゚)ガイジソー
つっつきボイス: 「これは翻訳するとよさそう」「はいよろこんでー」
来年のRubyKaigiあたりでどなたか試していただきたいのですが、ガイジンの皆さんにコンビニの肉まん食べさせてみたらきっと半分以上の人がハマると思います。次回は5月なのでコンビニにないかな。
著者のRichard Schneemanさんのプロフィールに「2016年度のRuby Hero」とあったので、つっつきメンバーで探してみました。
つっつきボイス: 「Ruby Heroって初めて聞いた」「↓おーこれか」「Code Schoolがスポンサー」
「ヒーローリストにamatsudaさんやko1さんやいろんな人いる」「どうやって選出しているでござるか?」「nominateってリンクがあるから他薦ですね」「く、このリンク効かない...」「選出の時期が来たらフォームが開くんでしょうね」「米国のRailsConferenceで発表されるんですね: 以前のウォッチ↓でも紹介しましたが、今年の開催は4月でした」
週刊Railsウォッチ(20170421)RailsConfが来週アリゾナで開催、コントローラを宣言的に書けるdecent_exposure gemほか
OptCarrotはCPUベンチマークにいいぞ
表示がわかりにくいのですが、RubyKaigi 2017でHow Close is Ruby 3x3 For Production Web Apps?をスピーチしたNoah Gibbsさんの記事でした。TechRachoの翻訳記事でもお馴染みかと思います。
つっつきボイス: 「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より)
# 同記事より#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群
- gemリスト: https://github.com/dry-rb
- サイト: http://dry-rb.org/
日本語情報はあまり見かけませんが、英語圏では人気上昇中のようです。
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については以下の記事もどうぞ。
Codebeat: コードの自動レビューサービス
リポジトリにあるコードを自動レビューしてくれるようです。GitHubやBitBucketあたりは当然として、GitLabも対応しているのがうれしいです。今のところ以下の言語をサポートしています。
つっつきボイス: 「お、価格見るとpublicなリポジトリなら無料か: 自分が個人的に何か書くときに使ってみようかな」「ライバルはCodeClimateでしょうね↓」
「関係ないんですが、このCodeClimateという名前、とてもいいと思ってます: プロジェクトに晴れの日もあれば雨の日もあるみたいな実感がこもってて」「一雨来そうだったり、荒れ模様だったり」「名前大事でござる」
Copy-on-Writeの限界: Rubyのメモリ割り当て(Roobykon Ruby Digestより)
つっつきボイス: 「これもいい記事: こんなに丁寧にソースと対応して説明してくれてる記事は割とレアかも、特に新しいRubyでというところが」「CRubyのソースを読みたい人向け」
「記事出てくるEdenって面白い名前ですね」「オブジェクトの置かれるヒープのことですね: 探し求めてエデンの園にたどりついた、みたいな意味がこもってるのかな」
- 参考: Qiita Ruby 2.1.1 GC Tuning
「そういえばRubyのsymbolってGCされないんでしたっけ?」「いや、GCはされるけど、メモリアドレスと一体化してるから移動ができない: :hoge.hash
とかやってみるとアドレスを表示できます↓」「あと、Cの方でmalloc()
したものなんかも移動できない」
[1] pry(main)> :hoge.hash
=> 2920655367118037262
Bundler 2.0の互換性問題
More controversy over Bundler 2.0. https://t.co/qrtWy3N5qI #ruby #bundler
— DailyRubyTip (@dailyrubytip) October 5, 2017
つっつきボイス: 「Bundler 2.0で非互換の変更がいくつかあるみたいです」
「semantic versioningといえば、表面上そうなってても運用が残念なgemってありますね」「たとえばtherubyracerは使うライブラリの参照方法が偶数バージョンと奇数バージョンで違ってたりしてて知らずにアップデートするとドハマリするとか」
Ruby 10年以上やってるけどPythonコードを5倍速くしてみた
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より)⭐
- リポジトリ: mugi-uno/nezumi
- Chrome拡張: nezumi
つっつきボイス: 「これはとてもよい: 動画を見ればひと目で仕組みわかるし」「おお、モーションまでその場でCapybaraちゃんのコードになってくれる: これならCapybaraで画面テスト書く気になれそう」「即インストールしました」「テスターにもうれしいと思う」
「ただこれで生成したテストコードはコードレビューで直に読むのつらそうなんで、一言『nezumiで生成しました』とどこかに書いておいて欲しいですね」
「それにしてもなぜnezumi?」「capybaraがげっ歯類だからじゃないですかね: 日本人にはもうちょっと清潔感のある名前がよかったかな」
今週の⭐を進呈いたします。おめでとうございます。
GitHubはいかにしてapi.github.comでKubernetesを導入したか
- 元記事: Kubernetes at GitHub
8月のGitHubブログ記事です。
つっつきボイス: 「おー、GitHubもKubernetesしてるのか: 大規模にDockerコンテナ使うとこなら使いたいやつだと思う。Googleが使っている実績があるし」「Kubernetesは設定UIをもうちょっと頑張って欲しいけど」
RailsのCSRF保護を深掘りする
つっつきボイス: 「フレームワーク使ってればCSRFチェックを自力で実装する必要は今どきなくなってきたので、嗜みとして知っておくのにいい内容だと思います」「以前のRailsはCSRFトークンを使いまわしてましたが、セキュリティ上の理由でしなくなった」
Railsのsecret_key_base
を理解する
つっつきボイス: 「こういうsalt生成とかジェネレータ周りのコードは、連番にならず重複もしないコードを書きたいときに便利なので、知っておくといいですよ」
「ただし単独システムならそれでいいけど、Twitterのような大規模に分散したシステムでユーザーIDをユニークにしたい、みたいな用途ならsnowflakeあたりを使うのがメジャーな方法かな」
モスクワで9/23に開催された「RailsClub 2017」
- サイト: http://railsclub.ru/
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より)
- サイト: https://www.pgaudit.org/
- リポジトリ: pgaudit/pgaudit
pghero: PostgreSQLのパフォーマンスチェック用gem
- リポジトリ: ankane/pghero
- サンプルサイト: https://pghero.dokkuapp.com/datakick
ankaneさんの作です。
つっつきボイス: 「簡易パフォーマンス監視に便利そうに見えたので: explainとかもできるし」「NewRelicがあれば足りるかなと思うけど、開発者とは別にDB管理者がいる案件とか、インフラエンジニアがミドルウェアチューニングまでやる場合なんかは事前にインストールしておくといいかも」
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より)
- サイト: Draggable.js
アートワークと色彩がとてもきれいです。サイト自体が楽しいデモになっていて、図形をドラッグ&ドロップで移動したり移動先の色に同化したりします。
つっつきボイス: 「いつもならjQuery.DroppableやjQuery.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がリリース: セキュリティ修正
- Google Groups: security: Go 1.8.4 and Go 1.9.1 are released
matcha: iOSとAndroidの両方で動くモバイルアプリをGoとReact.jsで書くフレームワーク(GitHub Trendingより)
- リポジトリ: gomatcha/matcha
- サイト: https://gomatcha.io/
今のところMac OSでないとビルドできないそうです。
その他
「この世界はコンピュータシミュレーションではない」らしい
本質的に無理と証明したのかなと思ったら、宇宙全体をメモリーにしても追いつかないぐらい計算が爆発するからそんなシミュレーション無理、という量的な論拠っぽいです。
日本語解説記事: 「我々はコンピューターのシミュレーションの中で生きているわけではない」と研究者
teachable-machine: 機械学習の様子をビジュアル表示/コーディング不要(GitHub Trendingより)
Googleがやってるそうです。なお、サイトでカメラとマイクをオンにすると自分の顔のキャプチャが始まって素材にされます。後で遊んでみます。
Ruby技術者認定試験は海外にも進出している
論理の本筋ではないことは理解していますが、Ruby技術者認定試験は海外進出してます。
— Yukihiro Matsumoto (@yukihiro_matz) October 5, 2017
どうやらこれのようです↓。
番外
ノーベル物理学賞は重力波の検出、化学賞は原子レベルの生体物質顕微鏡
参考: LIGO、3度目の重力波検出
定番ネタ
10 lines of code = 10 issues.
500 lines of code = "looks fine."
Code reviews.
— I Am Devloper - Vote for Pedro (@iamdevloper) November 5, 2013
つっつきボイス: 「わかるー」「そういえばちょうどこんな記事↓見つけたんだけど、MR出す人は最低でも1.の『変更の目的を書く』と3.の『変更によって期待される結果を書く』はぜひぜひやって欲しいですね: こういう部分はコードだけ読んでもわからないので」
「あとスクショもですね」「Slackや他のところに貼ったスクショをもう一度貼っても全然構わないし、むしろそうして欲しい: 探しに行くの大変なので」
今週は以上です。
バックナンバー(2017年度)
週刊Railsウォッチ(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など)です。