« July 2003 | メイン | September 2003 »
August 30, 2003
test
test
http://www.foo.bar.com/
<a href="http://www.foo.bar.com/">url</a>
abc
投稿者 msano : 09:44 PM | コメント (6) | トラックバック
August 29, 2003
Web 日記
公開しているとはいえ、日記なんだから.
日記とはいえ公開しているんだから.
投稿者 msano : 07:53 PM | コメント (1) | トラックバック
August 25, 2003
XML-RPC with SOAP::Lite 補足
XML-RPC では,POSTメソッド(つまり,標準入力)を使うので,XMLRPC::Transport::HTTP でサーバを立てるより先に,<STDIN>にちょっかいをだしてはいけないようだ.
いちばんはまるのは,CGI.pm.
投稿者 msano : 08:30 PM | コメント (3) | トラックバック
August 24, 2003
FOAF on perl
XML::FOAF
とかいうものがあるらしい.
投稿者 msano : 11:16 PM | コメント (1) | トラックバック
August 19, 2003
XML-RPC with SOAP::Lite
perl による XML-RPC の実装方法について述べる.
コンセプトは,できるだけ外部プログラムを使わないこと.
ということで,SOAP::Lite モジュールを使う(今回は,ver. 0.55).
通信プロトコルは HTTP のみとし,サーバは CGI である.
手順は,
(1) SOAP::Lite のインストール
(2) サーバ側のCGIを作成・設置 (XMLRPC::Transport::HTTP)
(3) クライアント側のプログラムを書く(XMLRPC::Lite)
(もちろん,これは別に perl じゃなくてもよい)
手順の詳細:
-----------------------------------------------------------------
(1) SOAP::Lite">SOAP::Lite のインストール
CPANからとってきてインストール.
perl Makefile.PL && make
ただし,HTTP/CGI のみを考えるならば,最低限必要なものは次のとおり.
・SOAP/Lite.pm
・SOAP/Transport/HTTP.pm
・XML/Parser/Lite.pm
・XMLRPC/Lite.pm
・XMLRPC/Transport/HTTP.pm
-----------------------------------------------------------------
(2) サーバ側のCGIを作成・設置 (XMLRPC::Transport::HTTP)
■ 注意事項
・サブルーチン名には,'_'(アンダースコア)が入ってはいけないらしい.
・スカラ変数しか返せないらしい(よって,hash や配列を返したければ,リファレンスを返せばよい).
■ CGI ファイルのサンプル
#!/usr/bin/perl
#===================================
# XML-RPC サーバ のサンプル
#===================================
use strict;
use lib qw( lib ); # ライブラリへのパス
use XMLRPC::Transport::HTTP; # HTTP 用 XML-RPC サーバ
# 'pkg1' と 'pkg2' と 'pkg3' という 3つのパッケージにdispatch
XMLRPC::Transport::HTTP::CGI
-> dispatch_to('pkg1', 'pkg2', 'pkg3')
-> handle;
#====================================
package pkg1;
sub hashIn { shift if UNIVERSAL::isa($_[0] => __PACKAGE__);
my %hash = @_;
my $result ='';
while( my ($key, $val) = each %hash) {
$result .= $key . '=' . $val . '&';
}
chop($result);
return $result;
}
sub hashRefIn { shift if UNIVERSAL::isa($_[0] => __PACKAGE__);
my $hash_ref = shift;
my $result ='';
while( my ($key, $val) = each %{$hash_ref}) {
$result .= $key . '=' . $val . '&';
}
chop($result);
return $result;
}
sub hashRefOut { shift if UNIVERSAL::isa($_[0] => __PACKAGE__);
my ($a, $b) = @_;
return {first_arg => $a, second_arg => $b};
}
#====================================
package pkg2;
sub inc { shift if UNIVERSAL::isa($_[0] => __PACKAGE__);
return $_[0] + 1;
}
sub sum { shift if UNIVERSAL::isa($_[0] => __PACKAGE__);
my @ar = @_;
return eval join ('+', @ar);
}
sub sumref { shift if UNIVERSAL::isa($_[0] => __PACKAGE__);
my $ar_ref = shift;
my $result = eval join ('+', @{$ar_ref});
return $result;
}
#========================================
package pkg3;
sub echoRef { shift if UNIVERSAL::isa($_[0] => __PACKAGE__);
return [@_];
}
sub echo { shift if UNIVERSAL::isa($_[0] => __PACKAGE__);
return shift;
}
-----------------------------------------------------------------
(3) クライアント側のプログラムを書く(XMLRPC::Lite)
(もちろん,これは別に perl じゃなくてもよい)
■ クライアントプログラムのサンプル
#!/usr/bin/perl -w
#========================================
# XML-RPC Client のサンプル
#========================================
use strict;
use lib qw( lib );
use XMLRPC::Lite;
# XML-RPC サーバのURL
my $rpc_uri = 'http://www.semblog.org/msano/xmlrpc_sample/xmlrpc.cgi';
print "server : $rpc_uri\n";
#---------------------------------
# pkg1
# hash(struct)についてのサンプル
#---------------------------------
my %hs = (aaa => 'bbb', ccc => 'ddd');
# pkg1::hashIn(%hash)
{
print "hashIn() : "
. XMLRPC::Lite->proxy($rpc_uri)->call('pkg1.hashIn', %hs)->result
. "\n";
}
# pkg1::hashIn(aaa => 'bbb', ccc => 'ddd')
{
print "hashIn() : " . XMLRPC::Lite->proxy($rpc_uri)
->call('pkg1.hashIn', aaa => 'bbb', ccc => 'ddd')->result . "\n";
}
# pkg1::hashRefIn(\%hs)
{
print "hashRefIn() : " .
XMLRPC::Lite->proxy($rpc_uri)->call('pkg1.hashRefIn', \%hs)->result
. "\n";
}
# pkg1::hashRefOut()
{
my $result = XMLRPC::Lite->proxy($rpc_uri)
-> call('pkg1.hashRefOut', 'fff', 'sss')->result;
print "hashRefOut() : \n";
while( my ($key, $val) = each %{$result}) {
print $key . ' -> ' . $val . "\n";
}
print "\n";
}
#---------------------------------
# pkg2
# 配列についてのサンプル
#---------------------------------
my @ar = (1, 2, 3, 4, 5);
# pkg2::inc($val)
print 'inc() : '
. XMLRPC::Lite->proxy($rpc_uri)->call('pkg2.inc', 5)->result . "\n";
# pkg2::sum(@ar)
print 'sum() : '
. XMLRPC::Lite->proxy($rpc_uri)->call('pkg2.sum', @ar)->result . "\n";
# pkg2::sum(1, 2, 3, 4, 5)
print 'sum() : '
. XMLRPC::Lite->proxy($rpc_uri)
->call('pkg2.sum', 1, 2, 3, 4, 5)->result . "\n";
# pkg2::sumref(\@ar)
{
my $result =
XMLRPC::Lite->proxy($rpc_uri)->call('pkg2.sumref', \@ar)->result;
print 'sumref() : ' . $result . "\n";
}
#---------------------------------
# pkg3
# echo
#---------------------------------
# pkg3::echoRef(@ar)
{
my $result =
XMLRPC::Lite->proxy($rpc_uri)->call('pkg3.echoRef', @ar)->result;
print 'echoRef() : (' . join(',', @{$result}) . ")\n";
}
# pkg3::echo(\%hs)
{
my $result =
XMLRPC::Lite->proxy($rpc_uri)->call('pkg3.echo', \%hs)->result;
print "echo() : \n";
while( my ($key, $val) = each %{$result}) {
print $key . ' -> ' . $val . "\n";
}
print "\n";
}
投稿者 msano : 11:36 PM | コメント (5) | トラックバック
August 17, 2003
perl のバージョン
今まで知らなかったのだが,perl のバージョンの表記には,2種類あるらしい.
その2つは次のとおり.
・5.006001
・5.6.1
この2つは,同じバージョンを示す.
前者は,古い表記法で,5.005 までのバージョンに適用されている.「perl -e 'print "$]\n";'」というコマンドで表示される.
後者は,5.6 からの表記法.「perl -v」で見ることができる(ただし,5.005 までのperl では,前者の表記法になる).
投稿者 msano : 09:15 PM | コメント (1) | トラックバック
RNA の認知度
日本では,RNA の認知度がRNAの認知度に迫っているようだ.
投稿者 msano : 05:12 PM | コメント (4) | トラックバック
August 11, 2003
OPML のインポート
OPML のパースには,XML::SAX::PurePerl を使うことにした.
理由は,ずばり,PurePerl だから.
RSS のパースは自前のコードでやっていたが,今後のためと勉強のために,CPANモジュールをつかうことにした.でも,expat に依存しているやつがだめとなると,結構どれがいいのかよくわからん.とか考えながら探していたら,XML::SAX::PurePerl が見つかった.
名前のとおり,Pure Perl なので,基本条件は満たしている.
作者が,
「XML::SAX::PurePerl is slow. Very slow. I suggest you use something else in fact.」
とか言っているのはちょっと気になるし,RSS 読み込ませたら途中で止まって OS の動きが鈍くなったりしたのだが,OPML のパースはきちんとやってくれている模様.