共通の書式でドキュメントの見出し、要約などのリストを提供することで、サイトの更新情報などを効率的に公開できます。RDFの体系的な解説『RDF/OWL入門』を上梓しました。サイトの概要をメタデータとして簡潔に記述するXMLフォーマットです。1.0(RDFとXML名前空間に基づき、拡張性と「メタデータ配信」の可能性を持つ)を紹介していきます。1.0はサイトの情報を簡便に伝えられるよう、次のような簡単な基本構造を持ちます。1.0の最小限の構成要素のみを取り上げています。全要素のリストは、後ほど示します。本稿では、デフォルト名前空間がRSS、rdf:はRDFの名前空間接頭辞を示すものとして扱います)。以下、当サイトが「コントラバスの話」と「ごく簡単なHTMLの説明」という2つのリソースを持つことを示すRSSを記述する例を考えながら、RSSの要素型と構文を簡単に説明していきましょう。channel要素RSSはもともと「チャンネル」情報を提供するために開発されたので、基本情報はchannel要素に記述します。この要素はRDFのDescription要素と同様に主語ノードを表す役割を持ち、rdf:about属性でチャンネルのURI(通常このRSS自身のURI)を示します。channelの内容となる要素は次のものです。これらは、このチャンネルの「プロパティ」に相当します。チャンネル(サマリー対象)のタイトル。RSSでサマリー対象とするサイトのURI。チャンネル(サマリー対象)の内容、機能、ソースなどの概要説明。チャンネルのロゴなどがある場合に記述。channelに続くitem要素で記述するリソースの目次に相当。チャンネルと共に検索用のフォームなどを送る場合に使う。オプションこれらの要素を使って、当サイトのチャンネルを記述してみます。このRSSは、http://www.kanzaki.com/info/rss.rdfでアクセスできるものとします。image要素とtextinput要素は使いません。</channel>items要素はRDFのリストとなるので、rdf:Seq、rdf:liといったタグを用いてRDFのコンテナモデルとして表現することに注意してください。この目次に示したリソースについて、次のitem要素で見出しや要約を記述していきます。item要素channelのitems要素で目次として示したリソース(記事、文書など)それぞれについて、item要素で具体的に内容を説明します。それぞれがリソースを記述するので、rdf:about属性で対象URI(主語)を示します。このURIは、対応する目次項目(rdf:li要素)のrdf:resource属性値(URI)と一致させなければなりません。item要素内では次の要素を用いてリソースを記述します。これらは、各リソースの「プロパティ」という訳です。リソースのタイトル(ニュースヘッドラインなら見出し)。リソースの要約、概要説明など。0.9との互換性を考えるならば、15までにしておくことが推奨されています。文字数に関する推奨も、後方互換性のためです。これらの制約は近い将来取り除かれる方向で検討されており、あまり気にする必要はありません。description要素に日記やblog記事の全文を記載すると、コンパクトなサマリーを期待する読者には歓迎されないかも知れないので、description要素は短くとどめ、全文は後述するContentモジュールのcontent:encoded要素に記述すると良いでしょう。</item>シンプルなRSSの全体ここまでで取り上げた要素を組み合わせることで、サイトを紹介するための基本的なRSSを作成できます。必要な名前空間宣言を持つルート要素を加え、全体を構成してみましょう。目次(rdf:li要素)のrdf:resource属性で示したURIが、それぞれのitem要素のrdf:about属性値に対応していることを確認してください。<description>HTMLは本当は簡単で便利なもの。</item></rdf:RDF>以上の簡単な要素を揃えるだけで、チャンネルを公開してサイトの情報を提供することができるようになります。この手軽さが、RSSが幅広く支持されている大きな要因です(RSSの公開などについては、末尾の「RSSの実際の利用」セクション参照)。1.0の仕様で定められていたり推奨されている細かい点をいくつか取り上げておきます。文字コードデフォルトはutf-8とされています。文字コード情報を提供すればどんな符号化方法でも良いはずですが、一部のRSS処理ソフト(のXMLパーサ)は、utf-8でないと正しく働かないことがあるようです。拡張子ファイルとして保存する場合の拡張子は、.rdfもしくは.xmlが推奨されており、前者がより望ましいとされています。MIMEタイプ現時点ではapplication/xmlとなっていますが、[RFC3023]で示されるXMLのメディアタイプが確定したら、それに従うこととされています。1.0を構成する要素全体をツリーとして示しておきます。各要素の出現順序もこの通りに定められていますは特に定められていません。(以下のimage要素、textinput要素はあまり使われません。日付などの要素を取り込むためのモジュールの方が重要です)。rdf:RDFchanneltitlelinkdescriptionimage?itemsrdf:Seqrdf:li+textinput?image?titleurllinkitem+titlelinkdescription?textinput?titledescriptionnamelinkchannel要素内のimage,items,textinput各要素は、channel要素に続く各要素の目次の役割を持ちます。したがって、channel要素内のimage、textinput要素は、対応する要素がchannel要素に続く場合のみ必要です。image要素image要素はサイトのロゴなどの画像を示すために用います。扱いはitem要素と同様ですが、複数を指定することはできません。具体的には、channel内のimage要素でrdf:resource属性を使って画像の存在を示し、channel要素の次にimage要素を置いてtitle,link,urlの各要素を記述します。image要素でrdf:about属性を用いるのも、item要素の場合と同様です。title要素は、一般に画像の代替テキストとして扱われます。linkは画像をアンカーとしてリンクを設定する場合のリンク先となり、画像自身のURIはurl要素に記述します。</image>textinput要素チャンネルの最後に、検索などのためのフォームを付け加えることを想定しています。フィールドを一つしか送ることができないため、柔軟性に乏しく、RSS1.0では“RSS0.9との互換性のために残されている”となっています。一般にtitle要素を(チャンネル受信側で生成する)フォームの見出し、description要素をラベル、link要素をaction属性の値として用います。他の要素にないname要素は、テキスト入力データの名前(input要素のname属性)となります。</textinput>RDFとして見た場合のRSS(このセクションはRDFの細部を説明するので、読み飛ばして先に進んでも構いません)RSSのRDFモデル[例3]のXML構文をRDFモデルとして表現すると、channel要素のrdf:about属性で示したリソースを主語として連鎖的に叙述するRDFのグラフを描くことができます。サンプルRSSのRDFグラフグラフを見ると明らかなように、このRDF(RSS)が記述するステートメントの主語は、それぞれのrdf:about属性が示すリソースです。「サイトのサマリーを示すメタデータ」なのだから主語(channel要素のrdf:about属性の値)はサイトそのもののURIを用いるべきという気がするかも知れません。RSSは「チャンネル」を記述するものなので(主語リソースはchannelクラスのインスタンス)、RDFとしてはチャンネルすなわちRSS自身が主語になります。要約対象となるサイトは、主語チャンネルからlinkプロパティによってそのURIを示されていますが、これはただのリテラルであり、RDFとしてリンク先リソースを示すかたちになっていません。古いRSSの書式と整合性を取るためにこうなっているわけですが、やはりサイトもリソースとして示す方が意味が(エージェントなどにとって)明確でRDFとしては望ましい構文だったはずだと言えるでしょう。1.0のchannel要素のrdf:aboutを参照。RDFモデルの補足説明channel要素内で目次としてrdf:resource属性でリソースを示し、同じものをitem要素でまたrdf:about属性として示すのは冗長に感じられるかも知れません。これはRDFの構造化モデルで説明したような、ステートメントの目的語が別のステートメントの主語となる文の一例です。[例3]の構文は、次のようにしてchannel内のitems要素にitem要素の記述を直接埋め込んでも、RDFのモデルとしては等価で、[図1]と同じグラフが得られます。[例3]のようにitem要素をchannel要素の外に出すほうが、それぞれのリソースを記述するという意味が(人間がXMLを読み書きする時には)分かりやすいかもしれません。0.9の構文に近いので、互換性のためもあってitem要素がchannel要素の外に出されているのでしょう。[例6]はRDFモデルとしては同等ですが、構文が異なるので、RSSアプリケーションがうまく処理できるとは限りません。0.91のモデルに近いので、そのまま処理できてしまうことも多いと思いますが。(処理できないリーダーが少なくないので、公開フィードには用いないでください)また、item要素内のlink要素はrdf:about属性と重複していて蛇足なのですが、rdf:aboutはこのアイテム(コンテンツ)を識別するためのID、linkはハイパーリンクのURLを示し、理屈の上では異なるURIとなることもあり得ます。0.9との互換性としての意味合いが大きいのでしょう。1.0はXML名前空間を利用した拡張性を重要な特徴としています。CommonsやFOAFといったポピュラーな語彙、あるいは独自の要素型を追加することもできます。Groupで拡張語彙の標準「モジュール」を定めています[RSSMOD]。CoreモジュールとSyndicationモジュールの2つです。RSSを利用するプログラムの多くは、これらのモジュールを理解します。blogの人気に伴いContentなどほかのモジュールも広まりつつあるようです。コンテナとしてのRSS:RSS1.0の拡張性利用し、さまざまなメタデータの公開・配信のための「コンテナ」として応用することができます。FOAFとRSSを用いた画像メタデータやRDFカレンダーなど。この可能性については、また改めて検討します。CoreのDCMESを利用するモジュールです。加え、DCMESのプロパティを使って作者や更新日付などの情報を記述します。textinput各要素の直接の子供として(つまりプロパティ要素として)のみ使用することがモジュールで定義されています。DCMESの修飾子はいまのところサポートされていません。このモジュールは、チャンネル自身やそこで記述するリソースの更新日を示すのに特に有益です。ニュースヘッドラインなどの情報は、日時の情報がとても重要なので、それを共通の語彙を用いて明記できるメリットは大きいでしょう。dc:dateの形式はYYYY-MM-DDThh:mmを用います[W3CDTF]。<description>HTMLは本当は簡単で便利なもの。</item>...dc:subjectを用いてコンテンツの分野や分類を示すのもよく使われる方法です(SharpeaderやNewsGlueなどいくつかのRSSリーダーでは、Subject/分類として一覧に表示してくれるようです)。RSS0.91ではチャンネルのlanguage要素が必須だったので、これに代わるものとしてdc:languageを使うこともあります。米国製blogツールのテンプレートをそのまま使って、日本語コンテンツなのに言語情報をen-USなどとしないよう注意してください。xml宣言のencodingをutf-8にしたままShift_JISのRSSを送り出している例もよく見かけます。Syndicationモジュールシンジケーションとはニュースの記事などを配信(配給)するサービスのことです。ウェブ上でも、ニュースサイトなどが最新のヘッドラインを「チャンネル」という形で配信することがありますが、この手段としてRSSが広く使われています。「配信」といっても、RSSのようなウェブ上のリソースの場合は、基本的はプッシュ型ではなく利用者が情報をチェックしに行かなければなりません。その際、どんな頻度で情報が更新されているかが分かると都合がよいため、Syndicationモジュールの語彙を用いて更新予定を示します。名前空間宣言xmlns:sy="http://purl.org/rss/1.0/modules/syndication/"updatePeriod更新の頻度を示します。yearlyのいずれかで、省略時はdailyとみなされます。updateFrequencyupdatePeriodと関連づけ、その期間中に何度更新されるかを示します。updatePeriodがdailyでupdateFrequencyが2ならば、1日2回更新するという意味です。updateBase上記の要素から次回更新予定時を計算するための基準を示します。一般には、前回の更新日時をYYYY-MM-DDThh:mmの形式[W3CDTF]で示します。※2004年1月以前の本文書では、この名前空間URIをhttp://purl.org/rss/modules/syndication/と記述していましたが、誤りでした("/1.0"が抜けていた)のでお詫びして訂正します。...このように記述してあると、“この「チャンネル」は毎日更新されているので、毎日チェックしてください”ということを意味します。ContentモジュールXHTMLによるマーク付けなどを含めた、コンテンツをそのまま配信するためのモジュールです。ウェブログツールのRSSテンプレートに含まれていたりするので、最近見かけるようになってきました。提案当時の構文と、改訂された構文がありますが、新しい方だけを取り上げておきます。名前空間宣言xmlns:content="http://purl.org/rss/1.0/modules/content/"encodedマークアップ記号を実体参照に置き換えるか、CDATAセクションとして、コンテンツそのものを記述します。提案当時は複数のフォーマットのコンテンツを使い分けることなどを想定していましたが、実質的に使われているのは改訂仕様のcontent:encoded要素のみです。href="http://www.kanzaki.com/bass/">コントラバスの話</a>」の冒頭に引用したのは、小説『香水』で有名なドイツの作家パトリック・ズュースキントの処女作である『コントラバス』です。これは、ミュンヘンの国立歌劇場につとめるしがないコントラバス弾きが、ソプラノ歌手に恋する思いを切々と語るモノドラマで、ベースを巡るさまざまなフレーズが登場します。頃な材料なので、ここに表れる科白をテキストに、コントラバスについて研究してみましょう。</item>Contentモジュールに対応するビューアで表示すると、次のような具合になります(img要素などを埋め込む場合、パスを絶対URIにしておかないとうまくいきません。xml:base属性を使ってもいいはずですが、必ずしも対応していないようです)。Readerは、この要素を折り畳んで表示します(例:音楽雑記帖RSS)。実際のマークアップなどをそのまま扱う場合、次に述べるセキュリティの配慮が重要です。CDATAセクションやエスケープ(&lt;など)を使って、ただのテキストでしかないはずの要素をマークアップを含む(子要素がある)ように扱わせるのは、エラーの温床となる危険性もあり、大きな問題を孕むと指摘されていることも注意してください[WALSH]。そのほかのモジュールそのほか、RSSでさまざまなメタデータを記述するため、独自のモジュールが定義されることもあります:Trackbackモジュール:ウェブログなどのシステムでよく使われるトラックバックに関するURIを、記事のメタデータとしてRSSのアイテムに記述するための語彙です。このモジュールについては「RSSとトラックバック」で簡単に検討しています。Annotationモジュール:記事が参照したりコメントしたりしている相手のURLを記述するreferenceという語彙を定義しています。1.0のannotationモジュール」でごく簡単に説明しています。RSSで配信しようというモジュールです。シンプルで使いやすいものの、構文上若干問題があるので、RDFicalを使う方がよさそう。RDFical(RDFカレンダー)のページで、Eventモジュールも少し取り上げています。Taxonomyモジュール:チャンネルのアイテムを分類する(トピックを示す)ために使います。dc:subjectと似ていますが、taxonomyではキーワードを文字列ではなくURIで示します。メモ帖のRSSのtaxonomyモジュールで、少し取り上げています。RSSとセキュリティRSSのような分散型のアプリケーションでは、セキュリティに対する配慮が欠かせません。RSSの利用方法は、ほとんどの場合読みとりのみだと考えられるので、それほど重大な問題はなさそうですが、RSSを処理してブラウザなどに表示させる場合、ごく一般的なCGIと同等の注意は必要です。表示要素内にHTMLのタグや特殊文字が含まれている場合の処理。script要素などが勝手に働かないよう、エスケープ処理をするlink要素、rdf:about属性値などに、javascript:スキームのような特殊なURIが記述されている場合のチェックRSS1.0の仕様では、urlおよびlink要素で許されるスキームはhttp:、https:、ftp:(textinput要素ではこれに加えてmailto:)に限るとしていますので、これに合わせたチェックをするのも良いでしょう。Burtonによって仕様書にセキュリティの章を追加する提案が出されています[BURTON]。RSSの実際の利用RSSは、実際にはどんな具合に利用されているのでしょうか。Reader」プログラムもいくつか提供されています。簡単なスクリプトで自分のサイトのRSSを自動生成して公開することも可能です。RSS提供サイトRSSを集めて一種のポータルとして提供しているサイトとしては、次のようなものがあります。ディレクトリサービスです。精力的にRSSを収集し、埋め込み用スクリプトも配布。(2002-03でサービスを終了したそうですが、関連記事とリンクが残されています)主要なサイトが公開しているRSSを取り込んで、自分用のディレクトリ(ポータル)をつくるのもいいでしょう。現在提供されているRSSをいくつかあげてみます(RSSそのものはXMLなので、ブラウザで見てもそれほど読みやすくはありません)。0.9/0.91/1.0が混在しています。Consortiumsnap.shotRSS生成ツールRSSをプログラムで生成したり処理するには、次のようなツールや解説が役立つでしょう。ValidatorはRSSの構文をチェックする(と言ってるけど、あまり意味ないかも)多くのウェブログツールは、テンプレートを使ってRSS生成の設定ができます。更新が頻繁なサイトは自動化しないとRSS生成が面倒になってしまうと思いますが、たまに更新するものについてRSSを提供したり、試しにRSSを自作してみようという場合には、テーブルに必要な要素を記述することでRSSを生成してくれる次のようなツールが便利です。多くのRSSリーダーは、定期的にフィードをチェックして取得できるようになっていますが、プログラムによってはLast-Modifiedヘッダなどを考慮せずに毎回GETをかけていくものがあるので、利用にあたっては設定に注意してください。したツールで頻繁に巡回すると、相手のサーバーに負担をかけてしまいます(各アイテムのリンク先コンテンツまで毎回全部GETするツールなど、もってのほかです)。If-Modified-Sinceによる更新確認をきちんとおこなっていると思われるのは、今のところSharpReader、FeedReader、NetNewsWire、Bloglines、FeedDemon、RssBandit、xyzzy-rss-modeなどです。Beckettによって提供されているシンボルです。画像に埋め込まれたメタデータをそのまま保持することを条件に、自由に利用できます。お気に召したら、ご自身のサイトにコピーの上ご利用ください。形式をGIFに変換することは認められていません。Netscapeに「チャンネル」を登録するための手段として1999年3月に開発・公開した、バージョン0.9と呼ばれるものです[NS-RELEASE]。基本的には見出し一覧を配信するためのものでした[RSS09]。0.91が登場します[RSS091]。Summaryと呼ばれ、何割かのコンテンツプロバイダはこの新しいフォーマットを採用しました。0.91では、RDFはチャンネル作成者にとって複雑だとして、ルート要素をrssとする独自のXMLに変更されています。その後Netscape社はRSSから手を引きますが、サイトサマリーを提供する枠組みとしてのRSSへの要望はむしろ高まり、これに独自の要素型を加味して用いるユーザーも出現するなど、混乱の様相を見せてきました。基本的なサマリー提供機能をコアなRSSとして定義し、より高度な機能は(XML名前空間を利用した)モジュールとして追加できるようにするという新しい規格が、改めてRDFに基づくものとして開発者のグループ(RSS-DEVワーキンググループ)で検討されました。1.0です[RSS10]。1.0をこれから注目すべき規格と位置づけ、紹介しています。etc.にあれこれ付け足しをしたものですが、一部名前空間を使うようになっています)。3.0をつくったらというブラックユーモアが出たり[SWARTZ]、逆にRSSを乗り越えて新しいフォーマットをつくろうというAtomのような試みも行われています。2.0やEchoは、RSSを「コンテンツ配信」の手段に拡張しようという考え方で、同床異夢的なところがあります。[BRICKLEY]などを参照してください。〔注意〕サイト要約のフォーマットRSSとメタデータ記述の枠組みRDFを混同しないでください。RSS⊂RDFでもRSS⊃RDFでも、ましてRSS=RDFでもありません。http://www.kanzaki.com/docs/sw/rss.html。