Home

技術系のメモと日々の雑感

Perl の配列の要素をシャッフル

他の人が作った Perl のソースを見ていたら目からウロコのロジックを発見。

@array=('hoge','fuga','are','sore');
for($cnt=0; $cnt<@array; $cnt++){
  $idx=int(rand(@array-$cnt));
  push(@array,$array[$idx]);
  splice(@array,$idx,1);
}

何をしているのかすぐには理解できなくてしばらく固まってしまった。
しっかし、要素をランダムに抜き取って配列の末尾に追加するなんてよく思い付くもんだなぁ。
くやしいけど脱帽・・・。

DriveReady SeekComplete Error (Part2)

IDE の HDD を新品に交換して CentOS を入れなおしたサーバで dmesg に次のエラーが出た。

hda: drive_cmd: Status=0x51 { DriveReady SeekComplete Error }
hda: drive_cmd: error=0x04 { DriveStatusError }
ide: failed opcode was: 0xb0

容量は 160GB で、フォーマットが異常に遅くて 30 分ぐらいかかった。
インストーラが吐くログ(Ctrl+Alt+F5)を見ていたら、Writing inode tables のところでなかなかカウントアップされなかった。
初期不良かな。
以前に書いたエントリとはメッセージが微妙に違うのでメモしておく。
ちなみに、このエラーが出るパターンはひとつではなさそうだ。
SATA を IDE に変換するアダプタを使ったら出たこともあるし、マザーボードによっては特定の HDD だけ出ることもあった。
ハードに起因していることは間違いなさそうだけどね。
原因の切り分けとして、このエラーが出てる構成のまま使い続けたマシンがあるけど、特に問題は起きなかったから、それほど気にしなくてもいいのかも。

シェバングが #!/usr/bin/env perl

この前のエントリを書いていたときに、何気なく perldoc perlintro を見たら、シェバングの例として

#!/usr/bin/env perl

と書いてあるのを見つけた。
これって??
env は今まで環境変数を表示するときにしか使ったことがなかったので、そもそも引数を取ることすら知らなかった。
それはともかく、perlintro には上のように指定するメリットは特に書かれてなかったので、man env してみたところ、なんとなく分かった。
env の引数に指定されたプログラムは環境変数 PATH を参照して検索されるので、こんな風に書いておけば perl が存在するディレクトリを気にしなくていいということなんだろうね。(多分)
なるほど〜。
perldoc ってよく考えて書かれてるんだなぁ。