IQ1によるIQ1なミスの紹介
IQ1のにまいめっの12日目の記事 (完全に遅れてますが)。
adventar.org
自分で作っておいて忘れていたのでかなり雑な記事になりますが、今年やったミスの一部を振り返っていきます。 日常生活におけるミスを上げ始めると大変なのでPC関連のミスに限定します
Nginxのアクセスできない場所にファイルを配置する
Nginxによるアクセス権限がない場所にstatic fileを配置した挙句「あれ〜static fileが配信されない〜」とか言いました。
確認するとPermission deniedとか言われていて気が付きます。
今年はこれを覚えている限り2回やりました
配列サイズを間違える
競プロをやっているときに N<=100000の問題に対してa[10005]としました。配列サイズが1桁足りません。
これ、テストケースが小さいと普通に気がつけずにREが出まくるので地味に焦ります。数字の桁数とか視覚で把握しにくいし...
よい対策があったら教えてください
modをとる計算の中で減算を行ったあとにmodを足し忘れる
これも競プロなんですが、よくmod 1e9+7で答える問題ありますよね。
modを取る問題で
a += b; a%=mod; a -= c; a%=mod;
とかしました。しかし3行目が負になった場合、modを足す必要があります(C++では)。
対策としてはModIntを導入するべきなのですが、このミスを犯すたびに「次はしないやろ〜」とか言って対策してません
スタック上の変数へのポインタを別スレッドに渡した
C言語でローカル変数へのポインタを別のスレッドに渡しました。
結果、ローカル変数が破棄されたあとに別スレッドからその変数にアクセスしてバグりました
cpでファイルを上書きしてしまう
cpで大切なファイルを上書きしてしまい、ダメージを受けました。
cpは必ずオプション-iをつけましょう。
異なるバージョンのドキュメントを見て時間を溶かしました
MySQLのRootパスワードのリセットにおいて「日本語だから」という理由で5.6のドキュメントを見ていて時間を溶かしました。5.7のドキュメントを読んだら5.6以前とそれ以降で操作が異なっていました。
バージョンごとにドキュメントがある場合は必ず使用しているバージョンに対応するドキュメントを見ましょう。
プロファイリングをせずに高速化しようとしました
直感でRedisを使えば早くなるという直感のもと行動したら8時間とかして早くなりませんでした。
プロファイリングをしない高速化は無駄な努力に終わりがちです。更に知見もないのに自分の勘を信じるのをやめましょう。
これは某CONの話です。
まとめ
実際はもっと色々ミスをしているのですが、忘れてたり説明がめんどくさかったりするので省きました。
しかし、本当に怖いのは気がついていないミスです。
プログラミングならコンパイラが注意してくれるようなミスは安心です。しかし上記ならmodのミスなどは間違ったデータを出力してしまうだけで競プロでなかったら気が付かなかった可能性まであります。
気をつけて生きていきましょう。