Home > アーカイブ > 2006-09

2006-09

CakePHP1.1.8.3544リリース

この記事の所要時間: 17

CakePHP1.1.8.3544がリリースされています。1.1系では最後のリリースになるようです。1.2系は来年みたいですね。

CakePHP 1.1.8.3544 is the latest release and brings us to the point of some more exciting new changes.
While this release signals the end of the 1.1 series, it also provides the starting point for the next year.

CakeForge: CakePHP: File Release Notes and Changelog (2006-09-22)

数多くの修正が行われており、先日のvendors.phpに関する修正も取り込まれているのでアップデートした方が良いでしょう。

ダウンロード:http://cakeforge.org/frs/?group_id=23&release_id=134
# ダウンロードファイル選択後に寄付を呼びかけるページが表示されます。
# 寄付しない場合は「No Thanks」を選択すればダウンロードページへ進めます。

猫はバイク好き?

この記事の所要時間: 020

朝晩はだいぶ涼しくなりバイクの季節になってきました。バイク通勤が快適な今日この頃です。

さてこないだ夜帰ろうとするとバイクのシートに何やら物体が居座っています。うん?と思い近づくと猫でした。このバイクを選ぶとはお目が高い!:-)

バイク猫

野良猫だと思うのですが人慣れしてるのか写真を撮ってもおとなしいもんでした。こう見ると猫もかわいいもんですね。

PHP_CodeSnifferを試してみる

  • 2006-09-21 (木)
  • PHP
この記事の所要時間: 1540

PHP_CodeSnifferはPHPのコードスタイルをチェックするツールです。0.1.0ではPEARのコーディング基準に適合するかどうかを確認できますので、いくつか試してみました。

まずは簡単にPHP_CodeSnifferの使い方から。

PHP_CodeSnifferを使う

インストール

pearコマンドでインストールするだけです。

$ pear install PHP_CodeSniffer-0.1.0

CLI環境ではPEARパッケージに含まれているphpcsコマンドでチェックができます。

使用例

まずありがちなサンプルファイルでチェックしてみます。チェックするソースは以下です。

< ?php
class Hello {
  var $message = null;

  function __construct($message) {
    $this->message = $message;
  }
  function hello() {
    echo("Hello! PHP");
    echo($this->message);
  }
}
$obj = new Hello("Cake is sweet.");
$obj->hello();
?>

phpcsでチェックします。

$ phpcs -v hello.php
Registering sniffs... DONE
Processing hello.php [93 tokens in 17 lines]... DONE in < 1 second

FILE: hello.php
--------------------------------------------------------------------------------
FOUND 8 ERROR(S) AND 0 WARNING(S) AFFECTING 6 LINE(S)
--------------------------------------------------------------------------------
&#91;LINE 3&#93; ERROR: Line indented incorrectly. Expected at least 4 spaces, but found 2.
&#91;LINE 5&#93; ERROR: Opening function brace should be on a new line.
&#91;LINE 5&#93; ERROR: Line indented incorrectly. Expected 4 spaces but found 2.
&#91;LINE 6&#93; ERROR: Line indented incorrectly. Expected at least 8 spaces, but found 4.
&#91;LINE 9&#93; ERROR: Opening function brace should be on a new line.
&#91;LINE 9&#93; ERROR: Line indented incorrectly. Expected 4 spaces but found 2.
&#91;LINE 10&#93; ERROR: Line indented incorrectly. Expected at least 8 spaces, but found 4.
&#91;LINE 11&#93; ERROR: Line indented incorrectly. Expected at least 8 spaces, but found 4.
--------------------------------------------------------------------------------
&#91;/code&#93;
<p>いろいろ出てきましたが、ほとんどがインデントに関するものです。(PEARではインデントは4スペースが推奨です。)あとメソッド定義で[{]を続けて書くのがまずいようです。ソースを修正して再度チェックします。


$ phpcs -v hello1.php
Registering sniffs... DONE
Processing hello1.php [95 tokens in 19 lines]... DONE in < 1 second
&#91;/code&#93;
<p>無事エラーはなくなりました。
<h2>PEARをチェック</h2>
<p>PEAR.phpで試してみました。これは適合して当たり前でしょう。</p>

$ phpcs -v --report=summary PEAR.php
Registering sniffs... DONE
Processing PEAR.php [5550 tokens in 1101 lines]... DONE in 2 seconds

PHP CODE SNIFFER REPORT SUMMARY
--------------------------------------------------------------------------------
FILE                                                            ERRORS  WARNINGS
--------------------------------------------------------------------------------
PEAR.php                                                        117     30
--------------------------------------------------------------------------------
A TOTAL OF 117 ERROR(S) AND 30 WARNING(S) WERE FOUND IN 1 FILE(S)
--------------------------------------------------------------------------------

出まくってますね。。。エラー内容を見るとさすがにインデント関係は出ていないですが、カンマや条件文でエラーが出ています。あと改行がCR+LFになってますね。これは良いのかな?

PHP_CodeSnifferをチェック

つぎはPHP_CodeSniffer自身です。PHP/CodeSnifferディレクトリ以下をチェックしました。

$ phpcs -v --reort=summary PHP/CodeSniffer
Registering sniffs... DONE
(snip)
PHP CODE SNIFFER REPORT SUMMARY
--------------------------------------------------------------------------------
FILE                                                            ERRORS  WARNINGS
--------------------------------------------------------------------------------
PHP/CodeSnifferCommentParserAbstractDocElement.php            0       8
PHP/CodeSnifferCommentParserAbstractParser.php                0       13
PHP/CodeSnifferCommentParserClassCommentParser.php            0       7
PHP/CodeSnifferCommentParserCommentElement.php                0       7
PHP/CodeSnifferCommentParserDocElement.php                    0       0
PHP/CodeSnifferCommentParserFunctionCommentParser.php         0       4
PHP/CodeSnifferCommentParserMemberCommentParser.php           0       2
PHP/CodeSnifferCommentParserPairElement.php                   0       4
PHP/CodeSnifferCommentParserParameterElement.php              0       6
PHP/CodeSnifferCommentParserParserException.php               0       0
PHP/CodeSnifferCommentParserSingleElement.php                 0       4
PHP/CodeSnifferException.php                                   0       0
PHP/CodeSnifferFile.php                                        0       62
PHP/CodeSnifferSniff.php                                       0       4
PHP/CodeSnifferSniffException.php                              0       0
PHP/CodeSnifferStandardsAbstractPatternSniff.php              0       33
PHP/CodeSnifferStandardsAbstractScopeSniff.php                0       15
PHP/CodeSnifferStandardsAbstractVariableSniff.php             0       14
PHP/CodeSnifferStandardsIncorrectPatternException.php         0       0
...ferStandardsPEARSniffsCommentingInlineCommentSniff.php  0       1
...StandardsPEARSniffsConstantsValidConstantNameSniff.php  0       11
...rdsPEARSniffsControlStructuresControlSignatureSniff.php  0       1
...eSnifferStandardsPEARSniffsFilesIncludingFileSniff.php  0       8
...CodeSnifferStandardsPEARSniffsFilesLineLengthSniff.php  0       3
...tandardsPEARSniffsMethodsFunctionCallSignatureSniff.php  0       9
...ardsPEARSniffsMethodsMethodCallArgumentSpacingSniff.php  0       11
...rStandardsPEARSniffsMethodsOpeningMethodBraceSniff.php  0       5
...erStandardsPEARSniffsMethodsValidDefaultValueSniff.php  0       3
...odeSnifferStandardsPEARSniffsMiscShortOpenTagSniff.php  0       5
...dardsPEARSniffsNamingConventionsValidClassNameSniff.php  0       4
...dsPEARSniffsNamingConventionsValidFunctionNameSniff.php  0       19
...nifferStandardsPEARSniffsPHPLowerCaseConstantSniff.php  0       2
...StandardsPEARSniffsStatementsMultipleStatementSniff.php  0       21
...StandardsPEARSniffsWhiteSpaceScopeClosingBraceSniff.php  0       5
...ifferStandardsPEARSniffsWhiteSpaceScopeIndentSniff.php  0       13
PHP/CodeSnifferTokens.php                                      0       0
--------------------------------------------------------------------------------
A TOTAL OF 0 ERROR(S) AND 304 WARNING(S) WERE FOUND IN 36 FILE(S)
--------------------------------------------------------------------------------

WARNINGは出ていますが、ERRORは無いです。さすがです。

CakePHPをチェック

おまけでCakePHPです。CakePHPのソースは荒っぽいところが残っているので興味津々です。(エラーが多く出そうで:-P)[cake/dispatcher.php]をチェックしてみました。

$ phpcs -v --report=summary cake/dispatcher.php
Registering sniffs... DONE
Processing dispatcher.php [3450 tokens in 430 lines]... DONE in 1 second

PHP CODE SNIFFER REPORT SUMMARY
--------------------------------------------------------------------------------
FILE                                                            ERRORS  WARNINGS
--------------------------------------------------------------------------------
cakedispatcher.php                                             301     26
--------------------------------------------------------------------------------
A TOTAL OF 301 ERROR(S) AND 26 WARNING(S) WERE FOUND IN 1 FILE(S)
--------------------------------------------------------------------------------

301 ERROR(S)!!と期待(?)を裏切らない結果になったのですが、エラー内容を見るとほとんどはインデントのエラーでした。なのでそれを除外するとエラーは26個になりました。[エラー内容(除くインデントエラー)]

エラーはif文、foreach文のスペース、メソッド宣言でのブレース位置くらいですね。まあCakePHPはPEARコーディング規約で書かれているわけではないですけど、わりと適合していたのは意外でした。

PEAR標準ソースを書く

こうしていくつかのソースを見てみるとおおよそひっかかりそうな箇所が見えてきます。PEARコーティング規約に適合するソースを書くにあたってとりあえず気をつけておく点を並べてみました。

  • インデントは4スペース
  • メソッド定義にてブレース[{]は次の行に書く
  • if,foreachなので制御構造ではキーワードと[(]の間にスペースを入れる
  • 改行はLF?
  • 一行85桁まで。
  • 変数の代入式を並べる時は値が縦に並ぶようにスペースを入れる。

 

cvsやsvnにコミットする時に自動的にチェックするとかunitテストに盛り込むなどアイデア次第で面白い事ができそうです。

PHPで$a{N}表現

  • 2006-09-21 (木)
  • PHP
この記事の所要時間: 047

PHP_CodeSnifferのソースを見てたときに気づいたのですが、PHPで$a{N}という表現ができることを初めて知りました。

< ?php
$a = "abc";
echo $a{0} . "\n";
echo $a{1} . "\n";
echo $a{2} . "\n";
?>
$ php -f test.php
a
b
c

substr($a, N, 1)と同じですね。(マニュアル見たら載ってました。。。)

ちなみに日本語はばっちり化けます。

< ?php
$a = "あいう";
echo $a{0} . "\n";
echo $a{1} . "\n";
echo $a{2} . "\n";
?>
$ php -f test.php
、
「
、

PHP開発に便利な早見表集

  • 2006-09-20 (水)
  • PHP
この記事の所要時間: 221

※PostgreSQLとFirebird2の早見表を追加しました。(2006/11/07)
※Prototypeの早見表を追加しました。(2007/01/12)

PHP開発に役立つ早見表(cheat sheet)をまとめてみました。

PHP全般

データベース

その他

どれもPDFで提供されていますので、印刷してクリアファイルにでも入れておけば便利かもしれませんね。
# mod_rewriteは設定の度にgoogleで調べているので、手元にあると役立ちそうです。

CakePHP controller共通のモデル、コンポーネント、ヘルパーを設定する

この記事の所要時間: 229

controller共通のモデル、コンポーネント、ヘルパーを設定する方法です。

We all know the problem, there are always Models, Components or Helpers that we need for about 99% of all our actions/views and therefor would fit beautifully in our AppController. The only problem is, as soon as we define them via “var $uses = array(‘…’);” (etc.), we cannot easily add more items in our derived controllers without having to repeat the entire list.

ThinkingPHP and beyond » Dessert #10 – Default Models, Components & Helpers (2006-09-19)

これ私も気になっていた箇所なので、そうそう、といった感じでした。エントリではAppControllerのコンストラクタで$uses,$components,$helpersをマージする方法が紹介されています。

こういう方法もあるかなーと見ていると、上記エントリのコメントでさっくりと突っ込まれました。実はこれControllerクラスのコンストラクタでマージしてくれるようになっているんですね。以下のソースでAppControllerで設定したコンポーネントがTestControllerで使えます。すっきり、すっきり。

[app/app_controller.php]

< ?php
class AppController extends Controller {
  var $components = array('RequestHandler');
}
?>

[app/controllers/test_controller.php]

< ?php
class TestController extends AppController {
  var $name = "Test";
  var $components = array('Session');

  function index() {
    // RequestHandlerもSessionも使える
    if ($this->RequestHandler->isGet()) {
      $this->Session->destroy();
    }

  }
}
?>

CakePHP vendors.phpにセキュリティホール

この記事の所要時間: 144

cakebakerCakePHP Users in JapanにもあるようにCakePHPにて任意のファイルが読み込めるセキュリティホールが見つかっています。

問題となるファイルは[app/webroot/js/vendors.php]です。このファイルはvendors/javascript/以下にあるjsファイルを読み込むものなのですが、is_file()やreadfile()がバイナリセーフではないため%00をファイル名に挿入することにより任意のファイルを読めてしまいます。

対応策は以下になります。

  1. 修正済みファイルを適用する。
  2. 使用していないならvendors.phpを削除してしまう。
    そもそも[app/vendors/javascript]が無い場合はvedors.phpは使用していないはずのですので。(デフォルトでは[app/vendors/javascript])はありません。
  3. magic_quotes_gpcをOnにする。
    文字化けの問題があるので日本語圏ではこれは無いでしょうね。

ただ現時点ではbake.phpで使用するテンプレートが修正されてないため、bake.phpで新規プロジェクトを作るとまた同じ問題が発生してしまいます。その場合は再度対策が必要となるためご注意を。

追記:
bake用テンプレートも修正されました。(Thanks dho!)

あとちょっと気になるのはjsファイルかどうか正規表現の部分です。

if(is_file('../../vendors/javascript/'.$file) && (preg_match('/(\/.+)\\.js/', $file))) 

ここは後方一致になるように’/(\/.+)\\.js$/’にしておいた方が良いかと。あとこれは純粋に疑問なのですが\/はなぜ必要なのでしょうか。
まあこのファイル自体使いどころが良く分からなかったりするのですが。:P

CakePHP 環境に応じてDBの設定を変える

この記事の所要時間: 350

本番環境や開発環境など環境に応じてDBの設定を変える方法です。

1.AppModelを書き換える

withcakeで紹介されている方法です。

AppModelのコンストラクタで切り替えるアイデアは分かりやすくて良いと思います。ちなみに記事のコメントにもあったのですが、記事のコードだとコンストラクタの引数がModelへ渡されませんので、修正版を以下に書いておきます。

[app/app_model.php]

class AppModel extends Model {
  function __construct($id = false, $table = null, $ds = null) {
    $this->useDbConfig = $_SERVER['HTTP_HOST'] == 'devserver'?'test':'default';
    parent::__construct($id, $table, $ds);
  }
}

2.database.phpを書き換える

NoswaDで紹介されている方法です。

cakebakerでも書かれていますが、database.phpは設定ファイルなので、これにコードを入れるのは若干抵抗を感じます。(まあdatabase.phpがなぜクラスになっているのか?という考えもありますが。)

3.Subversionで切り替える

cakebakerで紹介されている方法です。

I try to avoid to add code to configuration files because those files shouldn’t contain any logic. Instead I use Subversion to manage different configurations. In my repository I have at least two folders for each project: a “trunk” folder where the development happens, and a “live” folder which contains the code (and configurations) for the live application. So if I put something online I just export the content of the “live” folder from the repository, and with it the “live” configuration.

cakebaker » An alternative to “hacking” config files (2006-09-17)

「Subversion使えよ。なんでハックなんかやってるの?」と言ったところでしょうか。:)詳しい実践方法の記述が無いので的外れの可能性大ですが、これだとtrunk/とlive/でコードが別々になるような気がするのですが、どうなんでしょうか。

4.環境変数で切り替える

1.の変形版です。開発環境ではIPが変わる事があるので、環境変数で切り替える方法を考えてみました。これなら実行環境のIPがどうなろうと影響を受けません。

[httpd.conf]


SetEnv CAKE_DB_CONFIG test

[app/app_model.php]

< ?php
class AppModel extends Model {
  function __construct($id = false, $table = null, $ds = null) {
    $this->useDbConfig = empty($_SERVER['CAKE_DB_CONFIG']) ? 'default' : $_SERVER['CAKE_DB_CONFIG'];
    parent::__construct($id, $table, $ds);
  }
}
?>

httpd.confで環境変数CAKE_DB_CONFIGを定義しておけば、その値をuseDbConfigに使用し、定義がなければ’default’を使用します。使い方としては本番環境が’default’で、開発環境等の他の環境は’dev’等を定義する形を考えています。

正規表現 早見表

  • 2006-09-17 (日)
  • PHP
この記事の所要時間: 055

A4サイズの正規表現の早見表です。

The Regular Expressions cheat sheet is designed to be printed on an A4 sheet of paper and live by a designer or developer’s desk, to make life a bit easier. A description of what is on the cheat sheet follows, or if you are impatient, you can go straight to the full size Regular Expressions cheat sheet.

Regular Expressions Cheat Sheet – Cheat Sheets – ILoveJackDaniels.com (2006-09-17)

英語ですが基本的な構文がすっきりまとまっています。一枚印刷しておけば重宝しそうですね。

Themeを変えました

この記事の所要時間: 012

文章やソースが見辛かったのでThemeを変えました。すっきりして読みやすくなったと思います。

色々なThemeを探し回ったのですが、良いデザインが多く配布されていてほんと凄いですね。ありがたいことです、はい。

Home > アーカイブ > 2006-09

検索
フィード
メタ情報

Return to page top