header image

Ryuzeeの他サイト

mixi Twitter Twitter

Categories

携帯対応

QRコード

RING

人気ブログランキング



新着記事

2008/12/05 07:37:46 PHP none Comments
add Hatena Bookmark Tags:

The Accidental Businessman: It turns out, I was wrong
秋元@サイボウズラボ・プログラマー・ブログ: 開発者のPHP利用はPHP5に移行した
より。

ある雑誌で調べた主に利用しているPHPのバージョンに関する分布。60%以上がPHP5.2系に移行している一方で、4.x系が8%も残っている。

4系の保守は終了してしまったから、4系を開発のメインに使うのはやめた方が良いのだけど、一番悩ましいのは、RedhatASとかESのバージョン3とか4を使っていると、rpmにPHP5が存在しないって点なんだよね。
野良を入れても良いのだけど、客のポリシーとかもあるし。。
ソースで入れてしまうと、芋ずるで、apacheやMySQLにまで影響を及ぼすのも面倒。

そういう意味で、エンタープライズでPHPを使っていると、移行に後手を踏まざるを得ない。
Redhatがもうちょっと色々してくれると良いんだけどね。

2008/12/03 06:52:01 PHP none Comments
add Hatena Bookmark Tags:

単純なメモ。

[XDebug] 
zend_extension_ts=”C:xamppphpextphp_xdebug.dll” 
xdebug.remote_enable=true 
xdebug.remote_host=127.0.0.1 
xdebug.remote_port=9000 
xdebug.remote_handler=dbgp 
xdebug.profiler_enable=1 
xdebug.profiler_output_dir=”C:xampptmp”

を、xamppのapache/bin/php.iniとphp/php.iniに追加する。またzend_debuggerは無効にしておこう。あと、利用するphp_xdebug.dllは利用しているphpのバージョンによって、利用するモジュールが異なるので、こちらのサイトの右メニューから入手する。

2008/11/16 08:36:46 PHP none Comments
add Hatena Bookmark Tags: ,

個人的には、以前からMockテストの実装の簡単さから、SimpleTestを使っていたのだが、継続的統合をやろうとすると、必然的にphpUnitになってしまうような気がする。

  • phpUndercontrolは、CruiseControlにアドオンを追加することで動作するPHP用の継続的統合プラットフォームだが、出自が、phpUnitの中からだから、多分SimpleTestには対応していない。3月くらいに作者のブログに、SimpleTestへの言及はあったみたいだが・・・。
  • Xincは、うーーん。そもそもドキュメントが少なすぎて手が出ない。

一方で、PHPのソースコードをeclipse上で書いている。
当然unitテストはeclipse上から簡単に実行したい、ということで、SimpleTestが提供しているeclipseプラグインを利用しているのだが、これがSimpleTestで実装したテストはちゃんと動くが、phpUnit2は対応しているといいつつ俺の環境では動作しない。eclipseのバージョンによる可能性もあるけど。

Running:
echo "<?php $path='C:devxampp1.6.6phpPEAR';ini_set('include_path', get_include_path().PATH_SEPARATOR . realpath($path));ini_set('html_errors','0');$fullpath = realpath('C:/dev/workspace/php_test/tests_phpunit2/SampleClassTest.php');$pathparts = pathinfo($fullpath);$filename = $pathparts['basename'];$_SERVER['argv'][1]=basename("$fullpath","");$_SERVER['argv'][2] = "$fullpath";$_SERVER['PHPBIN']='C:devxampp1.6.6phpphp.exe -q -c C:devxampp1.6.6phpphp.ini';include_once('PHPUnit2/TextUI/TestRunner.php'); ?>" | "C:devxampp1.6.6phpphp.exe" -q -c "C:devxampp1.6.6phpphp.ini"
*************
PHPUnit 2.3.6 by Sebastian Bergmann.
Console_Getopt: unrecognized option --log-eclipse

ということで選択肢は2つ。

  • phpUnderControlを利用するために、unitTestを全てphpUnitで書き直す。
  • 面倒だから、phpUnderControlも使わず、SimpleTestで頑張る。

あー、どうすっかな~。

2008/11/05 20:38:24 PHP none Comments
add Hatena Bookmark Tags: ,

前回のエントリでは、海外でmojavi2をPHP5で動作させるプロジェクトをやっていた人にメールして、残念な結果に終わったところだったのだが、最終的になんとか動作するようにもっていけたので、そのメモ。

手順は以下の通りだ。

  • yumaプロジェクトの最新アーカイブである、yuma-snapshot-2005.4.26を入手する。
  • 現在はwebarchiveでしか入手できないので、こちらに転載した。
  • アーカイブを解凍して出てくるmojavi-all-classes.phpを以下の通り修正する。場所は1249行目からのsetAttribute関数とsetAttributeByRef関数で以下のようになる。
function setAttribute ($name, $value, $namespace = 'org.mojavi')
{
    $org_namespace = $namespace;
    $namespace        =& $this->getAttributes($namespace, TRUE);
    $namespace[$name]$value;
    if (USE_SESSIONS) {
        $_SESSION["attributes"][$org_namespace][$name] = $value;
    }
}
function setAttributeByRef ($name, &$value, $namespace = 'org.mojavi')
{
    $org_namespace = $namespace;
    $namespace        =& $this->getAttributes($namespace, TRUE);
    $namespace[$name] =& $value;
    if (USE_SESSIONS) {
        $_SESSION["attributes"][$org_namespace][$name] =& $value;
    }
}

本質的な問題としては、セッションを保持する部分がうまくいっていないので、小手先で無理やりセッションに値をセットするようにしたってこと。
もっと良い手がないかは考える。

2008/10/31 06:38:06 PHP 1 Comments
add Hatena Bookmark Tags: ,

前回のエントリで書いたとおり、mojavi2をPHP5で動作させるプロジェクトが海外にあったみたい(今はもうない)で、入手できたアーカイブが最新でないかもしれないので、作者の人に以下のように問い合わせしてみた。

Hello.

I am Ryuzee, programmer in Japan.

I have been developed an application with PHP4 and mojavi2.
And now I have to migrate this application to new environment with PHP5.

I think the best solution is to rewrite the application with mojavi3 or mojavi4,
but the application is too big to migrate.

I've looked for the way how to work with mojavi2 on PHP5, and I've found your website (at web.archive.org).
I can download yuma-snapshot-2005.4.26, but I think this version is not a latest release.
($user->setAttribute and others are not working correctly)

So, can you send me a latest-version of Yuma ?

Thank you for your reading my email.

Best regards.

なんて出鱈目英語で送ったら、即効レスポンスが来たよ。回答は、

  • 良い返事ができれば良かったんだけど・・・
  • もう2年以上前の話で、プロジェクトをやめてしまって、もうソースコードもlostしてしまったんだよね。
  • mojavi3からforkしてできたSymphonyが良いと思うから試してみるといいよ。

ちゅうことだった。残念っ。がんばるしかないか。

2008/10/28 20:53:48 PHP 2 Comments
add Hatena Bookmark Tags: ,

いつもいつも嵌っているのだが、今回もまた難題。

PHP4+mojavi2で動いているアプリなんだけど、さすがにPHP4の保守も切れたので、PHP5に変えないといけない。
んで、mojavi2なんだけど、古いフレームワークということもあって、PHP4までしか対応しておらず、選択肢としては、

  • mojavi3以降(今の最新はmojavi4)に移行する
  • 無理やりmojavi2をPHP5対応にする

という二つの選択肢から選ぶことになる。
どっちが良いのか一瞬悩んだのだが、mojavi3以降にすると、アプリ本体に手を入れる箇所が多くて面倒そう(context対応)なので、無理やりmojavi2をPHP5対応させる方式を選択した。

いやー、イバラの道っぽいよ・・・。

とりあえず、PHP4とPHP5の違いとして、参照渡しがあるので、関数に&がついているやつを片っ端から外せばなんとかなるような、ということで色々やっているが、Smartyとの連携あたりがイマイチうまくいかない。

海外で同じことをやった人がいるみたいなのだが、もうサイト自体もなくなっており、いまはこちらから参照可能。ここから入手したやつをxamppで試したところとりあえず動作した。

ちゅうことでまだまだ続く予感。

2008/10/24 20:24:36 日記 none Comments
add Hatena Bookmark Tags:

とりあえず既存のソースをPHP_CodeSnifferでチェックして、エラーになった箇所を修正してみようとしたが、業務用アプリだと実情にそぐわないなぁ、というのがよくわかった。

これをベースにオリジナルなものを作らないといけない。
ということでタスクが増えた・・・。

2008/10/19 20:06:13 PHP none Comments
add Hatena Bookmark Tags: , ,

原文はこのあたり。かなりの意訳

Subversionのpre-commitフックを利用する方法

Subversionのpre-commitフックを利用するためのSubversionのpre-commit hookの設定について

Subversion pre-commit Hookは何をするんだっけ?

pre-commit hookはSubversionバージョンコントロールシステムの機能の1つで、レポジトリへのコミット前に、コードをvalidateすることが出来る。
PHP_CodeSniffer pre-commit hookは、コーディング規約に従っていないエラーをチェックし、もしエラーがあるようならコミットをさせないようにすることが出来る。これによって、開発者がコーディング規約に反したコードをコミットできないように担保することが出来る。また、そのかわりに、修正すべきエラーの一覧を表示することが出来る。

例 58-1 サンプルの pre-commit 出力

$ svn commit -m "Test" temp.php
Sending        temp.php
Transmitting file data .svn: Commit failed (details follow):
svn: 'pre-commit' hook failed with error output:

FILE: temp.php
---------------------------------------------------------------
FOUND 1 ERROR(S) AND 0 WARNING(S) AFFECTING 1 LINE(S)
---------------------------------------------------------------
 2 | ERROR | Missing file doc comment
--------------------------------------------------------------

pre-commit Hookの設定

/path/to/PHP_CodeSniffer/scripts/phpcs-svn-pre-commit を編集し、1行目にある@php_bin@をPHPのCLI版のパスに変更する。例えば,
#!@php_bin@ は #!/usr/bin/php になる。

さらに svnlook へのパスが正しく設定されているか確認し、必要ならば、以下の行を編集する。

例 58-2 svnlookコマンドのパスの変更

define('PHP_CODESNIFFER_SVNLOOK', '/usr/bin/svnlook');

さらに以下の行をhooksディレクトリにあるpre-commitファイルに追加する。

例 58-3 Subversionの設定ファイルにpre-commitフックを追加する。

/path/to/PHP_CodeSniffer/scripts/phpcs-svn-pre-commit "$REPOS" -t "$TXN">&2 || exit 1

もちろんphpcsの全てのコマンドラインオプションを利用することが出来る

例 58-4 Subversionの設定ファイルにpre-commitフックを追加する。

/path/to/PHP_CodeSniffer/scripts/phpcs-svn-pre-commit --standard=Squiz --tab-width=4 "$REPOS" -t "$TXN">&2 || exit 1

で良いはずなんだけどうまくいかない。

/usr/bin/scripts/phpcs-svn-pre-commit --standard=Squiz --tab-width=4 "$REPOS" -t "$TXN">&2 || exit 1

どうも-tオプションがうまく動作しておらず、何でもチェックを通ってしまう。

以下エラーメッセージ

[root@kamakura hooks]# /usr/bin/scripts/phpcs-svn-pre-commit /var/svn/test -t "21-1">&2
PHP Warning:  Missing argument 3 for PHP_CodeSniffer_SVN_Hook::processUnknownArgument(), called in /usr/share/pear/PHP/CodeSniffer/CLI.php on line 166 and defined in /usr/bin/scripts/phpcs-svn-pre-commit on line 70
PHP Stack trace:
PHP   1. {main}() /usr/bin/scripts/phpcs-svn-pre-commit:0
PHP   2. PHP_CodeSniffer_SVN_Hook->process() /usr/bin/scripts/phpcs-svn-pre-commit:179
PHP   3. PHP_CodeSniffer_CLI->getCommandLineValues() /usr/bin/scripts/phpcs-svn-pre-commit:89
PHP   4. PHP_CodeSniffer_CLI->processShortArgument() /usr/share/pear/PHP/CodeSniffer/CLI.php:119
PHP   5. PHP_CodeSniffer_SVN_Hook->processUnknownArgument() /usr/share/pear/PHP/CodeSniffer/CLI.php:166
リポジトリの引数が必要です
使用方法を知りたいときは 'svnlook help' と打ってください。
PHP Notice:  Undefined index:  standard in /usr/bin/scripts/phpcs-svn-pre-commit on line 110
PHP Stack trace:
PHP   1. {main}() /usr/bin/scripts/phpcs-svn-pre-commit:0
PHP   2. PHP_CodeSniffer_SVN_Hook->process() /usr/bin/scripts/phpcs-svn-pre-commit:179
PHP Notice:  Undefined index:  verbosity in /usr/bin/scripts/phpcs-svn-pre-commit on line 119
PHP Stack trace:
PHP   1. {main}() /usr/bin/scripts/phpcs-svn-pre-commit:0
PHP   2. PHP_CodeSniffer_SVN_Hook->process() /usr/bin/scripts/phpcs-svn-pre-commit:179
PHP Notice:  Undefined index:  tabWidth in /usr/bin/scripts/phpcs-svn-pre-commit on line 119
PHP Stack trace:
PHP   1. {main}() /usr/bin/scripts/phpcs-svn-pre-commit:0
PHP   2. PHP_CodeSniffer_SVN_Hook->process() /usr/bin/scripts/phpcs-svn-pre-commit:179
PHP Notice:  Undefined index:  report in /usr/bin/scripts/phpcs-svn-pre-commit on line 149
PHP Stack trace:
PHP   1. {main}() /usr/bin/scripts/phpcs-svn-pre-commit:0
PHP   2. PHP_CodeSniffer_SVN_Hook->process() /usr/bin/scripts/phpcs-svn-pre-commit:179
PHP Notice:  Undefined index:  showWarnings in /usr/bin/scripts/phpcs-svn-pre-commit on line 149
PHP Stack trace:
PHP   1. {main}() /usr/bin/scripts/phpcs-svn-pre-commit:0
PHP   2. PHP_CodeSniffer_SVN_Hook->process() /usr/bin/scripts/phpcs-svn-pre-commit:179

ということで追っかけたら分かった。

調査結果

/usr/share/pear/PHP/CodeSniffer/CLI.phpのバグ。166行目にある、processUnknownArgument関数だが、ここでは引数を2つ渡しているが、実際の関数定義では引数が3つでデフォルトパラメータがない。同様の箇所が123行目、240行目にある。第二引数はprocessUnknownArgumentの中では何も使っていないので、適当に引数を追加しておけば良い。

以上まだまだはまり中。CVSに登録されているソースを追っかけながら、引き続き調査することにする・・・。

会社で汎用的に使えるPHPのフレームワークを探すべく、日夜色々試しているのだが、やっとそれっぽいのが見つかったかも。
CodeIgniter(コードイグナイター)。最新バージョンは1.6.2

■よさそうな点を列挙

  • PHP4、PHP5の両方で動作
  • スタンダードなMVC
  • 軽量
  • URLがきれいになる(PathInfo)
  • 自由度が高い
  • Pearに依存しておらずインストール簡単
  • DBがなくても動作
  • DBはOracleも対応
  • XSSフィルタリングでまとめてサニタイズできる
  • validatorが柔軟でパイプによる複数処理の組み合わせが可能
  • フックによってコントローラの拡張が出来る

■イマイチそうなところ

  • 標準だとセッションデータをcookieに全部放り込んでしまう(暗号化はする)
  • ドキュメントルート以下に全フォルダを配置することを想定しているらしく、各モジュールで直接アクセスの場合に拒否するコードが追加されていて見栄えが悪い
  • ヘルパを個別にloadできるのは良いが、関数呼び出しが名前指定だけなので、同名関数が定義されてたりするとどうなるの?

■関連
日本CodeIgniterユーザ会

2008/01/19 00:03:07 PHP none Comments
add Hatena Bookmark Tags:

いま、とある案件でPHPのソースをガシガシ触っている(俺、ホントにコーディング好きだねぇ)。
過去に協力会社に発注して作ってもらったもののバージョンアップを重ねているのだが、今日触った箇所に大きな問題があったのでメモしておく。

まずはソース。

class Hoge {
    function foo($param1) {
        //略。なんか引数を元にデータを取得
        $_SESSION["bar"]["baz"] = $data; //なんか取ったデータをセッションにセット
        return TRUE;
    }
}

こんなのありえない。
具体的な問題として

  • そもそも常にTRUEが返される。
  • クラス変数以外のデータ変更が行われており、その他のクラスにおいてこのセッションデータの存在が前提になっている。このようなケースでは、グローバル変数としてセッションを直接いじくるのはNG。本当は状態管理用のクラスを用意して、そいつに値をセットし、セッション内ではそのクラスのインスタンスを持ちまわるのが良い。百歩譲って、この関数ではデータの取得のみを行い、取得したデータを戻り値として返すのみとし、呼び出し元のコンテキストでセッションにセットするならぎりぎり許容。
  • この実装だとユニットテストがしにくい。

のような問題がある。

« 前の記事 

add to hatena hatena.comment (0) add to del.icio.us (0) add to livedoor.clip (0) add to Yahoo!Bookmark (0) Total: 0