PHP

1985年ラスマス・ラードフによって書かれたPHP Hypertext Preprocessorについて。個人向け言語だったPHPがこれほどまでに発展したのはZendの多大なる貢献によるものだろう。

2016年7月27日

HTTP_RequestをHTTP_Request2に書き換える

PHP 5.4以降でE_STRICTによるメッセージが出るようになったこととHTTP_Requestがデサポになっていることから、ようやくHTTP_RequestをHTTP_Request2に書き換えてみることにした。

参考にしたサイトは[php][pear]HTTP_Request2のサンプル#1 : うえちょこ@ぼろぐ

互換性があるライブラリと思いきや、かなり非互換。
コンストラクタから違う。上記参考サイトとあわせて下記参考にしてみてください。

HTTP_Request
HTTP_Request HTTP_Request( [string $url = ''], [array $params = array()])

HTTP_Request2
HTTP_Request2 __construct( [string|Net_Url2 $url = null], [string $method = self::METHOD_GET], [array $config = array()])

2011年5月31日

CentOS 5.5にPHP 5.2をインストールする

CentOS 5.5のリポジトリでは、PHP 5.1.6までしかインストールできない。
PHPならびに対応するmemcachedのライブラリのインストール方法について「CentOS5.2にPHP5.2.6とmemcachedをインストールする」に記載があるので、こちらを利用するとよい。

ちなみに追加したリポジトリは次の通り。/etc/yum.repos.d/CentOS-Testing.repo として保存するとよい。
[c5-testing]
name=CentOS-5 Testing
baseurl=http://dev.centos.org/centos/$releasever/testing/$basearch/
enabled=1
gpgcheck=1
gpgkey=http://dev.centos.org/centos/RPM-GPG-KEY-CentOS-testing
includepkgs=php*
priority=1

2008年9月25日

匿名転送メールサービス ~ Alias Mail

以前このブログで20分間だけ使える使い捨てメールアドレスがすぐに作成できる「使い捨てメール」というものを照会したが、余り使い勝手がよくなかったので、実際にMail_mimeDecodeを使って転送メールサービス「Alias Mail」を作ってみた。

まだmessage/rfc822などのcontent-typeが処理できないなどの問題はあるものの、大部分のメールは正しく転送されるように処理できていると思う。

転送期間は1日、3日、5日、1週間、1ヵ月から選択することができ、必要に応じて転送されたメールの本文ヘッダにあるリンクから転送期間を延長することができるようにしてあります。

もし良かったら使ってみてください。そしてご意見や改善点などありましたらコメント入れていただけますとうれしいです。

http://kataude.jp/alias_mail/

2008年9月21日

連想配列からキーを削除する方法

がわからなかったのでphp.netのリファレンスを調べるも見当たらない。

というわけで行き着いたのがhttp://wiki.poyo.jp/read/PHP/tips/array/array_unset_keys だったが、どうもしっくりこない。こんな方法でしかキーを削除することができなかったんだけ?と思ってしまった。

もう少し調べるとsuz-labに行き当たってやっぱりと。。。

いろんな人のコードをよく読むことはとても勉強になるなあぁと思った1日でした。

2008年8月19日

mimeヘッダーを解析する

メールのヘッダーというものは、改行で区切られるのかと思ったらそうではないらしい。

たとえば、こんなヘッダーがある

Date: Tue, 19 Aug 2008 09:23:57 +0900 (JST)
Subject: [Fwd:
=?ISO-2022-JP?B?(途中省略)U?=
=?ISO-2022-JP?B?(途中省略)h?=
=?ISO-2022-JP?B?(途中省略)Q==?=
From: =?ISO-2022-JP?B?(途中省略)C?= <(送信元)>
To: (送信先)
User-Agent: SquirrelMail/1.4.5-1_fc4
MIME-Version: 1.0
Content-Type: multipart/mixed;boundary="----=_20080819092357_80457"
X-Priority: 3 (Normal)
Importance: Normal

Subjectが途中改行されているけれども、これは正しいらしい。というわけで、ヘッダーを解析するのは容易ではなさそうで、pearのモジュールにMail_mimeDecodeというものが出ているのでこれを使ってみることにした。

ただインストールしようとしたらpearのバージョンを上げろと言われて戸惑った。

# pear install mail_mimedecode

pear/Mail_mimeDecode requires PEAR Installer (version >= 1.6.0), installed version is 1.4.11
pear/Mail_Mime requires PEAR Installer (version >= 1.6.0), installed version is 1.4.11
pear/Mail_Mime requires package "pear/Mail_mimeDecode"
No valid packages found
install failed

サイトを調べてみたら設定を無理やりかえるとか強引な手法が多かったけれど、僕の環境の場合にはすんなりいった。

# pear upgrade pear

downloading PEAR-1.7.2.tgz ...
Starting to download PEAR-1.7.2.tgz (302,744 bytes)
................done: 302,744 bytes
downloading Archive_Tar-1.3.2.tgz ...
Starting to download Archive_Tar-1.3.2.tgz (17,150 bytes)
...done: 17,150 bytes
downloading Structures_Graph-1.0.2.tgz ...
Starting to download Structures_Graph-1.0.2.tgz (30,947 bytes)
...done: 30,947 bytes
downloading Console_Getopt-1.2.3.tgz ...
Starting to download Console_Getopt-1.2.3.tgz (4,011 bytes)
...done: 4,011 bytes
upgrade ok: channel://pear.php.net/Console_Getopt-1.2.3
upgrade ok: channel://pear.php.net/Structures_Graph-1.0.2
upgrade ok: channel://pear.php.net/Archive_Tar-1.3.2
upgrade ok: channel://pear.php.net/PEAR-1.7.2
PEAR: Optional feature webinstaller available (PEAR's web-based installer)
PEAR: Optional feature gtkinstaller available (PEAR's PHP-GTK-based installer)
PEAR: Optional feature gtk2installer available (PEAR's PHP-GTK2-based installer)
To install use "pear install pear/PEAR#featurename"

これでpear install mail_mimedecodeをすればうまくダウンロードできた。

実際にコード解析したものについては次回...

2008年1月25日

phpdocumentorを利用する

phpでプログラムを作成していながら、ドキュメントを残すぐらいであれば、提携フォーマットでコメントをソースに埋め込んでphpdocumentorを動かしてマニュアルを作ったほうが賢い。

インストールはpearパッケージなので簡単。
# /usr/local/lib/php4/bin/pear install --alldeps phpdocumentor

たとえば、特定のファイルをマニュアル化するのであれば、あらかじめ作成した出力先をdocとすると
phpdoc -f hogehoge.php -t doc/ -o HTML:frames:default
とすればよい。
(ディレクトリ丸ごとならば -d オプションを使う。)

ただ日本語のコメントは文字化けしてしまう。多くのサイトでは該当するテンプレート
/usr/share/pear/data/PhpDocumentor/phpDocumentor/Converters/HTML/frames/templates/default/templates/
にある
blank.tpl
header.tpl
index.tpl
top_frame.tpl
のcharsetを変更すればよいと書いてあるが、作成するプログラムがサイトによって異なることもあるだろうし、もともとインストールされているデフォルトテンプレートをゴリゴリ書き換えるのは気持ち悪い。

phpdocコマンドにはテンプレートで使用するファイルを切り替える-tbというオプションがあるが、どうやらうまく動いていないようなので、いっそのことテンプレートを丸ごとコピーしてそれを指定することにした。

たとえば、Shift-JISでプログラムの文字コードが統一された携帯向けコンテンツのマニュアルを作成する場合、
cd /usr/share/pear/data/PhpDocumentor/phpDocumentor/Converters/HTML/frames/templates
cp -pR default default_sjis
としてdefaultテンプレートをコピー
cd default_sjis/templates/
で移動して、

blank.tpl
header.tpl
index.tpl
top_frame.tpl
のcharsetをShift-JISへ変更する。

phpdoc -f hogehoge.php -t doc/ -o HTML:frames:default_sjis
とすると
/usr/share/pear/data/PhpDocumentor/phpDocumentor/Converters/HTML/frames/templates/default/
ではなく
/usr/share/pear/data/PhpDocumentor/phpDocumentor/Converters/HTML/frames/templates/default_sjis/
以下のものが利用されるようになる。

/usr/share/pear/data/PhpDocumentor/phpDocumentor/Converters/
の中にはいろんなテンプレートがあって、PDFにしたりすることもできるみたいだ。
ドキュメントをオンラインだけでなく、紙でも残す必要がある場合には、これを使えばよさそうだ。
例)phpdoc -f hogehoge.php -t doc/ -o PDF:default:default

続きを読む "phpdocumentorを利用する" »

2007年12月31日

フレームワークのあれこれ

Mojavi

非常に古いフレームワーク。これだけではMVCの概念を提供するだけで、機能は自分自身で組み合わせなければならない。ある意味自由度は高いかもしれない。→テンプレートのSmartyとか・・・

Ethna

GREEが使っているとされるフレームワーク。(2006年記述)

Symfony

僕が取り組んでいるフレームワーク。導入実績はこちらで紹介されている。PHP5以上で動作する。使ってみたところ、制約が大きく、やりたいことをするためにまずどうしなければいけないかを調べなければならないため、ハードルがやや高い。あんじーの奮闘記はこちらからどうぞ。

Zend Framework

まだ完成度は低いもののデファクトスタンダードと期待されている。参考:公式サイト IT Pro

その他ではこんなものもあります・・・
cake

prado

Django

2007年11月 2日

PHPの正規表現

マルチバイト正規表現が弱い
mb_ereg('[ア-ン]', $str)
で半角カナが含まれているかどうかはチェックできても
mb_ereg('^[ぁ-んー\]+$', $str)
で全角かなだけで構成されているかどうかはチェックできない。
mb_ereg('^[あいうえおかきくけこさしすせそたちつてとなにぬねのはひふへほまみむめもやゆよらりるれろわをんがぎぐげござじずぜぞだぢづでどばびぶべぼぱぴぷぺぽぁぃぅぇぉゃゅょー\]+$', $str)
としなければいけない

メールアドレスマッチングの謎
preg_match('/^[.0-9a-z_+-]+@(?:[0-9a-z-]+\.)+[0-9a-z]{2,}$/i', $str)
はメールアドレスとマッチしなが、
preg_match('/^[.0-9a-z_+-]+@(?:[0-9a-z-]+?\.)+[0-9a-z]{2,}$/i', $str)
はメールアドレスとマッチする。

グループ化した後に量子指定子がくると aaa@bbb.com の場合
^[.0-9a-z_+-]+@(?:[0-9a-z-]+\.)
でaaa@bbb. までマッチングされるが
^[.0-9a-z_+-]+@(?:[0-9a-z-]+\.)+
となると[0-9a-z-]+が欲張ってしまい、最後までマッチングを試みた後、バックトラックして aaa@bbb. まで戻って次のテストをするはずがそれが行われない。

2007年7月30日

php.iniの設定をドメインごとに切り分ける

PHP_INI_PERDIRまたはPHP_INI_ALLとなっている設定項目については、httpd.confや.htaccessなどにおいて、php_valueディレクティブとphp_flagディレクティブにて指定することが出来るので、事実上ドメインごとやディレクトリごとによって挙動を変えられる。

詳しくはほでなすPHPを参照すると良い。

2007年7月20日

PHP4のサポートが2007年度で終了

PHP公式サイトにて7/13付けで2007/12/31でサポート提供が終了されるアナウンスが行われた。
以下は、公式サイトより引用。

Today it is exactly three years ago since PHP 5 has been released. In those three years it has seen many improvements over PHP 4. PHP 5 is fast, stable & production-ready and as PHP 6 is on the way, PHP 4 will be discontinued.

The PHP development team hereby announces that support for PHP 4 will continue until the end of this year only. After 2007-12-31 there will be no more releases of PHP 4.4. We will continue to make critical security fixes available on a case-by-case basis until 2008-08-08. Please use the rest of this year to make your application suitable to run on PHP 5.

一応2008/8/8まで深刻なセキュリティパッチは提供されるとのことだが、3年間サポートされ続けたPHP4はPHP5そしてPHP6に受け継がれることになった。

PHP4がリリースされてから3年もたっていることに驚いているが、4.2.0にてregister_globalsのデフォルトがOnからOffになるというメジャーバージョン級の仕様変更などPHP4はいろんな意味で僕を騒がせてくれた。

そして今もなおソースコードのバージョン移行に伴って、関数の実装変更などから頭が痛い問題が多い。これからもPHPはいろんな人を巻き込みながら、進化を続けていくに違いない。

2006年12月17日

特定のサイトで文字コードを変更する

.htaccessで以下のように設定すると特定のサイトの文字コード設定を変更できる。(PHP5の場合)

php_value default_charset "Shift-JIS"

2006年11月22日

アクセラレーター

ソースコードを変更せずにPHPの動作を高速化することが出来るアクセラレーターがあるようです。検証結果がcubic9.comさんにありますので、掲載しておきます。なお、MMCacheはeAcceleratorに変更になっています。

今度試して検証結果を報告したいと思います。

PHPの割り当てメモリ量を知る関数

PHPはコードの書き方にもよるけれども、結構メモリを食うことがある。しかし、どれくらい食っているかはなかなかわかりづらい。そこで、こんな関数を使ってみてはどうだろうか?


いずれもPHP を --enable-memory-limit オプション付きでコンパイルしたときのみ使用できるとのことです。それにしてもPHPは結構関数が多いので、ないだろうと思ってPEARにあたろうとすると意外にあったりするんだけども、なかなか探しづらいのが難点(そもそもあったら良いなと思う関数が標準関数にあるだろうという発想がないのが問題か・・・)。

2006年11月17日

ADOdb

どのようなDBであるかを意識することが必要なくなる抽象レイヤライブラリ「ADOdb」の利点について。名前の由来はMicrosoftが提唱していたADO(ActiveX Data Objects)にちなんでいる??

・プレースホルダを利用することでプログラマはSQL injectionに対する心配をしなくても良い
・DB依存しなくなるため、DBの変更が容易(アプリケーションとDBの結合度を下げる)
・キャッシュ機構を利用することができ、よく発行されるクエリに対して高速に応答することができるようになる

参考サイト:

具体的な例
詳細なガイド

2006年11月 7日

スパムホスト

ブログシステムを作ると必ずといっていいほどトラックバックスパムに悩まされることが多いのではないだろうか?そこでトラックバックスパムを制限する方法について今日は調べてみた。

スパムホストかどうかをチェックするためのDBがDNSBLというものだそうだが、それを利用できるモジュールがPEARにあったので紹介する。

2006年10月20日

チェックデジットが正しいかを調べる正規表現

JANコードには13桁のコードと短縮の8桁コードが存在するが、いずれもバーコードの読み込みエラーを防ぐためにチェックデジットが存在する。正しいJANコードかどうかを判定する正規表現をPHPで実装してみたのが次のコード。

function verifyCheckDigit($jan_code){
 return (preg_match('/^(?:(\d)(\d)(\d)(\d)(\d))?(\d)(\d)(\d)(\d)(\d)(\d)(\d)(\d)$/', $jan_code, $arr_arg) && (
  (10 -
  (($arr_arg[2] + $arr_arg[4] + $arr_arg[6] + $arr_arg[8] + $arr_arg[10] + $arr_arg[12]) * 3 +
  $arr_arg[1] + $arr_arg[3] + $arr_arg[5] + $arr_arg[7] + $arr_arg[9] + $arr_arg[11]) % 10) % 10 == $arr_arg[13]
 ));
}

一応正規表現をベースにして処理が高速化できるよう最適化してあります。

2006年10月13日

強制的に出力する文字コードを変更する方法

Apacheのdefault_charset設定がされている場合、クライアントに通知される文字コードが設定によってしまう(当たり前だが)。default_charsetで配信したくない内容(たとえばEUCでコンテンツを配信しているが、一部はXML配信したい場合など)は以下の方法で変更できる。

header("Content-Type: text/html; charset=UTF-8");

もちろんxml配信の場合には、header("Content-Type: xml/html; charset=UTF-8");となるわけですが。

2006年10月12日

set_error_handler関数

オレンジニュースを見ていたら、PHPにも致命的なエラーに対するハンドリングする方法ってのが紹介されていました。さすがに文法エラーまではハンドリングしてくれない(もちろん実行できないわけですから)ですが・・・。サイト内のページが多いと実はエラーで落ちているのに気づかないっていうケース(これもWebサーバーのログをちゃんと見ていれば問題ないはずですが)もありますから、結構活躍してくれそうです。

2006年9月27日

Zend Japanが提唱するコード標準

今日、とある理由でZend Japanの社長とお会いすることができました。Zend Japanのページを見てみると、コード標準が存在していました。社内でもコード標準があるのですが、制定するのにずいぶん苦労しました。こういう形でガイドラインがあれば非常に参考になりますね。

http://www.zend.co.jp/tech/index.php

一次元配列→多次元配列への変換

array('a', 'b', 'c', 'd')のような1次元配列をarray('a'=>array('b'=>array('c'=>array('d'))))のような多次元配列に変換するにはどのようなアルゴリズムを用いればよいだろうか?

おそらくこれを実現するのは、ポインタを使わざるを得ないだろうということで以下のようなコードを実装してみた。

 function _makeTreeStructure($arr_level, $value){
  $arr_data = array();
  $p = &$arr_data;
  for ($i = 0; $i < count($arr_level); $i++){
   $p = array($arr_level[$i] =>
    ($i == count($arr_level) - 1) ? $value : '');
   $p = &$p[$arr_level[$i]];
  }
  return $arr_data;
 }


実行コード

var_dump(makeTreeStructure(array('a', 'b', 'd', 'a', 'b', 'd'), 3));

結果は以下の通り

array(1) {
 ["a"]=>
 array(1) {
  ["b"]=>
  &array(1) {
   ["d"]=>
   &array(1) {
    ["a"]=>
    &array(1) {
     ["b"]=>
     &array(1) {
      ["d"]=>
      int(3)
     }
    }
   }
  }
 }
}

2006年9月26日

PHP5の環境においてfgetcsvの処理後のカラムが文字化けする

fgetcsv関数はVer.4→5の間で仕様変更があり、ロケール設定を考慮するようになったので、場合によっては文字化けしたり、\""に囲まれた改行を正しく処理できなかったりする。その場合には、

setlocale(LC_ALL, 'ja_JP.eucJP');

をコードに埋め込むか、もしくは、/language/japanese/global.phpに記述すると良い。

2006年9月23日

phpにおけるマルチバイトマッチング

Perlでマルチバイトマッチングを行うためには、jcode.plで $a =~ /[亜-煕]/ のようにするとマッチングできる。また、Perl 5.6からはUTF-8にてマッチングが可能だ。

PHPでもmb_eregという関数が用意されており、こちらでマッチングできるのだが、perg_match関数のようなPerl互換の強力な正規表現は用意されていない。

すべての漢字を取り出す正規表現としてコードが公開されているが、もうすこし効率の良いマッチングがPHPでもできれば柔軟な正規表現をかけるのだが。

ところで、HotPHPPER Feedには結構面白いブログのフィードが投稿されているようなので、今後はチェックしていきたい。

2006年9月22日

mb_send_mail関数がFALSEを返す

mb_send_mail関数がFALSEを返すという症状に遭遇した。error_reporting(E_ALL);に設定してもエラーメッセージは一切出力されないので、問題解決に苦労した。

/var/log/maillogには何も出力されていなかったので、おそらくPHPがSMTPサーバーにメールを渡せていないのだろうと考え、Googleで調べてみたところ際コンパイルしてみたほうが良いとのことで、際コンパイルをしてみたらうまくいった。

おそらくコンパイル時に/usr/sbin/sendmailを認識できないとmail関数は利用できないということのようだ(まぁ、あたりまえか)。

それにしても、エラーが出ないとトラブルシューティングしにくいですね。

2006年9月20日

session_id関数

以下のプログラムを実行してみるとおもしろい結果が分かる。PHPはセッションIDを知っているにもかかわらずsession_start関数が呼ばれなければ、session_idを返さないのだ。

<?php
var_dump(session_id());
var_dump($_COOKIE['PHPSESSID']);
session_start();
var_dump(session_id());
?>

セッションIDはクライアントとサーバーで同じIDを保持しており、クライアントが指定するセッションIDに日も付けられたデータをサーバーは$_SESSIONに格納する。したがって、少なくともブラウザを終了するまでの間は、2度目以降の遷移ページにおいてsession_start関数を呼び出さなくても、セッションデータは取得できるはずなのだ。

2006年9月19日

array_mergeと+演算子

配列の結合関数array_mergeと+演算子には挙動の違いがあるので注意したほうが良い。

<?=var_dump(array('A' => 'a', 'B' => 'b') + array('A' => 'c', 'D' => 'd')); ?>

<?=var_dump(array_merge(array('A' => 'a', 'B' => 'b'), array('A' => 'c', 'D' => 'd'))); ?>

array(3) {
["A"]=>
 string(1) "a"
 ["B"]=>
 string(1) "b"
 ["D"]=>
 string(1) "d"
}

array(3) {
 ["A"]=>
 string(1) "c"
 ["B"]=>
 string(1) "b"
 ["D"]=>
 string(1) "d"
}



<?=var_dump(array('A' => 'a', 'B' => 'b') + array('C' => 'c', 'D' => 'd')); ?>

<?=var_dump(array_merge(array('A' => 'a', 'B' => 'b'), array('C' => 'c', 'D' => 'd'))); ?>

array(4) {
 ["A"]=>
 string(1) "a"
 ["B"]=>
 string(1) "b"
 ["C"]=>
 string(1) "c"
 ["D"]=>
 string(1) "d"
}

array(4) {
 ["A"]=>
 string(1) "a"
 ["B"]=>
 string(1) "b"
 ["C"]=>
 string(1) "c"
 ["D"]=>
 string(1) "d"
}

正規表現

多くのプログラミング言語でも正規表現は実装されているが、実はかなり奥深い。そして、普通の人が聞いたら間違いなく「性器表現」と勘違いする不思議な言葉だ。現在、Oreillyから出版されている『詳細 正規表現 第2版』を読んでいて改めて正規表現について認識する必要があると考え、以下のとおりまとめてみた。これは今後順次改訂していく予定です。

正規表現の種類
正規表現にはPerlやPHP, Java, .NET, Python, Ruby, sedに実装されているNFAとawk, egrep, MySQLで実装されているDFAというものがある。NFAは従来からある正規表現であり、記述方法で動作速度が決まる。つまり、どれだけでも遅い正規表現を書くことが出来る(ひどい場合ではSegumentation Faultとなり、実行できない)と言うことになる。NFAで正規表現を記述するにはそれなりの知識と経験が必要になる。
一方で、DFAは最適化される正規表現であり、効率の悪い正規表現も実行動作前(コンパイル時)に最適化されて実行することになる。


文字クラス
リテラルをグループ化して、いずれか1つをあらわす。

[a-z] 小文字のアルファベットすべて
[^a-z] 小文字のアルファベット以外(「^」を最初におくと文字クラスが否定される)
[0-9] 数字すべて
[a-zA-Z] 大文字小文字を含むアルファベット
[a-zA-Z&[^mM]] 大文字小文字を含むアルファベット。但しMおよびmは除外される。


グループ
複数のパターンを表す。

(a|bc) aまたはbc
(?!a|bc) aでもbcでもない(否定形)


量子指定子
前に付くリテラルならびに文字クラス、グループを修飾する。

* 0文字以上
+ 1文字以上
? 0または1文字
{2,5} 2文字以上5文字以下
{,5} {0,5}の省略
{3,} 3文字以上


NFA拡張(Perl拡張)
NFA拡張にはキャプチャなし括弧(?: ...)、先読み(?= ...)、戻り読み(?<= ...)がサポートされている。
(?:aaa|bbb) aaaまたはbbb。但し(aaa|bbb)と異なり、括弧の中は$1で取得できないようにする(つまりメモリを節約することができる)。

(?<=aaa)bbb 直前にaaaがくるbbbにマッチ(先読み)。
(?<!aaa)bbb 直前にaaaがこないbbbにマッチ(否定先読み)。
aaa(?=bbb) 直後にbbbがくるaaaにマッチ(戻り読み)。
aaa(?!bbb) 直後にbbbがこないaaaにマッチ(否定戻り読み)。


・モード修飾子
多くの言語の場合には、大文字小文字の区別なしや改行を無視するiやxのモードを言語側で用意している。たとえば、Perlでは
$a =~ /a-z/i; #大文字小文字のアルファベットにマッチ
$a =~ /abc
def/x; #abcdefにマッチ(正規表現内の改行とタブを無効化する)
だが、正規表現内でもこれが利用できる。
(?i:[a-z])、(?:x:abc
def)で代用できる。iモード修飾子の場合には、正規表現内で大文字小文字を区別しないケースとするケースを混在させられる便利な修飾子といえる。


・欲張り型と非欲張り型
NFAにはバックトラックと言う機構によってパターンマッチングを行っている。バックトラックを抑止する方法が欲張り型であり、後続のマッチ文字列に配慮することなくマッチングする。逆に量子指定子の働きを最大限抑制する方法が非欲張り型である。いずれもNFAでサポートされている。
.++または(?>.+) 任意の文字列を欲張り型でマッチ(この場合はほとんど全ての文字列にマッチすることになり、後続するマッチ文字列の指定があれば失敗することになる)
.+? 任意の文字列を非欲張り型でマッチ。.+?aは[^a]+と同義となる。また、.*?aは[^a]*と同義。バックトラックが起こらない分だけ、それぞれ同義のマッチ文字列の方が早い。

2006年8月14日

PHPでグラフ描画

PHPでグラフを描画するライブラリには、JpGraphという有名なライブラリがあるんだけれども、商用利用では有償なのでその他のライブラリについて。

PHPlot
snort+acidにも利用されているらしい。
http://tec-tech.org/phplot5/doc/index-j.php
最終リリースが2004年10月なので、もう枯れた感が否めないが、残念ながら日本語が利用できないみたいだ。

GraPHPite
会社の人に紹介してもらったライブラリ。
PEARに移行済みで、Image_Graphとしてリリース(Ver.0.72 - α版)されている。こちらにサンプルとともにPHPコードがあるので、容易にグラフを作成することが出来る。

2006年7月13日

Apache2 + PHP + PostgreSQLインストール

Apache2 + PHP + PostgreSQLインストールの際のPHPインストールオプションメモ
./configure --with-pgsql=/usr/lib/pgsql --enable-magic-quotes --enable-sockets --enable-memory-limit --enable-calendar --enable-ftp --enable-mbstring --enable-mbstr-enc-trns --enable-mbregex --with-mime-magic --enable-mbstr-enc-trans --with-freetype --enable-gd-native-ttf --with-xml --with-apxs2=/usr/local/apache2/bin/apxs --with-gd --with-jpeg-dir --with-zlib --with-png --with-curl --with-openssls --with-config-file-path=/etc

make
make install