覚え書-#26。

 HTTP/2 にかまけているけれども, MariaDB 10.1.8 のインストールについても書いておこう。アップデートではないよ。 PHP5.6.15,phpMyAdmin4.5.1,ActivePerl-5.20.2.2002 も昨日まとめて面倒見たので,それについても触れておく。 “覚え書-#26。” の続きを読む

文字コードの勉強(正規表現がらみ)。

 なんで突然,文字コードのお勉強に取り組んでいるかというと,久しぶりに,Joyful Note を見に行ったら,Ver.4.5 になっていて,カスタマイズしようと思ったら,正規表現で引っかかっちゃったのだ。何で,Joyful Note のカスタマイズに取り組もうとしているかというと,去年かかわったこれのせい。

 引っかかったのは, joyful.cgi の中の,
     # キーワード検索準備(Shift_JIS定義)
     my $ascii = ‘[\x00-\x7F]’;
     my $hanka = ‘[\xA1-\xDF]’;
     my $kanji = ‘[\x81-\x9F\xE0-\xFC][\x40-\x7E\x80-\xFC]’;
というところ。これは,もとの掲示板が Shift_JIS エンコードだから,(Shift_JIS定義)をやっているのだろう。ということは, EUC-JP にするなら,当然,(EUC-JP定義)を, UTF-8 にするなら,(UTF-8定義)をしなければいけないのではないかと思ったわけだ。前のバージョン(この間カスタマイズしたのは,3.71)には,この部分はなかった。実際には,同じ作業をやっている部分があったのかもしれないが,こういう形では見えなかったので,気づかなかった。

 で,まずは改めて文字コードのお勉強から。参考にさせていただいたサイトはここ。参考にさせていただいたところは,間違いないようだが,文字コードについては,間違ったことを書いているところもあったから,要注意。まぁ,ネットていうのは,いつもそうだけどね。不安なときの確認は,やはり,本家。JISについては, 日本工業標準調査会 , UNICODE については, The Unicode Consortium を参照すること。
 それから, Unicode そのものや Unicode と UTF-8 や UTF-16 との関係についての話は,ここの説明が一番よくわかった。大変に読みやすい。ありがたかった。

 では,順番に調べて行ってみる。

  1. $ascii = ‘[\x00-\x7F]’ について。
    これは,EUC-JP,UTF-8でも同じだから,このままでいいだろう。

    • 注:厳密にいうと,UTF-8の場合,円マーク &#x00A5 (Shift_JIS,EUC-JPと同じ16進コードの場合は &#x005C になる) とオーバーライン &#x203E (Shift_JIS,EUC-JPと同じ16進コードの場合は &#x007E になる) は,( )内に書いたように異なっている。オーバーラインのほうはあまり意識に上ってこないかもしれないが, &#x00A5 を打ったつもりなのに,表示が &#x005C になってしまったという経験は,よくあると思う。日本語用フォントにおいて,この部分は,いまだに特例扱いのようだ。何しろ,円マークは日本の一般社会の頻出記号だから,さかのぼって直すとなると大変なんだろうと,推察した。本当の理由は知らない。
  2. $hanka = ‘[\xA1-\xDF]’ について。
    これは, JIS0201.TXT の第1列をを見ると,半角カナの話であることが分かる。半角カナは,EUC-JPでは, 8EA1~8EDF だから,$hanka = ‘\x8E[\xA1-\xDF]’でいいのか。それとも,EUC-JP の場合,1バイト目に 8E が出て来るのは,半角カナだけだから, \x8E 部分のチェックだけでいいのだろうか。この辺は,実装の問題なのか?

    JIS0201.TXT 見ると,UNICODEの場合,半角カナに対応するのは,FF61~FF9Fとなっている。これを The Unicode Consortium の文書 Conformance の Table 3-6. UTF-8 Bit Distribution と Table 3-7. Well-Formed UTF-8 Byte Sequences に則って変換してみる。
    UNICODEからUTF-8へ
      
     まずは,FF61 (16進) —> 11111111 01100001 (2進) とする。
     Table 3-6.に照らし合わせると,対応は以下のようになる。

    z z z z y y y y y y x x x x x x
    1 1 1 1 1 1 1 1 0 1 1 0 0 0 0 1

     さらに,Table 3-6.のルールを適用すると,結局,1バイト目から3バイト目は,以下の3つの2進数になる。

    1バイト目 2バイト目 3バイト目
    ルール 1 1 1 0 z z z z 1 0 y y y y y y 1 0 x x x x x x
    対応する2進数 1 1 1 0 1 1 1 1 1 0 1 1 1 1 0 1 1 0 1 0 0 0 0 1

    したがって,11101111 10111101 10100001 (2進) —> EFBDA1 (16進) となることがわかる。同様に,FF9F (16進) —> EFBE9F (16進) になる。

    細かく調べてみると, UTF-8 で Shift_JIS の A1~DF に対応する部分は, EFBDA1~EFBDBF までと, EFBE80~EFBE9F に分かれていることがわかる。ということになると, UTF-8 の場合は,
    $hanka = ‘\xEF\xBD[\xA1-\xBF]|\xEF\xBE[\x80-\x9F]’
    ということになりそうだ。

  3. $kanji = ‘[\x81-\x9F\xE0-\xFC][\x40-\x7E\x80-\xFC]’ について。
    これは, JIS0208.TXT の第1列だと,実体のあるところだけをズラッと並べてあるから見づらいんだが,範囲は Shift_JIS だと,上位1バイト 0x81~0x9f , 0xe0~0xef ,下位1バイト 0x40~0x7e , 0x80~0xfc に収まっている。 JISX0208 の範囲だから,JIS第1第2水準漢字だということだ。
    まあ,この範囲だと, EUC-JP は,上位1バイトも下位1バイトも 0xa1~0xfe に収まっているから,多分,$kanji = ‘[\xA1-\xFE][\xA1-\xFE]’ でいいんだろう。

    問題は UTF-8 で, Shift_JIS と EUC-JP はコードにしたときの並び順が同じだからいいが, UTF-8 は UNICODE 由来だから順序が違う。といって, Shift_JIS と EUC-JP の順序を無視して, UNICODE だけで行くと,日本語では一般的でない漢字も遠慮なく入ってくる。その辺が,日本国内を視点に考えられた Shift_JIS ・ EUC-JP と, UNICODE の違いだ。
    こういう場合は,1度 UTF-8 になっているものを EUC-JP とかに戻して考えるのが一般的なのだろうか。

    どういう方法が,一般的なのかは,別にして, JISX0208 の範囲の UNICODE から, UTF-8 を考えて変換表を作ってみた。上記の参考ページにあるようなものを自前で作ってみたわけだ。これをやるには,いろんな方法があるのだろうが,使い慣れているEXCELでやってみた。で,出来上がったのが,これ。並び順は,作成した UTF-8 順。UTF-8 と UNICODE の部分の色分けは,Table 3-7.の Well-Formed の確認のためにつけたもの。 Shift_JIS と字の部分の色分けは,青が第一水準,黄が第二水準(厳密にいうと,第一,第二は漢字に対して使うものらしいが……)。

    漢字の部分で,青と黄が入り混じっている。おまけに, UTF-8 は連続数になっていない。 UNICODE の漢字は基本的に画数で並んでいるから,常用漢字が基本に来る JIS と対比すると,こうなるのはまあ当然。うーん,やはり,EUC-JP に戻してフィルタかけるのが現実的なのかなぁ。

と,ここまでやってきて,ようやく,Joyful Note のカスタマイズに入れそうな気がしてきたが,まだ簡単には,行きそうにない(爆)。

o6asanの掲示板。

投稿アップデート情報  追記(8/25)  追記2(8/26)  追記3(11/29)  追記4(2014/2/24)

 この間,「&の&への変換。」のときに作った「o6asanの掲示板」を整理した。結局,UTF-8版だけを残して,これを自鯖ダウン時の連絡用という位置づけにしようと思う。あとのShift-JIS版とEUC-JP版は削除してしまったが,捨ててしまうのも惜しいので,3本ともzipにしてダウンロードできるようにした(爆)。もし,3つを比べてみようという奇特な方がおられたら,ここからどうぞ。UTF-8版SHIFT-JIS版EUC-JP版

 改造版を公開した形になるので,お礼かたがたKENTさんにも,お問い合わせフォームから連絡をしておいた。

 で,新装開店した「o6asanの掲示板」には,こないだうちから,juneさんところでりりさんが話題にしていた,SSIによる最終更新日取得機能も入れてみた。もっとも,.shtmlファイルを単独で動かす必要から,あまり好きではないフレーム仕様になってしまった。久しぶりにフレームのタグ書いたなあ。なんと,いまだに手書き(手書きって意味わかるよね。テキストエディタで書くってことダヨ。流石に,紙に鉛筆というわけではないよ(大笑い)。)なのよ。UTF-8でエンコードする必要から,Winのメモ帳は使わんかったけど。BOMがくっついていると,ブラウザによっては1行余計な空白ができるんだよー。

 TODOSに書き込みしたら,すぐにりりさんが「新・o6asanの掲示板」にレスつけてくれたんだが,早速,エラー。なんでかっていうと,私のつけたタイトルが「自鯖ダウン時連絡用」でね,これに,レス付けると自動で「Re: 自鯖ダウン時連絡用」になるんだよね。もともとのJoyfulには,タイトルは全角で15文字までっていう制限があったのだ。これに引っかかっちゃった。えっ,15文字ないって,そうなんだよね。初め,なんでよって思ったんだが,考えたら,UTF-8だと,全角日本文字は3バイト使うんだよ。完全に忘れてた。

 実際,Joyfulのタイトル文字数制限のところを見たら,30バイトまでというカウントになっていた。で,使用モジュールにEncodeを追加してやって,lengthのカウントのとこにdecodeも追加してやって解決。使っているうちには,まだいろいろ出てくるだろうなあ。

追記(8/25):
 SSIの利用部分を結局<iframe>で書き直した。キャッシュによるリロード手間への対策というかなんというか。

図2=個別画面図1=一覧画面追記2(8/26):
 りりさんが,「o6asanの掲示板」の方に知らせてくださったが,うかつに書き込んだ,<iframe>の<と>をエンティティするのを忘れていたので,追記の文章から下が見えなくなっていた(図1=一覧画面,図2=個別画面 参照)。ウッ,ひどいもんだ。今,直しました。

追記3(11/29): KENTさんのところに合わせて,Joyful Note v3.71の改造版をアップした。

追記4(2014.2.24):
 ドメインを移管したので, XREA においてあったものは,なくなった。

&の&amp;への変換。

投稿アップデート情報  追記(7/19)  ……  追記3(7/20)  追記4(8/14)  追記5(2014/2/24)

 この間うち,シバケンさんとこの「シバケンの掲示板」で,「ひえの文字」という話があった。たまたま覗きに行ってたので,なんでだろうと思った。

 通常のひえは「稗」だが,くさかんむりのついた「薭」てのがあって,これが実体参照で「&#34221;」ってやっても出ないという話だった。今どきのブラウザやOSで,そんなのありかなぁと思ったんだが,FHさんの「FHの掲示板」でも同じことが起こっていた。そういえば,TODOSで「惊奇日本」と書こうとしたときも「&#24778;奇日本」になっちゃったよなあと思いだした。

 で,FHさんとこの掲示板は,KENTさんとこの「Joyful Note」だってことを知っていたので,これをダウンロードしてちょっと調べてみた。TODOSで使っている「WEB PATIO」はスレッド型で少し複雑なので,前にテスト設置したときに前もっての設定とかが面倒だった記憶があるので,「Joyful Note」を調べることにしたわけだ。

 「Perlのお勉強」も飽いちゃって,あのまま放置プレイだが,それでも,高々,6回しかやっていないこれが少し役に立ったね(爆)。joyful.zip を展開してできるinit.cgiにこういう部分があった。これの13行目で,問答無用で「s/&/&amp;/g;」をやってるから,「&#34221;」の頭の&が&amp;になってしまって,実体参照が効かなくなるわけだ。

 じゃ,この行(つまり,13行目)をコメントアウトしてしまえばいいじゃないかというカスタマイズは,すぐに思いついた。が,割とちゃんとした掲示板の作り手のみんながみんな「& → &amp;」ってことは,セキュリティでまずいからだろう。しかし,まずさの度合いが大したことなければ,目をつぶっちゃおうかと思ってググってみたが,あまりにも,常識なのか,どうまずいのかを教えてくれるところはなかなかなかった。そんな中で,なるほどと思ったのが,「【PHP関連】「&」(アンパサンド)をエスケープしなければならない実例」という記事。やはり,13行目を,問答無用でコメントアウトするのは,大変,まずいようだ。

 ということになれば,次に思いつくのは,&に続く文字の条件分岐で処理を分けてやろうということだ。しかし,Perlに疎い悲しさ,どうやったらいいかわからない。投げちゃおうかと思ったころに,運よく発見したのが,「&の実体参照への変換」。どんぴしゃり,やりたいことをやったサンプルスクリプトを置いてくださっていた。これを参考に(いや,流用して),init.cgiのフォームデコードの部分をこういうふうに書き換えた。

 で,実体参照に関係ない「&」はちゃんと「&amp;」になり,実体参照はちゃんと実体が表示される「o6asanの掲示板Shift-Jis版」ができた。このテストのために作った「o6asanの掲示板」だが,これは自鯖上にはないから,このまま残しておいて,自鯖が落ちているときの連絡用として使うのも手だなと考えているところである。

追記(7/19):
 後知恵だが,ちゃんと表示されないのは「’JIS’ 補助漢字」なんだから,初めからUTF-8で行けばいいんじゃないのというわけで,「Joyful Note」のスクリプトをUTF-8デフォで作りなおしてみた。Perlがよくわかっていない私だが,これは割と簡単だった。
 Jcode::convert に関係あるcgi ファイル上の 12カ所の sjis を utf8 に書き換え。
 admin.cgi,check.cgi と tmpl 内の html 上の charset=shift_jis を charset=UTF-8 に書き換え。
 *.cgi,*.html,*.datをUTF-8エンコードで保存し直す。

 init.cgiの内容の書き換えは全くしないで,こんなことで,UTF-8デフォのJoyful Noteができた。 —>> ここにおいてます。

追記2(7/20):
 EUC-JPでも確認してみた。init.cgiを変更しなければ,「補助漢字」は表示されなかった。当たり前だが,
 Jcode::convert に関係あるcgi ファイル上の 12カ所の sjis を euc に書き換え。
 admin.cgi,check.cgi と tmpl 内の html 上の charset=shift_jis を charset=EUC-JP に書き換え。
 *.cgi,*.html,*.datをEUCエンコードで保存し直す。
の必要もある。EUC-JPデフォのJoyful Noteは ここにおいてます。

追記3(7/20):
 稼働中掲示板への対処だが,UTF-8に文字コードを直すのは大変で,現実的ではないと思う。

 init.cgiの差し替え方式なら,レンタル掲示板の場合であっても,管理会社の担当者がその気になってくれれば,「補助漢字」を表示させるのは可能だと思う。init.cgiを上書きアップロードすれば,上書き後に投稿される記事に限り,「補助漢字」が普通に表示されるようになり,そこまでに書き込まれていた掲示板の記事は影響を受けない。

 万が一,こちらのカスタマイズを利用される方がいるといけないので,大事なお約束事項を(爆)。
 お約束===この記事のカスタマイズを利用される方は,あくまでも自己責任でお願いいたします。

追記4(8/14):
 掲示板を整理した。で,もし落として違いを試してみようと思う方がいらっしゃったら,こちらへどうぞ。

追記5(2014.2.24):
 ドメインを移管したので, XREA においてあったものは,なくなった。

ActivePerl+ImageMagick

投稿アップデート情報  追記(2014.2.24)

 この間書いたようにLAMP系にも触れていたいということで,XREAのフリースペースを利用している。「Ajax Edit Commentsフリー版(v.5.0.7.0)のLAMP系での使い方。」でも,4つテストしたレンタルサーバの一つとしてここで試してみた。

 で,現在のXREAのフリースペースでの私の主題目は,Perlによるcgiの勉強である。現在,私が使っているXREAのサーバのPerlのバージョンは5.8.8である。自鯖のほうでもPerl5.x.xを使っているので,cgiとしても基本的にはそれに従う方向で書く勉強をしている。そんなわけで,パッケージやモジュールを使った書き方を学ぶことになる。

 昔,齧ったことのあるPerlに比べて,モジュールのありがたさを満喫しているところだ。今まで使ってきたモジュールは,XREAのサーバにはすべて導入されていた。まぁ,標準モジュール以外で使ったのは,Image::SizeとImage::Magickだけだから,XREAあたりでは当然なのかもしれない。
 一方,自鯖のほうには,どちらも入っていなかった。Image::Sizeのほうは,Perl Package Manager(PPM)で簡単にインストールできた。Image::Magickのほうは,実はこの間アンインストールしたばかりだ。早速,再インストールした。
 見た目は似たようなブログCMSであるWordPressMovableTypeだが,大きな違いの一つはWordPressはPHPスクリプトの塊,MovableTypeはPerlスクリプトの塊ということだ。

 インストールが終ったときに,WordPressは「たったこれだけで終わりよ」みたいに簡単さを誇示しているが,WordPressしかインストールしたことがなかったら,あんまり印象に残らないアピールだろう。でも,本当に楽なほうだと思うよ。

 MovableTypeもバージョンが進むにしたがって,どんどん楽になってきていたので,極端に難しい方ではないと思うが,最初に導入したときには本当に苦労した。全く経験がなかったせいもあるが,サーバがWindowsだったので情報が少なかったということもあると思う。そして,何よりハマったのがPerlの追加モジュールのインストールだったのだ。その中でも,Image::Magickについては,いろいろと手こずった。

 ActivePerl上でのImageMagick(=PerlMagick)のインストールで気を付けるポイントは,結局のところ2つなのだ。

  1. ひとつは,使おうとしているActivePerlに対応しているバージョンのImageMagickを使うこと。
  2. もう1つは,インストール後必ずWindowsを再起動すること。

 ほかに,staticを使うかdllを使うかとか,Visual C++ 2010 Redistributable Package (x86) or Visual C++ 2010 Redistributable Package (x64)のインストールとか,x86とx64のどちらを使うかとかあるが,これについてはImageMagick(=PerlMagick)に書いてある。
 しかし,上記の2つは,結構気づかない。
 1.のほうは,ImageMagickをインストールするときに,ActivePerlv5.xx.x build xxxxに対してPerlMagickをインストールするという項目がある。ここで,前もってインストールしてあるActivePerlのバージョンが書かれていれば絶対に間違いないし,わずかにバージョンが違うだけでもダメなのだ。

 2.のほうは,本当に落とし穴で,ImageMagickインストール後にPerl Package Manager(PPM)上ではちゃんとモジュールが見えるのだが,それでもWindowsを再起動しないままで使えたことは一度もない。実際,今回もOSを再起動しないまま使ったら,Image::Magickが見つからないというエラーが出た。

 初めのころは,ほんっと,ハマったよー。おかげで,濡れ衣を着せちゃったことさえあるくらいなのだ(笑)。

追記(2014.2.24):
 ドメインを移管したので, XREA においてあったものは,なくなった。「Perlによるcgiの勉強」の報告は,スタードメインに移した。

XREAのフリースペース。

投稿アップデート情報  追記(2014.2.24)

 表題とは関係ないけど,知り合いのところで今日初めてiPadに触った。トレンドに遅れてるでしょ(笑)。それでも30分以上触っていたので,楽しかったよ。

 ところで,自鯖が帰宅したので,XREAのフリースペースが空いたままになっている。で,そこにWordPressを入れてみた。自鯖は,WAMP系なので,LAMP系のものにも触っていたいからネ。URLはこちらです。

 暇があったら,のぞいてみてください。m(_”_)m

追記(2014.2.24):
 ドメインを移管したので, XREA においてあったものは,なくなった。