なぜ XHTML5 にしたかというと、 rnotepad.php (記事投稿エディタ)で、「投稿」ボタンが押されたときに、日付などの入力欄の入力チェックがしたかったからだ。

とりあえずやってみた感想だが、 input タグの要素に pattern で正規表現を使って入力してよい値を指定するのだが、それだけだと、未入力の場合素通りしてしまう。 required 要素も一緒に指定しておく必要がある。検索して見つけたサイトは、その注意点が漏れていた。

あと、 pattern で指定した形式ではなかった場合、「投稿」ボタンを押すと、「Please match the requested format.」( firefox )や「指定されている形式で入力してください。」( chrome )といったメッセージがツールチップ形式で表示されるのだが、どのような形式にする必要があるかは教えてくれないのだ。

こういう場合、例えば時刻であれば「00〜23を入力してください。」とツールチップに表示したいのだが、それができないので、 HTML5 の入力チェックは、いまいち役に立たないことが分かった。

今の HTML5 の入力チェック方式であれば、例えばフォームの入力欄付近にどのような形式で入力するかを正確に表示しておく必要があるが、これでは非常にうっとうしい状態になってしまう。やはり、ちゃんとやりたければ javascript などでごりごり書かないといけないようだ。もう一度言うが HTML5 の入力チェックは、「いまいち」なのである。

ちなみに、今回の作業で XHTML5 などというものが存在することを初めて知った。

rNote で使用されている xhtml1.1 との相違点が正確に知りたいところなのだが、ぱっと検索してみた限りでは、情報を発見できなかった。見つかったのは、ヘッダ部分の記述の例が少しと、 HTML5 の DOM のシリアライズに2種類あって、1つが HTML5 でもう一つが XHTML5 だという説明だけだった。各ブラウザの対応状況なども見つからなかったが、とりあえず firefox ではなんとなく動作しているようだ。

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

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


rnotepad.php を修正 2019-08-24 (土) 22:54:45+09:00

冬星のソフトウェア

先日、 XML-RPC API を用いて、サーバから自分のサーバに向けて通信を行い、カテゴリの情報を取得するようにしたが、それをやめた。

rnoteadmin.php では、各プラグインからの出力を表示する直前にブラウザに向けて header() を用いて HTML ヘッダを送信しているのだが、 XML-RPC API を用いた通信を行うと、 header() が実行される前にプラグインが呼び出されたときに通信が実行されるが、そのとき送信されるヘッダとブラウザに向けて header() で送信されるヘッダが同一視されるようで、 rnoteadmin.php で header() を実行したときに「既にヘッダは送信済みです」という warning がどうしても消せないため、うっとうしいので XML-RPC を使ってカテゴリを取得するのをやめた。

XML-RPC API を使用したのは、 rnotepad.php 内でカテゴリの配列を直書きしてしまうと、 rnote.php と二重管理になってしまい汚らしいしカテゴリを修正するたび、両方を修正しないといけなくなるから、という理由からだった。そこで、実際にカテゴリの配列が定義されている rnote_config.php の配列から情報を読み取って rnotepad.php でも使用するようにしたので、この方法でも問題は解決されている。

この修正のついでに、最近の記事の日時がおかしかったのを修正した。

原因は、レンタルサーバのコントロールパネルから「PHP設定の編集」に値を設定したのだが、ここに値を設定すると、 PHP が取得するタイムゾーンが UTC になってしまうようで、そのためだった。同じ場所に date.timezone = 'Asia.Tokyo' も追加して解決した。

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

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

キーワード: rNote rnotepad.php


さくらのレンタルサーバには pear がインストールされているのだが、権限がないのでパッケージを追加するなど操作することが一切できない。

それでは全く使いものにならないので、自分で pear をインストールする方法をネットで手順を検索してみたのだが、「 pear の公式サイトの go-pear はうまく動作しなくなっていてエラーが出るので(そのサイトに独自に)保存してあるアーカイブをダウンロードしてインストールする」とか、「 go-pear.php をダウンロードして実行する」とか、なんだか変なことばかり書いてあるので、参考にするのはやめて、 pear の公式サイトをたどってみた。

pear の公式サイトの url を開き、「installing PEAR on your system」のリンク先を開き、「Getting and installing the PEAR package manager」のリンク先を開く。

すると、「Unix/Linux/BSD」のセクションに、

$ wget http://pear.php.net/go-pear.phar

$ php go-pear.phar

とするように書いてある。特に問題もなく go-pear.phar がダウンロードされ、実行する。

1. Installation base ($prefix) : /home/***/pear

2. Temporary directory for processing : /tmp/pear/install

3. Temporary directory for downloads : /tmp/pear/install

4. Binaries directory : /home/***/pear/bin

5. PHP code directory ($php_dir) : /home/***/pear/share/pear

6. Documentation directory : /home/***/pear/docs

7. Data directory : /home/***/pear/data

8. User-modifiable configuration files directory : /home/***/pear/cfg

9. Public Web Files directory : /home/***/www

10. System manual pages directory : /home/***/pear/man

11. Tests directory : /home/***/pear/tests

12. Name of configuration file : /home/***/.pearrc

1-12, 'all' or Enter to continue:

このような選択肢が表示されるので、 all を選択すると、1から12まで順番にディレクトリを設定することになる。基本的に提案されて表示された通りのディレクトリで問題ないが、 Public Web Files directory だけは、提案通りに入力すると $prefix/www となってしまう。提案通りの $prefix を入力していある場合、 /home/(ユーザID)/pear/www となるのでそれではまずい。 /home/(ユーザID)/www と入力しなければいけない。

1から12までの入力を完了すると、先程の選択肢の表示に戻るので、今度は ENTER だけ入力すると、インストールが始まる。設定内容は /home/(ユーザID)/.pearrc に保存される。

******************************************************************************

WARNING! The include_path defined in the currently used php.ini does not

contain the PEAR PHP directory you just specified:

</home/***/pear/share/pear>

If the specified directory is also not in the include_path used by

your scripts, you will have problems getting any PEAR packages working.

と WARNING が表示されるので、さくらのレンタルサーバのコントロールパネルを開き、「アプリケーションの設定>PHP設定の編集」を選択し、エディットボックス内に、

include_path = ".:/home/(ユーザID)/pear/share/pear"

と入力し「保存する」ボタンを押し保存しておく。

先程の go-pear.phar の設定の続きに話を戻すと、その後、

Would you like to alter php.ini </usr/local/php/7.3/etc/php.ini>? [Y/n] : n

と聞かれるが、 Y と返事しても、 /usr/local/php/7.3/etc/php.ini は、レンタルサーバのユーザからは編集できない(だからレンタルサーバのコントロールパネルに編集する場所がある)ので、ここは N と答えておく。

I will add a workaround for this in the 'pear' command to make sure

the installer works, but please look over your php.ini or Apache

configuration to make sure /home/red-souls/pear/share/pear is in your include_path.

などと、ちょっと文句を言われるが気にしない。

** WARNING! The link /usr/local/bin/pear does not point to the installed /home/***/pear/bin/pear

The 'pear' command is now at your service at /home/***/pear/bin/pear

** The 'pear' command is not currently in your PATH, so you need to

** use '/home/***/pear/bin/pear' until you have added

** '/home/***/pear/bin' to your PATH environment variable.

と警告されるが、自分のサーバの場合はどちらの pear を実行して pear list としてみても PEAR のバージョンに変化がないので問題はなさそうだ。気になる場合は /home/(ユーザID)/pear/bin を PATH に追加しておくとよい。その際は、 /usr/local/bin/pear よりも優先して実行されるようにしておくこと。

以上が、さくらのレンタルサーバに pear をインストールする手順だ。なぜか、ネットに上がっているさくらのレンタルサーバへの pear のインストール方法には、このようにしてインストールすると書いてあるサイトが皆無だった。一体どうしてなのだろう?そもそも go-pear.php ってなんだ?そんなファイルなかったぞ?? go-pear.phar の間違いなのか?それにエラーもなく普通にインストール、実行できるのだが・・・。

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

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


date_default_timezone_set() でタイムゾーンを指定できることが分かったので、 strftime(), gmstrftime() にタイムゾーンを反映させた。

それにともなって、スキンの Date タグのオプションとして、 timezone を追加した。サーバに設定されているタイムゾーンのまま変更が不要の場合は、このオプションを指定しなければよい。

pubDate の出力の場合は、

<pubDate><%=$Date fmt="%a, %e %b %Y %H:%M:%S %Z" locale="en_US.UTF-8" timezone="GMT"%></pubDate>

のように指定することで GMT で日時を出力することができるようになった。

これで一応は、 RSS2.0 の記事の公開日時( pubDate )では GMT で出力するようにしながら、各スキンでの処理ができるようになった。

ただ一つ気になるのは、date_default_timezone_set() の結果がプロセス全体に反映されるため、 PHP に同時に多数のアクセスがあった場合に、もし各アクセスがスレッド単位で処理されるとしたら、この関数によるタイムゾーンの変更が、別のスレッドで動作中の処理に予期しない影響を与えることになるのだが、大丈夫なのかな?

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

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


rNote の rnote_config.php の初期設定では、

define("DATETIME_LOCALE", 'ja_JP.UTF8');

と書かれているのだが、これだと setlocale() がエラーでこける。

サーバのコンソールで locale -a で見てみると、ja_JP.UTF8 ではなく ja_JP.UTF-8 だったので、同じ記述になおしたところ setlocale() が通るようになった。サーバによって jp_JP.UTF-8 だったり、 ja_JP.UTF8 だったりするのだろうか?

ちなみに、 setlocale(LC_ALL, "ja_JP.UTF-8"); を実行した返り値を見ると、

”.ja_JP.UTF-8.”

となっている。両端のダブルクォーテーションとドットはなんだろう?

予想としては、

ja_JP.UTF-8

のような形で返ってきて欲しかったのだが・・・。百歩譲ってダブルクォーテーションで括られているのはよいとしても、ドットの意味が分からない。まあ、この返り値をどうこうするつもりはないので、エラーでないことが分かれば中身はどうでもいいのだが。

次に、

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

についてだが、どうやら strftime() の時刻に関しては setlocale() で en_US.UTF-8 と指定しても日本時とずれないようだ。そして、 gmstrftime() という今回の用途にぴったりの関数もあることが分かった。これを使えば、

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

の処理は不要になる。ただし、 %Z で指定されるタイムゾーン文字列だけは問題で、setlocale(LC_TIME, "en_US.UTF-8"); gmstrftime(); とした場合、日時は GMT での日時として出力されたが、タイムゾーンは JST と出力されてしまった。

このことからも、 strftime(), gmstrftime() は setlocale() の結果を、日時の表示形式のためにしか参照しないようだ。そして、 JST と出力されていることと、 gmstrftime() で正しい GMT での日時が出力されることから、 strftime(), gmstrftime() がタイムゾーンを考慮して日時を修正する方法は、なにか別の方法をとっているらしい。

その「別の方法」が不明なので、とりあえず今のところは %Z を GMT と置換することで対処しておくことにする。

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

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