cakePHP本(ほぼ公式本)

先日コメントでいただいたリーク情報どおり、cakePHP本が出版された。著者メンバーが充実、安藤さんとか堂前さんとか、日本のcakePHPコミュニティの主要メンバーとも言える面々だ。cakePHPを取り扱う人なら「買い!」だろう。
Amazonのページで、商品説明を読んで思った点がひとつ。「PHPのフレームワークは数多公開されていますが、CakePHPが本命と目されています」。これって・・・どんだけぇ〜、って感じだ。cakePHPが本命だと思ってる人なんてごくわずかでしょ?。常識的に考えてPHPフレームワークの本命は1番手にZend Framework、それにEthna、Symfonyが続くと思うのだが・・・。まぁ、アジャイルという点だけにクローズアップするなら、いい感じだと思うのだけどね。
書店に並んだら、立ち読みしてから買ってみることにする。

simplepie.incの問題

2007/10/25 | XML

普段よく使用しているRSSをパースするためのライブラリsimplepieに問題があることがわかった。「問題」といってもsimplepie自体に問題があるのではなく、simplepieを利用する環境(PHP)側によって問題が発生することがあるようだ。

今回某サーバでsimplepieを使ってRSSのパースを試みた。他のサーバで動作していたものを持ってきて、必要部分だけ書き換えて出来上がり、と思ったらエラーがいっぱい吐き出された。エラーは2種類。

Warning: Compilation failed: unrecognized character after (? at offset 63 in /var/www/…/simplepie.inc on line 9488

Warning: Compilation failed: characters with values > 255 are not yet supported in classes at offset 31 in /var/www/…/simplepie.inc on line 9607

該当する箇所をみてみると、前者はpreg_replace関数で、後者はpreg_match関数でエラーが出ている。ウェブで検索すると、simplepieの作者のコメントが出ていた。「PCREのバグかもしれない」とのこと。どういう状態のときにこのエラーが発生するのか、ということには言及されていないけれど、まぁ、そういうことなんだ、と納得した。

で、対応。
前者のエラーは以下のような関数の中にある。
function uncomment_rfc822($data)
{
 if ((version_compare(PHP_VERSION, ‘4.4.6’, ‘<=’) && version_compare(PHP_VERSION, ‘5’, ‘>’)) || version_compare(PHP_VERSION, ‘5.2.2’, ‘<=’))
 {
  return $data;
 }
 else
 {
  return preg_replace(‘/((?:(?:¥¥¥¥”|[^(“])*(?:”(?:[^”¥¥¥¥¥r]|¥¥¥¥.)*”¥s*)?)*)((?>!¥¥¥¥)¥((?:(?2)|.)*?(?>!¥¥¥¥)¥))/’, ‘$1′, $data);
 }
}

とりあえず「チェックしない」と決め打ちしてif節の前に「return $data;」をおいて解決。

後者はこんな関数。
function is_isegment_nz_nc($string)
{
 return (bool) preg_match(‘/^([A-Za-z0-9¥-._~¥x{A0}-¥x{D7FF}¥x{F900}-¥x{FDCF}¥x{FDF0}-¥x{FFEF}¥x{10000}-¥x{1FFFD}¥x{20000}-¥x{2FFFD}¥x{30000}-¥x{3FFFD}¥x{40000}-¥x{4FFFD}¥x{50000}-¥x{5FFFD}¥x{60000}-¥x{6FFFD}¥x{70000}-¥x{7FFFD}¥x{80000}-¥x{8FFFD}¥x{90000}-¥x{9FFFD}¥x{A0000}-¥x{AFFFD}¥x{B0000}-¥x{BFFFD}¥x{C0000}-¥x{CFFFD}¥x{D0000}-¥x{DFFFD}¥x{E1000}-¥x{EFFFD}!$&¥'()*+,;=@]|(%[0-9ABCDEF]{2}))+$/u’, $string);
}

こちらもチェックをやめて「return true;」に書き換え。これで解決。
いや、まぁ、本当に「解決した」とは言えないのだが、とりあえずこれでよしとする。
おそらくバージョンによる問題だと思うので、比較的新しいものを使っている場合はこんなことしなくても、元々エラーなんて出ないと思う。たぶん、ごく一部の環境だけだ。

しかしそんな環境を使っている自分がうらめしい・・・。

既存のシステムに機能を追加する時に

2007/10/24 | マイPHPメモ

以前、クラス(オブジェクト)を読むのにget_parent_classをはじめとする便利な関数を紹介した。現在WordPressで遊んでいるのだが、実はいろいろと厄介。あらかじめ用意されている出力用関数では物足りないのだ。
で、いろいろ分岐処理をしたい。きっとシステム(WordPress)側で変数としていろんなのを保持しているはずだろうから、そこから判別しようと考えた。で、やらなければいけないのは、定義された変数をすべて取得し、使えそうなものをピックアップする、という作業だ。
PHPに便利な関数があった。

get_defined_vars

定義された変数が配列形式ですべて返される。
この関数を使うと、当然のことながら、大量の変数が吐き出される。最初から読んでいくときりがないので($_SERVERとか$_GETとかから始まってしまうので・・・)、後ろから読むのがおすすめ(普通の変数は後ろのほうにある)。

まぁ、大量に出てくるわけで、そこから必要なものを見つけ出すのは大変なのだが、慣れてしまえば便利な関数だ。やっぱり変数名はわかりやすいものをつけておくべきだと思った(だって適当に推測して検索できるから)。

クリックで画像が指定したものに変わる

2007/10/23 | JavaScript/Ajax

画像クリックで、違う画像が表示される仕組みをJavaScriptで作っていた。最初は1枚の画像に対して、クリックで別画像が表示され、再クリックでもとの画像が表示されるという単純なものだった。しかしいろいろ考えていると
「画像が3枚とか4枚のローテーションになったらどうしよう」とか「スクリプトにファイル名を書き込んだら、画像変更の際はやっぱりプログラムを書き換える?」とか思ってしまい、結局関数にした。JavaScriptで汎用的に使えそうな関数を書くなんてめったにないのでメモっておく。

var overimg=0;
function clickChange(){
  property=clickChange.arguments;
  imgArray=new Array();
  for(i=0;i<property.length;i++){
    if(i==0){
      target=property[i];
    }else{
      imgArray[i-1]=property[i];
    }
  }
  overimg++;
  if(overimg>imgArray.length-1){
    overimg=0;
  }
  document.getElementById(target).src=imgArray[overimg];
}

使い方はこんな感じ。
<a href="javascript:clickChange(‘img1′,’a.jpg’,’b.jpg’,’c.jpg’);"><img src="a.jpg" id="img1" /></a>

第1引数:変化させたい画像のID値
第2引数:元の画像のURL
第3引数:1回目のクリックで表示させる画像のURL
第4引数:2回目のクリックで表示させる画像のURL


という感じで、ローテーションさせたい画像の数だけ引数に指定してやる。ローテーションが最後までいくと、再度もとの画像が表示され、そこから再び同じ手順で・・・。
JavaScriptは苦手なので、できたときはちょっとうれしい気分♪。

WordPressのカスタマイズで

2007/10/18 | SNS/CMS/ブログ

WordPress便利!、ということで現在とある案件をWordPressで構築中。MTでもなんでも同じだけど、テンプレートを作るときは専用のタグというものがある。WordPressの場合は特別なテンプレートエンジンというものもなく、単純にPHPの関数をはめ込んでいるだけだから、PHPユーザには大変親和性が高い。極端なお話になってしまうが、希望する関数がない場合はPHPで作っちゃえばいいからだ。
さて「関数をはめ込めばいい」といっても、WordPress内で定義されている関数は大量にある(軽く2000個以上ある)。そんなの全部把握できるわけがない。で、どんな関数があって、どう使えばいいんだろう、と考えてたら便利なサイトを見つけた。

http://wptags.com/

かなり最強の部類に入るサイト!。WordPressのテンプレートで使える関数の引数解説から使い方説明まで至れり尽くせり。すばらしい。

あともう一個。
http://aoina.com/archives/95

テンプレート作るときに、どんなファイル構成になるのか記録されている。ここで紹介されている記事はすごーい便利。うちでももう少し取りまとめてドキュメントを作りたいな。


守谷市(まちの情報ポータル) 無料アンケートレンタルjpForm.net