fbpx

メニュー

PHPはバグレポートがバグッてる。だがそれがいい。

高橋文樹 高橋文樹

この投稿は 12年 前に公開されました。いまではもう無効になった内容を含んでいるかもしれないことをご了承ください。

Rubyを書く人の大半はRubyの作者がまつもとひろゆきゆきひろ氏Rubyの人から指摘されましたが、2ちゃんの人と間違えましたであることを知っているでしょうし、Perlを書く人はだいたいラリー・ウォールの名前を知っていると思うのですが、PHPを書く人の大半はPHPの作者がラスマス・ラードフ氏であることを知らないと思います。

これは多分にPHPというのがそれだけ色んな層の人に使われている結果に過ぎないのですが、このラスマスさんの発言はエスプリが効いてて面白いんですね。はてな匿名ダイアリーですが、伝説のPHP作者「Rasmus Lerdorf」名言集を聞くと嫌PHP厨がファビョるなどを参考にしてみてください。PHPは、歯ブラシみたいなものですね。毎日使うものですけど、だから何でしょう?誰が歯ブラシの本なんて読みたがります?とか最高ですね。

さて、昨日Facebookから「PHP開発者ラスマス氏がWordPress高速化のTips書いてる」という情報が流れてきたんですが、全然関係ないところが面白かったのでシェアします。

PHP Performance
PHP Performance http://talks.php.net/show/devconf

このスライド(なぜかカーソルキーの左右でめくるので、初見で閉じる可能性大)自体は「PHPが5.4になってパフォーマンスあがったぜ」ということだけなのですが、27ページ目の「ちゃんとしたバグレポート送ってね」というページが面白いです。珍バグレポートが挙げられてるんですね。以下、その訳です。生のまま味わってほしいので、直訳します。

FarmvilleのIQテスト?

https://bugs.php.net/bug.php?id=52435

バグ #52435 バグのせいでボーナスが貰えないよ。直して100万faください

[2010-07-25 06:21 UTC] dh123lh1 at hotmail dot com

概要:

farmvilleのIQテストでコイン貰えるはずだったのにこんなエラーが出ました。IQテストは終えたので、FacebookのFarmvillで100万コインください。

http://www.quizulous.com/toolbar/newaccount/conduit

mysql_connect() [function.mysql-connect]: Host ‘74.53.23.135’ is blocked because of many connection errors; unblock with ‘mysqladmin flush-hosts’

テストスクリプト:

書いてません。

予測した結果:

quizloosがfarmvilleのコインを払ってくれる

実際の結果:

報酬はもらえなくて、ページにこんなのが出ました

mysql_connect() [function.mysql-connect]: Host ‘74.53.23.135’ is blocked because of many connection errors; unblock with ‘mysqladmin flush-hosts’

[2010-07-25 20:59 UTC] [email protected]

.

[2010-07-25 22:37 UTC] strager dot nds at gmail dot com

おれもこの問題に遭遇したよ。ちなみに、おまえのIQが70以下だと発生するみたいだぜ。

解説

どこかのサイトがPHPを使って作っていて、エラーメッセージをバグとしてあげちゃったという「PHPあるある」ですね。よく辿り着けたなと感心します。

goto hell;

https://bugs.php.net/bug.php?id=48669

バグ #48669 PHPはついにGOTOを実装した

[2009-06-23 23:46 UTC] iwannalive at hotmail dot com

概要:

PHP 5.3がgotoを実装した。これは問題だ。本当に、PHPはgotoがなくたってここまでやってこれた。なぜ言語をとてつもない脅威にさらすんだ?

再現するためのコード:
<?php
goto a;
echo 'Foo';
a:
  echo 'Bar';
?>
予測した結果:

世界が終わる。

実際の結果:

世界が終わった。

[2009-06-23 23:56 UTC] [email protected]

わざわざ時間を取って書いてくれてありがとう。でも、これはバグじゃない。 http://www.php.net/manual/ で読めるドキュメントをもう一度読んで、バグリポートのやり方 http://bugs.php.net/how-to-report.php に従ってくれ。

[2009-08-04 18:47 UTC] [email protected]

地獄に落ちろ

[2010-05-07 14:41 UTC] anil at ozselgin dot com

これでPHPはバグを生みやすくなるし、小さいプログラム向きになってしまうな。読みやすいコードが好きな奴はいないのか。

[2010-07-14 01:02 UTC] risto78 at gmail dot com

俺もバグだと思うな ;)

解説

goto文がなぜかPHP5.3から実装されて、「PHPオワタ\(^o^)/」というネタですね。心優しいPHPのことなので、Staticおじさんのような人のために実装したんですかね。使いどころはよくわかりません。

BeowulveがWindows XPのPHP+MySQLで困ってるようです

https://bugs.php.net/bug.php?id=48139

バグ #48139 MySQL インテグレーション

[2009-05-03 21:23 UTC] Beowulve at gmail dot com

概要:

そう、まずは俺がPHPに対して激怒しているということを言っておきたい。すべてのネットの中で、マジで一番悪いプログラムだ。そういう意味じゃビル・ゲイツとタメをはるよ。

胸にしまっておこうと思っていたけど、おまえのプログラムがどれだけクソか説明させてくれ。俺は12時間も調査したり、再インストールしたり、その他ほんとうに色んなことをやったんだよ… phpにmysqlを入れるためにな。クソdllを読みこまないんだ。イベントログにはなにも出ない。error=E_ALLとか”REPORT_STARTUP_ERRORS”とかもやったんだけど、どこにもなにも出ない。マジで全部やったんだ。

PHPとMySQLを統合するのは不可能だ。おまえらのプログラムがクソだからだ。少なくともエラー出力できるようにすればおまえのクソみたいなプログラムの何がまちがっているかわかるんだ。

このクソを直せよ。マジで頼むから。

俺や他のみんなの人生をメチャクチャにしてくれてありがとう。そして、ファックユー。俺はCold Fusion 8に行くよ。ファックユー。

予測した結果:

なにもない。PHPプログラムは出すべきエラーも出しゃしない。

実際の結果:

やったー、PHPが動いた! おい、待てよ……dllを読み込んでないし、なんでそうなのかも表示されていない。もしかしてこれはPHPがクソだからじゃないか? そう、俺はそう思う。

[2009-05-03 21:26 UTC] [email protected]

.

[2009-05-03 23:02 UTC] [email protected]

君に謝るためにユニコーンと虹を送りたいと思ったけど、君は自分の頭を肛門に突っ込むぐらいテンパってるみたいだからそれどころじゃないだろうね。

解説

そんなに怒ること無いだろうという話ですね。「Cold Fusion 8に行く」という宣言に哀愁が漂います。Beowulveというのはメールアドレスですが、原義は「人狼」という意味ですので、もしかしたら、「中二病の奴がファビョってるぜ」ぐらいのニュアンスもあるのかもしれません。

この問題を上に報告してください

https://bugs.php.net/bug.php?id=50696

バグ #50696 number_formatに第一引数として0を渡すとnullを返す

[2010-01-08 19:13 UTC] endosquid at endosquid dot com

概要:

php -r 2>/dev/null ‘print number_format(“”,0) . “\n”;’

Solaris 8 box(移行前)で古いPHP5.1.6は0を返す。

そして、このコードの挙動が変わった。

php -r 2>/dev/null ‘print number_format(“”,0) . “\n”;’

REMIリポジトリのPHP5.3.1を入れたRHEL5では、NULLが返ってくる。これは期待通り、デフォルトの挙動ですか? もしそうなら、このように変更したのはなぜですか? 違うのであれば、我々はどこを間違っているのですか?

再現のためのコード:

php -r 2>/dev/null ‘print number_format(“”,0) . “\n”;’

予測した結果:

NULLではなく0が返ってくる

実際の結果:

NULLが返ってきた

[2010-01-08 19:20 UTC] [email protected]

なんで数字を入れるところに空文字を渡しているんだ? 君は0を空文字で置換するように命令しているんだから、空文字を受け取っているんだよ。これはよく考えた方がいいよ。”a”,0としたら何が返ってくると思う?

その変な引数を浮動小数点にキャストしたらどうかな。number_format((float)$weird,’0′)にすれば解決すると思うよ。

[2010-01-08 21:26 UTC] endosquid at endosquid dot com

重要な点を見落としているんじゃないでしょうか。

我々は何百という場所、webページのいたるところで関数に対して変数(初期化されていないかもしれないし、nullかもしれない)を渡していて、こうした基礎的な関数が思っても見ない値を返すことを想定していません。数以外を渡そうが、nullを渡そうが、「数を整形する」関数のデフォルトが0であることを期待するのはおかしいでしょうか。それと、これが最初からそのような挙動だったんですか?

[2010-01-08 21:39 UTC] [email protected]

いや、見落としてないよ。この挙動はあるアプリにおいてバグになるよね。マイナーバージョンでこんな変更がされているなら君に同意するけど、予測しないバグに繋がるこういう変なシナリオにも対処してあるんだ。

[2010-01-08 21:51 UTC] endosquid at endosquid dot com

これはどうでもよく、勝手に行われた変更にも関わらず、私達に膨大な何ヶ月にも渡る数のコード修正を起こします。返り値に数が返ってくることはずなのにNULLを受け取ることにすべてのエンジニアと開発者は納得していません。

数の定義の問題ではなく、書式の問題です。数の体系なしにどうやってフォーマットするんですか? 0があるからでしょう。銀行口座にnullドルを持つなんてことはできないでしょう?

なぜこの変更がなされたのかについて回答できる担当者に問題を報告してください。誰も回答できなければ、なぜ挙動が変更されたのですか?

[2010-01-08 22:23 UTC] [email protected]

数ヶ月? ちょっと大袈裟じゃないか?

sed -i “s#number_format(#number_format((float)#g” *.php

報告? できる人がいたらいいんだけどな。

変更はPHPのコードパーサーが引数をパースする際に適用される標準的なパーサーの一部だよ。内部的にはzend_parse_parameters()を呼び出している。ほとんどのPHPはこのコードをすでに使っているけれど、number_format()のように適用されないままのものもあったんだ。

最初のPHP5.3RCは2009年の3月だ。最初のRCがこの日にしたのは、「数ヶ月の修正が必要な」人たちが個別の事例に対処するだけの時間があるだろうと思ったからだよ。RCの期間は7月まであったんだ。

[2010-01-08 22:38 UTC] endosquid at endosquid dot com

大袈裟? あなたはリリースの大変な環境で働いたことがないみたいですね。我々はnumber_formatをそれこそ数千という場所で使っており、対象製品も50〜60に登ります。すべての変更はコーディング、テスト、リリース、クライアントテストを経なければなりません。これは税金のデータであり、税金プランや年金プランなどは正確でなければならないのです。

PHPの開発者やユーザーを馬鹿にしていないで、この変更が我々にどれほどの影響を与えたかを閑雅て見てください。

5.3.xはこれまでの環境では利用できなかったので、プラットフォームを移行したのです。あなたはこのバグに対して怒っていますが、ユーザーの要求に応える態度としては適切ではないと思います。我々はこの変更が我々にどれだけの影響を与えるかを説明しているだけです。

我々にとって現実的な選択肢はPHPを古い挙動になるようパッチをあてることですが、私がCに振れなくなってからだいぶだっていますし、math.cにあるnumber_format関数の入出力バッファをテストする時間を確保しなくてはならなくなります。

[2010-01-08 22:47 UTC] [email protected]

そういう環境で働いたことはあるよ。もっとずっと大きいところだけど。君の職務は自分の使っているツールの変更点をキャッチアップすることだろう。5.3RCは去年の3月から利用できていたわけだし、リビジョン管理ツールからはもっと早くから利用できた。変更点はたくさんあるし、その変更に影響される人がたくさんいるのも知っているよ。だからこそ、君と同じ状況にあった人が何ヶ月もかけてテストを繰り返して本番環境にデプロイしたというのに、君にとって不便だからという理由だけでこういう変更を元に戻すことはない。

[2010-01-08 23:05 UTC] endosquid at endosquid dot com

わかりました。あなたは偉大で、仕事もでき、最先端の人ですよ。使っているソフトのすべての変更をテストするだけの無限のリソースを持っているんでしょうわかりました。私は恥ずかしいですよ。あなたはなにもしないというお答えをするだけなんですね。わかりました。他の人があなたにこんなことをしないことを願いますよ。プロダクトへの忠誠心がなくなりますからね。

ソースにパッチをあてることにします。math.cの1194行目を変更すればいいんでしょう。なにも返さない代わりに0を返せばいいんでしょう? 修正してコンパイルしますよ。

[2010-01-08 23:20 UTC] [email protected]

ワオ、昔は自分の金儲けの仕組み重要な一部を提供するボランティアにこういう扱いをする人、昔はよくいたよな。

[2010-01-08 23:22 UTC] endosquid at endosquid dot com

鏡を見てみましょうよ。

他人の意見を利く授業を受けた方がいいですね。

[2010-01-08 23:47 UTC] [email protected]

こんにちは。

最近気づきました。

PHPの挙動については申し訳ない。あなたが不当な扱いを受けたのもわかります。

4chanに挙がっていたこのバグリポートをよく読んでみたところ、あなたの「錆び付いたCスキル」がこの問題を解決するに十分だと結論づけても良いようです。

[email protected] が http://en.wikipedia.org/wiki/Rasmus_lerdorf だということもつけくわえておきます。

そして、繰り返しお詫び申し上げます。PHPのバグは直すのを止めた方がいいのかもしれません。

解説

新ジャンル「慇懃バカ」の誕生です。ポイントがずれていると何をいってもクスクス笑われるという悲しいボタンの掛け違い。なんでnullを返さないとダメなプログラムを作ったんですかね。

最高のファンメール

http://lerdorf.com/fanmail.txt

日付: Thu, 12 Jun 2003 00:42:41 -0400

From: damien taylor <[email protected]>

To: [email protected]

Subject: PHP

親愛なるラスマス。

君の「オープンソースプロジェクト」を見たんだが、このことを伝えなければならない。「オープンソース」という看板を掲げても、君の作るものは失敗だ。僕はコンピューターサイエンスの博士号を持っているから保証するが、君は一行のコードを書くことだって向いていないし、どんなオープンソースプロジェクトにもかかわらないほうがいい。壊しまくってなんの役にもたたなかった挙げ句、オープンソースコミュニティやオープンソース運動全体に害をなすだろう。ほんとうになんの役に立たない君の作品(そう呼べるならだが)を渡すことで。

君のバグだらけの「作品」に多くの時間を捧げてきたが、それを同じ時間をまた君の作るクソに捧げようとは思わない。

気をつけたまえ、君のペテンはすぐに暴露されるぞ。グッドラック、次にそのクソみたいな作品を公にするまえに、きちんと見直してみることを薦めるよ。幼稚園レベルのコードを書く君がいない、オープンソース運動の未来を楽しみにしているよ。

お願いだから、よだれを垂らしながらオープンソースコミュニティの品位を落とすのではなく、なにか他のことをやってくれないか。理解できる人にとっておいてあげれくれ。

Walter Bagdasarian

解説

これはものすごいひどいことを言われて「PHPカワイソス」という点が笑いどころかと思ったのですが、ググってみるとWalter Bagdasarianという人がオバマ大統領に対して殺害予告して捕まりそうになってますね。日本でいうと「Rubyのまつもとゆきひろ氏が鬼束ちひろさんにTwitter上で殺害予告された」みたいな出来事なのかもしれません。

感想

ラスマス氏に限らず、こういうエスプリの利いたことをやれるリーダーっていうのはいいですね。

すべての投稿を見る

高橋文樹ニュースレター

高橋文樹が最近の活動報告、サイトでパブリックにできない情報などをお伝えするメーリングリストです。 滅多に送りませんので、ぜひご登録お願いいたします。 お得なダウンロードコンテンツなども計画中です。