会社の製品の性能検証を行うことになり、データセンターに行ってきた。
問題は、検証環境を構築し、テストデータをリストアした時に発生した。
テストデータのチェックを行ったところ、破損が確認されたのだ。
ちなみに、テストデータの破損チェックは、以下のような手順で行った。
1. テストデータの各ファイルの md5 チェックサムを取得し、
md5.txt というテキストファイルに書き出すスクリプトを作成
(スクリプトの内容は、読み飛ばしてもらって結構です。)
2. テストデータ作成環境で上記スクリプトを実行し、
md5.txt を md5.txt.org という名前に変更
3. 検証環境で上記スクリプトを実行
4. テストデータ作成環境で取得した md5.txt.org と
検証環境で取得した md5.txt を比較する
ところが、良く調べてみると手順 1 で作成したスクリプトにバグが有ったらしい。
スクリプトの結果作成される md5 チェックサムを書き出したテキストファイルが、
環境に依存するようだ。
環境依存するのは、スクリプト中の以下の行にある、"sort" コマンドだ。
"sort" コマンドをオプション無しで実行すると、標準入力の内容を
辞書順に並べかえて標準出力に書き出す。
問題は、この "辞書順" が環境によって異なることだ。
例えば、私のテスト環境では "A" の方が "a" より先だったが、
先輩の環境では逆だった。
man コマンドには、特筆するべき事は書いていない。
特に、"辞書順" を規程するオプションも見当たらなかった。
途方にくれて、google 検索をしてみると、以下のページが見つかった。
要約すると、"sort" の結果は環境変数によって異なるとのこと。
"sort" 実行時には、
(上記コマンドは "sort" 実行時のみ、環境変数 "LC_ALL" を "C" にする)
寡聞にして "LC_ALL" という環境変数は知らなかったが、
取り合えず実行すると、私の環境でも先輩の環境でも "A" の方が "a" よりも
先にくるようになった。
しかし、まだ問題は残っていた。
"." や "_" の表示順が異なるのだ。
エンジニアとして、ここは sort の実行順を詳細に調査するべきだが、
あいにくと時間が無い。
とりあえず、
でも、後学のために、いつか調査をした方がよいな。。
問題は、検証環境を構築し、テストデータをリストアした時に発生した。
テストデータのチェックを行ったところ、破損が確認されたのだ。
ちなみに、テストデータの破損チェックは、以下のような手順で行った。
1. テストデータの各ファイルの md5 チェックサムを取得し、
md5.txt というテキストファイルに書き出すスクリプトを作成
(スクリプトの内容は、読み飛ばしてもらって結構です。)
#! /bin/bash
# find /test_data -type f | sort > /tmp/data_files
# while read file
> do
> openssl dgst -md5 file >> md5.txt
> done < /tmp/data_files
2. テストデータ作成環境で上記スクリプトを実行し、
md5.txt を md5.txt.org という名前に変更
3. 検証環境で上記スクリプトを実行
4. テストデータ作成環境で取得した md5.txt.org と
検証環境で取得した md5.txt を比較する
# diff /tmp/md5.txt.org /tmp/md5.txt
ところが、良く調べてみると手順 1 で作成したスクリプトにバグが有ったらしい。
スクリプトの結果作成される md5 チェックサムを書き出したテキストファイルが、
環境に依存するようだ。
環境依存するのは、スクリプト中の以下の行にある、"sort" コマンドだ。
# find /test_data -type f | sort > /tmp/data_files
"sort" コマンドをオプション無しで実行すると、標準入力の内容を
辞書順に並べかえて標準出力に書き出す。
問題は、この "辞書順" が環境によって異なることだ。
例えば、私のテスト環境では "A" の方が "a" より先だったが、
先輩の環境では逆だった。
man コマンドには、特筆するべき事は書いていない。
特に、"辞書順" を規程するオプションも見当たらなかった。
途方にくれて、google 検索をしてみると、以下のページが見つかった。
要約すると、"sort" の結果は環境変数によって異なるとのこと。
"sort" 実行時には、
"LC_ALL=C sort"とすれば、環境に依らず一定の結果が得られるらしい。
(上記コマンドは "sort" 実行時のみ、環境変数 "LC_ALL" を "C" にする)
寡聞にして "LC_ALL" という環境変数は知らなかったが、
取り合えず実行すると、私の環境でも先輩の環境でも "A" の方が "a" よりも
先にくるようになった。
しかし、まだ問題は残っていた。
"." や "_" の表示順が異なるのだ。
エンジニアとして、ここは sort の実行順を詳細に調査するべきだが、
あいにくと時間が無い。
とりあえず、
"LANG=C sort"にしたら全て上手く言った。
でも、後学のために、いつか調査をした方がよいな。。