FuelPHP 1.6 がリリースされました

多くの改良とバグ修正を含む FuelPHP 1.6 が 5/3 にリリースされました。変更点の詳細は Changelog をご覧ください。

主な変更点

Composer

1.6 から公式に Composer 対応されました。

インストール/アップグレードの後に、以下のコマンドを実行し、Composer から必要なパッケージ (FuelPHP のパッケージではなく、Composer のパッケージ) をインストールする必要があります。

$ php composer.phar update

oil コマンドを使っている場合は、再インストールすると oil create で上記のコマンドが自動実行されるようになります。

なお、FuelPHP 1.6 に必要なバージョンは PHP 5.3.3 以上とされています。Composer でチェックされるので上記コマンドを実行すれば、要件を満たさない場合はエラーが報告されます。なお、Composer 自体は PHP 5.3.2 以上が必要とされています。

また、Composer から FuelPHP のパッケージをインストールすることも可能です。

Log パッケージ

1.5 で導入された Log パッケージは廃止され、Core クラスに Log クラスが復活しました。Log クラスは裏で Monolog を使用しています。これは、FuelPHP が Composer 対応したため、Monolog は Composer からインストールされるように変更されたものです。Log パッケージも裏では Monolog を使っていましたので実質的には変わりません。

アップグレードの場合は、config.php の always_load.packages から log を削除し、fuel/packages/log フォルダを削除してください。

セキュリティフィルタ

セキュリティフィルタのデフォルト設定が、core/config/config.php から app/config/config.php に移動されました。アップグレードの場合で、app/config/config.php にセキュリティフィルタの設定を記述していない場合は、追加する必要があります。

Parser パッケージ

Mustache、Twig、MtHaml、Smarty は Composer 経由でインストールするように変更されました。

Auth

コーディング標準に準拠するため、SimpleAuth クラスの名前が Simpleauth クラスに変更されました。
同じく、Auth_Login_SimpleAuth クラスは Auth_Login_Simpleauth クラスに変更されています。

一部バグがあるもよう。

Upload クラス

Upload クラスは、裏で FuelPHP 2.0 の Upload パッケージを使うように変更されています。

どうやら、Upload::process() はデフォルトで自動で呼ばれるため、自分で記述する必要はなかったようです。1.6 で二度コールされることが顕在化されエラーになるようです。

ORM

いくつかの仕様変更がなされています。

  • リレーションアサインメントの変更
  • Query オブジェクトが返っていた find() (引数なし) と find(null) の廃止
機能追加

いろいろと機能追加もなされています。

などなど。詳細は Changelog をご覧ください。

『はじめてのフレームワークとしての FuelPHP

FuelPHP 1.6 対応の追加情報が出ています。詳細は、以下のサポートサイトの「追加情報」を参照願います。

5/11(土) FuelPHP 勉強会 東海 vol.4 @ 名古屋

FuelPHP の勉強会が、今週末に名古屋伏見で開催されます。

興味のある方は、是非、ご参加ください。

主要 PHP フレームワークの開発への日本からの参加状況

日本での 5大フレームワークについて、GitHubリポジトリで日本人っぽい Contributors を探してみました。そのフレームワークの Top 100人の Contributors の中に日本人が何人くらいいるか?みたいな感じです。

フレームワーク URL 人数
CakePHP https://github.com/cakephp/cakephp/contributors 5人 3人
Symfony2 https://github.com/symfony/symfony/contributors 2人
FuelPHP https://github.com/fuel/core/contributors 8人
CodeIgniter https://github.com/EllisLab/CodeIgniter/contributors 1人
Zend Framework 2 https://github.com/zendframework/zf2/contributors 1人 0人

ただし、目視で調べただけなので見落としがあるかも知れません。名前も写真も外人っぽい人がいたらわかりません :-) 間違っているという情報がありましたら、お知らせいただけるとありがたいです。

更新情報

  • ただし、Top 100 には 2人しか確認できず。

  • Top 100 に 1人確認できました。

XAMPP 1.7.7 for Linux の PHP を 5.3.24 にバージョンアップする

Ubuntu 12.04 で XAMPP 1.7.7 for LinuxPHP を 5.3.20 にバージョンアップしました。

まず、コンパイルに必要なパッケージを追加します。

$ sudo apt-get install libltdl-dev libreadline6-dev

PHP のソースを展開します。

$ tar xvf php-5.3.24.tar.bz2
$ cd php-5.3.24

phpinfo() から Configure Command をコピーし、環境変数 EXTRA_LIBS="-liconv -lstdc++" を追加して、ペーストします。

$ EXTRA_LIBS="-liconv -lstdc++" './configure' '--prefix=/opt/lampp' '--with-apxs2=/opt/lampp/bin/apxs' '--with-config-file-path=/opt/lampp/etc' '--with-mysql=mysqlnd' '--enable-inline-optimization' '--disable-debug' '--enable-bcmath' '--enable-calendar' '--enable-ctype' '--enable-exif' '--enable-ftp' '--enable-gd-native-ttf' '--enable-magic-quotes' '--enable-shmop' '--disable-sigchild' '--enable-sysvsem' '--enable-sysvshm' '--enable-wddx' '--with-gdbm=/opt/lampp' '--with-jpeg-dir=/opt/lampp' '--with-png-dir=/opt/lampp' '--with-freetype-dir=/opt/lampp' '--with-zlib=yes' '--with-zlib-dir=/opt/lampp' '--with-openssl=/opt/lampp' '--with-xsl=/opt/lampp' '--with-ldap=/opt/lampp' '--with-gd' '--with-imap-ssl' '--with-imap=/opt/lampp' '--with-gettext=/opt/lampp' '--with-mssql=/opt/lampp' '--with-sybase-ct=/opt/lampp' '--with-mysql-sock=/opt/lampp/var/mysql/mysql.sock' '--with-mcrypt=/opt/lampp' '--with-mhash=/opt/lampp' '--enable-sockets' '--enable-mbstring=all' '--with-curl=/opt/lampp' '--enable-mbregex' '--enable-zend-multibyte' '--enable-exif' '--with-bz2=/opt/lampp' '--with-sqlite=shared,/opt/lampp' '--with-sqlite3=/opt/lampp' '--with-libxml-dir=/opt/lampp' '--enable-soap' '--enable-pcntl' '--with-mysqli=mysqlnd' '--with-iconv' '--with-pdo-mysql=mysqlnd' '--with-pdo-sqlite' '--enable-intl' '--with-icu-dir=/opt/lampp' '--enable-fileinfo' '--enable-phar' --with-xmlrpc --with-readline

以下のオプションは削除しました。

'--with-interbase=shared,/opt/interbase'
'--with-oci8=shared,instantclient,/opt/lampp/lib/instantclient'
'--with-pdo-pgsql=/opt/lampp/postgresql'
'--with-pgsql=shared,/opt/lampp/postgresql'
'--enable-intl'

以下のオプションを追加しました。

--with-xmlrpc
--with-readline

コンパイルしてインストールします。コンパイルは手許の環境では 5分59秒かかりました。

$ time make
$ sudo make install

おしまい。

あの徳丸本にも間違いはある! 自分で確認することが大切です

徳丸本に間違いを見つけましたので、少々大げさに公表してみようと思います。

徳丸本の誤った記述

まずは、問題の記述をご覧ください。これを見ただけでどこが問題かわかった人は、かなりするどいです。普通は見逃します。

これは、ご本人によるスライド 徳丸本に載っていないWebアプリケーションセキュリティ の 1ページであり、「徳丸本に載っていない」というタイトルに反して、徳丸本に載っている内容も一部記載されています。

ここで問題となるのは(徳丸本P63)の header() 関数のコードです。

実際にこのコードを検証してみましょう。

<?php

// 徳丸本 P.63 に掲載されているコード
header('X-FRAME-OPTIONS', 'SAMEORIGIN');

// 送信しようとしているヘッダを表示
var_dump(headers_list());

手許の環境でこのコードを実行してみると、以下のような結果になりました。

array
  0 => string 'X-Powered-By: PHP/5.3.23' (length=24)

おかしいですね。肝心の X-FRAME-OPTIONS ヘッダがありません。

念のため、Live HTTP headers でも確認してみましょう。

やはり、X-FRAME-OPTIONS ヘッダはありません。困りましたね。このヘッダを出力することにより、クリックジャッキングを防ごうというサンプルコードが期待したように動きません。これでは、クリックジャッキングを防ぐことができません。

しかも、あの徳丸本のコードをそのまま使っているのに! 正誤表も 100回見たが載っていない。これは自分の環境の問題なのか?! と眠れない夜を過ごした方もいるかも知れません。しかし、ヘッダが出ないということは、自分の環境では対策できていないということで、これを放置するのは危険です。

こんなとき、どうしたらいいのでしょう?










そうです。PHP にはあの PHP マニュアルがあります。とりあえず、PHP マニュアルを見ましょう。

答えは(今回は)すべて PHP マニュアルにありました。

header() 関数の使用法は以下のとおりです。

void header ( string $string [, bool $replace = true [, int $http_response_code ]] )

もうおわかりですね。第1引数はフィールド名ではなく、第2引数もフィールドの値ではありません。

というわけで、正しいコードは、以下のようになります。

header('X-FRAME-OPTIONS: SAMEORIGIN');

そのように修正すると、めでたく以下のように X-FRAME-OPTIONS が出力されるようになりました。

array
  0 => string 'X-Powered-By: PHP/5.3.23' (length=24)
  1 => string 'X-FRAME-OPTIONS: SAMEORIGIN' (length=27)

コピペの弊害

問題のあるコードが、検証されることなくコピペされ伝播していくという可能性が PHP ではとくに懸念されているわけですが、とりあえずググってみました。

幸か不幸か、クリックジャッキング自体がまだあまり浸透していないこともあってか、このコードはそれほど浸透していないようです。以下に 1件、徳丸本と同じ記述をしているページがあるだけでした。


http://zeijaku.net/blog_history/?search=201111082318

ただし、外部に出ないコードに徳丸本のコードがそのままコピペされているという可能性は残りますので、コードレビューや監査などをしている人はチェックするといいかも知れません。

Nobody's perfect

このようにあの徳丸本といえども完璧ではありません。もちろん、正誤表 もきちんと出されていますし、徳丸本は、間違いが驚異的に少ない優れた書籍だと思います。

しかし、それでも、サンプルコードを鵜呑みし単にコピペするだけでなく、自分で実際に試して確認することが重要と言えるでしょう。

(2013/7/9 追記)
2013.7.8 に 正誤表 に追加されました。

GitHub からソースを取得して PHP をコンパイルする

Ubuntu 12.04 で GitHub からソースを取得して PHPコンパイルする方法。

$ git clone git://github.com/php/php-src.git
$ cd php-src
$ git checkout PHP-5.3.24
$ PHP_AUTOCONF=autoconf2.59 ./buildconf --force
$ ./configure --enable-mbstring --disable-cgi --with-zlib --with-bz2 --enable-bcmath --with-readline
$ make

FuelPHP入門ハンズオン vol.1 を開催しました

4/13 に PHP に関する基本的な知識がある方を対象に、FuelPHP のインストールから使い始めることができるようになるまでを目標とする、本格的なハンズオンを名古屋で開催しました。

いくつかトラブルや不手際がありましたが、定員10人満席で無事完了することができました。

以下、印象に残ったこと。

  • vim ユーザが 4割という異常な高率
  • ユニットテストを書いている人がいない!
  • Mac ユーザが 8割
  • CodeIgniter ユーザは 0
  • ほとんどの人が開始時刻前に集合しており、遅れる人も連絡があるという礼儀正しさ! (東京の人にもみならって欲しい)
  • 味仙が異常に込んでいた。17:20 に入店したのにすでに順番待ち。少し待ったら座れたが、帰りには店の前にすごい人があふれていた

ハンズオンで使った FuelPHP の紹介プレゼン資料は、以下で公開しました。

ハンズオン用の資料

とりあえず、同じ内容のハンズオンを再度やるかどうかは現時点では未定ですが、再度やる場合や同じようなハンズオンをやってみたい人向けに、今回のカリキュラムをまとめておきました。

FuelPHP 未経験者 & GitHub に不慣れな人多数でハンズオンをやると、1日でできる内容はこれくらいなのかなという感じです。運営の不手際などもありましたので、スムーズに進めればもう少し先へ進むことができると思います。が、いくらスムーズに進められても、ユニットテストまで含めるのは 1日では少々無理かなと思いました。