目次
パッケージされたソースコードを追跡するのに十分な範囲でDebianシステム上でプログラムを学ぶ人への指針を示します。次はプログラムの関して特記すべきパッケージと対応する文書パッケージです。
表12.1 プログラムをすることを補助するパッケージのリスト
| パッケージ | ポプコン | サイズ | 文書 |
|---|---|---|---|
autoconf *
|
V:4, I:27 | 2220 |
autoconf-docが提供する"info autoconf
|
automake *
|
V:3, I:20 | 1840 |
automake1.10-docが提供する"info automake"
|
bash
*
|
V:91, I:99 | 3596 |
bash-docが提供する"info bash"
|
bison
*
|
V:2, I:16 | 1504 |
bison-docが提供する"info bison"
|
cpp
*
|
V:43, I:84 | 76 |
cpp-docが提供する"info cpp"
|
ddd
*
|
V:0.4, I:3 | 3848 |
ddd-docが提供する"info ddd"
|
exuberant-ctags *
|
V:1.2, I:6 | 324 |
exuberant-ctags(1)
|
flex
*
|
V:2, I:16 | 1004 |
flex-docが提供する"info flex"
|
gawk
*
|
V:28, I:32 | 2112 |
gawk-docが提供する"info gawk"
|
gcc
*
|
V:16, I:69 | 64 |
gcc-docが提供する"info gcc"
|
gdb
*
|
V:5, I:28 | 4584 |
gdb-docが提供する"info gdb"
|
gettext *
|
V:8, I:49 | 7368 |
gettext-docが提供する"info gettext"
|
gfortran *
|
V:1.1, I:6 | 40 |
gfortran-docが提供する"info gfortran"
|
glade
*
|
V:0.4, I:2 | 1405 | メニューが提供するヘルプ |
glade-gnome *
|
V:0.12, I:1.3 | 434 | メニューが提供するヘルプ |
libc6
*
|
V:96, I:99 | 9932 |
glibc-docとglibc-doc-referenceが提供する"info
libc"
|
make
*
|
V:21, I:75 | 1588 |
make-docが提供する"info make"
|
mawk
*
|
V:66, I:99 | 244 |
mawk(1)
|
perl
*
|
V:89, I:99 | 18368 |
perl-docとperl-doc-htmlが提供するperl(1)とhtml
|
python *
|
V:60, I:97 | 636 |
python-docが提供するpython(1)とhtmlページ |
tcl8.4 *
|
V:6, I:45 | 3332 |
tcl8.4-docが提供するtcl(3)と詳細なマンページ |
tk8.4
*
|
V:5, I:35 | 2712 |
tk8.4-docが提供するtk(3)と詳細なマンページ |
ruby
*
|
V:8, I:23 | 100 |
riが提供するruby(1)と詳細なマンページ |
vim
*
|
V:14, I:31 | 1732 |
vim-docが提供するヘルプ(F1)メニュー
|
susv2
*
|
I:0.03 | 48 | "The Single Unix Specifications v2"を取得 |
susv3
*
|
I:0.08 | 48 | "The Single Unix Specifications v3"を取得 |
オンラインリファレンスはmanpagesとmanpages-devパッケージをインストールした後で"man
name"とタイプすると使えます。GNUツールのオンラインリファレンスは該当する文書パッケージをインストールした後で"info
program_name"とタイプすると使えます。一部のGFDL文書はDSFGに準拠していないと考えられているのでmainアーカイブに加えてcontribやnon-freeアーカイブを含める必要があるかもしれません。
![]() |
警告 |
|---|---|
" |
![]() |
注意 |
|---|---|
ソースから直接コンパイルしたソフトウエアープログラムは、システムプログラムとかち合わないように、" |
![]() |
ティップ |
|---|---|
"99ボトルのビールの歌"作成のコード例はほとんど全てのプログラム言語に関する理解のための非常に好適です。 |
シェルスクリプトは実行ビットがセットされたテキストファイルで、以下に示すフォーマットのコマンドを含んでいます。
#!/bin/sh ... コマンド行
最初の行はこのファイル内容を読み実行するシェルインタープリタを指定します。
シェルスクリプトを読むのはUnix的なシステムがどのように機能しているのかを理解する最良の方法です。ここでは、シェルプログラムに関する指針や心がけを記します。失敗から学ぶために"シェルの失敗" (http://www.greenend.org.uk/rjk/2001/04/shell.html)を参照下さい。
シェル対話モード(「シェルプロンプト」と「Unix的テキスト処理」参照)と異なり、シェルスクリプトは変数や条件文やループを繁用します。
多くのシステムスクリプトはPOSIXシェル(表1.13「シェルプログラムのリスト」参照)のどれで解釈されるか分かりません。システムのデフォールトシェルは実際のプログラムをさしているシムリンクである"/bin/sh"です。
bash(1)、lenny以前の場合
dash(1)、squeeze以降の場合
全てのPOSIXシェル間でポータブルとするためにbashismsやzshismsを使うシェルスクリプトを書くのを避けましょう。checkbashisms(1)を使うとこれがチェックできます。
表12.2 典型的bashizmsのリスト
| 推薦: POSIX | 回避すべき: bashism |
|---|---|
if [ "$foo" = "$bar" ] ; then …
|
if [ "$foo" == "$bar" ] ; then …
|
diff -u file.c.orig file.c
|
diff -u file.c{.orig,}
|
mkdir /foobar /foobaz
|
mkdir /foo{bar,baz}
|
8進表記: "\377"
|
16進表記: "\xff"
|
"echo"コマンドはその実装がシェルビルトインや外部コマンド間で相違しているので次の注意点を守って使わなければいけません。
-e"と"-E"のコマンドオプション使用を回避します。
-n"以外のどのコマンドオプション使用をも回避します。
![]() |
注記 |
|---|---|
" |
![]() |
ティップ |
|---|---|
出力文字列にエスケープシーケンスを埋め込む必要がある場合には、" |
特別なシェルパラメーターがシェルスクリプト中ではよく使われます。
表12.3 シェル変数のリスト
| シェル変数 | 変数値 |
|---|---|
$0
|
シェルまたはシェルスクリプトの名前 |
$1
|
最初(1番目)のシェル引数 |
$9
|
9番目のシェル引数 |
$#
|
シェル引数の数 |
"$*"
|
"$1 $2 $3 $4 … "
|
"$@"
|
"$1" "$2" "$3" "$4" …
|
$?
|
最近実行のコマンドの終了状態 |
$$
|
このシェルスクリプトのPID |
$!
|
最近スタートしたバックグラウンドジョブのPID |
覚えておくべき基本的なパラメーター展開を次に記します。
表12.4 シェル変数展開のリスト
| パラメーター式形 |
varが設定されていればの値
|
varが設定されていなければの値
|
|---|---|---|
${var:-string}
|
"$var"
|
"string"
|
${var:+string}
|
"string"
|
"null"
|
${var:=string}
|
"$var"
|
"string" (合わせて"var=string"を実行)
|
${var:?string}
|
"$var"
|
"string"をstderrに出力(エラーとともにexitする)
|
ここで、これら全てのオペレーターのコロン":"は実際はオプションです。
:"付き = 存在と非ヌル文字列をテストするオペレータ
:"無し = 存在のみをテストするオペレータ
表12.5 重要なシェル変数置換のリスト
| パラメーター置換形 | 結果 |
|---|---|
${var%suffix}
|
最短のサフィクスパターンを削除 |
${var%%suffix}
|
最長のサフィクスパターンを削除 |
${var#prefix}
|
最短のプリフィクスパターンを削除 |
${var##prefix}
|
最長のプリフィクスパターンを削除 |
各コマンドは条件式に使えるエグジットステイタスを返します。
![]() |
注記 |
|---|---|
シェル条件文の文脈中の"0"は"真"を意味します、一方C条件文の文脈中の"0"は"偽"を意味します。 |
![]() |
注記 |
|---|---|
" |
覚えておくべき基本的な条件文の慣用句は次です。
<command> && <成功したらこのcommandも実行> ||
true"
<command> || <もしcommandが成功しないとこのコマンドも実行> ||
true"
if [ <条件式> ]; then <成功ならこのコマンドを実行> else <成功でばいならこのコマンドを実行> fi
ここで、シェルスクリプトが"-e"フラグ付きで起動された際にシェルスクリプトがこの行でexitしないようにするために末尾の"||
true"が必要です。
表12.6 条件式中のファイル比較オペレーター
| 式 | 論理真を返す条件 |
|---|---|
-e <file>
|
<file> 存在する |
-d <file>
|
<file> 存在しディレクトリーである |
-f <file>
|
<file> 存在し通常ファイルである |
-w <file>
|
<file> 存在し書込み可 |
-x <file>
|
<file> 存在し実行可 |
<file1> -nt <file2>
|
<file1>は<file2>より新しい(変更) |
<file1> -ot <file2>
|
<file1>は<file2>より古い(変更) |
<file1> -ef <file2>
|
<file1>と<file2>は同デバイス上の同inode番号 |
表12.7 条件式中での文字列比較オペレータのリスト
| 式 | 論理真を返す条件 |
|---|---|
-z <str>
|
<str>の長さがゼロ |
-n <str>
|
<str>の長さが非ゼロ |
<str1> = <str2>
|
<str1>と<str2>は等しい |
<str1> != <str2>
|
<str1>と<str2>は等しく無い |
<str1> < <str2>
|
<str1>は<str2>より前(ロケール依存) |
<str1> > <str2>
|
<str1>は<str2>より後(ロケール依存) |
条件式中の算術整数比較演算子は"-eq"と"-ne"と"-lt"と"-le"と"-gt"と"-ge"です。
POSIXシェル中で使われるループの慣用句があります。
for x in foo1 foo2 … ; do コマンド ; done"は"foo1
foo2
…"リストの項目を変数"x"にアサインし"コマンド"を実行してループします。
while 条件 ; do コマンド ;
done"は"条件"が真の場合"コマンド"を繰り返します。
until 条件 ; do コマンド ;
done"は"条件"が真でない場合"コマンド"を繰り返します。
break"に出会うと、ループからの脱出が出来ます。
continue"に出会うと、次のループ初めに戻りループを再開する。
![]() |
ティップ |
|---|---|
C言語のような数字の繰り返しは" |
![]() |
ティップ |
|---|---|
「ファイルに関してループしながらコマンドを反復実行」を参照下さい。 |
シェルはおおよそ次のシーケンスでスクリプトを処理します。
"…"や'…'の中なら、行の一部を1つのトークンとしてグループします。
シェルは1行を次のによってトークンに分割します。
<space> <tab> <newline>
< > | ; & ( )
シェルは、もし"…"や'…'の中でないなら、各キーワードをチェックしその挙動を調整します。
if then elif else fi for
in while unless do done case esac
"…"や'…'の中でないなら、エリアスを展開します。
シェルは、もし"…"や'…'の中でないなら、ティルドを展開します。
~" → 現ユーザーのホームディレクトリー
~<user>" →
<user>のホームディレクトリー
シェルは、もし'…'の中でないなら、パラメーター"をその値に展開します。
$PARAMETER"
or "${PARAMETER}"
シェルは、もし'…'の中でないなら、コマンドの置き換えを展開します。
$( command )" → "command"の出力
` command `" → "command"の出力
シェルは、もし"…"や'…'の中でないなら、パス名のグロブを展開します。
* → いかなる文字
? → 1文字
[…] → "…"中の1つ
シェルはコマンドを次から検索して実行します。
$PATH"中の実行ファイル
ダブルクォートの中のシングルクォートは特段の効果はありません。
シェル環境中で"set
-x"を実行したり、シェルを"-x"オプションで起動すると、シェルは実行するコマンドを全てプリントするようになります。これはデバグをするのに非常に便利です。
Debianシステム上でできるだけポータブルなシェルプログラムとするにはessentialパッケージで提供されるユーティリティープログラムだけにユーティリティープログラムを制約するのが賢明です。
aptitude search ~E"はessential(必須)パッケージをリストします。
dpkg -L <パッケージ名> |grep
'/man/man.*/'"は<パッケージ名>パッケージによって提供されるコマンドのマンページをリストします。
表12.8 シェルスクリプト用の小さなユーティリティープログラムを含むパッケージのリスト
| パッケージ | ポプコン | サイズ | 説明 |
|---|---|---|---|
coreutils *
|
V:91, I:99 | 11792 | GNUコアユーティリティー |
debianutils *
|
V:92, I:99 | 220 | Debian限定の雑ユーティリティー |
bsdmainutils *
|
V:73, I:99 | 756 | FreeBSD由来の追加ユーティリティー集 |
bsdutils *
|
V:72, I:99 | 184 | 4.4BSD-Lite由来の基本ユーティリティー |
moreutils *
|
V:0.2, I:1.4 | 208 | 追加のUnixユーティリティー |
![]() |
ティップ |
|---|---|
|
簡単なシェルプログラムのユーザーインターフェースは、echoやreadコマンドを使った退屈な相互作用からいわゆる対話(dialog)プログラム等の一つを使うことでよりよい相互作用になります。
表12.9 ユーザーインターフェースプログラムのリスト
| パッケージ | ポプコン | サイズ | 説明 |
|---|---|---|---|
x11-utils *
|
V:24, I:51 | 592 |
xmessage(1): window中にメッセージや質問を表示(X)
|
whiptail *
|
V:45, I:99 | 100 | シェルスクリプトからユーザーフレンリーなダイアログボックスを表示(newt) |
dialog *
|
V:5, I:26 | 1508 | シェルスクリプトからユーザーフレンリーなダイアログボックスを表示(ncurses) |
zenity *
|
V:8, I:44 | 4952 | シェルスクリプトからグラフィカルなダイアログボックスを表示(gtk2.0) |
ssft
*
|
V:0.01, I:0.11 | 152 | シェルスクリプトフロントエンドツール(gettextを使ったzenityやkdialogやdialogのラッパー) |
gettext *
|
V:8, I:49 | 7368 |
"/usr/bin/gettext.sh": メッセージ翻訳
|
dvdisaster(1)によってRS02データーを補足したISOイメージを生成する簡単なスクリプトの例を次に示します。
#!/bin/sh -e
# gmkrs02 : Copyright (C) 2007 Osamu Aoki <osamu@debian.org>, Public Domain
#set -x
error_exit()
{
echo "$1" >&2
exit 1
}
# Initialize variables
DATA_ISO="$HOME/Desktop/iso-$$.img"
LABEL=$(date +%Y%m%d-%H%M%S-%Z)
if [ $# != 0 ] && [ -d "$1" ]; then
DATA_SRC="$1"
else
# Select directory for creating ISO image from folder on desktop
DATA_SRC=$(zenity --file-selection --directory \
--title="Select the directory tree root to create ISO image") \
|| error_exit "Exit on directory selection"
fi
# Check size of archive
xterm -T "Check size $DATA_SRC" -e du -s $DATA_SRC/*
SIZE=$(($(du -s $DATA_SRC | awk '{print $1}')/1024))
if [ $SIZE -le 520 ] ; then
zenity --info --title="Dvdisaster RS02" --width 640 --height 400 \
--text="The data size is good for CD backup:\\n $SIZE MB"
elif [ $SIZE -le 3500 ]; then
zenity --info --title="Dvdisaster RS02" --width 640 --height 400 \
--text="The data size is good for DVD backup :\\n $SIZE MB"
else
zenity --info --title="Dvdisaster RS02" --width 640 --height 400 \
--text="The data size is too big to backup : $SIZE MB"
error_exit "The data size is too big to backup :\\n $SIZE MB"
fi
# only xterm is sure to have working -e option
# Create raw ISO image
rm -f "$DATA_ISO" || true
xterm -T "genisoimage $DATA_ISO" \
-e genisoimage -r -J -V "$LABEL" -o "$DATA_ISO" "$DATA_SRC"
# Create RS02 supplemental redundancy
xterm -T "dvdisaster $DATA_ISO" -e dvdisaster -i "$DATA_ISO" -mRS02 -c
zenity --info --title="Dvdisaster RS02" --width 640 --height 400 \
--text="ISO/RS02 data ($SIZE MB) \\n created at: $DATA_ISO"
# EOF
デスクトップに"/usr/local/bin/gmkrs02
%d"のようなコマンド設定をしたローンチャを作るのも面白いかもしれません。
Makeはプログラムのグループを管理するためのユーティリティーです。make(1)を実行すると、makeは"Makefile"というルールーファイルを読み、ターゲットが最後に変更された後で変更された前提ファイルにターゲットが依存している場合やターゲットが存在しない場合にはターゲットを更新します。このような更新は同時並行的にされるかもしれません。
ルールファイルのシンタックスは次です。
ターゲット: [ 前提 ... ] [TAB] command1 [TAB] -command2 # エラー無視 [TAB] @command3 # エコー抑制
上記で、" [TAB]
"はTABコードです。各行はmakeによる変数置換後シェルによって解釈されます。スクリプトを継続する行末には"\"を使います。シェルスクリプトの環境変数のための"$"を入力するためには"$$"を使います。
ターゲットや前提に関するインプリシット(暗黙)ルールは、例えば次のように書けます。
%.o: %.c header.h
上記で、ターゲットは"%"
という文字を(1つだけ)含んでいます。"%"は実際のターゲットファイル名の空でないいかなる部分文字列ともマッチします。前提もまた同様にそれらの名前が実際のターゲットファイル名にどう関連するかを示すために"%"を用いることができます。
表12.10 makeの自動変数のリスト
| 自動変数 | 変数値 |
|---|---|
$@
|
ターゲット |
$<
|
最初の前提条件 |
$?
|
全ての新規の前提条件 |
$^
|
全ての前提条件 |
$*
|
"%"はターゲットパターンの軸にマッチします
|
"make -p -f/dev/null"を実行して自動的な内部ルールを確認下さい。
Cプログラム言語で書かれたプログラムをコンパイルする適切な環境を次のようにして設定できます。
# aptitude install glibc-doc manpages-dev libc6-dev gcc build-essential
GNU
Cライブラリーパッケージであるlibc6-devパッケージは、Cプログラム言語で使われるヘッダーファイルやラライブラリールーチンの集合であるC標準ライブラリーを提供します。
Cのリファレンスは以下を参照下さい。
info libc" (Cライブラリー関数リファレンス)
gcc(1)と"info gcc"
各Cライブラリー関数名(3)
簡単な例の"example.c"は"libm"ライブラリーを使って実行プログラム"run_example"に次のようにしてコンパイル出来ます。
$ cat > example.c << EOF
#include <stdio.h>
#include <math.h>
#include <string.h>
int main(int argc, char **argv, char **envp){
double x;
char y[11];
x=sqrt(argc+7.5);
strncpy(y, argv[0], 10); /* prevent buffer overflow */
y[10] = '\0'; /* fill to make sure string ends with '\0' */
printf("%5i, %5.3f, %10s, %10s\n", argc, x, y, argv[1]);
return 0;
}
EOF
$ gcc -Wall -g -o run_example example.c -lm
$ ./run_example
1, 2.915, ./run_exam, (null)
$ ./run_example 1234567890qwerty
2, 3.082, ./run_exam, 1234567890qwerty
ここで、"-lm"はsqrt(3)のためにlibc6パッケージで提供されるライブラリー"/usr/lib/libm.so"をリンクするのに必要です。実際のライブラリーは"/lib/"中にあるファイル名"libm.so.6"で、それは"libm-2.7.so"にシムリンクされています。
出力テキスト中の最後のパラメーターを良く見ましょう。"%10s"が指定されているにもかかわらず10文字以上あります。
上記のオーバーラン効果を悪用するバッファーオーバーフロー攻撃を防止のために、sprintf(3)やstrcpy(3)等の境界チェック無しのポインターメモリー操作関数の使用はお勧めできません。これに代えてsnprintf(3)やstrncpy(3)を使います。
デバグは重要なプログラム活動です。プログラムのデバグをどうしてするかを知っていることで、あなたも意味あるバグリポートを作成できる良いDebianユーザーになれます。
Debian上の第一義的デバッガは、実行中のプログラムを検査できるようにするgdb(1)です。
gdbと関連プログラムを次のようにインストールしましょう。
# aptitude install gdb gdb-doc build-essential devscripts
gdbの良い入門書は"info gdb"とかネット上に色々あります。次はgdb(1)を"-g"を使ってデバグ情報を付けてコンパイルされた"program"に使う簡単な例です。
$ gdb program (gdb) b 1 # set break point at line 1 (gdb) run args # run program with args (gdb) next # next line ... (gdb) step # step forward ... (gdb) p parm # print parm ... (gdb) p parm=12 # set value to 12 ... (gdb) quit
![]() |
ティップ |
|---|---|
多くの |
Debianシステムではデフォールトではインストールされたバイナリーはストリップされているべきなので、通常のパッケージではほとんどのデバグシンボルが削除されています。gdb(1)を使ってDebianパッケージをデバグするには、対応する*-dbgパッケージをインストールする必要があります(例えばlibc6の場合libc6-dbg)。
デバグしようとしているパッケージに*-dbgパッケージが無い場合は、次のようにしてリビルドした後でインストールする必要があります。
$ mkdir /path/new ; cd /path/new $ sudo aptitude update $ sudo aptitude dist-upgrade $ sudo aptitude install fakeroot devscripts build-essential $ sudo apt-get build-dep source_package_name $ apt-get source package_name $ cd package_name*
必要に応じてバグを修正します。
例えば次のように、既存パッケージを再コンパイルする時は"+debug1"を後ろに付けたり、リリース前のパッケージをコンパイルする時は"~pre1"を後ろに付けたりと、正規のDebianバージョンとかち合わないようにパッケージバージョンを増やします。
$ dch -i
次のようにしてデバグシンボル付きでパッケージをコンパイルしてインストールします。
$ export DEB_BUILD_OPTIONS=nostrip,noopt $ debuild $ cd .. $ sudo debi package_name*.changes
パッケージのビルドスクリプトを確認して、バイナリーのコンパイルに確実に"CFLAGS=-g
-Wall"が使われているようにします。
プログラムがクラッシュするのに出会った場合に、バックトレース情報をバグレポートに切り貼りして報告するのは良い考えです。
バックトレースは次のような段取りで得られます。
gdb(1)の下でプログラム実行します。
クラッシュを再現します。
gdbプロンプトに落ちて戻るようになります。
gdbプロンプトで "bt"とタイプします。
プログラムがフリーズした場合には、gdbを実行しているターミナルでCtrl-Cを押すことでプログラムをクラッシュさせてgdbプロンプトが得られます。
![]() |
ティップ |
|---|---|
しばしば、一番上数行が" |
$ MALLOC_CHECK_=2 gdb hello
表12.12 上級gdbコマンドのリスト
| コマンド | コマンド目的の説明 |
|---|---|
(gdb) thread apply all bt
|
マルチスレッドプログラムの全てのスレッドのバックトレースを取得 |
(gdb) bt full
|
関数コールのスタック上に来たパラメーターを取得 |
(gdb) thread apply all bt full
|
異常のオプションの組み合わせでバックトレースとパラメーターを取得 |
(gdb) thread apply all bt full 10
|
無関係の出力を切り最後の10のコールに関するバックトレースとパラメーターを取得 |
(gdb) set logging on
|
gdbアウトプットをファイルに書き出す(デフォールトは"gdb.txt")
|
GNOMEプログラムpreview1がXエラーを受けると、次のようなメッセージが見つかります。
The program 'preview1' received an X Window System error.
このような場合には、プログラムを"--sync"付きで実行して、バックトレースを得るために"gdk_x_error"関数上で停止するようにしてみましょう。
次のようにldd(1)を使ってプログラムのライブラリーへの依存関係をみつけだします。
$ ldd /bin/ls
librt.so.1 => /lib/librt.so.1 (0x4001e000)
libc.so.6 => /lib/libc.so.6 (0x40030000)
libpthread.so.0 => /lib/libpthread.so.0 (0x40153000)
/lib/ld-linux.so.2 => /lib/ld-linux.so.2 (0x40000000)
`chroot`された環境下でls(1)が機能するには、上記ライブラリーがあなたの`chroot`された環境内で使える必要があります。
「プログラム活動の追跡」を参照下さい。
Debianにはメモリーリークを検出するプログラムがいくつか存在します。
表12.13 メモリーリーク検出ツールのリスト
| パッケージ | ポプコン | サイズ | 説明 |
|---|---|---|---|
libc6-dev *
|
V:43, I:68 | 11088 |
mtrace(1): glibc中のmallocデバッグ機能
|
valgrind *
|
V:1.2, I:6 | 142954 | メモリーデバッガとプロファイラ |
kmtrace *
|
V:0.3, I:2 | 264 |
glibcのmtrace(1)を使うKDEメモリーリークトレースソフト
|
alleyoop *
|
V:0.06, I:0.4 | 1000 | メモリーチェックソフトのGNOMEフロントエンド |
electric-fence *
|
V:0.06, I:0.9 | 108 |
malloc(3)デバッガ
|
leaktracer *
|
V:0.01, I:0.11 | 116 | C++プログラム用のメモリーリーク追跡ソフト |
libdmalloc5 *
|
V:0.01, I:0.2 | 356 | メモリーアロケーションのデバグ用ライブラリー |
mpatrolc2 *
|
V:0.01, I:0.02 | 3592 | メモリーアロケーションをデバグするライブラリー |
表12.14 静的コード分析ツールのリスト
| パッケージ | ポプコン | サイズ | 説明 |
|---|---|---|---|
splint *
|
V:0.07, I:0.5 | 1836 | Cプログラムを静的にバグのチェックするためのツール |
rats
*
|
V:0.05, I:0.2 | 876 | セキュリティーの大まかな監査ツール(C, C++, PHP, Perl, Python コード) |
flawfinder *
|
V:0.02, I:0.19 | 192 | C/C++ソースコードを検査してセキュリティーの脆弱性を探すツール |
perl
*
|
V:89, I:99 | 18368 |
静的コードチェックソフト付きのインタープリタ: B::Lint(3perl)
|
pylint *
|
V:0.10, I:0.5 | 552 | Pythonコード静的チェックソフト |
jlint
*
|
V:0.01, I:0.10 | 184 | Javaプログラム静的チェックソフト |
weblint-perl *
|
V:0.12, I:0.8 | 28 | HTML用のシンタックス最小限の文体チェックソフト |
linklint *
|
V:0.05, I:0.3 | 432 | 高速リンクチェックソフトとウェッブサイトメンテツール |
libxml2-utils *
|
V:5, I:51 | 156 |
XMLファイルを検証するxmllint(1)を含むユーティリティー
|
flex(1)の入門書は"info flex"の中にあります。
自分で作った"main()"と"yywrap()"を供給する必要があります。そうでない場合にはあなたのflexプログラムは次のようでなければライブラリー無しにコンパイル出来ません。これというのは"yywrap"はマクロで、"%option
main"とすると"%option noyywrap"が暗示的に有効になるからです。
%option main %% .|\n ECHO ; %%
上記の代わりにとして、cc(1)のコマンドラインの最後に(ちょうどAT&T-Lexが"-ll"付きであるように)"-lfl"リンカーオプションを使いコンパイルすることが出来ます。この場合、"%option"は必要なくなります。
Yacc互換の前方参照可能なLRパーサーとかLALRパーサー生成ソフトは、いくつかのパッケージによってDebian上で提供されています。
表12.15 Yacc互換のLALRパーサー生成ソフトのリスト
| パッケージ | ポプコン | サイズ | 説明 |
|---|---|---|---|
bison
*
|
V:2, I:16 | 1504 | GNU LALRパーサー生成ソフト |
byacc
*
|
V:0.12, I:1.2 | 160 | Berkeley LALRパーサー生成ソフト |
btyacc *
|
V:0.00, I:0.06 | 248 |
byaccに基づいたバックトラッキング機能付きパーサー生成ソフト
|
bison(1)の入門書は"info bison"の中にあります。
あなた自身の"main()"と"yyerror()"を供給する必要があります。"main()"は、しばしばFlexによって提供される"yylex()"を呼び出す"yyparse()"を呼び出します。
%% %%
Autoconfは自動的にソフトウエアーのソースコードパッケージをGNUのビルドシステムを使って種々様々なUnix的システムに適応させるためのシェルスクリプトを作成するツールです。
autoconf(1)は"configure"という設定プログラムを作成します。"configure"は"Makefile.in"を雛形として使って自動的にカスタム化した"Makefile"を作成します。
![]() |
警告 |
|---|---|
システムファイルをあなたがコンパイルしたプログラムでインストールする時に上書きしてはいけません。 |
Debianは"/usr/local/"とか"/opt"中のファイルに触れません。プログラムをソースからコンパイルする場合、Debianとかち合わないようにそれを"/usr/local/"の中にインストールします。
$ cd src $ ./configure --prefix=/usr/local $ make $ make install # this puts the files in the system
オリジナルのソースを保有し、それがautoconf(1)/automake(1)と使用しあなたがそれをどう設定したかを覚えているなら、次のように実行してソフトウエアーをアンイストールします。
$ ./configure ''all-of-the-options-you-gave-it'' # make uninstall
この代わりに、"/usr/local/"の下にだけインストールプロセスがファイルを置いたことが絶対に確実frそこに重要なものが無いなら、次のようにしてその内容を消すことが出来ます。
# find /usr/local -type f -print0 | xargs -0 rm -f
どこにファイルがインストールされるか良く分からない場合には、checkinstallパッケージにあるcheckinstall(8)を使いアンインストールする場合クリーンなパスとなるようにすることを考えましょう。これは"-D"オプションを使うとDebianパッケージを作成できます。
どんなAWKスクリプトでもa2p(1)を使えば自動的にPerlに書き換えられますが、1行AWKスクリプトから1行Perlスクリプトへの変換は手動変換するのが最良です。
次のAWKスクリプト断片を考えます。
awk '($2=="1957") { print $3 }' |
これは次の数行のどれとも等価です。
perl -ne '@f=split; if ($f[1] eq "1957") { print "$f[2]\n"}' |
perl -ne 'if ((@f=split)[1] eq "1957") { print "$f[2]\n"}' |
perl -ne '@f=split; print $f[2] if ( $f[1]==1957 )' |
perl -lane 'print $F[2] if $F[1] eq "1957"' |
perl -lane 'print$F[2]if$F[1]eq+1957' |
最後のスクリプトは謎々状態です。Perlの次の機能を利用しています。
コマンドラインオプションに関してはperlrun(1)を参照下さい。もっとクレージーなPerlスクリプトに関しては、Perlゴルフが面白いです。
基本的な対話式動的ウェッブページは次のようにして作られます。
フォームのエントリーを埋めたりクリックすることによって次の符号化されたパラメーター付きのURL文字列をブラウザーからウェッブサーバーに送信します。
http://www.foo.dom/cgi-bin/program.pl?VAR1=VAL1&VAR2=VAL2&VAR3=VAL3"
http://www.foo.dom/cgi-bin/program.py?VAR1=VAL1&VAR2=VAL2&VAR3=VAL3"
http://www.foo.dom/program.php?VAR1=VAL1&VAR2=VAL2&VAR3=VAL3"
%nn"は16進数でnnの値の文字と置き換えられます。
QUERY_STRING="VAR1=VAL1 VAR2=VAL2
VAR3=VAL3"".
program.*"のいずれでも)が環境変数"$QUERY_STRING"とともに起動されます。
STDOUT(標準出力)がウエブブラウザーに送られ対話式の動的なウェッブページとして表示されます。
セキュリティー上、CGIパラメーターを解釈する手作りの急ごしらえのプログラムは作らない方が賢明です。PerlやPythonにはこのための確立したモジュールが存在します。PHPはこの様な機能とともに提供されます。クライアントでのデーターのストレージの必要がある場合、HTTPクッキーが使われます。クライアント再度のデーター処理が必要な場合、Javascriptが良く使われます。
詳しくは、Common Gateway InterfaceやThe Apache Software FoundationやJavaScriptを参照下さい。
http://www.google.com/search?hl=en&ie=UTF-8&q=CGI+tutorialをURLとして直接ブラウザーのアドレスに入れGoogleで"CGI tutorial"を検索するとグーグルサーバー上のCGIスクリプトが動いているのを観察する良い例です。
ソースコード変換するプログラムがあります。
表12.16 ソースコード変換ツールのリスト
| パッケージ | ポプコン | サイズ | キーワード | 説明 |
|---|---|---|---|---|
perl
*
|
V:89, I:99 | 18368 | AWK→PERL |
AWからPERLへのソースコード変換シフト: a2p(1)
|
f2c
*
|
V:0.15, I:1.1 | 448 | FORTRAN→C |
FORTRAN 77からC/C++へのソースコード変換ソフト: f2c(1)
|
protoize *
|
V:0.00, I:0.06 | 132 | ANSI C | CコードからANSIプロトタイプを生成/削除 |
intel2gas *
|
V:0.01, I:0.08 | 344 | intel→gas | NASM (Intelフォーマット)からGNU Assembler (GAS)への変換ソフト |
Debianパッケージを作りたい場合には、次を読みましょう。
debuild(1)とpbuilder(1)とpdebuild(1)
maint-guideパッケージ)
developers-referenceパッケージ)
debian-policyパッケージ)
dh-makeやdh-make-perl等のようなパッケージングを補助するパッケージもあります。