また釣りブログか・・・。C|Netは最近本当にどうしようもないな。
だろう。80年代からこっち日本メーカは 如何にアメリカ議会に睨まれないか という戦略で動いていたんだから。環境対応車の話とかは 後付けの要因 に過ぎない。むしろ日本メーカは米3大メーカと被らない領域で商売しようとしていた。にらまれないように現地工場を立ち上げた。それこそ涙ぐましい努力をしていたわけよ。
今回のGM破綻の一件でも、日本から見ると、全米自動車労組(UAW)がやたら傲慢にうつってたと思うけど、これも彼らが議会に対して絶大な影響力を誇るから、なのねん。
で、元々 「企業VS企業」というフェアな戦いではない のであるから、企業の勝ち負けを論ずるのは 前提がおかしい のである。
その点、DRAMのマイクロンとサムスンとエルピーダは、誰もが認める 真のチキンレース であり・・・これでエルピーダが生き残ったら「アメリカと韓国を倒した」と公言してもよかろう。言い換えると、アメリカのITをはじめとする新興勢力のロビー活動は、自動車軍需産業の比じゃないほど弱いってことだな。
まあDRAMの場合はサムスンが残る可能性が一番高いがな(国策企業のため)・・・逆にエルピーダの台湾勢との統合はうまくいかないに1票。
PerlからTokyoTyrantを使っているのですが、ときおり
Odd number of elements in hash assignment at /usr/share/perl5/TokyoTyrant.pm line 1397.
というワーニングが出ることに気づいた。 出ているところは昨日使い始めたばかりのmget関数。 使い方が間違ってるのかなーと思っていろいろやっていたのですが.... 以下サンプル。
#!/usr/bin/perl
# 別窓でttserver -port 10100 test.tctで起動しておく
use strict;
use TokyoTyrant;
use Data::Dumper;
my $pm = TokyoTyrant::RDBTBL->new();
$pm->open("localhost", 10100);
# 値に空値を含んだハッシュを作成
my $cols = {
'1'=>'hoge',
'2'=>'',
'3'=>'piyo',
};
# 登録
$pm->put("123", $cols);
# getで取得,これはワーニングでない
my $rcols = $pm->get("123");
print "(1)" . Dumper($rcols);
# mgetで取得
my %rtable = ( "123"=>undef );
# ここでOdd number of elements in hash assignment
my $rcount = $pm->mget(\%rtable);
# データ自体は正しいように見える
print "(2)" . Dumper($rcols);
$pm->close();
まさかこんな仕様ではなかろう。Perl module側のバグな気がする。 そこでTokyoTyrant.pmのsub mgetを読んでみると...
while(my ($pkey, $value) = each(%$recs)){
$$recs{$pkey} = split(/\0/ , $value);
となっている。これはゼロ値を終端子としたバイナリプロトコルの一部なのかな....。 とりあえず改悪してみたけど、これでいいとは思えない。
while(my ($pkey, $value) = each(%$recs)){
my @coll = split(/\0/ , $value);
push(@coll, '') if (scalar @coll % 2 == 1);
my %cols = @coll;
$$recs{$pkey} = \%cols;
これ末尾だけ帳尻合わせしてるだけなんだけど、 データの途中でインデックスとバリューのアラインが狂うことはないのか というのがすごい気にかかる。
一応最新バージョンを使ってるつもりなんですが。
OSはLinux-2.6.32(Debian squeeze)です。
なんせ2000レコード読み出すと 2000行エラー出る ので ログがものすごい勢いで流れるのです。参った参った。
TokyoTyrant.pmのmisc関数の配列プッシュしてる部分の直前にprintf。
printf STDERR "esiz:%d eref:%s\n", $esiz, $$eref; push(@res, $$eref);
これで先ほどのテストスクリプトを実行すると...
esiz:1 eref:1
esiz:4 eref:hoge
esiz:1 eref:3
esiz:4 eref:piyo
esiz:1 eref:2
esiz:0 eref: # ちゃんと送られている
(1)$VAR1 = {
'1' => 'hoge',
'3' => 'piyo',
'2' => ''
};
しかしmget関数(規定クラスの方)をダンプしてみると....
printf STDERR "SIZ:%d VREF:[%s]%s\n", $vsiz, $$vref, unpack("H*", $$vref);
$recs->{$$kref} = $$vref;
SIZ:16 VREF:[1hoge3piyo2]3100686f67650033007069796f003200
Odd number of elements in hash assignment at
/usr/local/share/perl/5.10.0/TokyoTyrant.pm line 1382.
(2)$VAR1 = {
'1' => 'hoge',
'3' => 'piyo',
'2' => ''
};
何が起きているのか整理すると....
サーバ側じゃないのかこれ...と思って辿っていったらttserver.cのtcadbget()で既に16バイトで TCのtctdb.cのtctdbget()まで追うハメになっているでござる.... もしかしてTC/TTのテーブルデータベースってほとんどテストされてなくね? 仕様書に「空値は一切許さない」という記述も見つけられないし.....
![[BANNER]](../image/banner.png)
|