dak ブログ

python、rubyなどのプログラミング、MySQL、サーバーの設定などの備忘録。レゴの写真も。

mysql でテーブルの更新時刻を取得する方法

2011-05-27 21:14:52 | MySQL
mysql でテーブルの更新時刻は、information_schema DB の tables テーブルの UPDATE_TIME で取得することができます。

mysql> select table_schema, table_name, update_time from information_schema.tables where table_schema = 'DB名' and table_name = 'テーブル名'\G
+--------------+------------+---------------------+
| table_schema | table_name | update_time |
+--------------+------------+---------------------+
| DB名 | テーブル名 | 2011-05-27 20:52:59 |
+--------------+------------+---------------------+
1 row in set (0.01 sec)

MySQLでテーブルのチェックサムをとる方法

2011-05-25 21:32:53 | MySQL
checksum table テーブル名 でテーブルのチェックサムをとることができます。

以下のようなテーブル、データを登録します。

create table test1 (
id int,
name varchar(80)
);

insert into test1 set id = 1, name = 'id1';
insert into test1 set id = 2, name = 'id2';
insert into test1 set id = 3, name = 'id3';
insert into test1 set id = 4, name = 'id4';
insert into test1 set id = 5, name = 'id5';

$ mysql
mysql> select * from test1;
+------+------+
| id | name |
+------+------+
| 1 | id1 |
| 2 | id2 |
| 3 | id3 |
| 4 | id4 |
| 5 | id5 |
+------+------+
5 rows in set (0.00 sec)

mysql> checksum table test1;
+-------------------+------------+
| Table | Checksum |
+-------------------+------------+
| test_nikeda.test1 | 1155597644 |
+-------------------+------------+
1 row in set (0.00 sec)


チェックサムの値は、テーブルに登録するデータの順番に影響されないようです。
以下の順にデータを登録します。

insert into test1 set id = 1, name = 'id1';
insert into test1 set id = 3, name = 'id3';
insert into test1 set id = 5, name = 'id5';
insert into test1 set id = 2, name = 'id2';
insert into test1 set id = 4, name = 'id4';

mysql> select * from test1;
+------+------+
| id | name |
+------+------+
| 1 | id1 |
| 3 | id3 |
| 5 | id5 |
| 2 | id2 |
| 4 | id4 |
+------+------+
5 rows in set (0.00 sec)

mysql> checksum table test1;
+-------------------+------------+
| Table | Checksum |
+-------------------+------------+
| test_nikeda.test1 | 1155597644 |
+-------------------+------------+
1 row in set (0.00 sec)

データの登録順には関係なく、チェックサムの値は一致しています。


grepコマンドの戻り値

2011-05-16 00:10:40 | linux
grepコマンドの戻り値は、マッチした行があれば0、マッチした行がなければ1になります。

$ cat test.txt
abc
abcd
abcde
abcdef

■マッチする場合
$ grep cde test.txt
abcde
abcdef

$ echo $?
0

■マッチしない場合
$ grep CDE test.txt
$ echo $?
1

標準出力の行数を wc でカウントするのもよいかもしれません。



rubyでsocketでサーバに接続してからforkした場合の挙動

2011-05-13 01:26:37 | ruby
rubyでsocketでサーバに接続した後に、(1)forkし、(2)一方のプロセスでsocketをクローズ、(3)他方のプロセスでsocketに対して読み書きを行おうとするとエラーとなります。

同じ理由でOpen3.popen3で存在しないプログラムを実行しようとしてエラーが発生した場合、それまでに接続していたコネクションは切断されてしまいます。


【プログラム】
#!/usr/local/bin/ruby

require 'socket'

def receive(sock)
while true
str = sock.recv(4096)
break if str == ''
print("[#{Process.pid}] #{str}\n")
end
end

sock = TCPSocket.new('localhost', 80)
pid = fork
if pid
# 親プロセス
begin
# 送信
print("[parent] #{Process.pid}\n")
sock.write("GET /nikeda/test/test.cgi HTTP/1.0\n\n")
print("[parent] send\n")

sleep(3)

# 受信
recieve(sock)
rescue
print("[parent] exception\n")
end
else
# 子プロセス
print("[child] end\n")
exit(0)
end

【実行結果】
$ ./test1.rb
[child] end
[parent] 19582
[parent] send
[parent] exception