タグ

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

  • 複雑なデータ構造はData::Visitor::Callbackで簡単一発変換 - Unknown::Programming

    ハッシュと配列の参照が入り交じったような複雑なデータ構造の、全value を均等に加工したかったので次の様にしてみました。 (中略) すでに似たモジュールがある気が激しくしています! ご存知でしたらぜひ教えてくださいませ。 [perl] 複雑なデータ構造のvalue を一気に書き換える方法 - harupiyoの日記 ということでData::Visitor::Callbackがズバリそれにあたるものじゃないかなーと。 use strict; use warnings; use Data::Dumper; use Data::Visitor::Callback; my $rh_testdata = { 'a' => 1, 'b' => { 'aa' => 1, 'ab' => [ 1, 2, 3, \ 'test', 5 ], 'ac' => 3, }, 'c' => 3, 'd' => 4

    複雑なデータ構造はData::Visitor::Callbackで簡単一発変換 - Unknown::Programming
    lapis25
    lapis25 2011/07/26
  • Smartyのテンプレートで配列や連想配列を定義する方法 - Unknown::Programming

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

    Smartyのテンプレートで配列や連想配列を定義する方法 - Unknown::Programming
  • 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
    lapis25
    lapis25 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
    lapis25
    lapis25 2010/09/14
  • TAPの話 - Unknown::Programming

    http://d.hatena.ne.jp/tokuhirom/20080305/1204677112 404 Blog Not Found:「同じコード」の同じって何さ - TAPのススメ 弾さんの記事見て思い出した。 以前、id:tokuhiromさんに教えてもらったTAPの話ですが、折角なので導入しよーかと。 PHPHTML_FillInFormのテストをTAP形式に。ってかもともと出力はTAP形式になってたので、今回の変更点としては、 #!php <?php error_reporting( E_ALL ); require_once 'Test.class.php'; plan(1); require_ok('HTML/FillInForm.class.php'); こんな感じで一行目に#!にphpを指定しとけばOK。 これでPerlのproveコマンドが使えるお!素晴らしい!

    TAPの話 - Unknown::Programming
  • 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
  • ArrayObjectによる配列演算子のオーバーロード風 - Unknown::Programming

    PHP5やり始めたばっかでまだ右も左もわからずに右往左往してます。 色々調べてたら、PHP5になってSPL(Standard PHP Library)ってのが導入されたということを知った。へー。 そのSPLの中にArrayObjectという物がありまして、オブジェクトを配列っぽく扱えるようにしたものなのですよ。今日はコレを取り上げてみたいと思います。 とりあえず使用例。 <?php $foo = new ArrayObject; $foo['foo'] = 100; $foo['foo-bar'] = 200; print_r((array)$foo); Array ( [foo] => 100 [foo-bar] => 200 )おお、面白い。オブジェクトなのに配列のように扱えています。 そして更に面白いのがオブジェクトのプロパティに設定した値と同期させることもできるところです。 以下の

    ArrayObjectによる配列演算子のオーバーロード風 - Unknown::Programming
    lapis25
    lapis25 2009/08/20
    ArrayObject
  • PHP「"0x0A" == "10"はTRUEですがよろしいですか」 - Unknown::Programming

    ぼく「えっ」 PHP「"0x0A" == "10"はTRUEになりますが」 ぼく「いえFALSEです」 PHP「えっ」 ぼく「えっ」 PHP「まだ比較したことがないということでしょうか」 ぼく「えっ」 PHP「えっ」 ぼく「変化するってことですか」 PHP「なにがですか」 ぼく「型が」 PHP「ああ文字列でも整数っぽい文字列なら自動で型変換されますよ」 ぼく「そうなんだすごい」 PHP「では比較いたしましょうかTRUEですよ」 ぼく「でも"0x0A"は明示的にキャストしたら0になりますよね」 PHP「えっ」 ぼく「えっ」 PHP「ああ16進数のことなら比較の場合のみ10進数に自動で変換してから比較するんですよ」 ぼく「なにそれこわい」 PHP「"0x0A" == "+000010.0000000000000001"の場合もTRUEになります」 ぼく「なにそれもこわい」 PHP「えっ」 ぼく

    PHP「"0x0A" == "10"はTRUEですがよろしいですか」 - Unknown::Programming
    lapis25
    lapis25 2009/07/30
  • PHPの閉じタグは心の臓に悪いから使わないで - Unknown::Programming

    閉じタグってのは「?>」のことね。未だに閉じタグ使ってるコードを見ると一瞬ドキッとするんだよね。(自分の昔のコードも含むw) いや、ちゃんとわかってて確実に使いこなしてるならいいんだけどたまに -- ここがファイルの先頭 -- <?php class Foo { // いろいろ } ?> -- ここがファイルの後尾 -- みたいな感じで閉じタグの後に改行コードが一つ入ってたりするのを見ると「あわわわ」ってなっちゃう。 実際には改行一つだけなら問題は出ない、PHPは閉じタグの直後の改行を消してくれるからね。 問題は改行が二つ以上あった場合だ。これは悲惨なことになる。PHPは閉じタグ以降のデータ(というか範囲外のデータ)は全部HTMLとして出力される仕様なので、改行コードが表示されちゃう事態に。 表示されちゃうっていうのは語弊があるか、元々PHPHTMLに埋め込むための言語なのでの範囲外の文

    PHPの閉じタグは心の臓に悪いから使わないで - Unknown::Programming
    lapis25
    lapis25 2009/07/30
  • 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
    lapis25
    lapis25 2009/07/30
  • Perlにおける定数宣言(constant or Readonly or Attribute::Constant) - Unknown::Programming

    正直言いますと、個人的には定数って殆ど使わないんですよね。 昔はちょこちょこ使ってたんですが、最近は定数となりうる物は基的にYAML等外部ファイルに持たせて変更可能にすることが多いのでまったく使ってません。 ですがそれでもPerlで定数を使いたい時にはどーすんの?っていう時のために軽くここにまとめておきます。 言わずもかなPerl5.8にはconstantという定数を定義できる標準モジュールがあります。 use strict; use constant PI => 3.14; # 表示 print PI; # 3.14 # 上書きしようとすると・・・ PI = 3; # Can't modify constant item in scalar assignment とこのように上書きしようとするとエラーを吐いて死にます。 しかも実行時ではなく、コンパイル時にエラーを吐きます。 実はこのc

    Perlにおける定数宣言(constant or Readonly or Attribute::Constant) - Unknown::Programming
    lapis25
    lapis25 2009/06/15
  • PHPでWebプログラムすることのある僕がstrcmp関数を使う100の理由(ぉ - Unknown::Programming

    ==の代わりにstrcmp関数で比較すると、float型とarray型を扱う場合に==を使うのとは別の問題が発生することを示しました。 そんな型が来るならstrcmp使わないよ、という意見もあるとは思いますが、来る型がわかっているなら===を使えばいいと思うんですよね。strcmpを使いたい状況が僕にはわかりません。何にせよ、「安全な==」として使うにはstring型へのキャストを熟知している必要があると思いますよ、というのが記事の主張です。strcmpは文字列同士の大小比較にしか使えないと僕は思います。 PHPで==の代わりにstrcmp関数を使うことによる問題点 - hnwの日記 記事の主張はまったくごもっともで確かにその通りなのですが、それでも僕がstrcmp関数を使う理由はint型とstring型で比較したいからなんですよねー。 実際に関数を作るとき殆ど多くの関数において、flo

    PHPでWebプログラムすることのある僕がstrcmp関数を使う100の理由(ぉ - Unknown::Programming
    lapis25
    lapis25 2009/03/02
  • さっきの記事のShikaのベンチのコード - Unknown::Programming

    モジュールがMoose依存してた。別れたい… - Unknown::Programming id:tokuhiromさんにベンチうp頼まれたんだけども超個人的なBenchmarkコードなのでそのままCodeReposにあげれるような代物でもないということもあり取り急ぎエントリとしてあげておきますので自由に変更しちゃってください。 #!/usr/local/bin/perl -w use strict; use warnings; package MooseBuild; use Moose; has userid => ( is => 'rw', ); has agent => ( is => 'rw', required => 1, ); sub BUILD { my $self = shift; $self->userid(90); $self->userid($self->agent-

    さっきの記事のShikaのベンチのコード - Unknown::Programming
  • モジュールがMoose依存してた。別れたい… - Unknown::Programming

    さて毎年年末が近づくとブログ更新頻度が下がるid:fbisですが、Mooseも馴染んできたところなのでそろそろMooseに対して一言いっておくかということでね、はい。 Mooseは素晴らしい。とてもベリー素晴らしい。何より人に優しい。人間に優しい。 がっ!しかし、Mooseはまだ使うには早すぎた。ナウシカの巨神兵ばりに早すぎたんだ。 実際に組み込んでみて感じた問題点。 大きく分けて二つ。 その壱:オブジェクト生成のコスト やはりなんといってもnewのコストが高い。遅い。 一つ一つを見ればそこそこなんだけどやはりnewのコストは高い。 Mooseを使うのであれば極力newを避けるような仕組みの中に取り入れないと微妙。Catalystで例えるならsetupの時点でnewして以後キャッシュされるような実装だ。 newさえ終わればあとは(複雑なMooseの使い方をしてない限り)それほど問題ではない

    モジュールがMoose依存してた。別れたい… - Unknown::Programming
  • PHP5.3のnamespaceの区切り文字に関して - Unknown::Programming

    今の気持ちをはてなハイクであらわしてみました。 先に言うとなんかもう色々ごめんなさい。 PHP5.3 - はてなハイク 勘弁して下さい(つд⊂)エーン

    PHP5.3のnamespaceの区切り文字に関して - Unknown::Programming
  • Moose触ってみるよ! - Unknown::Programming

    触るんかい! と、言うことで使ってないうちからあれこれ言うのは愚の骨頂ってことでちょっち実務で使ってみるね!少しだけだけど。 でいつもの事ながら組み込むとなればやはり気になるのがパフォーマンス。もう散々書かれてるけど自分で試さないと気がすまないのでベンチ。 #!/usr/local/bin/perl -w package UseMoose; use Moose; has userid => ( is => 'rw' ); has agent => ( is => 'rw', isa => 'Defined' ); sub BUILD { my $self = shift; $self->userid( 90); $self->userid( $self->agent->user_id ) unless $self->agent->is_non_mobile; } package NoMoo

    Moose触ってみるよ! - Unknown::Programming
  • DBD::mysqlのmysql_auto_reconnectが真だとDB再接続時にDBICのon_connect_doが実行されない件 - Unknown::Programming

    ハマったメモ。 さてまた今回も若干適当な記事だけども、メモということでお許し願いたい。 ってか誰も言及してないっぽいんだけどもしかしてこの現象うちだけ? とにかくタイトルの通りで、検証時の各モジュールのVERSIONは以下の通り。 DBD::mysql-v4.005 DBIx::Class-v0.08100 前回のDBD::mysqlでSegmentation faultの件は無事解決したものの、今度はDB再接続時に文字化け発動でゲンナリしてました。 でログとか見てるとどうもDBICのon_connect_doで指定しているSET NAMES UTF8がDB再接続時に動いてないことが判明。 myapp_server.plだとちゃんとSET NAMES呼ばれるんだけどmod_perlだと何故か呼ばれない。 ってことでmod_perlに関係有りそうな部分をひたすら調べていたところ、mysql_

    DBD::mysqlのmysql_auto_reconnectが真だとDB再接続時にDBICのon_connect_doが実行されない件 - Unknown::Programming
  • Catalyst::Plugin::Session::State::URIと携帯端末とfragment付きリンク - Unknown::Programming

    C::P::Session::State::URIは便利なんだけどfragmentが付いてるリンクまでセッションIDを埋め込んでしまうので微妙。 なんでかっていうとDoCoMo等、クエリとfragmentが存在する場合、ページ内リンクにならずにページ遷移してしまうんだよね。 ちなみにfragmentってのは以下のようなものね。 <a href="#">foo</a> 動画のダウンロードとかでオブジェクトタグ使ってるとダウンロードできなくなってしまうので困った困った。 なのでfragment付いてる時はセッションIDを埋め込まないようにするモジュールを作った。 package MyApp::Session::State::MobileURI; use strict; use warnings; our $VERSION = 0.01; sub session_should_rewrite_u

    Catalyst::Plugin::Session::State::URIと携帯端末とfragment付きリンク - Unknown::Programming
  • Catalyst+mod_perl2+DBIC(DBD::mysql-v4.008)でSegmentation fault - Unknown::Programming

    なんか良く分からんけどSegmentation faultが出て泣きそうだったんだけどやっと原因がわかったっぽい感じなのでメモしとく。 とりあえず環境は下記 CentOS 5.2 Apache 2.2.9 Perl v5.8.8 mod_perl 2.0.4 MySQL 5.0.51b 現象としてはサイトを数時間放置してアクセスすると必ずセグるというもので、当初は何がなんだか分からないL状態でした。 で、coreファイルを解析したところ、 Program terminated with signal 11, Segmentation fault. #0 0x048be024 in mysql_send_query () from /usr/local/mysql/lib/mysql/libmysqlclient.so.15 というメッセージが。どうやらmysqlに問題があるっぽいことがわか

    Catalyst+mod_perl2+DBIC(DBD::mysql-v4.008)でSegmentation fault - Unknown::Programming
  • Catalyst::Model::なんとかAdaptor系の話 - Unknown::Programming

    Catalyst::Model::MultiAdaptorでlifecyle support - dann's blog - # やりたいことがいつの間にかできていた - 僕ト云フ事@はてな出張版 この辺の記事を見てて思ったこと。 Catalyst::Model::Adaptorは便利だけど、モジュールの数だけモデル化用のファイルが増えるのも微妙という話。 そこでCatalyst::Model::DynamicAdaptorやCatalyst::Model::MultiAdaptorとかでその辺を解決という話なんだけど、 パッケージ以下全部を読み込みって言うのが僕の今回の用途に合わないので、個人的にこんな感じで書けたらいいのかなぁという案だけちょっと考えてみた。 __PACKAGE__->config( package => { 'TestApp::Service::*' => { lif

    Catalyst::Model::なんとかAdaptor系の話 - Unknown::Programming