カテゴリー : 2004年 11月

JavaとPHP4の参照についての致命的な相違


参照は完全なエイリアスになる.
例)
class foo{
function assign(&$tmpl){
$this->tmpl = &$tmpl;
$this->request();
$tmpl->assign($this->getModeVariableName(),$this->getCode());
$this->tmpl = null; // $this->tmpl の参照をなくしたい.
}
}
$template = new Template();
$assginer = new foo();
$assigner->assign($template);
// この時点で $template === null になる.
対策は, ローカル変数にリエイリアシングしてしまうこと.
つまり, $this->tmpl = null ではなく
$stuff = null;
$this->tmpl =& $stuff;
とすればいい.

eclipse が重い対策


ウィルススキャンが影響している可能性もある.
eclipse のディレクトリを除外するとよい. jdk もかな.
ちなみに JRockit で eclipse を立ち上げたら重すぎた…チューニングでなんとかなるのかもしれないがやっぱりサーバ向け.

IBM がゲームでJava学習を推進しだしてる


CodeRuler/CodeRully
CodeRuler: キャラをコーディングしてシミュレートする戦略ゲームシミュレータ.
<http://www-6.ibm.com/jp/developerworks/java/041015/j_j-coderuler.html>
CodeRully : ラリーカーをコーディングしてオンライン対戦させるレースゲーム.
<http://www-6.ibm.com/jp/developerworks/java/040813/j_j-coderally.html>

jdk5.0 で同期処理


java.util.concurrent.ReentrantLock
synchronized 構文に代替するもの. Lock がインターフェイスになっている.
lock.lock() でロックした後, finally で必ずlock.unlock() しないと例外時にデッドロックになる.
<http://www-6.ibm.com/jp/developerworks/java/041112/j_j-jtp10264.html>

eclipse


AJTD(AspectJ Development Toolkit) というものがあるらしい.
<http://download.eclipse.org/technology/ajdt/30/update>
を Eclipse のインストールサイトに追加.
参考: dwIBM <http://www-6.ibm.com/jp/developerworks/java/041126/j_j-ajdt.html>

PID のプログラム名を調べる


tasklist というコマンドでPIDとイメージの一覧を取得可能.
XP/2003 server のみ対応.

ローカルポートスキャン


- XP SP2 では netstat -b -v でプロセス名も見られる.
XP/2003 server は netstat -o で Listen している PID を調べられる.

PHP4 で serialize


親クラスを持つクラスでの __sleep() 定義の注意
配列を返すときに, 親の全てのフィールド名を返さないと親のフィールドが消えてしまう.
function __sleep(){return array_merge(array(‘dontIgnoreMe’,'varname’),array_keys(get_class_vars(get_parent_class($this))));}

PHP4 で クラス内からの外部参照と serialize


関連オブジェクトへの参照を持っているオブジェクトのシリアル化の問題.
serialize するときに, 一番外のオブジェクトより中にあるオブジェクトとの関連である場合は参照は維持されるが,
それ以外は連携すべきものがコピーとして独立してしまう.
$btmp->mes = “b”;
$atmp->ref =& $btmp;
$a = unserialize(serialize($atmp));
$b = unserialize(serialize($atmp));
$a->ref->mes = “b in a”;
echo ‘$b->mes = ‘.$b->mes.’; $a->ref->mes = ‘.$a->ref->mes;
// 結果: $b->mes = b; $a->ref->mes = b in a
対策: serialize する関連しあうオブジェクト群をひとまとめにしたクラスを作成する.
class Component{ var $a; var $b;
function Component($a,$b){
$this->a = $a; $this->b = $b; // 参照で保存すると本末転倒.
$this->a->ref = & $this->b;
}
}
$comp = unserialize(serialize(new Component($a,$b)));
みたいな.
これ自身に意味はないがセッションを使う場合に暗黙の serialize が行われるため重要.
ちなみに new Component($a,$b) をarray(&$atmp,&$btmp) に置き換えても独立したコピーになってしまう.

getter を & で受けると内部までリファレンスになる


<http://ns1.php.gr.jp/pipermail/php-users/2004-February/020723.html>
オブジェクトのコピーをしたつもりが内部で同じデータを見ている….
対策: 結論としては, getter は
function get(){ return 0:0:$this->val; }
のように式をかませてやれば,クライアントの利用方法によらず内部への影響が起きないことを保障できる.
許可されている場合を除きメソッドの結果を =& で受けるべきではない.
$val =& $obj->get();
されると $obj->val 自身に参照のレッテルが貼られるのはいかがなものかと….
しかも, クラスメンバでなければどちらもvar_dumpでは参照扱いにはなっていない.