goo blog サービス終了のお知らせ 

ITシステムのマネージメントノウハウ

IT関連の会社で働く著者が日頃考えていることをメモしていくと、いつの日かマネージメントノウハウになるはずブログ

SOCKET vs FILEアクセス (vs シェアメモ)

2006-10-09 23:04:58 | 技術的な話
ファイルアクセスとsocketってどっちがはやいんだろうね?

まあ、あれです。
PHPでコンフィグファイルから初期設定を読み込んでいるのだけど、
毎ページ表示するごとにファイルにアクセスするのもいかがなものかと。
んで、それを早くするテストってわけ。

仕様としては次の比較になります。

★ファイルアクセス
単純なファイルアクセス。
ファイルをオープンし、freadで読み込んで、クローズする。

★SOCKET I/F
SOCKET Serverはlocalhostに起動し、localhostから呼び出す。
Server側は変数に保存された(つまりオンメモリ上のデータを)返す仕様。

さーて、どっちが早いかな。


結果は
SOCKET     :0.00169 sec
ファイルアクセス:0.000276 sec

ファイルアクセスのほうが6~7倍早いですなあ。

当初の予測では、オンメモリである分SOCKETの方が早いと思っていたのだけど、
  ・ディスクのキャッシュが利いている
  ・SOCKET通信だと、localhostでもNetwork I/Fへのアクセスが発生?
なので、ファイルアクセスの方が早い結果になったと自己分析。


shared memoryが使えればもっとよいのだろうけど、Unix onlyだねー。

(追記)
shared memoryも計ってみたところ
0.00077

それでもファイルアクセスが早い。


UNIXのうろ覚えコマンドを探す

2006-03-16 16:35:12 | 技術的な話
UNIXでうろ覚えのコマンドを探すときには、微妙に困る。
whereis コマンドはワイルドカードが使えないし、locate ではマッチするファイルが多すぎる。

そこで、whereisとwhatisを足したようなスクリプトを作成してみた。

あ。それなりに便利かも知れない。以下ソース。

-------------------------------------------------------------
#!/bin/sh

cmd_name=`basename $0`

# 終了処理
usage(){
echo "Usage: ${cmd_name} [-s] command [command] [command] .."
exit
}

# 説明表示
help(){
echo "[説明]"
echo " ${cmd_name}はワイルドカード指定で、うろ覚えなコマンドを探す命令です。"
echo " さらに大きなお世話として、コマンドの後に、"
echo " whatisを利用してコマンド説明文を表示するようになっています"
echo "[例]"
echo " このホストで利用できるtex族を調べたい"
echo " $ ${cmd_name} '*tex'"
echo
exit
}

# オプション確認 :
while getopts 'sh' opt
do
case "$opt" in
h)
#'-h'が指定されていればUsageを表示して終了
help
;;
s)
#'-s'が指定されていればSILENTモード指定
SILENT=1
shift
;;
*)
#それ以外のオプション指定があれば、無視して次のオプションを探す
shift
;;
esac
done


# 引数確認 - commandが指定されていなければUsageを表示する
[ $# -eq 0 ] && usage;


# メイン
for P in "$@"; do # 全ての引数に対して
IFS=: # Internal Field Separator (内部区切り文字)を指定
for D in $PATH; do # 全てのパスに対して
for F in $D/$P; do # マッチする全てのコマンドに対して
if [ -x "$F" ] # 実行可能であれば
then
printf "%-30st" $F # パス付きコマンド名を表示
if [ ! "$SILENT" ]; then
CN=`basename $F`
whatis $CN | head -1 | sed -e "s%.*) %%" # コマンド説明を表示
else
echo # 改行
fi
fi
done
done
done


# 編集後記
# 最初はもっとシンプルだったのですが、オプションチェックとかをいれると
# ゴテゴテしてきました。
# man は作らないのかって? いや、、そこまでは。。。^^;)
-------------------------------------------------------------

Perlで作るオブジェクト指向プログラム

2006-03-14 18:35:35 | 技術的な話
んー。なんと、今年に入って始めてのメモ。
おいおい。

で、表題の件。

perlでOOPを組むことは少ないと思うのですが、まあ、サンプルを乗っけておきます。

====== Mammal.pm ======
package Mammal;
use strict 'vars';
use Carp;
sub new {
my ($pkg, $name) = @_;
my $this = {
_name => $name,
_age => 0
};
bless $this, $pkg;
return $this;
}
sub Mammal::age {
my $this = shift;
$this->{_age};
}
sub Mammal::name :lvalue{
my $this = shift;
$this->{_name}
}
sub Mammal::set_age {
my ($this, $num) = @_;
$this->{_age} = $num;
}
sub Mammal::get_age {
my $this = shift;
return $this->{_age};
}
sub Mammal::DESTROY {
## 省略
}
my $private_func_debug = sub { my ($this) = @_; print "here"; };

1;

====== Human.pm ======
package Human;
use Mammal;
@ISA = ( 'Mammal' );

sub Human::set_age {
my ($this, @arg) = @_;
if ($#arg le 1) {
return $this->SUPER::set_age(@arg);
} else {
## 省略
}
}

1;
======================


サンプルプログラム
use Human;
$person = new Human ('futaroh');
print $person->name ."\n";
$person->name = 'piyopiyo';
print $person->name . "\n";
$person->set_age(17);
print $person->age;
====================

これを雛型にすれば、perlでOOPも楽に出来ると思います。

Web2.0系のメモ

2005-12-26 17:32:57 | 技術的な話
PING Serverの実装
http://naoya.dyndns.org/~naoya/mt/archives/000444.html#more

JavaScriptによるオブジェクト指向プログラミング
http://www.morijp.com/masarl/homepage3.nifty.com/masarl/article/js-oop.html


perlのone-liner (素数表示)

2005-08-15 16:56:40 | 技術的な話
perl -wle '(1 x $_) !~ /^(11+)\1+$/ && print while ++ $_'

素数を次々と表示する1行プログラム。
凄すぎ!!ぱっと見ても、全然分かんない。

まず、perlのコマンドオプションから読み解いていくと
-w はwaringを表示(本当はいらないかも)
-l は行単位で表示
-e は次の引数をプログラムとして実行する


次にプログラムを解析していくと、(1 x $_)の部分は'1'のcharを指定回数分つなげることになる。最初、$_=0だから、1回目はスルーして、while 文で++$_が実行されて$_=1となる。
whileでの判定は1以上になるので、先頭に戻るのだけど、ここは
{ } while()
という構造で考えると理解できる。暗黙のdo~while文という形になっているということでwhileがtrueの間、ブロックが実行されるのだと思う。

次にメインとなるマッチ演算子について考えよう。
/^(11+)\1+$/
の意味するところは、文字列が
'11'の複数組で構成されている(すなわち2で割り切れる)
'111'の複数組で構成されている(すなわち3で割り切れる)
'1111'の複数組で構成されている(すなわち4で割り切れる)
・・・・・
ということだ。

だから、それらに全てマッチしない場合、つまり、どの数でも割り切れない場合に、表示させれば素数表示となる。



なんだか、手品の謎解きをしてしまったようで、恐縮です。
謎は謎のままにしておいた方が神秘的だったかもしれない。

Knuth先生

2004-11-02 11:01:29 | 技術的な話
Knuth先生の講座が視聴できるようだ。
SCPD - Donald E. Knuth

Knuth先生といえば、TeXを開発されたことで有名。

あと、「コードの中にコメント書くのではなく、コメントの中にコードを書くようにプログラムしなさい」という言葉も残している(らしい)


サーバチェッカ

2004-06-16 12:53:02 | 技術的な話
夜中にサーバが落ちていたらしい。
サービスが始まる前にいろいろ発生するものだ。

とりあえずは簡単にチェッカーを作って動作させることにした。

以下、編集済みのソースを備忘録代わりにアップしておく。


#!/usr/bin/perl

# 本番機が落ちているかどうかを確認するためのチェックスクリプト


# 仕様1:本スクリプトはcronによって10分ごとに呼び出される
# 仕様2:DNSに問い合わせをおこなって、名前解決することを確認する
# 仕様3:スクリプトでは、
# ドメイントップのHTMLをLWPを用いて取得し、取得できればOKとする
# 仕様4:データが取得できなかった場合、エラーステータスファイルを作成する。
# 仕様5:エラーステータスファイルが存在し、再度、データが取得できなかった場合
#     管理者宛てに不具合発生メールを送信する
# 仕様6:メール送信は1時間に1度の割合で送信することとする。
# 仕様7:正常動作、異常検出の両方を1つのログファイルに、チェック日時を含めて出力する


# チェック項目:
# 1.DNSサーバーがきちんと動いている。(名前解決ができる)
# 2.Webサーバーがきちんと動いている。(コンテンツを返す)
#


# プログラム自体について
# 特にmy 変数指定はしてません。短いので、必要ないと思うし。


# エラーステータスファイルの中身はエラーメールを送信した数になっています。

# 必要モジュール、プログラム
# ・LWP
# ・/usr/bin/host DNS での名前解決に使用




# 設定
$log_file_name = "./xx.log";
$error_status_file_name = "./error.flag";
$mail_to = 'hogehoge@foo.bar';


# 初期設定


# 現在時間の取得
($sec,$min,$hour,$day,$mon,$year) = (localtime(time))[0..5];
$now = sprintf("[%4d/%02d/%02d %02d:%02d:%02d]",$year+1900,$mon+1,$day,$hour,$min,$sec);


# checker
$res = check();
if ($res eq "") {
$res="OK";
} else {
accident($res); ## 問題が発生した場合の処理
}

# ログ吐き出し
open (LOG, ">>$log_file_name");
printf LOG ("%s %s\n",$now,$res);
close LOG;



exit;



############## sub routines ##################
sub check() {
# DNSへの確認
$res = `/usr/bin/host hoge.jp`;
return "ERR:Can't resolve name 'hoge.jp'" if ($res =~ /not found/);

# コンテンツの取得
use LWP::Simple;
$host1 = LWP::Simple::get("host1");
$host2 = LWP::Simple::get("host2");

if ($host1.$host2 eq "") {
return "ERR:Can not get all content! Maybe WWW server is down";
}

if ($host1 eq "") {
return "ERR:Can not get host1 top content! Maybe file name has been chenged";
}


## All green
return "";
}



sub accident() {
$message = shift;

# エラーステータスファイルが存在するか確認する
if (! -f $error_status_file_name ) {
# エラーステータスファイルを作成して終了
open (OUT ,">$main::error_status_file_name");
close OUT;
return;
}

# 存在する場合はそのタイムスタンプを取得する
open (STATUS ,"$main::error_status_file_name");
$mtime = (stat(STATUS))[8]; ## 変更時点からのタイムスタンプ


# ステータスファイルの内容を読み込み
$status = <STATUS>;
close STATUS;

# 不具合メールの配信条件は、最初に発生したとき、及び、1時間毎
if ($status eq "") {
send_error_mail($message);
open OUT, ">$main::error_status_file_name";
print OUT 1;
close OUT;
}

if (time-$mtime >3600) { # 1時間ごと
send_error_mail($message);
open OUT, ">$main::error_status_file_name";
print OUT $status+1;
close OUT;
}
}


sub send_error_mail()
{

}