PHPの正規表現で大きな文字列を処理しようとすると極端に遅い

独自開発の CMS で、編集完了したページを公開しようとするとエラーが発生しているようだった。
どうも AJAX で呼び出している PHP スクリプトがタイムアウトしているらしい。
ローカル環境で再現しようとすると、時間はかかるが公開処理は正常にできた。
該当記事をエディタで短くしていくと処理時間が短くなるので、何かしら記事を処理する部分が時間を食っているのはほぼ確実だった。
この CMS ではページを公開する際に、検索用のデータを生成しており、この時、自前の処理で html をパースしていた。

問題はこのパース処理だった。

応急処置として、自前処理ではなく DOMDocument の loadHTML メソッドを使用するようにして、業務に支障がない状態に出来たが、根本対策には html のパースを高速化する必要があった。

mb_ereg 系の関数を使用していたため、preg 系に修正してみたが、今度は Segmentation fault が発生した。どうもデータベースのトランザクション内で正規表現ライブラリをガッツリ使うとメモリが足りないらしい。mb_ereg 系に戻して、再度検討を行う。
よく調べてみると、正規表現を使っている部分は、タグ部分の切り出し時と、切り出したタグ部分の分解だった。タグ部分の切り出し時には mb_ereg に記事全体を渡しており、どうもここが怪しい。
タグ部分の切り出し処理を、正規表現から strpos/substr などの文字列処理関数に修正すると、すばらしい処理速度となり、対策を完了することが出来た。

PHP の正規表現処理は非常に便利なのだが、現時点では大きな文字列の処理には向いていないようだ。
今回のように、処理速度に問題があるようなケースでは、以外な方法のほうが結局速かったりするので、いろんな方法を思いつけるように準備して置かなければならない。

さくらのさくらのレンタルサーバ スタンダードが素晴らしくなっていたのに1年も気付かなかった

なんかデータベースも MyISAM な MySQL が 1つだけだし、ブログぐらいしか使えねーわ、と思ってた「さくらのレンタルサーバ スタンダード」なんですが、お客様のレンタルサーバを選定することになり、確認してみると、MySQL は 5.5 で MyISAM/InnoDB を 20 個までになってるし、PHP は 5.3.x が選択できるようになっていました。

調べてみると 2011年9月28日にデータベースの機能強化がされさそうです。
1年以上知らなかった。まぁ嬉しいけど。

さっそくこのブログも MySQL 5.5 に移行しました。明らかに表示が早くなりました。

SATA3 で感動してしまった

発売日の翌日に Windows 8 Pro にしてから一1ヶ月後、システムを SSD 128GB に再インストールし、起動や Excel の起動が早くて喜んでいました。
しかし、今更ですが SATA3 にするのを忘れていたことに気が付きました。SSD は今では少し遅いと言われる ADATA SP900 ですが、SATA3 に対応しています。マザーボードもチップセットは B75 で SATA3 が1ポートあります。

早速システムドライブのケーブルを、唯一の SATA3 である 0 番に差し込んで電源を投入してみました。BIOS でもちゃんとドライブを認識していることを確認しました。
…が、起動しません。ケーブルを挿し直したりしましたが、ダメでした。
仕方なくもとに戻すと、システムの修復が起動されてしまったため、指示に従って修復して事なきを得ました。ちなみにメールとか仮想マシンとかは別ディスクに置いているので影響はありません。

このようなエラーとなるには、何かしら電気的な問題か信号的な問題が発生しているはずです。思い当たるのは SATA ケーブルです。
マザーボードに付属していた SATAケーブルは SATA3 対応だったはずなので、ケースを引っ張りだして交換してみました。

結果、見事 SATA3 で起動しました。体感では3倍くらい起動が早く感じます。これは感動モノです。

KCFinder を CentOS 5.8 の PHP 5.1.6 で動かす

CKEditor のファイルブラウザーとして、無料で使える KCFinder ですが、CentOS 5.8 の PHP 5.1.6 では動きませんでした。
調べたところ、kcfinder/lib/helper_dir.php の “usort($files, “dir::fileSort” ) );” を “usort($files, array( “dir”, “fileSort” ) );” に修正すると動作しました。

以下は、調査の経過です。

1. kcfinder/js/browser/joiner.php で JavaScript エラー
2. 内部で読み込んでいる js ファイルの順番が正しくないために undefined となり中断していた
3. ファイル一覧を作成している kcfinder/lib/helper_dir.php の usort の結果が不正だった
4. ユーザ定義関数を “dir::fileSort” から array( “dir”, “fileSort” ) に変更
5. usort で “class::function” 形式をサポートしているのは 5.3 以降であることを確認

意外と需要がある情報かもしれませんね。

CKEditor活用ノウハウ

いきなり宣伝なのですが、FC2カートで「CKEditor活用ノウハウ」の販売をはじめました。

価格については悩んだのですが、2,500円としました。
10数ページしかないのですが、一読すれば1日以上の調査などの時間が節約でき、利用に際して壁を乗り越えたノウハウをまとめているので、十二分に元は取れると思いますよ!

ぜひご購入ください!

また、CKEditorについてなにかご相談があれば、気軽にご連絡を。
よろしくお願いいたします。

CKEditor 4.0.1 を使う

今まで FCKeditor を使っていたのですが、CKEditor に変えることにしました。

そもそも FCKeditor は IE9 以降では上手く動きません。
IE8 互換モードでなんとか動かしていたのですが、それも IE10 では不可となってしまいました。
CKEditor では IE9 以降でも正常に動作します。
ファイルブラウザもフリーで高機能な KCFinder が公開され、切り替えについて不便はなくなりました。

CKEditor のドキュメンテーションを参考に切り替えのテストを行なっていたのですが、以下のボタンが表示されませんでした。
・Template/FontSize/TextColor/BGColor/JustifyLeft/JustifyCenter/JustifyRight
何でかなーと思って調べてみると、フル機能を使うには、ダウンロードの際に「Download CKEditor」ではなく「Launch CKBuilder」ビルドしてダウンロードすると良いようでした。
後でよく見ると、「Download CKEditor」の上にある「Standard package as a zip file」をクリックして、「Full package」を選択してから「Download CKEditor」でダウンロードをすれば良いことがわかりました。

ブラウザのキャッシュはクリアしておかないと javascript のエラーとなるので注意してください。
これで目的のボタンが表示されました。

参照URL : http://ckeditor.com/download

波ダッシュと全角チルダ

UTF-8 なのに珍しく文字化けとなりました。
スマホの HTC Sensation 4G という機種の US 仕様で、「~」が文字化けとなるとの事です。

調べてみると、「波ダッシュ」と「全角チルダ」がたいていの環境では同じく「~」と表示されるが、特定の環境では「波ダッシュ」が文字化けするそうです。
更に調べてみると Mac では基本的に「波ダッシュ」に、Windows では基本的に「全角チルダ」に変換されるそうです。

そこで Ubuntu の Mozc で、テキストエディタを使って「~」を入力、保存して GHex で確認したところ、「波ダッシュ」となっていました。
同様に Anthy だと「全角チルダ」となっていました。

UTF-8 である全ファイルの「波ダッシュ」を「全角チルダ」に変換し、今後は Anthy で編集することにしました。

特定環境と思われるので、ここまでしなくても良かったかもしれませんね。

明けましておめでとうございます

遅くなりましたが、明けましておめでとうございます。
もう確定申告も済ませましたが、納期限までの分納としてもらいました。
早めに税務署に行くとこんな方法も出来ますのでお勧めです。
たとえ一括で払える場合でも、手持ち資金はある方が安心ですので、金利が問題とならない場合は、あえて分割にするのも良いかと。

今年は、少しは余裕を持てるような考え方をするように自分を変えたいと思っています。

おやじギター開始

久しぶりに弾いてみたくなって、ギター買っちゃいました。
ついでにヘッドフォン用のアンプも買いました。
近所迷惑にならないよう楽しみたいですね。

とりあえず Com’on feel the noise を練習中。あと MSG とか。

うわ、すっげー楽しい!

さくらの VPS – CentOS 6 で FreeNX

あまりお薦めしませんが、GUIで操作したい方のために。

# yum update
# LANG=C yum groupinstall "Desktop" "Desktop Platform" "X Window System"
# yum remove NetworkManager
# yum install freenx
# nxsetup --install
N
# chkconfig messagebus on
# chkconfig freenx-server on
# reboot

…だったと思う。