突発案件が多いとケアレスミスが増えますよ - 日報 #120
AM 3:30くらいの静寂が永遠だったらな、
なんて思う時点で腰が引けてますよね。
ここんところ突発案件ばかりでちょいとパッツパツでした。
全項目において知見が一応ありますので、
ゆるやかーに共有していければいいと思っています。
ということで、ここ3日くらいで発生した、
俺殺しの突発案件リスト。
- ある時突然、Fluentdでflushされないbufferファイルが発生したよ(依然調査中、知見あり)
- ある時突然、WEBサーバが1台不安定になったよ(調査済み、知見あり)
- ある時突然、Amazon Product Advertizeing APIが突然応答しなくなったよ(調査済み、知見なし)
- ある時突然、Slowクエリが突如増加したよ(調査済み、知見なし)
- ある時突然、memcachedが保存しなくなったよ(調査済み、下らないミスあり)
という四面楚歌状態で、「突然」という言葉が完全にゲシュタルト崩壊する事態に陥りました。
しかも結構一発一発が重いので、
中々にグロッキーな状態でファイトを続けるといった手合です。
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 になります。
手癖で書いていると本当にオマヌケなミスをするものですね。
皆様に於かれまして大丈夫かと思いますが、
内心ドキッとした方は、努々お気をつけ下さい。。。
そいでは、寝まする。。。