メンバページ: tsu

行き当たりばったり指向プログラミング

このページは、行き当たりばったりにテーマを決めて、 マイペースで書いていこうと思っています。
といっても、プログラミング回りの話が中心になると思います。
特に、オブジェクト指向が嫌いな方にはおすすめです(嘘かもしれない)。

2003年は、日本でも RSS の普及が始まった年でした。 また、RSS が広まるのと平行して、RSS アグリゲータの数も増え、 いまや RSS アグリゲータなしのインターネット生活は考えられない、 という人もいると思います。

そんな状況で、まだ RSS というものになじんでいない人もいると思います。 今回は、 RSS を人間が読みやすい形に整えるツールを作る過程を通じて、RSS とは何なのか、 何の役に立つのかを考察していきたいと思います。すでに、世の中にはRSS整形ツール (要するに 「簡易版 RSS アグリゲータ」)がいろいろあり、いまさら作る価値はあるのか? って疑問もありますが、とりあえず、RSS になじむため、 と割り切って話を進めていきます。

世の中には perl や javascript、はたまた C# で書かれたものが流布しているようですので、 ここは初心にかえって C で書いてみることにしましょう。 C で書くことの利点は、C コンパイラの用意されている環境なら、 どこでもコンパイルできる、非力なサーバでも比較的軽快に動くプログラムが作れる、 そして何より、「行き当たりばったり」にプログラムが書ける、 といったことが挙げられます。また、インターネットをさまよえば、 利用できそうなライブラリにぶつかる可能性が高い、というのも利点ですね。

今回は所信表明ということで、実際にプログラムを書いていくのは次回からにします。 それでは、みなさん、ごきげんよう。

(つづく)

まずは、RSS 1.0 を対象に RSS リーダーを作ってみることにします。

一般的に RSS 1.0 の rdf ファイルは、以下のような形式をしています。
(実際には、もっといろんなバリエーションが可能なのですが、ここでは簡単のために最も一般的な例を示しています。)

<?xml version="1.0" encoding="UTF-8"?>

<rdf:RDF
  xmlns:rdf="http://www.w3.org/1999/02/22-rdf-syntax-ns#"
  xmlns:dc="http://purl.org/dc/elements/1.1/"
  xmlns:sy="http://purl.org/rss/1.0/modules/syndication/"
  xmlns:admin="http://webns.net/mvcb/"
  xmlns="http://purl.org/rss/1.0/">

<channel rdf:about="RSS の対象となる Web ページの URL">
<title>RSS の対象となる Web ページのタイトル</title>
<link>RSS の対象となる Web ページの URL</link>
<description>RSS の対象となる Web ページの概要</description>
<dc:language>言語(日本語の場合は ja)</dc:language>
<dc:creator>RSS の対象となる Web ページの著作者</dc:creator>
<dc:date>RSS の対象となる Web ページの最終更新日時</dc:date>
<admin:generatorAgent rdf:resource="RSS生成に使用したツールの URL" />

<items>
<rdf:Seq>
<rdf:li rdf:resource="RSS 生成対象の 最初  の記事の URL" />
<rdf:li rdf:resource="RSS 生成対象の 2番目 の記事の URL" />
   ・・・・・・・・・・・・(略)・・・・・・・・・・・・
<rdf:li rdf:resource="RSS 生成対象の n番目 の記事の URL" />
</rdf:Seq>
</items>

<item rdf:about="RSS 生成対象の 最初  の記事の URL">
<title>RSS 生成対象の 最初  の記事のタイトル</title>
<link>RSS 生成対象の 最初  の記事の URL</link>
<description>RSS 生成対象の 最初  の記事の概要</description>
<dc:subject>RSS 生成対象の 最初  の記事の分類</dc:subject>
<dc:creator>RSS 生成対象の 最初  の記事の著作者</dc:creator>
<dc:date>RSS 生成対象の 最初  の記事の作成日時</dc:date>
</item>
<item rdf:about="RSS 生成対象の 2番目 の記事の URL">
<title>RSS 生成対象の 2番目 の記事のタイトル</title>
<link>RSS 生成対象の 2番目 の記事の URL</link>
<description>RSS 生成対象の 2番目 の記事の概要</description>
<dc:subject>RSS 生成対象の 2番目 の記事の分類</dc:subject>
<dc:creator>RSS 生成対象の 2番目 の記事の著作者</dc:creator>
<dc:date>RSS 生成対象の 2番目 の記事の作成日時</dc:date>
</item>
   ・・・・・・・・・・・・(略)・・・・・・・・・・・・
<item rdf:about="RSS 生成対象の n番目 の記事の URL">
<title>RSS 生成対象の n番目 の記事のタイトル</title>
<link>RSS 生成対象の n番目 の記事の URL</link>
<description>RSS 生成対象の n番目 の記事の概要</description>
<dc:subject>RSS 生成対象の n番目 の記事の分類</dc:subject>
<dc:creator>RSS 生成対象の n番目 の記事の著作者</dc:creator>
<dc:date>RSS 生成対象の n番目 の記事の作成日時</dc:date>
</item>
</channel>

</rdf:RDF>

とりあえず、方針としては、RSS 1.0 形式の rdf ファイルを入力とし、html に変換して出力するコンソールアプリケーションを作ることにします。入力ファイルに

xmlns="http://purl.org/rss/1.0/"

という文字列が含まれていたら、RSS 1.0 と見なすことにします。
大雑把にコードを書くと、以下のような感じになります。

続きを読む...

今回は、RSS 0.91 を扱うための処理を RSS リーダーに組み込んでみることにします。

一般的に RSS 0.91 の xml ファイルは、以下のような形式をしています (注意: 0.91 は rdf ではありません)。 RSS 1.0 と比べるとシンプルです。
(実際には、もっといろんなバリエーションが可能なのですが、ここでは簡単のために最も一般的な例を示しています。)

<?xml version="1.0" encoding="ISO-8859-1" ?>
<rss version="0.91">
<channel>
  <title>RSS の対象となる Web ページのタイトル</title> 
  <link>RSS の対象となる Web ページの URL</link> 
  <description>RSS の対象となる Web ページの概要</description> 
  <language>言語(日本語の場合は ja)</language> 
  <copyright>RSS の対象となる Web ページに関する著作権に関する情報</copyright> 
  <managingEditor>RSS の対象となる Web ページの編集者のemailアドレス</managingEditor> 
  <webMaster>RSS の対象となる Web ページの管理者のemailアドレス</webMaster> 
  <item>
    <title>RSS 生成対象の 最初 の記事の 題名</title> 
    <link>RSS 生成対象の 最初 の記事の URL</link> 
    <description>RSS 生成対象の 最初 の記事の 概要</description> 
  </item>
  <item>
    <title>RSS 生成対象の 2番目 の記事の 題名</title> 
    <link>RSS 生成対象の 2番目 の記事の URL</link> 
    <description>RSS 生成対象の 2番目 の記事の 概要</description> 
  </item>
  ・・・・・・・・・・・・(略)・・・・・・・・・・・・
  <item>
    <title>RSS 生成対象の n番目 の記事の 題名</title> 
    <link>RSS 生成対象の n番目 の記事の URL</link> 
    <description>RSS 生成対象の n番目 の記事の 概要</description> 
  </item>
</channel>
</rss>

入力ファイルに

<rss version="0.91">

という文字列が含まれていたら、RSS 0.91 と見なすことにします。
RSS 0.91 のリーダー readRSS_0_91() を やっつけ (^^; で作ると、 以下のようになります(しつこいようですが、念のために書いておきます。以下のコードは、後日、リファクタリングを堪能するため、わざと突っ込みどころのあるコードを書いています。そうは言っても、一応、ちゃんと動かないと話にならないので、動作確認はしてあります)。

続きを読む...

今回は、RSS 2.0 を扱うための処理を RSS リーダーに組み込んでみることにします。なぜ、RSS 0.92 や 0.93 ではなく、いきなり 2.0 かというと、0.92 や 0.93 は 2.0 のサブセットと見なせますので、2.0 のリーダを作れば、0.92 や 0.93 準拠の RSS ファイルにも自動的に対応したことになるからです。2.0 のリーダを使えば 0.91 もそのまま読めるんでは? という意見もあるかとは思いますが、0.91 と 0.92 以降で、微妙に取り扱いが変わった要素(elemnt)がありますので、今後のことを考えて、あえて 0.91 用のリーダは別に用意しました。

一般的に RSS 2.0 の xml ファイルは、以下のような形式をしています (注意: 2.0 は rdf ではありません)。 RSS 1.0 と比べると記述できる情報の種類が大幅に増えています。また、RSS 0.91 に存在した項目数(最大15項目)や文字数(1項目最大500バイト)に関する制限が撤廃されています。
また、RSS 1.0 では日時は ISO8601 形式ですが、RSS 0.92, 0.93, 2.0 では RFC822 形式です。
(実際には、もっといろんなバリエーションが可能なのですが、ここでは簡単のために最も一般的な例を示しています。)

<?xml version="1.0" encoding="ISO-8859-1" ?>
<rss version="2.0">
<channel>
  <title>RSS の対象となる Web ページのタイトル</title>
  <link>RSS の対象となる Web ページの URL</link> 
  <description>RSS の対象となる Web ページの概要</description> 
  <language>言語(日本語の場合は ja-jp)</language> 
  <copyright>RSS の対象となる Web ページに関する著作権に関する情報</copyright> 
  <pubDate>RSS の対象となる Web ページの最終更新日時</pubDate> 
  <lastBuildDate>RSS ファイルの生成日時</lastBuildDate> 
  <docs>RSS ファイルの URL</docs>
  <generator>RSS ファイル生成ツール名</generator> 
  <managingEditor>RSS の対象となる Web ページの編集者のemailアドレス</managingEditor>
  <webMaster>RSS の対象となる Web ページの管理者のemailアドレス</webMaster>
  <image>
    <url>当該Web ページ、もしくは主宰者にちなむ画像のURL</url>
    <link&Web ページの URLgt;</link>
    <title>Web ページのタイトルもしくは主宰者の名前、など</title>
  </image>
  <item>
    <title>RSS 生成対象の 最初 の記事の 題名</title> 
    <link>RSS 生成対象の 最初 の記事の URL</link> 
    <description>RSS 生成対象の 最初 の記事の 概要</description> 
    <pubDate>RSS 生成対象の 最初 の記事の 最終更新日時</pubDate>
    <guid>RSS 生成対象の 最初 の記事を特定するための 識別子 または 固定リンク</guid>
  </item>
  <item>
    <title>RSS 生成対象の 2番目 の記事の 題名</title> 
    <link>RSS 生成対象の 2番目 の記事の URL</link> 
    <description>RSS 生成対象の 2番目 の記事の 概要</description> 
    <pubDate>RSS 生成対象の 2番目 の記事の 最終更新日時</pubDate>
    <guid>RSS 生成対象の 2番目 の記事を特定するための 識別子 または 固定リンク</guid>
  </item>
  ・・・・・・・・・・・・(略)・・・・・・・・・・・・
  <item>
    <title>RSS 生成対象の n番目 の記事の 題名</title> 
    <link>RSS 生成対象の n番目 の記事の URL</link> 
    <description>RSS 生成対象の n番目 の記事の 概要</description> 
    <pubDate>RSS 生成対象の n番目 の記事の 最終更新日時</pubDate>
    <guid>RSS 生成対象の n番目 の記事を特定するための 識別子 または 固定リンク</guid>
  </item>
</channel>
</rss>

入力ファイルに

<rss version="0.92">
<rss version="0.93">
<rss version="2.0">

という文字列のいずれかが含まれていたら、RSS 2.0 用のリーダで処理することにします。

RSS 2.0 のリーダー readRSS_2_00() を、これまた やっつけ (^^; で作ると、 以下のようになります。

続きを読む...

前回までで、RSS は一通り対応したことになります。最近は、RSS に対抗する(?)ものとして Atom が徐々に勢力範囲を拡大中です。 世の中の主要な RSS リーダも Atom 対応を謳うことが趨勢のようですので、 このコラムで製作中の RSS リーダも Atom に対応してみます。とりあえず、対応する版は Atom 0.3 とします (0.1 や 0.2 は、もはや obsolete と考えていいと思います。 また、Atom はかつて echo と呼ばれていましたが、その辺の話題は省略します)。

一般的に Atom 0.3 の xml ファイルは、以下のような形式をしています (注意: Atom 0.3 は rdf ではありませんダブリン・コアを取り入れたバリエーションもあります)。 また、Atom 0.3 は RSS 1.0 と同様、日時は ISO8601 形式です。
(実際には、もっといろんなバリエーションが可能なのですが、ここでは簡単のために最も一般的な例を示しています。)

<?xml version="1.0" encoding="utf-8"?>
<feed version="0.3" xmlns="http://purl.org/atom/ns#" xmlns:dc="http://purl.org/dc/elements/1.1/">
  <title>feed の対象となる Web ページのタイトル</title>
  <link rel="alternate" type="text/html" href="feed の対象となる Web ページのURL" />
  <id>feed の対象となる Web ページのユニークな識別子</id>
  <link rel="service.post" type="application/x.atom+xml" href="" title="feed の対象となる Web ページへ記事を投稿するための Atom API エンドポイント URL" />
  <modified>feed の最終更新日時</modified>
  <tagline>feed の対象となる Web ページのサブタイトル</tagline>
  <generator url="feed 生成ツールに関する URL" version="feed 生成ツールの版数">feed 生成ツールの名前</generator>
  <info type="application/xhtml+xml">
  <div xmlns="http://www.w3.org/1999/xhtml">This is an Atom formatted XML site feed. It is intended to be viewed in a Newsreader or syndicated to another site. </div>
  </info>

  <entry>
    <title>feed 生成対象の最初の記事の題名</title>
    <link rel="alternate" type="text/html" href="feed 生成対象の最初の記事の URL" />
    <link rel="service.edit" type="application/x.atom+xml" href="feed 生成対象の最初の記事の編集・再投稿用の Atom API エンドポイント URL" title="feed 生成対象の最初の記事の題名" />
    <id>feed 生成対象の最初の記事のユニークな識別子</id>
    <issued>feed 生成対象の最初の記事の投稿日時(現地時間)</issued>
    <modified>feed 生成対象の最初の記事の最終更新日時(協定世界時)</modified>
    <created>feed 生成対象の最初の記事の投稿日時(協定世界時間)</created>
    <summary>feed 生成対象の最初の記事の概要</summary>
    <author>
      <name>feed 生成対象の最初の記事の投稿者</name>
    </author>
    <dc:subject>feed 生成対象の最初の記事のカテゴリ・その1</dc:subject>
      ……………………………………………………
    <dc:subject>feed 生成対象の最初の記事のカテゴリ・そのm</dc:subject>
  </entry>
  <entry>
    <title>feed 生成対象の2番目の記事の題名</title>
    <link rel="alternate" type="text/html" href="feed 生成対象の2番目の記事の URL" />
    <link rel="service.edit" type="application/x.atom+xml" href="feed 生成対象の2番目の記事の編集・再投稿用の Atom API エンドポイント URL" title="feed 生成対象の2番目の記事の題名" />
    <id>feed 生成対象の2番目の記事のユニークな識別子</id>
    <issued>feed 生成対象の2番目の記事の投稿日時(現地時間)</issued>
    <modified>feed 生成対象の2番目の記事の最終更新日時(協定世界時)</modified>
    <created>feed 生成対象の2番目の記事の投稿日時(協定世界時間)</created>
    <summary>feed 生成対象の2番目の記事の概要</summary>
    <author>
      <name>feed 生成対象の2番目の記事の投稿者</name>
    </author>
    <dc:subject>feed 生成対象の2番目の記事のカテゴリ・その1</dc:subject>
      ……………………………………………………
    <dc:subject>feed 生成対象の2番目の記事のカテゴリ・そのm</dc:subject>
  </entry>
  ・・・・・・・・・・・・(略)・・・・・・・・・・・・
  <entry>
    <title>feed 生成対象のn番目の記事の題名</title>
    <link rel="alternate" type="text/html" href="feed 生成対象のn番目の記事の URL" />
    <link rel="service.edit" type="application/x.atom+xml" href="feed 生成対象のn番目の記事の編集・再投稿用の Atom API エンドポイント URL" title="feed 生成対象のn番目の記事の題名" />
    <id>feed 生成対象のn番目の記事のユニークな識別子</id>
    <issued>feed 生成対象のn番目の記事の投稿日時(現地時間)</issued>
    <modified>feed 生成対象のn番目の記事の最終更新日時(協定世界時)</modified>
    <created>feed 生成対象のn番目の記事の投稿日時(協定世界時間)</created>
    <summary>feed 生成対象のn番目の記事の概要</summary>
    <author>
      <name>feed 生成対象のn番目の記事の投稿者</name>
    </author>
    <dc:subject>feed 生成対象のn番目の記事のカテゴリ・その1</dc:subject>
      ……………………………………………………
    <dc:subject>feed 生成対象のn番目の記事のカテゴリ・そのm</dc:subject>
  </entry>
</feed>

資料室」の方にも書きましたが、 Atom は feed を行なうためだけのものではなく、blog/CMS ツールの管理用 API (Atom API) をも包含しています。すなわち、Atom API を使って、記事の投稿、編集などを行なうことができますが、 そのときに使用する URL のことを、 Atom API エンドポイント URL(もしくは、単にエンドポイント URL)といいます。 記事を投稿・編集するときは、この URL に対して、 規定のプロトコルでパケットを投げる(HTTP GET/POST/PUT/DELETE メソッドを使い分ける)ことになります。

Atom API および、その親戚筋(とはちょっと違うかもしれませんが)の XML-RPC API については、 現在連載中の「RSS リーダ編」以降に詳しく解説する予定です。お楽しみに。

話題を元に戻します。
入力ファイルに

<feed version="0.3" xmlns="http://purl.org/atom/ns#">

または

<feed version="0.3" xmlns="http://purl.org/atom/ns#" xmlns:dc="http://purl.org/dc/elements/1.1/">

という文字列のいずれかが含まれていたら、Atom 0.3 用のリーダで処理すれば OK です。 ここでは、簡単のため、

<feed version="0.3"

という文字列と "Atom" という文字列を同時に含む行があれば、Atom 0.3 として処理することにします。

上記の方針に基づき、Atom 0.3 のリーダー readRSS_0_3() を作ると、以下のようになります。

続きを読む...

[→ 第6回以降を見る]

目次

第1回 RSSリーダを作ってみる 巻の1
まずは所信表明。
第2回 RSSリーダを作ってみる 巻の2
RSS 1.0 のリーダーを作成します
第3回 RSSリーダを作ってみる 巻の3
RSS 0.91 のリーダーを作成します
第4回 RSSリーダを作ってみる 巻の4
RSS 2.0 のリーダーを作成します
第5回 RSSリーダを作ってみる 巻の5
Atom 0.3 のリーダーを作成します
第6回 RSSリーダを作ってみる 巻の6
ユーティリティ関数を用意します
第7回 RSSリーダを作ってみる 巻の7
リファクタリングを開始します

RSS とは?

今後の予定

第8回 RSSリーダを作ってみる 巻の8
さらにリファクタリングしてみます
第9回 RSSリーダを作ってみる 巻の9
どんどんリファクタリングします


Copyright (c) 2003, 2004, 2010 OKI Software Co., Ltd.