« 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 のパースはきちんとやってくれている模様.


投稿者 msano : 12:58 AM | コメント (1) | トラックバック