俺の報告

RoomClipを運営するエンジニアの日報(多分)です。

突発案件が多いとケアレスミスが増えますよ - 日報 #120

AM 3:30くらいの静寂が永遠だったらな、 なんて思う時点で腰が引けてますよね。
ここんところ突発案件ばかりでちょいとパッツパツでした。
全項目において知見が一応ありますので、
ゆるやかーに共有していければいいと思っています。

ということで、ここ3日くらいで発生した、
俺殺しの突発案件リスト。

  1. ある時突然、Fluentdでflushされないbufferファイルが発生したよ(依然調査中、知見あり)
  2. ある時突然、WEBサーバが1台不安定になったよ(調査済み、知見あり)
  3. ある時突然、Amazon Product Advertizeing APIが突然応答しなくなったよ(調査済み、知見なし)
  4. ある時突然、Slowクエリが突如増加したよ(調査済み、知見なし)
  5. ある時突然、memcachedが保存しなくなったよ(調査済み、下らないミスあり)

という四面楚歌状態で、「突然」という言葉が完全にゲシュタルト崩壊する事態に陥りました。
しかも結構一発一発が重いので、
中々にグロッキーな状態でファイトを続けるといった手合です。

1つ1つ、同じ過ちを繰り返さないように、皆様にもゆっくり共有していきます。
ちなみに、僕という個体に対してもバグが発生していおりまして、

  1. ある時突然、鼻水と目の痒みが止まらなくなったよ(調査済み、知見なし)

ということもあったのですが、
コレに関しては「根本治療なし、頓服対応あり」という姿勢を崩さずに対処していく所存です。

なんか尻切れトンボなんで、5番の下らないミスのみちょっと共有。

PHPなどで、まれに、IF文の条件式内での変数代入というのをやることがあります。
こんな感じ。

<?php

$var = 'abc';
$_var = 'def';

if ($var = $_var)
  echo $var; // def と出力されます

?>

この出力結果は def になります。
稀によくある、とかいう頻度でみるやつですね。
代入結果が評価されて、IF判定が行われるという感じです。

この書き方はあんま良くないのかな、というのが今回の反省です。
(もしかしたら有名なアンチパターンなのかもしれませんが、調べてません。すません、、、)
というのも、複数条件のように見せようとした時、ちょいと誤解が生じるのです。

$var = 'abc';
$_var = 'def';

if ($var = $_var && $_var === 'def')
  echo $var;

これはどうなるでしょうか。
ぱっと見、
「$var = $var はTRUEだった。そして$var === 'def' もTRUEだ。&&で繋がっているのだから結果はTRUE。よって出力は $var = $_var をしたんだから、def になるだろう」
という風にも読めます。
が、結果は 1 と出力されます。
var_dumpすれば bool(true) のように見えると思います。
わかってる人からすれば当たり前の話ですが、これに30分程立ち止まった僕でございます。

$var = $_var && $_var === 'def'

この式って、単純に&&計算、AND演算なんですね。
$varの評価 ∩ $var === 'def'の評価
=> TRUE ∩ TRUE
=> TRUE
これが右辺の結果で、それが $var に代入される、
という式になっているんですね。
間抜けですね。
本当はこう書かなくてはなりません。

$var = 'abc';
$_var = 'def';

if ( ($var = $_var) && $_var === 'def' )
  echo $var;

こうすれば無事に $var は def と代入されているので、
出力も def になります。
手癖で書いていると本当にオマヌケなミスをするものですね。
皆様に於かれまして大丈夫かと思いますが、 内心ドキッとした方は、努々お気をつけ下さい。。。

そいでは、寝まする。。。