だいぶ前に映画のメッセージを見た時に買ったまま積んであった本。SF短編集で、「あなたの人生の物語」「地獄とは神の不在なり」が個人的には好きだった。
「あなたの人生の物語」はフェルマーの原理の「光が観測者までの最短ルートを通って到達する」という解釈から妄想が膨らんだお話。
でもこれは光が粒子だと考えた時の妄想で、光が波だと考えるとまた違った世界観が出てくる。こういう物理法則のとある側面から見た世界観で妄想を膨らませてくれるお話は好き。
原作を読んだ後、映画を見返したら面白さが3倍くらい増えた。
Permission denied
だいぶ前に映画のメッセージを見た時に買ったまま積んであった本。SF短編集で、「あなたの人生の物語」「地獄とは神の不在なり」が個人的には好きだった。
「あなたの人生の物語」はフェルマーの原理の「光が観測者までの最短ルートを通って到達する」という解釈から妄想が膨らんだお話。
でもこれは光が粒子だと考えた時の妄想で、光が波だと考えるとまた違った世界観が出てくる。こういう物理法則のとある側面から見た世界観で妄想を膨らませてくれるお話は好き。
原作を読んだ後、映画を見返したら面白さが3倍くらい増えた。
CakePHPのプロジェクト。
自分で作った機能ではないが、数年前に作ってほったらかしだったCI環境のアップデートの必要があり、他に手が空いてる人がいないとのことで私が担当していた。テストを実行すると、スクリプトのプロセスがエラーログも何も出さずに突然終了してしまう事象が発生した。
PHPエクステンションにインストール漏れがあった。エクステンションでインストールされる関数を利用している箇所でエラー制御演算子(@)が使われていたため、プロセスが落ちた時にログが出なかった。
テストケースをコメントアウトしながら実行して落ちるテストケースを絞り込み、実行されているメソッドのコードリーディングで発見した。
エラー制御演算子のドキュメントには以下の記述がある。
警告現在、エラー制御演算子プレフィックス”@”は、スクリプトの実行を 終了するような致命的なエラーの出力さえ抑圧します。このため、ある関数の エラー出力を抑制するために “@” を使用した場合、その関数が 利用できなかったり、ミスタイプがあった場合でも、原因を示すことなく その場所でスクリプトは終了してしまいます。
エラー制御演算子を外してテストを実行すると以下のようなエラーが出た。
Fatal error: Call to undefined function exif_imagetype()
ログを見た瞬間に原因が分かる。エラー制御演算子が使われていたために3秒で原因が分かるエラーの特定に3日かかってしまった。まじ💩
PHPのプロセスが無言で死ぬ時はまず最初にエラー制御演算子を疑う。
「考える技術・書く技術」のような思考術の本なのかなと期待して読んだ。コピーライターの著者が実践している「人が動く」言葉を生み出すためのテクニックとトレーニングの本であった。
以前、同僚のマーケッターの人に教えてもらった「心に響くキャッチコピー」の作り方と同じテクニックが紹介されていたので、元ネタはこの本かもしれない(もっと有名な古典があるのかもしれない。)
あやふやでふわっとした心から湧き出てくる「内なる言葉」を明確な「外へ向かう言葉」に変換するトレーニングの話があった。これは、日記をつける習慣を作ると自然と訓練されそうだなと思った。「アンネの日記」とかがお手本になりそう。アンネ・フランクすげぇな。。
ApplicationHelperのspecを書いてrspecを実行したところ、Helperのカバレッジが0%になっていた。他のファイルのカバレッジは測定されていた。Rspecの実行ログから、ApplicationHelperのspecが実行されていることは確認できている。
SimpleCov.start
を rails_helper.rb の先頭に書いてなかったのが原因だった。
ドキュメントにも太文字でtopだと書いてあった。
Similarly to the usage with Test::Unit described above, the only thing you have to do is to add the SimpleCov config to the very top of your Cucumber/RSpec/whatever setup file.
https://github.com/colszowka/simplecov#use-it-with-any-framework
Add the setup code to the top offeatures/support/env.rb
(for Cucumber) orspec/spec_helper.rb
(for RSpec).
SimpleCov関連の設定処理は spec/support/simplecov.rb にまとめていて、 Dir[Rails.root.join(‘spec/support/**/*.rb’)].each { |f| require f } で実行していたが、rails_helper.rb の先頭で require ‘./spec/support/simplecov’ を実行するようにしたらApplicationHelperのカバレッジが測定されるようになった。
SimpleCovはstartメソッドの中でRuby標準ライブラリのCoverage.startを実行している。Helper(module)がCoverage.startの実行前に読み込まれてしまってカバレッジの測定対象に入っていなかったのだろうか。(未確認)
RailsのSystem specを実行すると、以下のエラーで spec が失敗する
Net::ReadTimeout:
Net::ReadTimeout with #<TCPSocket:(closed)>
どうやらassetsのコンパイルに時間がかかっているためにSeleniumがタイムアウトしているようだった。(確かにこのサイトはassetsのscss, javascriptが巨大で、最初のアクセスにかなりの時間がかかっていた)
ローカル環境では一度assetsがコンパイルされていればキャッシュがあるため1度だけ発生していたようだ。
CI環境では以下の記事と同様に事前にassets:precompileすることで解決した。
https://jtway.co/4-lines-to-speed-up-your-rails-test-suite-on-ci-744e4326e8a3
# config/environments/test.rb
Rails.application.configure do
:
if ENV['CI']
config.assets.digest = true
config.assets.debug = false
config.assets.compile = false
config.assets.js_compressor = Uglifier.new(harmony: true)
end
end
# .circleci/conf.yml
:
steps:
:
- restore_cache:
keys:
- asset-cache-{{ arch }}-{{ .Branch }}
- asset-cache-
- run: bundle exec rails assets:precompile
- save_cache:
key: asset-cache-{{ arch }}-{{ .Branch }}-{{ epoch }}
paths:
- public/assets
- public/packs
- tmp/cache/assets/sprockets