<?xml version="1.0" encoding="UTF-8"?>
<feed xmlns="http://www.w3.org/2005/Atom">
    <title>blog.s14u.info</title>
    <link rel="alternate" type="text/html" href="http://www.s14u.info/mt/" />
    <link rel="self" type="application/atom+xml" href="http://www.s14u.info/mt/atom.xml" />
    <id>tag:www.s14u.info,2007-08-09:/mt//1</id>
    <updated>2008-08-12T03:56:26Z</updated>
    <subtitle>Takatsugu Shigetaのブログ。ソフト開発のこととか音楽のこととかそういう類。</subtitle>
    <generator uri="http://www.sixapart.com/movabletype/">Movable Type Publishing Platform 4.0</generator>

<entry>
    <title>whois</title>
    <link rel="alternate" type="text/html" href="http://www.s14u.info/mt/archives/2008/08/whois.html" />
    <id>tag:www.s14u.info,2008:/mt//1.409</id>

    <published>2008-08-12T03:49:17Z</published>
    <updated>2008-08-12T03:56:26Z</updated>

    <summary>あれ？whois ないな。 whois があるサーバへ移動。  $ rpm -q...</summary>
    <author>
        <name>shigeta</name>
        <uri>http://blog.s14u.info/</uri>
    </author>
    
    
    <content type="html" xml:lang="en" xml:base="http://www.s14u.info/mt/">
        <![CDATA[あれ？whois ないな。

whois があるサーバへ移動。

<pre>
 $ rpm -qf /usr/bin/whois
jwhois-x.x.x
</pre>

あ、jwhois だったか。

whois のないサーバに戻る。

<pre>
 # yum install jwhois
</pre>

よし。これで www.s14u.info の whois をみるとするか。（なんで自分のサイト見えないの？）
]]>
        
    </content>
</entry>

<entry>
    <title>lookupd -flushcache</title>
    <link rel="alternate" type="text/html" href="http://www.s14u.info/mt/archives/2008/07/lookupd_flushca.html" />
    <id>tag:www.s14u.info,2008:/mt//1.408</id>

    <published>2008-07-28T10:55:30Z</published>
    <updated>2008-07-28T11:00:47Z</updated>

    <summary>「あー、これ hosts にかかないとダメっすね」 「ブラウザ再読み込みして」 ...</summary>
    <author>
        <name>shigeta</name>
        <uri>http://blog.s14u.info/</uri>
    </author>
    
    
    <content type="html" xml:lang="en" xml:base="http://www.s14u.info/mt/">
        「あー、これ hosts にかかないとダメっすね」
「ブラウザ再読み込みして」
「あれー、hosts に書いたんだけどな」
「ping うったら何か hosts と違う IP を叩いてるなぁ」
「いつ反映されるんだっけ？」


そんなあなたに・・・

lookupd -flushcache

Mac で同僚の人と動作確認している最中に、同僚の人に教えてもらいました。
さすがは同僚の人です。

忘れないように備忘録。。。


        
    </content>
</entry>

<entry>
    <title>Zooomr API</title>
    <link rel="alternate" type="text/html" href="http://www.s14u.info/mt/archives/2008/07/zooomr_api.html" />
    <id>tag:www.s14u.info,2008:/mt//1.407</id>

    <published>2008-07-08T13:44:49Z</published>
    <updated>2008-07-08T14:01:29Z</updated>

    <summary>写真共有サイトの Zooomr が API を公開しましたよ。 Flickr A...</summary>
    <author>
        <name>shigeta</name>
        <uri>http://blog.s14u.info/</uri>
    </author>
    
    <category term="api" label="API" scheme="http://www.sixapart.com/ns/types#tag" />
    <category term="zooomr" label="zooomr" scheme="http://www.sixapart.com/ns/types#tag" />
    
    <content type="html" xml:lang="en" xml:base="http://www.s14u.info/mt/">
        <![CDATA[写真共有サイトの <a href="http://www.zooomr.com/">Zooomr </a>が <a href="http://jp.zooomr.com/services/">API を公開</a>しましたよ。
<a href="http://trac.zooomr.com/trac/wiki/ZooomrAPI/Flickr">Flickr API との後方互換性もあり</a>、なかなかすてきです。Congratulations!

<blockquote><pre>
Flickr:
http://farm1.static.flickr.com/253/461524967_f3551dfeb0.jpg
Zooomr:
http://static.zooomr.com/images/5217432_7838e9f814.jpg 
</pre></blockquote>


<ul>
	<li><a href="http://www.zooomr.com/kristopher/statuses/eb5b782302">Woohoo! We just released the Zooomr _Public_ API! </a></li>
	<li><a href="http://www.zooomr.com/services/">Zooomr Services | Build Your Dreams</a></li>
	<li><a href="http://trac.zooomr.com/trac/wiki/ZooomrAPI">Zooomr API Documentation</a></li>
</ul>
]]>
        
    </content>
</entry>

<entry>
    <title>それは恋ですね。</title>
    <link rel="alternate" type="text/html" href="http://www.s14u.info/mt/archives/2008/07/post_103.html" />
    <id>tag:www.s14u.info,2008:/mt//1.405</id>

    <published>2008-07-01T17:00:10Z</published>
    <updated>2008-07-01T17:16:02Z</updated>

    <summary>仕事をしていると自分自身が想定していることを越える何かが発生したりするとフラスト...</summary>
    <author>
        <name>shigeta</name>
        <uri>http://blog.s14u.info/</uri>
    </author>
    
    <category term="lifehacks" label="lifehacks" scheme="http://www.sixapart.com/ns/types#tag" />
    
    <content type="html" xml:lang="en" xml:base="http://www.s14u.info/mt/">
        <![CDATA[<span class="mt-enclosure mt-enclosure-image"><img alt="twitter_01.jpg" src="http://www.s14u.info/mt/images/twitter_01.jpg" width="638" height="237" class="mt-image-left" style="float: left; margin: 0 20px 20px 0;"/></span>仕事をしていると自分自身が想定していることを越える何かが発生したりするとフラストレーションがたまるもの。そんなフラストレーションを軽減するメソッドとして最近社内で流行しているのが、「それは恋ですね」という台詞。端を発したのは同僚の「例えばそれは恋愛みたいなものですよ」という名言から。
確かに相手を思えば思う程、自分の欲求は募り、大きな期待をしてしまうもの。なんか似ているところがありますよね。おそらくフラストレーションの原因とあなたは恋をしているのです。仕事でたまったフラストレーションを恋に例えてみると案外笑って一蹴できてしまい、ストレスフリーな状態になれたりします。
今仕事でストレスを抱えている方、恋に例えてみてはいかがでしょうか？]]>
        
    </content>
</entry>

<entry>
    <title>javascript を小さく変換</title>
    <link rel="alternate" type="text/html" href="http://www.s14u.info/mt/archives/2008/06/javascript.html" />
    <id>tag:www.s14u.info,2008:/mt//1.404</id>

    <published>2008-06-09T16:50:49Z</published>
    <updated>2008-06-09T17:02:38Z</updated>

    <summary>JSMIN, The JavaScript Minifier で紹介されていた ...</summary>
    <author>
        <name>shigeta</name>
        <uri>http://blog.s14u.info/</uri>
    </author>
    
    <category term="cpan" label="CPAN" scheme="http://www.sixapart.com/ns/types#tag" />
    <category term="javascript" label="javascript" scheme="http://www.sixapart.com/ns/types#tag" />
    <category term="performance" label="performance" scheme="http://www.sixapart.com/ns/types#tag" />
    <category term="perl" label="perl" scheme="http://www.sixapart.com/ns/types#tag" />
    
    <content type="html" xml:lang="en" xml:base="http://www.s14u.info/mt/">
        <![CDATA[<a href="http://www.crockford.com/javascript/jsmin.html">JSMIN, The JavaScript Minifier</a> で紹介されていた Perl モジュール <a href="http://search.cpan.org/dist/JavaScript-Minifier/">JavaScript::Minifier</a>。
<blockquote>Perl extension for minifying JavaScript code</blockquote>  ということで、javascriptファイル中の不要なスペースや改行などを取り除いてくれます。

ある時点での jQuery の core.js に JavaScript::Minifier をあててみました。
45%くらい小さくなりました。
<pre>
# ls -al core*
-rw-r--r--   1 root  wheel  21346 Jun 10 01:21 core-min.js
-rw-r--r--   1 root  wheel  38087 Jun 10 01:18 core.js
</pre>

小さいことではありますが、でもファイルサイズはウェブページ閲覧のパフォーマンスに影響する部分ですので、こういうツールはありがたいですね。]]>
        
    </content>
</entry>

<entry>
    <title>ありがとう！ YAPC::Asia 2008</title>
    <link rel="alternate" type="text/html" href="http://www.s14u.info/mt/archives/2008/05/_yapcasia_2008.html" />
    <id>tag:www.s14u.info,2008:/mt//1.403</id>

    <published>2008-05-17T04:37:44Z</published>
    <updated>2008-05-17T05:13:35Z</updated>

    <summary>YAPC::Asia 2008 に行ってきました で概要は書いたので、こちらでは...</summary>
    <author>
        <name>shigeta</name>
        <uri>http://blog.s14u.info/</uri>
    </author>
    
    <category term="yapc" label="YAPC" scheme="http://www.sixapart.com/ns/types#tag" />
    <category term="yapcasia2008" label="yapcasia2008" scheme="http://www.sixapart.com/ns/types#tag" />
    
    <content type="html" xml:lang="en" xml:base="http://www.s14u.info/mt/">
        <![CDATA[<a href="http://www.sixapart.jp/techtalk/2008/05/yapcasia_2008_1.html">YAPC::Asia 2008 に行ってきました</a> で概要は書いたので、こちらではその他のことを書きます。

多くのご来場いただいた皆様、本当にありがとうございました。最後の竹迫さんのプレゼンを見ながら、そして宮川さんが「スタッフは立ってください」といったあとに皆さんから温かい大きな拍手をいただいたとき、涙がこぼれそうになったのは言うまでもありません。最高の体験ができました。

この体験をくれた YAPC::Asia 2008 に感謝、3日間の参加を許可してくれた会社に感謝、私が不在の間に仕事をこなしてくれた会社のみんなに感謝、心の底から本当に感謝しております。ありがとうございました。

また来年もスタッフとして参加できたらいいなと思いつつ、でも京都だったとしたら、会社はどこまで許可してくれるんだろうか、と気にしながら、また来年の YAPC::Asia につなげたいと思います。

今回の YAPC::Asia 2008 では WADL でごにょごにょできる XML::WADL というモジュールを披露しようと思っていたのですが、開発がまったく間に合っていなかったことと WebService::Simple などウェブサービス系が重なっていたようで、今回はプレゼンできませんでした。このモジュールはとりあえず完成させようと思うので、いずれ CPAN にあげるつもりです。hackathon では XML::WADL の実装を進めたいと思います。

そして今は弾さんのお宅にお邪魔して hackathon に参加しております。プレゼンをすることはできなかったのですが speakers のリストに入れていただいたので今回 hackathon に参加することができました。Larry Wall、Ingy、Jesse、clkao、gugod、jrockway、nothingmuch、lbrocardとかがいます。雰囲気的にはお客さん抜きの YAPC::Asia 2008 の DeNA room に近いです。基本的に英語です。この場を提供していただいた、弾さんとご家族のみなさま、本当にありがとうございます！

まだまだ書き足りないことがたくさんあるような気がしますが、感謝の気持ちでいっぱいであることをお伝えしました。

追伸：
懇親会で名刺をいただいた皆様に名刺をお返ししたいところなのですがタイミングがありません＞＜
またどこかでどこかのイベントなどでお会いすることがあるかと思いますのでそのときにお返しさせてください。お声がけいただきましてありがとうございました。お話できてうれしかったです。

]]>
        
    </content>
</entry>

<entry>
    <title>XML::LibXML で属性を取り出すときのベンチマーク</title>
    <link rel="alternate" type="text/html" href="http://www.s14u.info/mt/archives/2008/04/xmllibxml.html" />
    <id>tag:www.s14u.info,2008:/mt//1.402</id>

    <published>2008-04-13T06:59:40Z</published>
    <updated>2008-04-13T07:24:03Z</updated>

    <summary>XML::LibXML を使って、XML の属性を取り出すときに findval...</summary>
    <author>
        <name>shigeta</name>
        <uri>http://blog.s14u.info/</uri>
    </author>
    
    <category term="benchmark" label="benchmark" scheme="http://www.sixapart.com/ns/types#tag" />
    <category term="perl" label="perl" scheme="http://www.sixapart.com/ns/types#tag" />
    <category term="xmllibxml" label="XML::LibXML" scheme="http://www.sixapart.com/ns/types#tag" />
    
    <content type="html" xml:lang="en" xml:base="http://www.s14u.info/mt/">
        <![CDATA[XML::LibXML を使って、XML の属性を取り出すときに findvalue メソッドで XPath を使うのと XML::LibXML::Element のメソッド getAttribute を使うのとどちらが早いのかベンチマークしてみました。

<pre>
Benchmark: timing 10000 iterations of accessor, xpath...
  accessor:  0 wallclock secs ( 0.05 usr +  0.00 sys =  0.05 CPU) @ 200000.00/s (n=10000)
            (warning: too few iterations for a reliable count)
     xpath:  1 wallclock secs ( 0.55 usr +  0.00 sys =  0.55 CPU) @ 18181.82/s (n=10000)
</pre>

XPath の方が遅いのか。。。XPathエンジンとか重たいのかな？

以下がコードです。

<pre>
#!/usr/local/bin/perl
use strict;
use warnings;
use XML::LibXML;
use Perl6::Say;
use Benchmark;

my $xp = XML::LibXML->new;
my $doc = $xp->parse_string(<<"XML");
&lt;?xml version="1.0"?&gt;
&lt;doc attr="please"&gt;
please ignore.this is a test.
&lt;/doc&gt;
XML

my $xml = $doc->documentElement;

timethese (10000, {
    'accessor' => sub { $xml->getAttribute('attr') },
    'xpath'    => sub { $xml->findvalue('@attr') },
});
</pre>

追記
さらに、Devel::Profile を用いて、上記の timethese の中の accessor と xpath のそれぞれ片方だけを実行した結果の上位10位です。（上記のコードを baz.pl として保存して、perl -d:Profile baz.pl と実行）

'accessor'のみ実行（#'xpath'の行をコメントアウト）
<pre>
time elapsed (wall):   0.7500
time running program:  0.5730  (76.40%)
time profiling (est.): 0.1770  (23.60%)
number of calls:       41183

%Time    Sec.     #calls   sec/call  F  name
34.91    0.2000    20000   0.000010     <anon>:.../Perl/5.8.6/Benchmark.pm:651
18.27    0.1047    10000   0.000010     XML::LibXML::Element::getAttribute
10.43    0.0598        1   0.059758     <anon>:.../Perl/5.8.6/Benchmark.pm:675
10.41    0.0597    10000   0.000006     XML::LibXML::Element::_getAttribute
10.30    0.0590        1   0.059044     <anon>:.../Perl/5.8.6/Benchmark.pm:682
 3.16    0.0181        1   0.018114     <anon>:baz.pl:6
 1.23    0.0071      383   0.000018     Benchmark::new
 1.17    0.0067        0   0.006728  *  <other>
 1.15    0.0066        1   0.006588     <anon>:baz.pl:9
 1.10    0.0063        1   0.006291     <anon>:baz.pl:8
</pre>

'xpath'のみ実行（#'accessor'の行をコメントアウト）
<pre>
time elapsed (wall):   2.2250
time running program:  1.7546  (78.86%)
time profiling (est.): 0.4705  (21.14%)
number of calls:       111103

%Time    Sec.     #calls   sec/call  F  name
21.90    0.3842    10000   0.000038     XML::LibXML::Node::_find
17.64    0.3096    10000   0.000031     XML::LibXML::Node::findvalue
11.83    0.2076    10000   0.000021     XML::LibXML::NodeList::to_literal
11.63    0.2041    20000   0.000010     <anon>:.../Perl/5.8.6/Benchmark.pm:651
11.26    0.1976    10000   0.000020     XML::LibXML::Node::find
 3.90    0.0684    10000   0.000007     XML::LibXML::Node::string_value
 3.56    0.0625        1   0.062548     <anon>:.../Perl/5.8.6/Benchmark.pm:682
 3.44    0.0604        1   0.060442     <anon>:.../Perl/5.8.6/Benchmark.pm:675
 3.36    0.0590    10000   0.000006     XML::LibXML::Literal::new
 3.23    0.0566    10000   0.000006     XML::LibXML::NodeList::new
</pre>
]]>
        
    </content>
</entry>

<entry>
    <title>TypePad エンジニアも募集しています。</title>
    <link rel="alternate" type="text/html" href="http://www.s14u.info/mt/archives/2008/04/typepad.html" />
    <id>tag:www.s14u.info,2008:/mt//1.401</id>

    <published>2008-04-01T01:54:20Z</published>
    <updated>2008-04-01T02:01:05Z</updated>

    <summary>シックス・アパートの求人のページで、住職の募集とありますが、住職じゃないけどシッ...</summary>
    <author>
        <name>shigeta</name>
        <uri>http://blog.s14u.info/</uri>
    </author>
    
    <category term="sixapart" label="sixapart" scheme="http://www.sixapart.com/ns/types#tag" />
    
    <content type="html" xml:lang="en" xml:base="http://www.s14u.info/mt/">
        <![CDATA[シックス・アパートの求人のページで、<a href="http://www.sixapart.jp/jobs/2008/04/01-0000.html">住職の募集</a>とありますが、住職じゃないけどシックス・アパートのプロダクトに興味のある開発者も<a href="http://www.sixapart.jp/jobs/2006/06/21-1231.html">募集</a>しております。お経もいいけど TypePad もね。

シックス・アパート的にはコードが書ける住職がベストですね。

住職の方の主な業務内容は以下の通りだそうです。さすが外資系は違いますね。

<blockquote>
主な業務内容

    * 毎日の坐禅において社員にカツを入れる
    * 週1回の全社ミーティングで法話を語る
    * 年に2回のお盆イベントを主催する
    * 定期的に読経を行う
    * shakyou-a-thonを主催する
</blockquote>
]]>
        
    </content>
</entry>

<entry>
    <title>Hash::Merge</title>
    <link rel="alternate" type="text/html" href="http://www.s14u.info/mt/archives/2008/03/hashmerge.html" />
    <id>tag:www.s14u.info,2008:/mt//1.400</id>

    <published>2008-03-26T16:51:04Z</published>
    <updated>2008-03-26T17:10:31Z</updated>

    <summary>Perl でハッシュをマージしたいなと思った。というか Catalyst で c...</summary>
    <author>
        <name>shigeta</name>
        <uri>http://blog.s14u.info/</uri>
    </author>
    
    <category term="perl" label="Perl" scheme="http://www.sixapart.com/ns/types#tag" />
    
    <content type="html" xml:lang="en" xml:base="http://www.s14u.info/mt/">
        <![CDATA[Perl でハッシュをマージしたいなと思った。というか Catalyst で config メソッドはどうなっているのか見てみたら、Catalyst::Component の config メソッドで Catalyst::Utils::merge_hashes を呼び出している。merge_hashes($a, $b) としたときに、$a に $b をマージするためにいろいろとごにょごにょしているわけです。そのごにょごにょ（つまり Catalyst::Utils::merge_hashes）を単体で使いたいと思ったけど Catalyst 名前空間のモジュールは依存関係に含めるとちょっと厄介なイメージがあったので、単体で使えるモジュールが CPAN にないか探してみたらありました。

<a href="http://search.cpan.org/dist/Hash-Merge/">Hash::Merge</a>

名前からしてズバリな感じです。

使い方は perldoc にあるように次の通り。

<pre>
use Hash::Merge qw( merge );
my %a = (
        'foo'    => 1,
        'bar'    => [ qw( a b e ) ],
        'querty' => { 'bob' => 'alice' },
);
my %b = (
        'foo'    => 2,
        'bar'    => [ qw(c d) ],
        'querty' => { 'ted' => 'margeret' },
);

my %c = %{ merge( \%a, \%b ) };
</pre>

とすると、デフォルトでは %a から %b に上書きする感じになって結果は次のようになります。

<pre>
$VAR1 = 'bar';
$VAR2 = [
          'a',
          'b',
          'e',
          'c',
          'd'
        ];
$VAR3 = 'querty';
$VAR4 = {
          'bob' => 'alice',
          'ted' => 'margeret'
        };
$VAR5 = 'foo';
$VAR6 = 1;
</pre>

ARRAYは結合してくれているし、SCALARは上書きしてくれているし、HASHはマージしてくれている。

で merge メソッドの第二引数を第一引数にかぶせたい場合もあるでしょう。そんなときには Hash::Merge::set_behavior メソッドを使います。
先ほどの上記のコードは以下のようになります。

<pre>
use Hash::Merge qw( merge );
my %a = (
        'foo'    => 1,
        'bar'    => [ qw( a b e ) ],
        'querty' => { 'bob' => 'alice' },
);
my %b = (
        'foo'    => 2,
        'bar'    => [ qw(c d) ],
        'querty' => { 'ted' => 'margeret' },
);

<span style="color:red; font-weight:bold;">Hash::Merge::set_behavior( 'RIGHT_PRECEDENT' );</span>
my %c = %{ merge( \%a, \%b ) };
</pre>

とすると結果は次の通りです。

<pre>
$VAR1 = 'bar';
$VAR2 = [
          'a',
          'b',
          'e',
          'c',
          'd'
        ];
$VAR3 = 'querty';
$VAR4 = {
          'bob' => 'alice',
          'ted' => 'margeret'
        };
$VAR5 = 'foo';
$VAR6 = 2;
</pre>

SCALAR である foo が %b の方を採用して 2 になっているのがわかりますね。

merge メソッドの引数の書き方を見れば分かるようにハッシュのリファレンスを渡していますし、merge メソッドの戻り値もハッシュのリファレンスなので次のように書く事もできます。

<pre>
my $a = {
        'foo'    => 1,
};
my $b = {
        'foo'    => 2,
};
my $c = merge( $a, $b );
</pre>

そうすれば結果は以下のようにになりますね。

<pre>
$VAR1 = {
          'bar' => [
                     'a',
                     'b',
                     'e',
                     'c',
                     'd'
                   ],
          'querty' => {
                        'bob' => 'alice',
                        'ted' => 'margeret'
                      },
          'foo' => 2
        };
</pre>

これはいい。Hash::Mergeを採用してみることに決めました。
]]>
        
    </content>
</entry>

<entry>
    <title>テストです。</title>
    <link rel="alternate" type="text/html" href="http://www.s14u.info/mt/archives/2008/03/post_102.html" />
    <id>tag:www.s14u.info,2008:/mt//1.399</id>

    <published>2008-03-21T17:57:08Z</published>
    <updated>2008-03-28T02:40:04Z</updated>

    <summary>This is a test. please ignore this entry...</summary>
    <author>
        <name>shigeta</name>
        <uri>http://blog.s14u.info/</uri>
    </author>
    
    
    <content type="html" xml:lang="en" xml:base="http://www.s14u.info/mt/">
        This is a test. please ignore this entry. thanks.
        
    </content>
</entry>

<entry>
    <title>xs:choice</title>
    <link rel="alternate" type="text/html" href="http://www.s14u.info/mt/archives/2008/03/xschoice.html" />
    <id>tag:www.s14u.info,2008:/mt//1.397</id>

    <published>2008-03-19T16:40:40Z</published>
    <updated>2008-03-19T17:04:35Z</updated>

    <summary>今、XML Schema について少し学んでいるのですが、xs:choice に...</summary>
    <author>
        <name>shigeta</name>
        <uri>http://blog.s14u.info/</uri>
    </author>
    
    <category term="xml" label="XML" scheme="http://www.sixapart.com/ns/types#tag" />
    <category term="xmlschema" label="XML Schema" scheme="http://www.sixapart.com/ns/types#tag" />
    
    <content type="html" xml:lang="en" xml:base="http://www.s14u.info/mt/">
        <![CDATA[今、XML Schema について少し学んでいるのですが、xs:choice について疑問があって調べました。

xs:choice というのは以下の例の場合、foo, bar, baz のいずれか一つを選択しなければなりません。

<pre>
&lt;xs:choice&gt;
    &lt;xs:element name="foo" /&gt;
    &lt;xs:element name="bar" /&gt;
    &lt;xs:element name="baz" /&gt;
&lt;/xs:choice&gt;
</pre>

xs:choice には 2 つの属性があります。

<ul>
	<li>minOccurs (デフォルトは1)</li>
	<li>maxOccurs (デフォルトは1)</li>
</ul>

なので、&lt;xs:choice minOccurs="1" maxOccurs="1"&gt; ということになるわけです。でも省略されているから、&lt;xs:choice&gt; は必ず一つを選択するということです。
で、&lt;xs:choice minOccurs="0"&gt; とした場合は 1 つ含まれるかもしれないということになるので、選択してもいいし選択しなくてもよくなります。（具体的にはmaxOccurs="1"なので、0か1ということです。）

<pre>
&lt;xs:choice minOccurs="0"&gt;
    &lt;xs:element name="foo" /&gt;
    &lt;xs:element name="bar" /&gt;
    &lt;xs:element name="baz" /&gt;
&lt;/xs:choice&gt;
</pre>

foo, bar, baz のうちの1つあるかないかってことですね。

で、当初悩んでいたのが、次の例です。

<pre>
&lt;xs:choice minOccurs="0" maxOccurs="unbounded"&gt;
    &lt;xs:element name="foo" /&gt;
    &lt;xs:element name="bar" /&gt;
    &lt;xs:element name="baz" /&gt;
&lt;/xs:choice&gt;
</pre>

unbounded は無制限の意味になります。ではこのときfoo, bar, baz はいくつ選ぶことができるか？
foo, bar, baz の 3 つでも OK ですし、それこそ foo, foo, bar, bar, bar, baz でも OK らしいです。もう choice の意味がないんじゃないか？と思う程。むしろ、xs:choice をやめて以下のようにしてもいいんじゃないか？と思ったり。（おそらく xs:choice にする意味がどこかにあるからこそ、xs:choice を使っているのだと思いますが。。。）

<pre>
    &lt;xs:element name="foo" minOccurs="0" maxOccurs="unbounded" /&gt;
    &lt;xs:element name="bar" minOccurs="0" maxOccurs="unbounded" /&gt;
    &lt;xs:element name="baz" minOccurs="0" maxOccurs="unbounded" /&gt;
</pre>

ま、私は今のところ XML Schema を書くのではなく読む側なので、&lt;xs:choice minOccurs="0" maxOccurs="unbounded"&gt; の意味さえ分かればそれで OK なのですが、それにしても XML Schema は自由すぎて不自由な感じがしました。

ちなみに RelaxNG で書くと以下になります。

<pre>
( foo | bar | baz )*
</pre>



ところで、W3C の XML Schema の和訳ってなにげに少ないんですね。。。


参考
<ul>
<li><a href="http://www.w3.org/TR/2004/REC-xmlschema-1-20041028/structures.html#element-choice">W3C XML Schema Part 1: choice Structure</a></li>
	<li><a href="http://documentation.softwareag.com/Crossvision/ins441_j/tslref/choice.htm">xs:choice</a></li>
</ul>]]>
        
    </content>
</entry>

<entry>
    <title>Google Contacts Data API</title>
    <link rel="alternate" type="text/html" href="http://www.s14u.info/mt/archives/2008/03/google_contacts.html" />
    <id>tag:www.s14u.info,2008:/mt//1.396</id>

    <published>2008-03-13T15:32:20Z</published>
    <updated>2008-03-13T15:44:37Z</updated>

    <summary>Google Contacts Data API を使った Movable Ty...</summary>
    <author>
        <name>shigeta</name>
        <uri>http://blog.s14u.info/</uri>
    </author>
    
    <category term="api" label="API" scheme="http://www.sixapart.com/ns/types#tag" />
    <category term="contactsdataapi" label="Contacts Data API" scheme="http://www.sixapart.com/ns/types#tag" />
    <category term="google" label="Google" scheme="http://www.sixapart.com/ns/types#tag" />
    <category term="perl" label="Perl" scheme="http://www.sixapart.com/ns/types#tag" />
    
    <content type="html" xml:lang="en" xml:base="http://www.s14u.info/mt/">
        <![CDATA[<a href="http://code.google.com/apis/contacts/developers_guide_protocol.html">Google Contacts Data API </a>を使った Movable Type のプラグインを実装しようと思っていたのですが、ブログにユーザ増やしたところであんまり意味が見いだせなくてプラグインの実装はちょっとペンディングなんですが、でもせっかく Contacts Data API を使ったのでサンプルをのせておきます。

今回のポイントは <a href="http://search.cpan.org/~simonw/">Simon Wistow</a> の <a href="http://search.cpan.org/dist/Net-Google-AuthSub/">Net::Google::AuthSub</a> です。GData API 系で必ず使う認証の <a href="http://code.google.com/apis/contacts/developers_guide_protocol.html#client_login">ClientLogin</a> をラップしてくれます。ClientLogin が成功すると Google から戻って来た値をほんの少しごにょっとしなきゃならないのですが、それを隠蔽してくれるので少しきれいなコードになりますね。

このコードを実行するとメールアドレスのリストが取れます。

<pre>
#!/usr/local/bin/perl

use strict;
use warnings;

use LWP::UserAgent;
use HTTP::Request::Common;
use Net::Google::AuthSub;
use XML::LibXML;
use Data::Dumper;

my $user = '<strong>YOUR_EMAIL_ADDRESS</strong>';
my $password = '<strong>YOUR_PASSWORD</strong>';
my $authsub = Net::Google::AuthSub->new(service => 'cp');
my $auth_res = $authsub->login($user, $password);
unless ($auth_res->is_success) {
    die 'google login is failed.'
}

my $url = "http://www.google.com/m8/feeds/contacts/$user/base";

my $req =  HTTP::Request->new(GET => $url);
$req->header($authsub->auth_params);
my $res = LWP::UserAgent->new->request($req);

my $xp  = XML::LibXML->new;
my $xml = $xp->parse_string($res->content);
my @emails = $xml->findnodes("/*[local-name()='feed']/*[local-name()='entry']/*[local-name()='email']");
for my $mail (@emails) {
    print $mail->findvalue('@address') . "\n";
}
</pre>
]]>
        
    </content>
</entry>

<entry>
    <title>Perl sprintf の限界？</title>
    <link rel="alternate" type="text/html" href="http://www.s14u.info/mt/archives/2008/03/perl_sprintf.html" />
    <id>tag:www.s14u.info,2008:/mt//1.395</id>

    <published>2008-03-11T12:27:20Z</published>
    <updated>2008-03-11T12:33:01Z</updated>

    <summary>不思議な現象に出会いました。 0.5 では四捨五入されなかったのですが、 0.5...</summary>
    <author>
        <name>shigeta</name>
        <uri>http://blog.s14u.info/</uri>
    </author>
    
    <category term="perl" label="perl" scheme="http://www.sixapart.com/ns/types#tag" />
    
    <content type="html" xml:lang="en" xml:base="http://www.s14u.info/mt/">
        <![CDATA[不思議な現象に出会いました。

0.5 では四捨五入されなかったのですが、
0.51 では 1 になりました。
0.501 でも 1 になりました。
で続けていくと、0.50000000000000001 で再び 0 に戻りました。
これは有効桁数を超えたってことなのかな？
sprintf の限界ってのが有力なんですけどね。。。

<pre>
[root@colinux ~]# perl -le 'print sprintf "%.f", 0.5'
0
[root@colinux ~]# perl -le 'print sprintf "%.f", 0.51'
1
[root@colinux ~]# perl -le 'print sprintf "%.f", 0.501'
1
[root@colinux ~]# perl -le 'print sprintf "%.f", 0.5001'
1
[root@colinux ~]# perl -le 'print sprintf "%.f", 0.50001'
1
[root@colinux ~]# perl -le 'print sprintf "%.f", 0.500001'
1
[root@colinux ~]# perl -le 'print sprintf "%.f", 0.5000001'
1
[root@colinux ~]# perl -le 'print sprintf "%.f", 0.50000001'
1
[root@colinux ~]# perl -le 'print sprintf "%.f", 0.500000001'
1
[root@colinux ~]# perl -le 'print sprintf "%.f", 0.5000000001'
1
[root@colinux ~]# perl -le 'print sprintf "%.f", 0.50000000001'
1
[root@colinux ~]# perl -le 'print sprintf "%.f", 0.500000000001'
1
[root@colinux ~]# perl -le 'print sprintf "%.f", 0.5000000000001'
1
[root@colinux ~]# perl -le 'print sprintf "%.f", 0.50000000000001'
1
[root@colinux ~]# perl -le 'print sprintf "%.f", 0.500000000000001'
1
[root@colinux ~]# perl -le 'print sprintf "%.f", 0.5000000000000001'
1
[root@colinux ~]# perl -le 'print sprintf "%.f", 0.50000000000000001'
0
[root@colinux ~]# perl -le 'print sprintf "%.f", 0.500000000000000001'
0
</pre>

ちなみに当方、

<pre>
[root@colinux ~]# perl -v
This is perl, v5.8.8 built for i386-linux-thread-multi
</pre>

で

<pre>
[root@colinux ~]# uname -a
Linux colinux 2.6.22-co-0.8.0 #1 PREEMPT Tue Nov 6 00:02:11 CET 2007 i686 i686 i386 GNU/Linux
</pre>

です。

]]>
        
    </content>
</entry>

<entry>
    <title>OpenID Authentication 2.0 について少し</title>
    <link rel="alternate" type="text/html" href="http://www.s14u.info/mt/archives/2008/03/openid_authenti.html" />
    <id>tag:www.s14u.info,2008:/mt//1.394</id>

    <published>2008-03-04T15:31:55Z</published>
    <updated>2008-03-04T16:57:37Z</updated>

    <summary>OpenID Hack-a-thon や CodeReposのOpenID対応、...</summary>
    <author>
        <name>shigeta</name>
        <uri>http://blog.s14u.info/</uri>
    </author>
    
    <category term="openid" label="OpenID" scheme="http://www.sixapart.com/ns/types#tag" />
    
    <content type="html" xml:lang="en" xml:base="http://www.s14u.info/mt/">
        <![CDATA[<a href="http://www.s14u.info/mt/archives/2008/03/openid_hackatho.html">OpenID Hack-a-thon</a> や <a href="http://blog.yappo.jp/yappo/archives/000563.html">CodeReposのOpenID対応</a>、<a href="http://builder.japan.zdnet.com/info/techday/">builder techday</a> などで実装レベルにおける OpenID 2.0 対応が少しずつ身近なものになってきました。
<a href="http://openid.net/specs/openid-authentication-1_1.html">OpenID 1.1</a> と <a href="http://openid.net/specs/openid-authentication-2_0.html">OpenID 2.0</a> の違いについては、<a href="http://d.hatena.ne.jp/ZIGOROu/">id:ZIGOROu</a>さんの <a href="http://www.atmarkit.co.jp/fsecurity/rensai/openid05/openid02.html">@IT の記事</a>や <a href="http://builder.japan.zdnet.com/info/techday/">builder techday</a> での <a href="http://japan.zdnet.com/video/report/story/0,2000083660,20368690,00.htm">Lightning</a> <a href="http://www.slideshare.net/zigorou/openid-20-quick-note/">Talk</a> が参考になると思います。

OpenID 1.1 と OpenID 2.0 の違いを簡単にいえば、
<ul>
	<li>Identifier に URL と XRI が使えるようになった</li>
	<li>Discovery の方式が変わった</li>
</ul>
といった辺りがポイントでしょうか。

<hr/>

<h3><big>Identifier に URL と XRI が使えるようになった</big></h3>

XRI (EXtensive Resource Identifier) については <a href="http://openid.net/specs/openid-authentication-2_0.html#rfc.references1">OpenID 2.0 の仕様書の Normative Reference</a> にあります、[XRI_Resolution_2.0] と [XRI_Syntax_2.0] を参考にすると XRI の仕様が分かります。[XRI_Resolution_2.0] で XRDS (EXtensive Resource Descripter Sequence) 文書を含む XRI を取り囲む仕様が、 [XRI_Syntax_2.0] では XRI のシンタックスについての仕様が書かれています。XML関係で標準化を進める団体 <a href="http://www.oasis-open.org/">OASIS</a> の下で作成されました。XRI も URL と同様にあるリソースをユニークにするものです。なので、Identifier として利用することが出来るわけです。
XRI については仕様をよく読めば理解できるかなと思います。

<hr/>

<h3><big>Discovery の方式が変わった</big></h3>

これは大きな変化です。例えば、<a href="http://fastladder.com/">fastladder.com</a> で yahoo.com の OpenID を使おうとしたときに（すでに 「Sign in with Yahoo! ID」ボタンがあるのでアレなんですけど）、「yahoo.com」と入力しただけでOpenID プロバイダの認証ページにリダイレクトされるようになります。OpenID 1.1 のころですと、comewalk.livejournal.com のように長い URL の入力が必要でしたが、ドメインだけで充分になっています。
OpenID 1.1 のころは comewalk.livejournal.com ならば以下のような Link Discovery が HTML ページのHEAD セクションにありました。

<pre>&lt;link rel="openid.server" href="http://www.livejournal.com/openid/server.bml"/&gt;
&lt;link rel="openid.delegate" href="http://comewalk.livejournal.com/"/&gt;
</pre>

これが大きく変わります。<a href="http://openid.net/specs/openid-authentication-2_0.html#discovery">OpenID 2.0 の仕様の 7.3 Discovery </a>が参考になります。

<blockquote>   1.  If the identifier is an XRI, [XRI_Resolution_2.0] (Wachob, G., Reed, D., Chasen, L., Tan, W., and S. Churchill, "Extensible Resource Identifier (XRI) Resolution V2.0 - Committee Draft 02," .)  will yield an XRDS document that contains the necessary information. It should also be noted that Relying Parties can take advantage of XRI Proxy Resolvers, such as the one provided by XDI.org at http://www.xri.net. This will remove the need for the RPs to perform XRI Resolution locally.
   2. If it is a URL, the Yadis protocol (Miller, J., "Yadis Specification 1.0," .) [Yadis] SHALL be first attempted. If it succeeds, the result is again an XRDS document.
   3. If the Yadis protocol fails and no valid XRDS document is retrieved, or no Service Elements (OpenID Service Elements) are found in the XRDS document, the URL is retrieved and HTML-Based discovery (HTML-Based Discovery) SHALL be attempted.
</blockquote>

意訳すると、
1.XRIが入力されたならばXRI Resolutionに従ってXRDS文書を探します。
2.URLが入力されたならばYadisプロトコルでXRDS文書を探します。
3.Yadisもダメ、XRDS文書もinvalidで、<a href="http://openid.net/specs/openid-authentication-2_0.html#service_elements">サービス要素</a>である&lt;xsd:Service&gt;もない。ならば、HTMLのlink要素をみてみます。
という具合です。

さらに以下の記述も変わります。

<pre>&lt;link rel="openid.server" href="http://www.livejournal.com/openid/server.bml" /&gt;
&lt;link rel="openid.delegate" href="http://comewalk.livejournal.com/" /&gt;
</pre>

OpenID 2.0 対応では次のようになります。<a href="http://openid.net/specs/openid-authentication-2_0.html#anchor50">サンプル</a>が仕様書にあります。

<pre>&lt;link rel="openid2.provider" href="http://www.livejournal.com/openid/server.bml" &gt;
&lt;link rel="openid2.local_id" href="http://comewalk.livejournal.com/" /&gt;
</pre>

OpenID 1.1 と OpenID 2.0 を共存させるには、rel属性に両方を書きます。

<pre>&lt;link rel="openid2.provider openid.server" href="http://www.livejournal.com/openid/server.bml" /&gt;
&lt;link rel="openid2.local_id openid.delegate" href="http://comewalk.livejournal.com/" /&gt;
</pre>

ところで、www.yahoo.com の HTML を見ても、OpenID の Discovery らしきものは見当たりません。Yadis の仕様書を見たらこんな記述がありました。

<blockquote>6.2.4 Initiation
The Yadis Protocol is initiated by the Relying Party Agent with an initial HTTP request using the
Yadis URL.
This request MUST be either a GET or a HEAD request.
A GET or HEAD request MAY include an HTTP Accept request-header (HTTP 14.1) specifying MIME
media type, application/xrds+xml.</blockquote>
GETかHEADで取ると。必要であれば Accept: application/xrds+xml を付けようと。

で試してみました。

<pre>comewalk:~ takatsugu$ telnet www.yahoo.com 80
Trying 209.131.36.158...
Connected to www.yahoo-ht3.akadns.net.
Escape character is '^]'.
HEAD / HTTP/1.1
Host: www.yahoo.com
Accept: applilcation/xrds+xml

HTTP/1.1 200 OK
Date: Tue, 04 Mar 2008 15:31:02 GMT
P3P: policyref="http://p3p.yahoo.com/w3c/p3p.xml", CP="CAO DSP COR CUR ADM DEV TAI PSA PSD IVAi IVDi CONi TELo OTPi OUR DELi SAMi OTRi UNRi PUBi IND PHY ONL UNI PUR FIN COM NAV INT DEM CNT STA POL HEA PRE GOV"
Cache-Control: private
Vary: User-Agent
X-XRDS-Location: http://open.login.yahooapis.com/openid20/www.yahoo.com/xrds
Last-Modified: Tue, 04 Mar 2008 15:22:48 GMT
Accept-Ranges: bytes
Content-Length: 9533
Connection: close
Content-Type: text/html; charset=utf-8

</pre>
お

<pre>X-XRDS-Location: http://open.login.yahooapis.com/openid20/www.yahoo.com/xrds
</pre>

というのがかえってきました。
yahoo.com は HEAD で取得できるようですね。
で、http://open.login.yahooapis.com/openid20/www.yahoo.com/xrds というファイルが XRDS文書なのです。
見ると

<pre>&lt;xrds:XRDS xmlns:xrds="xri://$xrds" xmlns:openid="http://openid.net/xmlns/1.0" xmlns="xri://$xrd*($v*2.0)"&gt;
  &lt;xrd&gt;
    &lt;Service priority="0"&gt;
      &lt;Type&gt;http://specs.openid.net/auth/2.0/server&lt;/Type&gt;
      &lt;Type&gt;http://specs.openid.net/extensions/pape/1.0&lt;/Type&gt;
      &lt;uri&gt;https://open.login.yahooapis.com/openid/op/auth&lt;/uri&gt;
    &lt;/Service&gt;
  &lt;/xrd&gt;
&lt;/xrds:XRDS&gt;
</pre>

となっていて XPath でいうと /XRD/Service/URIなところにURLがありますね。そこが OpenID Provider の URL なのです。HTML の link要素から取得しないあたりがもう全然違っていて、面白いですね。
これでやっと OpenID 2.0 の Discovery が理解できてきたのでアレをああしてこうできそうです。

<hr/>

<h3><big>まとめ</big></h3>
bradfitzやDavid Recordon、miyagawaさんやkazeburoさんなどのおかげで Net::OpenID::Consumer と Net::OpenID::Server が OpenID 2.0 に対応し、Six Apart の subversion repository から入手することができます。

<pre class="code">svn co http://code.sixapart.com/svn/openid/branches/openid2/perl/ openid2
</pre>

OpenIDの入力が簡単になった。Yahoo!  など大手が OpenID Provider になった。あとは開発者の皆さんがご自分のプロダクトで OpenID 対応をすすめることが OpenID が広まるポイントだと思います。
さあ、OpenID 2.0 対応をすすめていきましょう。
]]>
        
    </content>
</entry>

<entry>
    <title>Blogging via Flickr is failed.</title>
    <link rel="alternate" type="text/html" href="http://www.s14u.info/mt/archives/2008/03/blogging_via_fl.html" />
    <id>tag:www.s14u.info,2008:/mt//1.393</id>

    <published>2008-02-29T18:06:25Z</published>
    <updated>2008-02-29T18:06:25Z</updated>

    <summary>         Blogging via Flickr is failed. ...</summary>
    <author>
        <name>shigeta</name>
        <uri>http://blog.s14u.info/</uri>
    </author>
    
    
    <content type="html" xml:lang="en" xml:base="http://www.s14u.info/mt/">
        <![CDATA[<div style="float: right; margin-left: 10px; margin-bottom: 10px;">
 <a href="http://www.flickr.com/photos/shigeta/2300687662/" title="photo sharing"><img src="http://farm4.static.flickr.com/3006/2300687662_fd06746478_m.jpg" alt="" style="border: solid 2px #000000;" /></a>
 <br />
 <span style="font-size: 0.9em; margin-top: 0px;">
  <a href="http://www.flickr.com/photos/shigeta/2300687662/">Blogging via Flickr is failed.</a>
  <br />
  Originally uploaded by <a href="http://www.flickr.com/people/shigeta/">shigeta</a>
 </span>
</div>
さっきFlickrからエントリをしたときのこと。さんざんFlickrでは失敗したとのメッセージが出たので連続で何件か投稿したわけですが、なんと全部投稿されていました。おそらくMovable Typeのxmlrpcの戻り値とFlickrが期待する戻り値に違いがあるんだろうな、と想像しつつ。。。<br />
もしFlickr経由でMovable Typeにブログしている人がいらっしゃいましたら、Flickrでエラーが連続で出る場合、パスワードの確認ももちろんですが、一度ブログを確認されるとよろしいかと思います。もしかしたら投稿されているかもしれませんので。。。
<br clear="all" />]]>
        
    </content>
</entry>

</feed>
