前回の『ブログシステムの知られざる知識を明かす(二)』では、ブログの基本機能設計のポイントを紹介しました。今回はブログのプロトコルや標準について説明します。
目次
記事が長いため、4回に分けて公開します。目次は以下の通りです。
- 「ブログ」の前世と今生
- 私のブログ物語
- ブログの読者層は誰か?
- ブログ基本機能設計の要点
- 4.1 記事(Post)
- 4.2 コメント(Comment)
- 4.3 カテゴリ(Category)
- 4.4 タグ(Tag)
- 4.5 アーカイブ(Archive)
- 4.6 ページ(Page)
- 4.7 購読
- 4.8 バージョン管理
- 4.9 テーマとカスタマイズ
- 4.10 ユーザーと権限
- 4.11 プラグイン
- 4.12 画像・添付ファイルの処理
- 4.13 禁止ワードフィルタとコメント審査
- 4.14 静的化
- 4.15 通知システム
- ブログのプロトコルまたは標準
- 5.1 RSS
- 5.2 ATOM
- 5.3 OPML
- 5.4 APML
- 5.5 FOAF
- 5.6 BlogML
- 5.7 Open Search
- 5.8 Pingback
- 5.9 Trackback
- 5.10 MetaWeblog
- 5.11 RSD
- 5.12 リーダービュー
- ブログシステム設計の知識ポイント
- 6.1 タイムゾーンは本当にすべてUTC?
- 6.2 HTML それとも Markdown
- 6.3 MVC それとも SPA
- 6.4 セキュリティ
- おわりに
5.1 丨 RSS
RSS(Really Simple Syndication)はXMLベースの標準規格で、ブログを含むコンテンツ系ウェブサイトに広く普及しています。Dave Winerによって1999年に発明され、少年コンピュータ天才Aaron Swartzが仕様の定義に参加しました。残念ながら彼は2013年1月に自殺し、わずか26歳でした。
RSSはブログシステムの中でも最も象徴的な特徴の一つであり、ブログにおけるその普及度は事実上の標準となっています。RSSのないブログシステムは、カメラのない携帯電話を見るのと同じくらい興味深いものです。
RSSファイルの拡張子は通常.rssまたは.xmlですが、拡張子を定義しないこともあります(MoongladeのRSSなど)。内容は最近のブログ記事のXML記述で、タイトル、日時、著者、カテゴリ、要約(全文でも可)などの情報が含まれます。

RSSは機械向けに書かれており、ウェブサイト間でのコンテンツ同期に使用できます。例えば、かつての人々ネット(元校内网)はRSSを使ってブログ記事を日記としてインポートできました。一般ユーザーにとっては、ブログを購読するためにRSSリーダーアプリが必要です。通常、そのようなリーダーには一人の著者のブログだけでなく、そのユーザーが関心を持つすべてのブログが登録されます。リーダーは通常、クロスプラットフォームかつデバイスをまたがるもので、ユーザーはパソコン、タブレット、スマートフォン、さらにはラズベリーパイでもRSSフィードを購読できます。


一部のブラウザ(初期のFirefoxなど)は、ブログのRSSアドレスを自動認識し、ブラウザ内で購読できます。その自動発見の仕組みは、ページのhead内に次のようなものがあるかどうかを探すことです:
<link rel="alternate" type="application/rss+xml" title="Edi Wang" href="/rss" />
しかしRSSには欠点があり、サーバーからクライアントへ能動的にプッシュできず、クライアントがサーバーから自動的に取得する必要があります。過去10年の間に、モバイルの台頭によりプッシュ通知サービスがRSSの欠点を補い、各プラットフォームが独自のモバイルアプリをほぼ提供するようになったため、RSSは多くのサイトで廃止されました。しかしRSSが無用になったわけではなく、現在でも多数のサイトがRSS購読を提供しています。例えば、Microsoft Channel 9のRSS: https://channel9.msdn.com/Feeds/RSS/、中国国内の博客園のRSS:http://feed.cnblogs.com/blog/sitehome/rss。面白いことに、博客園のサイトロゴは実はRSSアイコンです。
ブログシステムを構築する場合、通常わざわざモバイルアプリを作ることはなく、ユーザーもブログごとに個別のアプリをダウンロードしません。また、ブログシステムは他のブログやウェブサイトと同期する必要があり、そのたびに独自の同期プロトコルを開発することは不可能です。誰もが認める標準であるRSSを依然として利用するため、RSSは2020年においてもブログシステムが記事を配信する最良の手段です。
参考:https://en.wikipedia.org/wiki/RSS
5.2 丨 ATOM
ATOMはRSSとほぼ同じ役割を持ちますが、ATOMはRSSの設計上の欠点を補うために登場しました。例えば、記事の公開日時について、ATOMはRFC 3339タイムスタンプを使用するのに対し、RSSはRFC 822標準を使用します。ATOMは記事の言語を識別でき、ペイロードにRSSでは許可されないXHTML、XML、Base64エンコードコンテンツなどを含めることができます。
多くのブログシステム(私のMoongladeも含む)はRSSとATOMの両方のフィードを提供しています。
参考リンク:https://en.wikipedia.org/wiki/Atom_(Web_standard)
5.3 丨 OPML
「OPML(Outline Processor Markup Language)はアウトライン用のXMLフォーマットです(「各ノードが文字列値を持つ名前付き属性のセットを持つツリー」として定義されます)。もともとUserLand社が自社製品Radio UserLandにおいてアウトラインアプリケーションのネイティブファイル形式として開発しましたが、その後、他の用途、特にWebフィードアグリゲーター間でWebフィードリストを交換するために使用されています。
OPML仕様はアウトラインを任意の要素の階層構造、順序付きリストとして定義します。仕様はかなりオープンであるため、多くの種類のリストデータに適用できます。
Mozilla Thunderbirdや多くの他のRSSリーダーサイト、アプリケーションはOPML形式でのRSSフィードリストのインポート・エクスポートをサポートしています。」
参考:https://en.wikipedia.org/wiki/OPML
わかりやすく言うと、ブログにとってOPMLは、このブログにどのような購読フィードがあり、それぞれの購読アドレスは何かをリーダーに伝えるものです。通常、各記事カテゴリが1つの購読フィードとなり、全記事も1つの購読フィードになります。

5.4 丨 APML
APMLはAttention Profiling Mark-up Languageの略で、OPMLよりもさらに知られていません。APMLは現在インターネット上では非常に珍しくなっており、WPよりも残念な状況です。ブログ業界の歴史的な遺産の一つとして、懐かしさを込めて簡単に紹介します。
OPMLと同様に、これもXML形式の宣言ファイルで、個人が関心を持つ事柄やトピックを記述し、他の読者やブロガーと共有するために使用されます。リーダーやブログシステム自身がユーザーの関心に基づいたサービスや、よりターゲットを絞った広告を提供するのに役立ちます。
参考リンク:https://en.wikipedia.org/wiki/Attention_Profiling_Mark-up_Language
WordPressはプラグインでAPMLを実現でき、BlogEngineはAPMLを標準搭載しています。私のMoongladeはAPMLをサポートしていません。
5.5 丨 FOAF
FOAFはFriend of a Friendの略で、これも機械向けのファイルであり、人間の社会的関係を記述します。ブログでは、FOAFを使ってブロガーと他のブログとの間の「友情リンク」を表現できます。ただし、この友情リンクは機械向けに書かれています。これにより、機械は誰があなたの友人かを理解し、読者に友人のブログコンテンツを推薦できるようになります。
WordPressはプラグインでFOAFを実現でき、BlogEngineはFOAFを標準搭載しています。私のMoongladeはFOAFをサポートしていません。FOAFとAPMLの現状はほぼ同じで、絶滅寸前です。
参考リンク:https://en.wikipedia.org/wiki/FOAF_(ontology)
5.6 丨 BlogML
BlogMLはクロスブログシステムのデータ標準のセットです。BlogMLを実装したブログシステムは、言語やプラットフォームが異なっていても、記事などのデータを相互にインポート・エクスポートできます。ちょうどHTML5が標準であり、Edge、Chrome、Firefoxがブラウザであるように、HTML5向けに書かれたウェブページはこれらすべてのブラウザで動作します。
BlogMLも.NETコミュニティで誕生し、その後標準へと発展しました。BlogML自体.NETのBlogEngineなどのシステムだけでなく、PHPで書かれたWordPressもBlogMLをサポートしています。当時BlogMLをサポートしていたのは、Windows Live Spaces、Subtext、DasBlogなどです。私のMoongladeはBlogMLをサポートしていません。
現在のBlogMLの標準スキーマは2.0で、2006年11月25日に更新されました。この標準ももう…
参考:https://en.wikipedia.org/wiki/BlogML
5.7 丨 Open Search
ブログがOpen Search仕様を実装していると、ブログの検索機能が自動的にユーザーのブラウザに統合され、ユーザーはブラウザのアドレスバーからあなたのブログの検索サービスを検索エンジン(BingやGoogleのように)として直接使用できるようになります。

Open Searchの実装は2ステップです。まず、ページのheadにopensearch定義ファイルへのリンクを追加します。
<link
type="application/opensearchdescription+xml"
rel="search"
title="Edi Wang"
href="/opensearch"
/>
次に、opensearchファイルを出力します。
<OpenSearchDescription xmlns="http://a9.com/-/spec/opensearch/1.1/">
<ShortName>Edi Wang</ShortName>
<Description>Latest posts from Edi Wang</Description>
<image height="16" width="16" type="image/vnd.microsoft.icon"
>https://edi.wang/favicon.ico</image
>
<Url type="text/html" template="https://edi.wang/search/{searchTerms}" />
</OpenSearchDescription>
このファイルは、ブログの名前、説明、アイコン、検索URLパターンを記述します。ブラウザがこのファイルを認識すると、自動的にあなたのブログを検索エンジンリストに登録します。すると読者はブラウザのアドレスバーに直接キーワードを入力し、ブログ独自の検索結果ページを表示できるようになります。


Open Searchの具体的な仕様と標準は、https://en.wikipedia.org/wiki/OpenSearchを参照してください。
5.8 丨 Pingback
Pingbackはブログシステム間の通信に使用されます。自分の記事が他人に引用されるとpingbackリクエストを受信し、自分が他人の記事を引用すると相手のブログにpingbackリクエストを送信します。したがって、1回のPingbackを完了するには、自分と相手のブログがともにpingbackプロトコルをサポートしている必要があります。標準プロトコルであるため、pingbackは両方のブログが同じブログ製品を使用している必要はありません。例えば、.NET Coreで書かれた私のMoongladeはPHPで書かれたWordPressと完全に相互にpingできます。Pingbackはサイトの種類がブログである必要もなく、どんなCMSやコンテンツサイトでもPingbackをサポートすることは問題ありません。
Pingbackの技術原理は複雑ではありません。
Pingbackリクエストの送信:
自分の記事URL A、相手の引用された記事URL Bを取得し、Bにリクエストを送信してpingbackエンドポイントがあるかどうかを確認します。もしあれば、次のXMLを含むHTTP Requestを構築します。
<methodCall>
<methodName>pingback.ping</methodName>
<param>
<param><value><string>A</string></value></param>
<param><value><string>B</string></value></param>
</param>
</methodCall>
これにより、BのあるサイトはAの記事がBを参照していることを認識します。Pingbackを処理した後、Aのサイトに成功か失敗かのレスポンスを返します。

Pingbackリクエストの受信:
自分の記事URL Aが他人の記事Bに引用され、pingback XMLを受信します。まず、セキュリティのために、受信したpingbackリクエストが怪しい形をしていないか検証します。例えば、正しいmethodNameがあるか、双方のURLが有効か、URLが正常にアクセスできるか、奇妙なURL(localhostや攻撃の可能性がある特殊な構造)ではないかなどを確認します。Pingbackリクエストに問題がなければ、Bのページにリクエストを送信し、Bページのタイトル、BのIPアドレスを取得し、自分のデータベースに記録して、Aの記事に関連付けます。
受信したPingbackは通常、システムの自動コメントとして記事の下に追加されますが、これは仕様の一部ではありません。自由に実装できます。例えば、MoongladeではPingbackをまとめてバックエンドでブログ管理者が確認できるようにしています。

参考:https://en.wikipedia.org/wiki/Pingback
5.9 丨 Trackback
Trackbackは、あるウェブサイトが別のウェブサイトに更新を通知できるようにします。これは、誰かが自分の文書の一つにリンクしたときに通知を要求する4種類のリンク方法の1つです。これにより、著者は自分の記事に誰がリンクしているかを追跡できます。
参考:https://en.wikipedia.org/wiki/Trackback
機能はPingbackと似ていますが、Trackbackは通常手動で送信する必要があり、相手に記事の要約を提供する必要があります。一方、Pingbackのプロセスは双方のブログシステムが共同で行う完全自動操作です。
5.10 丨 MetaWeblog
MetaWeblogはXML-RPCベースのWebサービスで、一連の標準インターフェースを定義しており、記事、カテゴリ、タグなどブログの一般的なコンテンツのCRUD(作成、読み取り、更新、削除)を可能にします。これらのインターフェースを実装したブログシステムでは、ブロガーはブラウザでブログの管理画面にログインしなくても、コンピューターにインストールされたクライアントを使ってブログを書くことができます。主要なクライアントにはWindows Live WriterやMicrosoft Wordがあります。クライアントでは、記事の編集、画像の挿入、カテゴリの設定、さらにはブログのテーマをクライアントに同期させることも完全に行えます。
これも時代遅れのブログプロトコルのように見えるかもしれませんが、2020年の今日でも、最新のMicrosoft 365スイートはMetaWeblog APIを実装したブログシステムを完全にサポートしています。

MetaWeblogと類似したブログAPIとしては、Blogger API、Atom Publishing Protocol、Micropubなどがあります。
参考:https://en.wikipedia.org/wiki/MetaWeblog
私のブログは2012年にかつて996 007でMetaWeblog + RSDを完全実装しましたが、今は30歳になり、.NET Coreではこれを実装する予定は今のところありません。そもそも今どれだけの人がLive WriterやWordでブログを書いているでしょうか(泣)。
5.11 丨 RSD
Really Simple Discovery(RSD)はXML形式と公開規約であり、ブログやその他のWebソフトウェアが公開するサービスをクライアントソフトウェアが発見できるようにするためのものです。これは、編集/ブログソフトウェアの設定に必要な情報を、ユーザー名、パスワード、ホームページURLという3つのよく知られた要素に減らす方法です。その他の重要な設定は、サイトに関連付けられたRSDファイルで定義されるか、提供された情報を使用して発見できます。
RSDを使用するために、サイトの所有者はトップページのheadにRSDファイルの場所を示すリンクタグを配置します。MediaWikiで使用される例:
<link
rel="EditURI"
type="application/rsd+xml"
href="https://en.wikipedia.org/w/api.php?action=rsd"
/>
そして、RSDファイルでさまざまなAPIのインターフェースを示します。
<?xml version="1.0"?>
<rsd version="1.0" xmlns="http://archipelago.phrasewise.com/rsd">
<service>
<apis>
<api name="MediaWiki" preferred="true" apiLink="http://en.wikipedia.org/w/api.php" blogID="">
<settings>
<docs xml:space="preserve">http://mediawiki.org/wiki/API</docs>
<setting name="OAuth" xml:space="preserve">false</setting>
</settings>
</api>
</apis>
<engineName xml:space="preserve">MediaWiki</engineName>
<engineLink xml:space="preserve">http://www.mediawiki.org/</engineLink>
</service>
</rsd>
参考:https://en.wikipedia.org/wiki/Really_Simple_Discovery
RSDはほとんどの場合、上記のMetaWeblogインターフェースと組み合わせて使用されます。これにより、Windows Live WriterやMicrosoft WordなどのツールがブログのMetaWeblogサービスを自動検出できるようになり、手動でURLを入力する必要がなくなります。
5.12 リーダービュー
ほとんどのブラウザとクライアントにはリーダービューがあり、読者はブログサイトのページスタイルとは完全に異なるビューで記事を読むことができます。例えば、私のブログのある記事の通常ページはこんな感じです:

ブラウザが私のブログがリーダービューをサポートしていることを認識すると、没入型読書ボタンが点灯します。

没入型読書インターフェースに入ると、ブラウザは自動的に記事の内容を抽出し、記事のタイトル、セクション、画像を認識し、ナビゲーションバー、サイドバーなど記事に関係のない要素を除去し、ユーザーがテキストサイズや背景色を制御したり、記事の内容を読み上げたりすることもできます。

私のブログだけでなく、適切に設計されたブログやニュースコンテンツサイトにはリーダービューがあります。例えば、Azureの:

さらに、リーダービューをサポートしているサイトは、SEOも決して悪くありません。したがって、ブログシステムを設計する際は、リーダービューのサポートを検討してください。
次回は主に【ブログシステム設計の知識ポイント】を紹介します。ご期待ください。
