Archive for 1月, 2006

[Perl] Net-DNSモジュールによる逆引き

火曜日, 1月 31st, 2006

Net::DNS::Resolver の入手

以下のURLからダウンロードできる。
http://search.cpan.org/dist/Net-DNS/lib/Net/DNS.pm

サンプルコード

Net-DNS-Resolverモジュールを使う。

 sub getptr_rec {
     my $ip = shift;
     my $resolv = new Net::DNS::Resolver;
 
     my $query = $resolv->search($ip, 'PTR');
     if ($query) {
         foreach ($query->answer) {
                 next if ($_->type ne 'PTR');
                 return $_->rdatastr;
         }
     }
 }

参考文献

初めてのPerl 第5版 続・初めてのPerl 改訂版 DNS & BIND 第5版

[Perl] 定数の定義 use constant

火曜日, 1月 31st, 2006

定数の定義 サンプルコード

Perlで定数を定義するには、contantモジュールを使う。

 use constant CONST_INT => 1234;
 use constant CONST_ARR => ['a', 'b', 'c'];
 use constant CONST_HSH => {'key' => 'val'};
 
 print CONST_INT, "\n";
 print CONST_ARR->[0], "\n";
 print CONST_HSH->{'key'}, "\n";

定数で、配列やハッシュを扱う場合はリファレンスを利用する。
以下のような書き方はダメ。

use constant CONST_ARR => ('a', 'b', 'c');
use constant CONST_HSH => ('key' => 'a');

構築環境:Perl5.6.1

参考文献

CakePHP 1.3によるWebアプリケーション開発―オープンソース徹底活用 続・初めてのPerl 改訂版 たのしいRuby 第2版 Rubyではじめる気軽なプログラミング

シェルスクリプト入門 testコマンドリファレンス

木曜日, 1月 26th, 2006

テストコマンド 一覧

シェルスクリプトでファイルが存在してるか等を確かめるのにつかえる。

-b ファイル ファイルがブロック特殊ファイルのとき真。
-c ファイル ファイルがキャラクタ特殊ファイルのとき真。
-d ファイル ファイルがディレクトリのとき真。
-e ファイル 指定したファイルが存在するとき真。
-f ファイル ファイルがノーマルファイルのとき真。
-g ファイル ファイルのセットGIDビットが立っているとき真。
-h ファイル ファイルがシンボリックリンクのとき真。
-k ファイル ファイルのstickyビットが立っているとき真。
-L ファイル ファイルがシンボリックリンクのとき真。
-p ファイル ファイルが名前付きパイプ(FIFO)のとき真。
-r ファイル ファイルが読み出し可能のとき真。
-s ファイル ファイルの長さが1バイト以上あるとき真。
-t [u] ファイルのディスクリプタn(指定しなければ1) が端末につながっているとき真。
-u ファイル ファイルのセットUIDビットが立っているとき真。
-w ファイル ファイルが書き込み可能のとき真。
-x ファイル ファイルが実行可能のとき真。
-a 2つの条件評価式の論理積(and)をとる
-o 2つの条件評価式の論理和(or)をとる

サンプル

 #!/bin/sh
 
 if [ -d ${HOME}/temp ] ; then
  mkdir ${HOME}/temp
 fi 

例. tmpに書き込めるか確かめる(wrが立ってるか見る)

 #!/bin/sh
 
 if [ -w /tmp/ -a -x /tmp/ ]; then
   echo writable
 else
   echo not writable
 fi

参考文献

詳解 シェルスクリプト 入門bash 第3版 bashクックブック

[vim] 複数のバッファを使いこなす

水曜日, 1月 25th, 2006

バッファを複数使うには

“バッファ名 [コマンド]

とする。

数字バッファ

数字バッファには、削除されたテキストが順番に入る。
数字バッファは 1..9 がある。

コマンド例.

“1P //直前に削除したテキストがペーストされる
“2P //その1つ前に削除したテキストがペーストされる

英字バッファ

英字バッファはクリップボードが複数あるような感じで使える。
バッファ名には[A-Za-z]と$, #などが使える。

コマンド例.

“ayy //バッファ「a」に”abc”がコピーされるとする
“byy //バッファ「b」に”def”がコピーされるとする
“aP //”abc”ペースト
“bP //”def”ペースト
“aP //”abc”ペースト

これで、ちょっとは、viが便利に感じられるようになった。

[vim] 日付の挿入

水曜日, 1月 25th, 2006

vimでは、

:r !cmd

でコマンドの実行結果を挿入できることを利用する。

:r !date

で日付を挿入することができる。

Expect の使い方

日曜日, 1月 22nd, 2006

expectとは

LinuxやFreeBSDで利用できる、sshやSQL等、対話的な通信を自動化するツールです。

expectでsshするサンプル

sshで接続して、lsを実行。

 #!/usr/bin/expect
 
 set timeout 5
 spawn ssh somehost.example.com
 expect "password:"
 send "YOUR PASSWD\r"
 expect "Last login"
 send "ls\r"
 interact

expectでメールを送信するサンプル

sendmailをexpectで叩いてメール送信。テスト送信を何回もやるとき便利。

 #!/usr/bin/expect
 
 set timeout 5
 spawn telnet somehost.example.com 25
 expect "somehost.example.com"
 send "helo somehost.example.com\n"
 expect "pleased to meet you"
 send "mail from:someone@someplace.example.com\n"
 expect "Sender ok"
 send "rcpt to:yourfriend@somehost.example.com\n"
 expect "Recipient ok"
 send "data\n"
 expect "itself"
 send "This is Message for TEST\n"
 send ".\n"
 expect "accepted for delivery"
 send "quit\n"

expect のコマンド一覧

コマンド 説明
set timeout N タイムアウトを設定する(単位は秒)
設定したN秒以上、標準入力から応答がないと、expectは通信を終了する。
-1で、タイムアウトをナシにできる。
spawn command spawnは新しいジョブを作成し、expectプログラムの
入出力をそのジョブに接続する。
ジョブへの送信はsend、受信はexpectとなる。
expect 文字列 expectコマンドは標準入力データが正規表現での文字列に
マッチするまで次のプログラム行の実行を停止し、データを標準出力に出力します。
send 文字列 文字列をジョブへ出力します
interact interactはspawnで作成されたジョブの標準入出力を、キーボードと画面にする。
すなわち通常の通信になる。

参考文献

LinuxサーバHacks―プロが使うテクニック&ツール100選 Linuxコマンドトレーニングブック

[C 言語]ダイナミックリンクライブラリ(共有ライブラリ)の作成

土曜日, 1月 21st, 2006

WindowsでいうDLL、Linuxでは(Dynamic)SharedObject(SO)とも呼ばれる。

ldd コマンド

lddコマンドは実行ファイルがどのダイナミックリンクライブラリを参照(リンク)しているか調べるコマンド。
以下の例ではtestというファイルはlib.so.4をリンクしていることがわかります。

$ ldd test
    libc.so.4 => /usr/lib/libc.so.4 (0x28067000)

ライブラリの作成

まず、SharedObjectとするプログラムを書く。sayhello.cとして保存します。

 #include <stdio.h>
 
 void sayhello(void)
 {
         printf("Hello\n");
 }

gccを利用してSharedObjectとしてコンパイルします。

$ gcc -fPIC -shared sayhello.c -o libsayhello.so #libなんたら.soという名前で作成

# fileコマンドでSOであることを確認

$ file libsayhello.so
libsayhello.so: ELF 32-bit LSB shared object, Intel 80386, version 1 (FreeBSD), not stripped

ライブラリを呼び出すプログラム

sayhello()を呼び出すプログラムをmain_hello.cとして保存します。

 #include <stdio.h>
 
 int main(void)
 {
         sayhello();
         return 0;
 }

コンパイル

$ gcc main_hello.c libsayhello.so -o hello

#lddで確認
$ ldd hello
hello:
  libsayhello.so => not found (0x0)
  libc.so.4 => /usr/lib/libc.so.4 (0x28067000)

この時点では、libsayhello.soがみつからないと言われる。
ライブラリの場所を環境変数LD_LIBRARY_PATH(ライブラリの検索パス)に加える必要がある。

$ export LD_LIBRARY_PATH=$LD_LIBRARY_PATH:/home/someone/mylib/

# 実行
$ hello
Hello

※ /home/someone/mylibはlibsayhello.soのあるディレクトリを指定

参考文献

GNU Make 第3版 GNU Autoconf/Automake/Libtool ふつうのLinuxプログラミング Linuxの仕組みから学べるgccプログラミングの王道

参考URL

TeraTerm マクロ SSH接続 サンプル

土曜日, 1月 21st, 2006

TeraTerm Macroの作成方法。キーボードからの入力を自動化することができる。

基本的なコマンド

コマンド 記述例 説明
connect connect ‘ホスト名:ポート’ ホストの指定されたポートに接続する
sendln sendln ‘文字列’ 文字列をホストに送る。
wait wait ‘文字列’ 文字列がホストから送られてくるまで待つ。対話型のプログラムの場合、
適時waitを入れないと、ホストとの同期がうまくいかなくなる。
; (セミコロン) ; コメント コメント

マクロのサンプル

SSHでサーバへ接続し、dateコマンドを打つマクロ。

; myhost.example.jp へssh接続する。
connect 'myhost.example.jp /ssh /l /auth=password /user=username /passwd=mypassword'

; コマンドプロンプトを待つ
wait '$ '

; date コマンドを実行
sendln 'date'

; 切断
; disconnect 0 にすると確認せずに切断
disconnect 1

実行方法

TeraTerm/TTSSHから実行

ControllメニューのMacroから実行する。

マクロの実行

マクロの実行

コマンドプロンプトから実行する方法

ttpmacro.exeにマクロを記述したファイルを渡す。

“C:\Program Files\teraterm\ttpmacro.exe” “C:\macro.ttl”

参考URL

OracleでMySQLのAutoIncrement

土曜日, 1月 21st, 2006

OracleでMySQLのauto_incrementを実現するにはシーケンスと呼ばれるものを利用します。

サンプル

以下の例ではtest_tblのidカラムをauto_incrementにしています。

CREATE TABLE test_tbl (id number, testdata varchar2(255));

CREATE SEQUENCE文でシーケンスを作成します。

CREATE SEQUENCE test_seq
START WITH 1
INCREMENT BY 1
NOMAXVALUE;

この状態で以下のようにnextvalを実行すると自動的にインクリメントされた値をテーブルに入れることができます。

INSERT INTO test_tbl (id, testdata) VALUES(test_seq.nextval, “testdata”);

もっとMySQLに近い動きにしたい人は以下のようにトリガーを仕掛けて、INSERT時に自動的に採番されるようにすると良いでしょう。

CREATE TRIGGER test_trigger
BEFORE INSERT ON test_tbl
FOR EACH ROW
BEGIN
SELECT test_seq.nextval INTO :new.id FROM dual;
END;

参考文献

プロとしてのOracle PL/SQL入門 改訂版 現場で使えるSQL―Oracle/SQL Server対応 (DB Magazine SELECTION) 基本SQLセミナー―MySQL 5.0 for Windows対応

[Linux] watch コマンドで定期的にコマンドを実行する

土曜日, 1月 21st, 2006

watch コマンドとは

定期的にコマンドを実行するコマンド。
crontabの実行結果がシェルに出る点がcronとは異なる。

watchコマンドの使い方

$ watch -n 秒数 定期的に実行したいコマンド

例1: apacheのログを監視する。

CGIを作成しながら、エラーログを監視する。

$ watch -n 5 “tail error_log”

※ tail -f で同じようなことができる。

例2: ネットワークを監視する。

192.168.0.2 からの接続を監視する例。

$ watch -n 5 “netstat -an | grep 192.168.0.2”

watchコマンド相当のシェルスクリプト

手元のFreeBSDにはwatchコマンドはインストールされていなかったので、同等のシェルスクリプトを書いた。

 #!/bin/sh
 
 while true
 do
         eval $1
         sleep 5
 done

使い方

$ watch.sh “tail error_log”

参考文献

詳解 シェルスクリプト UNIXの絵本 UNIXシェルスクリプトハンドブック (Technical handbook series (001))