header image

Categories

FEED

  • goo RSSリーダーへ追加
  • Livedoorリーダーへ追加
  • はてなRSSへ追加
  • Googleへ追加
  • myyahooへ追加
  • feedpathへ追加
  • NewsGator Onlineへ追加
  • Bloglinesへ追加

携帯対応

QRコード

RING

人気ブログランキング



2008/11/21 19:50:35 PHP, 日記 none Comments
add Hatena Bookmark

以下、CakePHPに関する完全に私的なメモ書き。

  • CakePHP(1.2)で複数レコードが表形式で表示されていて、チェックボックスで複数選択したものを、一括で削除しようとしているのだが、どうもうまくいかない。
  • CakePHP1.1の頃はhtmlヘルパーで、項目名の指定の際に hoge][ みたいな信じられないような形で項目名を指定すると、同名項目を配列で受け取ってくれたのだが、同じ方法はうまくいかない。
  • ・・・とここまで書いて、Cake1.2のformヘルパーが悪さしているのではないか、という気がしてきた。
  • いま書いているソースは、<form>の部分を$form->create(…)としているが、このように記述すると、自動的にTokenなどのhiddenフィールドをくっつけてくれたりする。これ怪しいな。
  • ということでのベタ書きを後で試してみる。
  • formヘルパー使ってform要素を出力した場合、パラメータの改ざんやおかしなことがあると、真っ白画面を吐くような仕様になっているらしい。なんかエラー出せよ、という気がしないでも無いが、攻撃に対してはいたずらに画面にメッセージを出力するのはセキュリティ上はよろしくないしな。
  • ということで試してみたら、やはりformヘルパーのせいだった。
  • やられた・・・。
2008/11/19 06:18:57 PHP, 日記 none Comments
add Hatena Bookmark
  • 11/14にCodeIgniterで作るか、CakePHPで作るか悩んだが、CakePHPにした。
  • ほとんどがCRUDパターンだし、新規にデータベースもつくるから、あんましソース書かなくてもある程度までたどり着けるCakePHPを適切と判断
  • んでとりあえずモックアップ開発。認証はAuthコンポーネントを使ったので、1時間で完了。
  • CakePHP1.2はデバッグモードの時やたらと遅い。遅い。遅すぎる。
  • デバッグモードにしていなくても、体感としてはCodeIgniterの方が高速
  • ちなみにGoogleTrendsでの傾向はこんな感じ。
  • CakePHPが1とすると、Codeigniterは0.35。但しフィリピンとインドネシアは逆転している。何が起こっているんだ?
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/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に登録されているソースを追っかけながら、引き続き調査することにする・・・。

2008/09/28 06:24:33 Linux, PHP 1 Comments
add Hatena Bookmark

Xincを色々いじくっているんだけど、バージョン要求が段々あがっていて、CentOSだと動かない。
仕方ないからPHPのバージョンを上げることになるんだけど、ソースでapacheとPHP管理するのは面倒だから野良でも良いのでrpmを使う。

rpm --import http://www.jasonlitka.com/media/RPM-GPG-KEY-jlitka

んで、/etc/yum.repos.d/にutterramblings.repoという名前で以下の内容のファイルを作成

[utterramblings]
name=Jason's Utter Ramblings Repo
baseurl=http://www.jasonlitka.com/media/EL$releasever/$basearch/
enabled=1
gpgcheck=1
gpgkey=http://www.jasonlitka.com/media/RPM-GPG-KEY-jlitka

んで、最後に

yum upgrade php

完了したら、先ほど作成したutterramblings.repoの中のenabled=1を0に変えておく。
これをしておかないと不用意にphpのバージョンがあがってしまうこともありえる。

2008/08/10 15:32:54 PHP none Comments
add Hatena Bookmark

なんかあまり巷で話題にすらならなかったが、PHP4系のメンテナンスが、8月7日にリリースされた4.4.9を最後に終了した。
PHP5が出た当初、切り替えるのは当分無理だ~、なんて言ってたが、時間が経つのは早い。

4.4.9での変更内容

  • PCREのバージョンが7.7になった
  • memnstr関数のオーバーフロー問題の対応
  • imageloadfontに無効なフォントを与えた場合にクラッシュする問題の対応
  • curl拡張においてopen_basedirの扱いに問題があった点を対応
  • mbstring.func_overloadを.htaccess内でセットすると、グローバルに有効になってしまう問題の対応

見ているとたいしたことはなさそうだが、ソースでインストールしているなら適用しとくべきか。

2008/07/30 23:24:53 PHP none Comments
add Hatena Bookmark Tags: ,

CodeIgniterがなかなか自由度が高くて気に入っているのだけれど、一方で、Cakeみたいにbakeコマンドで、CRUDがノンコーディングで出来てしまうわけでも無いので、面倒と言えば面倒。
そういう面倒さはCodeIgniterとRapydを組み合わせてあげることで解決できそうだ。
RapydもオープンソースのPHPフレームワークで、単体で動作するバージョンと、CodeIgniterのライブラリとして動作するバージョンの二つが提供されている。

CIと組み合わせてデータの一覧画面を表示する例を以下に記述する。

まずCIのコントローラの中で、$this->rapyd->load("datagrid");として、DataGridのライブラリを呼び出して、あとはクエリを組み立て、buildコマンドで、データを生成してしまえば良い。テンプレート側に色々なコードを書かないで、テーブル、ソート機能、編集へのリンク、ページング機能が実現できる。あー簡単。

<?php
require_once('basecontroller.php');
class Task extends BaseController
{
        function Task()
        {
                parent::BaseController();
        }
        function index()
        {
                $this->rapyd->load("datagrid");
                $grid = new DataGrid("Task List", "task");
                $grid->per_page = 2;
                $grid->column_detail("taskId","taskId", site_url('rapyd/hoge/<#taskId#>'));
                $grid->column("Title", "title");
                $grid->column("Description""description");
                $grid->build();
                $data["grid_output"] = $grid->output;
                $data["rapyd_head"] = $this->rapyd->get_head();
                $this->load->view('rapyd/task_view', $data);
        }
}
?>

サンプル画面は以下のような感じ。

Rapydの弱点は、出力するhtmlがあんまり綺麗じゃない、という点だろう。実際に見てみると早い。

<table style="margin:0;width:100%;border-collapse:collapse;padding:0;">
  <tr>
    <td>

      <table style="margin:0;width:100%;border-collapse:collapse;padding:0;">
        <tr>
          <td class="mainheader">Task List</td>
          <td class="mainheader" align="right"></td>
        </tr>
      </table>

      <div class="mainbackground" style="padding:2px;clear:both;">
      <table width="100%" cellpadding="1">

        <tr>
          <td class="tableheader">
            <table style="width:100%; border-collapse:collapse;">
              <tr>
(中略)
              </tr>
            </table></td></tr></table></div></td></tr></table>

なんなんだ、これは・・・、というレベルの汚さ。なぜ、もうちょっとまともにclassを振らないのか。
この問題は、/application/rapyd/views/defaultにある、datagrid.phpというviewを修正すれば直る。これを自分好み、もしくは自分が構築しているシステムのレギュレーションにあわせてあげると素敵になるだろう。

2008/07/17 06:18:30 PHP none Comments
add Hatena Bookmark

【PHP TIPS】 92. ハイフン付きのメンバ変数名を参照する方法:ITpro

オブジェクトのメンバ変数を参照する際、PHPでは $obj->element のように
指定しますが、まれにelementの変数名にハイフン「-」が入ったものを指定
しなければならない場合があります。

ハイフンが含まれる変数名なんて、いまだかつてお目にかかったことが無い。アンダースコアなら沢山あるけど。
これって、ORM使っていて、DBのカラム名にハイフンが付いている、とかくらいしか考えられないなぁ。

Pearの規約では明示的に-の使用は禁止されていないみたいだけど、まぁ普通は命名しない。

2008/06/29 21:28:08 PHP none Comments
add Hatena Bookmark

XincはPHPで書かれたSubversion、PHPUnit、Phingを統合するCIサーバ。
最新版は2.0.1.
CIサーバといえば、CruiseControlだけど、PHPの場合、CruiseControlにphpUnderControlを入れないといけなくて、かつ、PHP5.2以降必須なため、RHEL系で動作させにくいという問題がある。(CentOS4.6でやろうと思ったけど挫折。面倒すぎ)
いま試しているXincは、Xinc Is Not CruiseControlの頭文字らしく、CIをPHPにより適応させることを目的としている。

このスライドでは継続的統合の意義、XincとphpUnderControlとの違い、Xincのインストール方法等を解説している。
PHPで継続的統合を行おうと検討している人必見だ。

2008/06/13 19:22:05 PHP, 日記 none Comments
add Hatena Bookmark
Trying to clone an uncloneable object of class ReflectionClass

なんていうエラーがPHPUnit+Selenium RCな環境で出たので調べてみた。
結論としては、phpの設定で、

zend.ze1_compatibility_mode = On

になっていると、ダメということで、こいつをOffにすればよい。

« 前の記事 


ads

Ryuzeeのお気に入り