2010年3月30日火曜日

Redmineのガントチャートがネストする!

サブタスクをサポートしたらしいよ!

詳細はこちら。すごい!さっそくアップデートしよ〜♪。ちなみにアップデートしただけじゃだめで、設定のロールと権限で権限付与が必要。Redmine頑張ってますね!グローバルに置いてるサーバからはRedmineは外すけど、ローカルサーバには置いてるので今後も使って行きます。

2010年3月29日月曜日

CakePHPでデバッグ情報を消す裏技

HTMLを直接出す困ったちゃん

CakePHPのConfigure::read() > 1 (引数省略はdebugが渡されることになる)だと、DboSource::showLog()が強制的に実行されて、レンダーされたものの最後に必ずSQLの情報が付加される。それはそれで有り難いし、普段の開発ではその方が助かるんだけども、CSVファイルとかHTML以外のファイルを出力する時は邪魔でしかない。

一時的にdebugを0にすればOK

debugが1でも実行時間がHTMLのコメントアウトで付加されるので、HTML以外のファイルで、そういった文字列が勝手に出力されるのが不都合な場合は、レンダー直前でConfigure::write('debug', 0);とすればOK!裏技でもなんでもないけど。一つ注意なのは、デバッグ系で使うもの(pr関数とか)が使えなくなるということ。

ソースを読んでみたら、このデバッグ情報のところはdebugの数値によって強制的に出る。他に消す方法がないか(使用するレイアウトを変えるとか、レイアウトを使用しない(falseを渡す)とか)探ったけど、どうもだめっぽい。デバッグ情報は、必要ならその時表示して、あとは開発モードならログファイルに書き込んどくっていうくらいでいいと思うんだけど、CakePHPはその辺は男は黙ってログ出力!らしい。

controllerのlogメソッド経由でCakeLog::writeをするのは、開発時のデバッグ情報よりも、稼働中に起きた是正すべきエラーのログを残すために使った方が良いと思うので、目的が違う。 showLogメソッドを改造しようかと思ったけど、今回はConfigure::write('debug', 0)をタイミング良く呼び出すことで対処した。でもこれって、RSSとかXML、バイナリデータをもっと扱うようになると面倒というか、この仕様じゃ普段の開発と違うしで、なんか変だなー。ハードコーディングはBKよ!

2010年3月28日日曜日

ペットロス

久々に技術系じゃない内容

実家で飼っている犬(ミニチュアダックスフント 12歳)が病気になり、先日手術して昨日退院した。まだ手術後間もないので、あまり元気はない。歳も歳だし、昼間から寝てるのが普通なんだけど、食べ物への執着だけはすごく、何か食べ物の匂いや袋から物出す音を聞いたがしただけで目を覚ましたり、くれ!と暴れ出すんだけど、ここのところそれもない。腹部の毛を剃られているので、お腹が冷えないように毛布をかけてあげているが、普段なら遊びと勘違いして毛布を噛み散らすんだけど、それもない。術後だからそんなもんだろうと思って、あまり普段と変わらず接しているつもりだけど、やっぱり傷跡を舐めないかとか、痛がってないがと気にはなる。それに年齢的にも別れはそう遠くないという意識がさらに強くなってしまった。見た目はいつも子犬みたいなのに。

やれるだけのことをやる

家には物心ついた時から犬がいて、なぜか犬の面倒は自分が見るということが多かったんだけど。中学高校と成長するに家に帰る時間も遅くなり、あまり散歩とかしなくなった。そんな時、小学生の頃から飼っていた犬が病気で突然死んだ。忠誠心が強い犬で賢く、家族には吠えないし、お客さんが来ても最初吠える程度で長くは吠えない。外で鎖に繋いで飼っていたけど、トイレの場所も決めていて、犬にしては臭くなかった。ほとんど洗ってあげたことがなかったけどw あまり面倒をみてやんなくても、とにかく尻尾をふりふりして、頭を低くして、耳も寝かせて甘えてくるかわいい犬だった。病気になったのは突然で、病気になった次の日の夜には死んでしまった。最後を看取ることはできなかったけど、死体を庭に埋めるのには立ち会えた。

その後、一人になる時間まで耐えた。家で一人になった時、仏壇の前で泣いた。哀しいという感情よりも、全然世話しなかったことを悔やむ気持ちばかりで、謝りながら泣いたのを今でも覚えている。

その時からペットの世話はちゃんと見ようと思った。これはその死んだ犬が教えてくれたことだと思うし、自分の中でも罪滅ぼしでもあると思う。無理なことはなかなか続けるのが難しいけど、できることはできるだけやると決めた、死ぬその時まで。

死を免れることはできないし、普通に考えて飼う時から順番的に死ぬのは犬の方が早いのも分かっている。衰えてゆく姿を見ながらも最後の時までしっかり面倒を見てあげたい。もうあの時と同じ後悔はしたくないから。

2010年3月26日金曜日

PHPでcamelizeとunderscore


ちゃちゃっと!eval(preg_matchのcallback)は使わず関数の組み合わせで。5.3使いたい><

// アンダースコアをキャメルケース
function camelize($str) { return str_replace(' ','',ucwords(str_replace('_',' ',$str)));}
// キャメルケースをアンダースコアに
// 5.3以前
function underscore($str) {return strtolower(preg_replace('/(?!^)[A-Z]/', '_$0', $str));}
// 5.3
function underscore($str) {return strtolower(preg_replace('/[A-Z]/', '_$0', lcfirst($str)));}

//実行結果
camelize('aiue_eo'); // AiuEo
underscore(camelize('aiue_eo')); //aiu_eo

2010年3月17日水曜日

PHP6の先行きが怪しい

FUD?

PHP6開発 UTF-16化を断念、5.3へロールバック

えー!でもUTF-16化しなくなくなったのはいい事だと思います。これからどうなるんだろ。とにかくPHPは使い捨て言語って割り切った方がいいのかな。。。もったいないなー

2010年3月15日月曜日

CakePHPで生SQL

ナマ言ってんじゃないよ、と

実はCakePHPのModel->queryでも「?」の置き換えができたりと、意外と便利。でもPDOを使ってる身からすると:keyword形式の方がやりやすい。あとエスケープの仕方はSanitize->escapeでいいのかな?? なんかその辺の情報の薄さが微妙...。調べるよりもやり方知ってるから自力でエスケープしたくなりますね><

個人的には AS Model__fieldはよく使います。その方がテーブルから取得したデータの配列構造がCakePHPらしさを失わずに済むので。

JOINしたくなったよ〜

CakePHPのModelは便利君だけど、ある期間の集計とか、前年比とかになると、たぶん直接SQLを書いた方が早い。実行速度も全然その方が気がする。でもどうなんだろ、CakePHPマスターからすれば、そんなのちゃんとアソシエーション組んどけばできるよ!って言うのかもしれない。LEFT JOIN table_a as prevous_year ON table_a.year = (table_a.year - 1)みたいなのって、アソシエーションの指定でいけなくもなさそうだなぁとは思います。でもSUM(CASE WHEN table_a.day <= 10 THEN table_a.price ELSE 0 END) AS price_10 みたいなのを書き出すと、ちょっとソースが汚くなりそうだから、いっそのこと$this->queryっちゃいたくなるんですよね。

2010年3月10日水曜日

Smarty3でエスケープをデフォルトにする方法

Smarty2では$default_modifiers でもバグがあった模様

//smarty側
$this->default_modifiers = array('escape:"htmlall");

//テンプレート側
{$escaped} //エスケープされる
{$unescaped|smarty:nodefaults} //エスケープされない

どういったバグがあるかについては、Smartyのバグ ~default_modifiers~が参考になります。再帰処理はSmarty2でdefault_modifiersを使いたくなったら書こうかな。でも基本的にスカラの時だけエスケープすればいいと思うので、配列の時は何もしないってのがいいと思います。

Smarty3ではvariableFilter(関数名)

マニュアル読んでないし(まだ出てない?)、ソースも全然読んでないのでひょっとしたら公式なやり方じゃないかもしれない....けど、これで動きます。

//Smarty側
$this->register->variableFilter('escape');
//フィルター関数
function escape($string, $smarty){
  return is_string($string) ? htmlentities($string, ENT_QUOTES,  SMARTY_RESOURCE_CHAR_SET) : $string;
}

//テンプレート側
{$escaped} //エスケープされます
{$unescaped nofilter} //エスケープされません

ちなみにSmarty3.0b8で試しました。バグはどこかに残ってるはずだけど、Smarty2より2〜5倍速いようです。ほぼ完成してるらしいので、早く安定版出してほしいな〜!

ちゃんとやるなら? loadFilter('variable', 関数名);で定義してる関数を読み込んで、variableFilter(関数名)とするのがいいのかもしれません。

PHP5.2以前で静的遅延束縛もどき

PHP5.3から使える静的遅延束縛

静的遅延束縛は、簡単にざっくりと説明すると、__CLASS__を呼び出す時に、定義してるのクラスの名前が出るところが、static::__CLASS__書けば、継承してるクラスの名前を取れる感じです。が、ちゃんと理解したい人はググって下さい。この理解の仕方で留まるのは良くないと思うのでw(無責任)

static::__CLASS__はget_class($this)でも代用できる、問題は__METHOD__

結論から言うと、できません。もしやり方が分かってる方がいらっしゃれば教えて下さい(T_T)。当たり前じゃんと思うかもしれませんが、__FUNCTION__もだめでしたw 呼び出し元を特定できるといいんですが、PHP callerとかでぐぐったらデバッグ情報から取り出すってのは見つけたけど、なんかそれはちょっと...

URLDispatcherが規約に基づいてるので、そっちの方で$this->setCurrentMethod('メソッド名');で設定する感じでやりました。何がしたかったかと言うと、クラス&メソッド名からviewファイルのパスを得る処理です。静的遅延束縛が使えればstr_replace('::', '/', strtolower(static::__METHOD))で実装して、命名規約を作っちゃえば済む話になります。便利!

何言ってるか全然分からないという方は、いずれ公開されるであろうYZWのソースをお読み下さい。

PHP5.3は何気にいい

PHP5.3なんてPHP6への踏み台で微妙なバージョンでしょ〜なんてナメてました。でも違いますね。使いたい機能がある。名前空間、?:、静的遅延束縛などなど...

5.3をどんどん使って行きたい。

2010年3月8日月曜日

PHP extractは$thisを上書きするように一瞬見える

$thisに直接代入するとエラーがおきる

Fatal error: Cannot re-assign $this

$this = 'aaa';なんてすると、致命的エラーが出ます。たぶん$thisにあたるものがある言語で、$thisを変更するのは自殺行為的。

extract関数だとエラーが起きずに上書きされるように見える

class PollutionTest{
  // $thisが上書きできちゃうかテスト
  // $thisは上書きされたらだめなんだけど...
  function polluteThis(){
    var_dump($this);
    $this->method();
    extract(array('this' => 'This has been polluted!!'));
    var_dump($this);
    $this->method();
    echo $this;
  }
  
  function method(){
    echo 'Method Called', PHP_EOL;
  }
}

$obj = new PollutionTest;
$obj->polluteThis();

//実行結果
object(PollutionTest)#1 (0) {
}
Method Called
string(24) "This has been polluted!!"
Method Called

$thisは文字列になったはずなのに、メソッド呼び出しができるという謎。実際は上書きはされない。おそらく文字列を入れた時は$thisという文字列を入れた変数が別に存在している(呼び出し方は不明)。その関係で?__toStringメソッドが呼び出されなくなる模様。実際上書きはされないけど、なんらかの影響があるのはまずいですね...

外部からのデータは直接extractしちゃだめ

戒律ですね。viewを呼び出すところでこんな風に書いてる場合もあると思うので、注意が必要です。

class View{
  public function render($locals) {
    unset($locals['this']);
    extract($locals);
    include($this->template_file);
  }
}

Skype Off

なんだかつながったりつながらなかったり?

Skypeのオンライン状況って若干リアルタイムじゃないですよね。というよりも、最近どうもオンラインになったりオフラインになったりする日があるようで、コンタクトリスト上の人たちからうざがられます>< 知らんがな!と言いたいけど、あれ?急にメッセージ来なくなったとか、届かなくなったとかなったり、音声チャットが切れたり、最初はプロバイダの仕様とも思ってたけど、どうも違うっぽい。

オンラインになっても、自分がオンラインになったのがすぐ伝わるユーザとそうじゃないユーザ、自分側から見てもまた然りで、「リストから外した?」とか言われる始末です。

なんだか疲れたので、音声チャットで会話する日以外はあまりつけんとこ。気が向いたら再インストールしよう...

My skype seems have some problems so that I don't log on skype untill I reinstall it successfully. But I'll do when I need to do Skype-to-Skype call. Email me when you need to contact me. And also whenever you want to! :)