2007年9月13日木曜日

PEAR::HTML_Page2を使う

PEARにHTML_Page2という、HTMLページを作成するためのパッケージがある。HTML_Page2については、PEARのサイトにHTML_Page2のドキュメント(日本語)があって、このドキュメントを見れば特にこの先の話は必要ではないかもしれないが、初めてHTML_Page2を使う人向けに簡単な例を書こうと思う。

まず、HTML_Page2の基本的な使い方は以下の通り。

  • オブジェクトの作成(newする)
  • ヘッダー関連を設定する
  • ボディコンテンツの追加
  • HTMLの出力

オブジェクトの作成

newのパラメタ(すなわちコンストラクタのパラメタ)にいくつかの情報を設定することができる。
まず、この文章を読んでいる人たちは、languageを"ja"にしたいと思うだろう。Windowsだったら、改行コードを"\r\n"にしたいと思うだろう。 という設定をしてインスタンスを生成するには、以下の通りにする。

require_once 'HTML/Page2.php';
$attributes = array(
 'language' => 'ja',
 'lineend' => 'win',
);
$page = new HTML_Page2($attributes);

ヘッダー関連を設定する

まずはHTML的にtitleタグが必須であるので、タイトルを設定する。あと、HTML_Page2でHTMLを生成すると、"Generator"をいうメタタグを設定するのであるが、これをなくしたいと思うとすると。以下の通りにすればよい。

$page->setTitle('ページのタイトル');
$page->setMetaData('Generator', NULL);

あとは、スクリプトやスタイルシートの設定などについては、PEARのドキュメントに詳しく書いてある。

ボディコンテンツの追加

あとは、ブラウザに表示されるコンテンツを追加していけばよい。このとき、HTML_Page2::addBodyContent()というメソッドを使う。このメソッドの引数にHTMLのタグを含む文字列(String)を追加していけばよい。 また、このメソッドは、文字列だけでなく、オブジェクトも追加することができる。このときこのオブジェクトにtoHTML()もしくはtoString()というメソッドを実装しておくと、HTML_Page2がHTMLを生成するときに、それぞれのオブジェクトのこれらのメソッドを呼び出し、その結果を取り込み出力する。
さらにHTML_Page2::addBodyContent()は、文字列やこのようなオブジェクトを含む配列(array)も渡すことができる。このときは、配列に含まれる順番に追加されていく。

ちなみにPEARに含まれるHTMLのパッケージ群は、toHTML()が実装されているので、オブジェクトのまま追加することができる。PEARのパッケージを使わなくても自前クラスでtoHTML()を実装して、HTML_Page2::addBodyContent()に渡すというやり方がHTML_Page2の多い使い方ではないかと思う。

HTMLの出力

ボディコンテンツを全て追加した後、HTMLとして出力する。

$page->display();

この例では標準出力に吐き出すが、文字列として結果を得るにはHTML_Page2::toHTML()を使う。また、HTML_Page2::toFile()というメソッドがあるが、これは引数にファイル名を与えるとそこに出力するというものである。

HTML_Page2の派生

上記のオブジェクトの生成で、"language"や"lineend"のパラメタを毎回コンストラクタに渡したりするよりは、クラスを派生したほうがよっぽどエレガントであると思われる。

require_once 'HTML/Page2.php';
class MyHTMLPage extends HTML_Page2 {
 function __construct($attributes = NULL) {
  if ($attributes != NULL) {
   if (!array_key_exists('language', $attributes)) {
    $attributes['language'] = 'ja';
   }
   if (!array_key_exists('lineend', $attributes)) {
    $attributes['lineend'] = 'win';
   }
  }
  else {
   $attributes = array('language' => 'ja', 'lineend' => 'win');
  }
  parent::__construct($attributes);
  $this->setMetaData('Generator', NULL);
 }
}

もちろん、これ以外のヘッダ関連の設定などを追加したほうが便利なことが多いだろう。

2007年9月12日水曜日

Norton AntiVirusでブラウザが遅くなる

今日はソフト開発系のネタではないのですが、最近困っていたことが解決したので、何かの役に立つかもしれないということで、ネタにしてみました。

ここ1週間ぐらい前から、ブラウザを使うとWindowsがものすごく遅くなるという現象になっていた。ブラウザは、Firefox、IE7、Operaのいずれも同様な現象が発生していた。ただ、ブラウザ以外のソフトでは、遅くなるようなことがなかった。
何かの常駐物が悪さをしているか、いわゆるマルウェアとかいうのがいるのか、とか原因を探っていたところ、どうやら、Norton AntiVirusのAuto Protectを無効にすると、遅くならないことが判明した。

すなわち、犯人はNorton AntiVirusということであった。しばらくの間、遅いのを我慢するか、どうしてもというときには、Auto Protectを無効にしていたのだが、さすがにウィルス対策なしの状態で使い続け続けるのは、いかがなものかと思い、いろいろ調べてみたところ、次のようなことがわかった。

Javascriptをスキャンさせると遅くなる
プラグインなどでJavascriptを読み書きにいくことが多いため、起きるものだと考えられる。これを回避する方法は、Auto Protectの「除外」リストに「*.js」を追加する。ただし、くれぐれも手動スキャンの除外には追加しないように。
ただし、パフォーマンスは上がるが、安全性は落ちる可能性があることを理解して使うべきである。
圧縮ファイルの中身をスキャンすると遅くなる
これは文字通りだが、ブラウザとの関係としては、JARぐらいしか思い当たらないが、これが原因であることがあるらしい。回避方法は、Auto Protectの設定で「圧縮ファイルの内部をスキャンする」という、そのまんまなオプションがあるので、これをオフにする。
ちなみにうちの環境では、このオプションを変えてもほとんど動作に変わりはなかったので、そのままオンの状態にしている。
もし、Eclipseの動作がえらく遅いときは、このオプションを変えてみると効果があるかもしれない。