プログラミングコンテストチャレンジブックに載っていた、「食物連鎖」という問題(POJ 1182)。Union-Find木を応用して解けるらしいが、文字の説明だけではすんなり理解できなかったので概念を図にした。すっきりした。
2011年11月20日日曜日
2011年11月14日月曜日
GCC でコンパイルの中間ファイルを残す
-save-temps というオプションを使う。
例: プリプロセッサの出力を調べる
- マクロ "
NUM" を含むソース dtestval.c -
#include <stdio.h> int main(int argc, char *argv[]) { printf("Value of NUM is %d\n", NUM); return 0; } -save-tempsオプションとマクロ定義を与えてコンパイルしてみる-
$ gcc -save-temps -DNUM="1 + 1" dtestval.c -o dtestval $ ls -1 dtestval* dtestval dtestval.c dtestval.i dtestval.o dtestval.s
- プリプロセスの出力ファイル dtestval.i
-
# 1 "dtestval.c" # 1 "
" (省略) # 938 "/usr/include/stdio.h" 3 4 # 2 "dtestval.c" 2 int main(int argc, char *argv[]) { printf("Value of NUM is %d\n", 1 + 1); return 0; } - "
NUM" の定義が反映されて1 + 1になっているのが分かる。
2011年11月13日日曜日
GDB で core を作りつつプロセスを止める
生きているプロセスのプロセスIDを調べて、GDB をそのIDに attach してから kill(GDBの kill コマンド)すると core が出てくれる(もちろんプロセスの executable file はGCCの"-g"オプション付きでコンパイルされている必要がある)。
別の言葉で言うと、シェルから kill -QUIT pid する以外にも方法がある、ということ。
2011年9月13日火曜日
mii-tool と ethtool
Linuxでネットワークインターフェースの状況を確認するときに使えるコマンド。
mii-tool
$ man mii-tool
NAME
mii-tool - view, manipulate media-independent interface status
(略)
指定したインターフェース(et0, eth1 など)の状況を表示する。-wオプションを使うとlink status の変化を検出してくれる。たとえば、VMWareなどのゲストOS上で実験すると面白い。
仮想スイッチに接続したゲストOSで mii-tool -w を実行してみる
VMWare Fusion on Mac OS 10.6.8 にインストールしたゲストOS(CentOS-6.0)で eth1に対して mii-tool -wを実行。
仮想ネットワークの設定を開く。
「接続」のチェックボックスをオフにする。これで、仮想的にネットワークケーブルを抜いた状態になる。
すると、mii-tool の出力が変化してno link
になる。
「接続」のチェックボックスをオンに戻すと、もとに戻る。
このように mii-tool は楽しいのだが、obsoleteであるからなるべく使わないほうがよいらしい(その代わりにethtoolを使う)。
ethtool
$ man ethtool
NAME
ethtool - Display or change ethernet card settings
(略)
ethtool は mii-tool に比べると多機能でオプションが多いので、とりあえずNICの状態を調べる。
# ethtool eth1
Settings for eth1:
Supported ports: [ TP ]
Supported link modes: 10baseT/Half 10baseT/Full
100baseT/Half 100baseT/Full
1000baseT/Full
Supports auto-negotiation: Yes
Advertised link modes: 10baseT/Half 10baseT/Full
100baseT/Half 100baseT/Full
1000baseT/Full
Advertised pause frame use: No
Advertised auto-negotiation: Yes
Speed: 1000Mb/s
Duplex: Full
Port: Twisted Pair
PHYAD: 0
Transceiver: internal
Auto-negotiation: on
MDI-X: Unknown
Supports Wake-on: d
Wake-on: d
Current message level: 0x00000007 (7)
Link detected: yes
上述の mii-tool -w のようにケーブルの状態をチェックするなら、たとえば watchと組み合わせて
# watch -n 1 "ethtool eth1|grep 'Link detected'"
とすれば間に合う(下の画像のように表示される)。
2011年9月8日木曜日
yum groupinstall ほか
yumのパッケージを複数まとめたもの、つまり「パッケージグループ」をインストールするためのコマンドが yum groupinstall。
メール、DNS、WWW等のサーバー用Linuxに、後になってデスクトップ環境を入れようとすると大量のパッケージを追加インストールしなければならないのだが、そういった場合に役にたつ。
そして、パッケージグループ関連のコマンドは、groupinstallのほかにも
- grouplist
- groupinfo
- groupupdate
- groupremove
…等がある。
yum grouplist の例
# yum grouplist Loaded plugins: fastestmirror Setting up Group Process Loading mirror speeds from cached hostfile * base: mirror.khlug.org * extras: data.nicehosting.co.kr * updates: data.nicehosting.co.kr Installed Groups: Additional Development Arabic Support (略) Web Server Available Groups: Afrikaans Support Albanian Support (略) iSCSI Storage Client Done
yum groupinfo の例
# yum groupinfo Desktop Loaded plugins: fastestmirror Setting up Group Process Loading mirror speeds from cached hostfile * base: mirror.khlug.org * extras: data.nicehosting.co.kr * updates: data.nicehosting.co.kr Group: Desktop Description: A minimal desktop that can also be used as a thin client. Mandatory Packages: NetworkManager NetworkManager-gnome alsa-plugins-pulseaudio (略) Default Packages: eog gdm-plugin-fingerprint (略) Optional Packages: control-center-extra sabayon-apply tigervnc-server xguest
2011年9月3日土曜日
Linux の /proc/crypto
/proc/crypto を見ると、Linuxカーネルがどのような暗号化アルゴリズム(cryptographic cipher)を使用しているかがわかる、という話
/proc/crypto の例
CentOS-6.0 で /proc/crypto を見てみた。
# cat /proc/crypto name : xts(aes) driver : xts(aes-asm) module : kernel priority : 200 refcnt : 1 selftest : passed type : givcipher async : no blocksize : 16 min keysize : 32 max keysize : 64 ivsize : 16 geniv : eseqiv (略)
name だけ grep してみた。
# grep '^name' /proc/crypto name : xts(aes) name : xts(aes) name : sha256 name : sha224 name : cbc(aes) name : cbc(aes) name : aes name : aes name : stdrng name : crc32c name : sha1 name : md5
暗号化モジュールをロードしてみる
カーネルが使用できる暗号を追加したい場合は、該当するモジュールをロードしてやればいい(modprobe 等のコマンドを使う)。
例:blowfish暗号を追加
# modprobe blowfish
lsmod, modinfoで、ロードされたモジュールを確認。
# lsmod |grep blowfish blowfish 7850 0 # modinfo blowfish filename: /lib/modules/2.6.32-71.29.1.el6.x86_64/kernel/crypto/blowfish.ko description: Blowfish Cipher Algorithm license: GPL srcversion: 3D0BFB5C93D66CBA1C92FA2 depends: vermagic: 2.6.32-71.29.1.el6.x86_64 SMP mod_unload modversions
/proc/crypto も確認。
cat /proc/crypto name : blowfish driver : blowfish-generic module : blowfish priority : 0 refcnt : 1 selftest : passed type : cipher blocksize : 8 min keysize : 4 max keysize : 56 (略)
dm-crypt での例
dm-crypt は、ディスク暗号化のための仕組み(a device-mapper crypto target)。dm-crypt を使用すると、/proc/crypto の内容が変化する。つまり、 dm-crypt が Linuxカーネルの暗号化モジュールを利用している、ということが分かる。
テキトーにdm-cryptを使って暗号化してみる
/dev/sdc1 を blowfish の CTRモード で暗号化して mapping01 にマップ。
# cryptsetup create -y -c blowfish-ctr-plain mapping01 /dev/sdc1
/proc/crypto を見てみる。
# cat /proc/crypto name : ctr(blowfish) driver : ctr(blowfish-generic) module : kernel priority : 0 refcnt : 2 selftest : passed type : givcipher async : yes blocksize : 1 min keysize : 4 max keysize : 56 ivsize : 8 geniv : chainiv name : ctr(blowfish) driver : ctr(blowfish-generic) module : ctr priority : 0 refcnt : 2 selftest : passed type : blkcipher blocksize : 1 min keysize : 4 max keysize : 56 ivsize : 8 geniv : chainiv name : blowfish driver : blowfish-generic module : blowfish priority : 0 refcnt : 2 selftest : passed type : cipher blocksize : 8 min keysize : 4 max keysize : 56 (略)
…というように、CTR とか blowfish のモジュールがロードされたのが分かる。
なお、 dm-crypt に関しては、なるべくデフォルトの暗号化アルゴリズムとモードを使ったほうがよいようだ。というのは、2011-06-28頃のメーリングリストでそのように主張されていたから(AES + CBCモード + ESSIV を使いましょう、とのこと)。
2011年9月1日木曜日
openssl の s_client -sess_out と sess_id
-sess_out と sess_id が便利だったのでメモ。
openssl s_client コマンド
opensslのs_clientは、サーバーとのSSL通信を確認するためのコマンド。いろいろな場面で応用できる。
-sess_out オプション
-sess_out を使うと、openssl s_client の結果(SSLセッション情報)をファイルに記録することができる。
$ openssl s_client -connect smtp.gmail.com:587 -starttls smtp -sess_out sess_out.txt
上の例では、sess_out.txtに記録される(鍵の情報が含まれているので、扱いには要注意)。
$ cat sess_out.txt -----BEGIN SSL SESSION PARAMETERS----- MIIEdQIBAQICAwEEAgAFBCCiljn8yfXmDAlDzxlv53HgKo02ds87ncxERAAfYxf2 (略) -----END SSL SESSION PARAMETERS-----
ただし、cat で表示してみると分かるように、PEMエンコードされているためそのままでは読めない。
openssl sess_id コマンド
SSLセッション情報を解読するためのコマンドとして、openssl sess_id が提供されている。
$ openssl sess_id -text -noout -in sess_out.txt
SSL-Session:
Protocol : TLSv1
Cipher : 0005
Session-ID: A29639FCC9F5E60C0943CF196FE771E02A8D3676CF3B9DCC4444001F6317F68E
Session-ID-ctx:
Master-Key: 0FF83FC108F7A09BD6E9D76CD707804B6DFCCA3520EA13574B42EE40E21718D651432D79645AB91DAF2937D9373D1F97
Key-Arg : None
Krb5 Principal: None
(略)
Start Time: 1314886612
Timeout : 300 (sec)
Verify return code: 0 (ok)
上の例のように、Protocol, Cipher, Session-ID, Master-Keyなど、SSLセッションを特徴づけるデータが分かる。
このコマンドのオプションは man sess_id で確認ができる。




