タグ

ブックマーク / fbis.hatenablog.com (90)

  • MDB2で複数のDB接続を行う場合の恐ろしい罠 - Unknown::Programming

    MDB2を使って複数のDB接続したいなんてことあるよね。 ところがどっこい、実際にコードを書いてみると恐ろしいことが起きた。それは二つ目のDB接続をすると一つ目のDB接続が二つ目のDB接続に乗っ取られてしまうという! <?php // fooというデータベースへ接続し、hoge_tblのカウントする $dbh = MDB2::factory('mysql://user:pass@localhost/foo?charset=utf8'); $res = $dbh->query('SELECT COUNT(*) FROM hoge_tbl'); $row = $res->fetchRow(); $res->free(); print $row[0]; // 5件 // で次にbarへ接続し同様の処理 $dbh2 = MDB2::factory('mysql://user:pass@localh

    MDB2で複数のDB接続を行う場合の恐ろしい罠 - Unknown::Programming
  • クラス内で定義した定数の一覧を得る方法 - Unknown::Programming

    <?php class Foo { const BAR = 1; const BAZ = 2; } get_defined_constantsを使えば全ての定数が取れると思いきや、上記のようなクラス内で定義した定数は取れなかった。 どうやったら取れるのか。PHPお得意の大量の関数の中に一覧取れるヤツが必ずあるはず!と思いきや、なかった。 諦めかけたその時、ReflectionClassというクラスを使えば取れることがわかったのだ! <?php class Foo { const BAR = 1; const BAZ = 2; } $reflect = new ReflectionClass('Foo'); print_r( $reflect->getConstants() ); $ php test.php Array ( [BAR] => 1 [BAZ] => 2 )PHP5になってから

    クラス内で定義した定数の一覧を得る方法 - Unknown::Programming
    fbis
    fbis 2011/06/16
  • Text::ASCIITableによるアスキーテーブルレイアウト - Unknown::Programming

    MySQLの出力結果みたいなのが必要になったのでCPAN漁ってたらこんなの発見。 Text::ASCIITable - Create a nice formatted table using ASCII characters. - metacpan.org 地味に凄いめちゃ便利 use Text::ASCIITable; my @rows = ( [1,'foo','2011-03-16 11:22:33'], [2,'hogehogehoge','2011-03-17 11:22:33'], [3,'uwaaaaa','2011-03-18 11:22:33'], [4,'dio','2011-03-19 11:22:33'], [5,'jojo','2011-03-20 11:22:33'], ); my $t = Text::ASCIITable->new(); $t->setCol

    Text::ASCIITableによるアスキーテーブルレイアウト - Unknown::Programming
    fbis
    fbis 2011/03/16
  • PHP5.2とPHP5.3でArrayObjectの挙動が違う話 - Unknown::Programming

    ハマッタのでメモ。 <?php $a = new ArrayObject(array('test' => 1)); print_r($a); これをPHP5.2とPHP5.3で実行すると以下のようになる # PHP5.2 ArrayObject Object ( [test] => 1 ) # PHP5.3 ArrayObject Object ( [storage:ArrayObject:private] => Array ( [test] => 1 ) )PHP5.3の場合、なにやらデータの持ち方が新しくなったのかstorage:ArrayObject:privateとか言うのが増えてる。 これはおそらくstorageというprivate変数に配列のデータを持つようになったという感じか。まぁそれ自体は問題ない。 問題は以下のコード <?php $a = new ArrayObject(

    PHP5.2とPHP5.3でArrayObjectの挙動が違う話 - Unknown::Programming
    fbis
    fbis 2011/03/11
  • 「Webを支える技術」読了 - Unknown::Programming

    久しぶりにを読みませうと神の意思が降りてきたので第一弾は「Webを支える技術」を読むことに。 Webを支える技術 -HTTP、URI、HTML、そしてREST (WEB+DB PRESS plus) 作者: 山陽平出版社/メーカー: 技術評論社発売日: 2010/04/08メディア: 単行(ソフトカバー)購入: 143人 クリック: 4,320回この商品を含むブログ (183件) を見る なんせ前評判は高かったし、発売後も高評価続出だしとずっと読まなきゃなーと思ってた一冊です。 いやーーーー、ようやく読み終わった。 なかなか読み応えのある素晴らしい書籍でした。これは素晴らしいとしか言いようがないね。うん素晴らしい。 個人的に一番面白かったのが第2章のWebの歴史。 今までまったく意識してなかったのでなるほどなるほどそういう歴史的理由があったのかとかブツブツ独り言言いながら楽しく読めま

    「Webを支える技術」読了 - Unknown::Programming
  • Class::Accessor::Fastが破壊的だったと初めて知ったあの日 - Unknown::Programming

    事の発端はぽけーっとはてブのお気に入りを見ていたらClass::Accessor::Liteの記事が目に付いた事でした。 お、新しいモジュールか?と思いさっそく実装を拝見させてもらったわけです。 なるほどなるほど、超が付くほどの超シンプル。超々シンプル。実際問題Class::Accessor::Fast使うよりも、Liteのように自分で超軽量のアクセサ定義することの方が多かったりします。 しかし一点気になったところがありました。 @_のリファレンスを保存している部分があったのです。 # Class::Accessor::Lite-0.02 sub __m { my $n = shift; sub { return $_[0]->{$n} if @_ == 1; return $_[0]->{$n} = $_[1] if @_ == 2; shift->{$n} = \@_; ### ← こ

    Class::Accessor::Fastが破壊的だったと初めて知ったあの日 - Unknown::Programming
    fbis
    fbis 2010/11/29
  • sprintfで使用する引数を直指定する方法 - Unknown::Programming

    久々にPerl。いや、ほんと久しぶりよね。 printf '%d年%d月%d日', 2010, 12, 22; # 2010年12月22日 上記のような処理の時に、引数の数は変更せずに年を削って「12月22日」と表示したい場合、以下のようにすれば可能。 printf '%2$d月%3$d日', 2010, 12, 22; # 12月22日 「%」と「d」の間に「数値$」を追加することで使用する引数を直指定できる。上記の場合だと2番目と3番目の引数を使うという感じになる。 こんなsprintfの使い方なんて滅多なことではしないと思うけど、その滅多が来ちゃったので滅多ごめん。 滅多ごめん。 # ちなみにPHPでも可能。 参考:sprintf - perldoc.perl.org

    sprintfで使用する引数を直指定する方法 - Unknown::Programming
    fbis
    fbis 2010/10/28
  • Smartyのテンプレートで配列や連想配列を定義する方法 - Unknown::Programming

    Smartyのテンプレートでは配列や連想配列を定義できない。そんな風に考えていた時期が俺にもありました。 さてググってみるとプラグインを利用する方法を発見しました。 Smartyで配列を定義するプラグイン - Lism.in * blog - nekoya (id:studio-m) Smarty のテンプレートで配列を定義する - XCL Labo 前者は自作プラグインを作る方法、後者はsplitプラグインを利用する方法ですね。 しかしプラグインを利用する方法には以下の三つの問題点があります。 文字列の配列しか生成できない 多次元配列を生成できない メソッドに引数にそのまま渡せない あくまで文字列を分割して配列を生成してるだけなのでオブジェクトの配列や多次元配列を生成できません。 またメソッドに渡せないというのは以下のようなケース エラー。メソッドの引数にプラグインを使用できない {$f

    Smartyのテンプレートで配列や連想配列を定義する方法 - Unknown::Programming
  • PHPでスクリプト実行ファイルのディレクトリを得る方法 - Unknown::Programming

    <?php print dirname(__FILE__); // PHP5.3なら「__DIR__」でもOK これだけで取ってこれる。 が、__FILE__定数はこの定数が書かれているファイルの絶対パスを取得するだけのものなので、この処理を別ファイルで関数化してもうまくいかない。 なのでrealpathと$argvの組み合わせを利用して関数化を実現する。 <?php function get_script_dir () { return dirname(realpath($GLOBALS['argv'][0])); } これでOK。

    PHPでスクリプト実行ファイルのディレクトリを得る方法 - Unknown::Programming
    fbis
    fbis 2010/09/15
  • PHPのDateTimeクラス - Unknown::Programming

    PHPのDateTimeクラスは標準装備なのでお手軽で便利なのだけど、若干使い勝手が悪い。 なのでDateTimeを継承してちょっとした拡張をしとくと便利かと。 <?php class MyDateTime extends DateTime { function year () { return $this->format('Y'); } function month () { return $this->format('n'); } function day () { return $this->format('j'); } function hour () { return $this->format('H'); } function minute () { return $this->format('i'); } function second () { return $this->

    PHPのDateTimeクラス - Unknown::Programming
    fbis
    fbis 2010/09/14
  • PHPでPath_Classを使ってらくらくディレクトリorファイル操作 - Unknown::Programming

    先日の記事だけを見ると、Perlを使ったこと無い人からすれば何がどう便利なのか良く分からないと思うのでここらでPath_Classの解説。 まずPath_Classの大きな特徴として、引数で与えたパスが、実際にファイルとして存在してなくても良いというところがあげられるでしょう。 <?php require_once 'Path/Class.class.php'; // 存在しないパスを与えてもまったく問題なく動く $dir = cdir('/foo/bar/baz'); // 一個戻ったり $dir->parent(); # /foo/bar // 一個進んだり $dir->subdir('hoge'); # /foo/bar/baz/hoge // ディレクトリ生成しちゃったり $dir->mkpath(); # /foo/bar/baz/というディレクトリが作られる。 // ファイルの

    PHPでPath_Classを使ってらくらくディレクトリorファイル操作 - Unknown::Programming
    fbis
    fbis 2010/09/14
  • PHP版Path::Class - Unknown::Programming

    え?あぁ。Perlerなら皆さんご存知のPath::Classですが、それのPHP版です。欲しかったので作りました。 以下使い方例。 <?php require_once 'Path/Class.class.php'; $dir = cdir(array('foo', 'bar')); # Path_Class_Dirオブジェクト $file = cfile(array('bob','file.txt')); # Path_Class_Fileオブジェクト print "dir: $dir\n"; # foo/bar print "dir: $file\n"; # bob/file.txt $subdir = $dir->subdir('baz'); # foo/bar/baz $parent = $subdir->parent(); # foo/bar $parent2 = $paren

    PHP版Path::Class - Unknown::Programming
    fbis
    fbis 2010/09/13
  • ArrayObjectと多次元配列とisset - Unknown::Programming

    <?php error_reporting( E_ALL ); $ary = array(); if ( isset($ary['foo']['bar']) ) {} は警告は出ないが <?php error_reporting( E_ALL ); $ary = new ArrayObject(); // Notice: Undefined index: foo if ( isset($ary['foo']['bar']) ) {} は警告が出る。 ArrayObjectの場合、あくまでも配列っぽい動きをエミュレートしてるだけなので上記のような多次元の配列に対してissetをしてもArrayObject::offsetGetの時点で警告が出てしまう。 回避方法はぶっちゃけ無くて地道に <?php error_reporting( E_ALL ); $ary = new ArrayObjec

    ArrayObjectと多次元配列とisset - Unknown::Programming
    fbis
    fbis 2010/02/16
  • ArrayObjectを如何にして有効活用するか - Unknown::Programming

    fbis
    fbis 2010/02/15
  • PHPのhtmltemplate.incでオブジェクトやらフィルターやら - Unknown::Programming

    ひょんなことからhtmltemplate.incというHTMLテンプレートエンジンを触ることになった。 どんな感じのテンプレートなのかは http://hokori.net/2008/03/01/thmltemplate_for_php/ http://d.hatena.ne.jp/atyks/20090830/1251641112 あたりで詳しく書かれている。 Smartyに慣れている人間からすると非常に使いにくい。オブジェクトが渡せなかったり、テンプレート内でHTMLエスケープ等のフィルター処理ができなかったりする。 で機能追加をしたいわけなのですが、これがなかなかhtmltemplate.incというやつは短いコードながら設計が優れていてとても機能拡張がしやすい。 というわけでやっちゃいました。 <?php require_once 'htmltemplate.inc'; class

    PHPのhtmltemplate.incでオブジェクトやらフィルターやら - Unknown::Programming
    fbis
    fbis 2009/12/18
  • ArrayObjectは便利だけと扱いづらいね - Unknown::Programming

    配列のように振舞えるArrayObjectなんだけど、あくまでもオブジェクトなので結局のところ配列を期待する標準関数との相性が悪すぎて微妙。 is_arrayは偽になっちゃうし、array_shiftはうまく動かないし。 array_flipとかarray_uniqueとかには一応渡せるけど戻り値は配列になってるのでこれまた微妙。 折角配列っぽく扱えるのに標準関数に渡せないので、非常に使いどころが難しくなる上に後々の混乱の元となりそうだ。 文字列評価された時の振る舞いを定義できる__toStringみたいな感じで、配列評価された時の振る舞いを定義できる__toArrayみたいな構文を用意してくれればちょっとはマシになりそうなんだけどねー。 とにかくせめてis_arrayだけでも真になって欲しいなぁ・・・。 仕方ないので今はこんな関数用意してやってます。 <?php function is_

    ArrayObjectは便利だけと扱いづらいね - Unknown::Programming
    fbis
    fbis 2009/11/27
  • 配列か連想配列かを判別する - Unknown::Programming

    PHPにおいて、ある配列が連想配列として使われているのかどうかを判別したい場合どうすればいいのか。 色々調べてたらこんな記事を発見しました。 <?php function is_hash(&$array) { return array_keys($array) !== range(0, count($array) - 1); } テレパス・ラボ : 連想配列 判定関数(is_hash) なるほど。 array_keysで配列のキー一覧を取得し、そのキー一覧が0からの連番になっているかどうかを比較すれば、対象の配列が配列なのか連想配列なのかを判別できるという理屈ですね。 確かにこれで判別ができそうです。 ですがひとつだけ気になる部分があって、array_keysやrangeを使って一時的な配列を確保しているのは無駄が多いのではないかと。 対象となる配列が大きければ大きいほどメモリ効率が悪くな

    配列か連想配列かを判別する - Unknown::Programming
    fbis
    fbis 2009/11/13
  • PHPでnewと同時にメソッドチェーンする方法 - Unknown::Programming

    最近ようやくPHP5をちょこちょこと触ってるわけなんですが、折角メソッドチェーンサポートされたのに何故かnewと同時にできない罠。 これなんか動いても良さそうなのになぁ。直感的だし。 <?php (new Foo)->bar(); 嘆いてもしょうがない。動かないものは動かないので、ちょこちょこと調べてたらこんなのが そこで以下のような関数を定義する。 <?php function ref($obj) { return $obj; } この関数はみたとおり渡された値をそのまま返す関数だが、これを使うことで以下のようにメソッドチェーンできるようになる。 <?php ref(new Hoge)->doSomething(); というバッドノウハウっぽい話。 PHPでコンストラクタからメソッドチェーンする方法 - id:anatooのブログ やっぱこれくらいしかないよねー。 でも標準関数だけでやり

    PHPでnewと同時にメソッドチェーンする方法 - Unknown::Programming
    fbis
    fbis 2009/07/20
  • Smartyでオブジェクトのメソッドチェーンっぽいのを実現する - Unknown::Programming

    Smartyってオブジェクトのメソッドチェーンサポートしてないんだね。 -- foo.tpl -- { $foo->setdata(88)->setdata('a','b')->getdata() }Fatal error: Smarty error: [in foo.tpl line 2]: syntax error: unrecognized tag: $foo->setdata(88)->setdata('a':'b')->getdata() (Smarty_Compiler.class.php, line 455) in C:\php\includes\Smarty.class.php on line 1092ということなので仕方なくプラグインでそれっぽいことをできるようなの作ってみた。 -- modifier.chain.php -- <?php function smarty_

    Smartyでオブジェクトのメソッドチェーンっぽいのを実現する - Unknown::Programming
  • Path::Class-0.17 - Unknown::Programming

    Path::Classが約2年半ぶりくらいにバージョンアップされました。 Path-Class-0.17 - Cross-platform path specification manipulation - metacpan.org いくつかのバグ修正や最適化が行われたようです。 そして!!! 先日僕が指摘した Path::Class::Dir-0.16のchildrenが「0」で止まる件 - Unknown::Programming この件に関してもRTチケットの方で返事があり、「Fixed in 0.17 added」と書かれていたのでキタキタキタキタ━━━(゚∀゚≡(゚∀゚≡゚∀゚)≡゚∀゚)━━━━!!ということで喜び勇んで実行させてみたところ見事に「0」で止まってしまいましたorz 工エエェェ(´д`)ェェエエ工 Fixedって言ったじゃん。 どうしよ・・・・。 またチケット追加

    Path::Class-0.17 - Unknown::Programming
    fbis
    fbis 2009/06/16
    id:yappo id:tokuhirom 両氏助言どもです。ちょっと調べてアクション起こしてみますー。