Linuxのログシステム syslogdとは

アプリケーションがログを保存しておきたい場合、syslog APIというのが用意されており、これを使えばsyslogd経由でログを保存することができる。syslog APIにはopenlog(), syslog(), closelog()などがある。syslog()関数で送られたメッセージはsyslogdの設定に従ってファイルなどに書き込まれる。

syslogdの設定は/etc/syslog.confに記述する。1行が1エントリになり1エントリはセレクターとアクションで構成される。セレクターとアクションはスペースかタブで区切られる。セレクターはファシリティとプライオリティで構成され、ピリオドで区切られる。セレクターに適合したメッセージはそのアクションに従ってファイルなどに出力される。

ファシリティ

syslogを使ってログを残したいアプリケーションはopenlog()を使う際に、ファシリティを指定する。ファシリティの種類はあらかじめ決められており、以下のようなものがある。

  • authpriv : セキュリティや認証
  • cron : cronとat
  • daemon : ここに挙げられたファシリティ以外のデーモン用
  • ftp : ftp関係
  • kern : カーネルメッセージ用。klogdから来る。
  • lpr : ラインプリンタ用
  • mail : メール関係
  • mark : syslogで内部的に使われるもの
  • news : USENET news用
  • syslog : syslogが内部的に生成するためのもの
  • user : 一般的なユーザレベルのもの
  • uucp : uucp用
  • local0 から local7 : ローカルで使うために予約されている

 

プライオリティ

アプリケーションはsyslog()を使う際に指定する。いかのようなものがあり、下に行くほどプライオリティが高くなる。つまりより重要なメッセージになる。

  • debug
  • info
  • notice
  • warning, warn
  • err, error
  • crit
  • alert
  • emerg, panic

プライオリティ指定はそのプライオリティ以上のものすべてが対象になるが、= をつけるとそのプライオリティのみに限定することができる。

ファシリティは , で区切り複数指定することができる。またすべてを意味する * を指定することもできる。セレクタ自体は ; で区切り複数指定することができる。

アクション

アクションにはセレクタで指定したログをどうやって保存や出力するかを指定する。以下のようなものがある。

  • 普通のファイル : フルパスを指定する。ログはこのファイルに書き込まれる。フルパスの前に – を置くことができ、これを置くとファイルの同期をしないようになりパフォーマンスが向上するがデータを失う可能性も生じる。よってあまり重要でないものにはこれを使うといいのかもしれない。
  • 名前つきパイプ : 省略
  • ターミナルまたはコンソール : 省略
  • リモートマシン : ログを他のマシンに送ることができる。これにより複数マシンのログを1つのマシンで一括管理できるようになる。リモートマシンを指定するにはフルパスの前に hostname@ を置く。
  • ユーザ : ユーザ名を , で区切って指定すると、それらのユーザがログインしている場合に送られる。
  • ログインしているすべてのユーザ : * を指定すると、ログインしているすべてのユーザに送られる。

 

サンプルプログラム

以下のプログラムを作ってコンパイルする。

$ gcc logthrow.c -o logthrow
logthrow.c: In function ‘main’:
logthrow.c:13: warning: format not a string literal and no format arguments
$ ./logthrow 5 mylog
$

最初の引数は以下の定義を参考に指定する。

このプログラムを実行すると実際にログが書き込まれるので、/etc/syslog.confの設定を見ながら、tail -f などでファイルを監視して、ログの出力を調べることができる。

Ubuntuでフォントをインストールする

Ubuntuのフォント関係はfontconfigライブラリで管理されている。fontconfigはアプリとフォントをつなぐライブラリで、アプリとフォントの管理を一元化する。

ここでは、ふい字とふい字Pフォントをインストールしてみる。

ふい字置き場から、HuiFont29.lzhとHuiFontP29.lzhをダウンロードし解凍する。解凍するためにはlhaが必要なのでインストール。

$ sudo apt-get install lha

あとはfile-rollerでlzhを扱えるので、なかにあるttfファイルを~/.fonts/に移動させる。このディレクトリはfontconfigの設定ファイル/etc/fonts/fonts.confに記述されている。

次に30秒待つ。fontconfigの設定は30秒毎に読み直されるので反映するまで待つ。この設定はfontconfig設定ファイルのrescanに記述されている。

30秒たったら、適当なフォントダイアログを出してフォントを設定できる。ここではgeditで行った。geditを起動し[編集]→[設定]から[ふい字]を選ぶ。

VC6でUNICODEでビルドする

Visual C++ 6でプロジェクトを作成した場合、デフォルトでANSIで作られる。これをUNICODEでビルドするには、以下の手順で行う。

構成の追加

[ビルド]→[構成]で新しい構成を作成する。ここでは名前を「UnicodeDebug」とした。

UNICODEディレクティブ追加

プロジェクトの設定で、「プリプロセッサの定義」に”UNICODE”と”_UNICODE”を加える。

これを加えることにより、以下のようなプリプロセス処理が行われる。

  • MessageBoxなどのAPIがMessageBoxAからMessageBoxWになる。
  • LPCTSTRのようなTを含む文字列マクロがWCHARになる。
  • _Tマクロで括られた文字列がL””になる。

エントリーポイント

プロジェクトの設定のエントリポイントを”wWinMainCRTStartup”に変える。コマンドラインアプリの場合は”wmainCRTStartup”にする。

WinMainをwWinMainに変える

あるいは_tWinMain見たいのにする。この場合”tchar.h”をインクルードする。コマンドラインアプリの場合は_tmain見たいのにする。

これでリンクするとインストールの状態によっては、MFC40UDがない、みたいなリンクエラーになることがある。これはMFCのUnicdeライブラリなので、このエラーが出た場合は、VC6のインストーラを起動して、MFCのUNICODEライブラリをインストールする。

すでにプロジェクトがある場合

すでにANSIで作ったプロジェクトをUNICODEにする場合は、以下のようにする。

  • リテラル文字列を_Tマクロで括る
  • charをTCHARにする
  • std::stringはtstring見たいなのをtypedefする
  • ANSIのCランタイム関数を使っている場合は、T系に直す。strlen→_tcslen。

ただし、GetProcAddressのようなANSI文字列のみを受け取るAPIもあったりするし、APIの引数に渡すバッファのサイズが文字数単位なのかバイト単位なのかとかも注意しないとならないので大きいプロジェクトの場合は大変と思われる。

デバッグ時にUNICODE文字列を表示する

デバッグ時に変数のツールチップなどにUNICODE文字列を表示するには[ツール]→[オプション]から”unicode 文字を表示”をチェックする。

UNICODEでビルドする利点と欠点

利点

  • NT系OSで速くなる?NT系OSは内部的にUNICODEを使っているので、ANSI→UNICODEの変換が不要になる。
  • 韓国語や中国語が使えるようになる。
  • 日本語以外のNT系OSでも文字化けしないで実行できる。(フォントがある場合)

欠点

  • 98系OSで動かなくなる。

Visual Studio 2008からデフォルトでUNICODEビルドになった。

PHPとMySQLの文字コード

formからPOSTのシナリオ

1、formからポスト

ブラウザはページのキャラセットでサーバにデータを送る。<form>タグでキャラセットを指定してある場合もある。携帯の場合は常にshift-jisで送ってくる場合もある。

2、PHPが受取る

PHPが受取る際には、ディレクティブmbstring.encoding_translationが有効であれば、入力エンコードをmbstring.http_inputに設定されているエンコーディングとして扱い内部エンコーディングmbstring.internal_encodingに変換する。mbstring.http_inputが”pass”であれば何もしない。これらのディレクティブはphp.iniなどで設定するかApacheのコンフィグで設定する。.htaccessが利用できればここでも設定できる。以下は.htaccessで設定した例。

<IfModule mod_php5.c>
php_flag  output_buffering              Off
php_value output_handler                none
php_value default_charset               euc-jp
php_value mbstring.language             japanese
php_flag  mbstring.encoding_translation On
php_value mbstring.http_input           pass
php_value mbstring.http_output          pass
php_value mbstring.internal_encoding    euc-jp
php_value mbstring.substitute_character none
</IfModule>

3、PHPがMySQLサーバに送る。

PHPはサーバに接続後、”SET NAMES xxx”を使ってエンコーディングを設定できる。デフォルト値はMySQLのサーバ変数character_set_connectionで指定される。MySQLは受取ったデータをこの値でエンコーディングされているものとして扱う。をMySQL ver4以上は内部的にはUTF8でデータを持っている(character_set_system)ので、このデータをUTF8に変換して保存する。データベースやテーブルにはcollationという属性があるが、これはテーブルデータを”ORDER BY”で並び替えるときに使われる。

character_set_connectionの実行時の値を確認するには、MySQLコマンドラインから、”SHOW VARIABLES;”を発行する。

とここまで調べたが実際にはcharacter_set_clientとかもあって非常にわかりずらいのでスルー。

bashのプロンプトに色をつける

bashのプロンプトは環境変数のPS1を変えればいい。ここではちょっと特殊な色をつける方法。

色をつけるにはANSI エスケープシーケンスを使う。エスケープシーケンスを使う場合は、\[ と \]で囲ってその中に書く。エスケープシーケンスで色をつけるには、ESC[値;値m]の形で記述する。ここでESCはオクタルに直して\033になる。値のところは以下の様になる。(参考

Foreground colors
30 Black
31 Red
32 Green
33 Yellow
34 Blue
35 Magenta
36 Cyan
37 White

Background colors
40 Black
41 Red
42 Green
43 Yellow
44 Blue
45 Magenta
46 Cyan
47 White

実験。プロンプトを赤のAAAにする。

実験。背景が青で文字を黄色にする。

書き方がわかりにくいが、以下の太字のxxの部分を上の色コードに変えればいい。

AAAの部分は実際には\uとか\hとか\Wになるのが普通。これらの意味はman bashで”PROMPTING”を検索すれば分かる。

Ubuntuの場合デフォルトのPS1は以下のようになっている。echo $PS1で確認できる。

debian_chrootと言うのはよく分からないのでスルーするとして、これに色を加えて以下の様にしてみた。

このプロンプトを永続的に使うには、~/.bashrcに記述する。

アクセスを別のページに飛ばすまとめ

<meta>を使う方法

1は一秒後に飛ばす。

Javascriptを使う方法

PHPで302を返す

Perlで302を返す

.htaccessで飛ばす

.htaccessを使えば配下のファイルへのアクセスを引越先にマップできる。

このファイルを/dir/.htaccessとして保存する。http://myserver.example.com/dir/aaa/bbbへのアクセスをhttp://www.example.com/aaa/bbbに飛ばすことができる。

安全なrm safe-rm

safe-rmはrmのラッパコマンド。あらかじめ削除されてはまずいファイルやディレクトリを登録しておき(blacklist)、それらを削除しようとしたときは警告が表示される。ここではUbuntu8.10を使って行った。

マニュアルによると、/usr/local/bin/にrmとしてシンボリックリンクをはって使う記述があるので、それにしたがってやってみる。

パスを確認して/usr/local/binが/usr/binより前にあることを確認する。

$ echo $PATH

シンボリックリンク/usr/local/bin/rmを作成する。

$ sudo ln -s /usr/bin/safe-rm /usr/local/bin/rm

確認

$ which rm
/usr/local/bin/rm
$ file /usr/local/bin/rm
/usr/local/bin/rm: symbolic link to `/usr/bin/safe-rm'

safe-rmはrmと同じオプションを受け入れることが出きるので使うときにはrmコマンドと同じように使える。blacklistを登録するには、/etc/safe-rm.confか~/.safe-rmに記述する。1行に1ファイルor1ディレクトリを記述する。デフォルト状態(=空状態)では重要なファイルが適用されるので、このファイルを作らなくてもいい。デフォルトのblacklistは以下のようになっている。

/bin
/boot
/dev
/etc
/home
/initrd
/lib
/proc
/root
/sbin
/sys
/usr
/usr/bin
/usr/include
/usr/lib
/usr/local
/usr/local/bin
/usr/local/include
/usr/local/sbin
/usr/local/share
/usr/sbin
/usr/share

Ubuntuではインストール時に/etc/safe-rm.confが作られており以下のようになっている。

/bin
/boot
/dev
/etc
/home
/initrd
/lib
/proc
/root
/sbin
/sys
/usr
/usr/bin
/usr/include
/usr/lib
/usr/local
/usr/local/bin
/usr/local/include
/usr/local/sbin
/usr/local/share
/usr/sbin
/usr/share
/usr/src
/var

エントリがディレクトリの場合は、そのディレクトリのみが対象で配下のファイルは関係ないようだ。

実験。
/etc/iranaifile と /etc/iranaidir を/etc/safe-rm.conf追加する

$ sudo vi /etc/safe-rm.conf

作成して削除してみる。

$ sudo touch /etc/iranaifile
$ sudo mkdir /etc/iranaidir
$ sudo rm /etc/iranaifile
Skipping /etc/iranaifile
$ sudo rm -rf /etc/iranaidir/
Skipping /etc/iranaidir/
$

ハードディスクの使用容量を一括して確認できるTreeSize

TreeSizeはハードディスクの容量がどのフォルダにどれだけ使われているかを表示してくれるツール。Windows 2000/XP/Vistaで使用でき、日本語のフォルダ名でも問題なく表示される。

TreeSizeパーセント表示
表示の形式は、サイズ、パーセント、ファイルの数などで表示できるため、いろいろな角度からハードディスクの使用具合を把握できる。ハードディスクが足りなくなってきたり、大きいファイルやフォルダがどこにあるかを確認するのにも重宝する。

インストール

TreeSizeのホームページに行き、インストーラをダウンロードして実行する。

上の画面では、一番上のチェックは、フォルダを右クリックしたときのメニューに追加するかどうかを指定する。ハードディスク全体の使用状況を調べたい場合は、チェックする必要ない。

インストールが完了したら、スタートメニューからTreeSize Freeを探して実行する。Vistaを使っている場合は「管理者として実行」した方がいい。

起動したら、メニューの「Scan」から調べたいドライブを選択し実行する。砂時計があるフォルダは計算中なので、砂時計が全部なくなるまで待つ。計算中でもサイズなどを表示できる。「View」メニューの「Size」と「Allocated Size」の違いは「Size」はファイルの大きさを意味し、「Allocated Size」はハードディスクをどれくらい使っているかをあらわす。NTFSにはファイルを圧縮して保存する機能があるので、実際どれくらい使っているかが調べられて便利。

インストール時にフォルダの右クリックメニューを有効にした場合は、エクスプローラからフォルダを右クリックして[TreeSize Free]を選べば、そのフォルダの状況を確認できる。右クリックメニューを消すには、もう一度インストーラを実行して無効にする。

計算した使用容量をプリントアウトすることもできる。