ソフトウェア開発者の日常

こだわりなく書きたいことを書いていきます。

記録を積み重ねることが大切

辞めた同僚が作成したシステムを引き継いで2年経ちました。
引き継ぎ時点では、ほぼ問い合わせがないと聞いたつもりでしたが、そうでもなくて2年間に30件以上問い合わせがありました。
月に1度は問い合わせがあるペースということになります。

問い合わせの件数がわかるのも、そこからペースが算出できるのも、記録をしているからです。

引き継いだ直後から、問い合わせがあるたびに時間を捻出して記録をしています。
問い合わせの内容、調査内容、回答内容を、1件の問い合わせごとにExcelの1シートとして記録しています。

f:id:AJYA:20160518125705j:plain
photo credit: Rochester Memorial Art Gallery, Rochester, NY via photopin (license)

記録の積み重ね

引き継いだ当初は、引き継ぎの説明を受けたとはいえ、わかっていない部分が大半でした。
そのため、問い合わせを受けるたびに、以前の問い合わせとどのように違うのか、どうすれば調べて回答できるのかと見返していました。
同じ問い合わせを受けることがほぼないため、毎回新しい調査内容、回答内容を記録していくことになります。

それでも、「調査のとっかかりのここまでは、以前と同じ手順で調べられ、ここから新しい手順で調べることになる」とわかるようになってきました。
記録を残してあるので問い合わせのたびに過去の記録を見返し、経験をしてきたたので、わかるようになってきています。

記録がなかったらできないことです。
記録していても、後から見返してわかるようになっていないと意味がありません。
どこのディレクトリのどのファイルを参照したのか、どんなSQLで検索した結果こういうデータが得られなにがわかったのかなど、スクリーンショットとともに記録していっています。


記録をすることは手間がかかり、一見、時間の無駄に感じてしまいます。
ですが、積み重ねていくことは情報を蓄えることになります。
後から利用できる形で記録をして情報を蓄え、システムに対する知識や理解度を深めていっています。

同じ内容が2回表示される現象の原因と対策

辞めた同僚から引き継いだシステムで問い合わせがありました。
「ある番号」を表示する部分が、「20160509001→20160509001」と同じ番号が2回表示されていて、本来は1回だけのはずとのことです。
スクリーンショットも送られてきていたので見てみると、確かに同じ番号が矢印でつないで2回表示されていました。

対象データ確認

調査の手順は、こちらの環境のプログラムと、お客さんの環境で稼働している本番データベースを用いて、現象を確認することから始めます。
結果は、送られてきたスクリーンショットと全く現象を確認できました。

現象を確認すると、対象のデータのidが分かる仕組みになっています。
次は、Oracle SQL Developerを使ってデータベースに登録されている内容を確認します。
製品情報 - Oracle SQL Developer

対象のデータのidを使って絞り込み、データを確認すると、親データのidを格納するカラムに、親データのidが入っています。
親データのidと対象のデータのidを使って再度絞り込み、データを確認すると、「ある番号」を格納するカラムにどちらも「20160509001」が入っていました。
このために現象が発生しているようです。

対象ソースコードを把握

Smartyが使われているソースコードなので、テンプレートから順番にたどって、どこで表示するためのデータを生成しているか確認しました。
データを生成するロジックは、データを確認したときと同じように、まず対象のデータのidを使ってデータを取得し、親データのidが入っていたら再帰して、親データも取得するようになっていました。
「ある番号」は、NULLや空文字列でなければ表示するためのデータとして利用するようになっています。

同じように親データのある他のデータを確認すると、親データの「ある番号」を格納するカラムはNULLになっていて、全てのデータで現象が起きているわけではないことは把握できました。

原因は親データの「ある番号」を格納するカラムに、対象のデータと同じ値が入っているからだとわかりました。
対処として、親データの「ある番号」を格納するカラムをNULLにしてしまえば現象は発生しなくなりますが、どうしてこんなことが起きるのか疑問が残ります。

テスト環境で現象を再現させる

データを表示するページには、データを修正する機能があり、「ある番号」も修正することが可能です。
この機能とデータを登録の順番を試行錯誤することで、同じ「ある番号」が2回表示される現象を再現させました。

再現の手順は、

  1. 「ある番号」を格納するカラムはNULLのままデータを新規に登録する。
  2. 「ある番号」を修正機能を使って登録する。
  3. 2.で登録した「ある番号」を含み、1.のデータを親データとするデータを新規登録する。

でした。

通常1.と3.の処理だけ行われているようです。
1.と3.は別のシステムで作成されたデータをバッチで登録しています。
2.はユーザーが操作する作業で、今回は3.の処理が完了するのが待てなかったのかもしれず、データを更新されたようです。

再現手順を問い合わせ元に報告して、調査は完了しました。

grepなどのUNIXのコマンドを学びました

UNIXのサーバー上でPHPのプログラムを動作にさせています。
保存されているソースコードから、「$_SESSION['param1']」と「$_SESSION['param_1']」のどちらの記述が多いのか、調べなければならなくなりました。

grepコマンドの存在は知っていたので、

$ grep "$_SESSION['param1']" *.php

を実行すると、思っていた結果と全く異なる結果になりました。

grepコマンドについて学ぶ

なぜ想定と全く異なるんだろうとコマンドの解説が書かれているサイトの記事を読むと、grepコマンドは正規表現で検索しているということに気がつきました。
UNIXの部屋 コマンド検索:grep (*BSD/Linux)

fgrepコマンドについて学ぶ

エスケープするしかないのかと、エスケープの文字は「\」なんだよねと検索していると、こちらの記事で正規表現で検索しない「fgrep」を知りました。
@IT:正規表現で使用するメタ文字を検索するには

fgrepを利用して

$ fgrep "$_SESSION['param1']" *.php

として、思っていたとおりのファイルが検索されました。

検索されるのはいいのですが、「$_SESSION['param1']」と「$_SESSION['param_1']」のどちらの記述が多いか調べるには、このままではソースコードが表示されて見づらいので、

$ fgrep -ls "$_SESSION['param1']"

としたらファイル名のみ表示されるようになりました。

f:id:AJYA:20160516054903j:plain
photo credit: New FreeBSD boot menu via photopin (license)

サブディレクトリも対象にする方法を学ぶ

カレントディレクトリ内は検索されましたが、サブディレクトリ内は検索されないので、どうすればいいかと調べたら、こちらの記事で方法が紹介されていました。
Linux | サブディレクトリも含めて特定文字の含まれるファイルを探す(find xargs grep) | 仕組屋の手帳

紹介されていた方法を参考にして、

$ find . -type f -name "*.php" | xargs fgrep -ls "$_SESSION['param1']"

としたらサブディレクトリ内も検索されました。


最後は思いもしなかったコマンド(find)と知らないコマンド(xargs)を使用しましたが、目的どおりの動作をさせて、結果を得られました。