Railsコンソールで手っ取り早くバリデーションの動作確認をするワンライナー

->(c, k, v) { c.new(k => v).tap(&:valid?).errors[k] }.call(User, :email, "text@example.com")

ポイント

  • tap内 で valid? を実行することでメソッドチェーンで errors が呼び出せる。
  • ラムダ式を使って変数がコードの後ろに来るようにしてあるので、コンソール内で値を変えながら何度も動かしてみるのが楽。

Atomic Design ~堅牢で使いやすいUIを効率良く設計する

やっぱり Atomic Design は良い考え方だけどスペルが難しくて日本人には辛いなぁと言う印象 😇

Atomic Design 自体は以前から知っていて、学び直しのつもりで読んだのだけど、Storybookの使い方が紹介されていたのが棚からぼた餅で良かった。

コンポーネントをディレクトリにして Component/index.js, Component/stroy.js, Component/style.js, Component.test.js などをまとめるやり方は、Component.js, Component.story.js, Component.style.js, Component.test.js としていくよりファイルの見通しは良くなるんだけど、エディタのタブのファイル名が全部 index.js になってしまい、「あれ、今どこの index.js 触ってるんだっけ?」「あのコンポーネントの index.js どれだ?」って迷子になりやすいのが玉に瑕だと思っている。

請求書より入金額が少ない時の帳簿の付け方

個人事業主で freee で帳簿をつけていて、相手型のミスで請求書より少ない金額が入金され、翌月に前月の不足額を加算した金額で入金された時の帳簿の付け方。

  • 売上高は請求書通りにする
  • 前月の不足額を事業主貸にする
  • 翌月の超過額を仮受金にする

rails assets:precompile 時に yarn install が実行されない

Rails5をHerokuにデプロイしようとした際、rails assets:precompile 時に yarn install が実行されず、node_module ディレクトリをassetsから読み込むことができずにビルドエラーになってしまった。

そもそも assets:precompile 時に yarn install が実行される条件ってなんだろうと思って探してみると、bin/yarn ファイルがあることが条件のようだった。

https://github.com/rails/rails/blob/f99b3c5f9759baffec5c1f7abf74e108e2fb1c77/railties/lib/rails/tasks/yarn.rake#L11

bin/yarn ファイルを作成すると無事に yarn install が実行されてデプロイできた。

Rubyの system メソッドは、デフォルトでは実行ファイルがない場合は何も出力せずに nil を返すだけのよう。

https://docs.ruby-lang.org/ja/latest/method/Kernel/m/system.html

irb(main):005:0> system("hogehoge")
=> nil

Rubyの論理和

  • Rubyの || 演算子は、「左辺を評価し、結果が真であった場合にはその値を返します。 左辺の評価結果が偽であった場合には右辺を評価しその評価結果を返します。」https://docs.ruby-lang.org/ja/latest/doc/spec=2foperator.html#or
  • なので、結果はBoolean(true, false)ではなく、「右辺もしくは左辺の評価結果」になる。
  • 「右辺か左辺の少なくとも1つが真の場合に真」みたいな解説をちらほら見かけるが、正確ではない。

Ransackのsort_linkのURLクエリからパラメーターを除外する

Ruby on Railsで、ransackのsort_linkヘルパーを使うと、?q%5Bs%5D=name+asc のようなURLのアンカーを作成してくれる。

この時、同時にkaminariでページネーションをしていると、sort_linkはparamsを自動的にマージするので、?page=2&q%5Bs%5D=name+asc のようなURLになる。

sort_link :id, page: nil のようにpageパラメータをnilで上書きしてあげると、作成されたURLのクエリにpageは設定されなくなる。

なお、sort_link :id, params: { page: nil } では pageは上書きされない。sort_link :id, params: { page: 1 } と書くとURLのクエリにpageが2つ設定される。

ransackのソースコードを見ると、paramsとsort_linkに指定したオプションをマージして直接 url_for に設定している。

https://github.com/activerecord-hackery/ransack/blob/master/lib/ransack/helpers/form_helper.rb#L131

def url_options
  @params.merge(
    @options.merge(
      @search.context.search_key => search_and_sort_params))
end

https://github.com/activerecord-hackery/ransack/blob/master/lib/ransack/helpers/form_helper.rb#L92

send(routing_proxy).url_for(options_for_url)

include?(true)の公式

a = Array<true|false> である場合、a.include?(true) は any? で置き換えることができる。

a = Array<T>(Tは任意のクラス)、block.call(T) => (true|false) である場合、a.map(&block).include?(true) は a.any?(&block) で置き換えることができる。

あなたの人生の物語

だいぶ前に映画のメッセージを見た時に買ったまま積んであった本。SF短編集で、「あなたの人生の物語」「地獄とは神の不在なり」が個人的には好きだった。

「あなたの人生の物語」はフェルマーの原理の「光が観測者までの最短ルートを通って到達する」という解釈から妄想が膨らんだお話。
でもこれは光が粒子だと考えた時の妄想で、光が波だと考えるとまた違った世界観が出てくる。こういう物理法則のとある側面から見た世界観で妄想を膨らませてくれるお話は好き。

原作を読んだ後、映画を見返したら面白さが3倍くらい増えた。

PHPでスクリプトが無言で死ぬ

状況

CakePHPのプロジェクト。
自分で作った機能ではないが、数年前に作ってほったらかしだったCI環境のアップデートの必要があり、他に手が空いてる人がいないとのことで私が担当していた。テストを実行すると、スクリプトのプロセスがエラーログも何も出さずに突然終了してしまう事象が発生した。

原因

PHPエクステンションにインストール漏れがあった。エクステンションでインストールされる関数を利用している箇所でエラー制御演算子(@)が使われていたため、プロセスが落ちた時にログが出なかった。
テストケースをコメントアウトしながら実行して落ちるテストケースを絞り込み、実行されているメソッドのコードリーディングで発見した。

エラー制御演算子のドキュメントには以下の記述がある。

警告現在、エラー制御演算子プレフィックス”@”は、スクリプトの実行を 終了するような致命的なエラーの出力さえ抑圧します。このため、ある関数の エラー出力を抑制するために “@” を使用した場合、その関数が 利用できなかったり、ミスタイプがあった場合でも、原因を示すことなく その場所でスクリプトは終了してしまいます。

エラー制御演算子を外してテストを実行すると以下のようなエラーが出た。

Fatal error: Call to undefined function exif_imagetype() 

ログを見た瞬間に原因が分かる。エラー制御演算子が使われていたために3秒で原因が分かるエラーの特定に3日かかってしまった。まじ💩

メモ

PHPのプロセスが無言で死ぬ時はまず最初にエラー制御演算子を疑う。

「言葉にできる」は武器になる。

「考える技術・書く技術」のような思考術の本なのかなと期待して読んだ。コピーライターの著者が実践している「人が動く」言葉を生み出すためのテクニックとトレーニングの本であった。

以前、同僚のマーケッターの人に教えてもらった「心に響くキャッチコピー」の作り方と同じテクニックが紹介されていたので、元ネタはこの本かもしれない(もっと有名な古典があるのかもしれない。)

あやふやでふわっとした心から湧き出てくる「内なる言葉」を明確な「外へ向かう言葉」に変換するトレーニングの話があった。これは、日記をつける習慣を作ると自然と訓練されそうだなと思った。「アンネの日記」とかがお手本になりそう。アンネ・フランクすげぇな。。