2011年09月

2011年09月19日

automakeの使い方 (8) - make check (3)

automakeでconfigureスクリプトを作る練習その8。

make checkターゲットによるテストプログラム組み込みの続編。今回は、シェルスクリプトからテストプログラムを呼び出すパターンを取り上げます。
8月18日付記事記載の表、パターン3「手順に従った処理の確認」

例題のソースは、その5(7月20日の記事)で作ったファイル構成をベースラインに利用します。ユースケースの1つは、ローカルにビルドした../sql/libsqlite3.aを使ってデータベースの基本機能(insert, selectなど)をテストすることです。

例題の仕様(パターン3)

  • テストプログラムのソースはサブディレクトリtest/に配置
  • テストプログラムは、シェルスクリプトrun-mytestおよび2個のCプログラムmytest1, mytest2から成り、ソースはそれぞれ、mytest1.c, mytest2.c
  • mytesti(i=1,2)は、../sql/libsqlite3.aとリンクされる。
  • --with_sqlite3[=yes]付きでconfigureされた場合のみ、make checkはmytestiをビルド&実行する。
  • 呼び出し形式は、mytesti db-file sql-stmt
    データベースファイルdb-fileに対して、SQL文sql-stmtを実行し、結果を標準出力に出力する。
  • make checkによりrun-mytestが起動され、run-mytestはmytest1, mytest2を順に呼び出す。
  • テスト実行中、データベースファイルtest.dbがtest/に作られる。test.dbはmake cleanで削除される。
以下、Makefile.am/configure.acの設定方法。

ファイル構成

元のディレクトリ構成にtest/を追加。
$ ls -R
.......
./test:
Makefile  Makefile.am  Makefile.in  mytest1.c  mytest2.c  run-mytest
$ 

Step 1. Makefile.amの編集

トップレベルのMakefile.am:
if SQLITE3_LOCAL
SUBDIRS = sql src test
EXTRA_DIST = test/run-mytest
else
SUBDIRS = src
endif
DIST_SUBDIRS = $(SUBDIRS)
dist_doc_DATA = README
if SQLITE3_LOCAL ... else ... endif
--with_sqlite3[=yes]付きでconfigureされた場合のみ、test/のビルドとテスト実行が行われる。
EXTRA_DIST
make distcheckでシェルスクリプトrun-mytestが配布ソース一式(tar.gz)に含まれるようにする。

test/Makefile.am:

check_PROGRAMS = mytest1 mytest2
TESTS = run-mytest
AUTOMAKE_OPTIONS = color-tests

if SQLITE3_LOCAL
LDADD = ../sql/libsqlite3.a
AM_CPPFLAGS = -I$(top_srcdir)/sql
AM_LDFLAGS = -ldl
endif

CLEANFILES = test.db
check_PROGRAMS
make checkでビルドされるプログラムのリスト
TESTS
実行するテスト。中でmytest1、mytest2が呼ばれる。
if SQLITE3_LOCAL ... endif
--with_sqlite3[=yes]付きでconfigureされた場合のみ、test/が使用されるので、mytestiにリンクするライブラリとして、ローカルにビルドしたlibsqlite3.aを指定する。
CLEANFILES
make checkで一時的に作られたデータベースファイルtest.dbが、make cleanで削除されるようにする。
sql/Makefile.amおよびsrc/Makefile.amについては、変更ありません。

Step 2. テストプログラムの作成

mytest1.cおよびmytest2.cのコードは全く同じです。SQLiteのGetting Started Write Programs That Use SQLite掲載のサンプルCプログラムをコピーして使いました。ただし、コンパイルを通すため、#includeに config.hとstdlib.hも追加しました。
make checkの振る舞いを確認するのが目的なので、2つのテストプログラムの使い分けに意味はありません。

シェルスクリプトrun-mytest:

#! /bin/sh

rm -f test.db
./mytest1 test.db "create table t (id integer)"
./mytest1 test.db "insert into t values(100)"
./mytest1 test.db "insert into t values(200)"
./mytest2 test.db "select * from t"

Step 3. configure.acの編集

AC_CONFIG_FILESのリストにtest/Makefileを追加します。
AM_COND_IF([SQLITE3_LOCAL],
    [AC_CONFIG_FILES([sql/Makefile test/Makefile])]
)

Step 4. テスト実行

distcheckを実行して、test.dbが使用後消去されることを確認します。
$ make distcheck DISTCHECK_CONFIGURE_FLAGS=--with-sqlite3


corbie at 00:10|PermalinkComments(0)TrackBack(0) automake 

2011年09月18日

MinGWインストールメモ

9月5日付記事でgawkの動作確認をするためにMinGWをインストールしたので、ついでに設定のメモ。
以前はMinGW/MSYSの設定は面倒だったみたいですが、現在はGUIインストーラを実行するだけでとても簡単です。
  • 自分の利用形態: 主にMSYS ShellからGNUコマンド利用
  • インストール先: C:\MinGW (デフォルト)
  • GUIインストーラ: mingw-get-inst
    表示されたリストから最新版をダウンロードします。私は
    mingw-get-inst-20110802フォルダのmingw-get-inst-20110802.exe
    を使いました。
  • インストーラ画面で、選択したソフトウェア:
    • Cコンパイラ(デフォルト)
    • MSYS Base System
インストール完了後、 [スタート]メニュー →[プログラム] → [MinGW] →MinGW Shell
でbash 3.1.17が起動。

普段コマンドをMinGW Shell から起動するなら、環境変数PATHにC:\MinGW\binとか追加しなくても使えます。mingw-getは、 C:\MinGW\binにcdしてコマンド直打ちすればOK。(下記参照)

vimのインストール

パッケージ名はmsys-vim。※mingw-get listの出力で確認できます。
C:\MinGW\bin>mingw-get install msys-vim
vimの日本語入力・表示。とりあえず、下記の設定でシフトJISでの読み書きは可能。
$ vim .vimrc
set encoding=japan
set fileencodings=sjis
$
apt-getのノリで、
C:\MinGW\bin>mingw-get update
Update catalogue: package-list.xml
Update catalogue: mingw32-package-list.xml
Update catalogue: mingw32-autoconf.xml
...
パッケージの更新は
C:\MinGW\bin>mingw-get upgrade
まだ、何もアップグレードされませんでした。

corbie at 00:48|PermalinkComments(0)TrackBack(0) MinGW 

2011年09月15日

リアルタイムスキャンが無効です

9月3日昼、PC使ってたら突然、画面右下にマカフィー様から警告がポップアップ。
ご使用のパソコンは危険な状態です。
なに!アンチウイルスプラスのMアイコン起動して状態を確認すると
リアルタイムスキャンが無効です。
無効になんかした覚えないのに・・・
再起動してみたが発生するので、McAfeeサイトのFAQを検索したら、ありました↓
AR-00002 「リアルタイムスキャン:無効」と表示され、ステータスが赤色に変わりました。
ただ、主な原因として挙げられている4項目、私のPCはいずれも該当しません。

以下、経過のメモ。

  1. AR-00002の指示どおり「更新の確認」を実施
  2. ダウンロード開始したが、しばらくしてインストールエラー!
  3. 警告がポップアップ:「ご使用のパソコンは危険な状態です」。詳細を表示すると、
    スパイウェアチェックが無効です。
    スパイウェアチェックを「有効」にしたが、すぐまた「スパイウェアチェックが無効です。」
  4. 「ウィルスおよびスパイウェア対策」のメニューで見ると
    • バッファオーバーフロー チェックが無効になっています。
    • スクリプトチェックが無効になっています。
    なんか段々崩壊していく・・・
  5. しばらくすると、タスクトレイのMアイコンから通知:「更新がインストールされました」。再起動しろ、と。
  6. PC再起動。現象変わらず。
  7. 再度「更新の確認」を実施
  8. しばらくして、McAfee Service Hostのエラー報告がポップアップ
    問題が発生したため、McAfee Service Hostを終了します。
    ご不便をおかけして申し訳ありません。
    ちょww、謝ってる場合じゃないぞ。契約来年3月まであるのに、ここでサジ投げるなよ。
  9. ところが数分後、マカフィー様からうれしいお知らせがポップアップ。「更新のインストール完了、再起動せよ」のメッセージ
  10. PC再起動。正常に戻りました。
最後のステップのところで、ディスクアクセスが長いので、何気なくnetstatしてみた。
C:\>netstat -b
Active Connections

  Proto  Local Address          Foreign Address        State           PID
  TCP    xxxxx:1036             8.18.25.7:https        ESTABLISHED     1920
  [McSvHost.exe]
McAfeeさん、いつも8.18.25.7に接続にいくようです。

corbie at 00:48|PermalinkComments(0)TrackBack(0) Windows 

2011年09月11日

automakeの使い方 (7) - make check (2)

automakeでconfigureスクリプトを作る練習その7。

make checkターゲットによるテストプログラム組み込みの続編。今回は、8月18日付記事記載の表のパターン2「単機能の動作確認」を取り上げます。

例題のソースは、その1(6月10日の記事)で作ったファイル構成をベースラインに利用します。

例題の仕様(パターン2)

  • テストプログラムのソースはサブディレクトリtest/に配置
  • テストプログラムは3個 mytest-i (i=1〜3)、ソースはそれぞれ、mytest-i.c
  • 実行結果はmytest-iのexitコードで表し、0:正常、 1:NG、77:スキップ
  • mytest-2の実行結果はNGになること。
以下、Makefile.am/configure.acの設定方法。

ファイル構成

元のディレクトリ構成にtest/を追加。
$ ls -R
........
./test:
Makefile  Makefile.am  Makefile.in  mytest-1.c  mytest-2.c  mytest-3.c
$ 

Step 1. Makefile.amの編集

トップレベルのMakefile.am:
SUBDIRS = src test
dist_doc_DATA = README
test/Makefile.am:
check_PROGRAMS = mytest-1 mytest-2 mytest-3
TESTS = mytest-1 mytest-2 mytest-3
XFAIL_TESTS = mytest-2
AUTOMAKE_OPTIONS = color-tests
check_PROGRAMS
make checkでビルドされるプログラムのリスト。それぞれ対応するmytest-i.cからビルドされます。
TESTS
実行するテストをリストします。個々のテストが単体のプログラムになっています。テストが実行される前にautomakeが各プログラムをビルドしてくれます。
XFAIL_TESTS
TESTSに挙げたファイルのうち、テストが失敗するはずのものをリストします。
src/Makefile.amは変更なしです。

Step 2. configure.acの編集

AC_CONFIG_FILESのリストにtest/Makefileを追加します。

続きは次回。



corbie at 23:40|PermalinkComments(0)TrackBack(0) automake 

2011年09月05日

Windows版gawk選び

Windows版gawk 3.1.7日本語版バイナリのダウンロードページが2011年9月現在公開停止中です。仕事にも重宝しており残念です。そこで、ほかにもシフトJISやUTF-8に対応したWindows版gawkを探してみることにしました。

候補として、バージョンが比較的新しい、もしくは、最近まで/今もメンテナンスがされていそうな以下の7種類を選びました。
※Vectorで公開されているNo.5は、3.1.7日本語版と同じ作者さんによる、前のバージョンです。

  1. klabaster gawk 4.0.0
  2. GnuWin gawk 3.1.6-1
  3. DJGPP V2 gawk 3.1.8
  4. DJGPP V2 gawk 4.0.0
  5. Vector gawk 3.1.5
  6. UnxUtils gawk 3.1.0
  7. MinGW gawk 3.1.7

これらgawkについて、マルチバイト文字が含まれる入力テキストに対するパターン走査をさせたときに誤動作が起きるかテストしました。簡単なチェックのため、このテストにパスしても「マルチバイトで誤動作するとはいえない」というだけで、「マルチバイトOK」と結論はできませんが。

テスト1: シフトJISだめ文字マッチ

そのgawkがシフトJISに対応しているかの“ふるい”として、文字コードの2バイト目が0x5C(\, バックスラッシュ)になる文字、いわゆる“だめ文字”を入力データやawkスクリプトに記述して、gawkがパターンマッチを正しく行えるかをテストします。
入力データ(シフトJIS)は
ソ噂浬欺圭構蚕十申曾箪貼能表暴予禄兔喀媾彌拿杤歃濬畚秉綵臀藹觸軆鐔饅鷭
テストするawkスクリプト(シフトJIS)は
/表/ { print }
{ if (match($0, /表/)) print "matched" }
{ sub(/表/, "表表"); print }
期待する出力は、1行目:入力データ行、2行目: matched、3行目: 入力データ行の「表」(0x955C)を「表表」に換えたものです。 結果は、
No.gawkversion結果説明
1klabaster gawk4.0.0正常
2GnuWin gawk3.1.6-1正常
3DJGPP V2 gawk3.1.8エラー/表/でunterminated regexp ※1
4DJGPP V2 gawk4.0.0エラー/表/でunterminated regexp ※1
5Vector gawk3.1.5正常
6UnxUtils gawk3.1.0エラー/表/でunterminated regexp
7MinGW gawk3.1.7エラー/表/でunterminated regexp ※1
※1: パターン、match()およびsub()の引数の正規表現内で発生
※MinGW gawkはMinGW Shellから実行

テスト2: シフトJISだめ文字2バイト目マッチ

次は、入力データ中のシフトJISだめ文字2バイト目がバックスラッシュにマッチしないことをテストします。
入力データ(シフトJIS)は、
表abc
xyz\abc
テストするawkスクリプトは
/\\a/ { print; sub(/\\a/, "123"); print }
期待する出力は、1行目:xyz\abc、2行目:xyz123bc です(「表a」の途中からマッチしないこと)。
結果は、
No.gawkversion結果説明
1klabaster gawk4.0.0正常
2GnuWin gawk3.1.6-1正常
3DJGPP V2 gawk3.1.8誤り「表abc」にマッチ
4DJGPP V2 gawk4.0.0誤り「表abc」にマッチ
5Vector gawk3.1.5正常
6UnxUtils gawk3.1.0誤り「表abc」にマッチ
7MinGW gawk3.1.7誤り「表abc」にマッチ
「表abcにマッチ」はいずれも「・23bc」のように漢字コード2バイト目から置換されました。

テスト3: UTF-8シングルバイトマッチ

UTF-8に対するテストは、あるgawkのバージョンでたまたま見つけた誤動作のパターンを使います。
入力データ(UTF-8 BOMなし)は、
<tag>あいうえお</tag>
あいうえおhello world
あいうえお hello world
テストするawkスクリプトは
{
    print length($0)
    print
    sub(/<tag>/, "")
    sub(/<\/tag>/, "")
    sub(/hello/, "ABC")
    print
}
期待する出力は、1行目:文字数またはバイト数、2行目:入力データ行、3行目は最初の入力データ行については「あいうえお」(tagの中身)、2〜3行目の入力データについては「hello」が「ABC」に置換されたものになります。
結果は下表のとおり。length()欄は、length()関数の戻り値の単位です。
No.gawkversion結果length()説明
1klabaster gawk4.0.0誤り文字数「お」の直後のパターン見逃し ※1
2GnuWin gawk3.1.6-1誤り文字数「お」の直後のパターン見逃し ※1
3DJGPP V2 gawk3.1.8正常バイト数
4DJGPP V2 gawk4.0.0正常バイト数
5Vector gawk3.1.5エラー文字数-W ctype=UTF8を指定。Assertion failedで終了 ※2
6UnxUtils gawk3.1.0正常バイト数
7MinGW gawk3.1.7正常バイト数
※1: 「あいうえお</tag>」「あいうえおhello」
※2: Assertion failed: (tmp->flags & WSTRCUR) != 0, file node.c, line 515

まとめ

No.gawkversionテスト1
SJIS
テスト2
SJIS
テスト3
UTF-8
1klabaster gawk4.0.0正常正常誤り
2GnuWin gawk3.1.6-1正常正常誤り
3DJGPP V2 gawk3.1.8エラー誤り正常
4DJGPP V2 gawk4.0.0エラー誤り正常
5Vector gawk3.1.5正常正常エラー
6UnxUtils gawk3.1.0エラー誤り正常
7MinGW gawk3.1.7エラー誤り正常
3つのテストすべてにパスしたgawkはありませんでしたorz

その他、特記事項として

  • DJGPP版は、コマンドプロンプト画面内で出力が表示されないことがあり、私のPCでは動作が不安定でした。
  • GnuWin gawk 3.1.6-1は、/^[a-zA-Z]+$/ { print }みたいなスクリプトを実行するとデバッグが出力されるという痛いバグが残っていて、実用には向かないと思います。
残念ながら、シフトJIS、UTF-8両方で正常に動作しそうなWindows版gawkは候補の中にありませんでした。シフトJISだけでよければ、gawkの最新版が使えるklabaster版が使えるかもしれません。いずれにせよ、冒頭に挙げた3.1.7日本語版バイナリが一番品質が良いため、大事に使おうと思います。

corbie at 01:23|PermalinkComments(5)TrackBack(0) awk | Windows