2005年11月05日(土)の日記
ぐっさん家
Jazzやるべ
世の中の人間は二つに分けられる。Swingする者としない者だ!
エンディアン
ところで、2005年もあと2ヶ月ほどなわけですが、来年あたりにサイトリニューアル考えてます。どーでもいいですか。そうですか。
先日日記に書いた(現在も継続中の)Perlの自分用ライブラリ開発もそれに向けたものだったんですが、
色々面倒なことがあるわけで。
それが、借りてるサーバ(以下、“鯖コン”)と自宅のコンピュータ(以下、“宅コン”)の環境の違いです。
OSは、サーバはLinuxで、自宅はMac OS Xで、両方ともUNIX系のOSなので、大きな差は今のところ感じてません。
今感じてる大きな違いは2つ。
1. CPU
鯖はPentium 4 CPU 3.00GHz、自宅はPowerPC G4 800MHz。
なんかクロック周波数にすごい差があるんですが、Perlで、ある程度負荷のある計算をさせてみても優位な差は見られませんでした。
なんなんだ、Pentium…(笑)。
でも問題は計算速度ではなくて、エンディアンの違い。
Intel製のPentium 4はリトルエンディアン、Motorola製のPowerPC G4はビッグエンディアン。
まさか、CGIのためのPerlのプログラミングでエンディアンを気にすることになろうとは思はなかったんだけれども、気にしなくてはいけない場面が出てきてしまいました。
それは例えば以下のコード。
my $integer = unpack('i', 'ABCD');
リトルエンディアンでは$integerの中身は1145258561、一方ビッグエンディアンでは、1094861636。この違いは、同じエンディアンのコンピュータ同士でデータをやり取りする場合には問題がないのだけれども、
違うエンディアンのコンピュータとデータのやり取りをする場合にはかなり気を付けなければいけない。
自宅で作成したデータと鯖側で作成したデータに互換性を持たせるためにバイトをスワップする関数を作成。
sub swapBytes {
my $bytes = shift;
my @bytes = split('', $bytes);
my @newBytes = ();
foreach (@bytes) {
unshift @newBytes, $_;
}
return join('', @newBytes);
}
あとは、エンディアンによってこの関数を使えばいいというわけ。面倒くさい。
2. Perlのバージョン
鯖は5.6.1、自宅は5.8.6。
自宅ではウォーニングもエラーも出ずに動くスクリプトが、鯖側で動かなかったりする。
それと、5.8以降の標準モジュールであるEncodeが鯖側にはない。
ただ、鯖にはJcodeはインストール済なのでそれを使うことに。
eval('use Encode;');
if ($@) {
use Jcode;
}
みたいなことしたりして。実際に書いたコードとは違いますが。自宅の方にもJcodeはインストール済なんですが、5.8以降はEncodeのラッパーとして働くらしいので、直接Encode使った方がいいかな、と。
まぁ、なんというか、作成したライブラリはJcodeだろうとEncodeだろうと意識せずに使えるようにしました。
なんか、こういうことしてると、ライブラリを公開したくなる。
公開に当たって一番面倒なのはマニュアルの作成。
ホント、マニュアルの作成ってのは本質ぢゃないので疲れます。
……話それすぎ。
─────
あ、“鯖コン”と“宅コン”って言葉使ってない。
この日記へのトラックバック
この日記へのトラックバックはありません。
この日記へのコメント