アシアルブログ

アシアルの中の人が技術と想いのたけをつづるブログです

独立したPEARのローカルコピーの作成方法

2009-01-19追記
elfさんのはてだで指摘されたようにレポジトリという言葉は間違ってるので、修正しました。「PEARレポジトリ」は間違いで、「PEARのローカルコピー」が正しいので、間違えて覚えてしまった人は頭の中を修正してくださいm(_ _)m
elfさんご指摘ありがとうございます。

森川です。
今回は一つのサーバで複数のPEARのバージョンを分けたいときや、アップグレードを別々に行う方法について紹介します。

といっても、PEARのマニュアルにも書いてある単純な方法です。

プロジェクトのソースにPEARを入れてしまう場合は、結構便利です。

すでにPEARがサーバにインストールされていることを前提にして、まずはPEARの設定ファイルを作成します。マニュアルでは、ホームディレクトリの .pearrc を作成していますが、複数プロジェクトを使用することを考えて、[プロジェクト名].pearrc を作成します。



$ pear config-create /path/to/project/pear ~/pearrc/project.pearrc


これで、~/pearrc/project.pearrc が作成されます。次に、PEARの基本パッケージをインストールします。



$ pear -c ~/pearrc/project.pearrc install -o PEAR


あとは、必要なパッケージをインストールするだけです。

次に、プロジェクトをチェックアウトした中にPEARが含まれている場合のチェックアウト方法です。今回は ~/project/pearPEARのインストールされているディレクトリとします。

まずは、先ほどと同様にPEARの設定ファイルを作成します。



$ pear config-create ~/project/pear ~/pearrc/project.pearrc


あとは、以下のようにアップグレードをするだけです。



$ pear -c ~/pearrc/project.pearrc upgrade Mail


これで、プロジェクトごとに独立したPEARレポジトリが持てるので、一つのサーバで複数のプロジェクトを使用する場合などにきっと幸せになれると思います。

# 2009-01-19追記
ちなみに include_path にサーバ上にインストールされている PEARディレクトリが含まれていると、同じクラスを定義したファイルを2重に読み込んだりする可能性もあるので、注意しましょう。

PEAR::Date_Holidays_Japanを触ってみました

皆さんは祝日は好きですか? 私は大好きです!

その祝日ですが、祝日法が改正されて日付が固定でない日が増えたため、いざ祝日を求めようとするとなかなか大変です。

祝日を求めるPEARライブラリとしてDate_Holidaysがありますが、先日PHPプロ!Weekly PEAR リリース @ 08/08/26号を見ていたら、その日本用ドライバであるDate_Holidays_Japanがリリースされてました。

ちょっと調べてみたところ、あのDo You PHP?のshimookaさまが作ってるんですね。これはぜひ使ってみるしかということで触ってみました。

まずはインストールです。まだ正式リリースではありませんので「-alpha」を付けます。



# pear install Date_Holidays_Japan-alpha


とりあえず、今年の祝日一覧を表示するスクリプトを作成してみます。

holidays.php


<?php
require_once 'Date/Holidays.php';

// インストール先のパスを指定
$filename = '/usr/share/pear/data/Date_Holidays_Japan/lang/Japan/ja_JP.xml';

$dh =  &Date_Holidays::factory('Japan', 2008, 'ja_JP');
$dh->addTranslationFile($filename, 'ja_JP');

$holidays = array();
foreach ($dh->getHolidays() as $h) {
  $holidays[$h->getDate()->format('%Y-%m-%d')] = $h->getTitle();
}
ksort($holidays);

print_r($holidays);
?>


では、実行します。



$ php holidays.php
Array
(
    [2008-01-01] => 元日
    [2008-01-14] => 成人の日
    [2008-02-11] => 建国記念の日
    [2008-03-20] => 春分の日
    [2008-04-29] => 昭和の日
    [2008-05-03] => 憲法記念日
    [2008-05-04] => みどりの日
    [2008-05-05] => こどもの日
    [2008-05-06] => 振替休日
    [2008-07-21] => 海の日
    [2008-09-15] => 敬老の日
    [2008-09-23] => 秋分の日
    [2008-10-13] => 体育の日
    [2008-11-03] => 文化の日
    [2008-11-23] => 勤労感謝の日
    [2008-11-24] => 振替休日
    [2008-12-23] => 天皇誕生日
)


今年の祝日が無事表示されました。振替休日などもきちんと対応してますね。素晴らしい!

ちなみに、2000年を指定するとこんな感じです。



Array
(
    [2000-01-01] => 元日
    [2000-01-10] => 成人の日
    [2000-02-11] => 建国記念の日
    [2000-03-20] => 春分の日
    [2000-04-29] => 昭和の日
    [2000-05-03] => 憲法記念日
    [2000-05-04] => みどりの日
    [2000-05-05] => こどもの日
    [2000-07-20] => 海の日
    [2000-09-15] => 敬老の日
    [2000-09-23] => 秋分の日
    [2000-10-09] => 体育の日
    [2000-11-03] => 文化の日
    [2000-11-23] => 勤労感謝の日
    [2000-12-23] => 天皇誕生日
)


よく見てみると、祝日の名称が今のままですね。2000年の頃は、4月29日は「みどりの日」で、5月4日は「国民の休日」のはず……。

試しに、先ほどのスクリプトへ次の処理を追加して実行してみます。



<?php
_p($dh, 1949);
_p($dh, 1989);
_p($dh, 2007);

function _p($dh, $year)
{
  $dh->setYear($year);
  echo sprintf("%s / %s / %s\n",
               $year,
               $dh->getHolidayForDate("{$year}-04-29", 'ja_JP')->getTitle(),
               $dh->getHolidayForDate("{$year}-04-29", 'C')->getTitle());
}
?>




1949 / 昭和の日 / Showa Emperor's Birthday
1989 / 昭和の日 / Greenery Day
2007 / 昭和の日 / Showa Day


英語名はその年の名称できちんと取得できてますが、日本語名は変わらないようですね。まだアルファ版ですので、そのうち修正されるものと思われます。

※一瞬のうちに修正されました! 下記コメントのパッチを適用して実行すると、


1949 / 天皇誕生日 / Showa Emperor's Birthday
1989 / みどりの日 / Greenery Day
2007 / 昭和の日 / Showa Day

のように正しく取得できます。shimookaさま、まことにありがとうございます。(2008年8月27日追記)

祝日も待ち遠しいですが、PEAR::Date_Holidays_Japanの正式リリースも待ち遠しいですね!

コマンドラインの引数解析を簡単に!

皆さんはPHPコマンドラインスクリプトを作成するとき、引数の解析はどうされてますか?

引数が単純であればargvをそのまま使うだけで十分ですが、オプションが多かったりすると結構面倒ですよね。

たまたまPHPプロ!Weekly PEAR リリース @ 08/08/05号Console_CommandLineという引数を解析するライブラリを見つけて使ってみたところ、なかなか便利だったのでご紹介したいと思います。

ちなみに、オプションの解析には、PHP標準のgetopt関数を使えば多少楽はできるのですが、

getopt.php


<?php
$options = getopt('d:');
print_r($options);
?>




$ php getopt.php -h -d 20080807 filename




Array
(
    [d] => 20080101
)


といったように、不明なオプションが指定されているのを判断できなかったり、引数のfilenameを取得できなかったりと、あまり使い勝手が良くありません。

PEAR::Console_CommandLineはそこもきちんと対処してくれます。なお、Pythonoptparseモジュールにインスパイアされて作られたものらしいです。

では、まずインストールします。



# pear install Console_CommandLine


例として、日付と複数のファイル名を引数にとるスクリプトを作成してみます。

command_line.php


<?php
require_once 'Console/CommandLine.php';

// パーサの作成
$parser = new Console_CommandLine(array(
  'description' => 'Console_CommandLineのサンプル',
  'version'     => '1.0.0'
));

// オプションの追加
$parser->addOption('date', array(
  'short_name'  => '-d',
  'long_name'   => '--date',
  'action'      => 'StoreString',
  'help_name'   => 'YYYYMMDD',
  'description' => '対象となる日付',
));

// 引数の追加
$parser->addArgument('files', array(
  'multiple'    => true,
  'description' => '処理するファイル'
));

// パーサの実行
try {
  $result = $parser->parse();
  print_r($result->options);
  print_r($result->args);
} catch (Exception $e) {
  $parser->displayError($e->getMessage());
}
?>


それでは、とりあえず何も指定せずに実行します。



$ php command_line.php




Error: You must provide at least 1 argument.
Type "command_line.php -h" to get help.


エラーメッセージにあるように「-h」をつけてみます。



$ php command_line.php -h




Console_CommandLineのサンプル

Usage:
  command_line.php [options] <files...>

Options:
  -d YYYYMMDD, --date=YYYYMMDD  対象となる日付
  -h, --help                    show this help message and exit
  -v, --version                 show the program version and exit

Arguments:
  files  処理するファイル


普通のコマンドのようなヘルプが表示されましたね。

それでは、パラメータを指定して実行してみます。



$ php command_line.php -d 20080807 filename1 filename2




Array
(
    [date] => 20080807
    [help] =>
    [version] =>
)
Array
(
    [files] => Array
        (
            [0] => filename1
            [1] => filename2
        )

)


連想配列に必要な情報がすべて入ってますね。あとはこれを利用して実際の処理を行うだけです。

なお、存在しないオプションを指定すると、きちんとエラーが表示されます。



$ php command_line.php -i




Error: Unknown option "-i".
Type "command_line.php -h" to get help.


また、「-v」や「--version」をつけて実行すると、バージョンが表示されます。



$ php command_line.php --version




command_line.php version 1.0.0.


また、面白い機能として、XMLでオプションの設定をすることもできるようです。

バッチ処理などPHPコマンドラインスクリプトを作成する際、引数が複雑な場合はPEAR::Console_CommandLineを使ってみては如何でしょうか。

PHP_Ncursesを使ってPEARインストーラの対話インターフェースを実装してみた

こんにちは、亀本です。

先日、第33回PHP勉強会を開催してきました。
参加者の皆さん、並びに招待発表を引き受けてくださったke-tai.orgのmatsuiさん、ありがとうございました。また、運営を協力してくださった皆様、お疲れ様でした。
それに関するいろいろのことは、また後ほどどこかでまとめることにして、今回はTechネタのブログですw
(アシアルブログは少し変わった当番制を取っていて、今日は技術ネタ当番に当たってたりします。。。(--;)


さて、今回はちょっと、PHPに実装されているNcursesの利用APIを用いて遊んでみました。

PEARのインストールって、普段みんなどうなさってるでしょうか。ほとんどの方がpearコマンドを使って、いるのではないかと思います。

他にもWeb上から実行するとか、Gtkのインターフェースがあるらしいとか、rpmにしてインストールとかいろいろあるみたいなんですが、ためしにPHPのNcursesモジュールを使ってパッケージのインストールを対話的に行えるようにしてみました。

とはいえ、遊び半分な感じなので、機能的には骨格ができてるだけ、という感じです。
今さらpearコマンドが対話的になってうれしいこともあまりない気もしますし、Ncursesをラッピングして利用する際のサンプル程度に思っていただければと思います。

なにしろ、まずPHPを--with-ncursesで再コンパイルしないといけないし、本末転倒orz

ソースはこちら

pearコマンドを丸ごと代替・・・と、ばっちり言えればよかったのですが、ひとまずpear.php.netチャンネルについてのlistとinstallをくっつけてみただけ、という状態になっています。

動作画面:


利用するには、先述のとおり--with-ncursesをつけて再コンパイルしないといけません。

まだまだ張りぼて感が出ちゃってますので、実用には耐えない気がします。
そのうち、その他のコマンドやパッケージによってbateかどうかとかいろいろ見るとか、やれるようにしたいですね。需要があればw
# ノリノリで手伝ってくれそうな人とかいたら、CodeReposに投げて開発したいなー、なんてたくらんでたり。。。


PHPのNcursesはマニュアルもすかすかだし実装もNcursesのAPIをすべてラッピングしきれていないなど、貧弱なところもありますが、こういったちょっとしたインターフェースを作るにはそれほど困りません。

Cでバリバリ書いていくほどでもないけど、ちょっとGUIっぽくしたい。。。なんて人は、ちょっとNcursesモジュールを触ってみると面白いかもしれません。

絵文字ライブラリをPEARパッケージ化&sfPictogramMobilePluginをバージョンアップしました。

こんにちは。相変わらず携帯ネタで引っ張る亀本です。

先日、第32回PHP勉強会へ参加してきました。
詳細はid:maru_ccさん、id:sotarokさんなどなど大勢の方がブログに書いてくださっているので割愛しますが、なんだかEthnaの話とPHP以外の話が非常に多い会でした。

そのなかでid:maru_ccさんがEthnaでの携帯サイト構築の話をしてくださったのですが、結構いろいろな質問が飛び交っていて、やっぱりもっと携帯周りの情報共有が進むといいのにね、もったいないよね、という話を何名かの方としていました。

そんな話に少しばかり触発されて、絵文字プラグインを公開していた自分としても、もっといろんな人の役に立ててもらいたいと思って、syfmony用のプラグインだったものを汎用のPEARパッケージ化してみました。

PEARパッケージ版:Text_Pictogram_Mobile-0.0.1.tgz
修正版:Text_Pictogram_Mobile-0.0.2.tgz
--
# 追記:データのインストール先がおかしくなっていたので修正
--

また、併せてsymfonyプラグインの方もバージョンアップしました。

symfonyプラグイン版:sfPictogramMobilePlugin-0.0.4.tgz


インストール方法はそれぞれ、


$ pear install http://blog.asial.co.jp/data/Text_Pictogram_Mobile-0.0.2.tgz




$ symfony plugin-install http://blog.asial.co.jp/data/sfPictogramMobilePlugin-0.0.4.tgz


とやってください。

symfonyプラグインの変更点は
・bugfix: Nonmobileが役立たずだったのを修正
・bugfix: getFromattedPictogramsArray()メソッドのキャリア指定時のバグを修正
UTF-8を内部絵文字コードに変換できるように追加
・内部文字コードのprefix, suffix, escapeシーケンスを指定できるように変更
・外部の絵文字データベースを指定できるように変更

という感じです。
PEARライブラリの方も機能的には同じです。
ただし、symfonyプラグインを移植した関係上、PHP5以上でないと使えません。
PHP4に対応も考えたのですが、まずはとにかく出すことが優先かなと思って、PHP5用パッケージにしました。

にしても、このやり方は2重化するので修正するにも効率悪くて、もうちょっと何とかしたいですねw

PEARパッケージを使う場合は、まずパッケージをrequireして、factoryメソッドを使って


require_once("Text/Pictogram/Mobile.php");
$picObject = Text_Pictogram_Mobile::factory($carrier, $type);


とします。
その他の基本的な使い方は以前のエントリを見てください。


にしても、隠し機能状態のものがいくつかあるのでw、どっかでマニュアルそろえないと。。。なかなかブログを書く時間内におわらないのが悩みです><

テキストから図を作成 - Graphviz

皆さんは、ちょっとした図が必要になったとき、どうされてますか?
エクセルを使って作成したり、文字を駆使してテキストで作成したりでしょうか。ただ、エクセルだとちょっと大仰だったり、テキストだとちょっと面倒だったりといった場合もあるかと思います。
今回はそんな時に便利な Graphviz をご紹介します。

Graphviz - Graph Visualization Softwareは、AT&T研究所が開発したフリーソフトウェアで、DOT言語というグラフ記述言語で書かれたテキストファイルから図を出力することができます。

それでは、早速インストールして使ってみましょう。

Windowsの場合は、
 http://www.graphviz.org/Download_windows.php
からダウンロードしてインストールします。
ただ、私の環境ではmsi版は動作しませんでしたので、exe版のほうをインストールしました。

Linuxの場合は、
 http://www.graphviz.org/Download_linux.php
からダウンロードしてインストールします。
なお、お使いのディストリビューションFedoraであれば、



# yum install graphviz


Debianであれば、



# apt-get install graphviz


で簡単にインストールできます。

では、次のような画面遷移図を作成する場合を例に進めていきます。



+----------------------+
|   会員情報入力画面   |
+----------------------+
          ↑↓
+----------------------+
| 会員情報入力確認画面 |
+----------------------+
           ↓
+----------------------+
| 会員情報入力完了画面 |
+----------------------+


まずは下記の内容のファイルを作成します。

sample1.dot


digraph sample1 {
  form -> confirm;
  confirm -> finish;
}


では、図に変換してみましょう。コマンドラインから次のように実行します。



$ dot -Tpng -o sample1.png sample1.dot


ここではpng形式で出力していますが、jpegsvgなど、他にもいろいろな形式で出力することができます。

さて、出力されたpngファイルを見てみると、次のような感じになると思います。



なお、sample1は下記のように書くこともできます。



digraph sample1 {
  form -> confirm -> finish;
}


次に、formとconfirmの矢印を両向きにします。

sample2.dot


digraph sample2 {
  form -> confirm [ dir = both ];
  confirm -> finish;
}




最後に、枠を四角にして、日本語の名称をつけます。日本語を使う場合は、日本語が表示できるフォントを指定し、dotファイルの文字コードUTF-8で保存する必要があります。

sample3.dot


digraph sample3 {
  node [ fontname = "meiryo" shape = box ];

  form    [ label = "会員情報入力画面" ];
  confirm [ label = "会員情報入力確認画面" ];
  finish  [ label = "会員情報入力完了画面" ];

  form -> confirm [ dir = both ];
  confirm -> finish;
}




完成!!

蛇足ですが、ステートチャート図っぽくするとこんな感じでしょうか。

sample4.dot


digraph sample4 {
  graph [];

  node [
    fontname = "meiryo"
    shape = record
    style = rounded
  ];

  edge [ arrowhead = vee ];

  first [
    label = ""
    height = 0.2
    shape = circle
    style = filled
    fillcolor = black
  ];

  form    [ label = "{会員情報入力画面|}" ];
  confirm [ label = "{会員情報入力確認画面|}" ];
  finish  [ label = "{会員情報入力完了画面|}" ];

  last [
    label = ""
    height = 0.2
    shape = doublecircle
    style = filled
    fillcolor = black
  ];

  first -> form;
  form -> confirm [ arrowtail = vee ];
  confirm -> finish -> last;
}




さすがにこれはやりすぎですが、例えばsample3へ会員情報一覧画面を追加したいといった場合も、ちょっと修正するだけで簡単に追加できます。

sample5.dot


digraph sample5 {
  node [ fontname = "meiryo" shape = box ];

  list    [ label = "会員情報一覧画面" ];
  form    [ label = "会員情報入力画面" ];
  confirm [ label = "会員情報入力確認画面" ];
  finish  [ label = "会員情報入力完了画面" ];

  list -> form -> confirm [ dir = both ];
  confirm -> finish -> list;
}




どうでしょうか。ちょっと繋ぎ先を変更したいといった場合も簡単に修正できますし、もとはテキストファイルですので、Subversionなどのバージョン管理システムで変更箇所の履歴を追うことも簡単です。
Wikiとの親和性も高いと思われますので、各種Wiki用のプラグインもあります。

MediaWiki用エクステンション Extension:GraphViz
Tracプラグイン Graphviz Plugin
PukiWikiプラグイン graphviz.inc.php

また、PHPからGraphvizを扱うことが出来る PEAR::Image_GraphViz というPEARパッケージもありますので、PHPを使って大量のデータを可視化することもできます。

使いこなせばとても強力なツールになると思いますので、皆さんもぜひ使ってみてはいかがでしょうか。

関数のデバッグトレーサー - PHP_FunctionCallTracer

皆さんはPHP_FunctionCallTracerというPEARライブラリをご存知でしょうか?
私は先日1.0.0RC1のリリース情報を見て初めて知ったのですが、これは関数のデバッグトレースを行うためのライブラリで、トレース結果を表示したり、ファイルへ書き出したりすることができます。

まずは、PEARコマンドを使ってインストールします。この際、まだ正式リリースではありませんので、「-beta」を付けます。

※13日に1.0.0がリリースされましたので、「-beta」は付けなくても大丈夫です(2007年9月18日追記)



# pear install PHP_FunctionCallTracer-beta


次に、下記の内容のexample.phpを作成します。



<?php
require_once 'PHP/FunctionCallTracer.php';

function example($before)
{
  PHP_FunctionCallTracer::traceArguments();

  $after = strtoupper($before);
  PHP_FunctionCallTracer::traceVariables($after);

  PHP_FunctionCallTracer::traceReturn($after);
  return $after;
}

example('hoge');
PHP_FunctionCallTracer::putTrace();
?>


それでは、早速実行してみます。



$ php example.php
Array
(
  [php_uname] => Linux localhost.localdomain 2.6.18-8.1.8.el5 #1 SMP Tue Jul 10 07:06:45 EDT 2007 x86_64
  [date] => Wed, 12 Sep 2007 14:02:14 UTC
  [calls] => Array
    (
      [0] => Array
        (
          [call] => Array
            (
              [file] => /path/to/example.php
              [line] => 15
              [function] => example
            )

          [in] => Array
            (
              [file] => /path/to/example.php
              [line] => 6
              [args] => Array
                (
                  [0] => hoge
                )
            )

          [watches] => Array
            (
              [0] => Array
                (
                  [file] => /path/to/example.php
                  [line] => 9
                  [args] => Array
                    (
                      [0] => HOGE
                    )
                )
            )

          [out] => Array
            (
              [file] => /path/to/example.php
              [line] => 11
              [args] => Array
                (
                  [0] => HOGE
                )
            )
        )
    )
)


関数の引数や戻り値、指定した変数などがスクリプト名やその行番号と共に表示されているのが見て取れます。それぞれ

・traceArguments() … [call],[in]
・traceVariables() … [watches]
・traceReturn() … [out]

といったように対応しているようです。

また、putTrace()は



PHP_FunctionCallTracer::putTrace("/path/to/filename");


のようにファイル名を指定することで、ファイルへ出力することもできます。

PHP_FunctionCallTracerは他のPHP用デバッガの置き換えを目指したものではないとのことで、高機能というわけではありませんが、リモートデバッグ時に複雑な関数呼び出しの動作をトレースする際は便利かも知れませんね。

「文字識別」ではないCAPTCHA

こんにちは。CoCo一番のカレーを1食1辛ずつ上げていく事にチャレンジ中の亀本です。
前回6辛までいって、次回は7辛です。
さほど辛さに強くないので、そろそろ泣きそうです。ちなみに前回は食後に鼻血出しました。

今回はちょっとCAPTCHAのライブラリをあさってみました。
PHPで普通に文字画像識別によるCAPTCHAを実装するのであれば、
PEAR::Text_CAPTCHA
http://www.doyouphp.jp/sample/sample_others_captcha.shtml
や、Visual and Audio CAPTCHA
http://www.phppro.jp/phptips/archives/vol34/#1
といったものがあり、他にも
http://phpspot.org/blog/archives/2006/11/phpcaptcha.html
などでまとめられているように、数多くのライブラリが存在します。

これら文字画像識別のCAPTCHAは一般的ですが、そればかりでもつまらないので、少し変わったCAPTCHAを扱いたいなー、と思い、以下の2つのライブラリを使用してみました。

1.PEAR::Text_CAPTCHA_Numeral
http://pear.php.net/package/Text_CAPTCHA_Numeral
2つの数字による簡単な計算式を提示し、その計算結果を答えさせることで認証を行う、という仕組みのCAPTCHAライブラリです。

まずは、いつものごとくインストール


# pear install Text_CAPTCHA_Numeral


これを使って、簡単なサンプルを作成してみました。

numeral_ex.php:


<?php
require_once "Text/CAPTCHA/Numeral.php";
session_start();

if (isset($_POST["answer"])  & & $_POST["answer"]  & & isset($_SESSION["answer"])) {
  $message = ($_POST["answer"] == $_SESSION["answer"]) ? "認証OK" : "認証NG";
  unset($_SESSION["answer"]);
}

$numeral = new Text_CAPTCHA_Numeral();
$_SESSION["answer"] = $numeral->getAnswer();

?>
<html>
<head>
  <title>Text_CAPTCHA_Numeralサンプル</title>
</head>
<body>
  <h1>Text_CAPTCHA_Numeralサンプル</h1>
<?php if (isset($message)): ?>
  <p style="color:#FF0000;"><?php echo $message; ?></p>
<?php endif; ?>
  <form action="numeral_ex.php" method="post">
    次の計算結果を入力してください。
    <?php echo $numeral->getOperation(); ?>
    <input type="text" name="answer" value="" />
    <input type="submit" name="submit" value=" 認証 " />
  </form>
</body>
</html>


このライブラリは非常に小さく、publicなメソッドは、コンストラクタを除くと
getAnswer()
getOperation()
getFirstNubmer()
getSecondNumber()
の4つしかありません。
どれも単純な命名なので、使い方は名前から想像出来ますね。

普通の数字を用いるため、このままでは強度が高いとは言えない気もしますが、画像を使用せず、しかも容易にCAPTCHA認証が組み込めるのでちょっとしたところには便利だと思います。


2.Auth_Kitten
http://labs.cybozu.co.jp/blog/tsuruoka/anubis/blog_show/46
仔猫の画像を選択することで認証を行おう、という仕組みのライブラリです。

インストールはやっぱりいつもの如く



pear install http://labs.cybozu.co.jp/blog/tsuruoka/archives/Auth_Kitten-0.1.0.tgz


本当ならここで仔猫画像を集めなければいけませんが、このライブラリにはデフォルトで使用する素敵な猫画像がついていますので、これをそのまま使用します。

以下に簡単なサンプルを作成してみました。
# といっても、ほぼ配布元サイトと変わりませんが。。。(^^;

kitten.php:


<?php
require_once 'Auth/Kitten.php';

$kitten = new Auth_Kitten();

if (isset($_POST['submit'])  & & $_POST['submit']) {
  $message = $kitten->verify($_POST['kitten']) ? "認証OK" : "認証NG";
}

$html = $kitten->buildHtml('viewer.php?f=');

?>
<html>
<head>
  <title>Auth_Kitten サンプル</title>
</head>
<body>
  <h1>Auth_Kitten サンプル</h1>
<?php if (isset($message)): ?>
  <p style="color:#FF0000"><?php echo $message; ?></p>
<?php endif; ?>
  <form method="post">
    <?php echo $html; ?>
    <input type="submit" name="submit" value=" 認証 " />
  </form>
</body>
</html>



viewer.php(画像表示):


<?php
require_once 'Auth/Kitten.php';

$auth = new Auth_Kitten();

$photo = $auth->drawImage(basename($_GET["f"]));

echo $photo;
?>

これでkitten.phpにアクセスすると、こんな感じで仔猫認証フォームが生成されます。


仔猫画像は見ていても和みますし、実際のCAPTCHAとしての機能もなかなかのものです。
もちろん独自の画像も使用できますので、仔猫に限らず好みの画像認証が可能です。

その場合には、画像の入ったディレクトリ内に
kittin/
other/
という2つのディレクトリを用意し、その中にそれぞれOKの場合とNGの場合の画像を入れます。
そして、その画像ディレクトリをsetImagePathメソッドで指定してやれば利用可能です。
なお、その際にはファイル名はできるだけ重複しないようにして下さい。


様々なCAPTCHA認証がありますが、こんな一風変わったものも存在します。
何かの折に、使ってみると面白いかもしれません。

PHPで簡単に3D画像作成!

最近、特に何もしてないのにやたら日焼けしているらしい中川です。

PHPで3D画像を簡単に作成することができるライブラリ
PEAR::Image_3D」を紹介します。
3D画像をつくるとなるといろいろと面倒だったりするものですが、
このライブラリを使えば比較的簡単に3D画像を作成することができます。

現在、「PEAR::Image_3D」はver0.4.0のalpha版で提供されています。
マニュアルがなかったり、動作に不安がありますが、
サンプルファイルがたくさんあるので、よく動作確認してから利用してください。

インストールはpearコマンドで行えます。
PHPはGDを使えるようにしておいてください。)



# pear install Image_3D-alpha


それでは早速、サンプルをちょっと編集したもので動作を確認してみましょう。



<?php
set_time_limit(0);
require_once('Image/3D.php');

$world = new Image_3D();
$world->setColor(new Image_3D_Color(255, 255, 255));

$light = $world->createLight('Light', array(-400, -50, -100));
$light->setColor(new Image_3D_Color(255, 255, 255));

$text = $world->createObject('text', 'PHPpro-TIPS');
$text->setColor(new Image_3D_Color(0, 200, 255));
$text->transform($world->createMatrix('Rotation', array(0, 40, 0)));
$text->transform($world->createMatrix('Move', array(-30, 0, 0)));
$text->transform($world->createMatrix('Scale', array(3, 3, 3)));

$world->setOption(Image_3D::IMAGE_3D_OPTION_BF_CULLING, false);
$world->setOption(Image_3D::IMAGE_3D_OPTION_FILLED, true);

$world->createRenderer('perspectively');
$world->createDriver('GD');

$filename = "phppro.png";
$world->render(300, 50, $filename);

header("Content-Type: image/png");
readfile($filename);
exit;
?>




このように、簡単に3D画像を作ることができます。
他にも、サンプルには次のような画像を作成するスクリプトがあります。



まだマニュアルはそろっていないみたいようなので、
サンプルコードを見たり、実際のソースコードを確認しながら使ってみて下さい。
PHPで3D画像が作成できるということで、中々、便利なライブラリではないでしょうか。