PHP4, 5コンパチクラスのイディオム。

class Foo
{
//  var $foo;
//  var $bar;
//  var $baz;
    function foobarbaz() {}
}

だめかな・・・。

many favicon

以前に、「IEでfavicon出ない問題」をPHPはさんで解決しました。しかし、favicon一杯あるページ(ココとか)では切なくなるほど遅くなります。

普通の画像だってあるだけリクエスト飛ぶのに何が違うのかと思ったんですが、よく考えたら普通の画像はブラウザにキャッシュされるので2回目からリクエスト飛ばないんですよね。PHP挟むと毎回フレッシュな画像が表示される。(悪い意味で)

要はPHPでもブラウザにキャッシュしてもらえばいいのカー。 PHPのデフォルトではご丁寧に(今回は邪魔だけど本来超嬉しいデフォルト設定)ブラウザにキャッシュされないようにヘッダを吐いてくれてるので、(p0t: 戻るボタン対策)それを切るだけで良かった。

session_cache_limiterのパラメータの細かい説明がマニュアルに見当たらなかったんですが、

  • nocache—- ブラウザにキャッシュしないで(デフォルト)
  • private—- ブラウザにキャッシュして
  • public—- ブラウザとキャッシュサーバ(プロクシとか)にキャッシュして

だそうです。(via http://www.hizlab.net/app/portal.html)

<?php
<strong>session_cache_limiter('public');</strong>
header('Content-Type:&nbsp;image/x-icon');
echo&nbsp;file_get_contents($_REQUEST['favicon']);
?&gt;

これで2回目から糞速い。

画像にPHPでアクセス制限かけてるとことか(←アクセス制限はずしてどうする)(←いや、問題ないか)、mysqlのblobから画像出してるとことかもこれやると速くなるハズ。
using API; 価格.comから4travel.jp、yoyaQ.com、クチコミ掲示板の各情報を取得するAPI公開

4travelのAPIは価格.comの他のAPIと違い、RESTのリクエスト先URLの拡張子がphpになっていて、出力形式にはPHPのシリアライズが選べる。

きたきたー!APIF(俺すら言ってない)の時代がー!

APIFの優位性はなんと言っても超簡単にPHPのクラスのインスタンスがやり取りできることですよ!

stdClassと__PHP_Incomplete_Classぐらいだけど・・・。

最初の行に使うクラス定義文(string)が入った別のserializedデータを用意して、それをevalしてから本文unserializeするってのはどうかな?

ダルそー!

[PHP-doc 664] www.php.net マニュアルの更新

高木です。 とりあえず何とかこんな状態にまで持ち込めたので、 http://doc.php.net/php/ja/revcheck.php?p=graph さきほど本家マニュアルの更新をお願いしておきました。

偉人過ぎる!!!

ハッカーと画家 コンピュータ時代の創造者たち

金が無いのでyoshukiさんに借りて読みました。

「使う言語で考えるようになるから上位の言語の良さは理解できない」みたいなところに納得。PHPで思考してるところに「クラスや関数が式になってる方が便利だよ」っていってもさっぱり良さがわからん。(つまりココの俺みたいな状態?)

blog.xole.net : Seasar Conference 2006 Autumn開催するよ!

我(らが?)Seasar.PHPももちろん出ます。 ref – Seasar Conference 2006 Autumn – Session

最近のSeasar.PHPの(Update)動向をジャンジャンお話します。ここまで便利に。ここまで使い易くなってますよ。S2PHP5

セッションの題名が「 明日から始めるSeasar.PHP」にしてあるのにもワケがあって、「今日から」じゃないというのがミソ。

明日からってどういうことなんだろ!聞きてぇ~!

PHP4でDB系のテストがやりたくてrake db:fixtures:load的にテーブル毎のファイルからDBへロード/ダンプするクラスを書いてみました。

&lt;?php
require_once 'INILoader.php';
dump_ini('/path/to/fixtures', 'mysql://user:pass@localhost/dbname');
?&gt;

(magpieみたいにグローバルにいい加減なファサード作っちゃうquick & dirtyさ加減)

こんな感じで書くと、

% cat fixtures/member.ini
[member1]
id = "1" 
design_id = "1" 
account = "komagata" 
password = "aaa" 
email = "komagata@p0t.jp" 
createdtime = "2006-08-12 15:36:51" 
[member2]
id = "2" 
design_id = "2" 
account = "tom" 
password = "iii" 
email = "tom@gmail.com" 
createdtime = "2006-08-12 11:36:51" 
[member3]
id = "3" 
design_id = "3" 
account = "bob" 
password = "uuu" 
email = "bob@gmail.com" 
createdtime = "2006-08-12 12:36:51"

こんな感じの中身を指定したディレクトリに“テーブル名.ini”で吐く。yamlだとまんま過ぎなので何故かiniです。

&lt;?php
require_once 'INILoader.php';
load_ini('/path/to/fixtures', 'mysql://user:pass@localhost/dbname');
?&gt;

こう書くと逆にiniファイルを読んでテーブルにロードする。

以下コード。(さっとパッケージ化できる人になりたい)

&lt;?php
require_once 'DB.php';

class INILoader
{
    var $fixtures_dir;
    var $dsn;
    var $key_check;
    var $db;

    function INILoader($fixtures_dir, $dsn, $key_check = true)
    {
        $this-&gt;fixtures_dir = $fixtures_dir;
        $this-&gt;dsn = $dsn;
        $this-&gt;key_check = $key_check;
        $this-&gt;db =& DB::connect($dsn);
        $this-&gt;db-&gt;autoCommit(false);
        $this-&gt;db-&gt;setFetchMode(DB_FETCHMODE_ASSOC);
    }

    function load($name = null)
    {
        if (is_null($name)) {
            $this-&gt;db-&gt;query('BEGIN');
            $this-&gt;_truncate_all();
            $this-&gt;_load_all();
            $this-&gt;db-&gt;commit();
        } else {
            $this-&gt;db-&gt;query('BEGIN');
            $this-&gt;_truncate($name);
            $this-&gt;_load($name);
            $this-&gt;db-&gt;commit();
        }
    }

    function dump($name = null)
    {
        if (is_null($name)) {
            $this-&gt;_remove_all();
            $this-&gt;_dump_all();
        } else {
            $this-&gt;_remove($name);
            $this-&gt;_dump($name);
        }
    }

    function _load_all()
    {
        if (!$this-&gt;key_check and preg_match("/^mysql/", $this-&gt;dsn)) {
            $this-&gt;db-&gt;query('SET FOREIGN_KEY_CHECKS = 0');
        }

        foreach ($this-&gt;_get_ini_files() as $file) {
            list($name, $ext) = split("\.", $file);
            $this-&gt;_load($name);
        }

        if (!$this-&gt;key_check and preg_match("/^mysql/", $this-&gt;dsn)) {
            $this-&gt;db-&gt;query('SET FOREIGN_KEY_CHECKS = 1');
        }
    }

    function _truncate_all()
    {
        foreach ($this-&gt;_get_ini_files() as $file) {
            list($name, $ext) = split("\.", $file);
            $this-&gt;_truncate($name);
        }
    }

    function _load($name)
    {
        echo "Load table {$name}... ";
        $data = parse_ini_file("{$this-&gt;fixtures_dir}/{$name}.ini", true);
        foreach ($data as $fields) {
            if (DB::isError($res = $this-&gt;db-&gt;autoExecute($name, $fields))) {
                $this-&gt;db-&gt;rollback();
                echo "failed\n";
                trigger_error('INILoader::_load(): Failed to load. '
                .$res-&gt;toString(), E_USER_ERROR);
            }
        }
        echo "succeed\n";
    }

    function _truncate($name)
    {
        echo "Truncate table {$name}... ";
        $sql = "TRUNCATE $name";
        if (DB::isError($res = $this-&gt;db-&gt;query($sql))) {
            $this-&gt;db-&gt;rollback();
            echo "failed\n";
            trigger_error('INILoader::_truncate(): Failed to truncate. '
            .$res-&gt;toString(), E_USER_ERROR);
        }
        echo "succeed\n";
    }

    function _dump_all()
    {
        foreach ($this-&gt;db-&gt;getTables() as $table) {
            $this-&gt;_dump($table);
        }
    }

    function _remove_all()
    {
        foreach ($this-&gt;db-&gt;getTables() as $table) {
            $this-&gt;_remove($table);
        }
    }

    function _dump($name)
    {
        echo "Dump table {$name}... ";
        $file = "{$this-&gt;fixtures_dir}/{$name}.ini";
        $handle = fopen($file, 'a');
        $sql = "SELECT * FROM $name";
        foreach ($this-&gt;db-&gt;getAll($sql) as $index =&gt; $fields) {
            $line = "[{$name}".++$index."]\n";
            foreach ($fields as $key =&gt; $value) {
                $line .= "{$key} = \"{$value}\"\n";
            }

            if (!fwrite($handle, $line)) {
                trigger_error("INILoader::dump(): Failed to write $file",
                E_USER_ERROR);
            }
        }
        fclose($handle);
        echo "succeed\n";
    }

    function _remove($name)
    {
        echo "Remove file {$name}.ini ... ";
        unlink("{$this-&gt;fixtures_dir}/{$name}.ini");
        echo "succeed\n";
    }

    function _get_ini_files()
    {
        $files = array();
        $d = dir($this-&gt;fixtures_dir);
        while ($entry = $d-&gt;read()) {
            if (preg_match("/\.ini$/", $entry)) {
                $files[] = $entry;
            }
        }
        $d-&gt;close();
        return $files;
    }
}

function load_ini($fixtures_dir, $dsn, $key_check = false)
{
    $loader =& new INILoader($fixtures_dir, $dsn, $key_check);
    $loader-&gt;load();
}

function dump_ini($fixtures_dir, $dsn)
{
    $loader =& new INILoader($fixtures_dir, $dsn);
    $loader-&gt;dump();
}
?&gt;
Flickr Services

Serialized PHP Response Format

PHP has a built-in serialized data structure format, using the serialize() and unserialize() functions.

To return an API response in PHP serialized format, send a parameter ””format”” in the request with a value of ””php_serial””.

来てる!来てる!

p0t: PHPRPC

このフォーマットを汎用データ形式として広めようって剛の者はいないかな?

Development Environment Conference

Development Environment Conference、開発者の開発環境のカンファレンスを 2006年9月8日にデジタルハリウッド大学(秋葉原ダイビル)にて開催しました。

DECon行ってきました。 やっぱりためんなって楽しかった。

  • vim小技
  • svk
  • オートリロード

とかは、すぐにでもやらなきゃ!って思いました。(あとpgrep, pkill知らなかった…。生まれなきゃよかった。) それとしつこいですが、デプロイ管理、運用系のツールが気になる!yumリポジトリ作ったり監視IRCボットとか、Plaggerリリースツールとかおしゃれだなー!(そんなことはない)

6aでは自作みたいですが、Capistrano的なのはperl, PHPにあるのかな?Catalyst、Symphonyとかにはあるのかも。あったら試してみたい。

IBM 5 つの共通 PHP デザイン・パターン : Open source : dW – Japan

デザイン・パターンがソフトウェア・コミュニティーに発表されたのは、「ギャング・オブ・フォー」として知られる Erich Gamma、Richard Helm、Ralph Johnson、そして John Vlissides 共著の『Design Patterns』のなかです。

地球上の誰かがふと思った、 『Javaとの差分だけ書いてくれれば、どれだけの人の時間が無駄にならずにすむだろうか…』

寄生獣 (1)
  • 寄生獣 (1)
  • 講談社(1990-07)
  • 講談社
  • (著)岩明 均
  • 定価:¥ 509
  • 中古価格:¥ 0
  • ASIN:4063140261