はてなスター

なんかはてダに変なの付いたと思って見てたらこういうことか。
http://d.hatena.ne.jp/hatenadiary/20070711/1184149817

これが、はてなのネガティブブックマーク(ネガブ)に対する対策ってことだろう。


はてブに規制をかけるのではなく、
システム上プラスにしか働かないシステムで相殺しようっていう発想は好きだ。
なんか人気ないみたいだけど。


自分で間違ってつけたスターが消せないらしいけど、
システムの性質上、別にそれでよいんじゃないか。
間違うのは最初の数回くらいだろうし、
そのための追加コードは無意味だと思う。


僕は別に無くても困らないし、
そもそもこの追加機能自体、使うことも無いかもしれん。

CakePHP 1.2.0.5427alpha リリース

CakePHP 1.2.0.5427alpha がリリースされました。
まだ alpha。


console 周りが結構変更されてます。
bake コマンドの元ファイルが template になったみたいですね。
妥当な流れだと思います。


とはいえ。
そのテンプレートの中身はこんなんなんですよ。

/cake/console/libs/templates/views/view.ctp より一部抜粋。

$i = 0;
foreach ($fields as $field) {
	$class = null;
	if ($i++ % 2 == 0) {
		$class = ' class="altrow"';
	}

	if (in_array($field['name'], array_keys($foreignKeys))) {
		$otherModelClass = $foreignKeys[$field['name']][1];
		$otherModelKey = Inflector::underscore($otherModelClass);
		$otherControllerName = Inflector::pluralize($otherModelClass);
		$otherControllerPath = Inflector::underscore($otherControllerName);
		if (isset($foreignKeys[$field['name']][2])) {
			$otherModelClass = $foreignKeys[$field['name']][2];
		}
		$otherSingularVar = Inflector::variable($otherModelClass);
		$otherModelObj =& ClassRegistry::getObject($otherModelKey);
		$otherPrimaryKey = $otherModelObj->primaryKey;
		$otherDisplayField = $otherModelObj->displayField;
		echo "\t\t<dt{$class}>".Inflector::humanize($otherModelClass)."</dt>\n";
		echo "\t\t<dd{$class}>\n\t\t\t<?php echo \$html->link(\${$singularVar}['{$otherModelClass}']['{$otherDisplayField}'], array('controller'=> '{$otherControllerPath}', 'action'=>'view', \${$singularVar}['{$otherModelClass}']['{$otherPrimaryKey}'])); ?>\n\t\t\t&nbsp;\n\t\t</dd>\n";
	} else {
		echo "\t\t<dt{$class}>".Inflector::humanize($field['name'])."</dt>\n";
		echo "\t\t<dd{$class}>\n\t\t\t<?php echo \${$singularVar}['{$modelClass}']['{$field['name']}']?>\n\t\t\t&nbsp;\n\t\t</dd>\n";
	}
}
?>
	</dl>
</div>


だめだ、やっぱりなじめない。。。


cake_smarty の対応はどうしよっかな。
今回はスルーして、ベータ版出てからにしよっかな。

HTML_QuickForm よ永遠に

最初は感動するものの、使えば使うほど嫌いになっていく HTML_QuickForm がメンテナンス終了したとか何だとか。


とうとうHTML_QuickFormのメンテナンスが終了してしまった(正確に言うと追加開発が終わっただけでバグフィックスは継続しておこなわれる模様)。


僕にとって、「昔の彼女が結婚しました」みたいな話だ。
あの時はありがとう、どうぞお幸せに。


みんな CakePHP に乗り換えればよいと思う。
こっちのがきっと幸せになれる。

靴ずれた

買ったばかりのサンダル履いて会社行ったらおもっきり靴ずれした。
親指と人差し指の間の鼻緒的なものが当たる個所がベローンってなった。


まあ、試着した時からその予感はあったんだけど。


サンダルずれしないように、鼻緒の部分をやさしくコーティング
してくれるような商品はこの世にないもんだろうか。


あるとすれば、商品名は「サンダルズレナーイ」以外に考えられなかったので、
それで検索してみたら、ヒットしなかった。


誰か作ったらよいのにと思う。
でも、誰か作っても、商品名が「サンダルズレナーイ」じゃなかったら
潜在顧客を逃すことになるので注意すること。

追記

「サンダルズレテナーイ」でも可。

PHP におけるクロージャの用途

PHPでクロージャ
作ってみたものの、実はあんまり用途が思い浮かんでない。
なんとなく、 array_walk がキーワードに浮かんでは来るけど。


てことで、とりあえず smarty で使ってみようと思う。


CakePHP完全 smarty 化してみたものの、
smarty 内での配列の扱いが微妙だ。

↓事の顛末はこの辺に。
http://d.hatena.ne.jp/am11op/20070614/1181837256

要は、php ならこう書くべきところを

<?php echo $html->link('Edit', array('action'=>'edit', 2));?>

smarty では view に変なメソッド作った上でこう書く必要があった。

{$html->link('Edit', $view->_array('action=>edit', 2))}

まあ、これでもよいんだけど、せっかくなんで closure (的なもの)を使ってみる。

Closure はこんなの。

class Closure {
    var $_args;
    var $_func;
    /**
     * @private
     */
    function Closure($func=null, $args=null) {
        if ($func) {
            $this->_args = $args;
            $func = ereg_replace("^function\([^\)]*\) *\{", "", $func);
            $func = ereg_replace("\}$", "", $func);
            $this->_func = $func;
        }
    }
    
    /**
     * @param $func string closure
     * @param $arg1 $mixed first object/var which is used in $func
     * @param $arg2 $mixed second object/var which is used in $func
     * ...
     */
    function bind() {
        $args = func_get_args();
        return new Closure(array_shift($args), $args);
    }

    /**
     * use this method to call closure 
     */    
    function call() {
        $func = create_function('$args', $this->_func);
        return $func($this->_args);
    }
    
    function func() {
        $args = func_get_args();
        $obj = new Closure(array_shift($args), $args);
    	return $obj->call();
    }
}


無駄にインスタンス量産してるのは、書き直すのが面倒だったから。
このクラスを closure という名前で assign_by_ref してやって、
smarty 内からこう使う。

{*$html->link('Edit', $view->_array('action=>edit', 2))*}
{$html->link('Edit', $closure->func("return array('action'=>'edit', 2);"))}

文字数増えてる!
ネタです!

まあ、ちょっと変数を php で処理して何かのメソッドに渡したい時、
一回しか使わないような modifier をいちいち作らなくてよいので便利かも。
ただし、入力値に対して使う場合は任意のコードを実行されないように気をつけること(棒読み)。

validation 時、rule 別にエラーメッセージを切り替える方法

cake1.2の話

CakePHP では view で エラーメッセージを指定することで
任意のエラーメッセージを出力できます。

{$form->error('name', 'ちょwww名前wwwww')}

rule が一つの場合ならこれでも問題ないのですが、
メールアドレスの validation など、
入力が無い場合と入力値が不適切な場合で
違うエラーメッセージを表示したい場合には
view だけでは実現できません。


そんな時には
model の $validate を以下のように指定すれば OK です。

class User extends AppModel {

	var $name = 'User';
	var $validate = array(
		'name' => array(
			'rule'=>VALID_NOT_EMPTY, 
			'message'=>'名前を入力してください'
			),
		'email' => array(
			array(
				'rule'=>VALID_EMAIL, 
				'message'=>'メールアドレスが不適切です。'
				),
			array(
				'rule'=>VALID_NOT_EMPTY, 
				'message'=>'メールアドレスを入力してください'
				),
		),
		'comment' => array(
			'rule'=>VALID_NOT_EMPTY, 
			'message'=>'コメントを入力してください'
			),
	);

}

manual には書いてないけど、ソースには書いてありました。
よくありますね、こういうこと。