PHPの参照渡しは関数の引数だけじゃない

PHPの参照渡しについて。参照渡しについて説明しているサイトでは圧倒的に関数の引数を例にしていることがほとんど。例えば以下のような感じ。

<?php
$v = "default";
rewrite($v);
print $v;
function rewrite(&$arg) {
$arg = "HelloWorld";
}

これで「HelloWorld」と出力される。$vを直接変更していないのに、rewrite関数内での変更が$vに対して有効になっていると解く。関数の引数に「&」を付けなければ上書きされることはない(値渡し)。
最初はこれが一番判り易いけれど、もう一歩、変数代入の参照渡しと関数戻り値の参照渡しにも触れて欲しいところ。特に関数戻り値の参照渡しについて触れているサイトが本当に少ない。
変数代入の参照渡しというのは以下のコードのような場合。

<?php
$a = "default";
$b =& $a;
$b = "HelloWorld";
print $a;

これで「HelloWorld」と出力される。2行目で$aの持つ参照先が$bに渡されているために、$aの変更と$bの変更は同義となっているということ。因みにJavaでは通常(プリミティブや不変オブジェクトなどの場合は異なる)このように参照渡しで代入される。
もうひとつ。関数の戻り値の参照渡しについて。

<?php
class HelloWorld {
var $value = "default";
function &getValue() {
return $this->value;
}
}
$helloWorld = new HelloWorld();
$v =& $helloWorld->getValue();
$v = "HelloWorld";
print $helloWorld->value;

これで「HelloWorld」と出力される。関数「&getValue」の「&」とメソッド実行の戻り値「=& $helloWorld->getValue();」の「&」のどちらが抜けても参照渡しにはならない。その場合は値渡しとなり「default」と出力される。
オープンソースPHPコード(PEARとか)では上の例のどれも頻繁に使われているけれど、説明しているサイトには関数の引数の説明しかないので、最初見たときは何のことか判らなかった(想像はできたけど)。
参照渡しを調べていて納得できない人がこのエントリに辿り着けるように、「アンパサンド」とか「全角の&」とかをこの文章に含めておこう(スパム行為?)。
補足として関数の値渡しと参照渡し、どちらが速い?

参照渡し・値渡しの違いは、値が変更された時に初めて起こる

というのは知らない人が多いかもしれない。

はてなのサブドメインはGoogleに強い

はてなで各サービスのURLに使われているサブドメインGoogleで検索すると、かなりはてなが強い。勿体振らずにまずは結果から。

検索文字列 ウェブ全体 日本語のページ はてなサービス
d 1 2 ダイアリー
b 2 19 ブックマーク
r 5 21 RSS
f 14 58 フォトライフ
ring 27 × リング
graph 33 13 グラフ
g 35 × グループ
q 48 × 人力検索
counter 67 30 カウンター
map × 23 マップ
a × 24 アンテナ
i × × アイデア
search × × 検索

Googleでの検索結果を100件表示した際にはてなが何位かをメモしたもので、「×」は100位以下を指している。勿論結果は色々な要因で変動するので現時点での推移と言うことで。
はてなダイヤリーは「d」というたった一文字で1位とは鮮やか。記念にスクリーンショットを撮ってみた。

上の結果はあくまでGoogleでの検索結果であってYahoo!ではこうはならないけれど、URLの持つ力を示しているような気がする。
日本で一番のサイトといえばまだまだYahoo! JAPANかと思われるけれど、Googleで以下の文字を検索するとどれもこれもYahoo!が1位になる。

Yahoo!が1位というのもすごいけれど、Amazonがしっかりランクインしている点も見逃せない。「co」や「jp」などは2位だ。
それにしても「japan」でYahoo!が1位なのだからすごい。政府とかでなくても良いのだろうか。

マウスポインタをファンネルのように

マウスポインタって何故一つしかないのだろう。複数のポインタがあれば即便利かと言われればそうとは思わないけれど、ウインドウを両端から狭めて調整するとか実現できてないインタフェースもあると思う。例えば、デザインで複数のものを配置するときなんかには便利だと思う。複数のアイテムをうにゃむにゃ別々に動かしながら検討できるので。
問題はどうやって操作するか。マウスを何台も繋げでは辛い。
指一つに対してポインタ一つなら扱えるかなと思う。指先にそれぞれボタンがあってクリックできるとか。そんな器用なことできるかってできると思う。楽器奏者なら分かってくれると思う。だから10個のポインタでも扱えると思う。でも流石に10個もポインタがあると、大分訓練しないと指が動いたとしても頭が付いていかないだろうけど。
いつでもポインタが複数あると邪魔なので通常は一つでいいかな。何かボタンを押すとポインタが散らばる。
これがファンネルみたいでかっこいいんだ、きっと。キュベレイからファンネルが出るシーンを思い出して欲しいのだけど、マウスポインタがオリジナルのポインタから一瞬にして散らばってそれを操る。ううん、ニュータイプ。「これで終わりにするか続けるか!シャア!!」と呟きながらシャットダウンしようとすると「そんな決定権がお前にあるのか!」とかダイアログで怒られるんだろうな、きっと。(それはマウスポインタが複数あることとは全然関係ない!)

迷惑ゲキタイ機能

IP電話が使える関係上、使用頻度はとても低いけれど家電話を持っている。最近、子機のみのものを購入したので省スペースでありがたい。説明書を読んでいると昔なかった機能がいろいろあってややこしいのだけど、その中でも面白い機能があった。
「迷惑ゲキタイ機能」というもの。通話中に固定のメッセージを流すというもので、メッセージは通話中に以下のものから選択できる。

  1. 迷惑をしております。かけてこないでください。
  2. 通話を録音します。
  3. 冗談はやめてください。

面白いので携帯からかけて確認してみた。すると、1.と2.は無機質な女性の声で喋るが、3.はキーシフトで声を上げた男性の声(TVでモザイクのかかった男性の声といった方が解りやすいかな)で喋るから楽しい。
でも説明書には残念な注釈が書いてあって、2.は「通話録音機能は働きません」とのことらしい。デフォルトはそれでも構わないけれど、通話を録音したい場合は…と実際に通話録音する機能も付けて欲しかった。でなければブラフにならない。
私たちはあるわけがないと思いながらも万に一つの可能性に脅えるのではないのだろうか。ブラフとはそういうものだ。その万に一つがシステム的に実装されていなければ万にゼロとなってしまう。
この電話の場合は「迷惑ゲキタイ機能」自体がそもそもおまけ的な存在だと思うので批判するには至らないけれど、もし開発者が福本漫画を読んでいたなら、アカギ―闇に降り立った天才 (1) (近代麻雀コミックス)を読んでいたなら。きっと通話録音機能は実装されていただろう。

森伊蔵 を飲んで

先日、初めて森伊蔵を飲んだので感想。
話題になるのだけあって美味しかった。焼酎なのにブランデーみたいな味がする。でも値段が高い。グラスで2500円もしたんだ。お店で飲んだから仕方ないけれど。
いつもの720mlサイズが1000円代で売ってたら迷わず買うけれど、抽選&希少価値は余計だなぁ。でも、飲み心地も後味も素敵な焼酎ではあるので、見つけたら飲んでおくと良いかな。

JavaScriptのundefinedとnullは実は同じだった?

alert( undefined );

とやると「undefined」と表示される。undefinedなのかエラーなのか判り難いけれど、FirefoxJavaScriptコンソールではエラー検知されないので大丈夫な模様。そこでObjectかなと思って

alert( typeof undefined );

とやると「undefined」と表示される。

for (k in undefined) {
alert( undefined[k] );
}

とやるとうんともすんともいわない。プロパティはないのね。
ちゃんと文法的に通るし

alert( undefined == undefined );

とやると「true」っていうからオブジェクトなんだろうなとは思う。でもObjectは継承していない。上でやったことをnullでやっても同じ反応が返ってくる。
そこで

alert( undefined == null );

とやると結果は「true」だってさ。

えぇ??

でもね、でもね、

alert( typeof null );

とやると「object」というんだよ。つまり

alert( typeof null == typeof undefined );

とやると「false」という。

と、ここまで書いておきながらだけど

alert( null === undefined );

とやるとちゃんと「false」というね。型は違うけど実体は同じと判断されてるみたい。
※検証環境はIE6SP2とFirefox1.5.0.3にて。

[追記]
nullは代入不可だけどundefinedは代入可能。なので

undefined = null;
alert( null === undefined );

とやると「true」なので注意が必要。

unDonutの検索バーからブログ検索

以前、unDonutの検索バーからAsk.jpというエントリーでAsk.jpをsearch.iniに追加してみたけれど、今回はブログ検索。

[Ask.jp ブログ検索]
Group=0
FrontURL=http://ask.jp/blog.asp?o=0&qsrc=8&ie=UTF-8&q=
BackURL=
Encode=3
[Yahoo! ブログ検索]
Group=0
FrontURL=http://blog-search.yahoo.co.jp/search?cop=&p=
BackURL=
Encode=2
[livedoor 検索 ブログ]
Group=0
FrontURL=http://sf.livedoor.com/search?sf=update_date&q=
BackURL=
Encode=2
[テクノラティジャパン ブログ検索]
Group=0
FrontURL=http://www.technorati.jp/search/search.html?callCode=&queryMode=main&language=ja&query=
BackURL=
Encode=3

それぞれ相応のエンコードを指定してあるので化けずに検索できるはず。search.iniに追加するだけだけど、リストを追加した場合は表示するために[Search-List]の欄で

01=▼ブログ検索
02=Ask.jp ブログ検索
03=Yahoo! ブログ検索
04=livedoor 検索 ブログ
05=テクノラティジャパン ブログ検索

というように(01はお好みで)してやる必要がある。番号は追加する場所によって変わるので適宜変更を。

ListCount=20

という箇所をリストの数分に変更することもお忘れなく。
ここにリストアップしたブログ検索以外(gooとか)にも色々あるけど、お好みなものを同じような要領で追加すると良いかと。

プログラムの信頼性の判断

[ハ]Firefox と Greasemonkey とアフィリエイト泥棒 | キミガタメ「ハ」を読ませて頂いて感じたこと。
Webの世界に限らず私たちは日常的に人を指標にしていることがほとんど。全て自分で調べるなり解析するなりして判断することは時間的(または技能的に)に出来ないので、他人の意見を参考材料にして判断する。こうした判断の仕方はほとんどの人が行っていると思う。
具体的な例で言うと、自分の大好きなミュージシャンが「私は毎日○○という曲を聴いています」と言っていたら「○○」という曲を聴いてみたくなるとか、新学期、新しいクラスのみんなが「あいつは不潔だ」と言っていたら、その「あいつ」と面識がなくても不潔な人だと思ってしまうとか。このようにあっさり信用するかは別にしてこういう材料に囲まれて生活しているという意味で。
この判断基準となる人は抽象化されていてもいい。例えば、Yahoo!のニュースに「北陸でマグニチュード7を観測」と出たら普通は信じるでしょう。これは「Yahoo!みたいな有名なサイトなら」というサイト自体を指標にしている。
色々な判断を人頼りに行っている訳だけど、こと「信頼」とか「信用」という言葉出てくるようなジャンルでは問題になりやすい。しかし、こうした事柄であっても私たちは日常的に人を指標に判断を行っている。
例えば、親友がくれた故郷のおみやげに毒が入っているか確認する人は極めて少ないだろう。普通は盲目的に信用してしまう。言い出したらキリがない。けれど、現実に毒が入っているケースがあるから、そのときに「誰が悪いのか?」ということになる。
毒を入れた人が悪い=100%であれば丸く収まるのだけど、「信用したこと自体が悪い」という票が入ってしまうことがある。曖昧な出来事ほどその割合は高い。
上の例は判り易過ぎるので、例えば、宅配で荷物受け取った後に押し売り業者が勝手に送った品物だと判ったというのはどうだろう。勿論、受け取る際に差出人の確認は可能なので「宅配は安全」という信用を持っていたこと自体が問題視される。つまり「押し売り業者は当然悪いけど、何でも受け取る人もどうかと思うよね」というような按配で信用者が非難されてしまう。
前置きが長くなったけど、要するに上の非難と同様に「規約違反は当然悪いけど、Greasemonkeyをコードを読めない人が使ってるというのもどうかと思うよね」となる訳だ。
人を指標に判断するということは自分で確認するよりも事故が起きやすい。親友が毒をもることもあるだろう。だから、指標にする人の選定に力を入れるのも一つだ。完全に防ぐことはできないので、出来るだけ事故の確率を少なくする方向で。Greasemonkeyのケースで言えば、プログラムコードを毎回確認してからインストールするのではなく、毎回確認してる人(無論推測になるけど)の使っているものをインストールするという具合か。
話の本質は効率に対するトレードオフだと思う。だから、確認可能かどうかということは最早どうでもいいかもしれない。あの人が作ったプログラムならと信用するか、全てのコードを熟読した上に検証を行ってから利用するかのどちらを採るかの問題で、速度 or 安全である。
私はプログラマーであるけれど、多くの場合は前者を採用している。自分で確認すれば事故が減ることは知っているけれど、速度を優先している。つまり事故に会いやすい。
では、実生活で事故に遭遇しやすい場面ではどのように対策するのか。その解の一つに保険がある。
私の場合、この範囲までの事故は起こってもいいよという対策(保険)はある程度している。だから、プログラムの不具合でWindowsを再インストールすることになっても別に怒らない。いや、感情的には怒るけど、それ程深刻ではない。深刻な問題がないのであれば、Windowsを再インストールするくらいの時間は「人頼り」という判断によって十分まかなわれているので害はない。
さて、思ったまま書いているので文章がバラバラなので纏めると、今回のGreasemonkeyのようなケースがあることを重々承知した上で、速度か安全かを選択すれば良いと思う。技能的に自分で確認が出来ない場合でも、多くの人のレビューを見るとか、確認好きのプログラマーと知り合いになるとか、一定時間経ってからしか使わないとか、複数の対策を講じれば安全性は高くなる(当然速度は遅くなる)。もし速度を選ぶなら事故に会う可能性が高くなるので保険(対策)をかけると良いと思う。完璧な保険は不可能なので絶体絶命の可能性もあるが、それは自分で確認する場合も同じことであろう。
私はアソシエイトを利用していないけれど、もし使っていたらきっと同じように被害にあっていたでしょう。速度派なので仕方がない(決して悪意のあるコードを正当化している訳ではないので誤解のないように)。それにしても

現に、はてブアディクトは非常にメジャーな Greasemonkeyスクリプトなのに今日まで問題にならなかった。

とあるように、有名であるというある程度安全よりの判断を採ったにも関わらず事故にあってしまったのは残念なことだと思う。

Web2.0なインタフェーンス研究 1

参加型なんとかではなく、ミーハーな意味でのWeb2.0で。要するにAjaxとかの画面でウハみたいな。
まずはどんなものがあるかの洗い出し。思い付いたら増やします。

  • 現実にあるもの
種別 動作 備考
ボタン 押す 押すと凹んだり凹まなかったり
スイッチ 押す 電源スイッチみたいな 効用はボタンと同じ
レバー 動かす スライダーと違って段階的な選択に向く
スライダー 動かす ボリュームとかスクロールバーとか
タッチパネル 触る ドラッグもできるかな
ラジオボタン 選択 ボタン+ダイオードみたいな感じか
つまみ 回す 動きが段階的なものも滑らかなものもある
ハンドル 回す マウスで回すのは難しい ジョグダイヤルを含む
センサー 動かす モノの位置で判定
ふだ 返す 裏表で選択 視覚的には有効
ひも 引っ張る 部屋の電気の切り替えなど 効用はスイッチに近い
  • 現実ではあまり見ないもの(紙などでは存在しますが)
種別 動作 備考
テキストフィールド 書く ペンタブレットで実現してるか
テキストエリア 書く 同上
チェックボックス 選択 実在のものではマークシートとか
自爆装置 押し込む 太い筒状(パスワードロックあり) 宇宙船にある?
  • 現実にないもの
種別 動作 備考
コンボボックス 選択 立体的な実物は見たことがない
展開リスト 選択 エクスプローラみたいなもの

動作の分類はイメージです。多くの動作を含むものが多いので。

グーグル Google 既存のビジネスを破壊する を読んで

グーグル―Google 既存のビジネスを破壊する 文春新書 (501)

グーグル―Google 既存のビジネスを破壊する 文春新書 (501)

「ウェブ進化論」の読者は、本書も必ず目を通しておくべきだというような紹介が多かったので、その通り読んでみた。
良い感じに「ウェブ進化論」を補完してくれるけれど、別にGoogleの負の側面(Google八分とか)に触れているからということで「ウェブ進化論」を責めるのは変な感じ。
どちらの本も何重にも言葉を変えて同じことを説明しているので、結構くどい(Webに触れていないような本の読者層を想定してなんだろうけど)。ただ、なんとなく知っていたり聞いていたことが整理されるので、Webにどっぷりな人も目を通してみると良いかなとは思った。
しかし、最近薄い本ばかり読んでいるな。初めて文庫版 姑獲鳥の夏 (講談社文庫)を手にしたときの「厚!」って感動(京極夏彦の作品ではかなり薄い方であることを後で知って二度感動)を久しく味わっていない。読書をさぼっている証拠。