PHP フレームワーク乱立に終止符!?

CakePHP 関連の書籍が続々と発行されており、書店に立ち寄るたびに新しいCake本を目にします。


1、2年前までは Zend Framework が大本命と言われていましたが、2009年4月の段階では CakePHPPHPフレームワークデファクトになった感さえあります。


真夜中ナビ 深夜営業のお店探しはネイティブPHPから移行できてない状態ですが、他社様の案件や自社の新案件は殆どすべて CakePHP で作っています。


理由はWEBアプリケーションの根幹ともいえるCRUD処理に関するコーディング量が劇的に減り、開発&メンテナンスが驚くほど簡素化されることです。


フォーム関連処理が貧弱、同機能がバージョン間で全く異なるシンタックスだったりと、フレームワークとしては発展途上ですが、ケーキはやっぱり旨いです。(うまいこと言ったようで、言えてない…orz)

PHP使いはもう正規表現をblogに書くな

PHPer(?)のハシクレとして、小飼弾のブログ記事 「PHP使いはもう正規表現をblogに書くな」と言わせないでくれ を興味深く読みました。

かなり使えるPHPの正規表現まとめという記事中にダメ正規表現があるとのこと。さらには、PHP周辺ブログにダメ正規表現が多いとのこと。

確かに上のブログ記事中の正規表現は実用に足るレベルのものではないので、正規表現の勉強目的だとすれば良い記事になりそうです。

    • -

[ PHP の資産はオープンソース ]

PHPには WordPress, EC Cube 等の実用アプリケーション、 PEAR, ZendFramework, CakePHP 等のライブラリ/フレームワークなどの中に数え切れないほどの“使える/使われている正規表現”があります。

PHPを使う際には中途半端なまとめ記事ではなく、そういうところから技を盗む習慣が大切だと思います。

Aptana の導入メモ / PHP開発環境

toku-hiro2009-02-08

PHP の開発環境というと、テキストエディタ(無償/有償)、Dreamweaver(有償)、Eclipse系(無償)、PHP専用の開発環境ソフト(無償/有償)など人それぞれだと思われますが、EclipseIDEAptana を紹介します。


※ オススメというわけではなく、単に選択肢のひとつとしてのメモにすぎません。開発環境は個人の使いやすいものがベストだと思います。

    • -

2008年12月にJavaScript, HTML/CSS などのWebデザイナー向けのIDEAptana」にPHP開発環境( PHP Development Environment 1.0 )が追加されました。

参考:Aptana PHP 開発からデプロイ、運用まで支援最新ツール登場


以下は、AptanaWindowsVista)で使用する際の導入メモとなります。


1. Aptana Studio のインストール

Download Aptana Studio からダウンロード&インストール。ウィザードでインストールできるので道なりです。
インストールしたのは、2009年2月現在の最新バージョン: Aptana Studio 1.2.1

AptanaEclipseIDE なので、JDK がインストールされてないと動かないかもしれません。以下、JDK はインストールはされているものとします。


2. 日本語化

Eclipse の日本語化プラグイン Pleades を使用して日本語化します。
Pleiades のダウンロード

解凍後、インストールした Aptana_Studio の plugins, features フォルダを Pleades の同名フォルダで追加上書きします。

さらに Aptana Studio をインストールしたフォルダにある AptanaStudio.ini というファイルをテキストエディタで開いて最後の行に以下の一行を追加します。

-javaagent:plugins/jp.sourceforge.mergedoc.pleiades/pleiades.jar=default.splash

以上で Pleades による日本語化ができます。


3. EUC-JP, Shift-JIS の文字化け対策

文字コードとしてEUC-JP, Shift-JIS を使用している場合には Aptana で編集しようとすると、文字化けして編集できないことがあります。

その場合の解決方法は以下のページを参照
AptanaでHTMLファイル内のshift_jisやEUC-JPコードを表示できません。

JavaをインストールするとC:\Program Files\Java\jre\lib\にcharsets.jarができるので これをC:\Program Files\Aptana\Aptana Studio\jre\libに入れればOK。

※便宜上そのまま引用させて頂だきました。パスは各自の環境により異なります。


4. PHP Development Environment 1.0 プラグインの追加

Aptana Studio 1.2.1 では GUI でインストールできます。インストール後に必ず起動される My Aptana の Plugins から GUI で簡単にインストールできます。


以上で最低限の開発環境が整います。

ImageMagick でサムネイル化すると IE7 で表示されないバグについて

ImageMagick を使用してアップロード写真のサムネイルを生成すると、Internet Explorer(以下 IE )でサムネイルが表示されない、という現象が起きます。

※表示されない=画像リンク切れ同様の×マークが表示されます。


不思議なことに Firefox では全く問題なく閲覧可能です。また、IEでも一部のサムネイル画像にだけ上記の現象が起きて、多くの場合は正しく表示されます。


ImageMagick では IE で表示できなくなる画像でも、GD を使用してサムネイル化すると正常に表示できます。


IE のバグなのか、ImageMagick のバグなのか???


バグの原因そのものが特定できず、苦労したのでメモしておきます。


なお、以下のページでも現象の報告はされていますが、原因究明がなされていないので参考になりませんでした。

              • -

OpenPNEの画像縮小にImageMagickを用いているのですが、一部のgif画像が表示されないという現象が起きました

#591 (IE7で表示されない画像がある) - OpenPNE - Trac

            • -


※ 以下は理論的に究明したわけではなく、試行錯誤の結果なので間違っているかもしれません。


【原因】

まず結論から。

IE では色空間が CMYK の画像を表示できない


これが上記の現象の原因です。色空間が RGB の画像は表示できるのですが、IEでは CMYK の画像は表示できないそうです。色の専門家ではない上に、ImageMagick のバグなのか、IEのバグなのかも見当がつけられなかったので、この原因を突き止めるのに相当苦労しました。


【確認方法】

[前提]
Imagick の基本的な使い方は本題からずれるので省略します。ここでは説明のためサムネイル作成手順を以下のように簡略化します。
(imagick オブジェクトの基本的なメソッドの説明もPHPマニュアルを見れば解決するので省略)

<?php
$imagick = new Imagick(LOAD_FILE_NAME);
$imagick->thumbnailimage(400, 300);
$imagick->writeImage(SAVE_FILE_NAME);
?>


表示に成功する画像と失敗する画像の確認方法は以下です。

<?php
$imagick = new Imagick(LOAD_FILE_NAME);
var_dump($imagick->getImageColorspace());// CMYK の場合 int(12) , RGB の場合int(1) 
exit;
?>


ほとんどの画像ファイルは int(1) つまり 色空間が RGB なのですが、まれに int(12) つまり CMYK のものがあります。この CMYKIE でのみ表示できない失敗画像です。

      • -

※基本的なことなので省略しましたが、なぜ RGB が 1 で CMYK が 12 なのかわからない方は ImageMagick の定義済み定数( imagick::COLORSPACE_RGB と imagick::COLORSPACE_CMYK )を参照してください。
http://jp.php.net/manual/ja/imagick.constants.php

      • -


以上が原因確認方法となります。


【解決方法】

imagick::setImageColorspace で色空間を(強制的に) RGB に設定します。(後述しますがうまくいきません!!)

<?php
// うまくいきません!!
$imagick = new Imagick(LOAD_FILE_NAME);
$imagick->setImageColorspace(1);// RGB に設定
$imagick->thumbnailimage(400, 300);
$imagick->writeImage(SAVE_FILE_NAME);
?>


一応、IE でも表示されるサムネイルができるのですが、色空間を変更すると画像が異常に汚くなります。実際に手を動かして確認頂けると明らかですが、サービスとして使えるレベルではありません。


RGB から CMYK への変換は Adobe系のソフトではスムーズらしいですが(未確認)、ImageMagick では難しいようです。
CMYK の画像は ImageMagick をあきらめて、(一般的に画質は良くないですが) GD にするしかなさそうです。

※ GD を使うと CMYK の画像もスムーズに RGB に変換されます。なお、GD の場合には色空間の設定/変換処理は内部的に実行されるため、PHP側での処理は特に必要ありません。

<?php
$imagick = new Imagick(LOAD_FILE_NAME);
$colorSpace = $imagick->getImageColorspace();
if ($colorSpace == 1) {
    $imagick->thumbnailimage(400, 300);
    $imagick->writeImage(SAVE_FILE_NAME);
} else {
    // GD
    // 省略

}
?>


以上です。

    • -

1行PR

真夜中ナビ 深夜営業・24時間営業のお店探し

形態要素解析の比較 MeCab / Yahoo!API

MeCabYahoo!日本語形態素解析API の解析結果の特徴を調べてみました。MeCab, Yahoo!APIともに「名詞」に限定して出現頻度を調べました。

    • -

MeCab についてはmecab + PHP で形態素解析(出現頻度)の方法を参照
Yahoo!日本語形態素解析APIの使い方についてはドキュメントを参照。(基本的なAPIなので省略)

    • -

1.ドラゴンボール

wikipedia ドラゴンボールのストーリーを使用。

七つ集めれば、どんな願いでも一つだけ叶えてくれる「神龍(シェンロン)」を呼び出すことができる、ドラゴンボール。それに関わる様々な冒険物語で、人里はなれた山奥に住む尻尾の生えた少年・孫悟空がドラゴンボールを求めて西の都から来た少女・ブルマと出会うところから物語は始まる。

やがて最初のドラゴンボール探しの途中で知り合った亀仙人の下で修行し、天下一武道会やレッドリボン軍、ピッコロ大魔王等との闘いを通じてたくましく成長した悟空は、兄ラディッツにより、自分が惑星ベジータ出身の戦闘民族サイヤ人であることを知らされる。その後サイヤ人の王子ベジータと死闘を繰り広げ、永遠のライバルとなる。さらにサイヤ人をも支配する宇宙の帝王フリーザとナメック星で激突、伝説の超サイヤ人に目覚める。

地球帰還後、未来から来た少年トランクスから、かつて悟空が少年時代に壊滅させたレッドリボン軍の生き残りであるドクター・ゲロの存在、彼が作り上げた2体の最強の人造人間が3年後に現れること、その脅威、そして悲惨な未来を知らされる。悟空を始めとする戦士達はそれらを未然に防ぐのではなく、戦うことを選択。しかし事態は未来のトランクスが知っている歴史とは大きく違うものとなり、トランクスさえ知らなかった人造人間達、さらにはドクター・ゲロのコンピューターが作り上げた生命体セルが登場。悟空はこの戦いで命を落とす。

その後主人公は成長した息子孫悟飯に変わる。悟飯は平和な学園生活の最中、宇宙最強最悪の生命体魔人ブウとの宇宙存亡をかけた戦いに巻き込まれていく。

【結果】


MeCabYahoo!API

6
5
4
4サイヤ
4こと
3未来
3
3少年
3宇宙
3ボール
3ドラゴン
3トランクス
2物語
2
2
2戦い
2生命
2成長
2人造
2人間
2最強
2
2
2レッド
2リボン
2ベジータ
2ドクター・ゲロ
2その後
1惑星
1歴史
1
1様々
1
1民族
1未然
1魔王
1
1冒険
1平和
1武道
1悲惨
1
1
1闘い
1
1
1途中
1登場
1伝説
1天下
1帝王
1地球
1孫悟空
1
1存亡
1存在
1息子
1選択
1戦闘
1戦士
1仙人
1西
1生活
1生き残り
1
1人里
1
1尻尾
1少女
1出身
1修行
1主人公
1七つ
1自分
1時代
1事態
1死闘
1支配
1始め
1山奥
1最中
1最初
1最悪
1激突
1
1脅威
1
1帰還
1願い
1学園
1壊滅
1
1
1王子
1永遠
1一つ
1
1ラディッツ
1ライバル
1ブルマ
1ブウ
1フリーザ
1ピッコロ
1ナメック
1セル
1シェンロン
1コンピューター
1もの
1
1ところ
1それら
1それ
13
12

4サイヤ
4悟空
3こと
3トランクス
3ドラゴンボール
3宇宙
3少年
3未来
2ゲロ
2ドクター
2ベジータ
2リボン
2レッド
2人造人間
2
2悟飯
2成長
2戦い
2最強
2物語
2生命体
12
13
1それら
1ところ
1もの
1コンピューター
1シェンロン
1セル
1ナメック
1ピッコロ
1フリーザ
1ブウ
1ブルマ
1ライバル
1ラディッツ
1一つ
1七つ
1
1主人公
1
1事態
1人里
1仙人
1
1伝説
1修行
1
1冒険
1出身
1
1地球
1壊滅
1天下一
1始め
1存亡
1存在
1学園
1
1孫悟空
1少女
1尻尾
1山奥
1帝王
1帰還
1平和
1
1息子
1悲惨
1惑星
1戦士
1戦闘
1探し
1支配
1時代
1最中
1最初
1最悪
1未然
1様々
1武道
1歴史
1死闘
1民族
1永遠
1激突
1王子
1生き残り
1生活
1登場
1神龍
1脅威
1自分
1西
1途中
1選択
1
1闘い
1願い
1魔人
1魔王
【検証】 解析結果よりも10倍の重力で修業したら本当に強くなるのか?ということの方が気になった方が多いのではないでしょうか。 2. 東京都 wikipedia東京都を使用。

東京都は、日本の首都として、司法・立法・行政の中心地であり、経済の中心地でもある。日本の都道府県の中では人口が最も多く、人口密度は大阪府と同程度である。東京都区部を中心とする東京大都市圏は、世界で最も人口が多い都市圏であり、経済規模ではニューヨーク大都市圏を凌ぎ世界最大である[1]。またニューヨーク、ロンドン、パリと共に世界最上位レベルの世界都市にあげられることもある[2]。

明治維新以前の東京市の旧称は江戸であり、戦国時代には太田道灌の城下町、江戸時代には江戸幕府の所在地・徳川将軍家の城下町として栄えた。第二次世界大戦中の1943年7月1日に、東京都制(昭和18年法律第89号)が施行され 、東京府と東京市を統合した形で東京都が設置された。第二次大戦後の1947年(昭和22年)に、地方自治法が施行されたために東京都制は廃止されたが、東京都の名称と行政区域は変更されず、現在に至っている。このため東京都庁は、市役所(23区を包括する市)としての機能と県庁として広域行政体としての機能を併せ持つ。

東京都庁舎は長年千代田区の有楽町にあったが、1991年(平成3年)4月1日に新宿区の新宿副都心に移転した。移転に伴い、地方自治法に従って都条例も改正され、現在の都庁所在地は新宿区となっている[3]。ただし、地図上での都庁所在地の表記は、便宜上「東京」が使用され続けている[4]。なお、東京都の英語表記は、Tokyo Metropolis(あるいは Tokyo Metropolitan prefecture)である。東京都庁を指して東京都ということもあるが、この場合はTokyo Metropolitan Governmentとなる。


【結果】

MeCabYahoo!API

16東京
9
6
5世界
4都庁
4
4]。
4[
3都市
3中心
3人口
3新宿
3所在地
3
3行政
3江戸
3
3Tokyo
31
2
2
2表記
2日本
2
2
2
2地方
2
2大戦
2城下町
2昭和
2自治
2
2時代
2施行
2現在
2
2経済
2機能
2移転
2ため
2こと
2Metropolitan
24
23
1立法
1有楽町
1明治維新
1名称
1密度
1幕府
1法律
1包括
1変更
1平成
1
1廃止
1徳川
1道灌
1統合
1都道府県
1都心
1都区
1程度
1長年
1庁舎
1地図
1大都市
1大阪
1
1太田
1戦国
1千代田
1設置
1制は
1
1条例
1場合
1上位
1
1将軍家
1首都
1市役所
1司法
1使用
1最大
1
1広域
1
1県庁
1
1区域
1旧称
1規模
1改正
1英語
1以前
1ロンドン
1レベル
1パリ
1ニューヨーク大
1ニューヨーク
1prefecture
1Metropolis
1Government
11991
11947
11943
189
123
122
118
17
12

9東京都
5世界
5東京
31
3Tokyo
3所在地
3行政
23
24
2Metropolitan
2こと
2ため
2ニューヨーク
2中心地
2
2人口
2地方
2城下町
2大都市圏
2新宿区
2施行
2日本
2東京都庁
2機能
2江戸
2現在
2移転
2経済
2自治
2表記
2都庁
118
11943
11947
11991
12
122
123
17
189
1Government
1Metropolis
1prefecture
1パリ
1レベル
1ロンドン
1
1中心
1人口密度
1以前
1
1使用
1副都心
1包括
1区域
1区部
1千代田区
1司法
1名称
1地図
1場合
1変更
1大戦中
1大戦後
1大阪府
1太田
1将軍家
1
1市役所
1幕府
1庁舎
1広域
1
1廃止
1
1徳川
1戦国時代
1改正
1新宿
1旧称
1明治維新
1最上位
1最大
1有楽町
1江戸時代
1法律
1県庁
1程度
1立法
1統合
1英語
1規模
1設置
1道灌
1都市
1都市圏
1都条例
1都道府県
1長年
1首都
【検証】 MeCab は文脈によらず厳密に「東京」「新宿」などと分離しているのに対し、Yahoo!APIは空気(文脈)を読んで「東京都」と「東京」、「新宿区」と「新宿」を使い分けているようです。MeCabでは「人口密度」、「大都市」、「戦国時代」など一固まりと捉える方が自然な単語までも分離されてしまうようです。 ドラゴンボールの例も同様ですが、どちらかといえばMeCab機械的に区切る傾向が、Yahoo!APIは空気を読んで区切る傾向があるようです。

mecab + PHP で形態素解析(出現頻度)

mecab + PHP形態素解析をやってみたときのメモです。Yahoo!さんの日本語形態素解析APImecab PHP 用の拡張モジュールもありますが、windows vista PC にインストールした mecab を直接使用し、その結果をPHPでパースして出現頻度を算出する、ということをやってみました。

    • -

※もしかしてはまった人も??
手元の Windows Vista PC では、mecab を 「C:\Program Files」フォルダ以下にインストールしたところ、mecab を実行できませんでした。「C:\myapp\mecab」のようにスペースを含まないフォルダにインストールしたら実行できました。

    • -


参考にしたのは以下の人力検索
PHPについて質問致します。 形態素解析を行うにあたっていくつかの形態素解析エンジンを比較していった結果、 MeCab(http://mecab.sourceforge.jp/)を使用することに致しま.. - 人力検索はてな
(どうでもいいですけどTITLEが長する・・・)

<?php
$mecabpath = 'C:\..省略..\MeCab\bin\mecab.exe' ; // mecab.exe のパス
$inputfile = 'C:\..省略..\test.txt' ;// 解析対象の文書ファイル
exec("$mecabpath $inputfile", $result);

$word_list_index = $word_list = array();
foreach ($result as $val) {
	$tmp = explode(",", $val);
	$tmp = explode("\t", $tmp[0]);// $tmp[0]: 要素, $tmp[1]: 品詞
	if ($tmp[1] == '名詞') {
		$key = array_search($tmp[0], $word_list_index);
		if ($key === false) {// 新出
			$word_list[] = array('num' => 1, 'word' => $tmp[0]);
			$word_list_index[] = $tmp[0];
		} else {// 既出
			$word_list[$key]['num'] = $word_list[$key]['num'] + 1;
		}
	}
}
unset($word_list_index);

arsort($word_list);
echo '<table border="1" cellpadding="5">';
foreach ($word_list as $val) {
	echo "<tr><td>{$val['num']}</td><td>{$val['word']}</td></tr>\n";
}
echo "</table>";
?>

以下の文書ファイル(wikipediaPHP)を上記スクリプトで解析してみました。

PHP: Hypertext Preprocessor(ピー・エイチ・ピー ハイパーテキスト プリプロセッサー)とは、動的にHTMLデータを生成することによって、動的なウェブページを実現することを主な目的としたプログラミング言語、およびその言語処理系である。
PHPは、HTML埋め込み型のサーバサイド・スクリプト言語として分類される。この言語処理系自体は、C言語で記述されている。
ウェブサーバ上で動作し、ウェブサーバ上の文書が要求されるたびに、この文書に記述されたPHPのプログラムを実行し、その結果をウェブブラウザに対して送信する。
ウェブブラウザに送信されるデータは通常のHTMLであり、PHPのプログラムを含まない。この点でHTML埋め込み型のクライアントサイド・スクリプト言語(JavaScriptなど)と本質的に異なっている。
平易な文法のため初心者でも習得しやすく、また大規模な開発にも多く用いられている。多くのフレームワークやライブラリが存在し、開発の手助けとなっている。
数多くのオープンソースウェブアプリケーションに利用されている一方、しばしば脆弱性の報告がなされ、過去に深刻なセキュリティホールが何度か報告されている。

6言語
4PHP
4HTML
2報告
2文書
2動的
2送信
2
2処理
2
2
2記述
2開発
2プログラム
2データ
2ウェブブラウザ
2ウェブサーバ
2こと
1利用
1要求
1目的
1本質
1平易
1文法
1分類
1動作
1
1
1
1通常
1多く
1存在
1脆弱
1生成
1
1深刻
1初心者
1習得
1手助け
1
1実行
1実現
1自体
1結果
1規模
1過去
1
1一方
1ワーク
1ライブラリ
1ホール
1プログラミング
1プリプロセッサ
1フレーム
1ピー・エイチ・ピー
1ハイパーテキスト
1セキュリティ
1スクリプト
1サイド
1サーバ
1クライアントサイド・スクリプト
1オープンソースウェブアプリケーション
1ウェブページ
1ため
1たび
1Preprocessor
1JavaScript
1Hypertext
1C
1:

EZサーバのIPアドレス変更

12月11日に ez web (au) サーバーのIPアドレスが変更されたようです。

KDDI au: 技術情報 > IPアドレス帯域


【関連リンク】

携帯端末以外のIPを制限するhtaccessを簡単生成 『Mobile IP htaccess Maker』 - HTMLタグボード