カテゴリー : 2008年 7月

CPAN の IO/Uncompress/RawInflate.pm でエラー


CPAN を更新しようとしたら次のようなエラーが出た。

# cpan
cpan> install CPAN
..中略..
can’t call method “value” on an undefined value at /usr/local/lib/perl5/5.8.8/IO/Uncompress/RawInflate.pm line 64.

どうも展開に失敗しているようで、パッケージのインストール、更新ができなくなってしまっていた。
調べたところ, perl 用の Raw-Zlib 圧縮ライブラリに問題があるようだったので

pkg_deinstall p5-Compress-Raw-Zlib bsdpan-Compress-Raw-Zlib

で削除し、その後通常通り cpan コマンドを走らせたところ無事動作しました(*)。
Ubuntu なら libcompress-raw-zlib-perl を削除すればいいとのこと。
 


(*)実際には

# pkg_deinstall p5-Compress-Raw-Zlib

だけでは途中でエラーになったため

pkg_deinstall bsdpan-Compress-Raw-Zlib bsdpan-Compress-Zlib bsdpan-IO-Compress-Zlib bsdpan-IO-Zlib

で関係ありそうな port をいったん全て削除しました。
参考:
- yclog: Can’t call method “value” on an undefined value at /usr/share/perl5/IO/Uncompress/RawInflate.pm line 64

error_reporting=E_ALL のススメ


初歩ではありますが、error_reporting = E_ALL ^ E_PHP_NOTICE な環境に慣れている人のためのコーディングルールを探してもすぐに見つけられなかったため、書いておきます。
 
□変数は代入してから使うこと
定義済みの(値が入っている)変数のみ参照するべきです。
もしもグローバル変数など、値が入っているかわからない場合は isset() や empty() で存在を確認しましょう。接頭文字 @ を使ってもいいですが、 isset() や empty() のほうが望ましいです。
なお、null を代入した変数も定義済みの変数です。

<?php
// —————–
// 未定義の変数参照
// —————–
// NG
echo $foo; // PHP Notice: Undefined variable: foo
// ——–
// OK
$foo = “abc”;
echo $foo;

 
□配列、連想配列の要素も存在するもののみ参照すること
配列の要素の一つ一つについても、変数同様に定義済みのもののみ参照しましょう。
リクエスト値など、値が入っているかわからない場合は isset() や empty() で存在を確認しましょう。

<?php
// —————–
// 未定義の配列要素/連想配列要素の参照
// —————–
// NG
$id = $_GET['id']; // PHP Notice: Undefined index: id (引数省略リクエストの場合)
// ——–
// OK ※省略不可能なパラメータの場合
if(empty($_GET['id'])){ // または if( !isset($_GET['id']) )
// エラー処理
exit;
}
$id = $_GET['id'];
// ——–
// OK-2 ※省略可能なパラメータの場合
$id = isset($_GET['id'])? $_GET['id']: null;

 
□定数の定義方法に注意しましょう。
定数の定義関数は

define(定数名文字列, 値)

です。
第一引数はシンボルではなく文字列です。’〜’ や “〜” で括ることを忘れないようにしましょう。

<?php
// —————–
// 未定義の定数参照(定義時)
// —————–
// NG
define(FOO, 123); // PHP Notice: Use of undefined constant FOO – assumed ‘FOO’
// ——–
// OK
define(“FOO”, 123);

 
□文字列中の連想配列のキー指定時もクォーテーションにも注意

“{$assoc[key]}”

は key が定数値とみなされます。
連想配列のキーをダブルクォーテーションまたはシングルクォーテーションで囲むようにしましょう。

<?php
// —————–
// 未定義の定数参照(文字列内での連想配列参照)
// —————–
// NG
$foo=array();
$foo["name"] = ”John”;
echo “{$foo[name]}\n”; // Use of undefined constant name – assumed ‘name’
// ——–
// OK
$foo=array();
$foo["name"] = ”John”;
echo “{$foo['name']}\n”;

ブラウザで見ているページを編集可能にする


javascript:document.body.contentEditable=’true’; document.designMode=’on’; void 0

をアドレスバーで実行すれば、ブラウザで開いているページの画像やテキストを自由に書き換えることができます(IE6, Firefox3 で確認)。
 
編集をやめたいときは↓の一行を実行します。

javascript:document.body.contentEditable=’false’; document.designMode=’off’; void 0

 
参考:
Cut and paste one line of code to make any website editable