pubDate で JST を指定し日本の現地時刻で RSS2.0 を作成した場合、 Akregator が9時間未来の記事として表示する問題について、いろいろ調べてみた。

結局、時差の指定部分は GMT でなければ日時を正常に認識しないということが分かった。

そこで、記事の日時の UNIX タイムスタンプを、 gmmktime() で一旦 GMT でのタイムスタンプに変換し、そのタイムスタンプを strftime() に渡すようにしてみたが、作成された日時に変化がなかった。

おかしいな、と思い、調べてみたところ、私の使っているサーバは setlocale() に 0 (失敗)を返すことが分かった。

setlocale(LC_ALL, 0) などとして現在のロケールを取得してみたが、帰ってきたのは "C" だけだった。

どうしようもないので、 setlocale() に失敗するサーバの場合の処理として、記事の UNIX タイムスタンプから、予め定義しておいた定数分だけ固定で差し引きし strftime() に渡すようにした。時差を表す表記部分も、 %Z が指定されていたら GMT に置き換えるようにした。なんのための setlocale(), strftime() なのかさっぱり分からなくなってしまったが、しょうがない。

とりあえず、これで Akregator は今度こそ正しい公開日時を表示してくれるようになった。

それにしても、時差の表記に GMT しか使えないのは、 RSS2.0 の pubDate の仕様なのだろうか。それとも、RSSフィードリーダの実装上の怠慢なのだろうか。

本来ならば、読み取った時差の表記に従って、一旦 GMT での日時に変換し、起動しているフィード・リーダが現在取得したロケールでの日時に変換し表示する、という処理が正しいのではなかろうか。

ちなみに、前の記事で書いた、

そこで、ちょっと考えて、 "en_JP.utf8" と記述してみたら、見事英語で日本の時差で表示してくれた。ネットで検索しても、このような表記についての説明は皆無だったが、ロケールの表現方法が、「言語_地域.エンコード」という形式であることから試してみたのだが、 PHP7 はしっかり対応してくれていた。 PHP7 さすがである。

だが、単に setlocale() はエラーを返し、もともと英語表記だったので曜日部分も Sun と表示されただけのようだ。 ja_JP.utf8 を指定した場合に曜日部分が「日」と表示されたのは、 setlocale() の指定ができないサーバ用に自前で日本語表記に置き換えるよう rNote がもとからもっていたコードによって表示されていた。

この記事のリンク元 | 9 | 8 |

この記事のリンク用URL&トラックバックURL : https://red-souls.jp/ichounoki/rnote/works/software/20190819_095325157109.htm


rNote にもとから実装されている RSS1.0 では、 Dublin Core の名前空間 dc:date で日時の指定をしていた。

RSS2.0 のフィードも、同じやり方で Akregator は認識してくれたが、正しくは pubDate というタグで指定するようだ。

RSS 2.0 Specification 日本語訳」によると、このタグは、 "Sun, 20 Jan 2019 12:00:00 JST" のような形式で日時を指定するそうなので、この要素で記事の公開日時を指定するように修正した。

rNote は、スキン内に Date タグを記述し、日時の表示フォーマットを指定することで、指定の形式で記事の投稿日時を出力してくれる。そこで、 fmt="%a, %e %b %Y %H:%M:%S %Z" とオプションを指定したのだが、出力結果の曜日が日本語の漢字で「日」と表示されてしまった。これは、 rNote 内でこの処理に使われている strftime() が、 setlocale() で設定されている現在のロケールに従って日時の表示を行うためだが、 rNote を普通に使用するとサーバのロケールが日本語に指定されるため、このような結果となる。

しかしこれではまずいので、曜日は英語の省略形式で表示しなくてはならない。

よく調べてみると、rNote のスキン用 Date タグは locale オプションも指定できるのが分かった。

ただ、 "ja_JP.utf8" を、英語表記にするために "en_US.utf8" としたら、時刻もずれてしまう。

そこで、ちょっと考えて、 "en_JP.utf8" と記述してみたら、見事英語で日本の時差で表示してくれた。ネットで検索しても、このような表記についての説明は皆無だったが、ロケールの表現方法が、「言語_地域.エンコード」という形式であることから試してみたのだが、 PHP7 はしっかり対応してくれていた。 PHP7 さすがである。

というわけで、 RSS2.0 用のスキンでの日時表示の部分は、下のようになった。

<pubDate><%=$Date fmt="%a, %e %b %Y %H:%M:%S %Z" locale="en_JP.utf8"%></pubDate>

これで正しい日時をフィードリーダに伝えることができるようになった。

・・・と思ったのだが、 Akregator が示す日時が9時間未来になってしまった。

RSS1.0 フィード( dc:date を使用)の方は +09:00 が日時に付記されているが9時間未来にはなっていない。ということは、 dc:date の方は地方時と Akregator 自身が取得した locale を元に正しい日時を表示できているということだ。 RSS2.0 の pubDate の方の処理がバグをもっているのかも知れない。 RSS2.0 フィードとしては正しい日時が出力できているので特に修正はしないでおく。

この記事のリンク元 | 9 | 8 |

この記事のリンク用URL&トラックバックURL : https://red-souls.jp/ichounoki/rnote/works/software/20190818_192232648721.htm

キーワード: rNote RSS2.0 pubDate


rNote では最初から RSS のフォードの生成機能が備わっている。そのバージョンは RSS1.0 だ。

これまでは特に問題を感じていなかったのだが、 KDE のフィードリーダ Akregator に当サイトのフィードを追加してみたところ、記事一覧の作者の表示がされなかった。

各記事に dc:creator を追加してみるなどいろいろやってみたのだがだめだったので、多分 RSS2.0 形式なら作者も表示されるだろうと推測し、 rNote に RSS2.0 のフィード生成機能を追加した。

プラグインとして実装できるかな、と思ったのだが、 RSS の生成時に RSS 用のスキンが使用され、 RSS 用スキンのための置換文字列の処理が rNote 本体に実装されているので、この部分をプラグイン化して外部に出さない限り無理だと分かった。なので、とりあえず rNote 本体に処理を追加する形で実現した。

追加したファイル:

rss2_body.skin, rss2_item.skin

修正したファイル:

rnote_config.php( FNAME_RSS2, MAX_DESCRIPTION_RSS2, FNAME_SKIN_RSS2 の3つの定数を追加した。)

rnote.php( CreateRSS2() を追加し、AdminMode() 内で CreateRSS() に続き CreateRSS2() を呼ぶようにした。 CreateHTML() 内に、スキン用のタグとして rss2_url を置換する処理を追加した。)

html_side.skin( RSS2 のフィードへのリンクを追加した。)

RSS2.0 の記述の仕方やフィードのファイル名の付け方については、「RSSのフォーマット・仕様・構造 - RSS1.0、RSS2.0、Content-Type」や「横着者のRSS 2.0 配信ページの作成方法」が参考になった。

試したところ、 Akregaror で問題なく作者が表示されるようになった。

この記事のリンク元 | 9 | 8 | 1 |

この記事のリンク用URL&トラックバックURL : https://red-souls.jp/ichounoki/rnote/works/software/20190818_160607538729.htm

キーワード: RSS2.0 rNote


管理画面の「動作設定」

管理画面の「動作設定」各項目について説明します。

キャッシュ関係の設定

  • If-Modified-Sinceに応答…ブラウザやプロキシのキャッシュ制御を行うかどうかの設定です。
  • ページキャッシュを生成…ページの生成結果をページキャッシュとしてサーバーに保存するかどうかの設定です。
  • キャッシュするページ数…ページキャッシュを生成する場合に、保存するページの最大数を設定します。

rNote-re での If-Modified-Since について

If-Modified-Since は、ブラウザからサーバに送るリクエストヘッダに付記される項目です。ブラウザのキャッシュが作られた日時を送信します。

この項目が設定されていた場合、サーバは、送られてきた日時以降にページの内容が更新されていた場合のみ、新しいページを送信します。(200を送信)

rNote-re では、更新されたページの内容が既にサーバにキャッシュとして存在している場合は、そのキャッシュを送ります。まだキャッシュが作られていない場合は新たにキャッシュを作りページを送信します。

送られてきた日時以降にページの内容が変わっていなかった場合は、新しいページは送信しません。(304を送信)

rNote-re では、この仕組みを使用することで、不要な場合はキャッシュの生成やデータの送信を省略することができ、サーバからの応答性を向上することができます。

その他の設定

  • 最近のコメント等のログ保存数…最近のコメント等のログの保存数の最大値を設定します。
  • 携帯用ページをテスト…現在使用しているブラウザでサイトにアクセスした時に、携帯用のページを表示することで、携帯用ページの表示テストを行うことができます。
  • コメントを承認制にする…コメントが送信された時に管理者の承認を待つか、承認を待たず即時公開するかの設定です。

設定状態の保存方法

「携帯用ページをテスト」の設定状態は、使用中のブラウザの動作を変更させるために cookie に保存されます。その他の設定状態は SITE_TOP/cache/config.ini に保存されます。


rNote-re のインストール

設定ファイルを編集し設定する

テキストディタで rnote_config.php を開き、下の項目を設定します。

  • SITE_TITLE…サイトのタイトルです。
  • SITE_AUTHOR…サイトのオーナーの名前です。
  • SITE_URL…サイトのURLです。
  • ADMIN_ID…管理者のIDです。
  • ADMIN_PASSWORD…管理者のパスワードです。
  • USE_MOD_REWRITE… apache の mod_rewrite を使用し rnote.php を隠蔽する場合は true にします。
  • EVAL_ENABLE…スキン内で php スプリクトを実行する場合は true にします。
  • DATETIME_FORMAT…日付時刻表示のフォーマットです。
  • $dir_access_enable[]…外部から書き込みを許可するディレクトリをこの配列の要素にに指定します。
  • $nodisp_at_toplv[]…トップレベルには表示したくないカテゴリのカテゴリキーをこの配列の要素に指定します。
  • $category_name[]…カテゴリキー・カテゴリ名の連想配列です。 $category_name['key']='name'; のように指定します。
  • $category_key[]…カテゴリキーの配列です。
  • $XR_USER… XML-RPC クライアントからログインできるユーザを指定します。 renote_config.php のサンプルを参考に指定してください。
  • XR_FTP_HOST… XML-RPC API でサーバ上のディレクトリ・ファイルを操作する際に FTP のアカウントで行う必要がある場合に設定します。
  • XR_FTP_USER… XML-RPC API でサーバ上のディレクトリ・ファイルを操作する際に FTP のアカウントで行う必要がある場合に設定します。
  • XR_FTP_PW… XML-RPC API でサーバ上のディレクトリ・ファイルを操作する際に FTP のアカウントで行う必要がある場合に設定します。
  • XR_FTP_ROOT_DIR… XML-RPC API でサーバ上のディレクトリ・ファイルを操作する際に FTP のアカウントで行う必要がある場合に設定します。
  • XR_FTP_DIR… XML-RPC API でサーバ上のディレクトリ・ファイルを操作する際に FTP のアカウントで行う必要がある場合に設定します。
  • XR_FTP_DUMMY_DIR… XML-RPC API でサーバ上のディレクトリ・ファイルを操作する際に FTP のアカウントで行う必要がある場合に設定します。

ディレクトリとファイルの配置

下のとおりにディレクトリ、ファイルを用意します。( SITE_HOME を rNote-re のトップディレクトリとします。)

ディレクトリ:

  • SITE_HOME/entries/ この下にディレクトリをきってカテゴリを表現し、記事を投稿します。スキン、コメントやトラックバック等のログもここです。
  • SITE_HOME/plugins/ プラグインのファイルはこのディレクトリの中に用意します。
  • SITE_HOME/rnoteadmin/ 管理者画面用のディレクトリです。
  • SITE_HOME/style/ style-sites.css など、サイトのデザインに関わるファイルが置かれるディレクトリです。
  • SITE_HOME/cache/ サイトのキャッシュが生成されるディレクトリです。

ファイル:

  • SITE_HOME/rnote.php ブログのプログラム本体です。
  • SITE_HOME/rnoteadmin.php 管理者画面用ツールです。
  • SITE_HOME/rnote_config.php rnote.php などから参照される初期設定ファイルです。
  • SITE_HOME/rn_xmlrpc.php XML-RPC クライアントから利用するファイルです。
  • SITE_HOME/rss.rdf RSSファイルです。(自動生成されます。)
  • SITE_HOME/rnoteadmin/config.php 管理画面の「動作設定」プラグインです。
  • SITE_HOME/rnoteadmin/rnotepad.php 管理画面の「エディタ」プラグインです。
  • SITE_HOME/rnoteadmin/wb_log.php 管理画面の「ログ表示」プラグインです。
  • SITE_HOME/rnoteadmin/tb_tool.php 管理画面の「トラバ」プラグインです。
  • SITE_HOME/rnoteadmin/entries_list.php 管理画面の「エントリ一覧」プラグインです。
  • SITE_HOME/rnoteadmin/cmntcnfm.php 管理画面の「コメント承認」プラグインです。
  • SITE_HOME/rnoteadmin/access_log.php 管理画面の「アクセスログ」プラグインです。

パーミッションの設定

  • entries/ と、その中の全ディレクトリ…(0777)
  • cache/ ディレクトリ…(0777)
  • rss.rdf…(0666)
  • rnote.php… CGI版PHP で動作させる場合実行権限をつけておく。
  • rnoteadmin.php… CGI版PHP で動作させる場合実行権限をつけておく。

初回起動時の操作

ディレクトリの作成、ファイルのアップロード、パーミッションの設定が済んだら、まず最初に再構築を行います。

ブラウザで、管理者ツール(rnoteadmin.php)を実行し、管理画面を表示してください。初回なので、管理者ツールにログインする際に、IDとパスワードを入力する必要があります。 rnote_config.php に設定した管理者IDとパスワードを入力してください。

無事起動したら、「再構築」ボタンを押します。特にワーニングなどが出ず、「キャッシュファイルの再構築とRSS生成を終了しました。」と表示されれば、インストールは無事完了です。「サイト表示」ボタンを押し、ブログが表示されることを確認してください。

初回起動後も、新規記事の追加、カテゴリ追加削除、スキンの変更等々、何か変更を加えたら必ず再構築を行ってください。これを行わないと、ブログを表示したときに変更した内容が反映されません。(再構築は管理者ツールからだけでなく、ブラウザから rnote.php?mode=admin と指定してサイトを表示しても行うことが出来ます。)

バックアップ

サーバーのトラブルに備えたバックアップの方法は、entries/ ディレクトリ以下を丸ごと保存しておくとよいでしょう。( SITE_HOME/cache/ ディレクトリの中身はバックアップする必要はありません。レストアしたときに改めて再構築すればOKです。)

バックアップしてあったファイルをサーバに戻したときは、記事のログファイル( xxx.log と xxx_ref.log)のパーミッションを (0666) にして書き込み権限を加えておいてください。忘れると当該記事にコメントや追記が出来ません。