仕事が忙しくてずいぶん間が空いてしまったのだが、またTT/TCをいじり始めています。 実は性能が出なくて困っていた。特に 20万件を越えたあたりからライトが激烈に遅く ちょっと使い物にならないレベルに。
で、ちょっとぐぐったらとても良い資料見つけました。 SSDとTokyoTyrantやMySQLの性能検証(by 株式会社ゆめみ)。 こんなノウハウを惜しげもなく公開してくれるなんて....大変ありがたい。
所詮HDDだろうがSSDだろうがディスクI/Oが混むと手のつけようがないので、 「メモリ大量に用意してxmsizデカくしてオンメモリで処理しろ」 というアプローチが 正道らしい。
TC/TT開発者mikioさんがブログ等でTTを「状態をディスクに保持してくれるmemcached」という 立ち位置で説明してるので誤解しやすい(俺だけかもしらんが俺は誤解してた)けど、 やっぱりメモリ最強 ということですか....。
具体的にはttserverを起動するdbname行にxmsiz指定をつける(パラメータは256mとか1gとか)。
cascket.tct#xmsiz=1g#opts=ld#apow=6#dfunit=4
みたいな感じ。ウチでは80万件のデータベースに対してキャッシュ1G指定したら、 だいたいライトが80倍くらいになりました(今までは何だったの....)。 データベース全体は600MBくらいなのでまるっきりメモリに入ってしまう模様。
通常、Perlにおける、TTのRDBTBL(SQLライクなテーブル状データへのアクセス)に対する検索の 贋コードは以下のとおり。概ね「ptokenカラム内をタグ検索して、ptime順にオーダーして、最大100件出力」という意味です。
my $qry = TokyoTyrant::RDBQRY->new($pm); $qry->addcond('ptoken', $qry->QCSTRAND, $tokens); $qry->setlimit(100); $qry->setorder('ptime', $qry->QONUMASC); my $rv = $qry->search();
ここで$rvに返ってくるのは キーリストのリファレンス である。なので、 以下のようにforeachで回したくなる。get関数は指定キーのデータ本体をとってくるものね。
foreach my $rkey (@$rv) { my $rcols = $pm->get($rkey); # print Dumper($rcols); }
しかしこれは遅いのだ。 TT/TCにはmget関数というものが用意されている。 mget関数は あらかじめキーを入れたハッシュのリファレンスを渡す と、 データが存在するものは値セットしてくれ、データがないものはキーごと削除してくれる...らしい。 getだと毎回サーバに対してリクエストを出してしまうけれど、mgetだと1回で済むわけだ。
mgetを使った贋コードは以下のとおり。リストはmap関数でハッシュに直しています。
my %rtable = map { $_=>undef } @$rv; my $count = $pm->mget(\%rtable); foreach my $rkey (@$rv) { next if (!exists $rtable{$rkey}); my $rcols = $rtable{$rkey}; # print Dumper($rcols); }
結果... MGET:0.006553sec GET:0.030858sec ということで mgetはgetのおよそ4.7倍 という結果でした。 ああ、俺が使い方知らなかっただけなのね。これは便利だし副作用ないしガンガン使っていこう。
それでも私の環境では数万QPSにはまったく届きません。Core i3でもPhenomII X4でも。 特にライトは1000QPS出ているかでていないかで、件のレポートでいう「極端に悪い状況」です。 まあメモリ4GBしかないので、せいぜいttserverに割り当てられるキャッシュメモリは1GBということもあるけど。
なんでだろう...と思っていろいろ試しているのですが、確定的なことは言えません。
でも、ttserverを同じマシンで10コ起動するという場面は、 もしかして想定してない? と は思っています。
通常のSQLデータベースだと、1サーバ<複数データベース<複数テーブルという階層構造で、 通信用のワーカースレッドが複数個立ち上がっても、データベース自体の書き込みは比較的シリアライズされていると 考えられます。
しかしttserverの場合は1サーバ=1データベース=1テーブルという単一構造で、 どうしても実用的なアプリケーションを作成しようとすると、複数個ttserverを起動したくなる訳ですが、 どうも 全員がガムシャラにディスクをアクセスするよう なんですよね....常に全力全開マジモードで。
avg-cpu: %user %nice %system %iowait %steal %idle 0.00 0.00 0.05 32.62 0.00 67.33 Device: tps Blk_read/s Blk_wrtn/s Blk_read Blk_wrtn sda 27.00 0.00 1206.40 0 6032
これは...O/Rマッパーを書いて複数のテーブルを1つのttserverに押し込めるように したほうが良かったですかね。
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のテーブルデータベースってほとんどテストされてなくね? 仕様書に「空値は一切許さない」という記述も見つけられないし.....
SSDには寿命がある。搭載されてるフラッシュメモリに かなり短い書き換え寿命(数千回〜)があるため。 気になるところではある。 (※まあHDDも酷使すると壊れるんだが...このサーバのHDDも1年で壊れたしナ...)
Linuxの場合、HDDのS.M.A.R.Tの情報を取得するには smartmontoolsを使うが、これにSSD寿命を表す数値が でるらしいので試してみた(UNKNOWNながら)。
# apt-get install smartmontools # smartctl -s on -d ata -a /dev/sda (最後は調べたいデバイス名に)
どれどれ....
=== START OF INFORMATION SECTION === Device Model: INTEL SSDSA2M080G2GC Serial Number: CVPO952601H4080BGN Firmware Version: 2CV102HA User Capacity: 80,026,361,856 bytes Device is: Not in smartctl database [for details use: -P showall] ATA Version is: 7 ATA Standard is: ATA/ATAPI-7 T13 1532D revision 1 Local Time is: Sun Jun 6 22:59:48 2010 JST SMART support is: Available - device has SMART capability. SMART support is: Enabled (省略) 232 Unknown_Attribute 0x0033 100 100 010 Pre-fail Always 233 Unknown_Attribute 0x0032 099 099 000 Old_age Always 184 Unknown_Attribute 0x0033 100 100 099 Pre-fail Always
過去の偉人の考察を 参考にすると、232がE8, 233がE9で確定であろう。 しかし...100と99か.... 全然減ってないな(^^; .... このSSDにはTokyoTyrantサーバが8個起動して常時ガリガリ2週間くらい 書いているわけだけど、実際のデータ量自体は大したことないのかもしれぬ。
件の考察でもE9が寿命に関係しそうということまでは 分かっているようだが、リニアに変化する数値でもないようだ。 でも0に達したら壊れるんだろうなあ.....まあsmartctlでいつでも 寿命を調べられるということがわかっただけで良しとするか。
もちろん、ディスクに永久保持されるKVSとしての側面も十分魅力的ですが。 RDBMSばりのテーブルインデックスを備え複合検索ができるTC/TTは、 「どうしてもMySQLとかの代わりに使ってみたくなる」 のが人情といふもの。
実際にはたくさんのカラムを登録してある(横に長い表)だけど、 一応以下のようなテーブルだとだと思ってください。
<<投稿時刻ptime('3')>> | <<トークンptoken('14')>> |
1275332400 | 演奏してみた,アイマス |
1275246000 | 大臣,ナチス,誰得 |
1275459590 | 才能の無駄遣い,コマ撮り |
時刻はUNIX起源時間(epoch_time)。トークンは実際は文章タグ検索用のテキスト。 TCでは、カラム名を各セルに付与するのでデータサイズを考慮して番号に置換してある。
また、それぞれのカラムには以下のインデックスが張ってある。 ptime(3)では数値型の比較速度アップ(ITDECIMAL)が、 ptoken(14)ではトークン単位(上の例だとカンマ(,)で区切られた箇所ごと)の比較速度アップ(ITTOKEN)が期待できる。
$db->setindex('3', $db->ITDECIMAL); $db->setindex('14', $db->ITTOKEN);
これはレコード数が数千規模では十分うまく動いていた.....のですが。
まあ基本的には 110万件も登録するなよ という話なんですが。 以下サンプルプログラム。単純に 時刻範囲を指定して検索トークンを指定しているだけ です。
#!usr/bin/perl use strict; use Time::HiRes qw( gettimeofday tv_interval ); use TokyoTyrant; my $db = TokyoTyrant::RDBTBL->new; $db->open("localhost", 1991); my $qry = TokyoTyrant::RDBQRY->new($db); $qry->addcond('3', $qry->QCNUMGE, 1275591600); $qry->addcond('3', $qry->QCNUMLE, 1276196400); $qry->addcond('14', $qry->QCSTRAND, 'はやぶさ'); $qry->setlimit(1000); my $t1 = [gettimeofday]; my $rv = $qry->search(); printf "TIME: %.2f s\n", tv_interval($t1); printf "RESULT: %d records\n", scalar @$rv; printf "%s\n" . $qry->hint; $db->close();
検索結果。
TIME: 19.83 RESULT: 53 records using an auxiliary index: "3" desc (NUMLT/NUMLE) auxiliary result set size: 1191219 using an index: "3" asc (NUMGT/NUMGE) limited matching: 1000 result set size: 53 leaving the natural order
119万件から53件見つけるのに20秒弱(!)かかる 。これはいったい............ そもそも多くのRDBMSではlike演算子以外にテキスト検索の手法を持たないから、 検索時間を責めるのは不当に感じる人もいるかもしれないけど。
何かおかしいので以下の2行を抜いてみる。時刻レンジはなくなってしまうけれど.....
# $qry->addcond('3', $qry->QCNUMGE, 1275591600); # $qry->addcond('3', $qry->QCNUMLE, 1276196400);
TIME: 0.10 (速い) RESULT: 100 records(増えてる)
これはひどい......条件を減らして件数が多くなるほうが速いとか何なの。 複合検索の意味あるのかよ、と。
本質的な問題はTokyo Cabinetのtctdb.cにあります。全体はこういうループなのね。 で、mcondという変数にメインの検索条件を、ncondという変数にサブの検索条件を登録する。
static TCLIST *tctdbqrysearchimpl(TDBQRY *qry){ (省略) for(int i = 0; i < cnum; i++){ TDBCOND *cond = conds + i; for(int j = 0; j < inum; j++){ TDBIDX *idx = idxs + j; if(!strcmp(cond->name, idx->name)){ (省略) } } }
まずこれがいけない。iがカラム方向で、jが使われているインデックスの種別だから。 本当に順番に検索条件を指定してしまっている。 古くから売っているRDBMSでここまでずさんなのは存在しないだろう。 検索条件の適用順ソート、つまりコスト推定は必須のアルゴリズム だと思います。 メインの検索条件には、なるべく件数を絞り込める条件を持ってこなければならないわけ。
例えば新聞データベースで「東京」って入力したら数万件ひっかかってくるだろうけど、 「パラダイス」だったら数百件かもしれない。だったら「東京」+「パラダイス」という複合検索だったら、 「パラダイス」を先に検索して、その結果から東京を含むものを抜く...って当然するよね。
数値型でも同様。データの特性にもよるけど、全体が均一に入っていることを期待しなくても、 数値の分布を集計しておいて、投機コストを算定するくらいは商用RDBMSはやっているはず。 極端な話、最小値が10000で最大値が20000である数列に対して「検索条件は数値100未満」と 指定したら、それは結果ゼロ件に決まっているわけです。そんなに難しい話じゃないです。
このように、投機コストによる複合検索条件のソート、というものは検索時間に大きな影響を与えるわけです。 むしろこれがインデックスと並んでRDBMSの各社がアルゴリズムにしのぎを削っているところ、と言っても良いんじゃない でしょうか。
真に重要なのは検索結果レコードを取得する(投機)前に、コストの見積もりを行う ということなのです。
こちらは本質的な話じゃないけれど。富豪プログラミングというんですかね。 tctdb.cではサブの検索条件の結果をnmapというテーブルに格納してしまうらしい。
if(ncond){ ncond->alive = false; acnum--; nmap = tctdbqryidxfetch(qry, ncond, nidx); max = tclmin(max, TCMAPRNUM(nmap)); }
いやこれはダメでしょう。なぜかって? 検索結果が110万件でも全部メモリに読み込むのかい? と いうことですわ。実際、TC/TTは 読み込んでいても110万件をたった19秒! で済ませている(AthlonII X4 605e時) ので、とても優秀だと褒めるべきなのだろうか....
検索システムを作るときは、何の入力に検索時間や品質が比例してほしいか、 最悪値はどこか、トンでもない条件でトンでもないことにならないか、これらを良く考える必要があります。
まあ所詮、俺のRDBの知識は2000年前半、メモリ32MB,HDD320MBのPC、読んでいた本は リコーの研究所の中の人が書いた絶版RDBMSアルゴリズム本(笑)なので、 最近のオンメモリDBとかの常識は知らんのですが、俺の常識ではこんなことはしない.... するとしても投機コスト(つまり件数が少なくてメモリに読み込めば高速化が見込めるということ)がわかってからだね。
http://linux.papa.to/images/20100610.tctdb.patch
いや本当にアドホックで、ncondの条件にITTOKEN/QGRAM系が優先的に入るようにしただけですヨ。 数値条件を2つ以上指定すると、やはり上記のnmap問題にぶつかります。
まあ、KVS一派を「RBDMSより速いデータベース」「21世紀はNO SQLの時代でしょーHAHAHA」などと 呆けた認識をしている人間は 俺以外にいないと思いますが(爆死) ........いないよね?ゴクリ
BOOKSCANに出した初回の漫画スキャンが 帰ってきた。漫画はここらへん....
ヤンデレ彼女 1 (ガンガンコミックスJOKER)(忍) | ヤンデレ彼女 2 (ガンガンコミックスJOKER)(忍) | ヤンデレ彼女 3 (ガンガンコミックスJOKER)(忍) |
BOOKSCANの納品は、 自社サーバにアップロードしてPDFをダウンロードする タイプ。一冊100円と言ってもファイル名を変更するのにもお金が とられるのでなかなか厳しい。
まあ、自分でやるより汚いかなあ。中の人たちの作業ラインによって、技術力も違うようです。全然考えてなかったんだけど カバーはスキャンされない のが地味に痛かった。 漫画スキャンはちょっと悲しいPDFになって帰ってきます。
原本を捨てられる のでリカバリーは不可能。 次からはせめてカバーとカラーページと表紙だけでも スキャンしておこう。自宅にはブラザーの複合FAX機があるので USBメモリを差してボタン押すだけでスキャンできますから。
BROTHER Mymio A4インクジェットFAX複合機 デジタル子機1台 MFC-935CDN |
じゃあ最初から自分でやれば?...うん、昔はやってた。 でもスキャン以前に 悪魔の裁断 で手が痛くなる。 業務用の裁断機があるわけじゃないからな。 そういう意味では、代ゼミの横にあるようなコピー屋さん? で裁断機を貸してもらえればイナフなのかもしれぬ。
.......エロ漫画分解してるところは見られたくないが。 肉厚の雑誌はアイロンで背表紙を溶かしていたなあ(しみじみ)
まあ、こういう新しいサービスが出てくると、 もはや破綻してる著作権法やら私的利用の範囲をもちだして ギャンギャン言う連中がいるんだが、冷静に考えると 実はブックオフよりマシ なんだよな。
はっきり言えば、古本は再販制度と絶版という2つの 書籍流通の「欠陥」によってもたらされているわけだが、 ブックオフでいくら流通しようが 出版社には一銭もはいらん とおもうのだが俺何か間違ってる?
BOOKSCANはあまりに古い本はスキャンしてくれないし、 折れたり縒れてる本もはじくわけ。 新設されたプレミアム会員制度を見ればわかるけど、 利用者はAMAZONから直接新品を買って送りつけてるわけだ。 つまり 少なくとも1冊は売れる.... どっちがいいと思う?
BOOKSCANを今すぐ認めてくれ、とは言わない。 例えば、同一本の スキャンデータを使い回し、余った実本をブックオフに売って ウマー!という問題が考えられる。
いや、今のBOOKSCANがそんなあくどいことしてるとは言わないけど。 でも、非常に手間のかかるスキャンを1冊100円でひきうける.... そのことに裏があると考えるのは普通の思考でしょう。 人件費、事務所代、裁断機やスキャナのメンテナンスなどを 考えると、どー考えても500円/冊はとらないとペイしないと思う。 おまけに鳥取あたりでやってるならともかく、事務所は 東京だしなあ...
というわけで、出版社さん、 日経新聞電子版みたいなこと、つまり 実本を買えば電子データもついてくる というのが 理想のビジネスモデルだと思うんだがいかがでしょうか? これなら誰も痛まないと思うし、完全な電子化がなされるまでの 時間稼ぎにはなると思いますよ。
まあ、そうこう言ってる間にiBookは何回もダウンロード可能、 iPadでもiPhoneでもインストール可能ってわかっちゃいましたな。 残された時間は決して多くはないよな。
日本の音楽業界はほとんど死に絶えたけど、 次は出版業界が死に絶えるんだろうなあ。どうしてこう馬鹿なのかね。
_ 職業・本屋。 [誠にごもっともでございます。 本屋はサイテス(ワシントン条約)で保護されなれば絶滅しかねない種なわけでなw]
18日から弟の引っ越しを手伝いに静岡某所に行って まいりました。しかし弟は結局仕事で来れなかった... 俺が引っ越すわけじゃねーんだぞ!ふざけんな! ひとりで掃除してひとりで片付けてた。これなんて苦行プレイ? おまけにスコールのような土砂降り!天は我を見放した....
なのでこの日は写真が全く残っていない...
ちなみに引っ越したところは 悪名高きレオパレス です。 ここらへん参照。有名なコピペはヨハネスブルグコピペに似た阿鼻叫喚の地獄絵図らしい。
ほぼ新築なのでここまで酷くはなかったが....エアコンは確かに3時間で切れるけど。しかし 長い間住むとレオパレ住人は忍者と化すらしいので、たまたま周囲が忍者だらけだったのかもしれない。
それより驚いたのは、給湯器を切るスイッチが最後まで見つけられなかったことだ.....お湯だしっぱなしにしたらいろいろオワル。
あとネットは悪名高きLEO-NETそのものであり、しかもSTB以前から分岐してもDHCPアドレスはもらえるがIPルーティングしてくれない(認証しないと使えないし、認証したMACアドレスからしか通信できない)クソ仕様でした。
まあ俺が住むわけじゃないからいいけどさ....
先月からiPhoneにAPNDisablerという通信禁止プロファイルを インストールし、「ソフトバンクの通信費を抑えよう」という 実験を行っていたわけだが......
おととい金曜日から静岡に弟の引っ越しを手伝いに行っていたのだが、 もうGoogle Map見られないのが不便で不便で発狂 していた。 ちょっと昼飯を食う店を調べるにもネットが必要。 メールのチェックもTwitterもできなかった。 携帯電話がなかった時代、どうやって店舗を調べてたのかさえ 思い出せない.....ネットジャンキーすなあ。
そんなの「APNDを削除して再起動すればiPhone今まで通り使えるじゃん」、 というのは、まあ禁断症状出ているときは四六時中考えていたんだけど。
俺のiPhoneはiPhone for everybodyキャンペーンに登録していない旧プラン(2年縛りが死ぬほど嫌)なので、 パケットをフルにつかうと5985円/月かかるわけです。ソフトバンクはやることが汚くて、 ホワイトプランもいつのまにか2年縛りになってて (しかもプラン名自体には何も変更がなくて)、なかなかに酷いのだが。 日本でiPhone使って修理も受けられるように するには、まだソフトバンクに依存せざるをえない、そんな 揺らぐ乙女ごころ 。
というわけで、他にPCを持ち歩いた時とか、これからiPad(買うのか?)や任天堂3DSみたいなゲーム機と共用するのに、モバイルルーターを 検討していた。iPhoneの標準パケットプランだと使わない月は 1029円/月で済むので差額は4900円ほど。これでまかなえる範囲で あれば2台持ちでもいいわけだ。
この手のポケットルーターの先駆者と言えば イーモバイルPocketWiFi なんだけど...どうもたった数十万会員さえまかなえなくなったのか、 先日 従来の30倍に帯域制限を強化したばかり.... イーモバイルは散々煽ってたけどね、営業部長自ら「もう家の固定回線は解約しました!」みたいな。信じて買った人は本当に騙されたようなもんだよ。
いくら安くても2年縛りのリスクは当然ある というのが俺の感想です。特に通信業界は進歩が速いしねえ〜 俺が2年縛り嫌いで、端末も割賦せずに満額で買うのはこういう訳。
前置きが長くなってきたけど、本日開店直後のビックカメラへ行って、 ビックカメラWiMAXと シンセイCo.WiMAX URoad-7000を契約してきました。
一応事前に疑問に思ったことをUQのヘルパーさんにぶつけまくって きたんだけど。ほぼ聞いていた通りだった。
あまりの素直さに逆に呆れた。ドコモ/au/ソフトバンク/イーモバイル、全部2年縛りの解約金1万円弱がデフォルトみたいになってるからなあ。 「縛り」と呼べるものはプロバイダがBICWiMAX専用であることと、30日未満の解約以外何もない 。これは実はすごくないか?
即日解約すると4800+2835+3780/30+2100=9861円で本体が手にはいる計算になるが.....いくらプロバイダがBIC WiMAX縛りとは言え、これでいいのか、という気になるな。まあプロバイダ縛りに関しては「そんなこと言ったらau光oneなんて詐欺同然」ちう話になってしまうので考えないことにする。 ちなみに シンセイ直販で縛りなしURoad-7000は 19800円 だからな....
というわけで、文句のつけようがないので契約してしまったわけさ。
自宅ではWiMAX電波のランプは黄色(あまりよくない) http://www.speedtest.net/で測定してみた。 クライアントはMacbook、接続はWPA2/AESで。
けっこう満足 。使わければ380円プランに変更しようと思う。
iPhone側はWifiTrak(自動接続ソフト)を起動しておいて、 URoad-7000の電源ボタンを押した。
ということで 一応45秒くらいで使えるようにはなる みたいです。 まあ遅いっちゃー遅いよね。 b-mobile WiFiという日本通信のモバイルルーターが ボタンを押してから60秒かかるようなので心持ち早い、くらいかなあ。 まああちらはつながっても300Kbpsだけど。
自宅でのBIC WiMAXの最高記録。測定はiPhoneアプリで。
自宅のGyao!光VDSLマンションタイプをバッファローWHR-G300Nで中継すると、こうなる。遅いのは多分マンションタイプなせい。
遜色ない...といえば遜色ないんだが WiMAXのレイテンシが長いのが気になるな....
TCPのフロー制御は、パケットの欠落率と、レイテンシの2つで左右されるので、多分長いファイルをダウンロードしようとすると自然と速度が抑制されるようになると思う。そもそも、11gの無線LANを使っている時点で80msくらいの遅延はあるはずなので、あんまり気にしてもしょうがないんだが。
iPhoneアプリのせいかな?と思ってMacbookをURoad-7000につないでpingをyahoo.co.jpに打ってみたのだが。
PING www.ya.gl.yahoo.co.jp (124.83.147.202): 56 data bytes 64 bytes from 124.83.147.202: icmp_seq=0 ttl=52 time=177.572 ms 64 bytes from 124.83.147.202: icmp_seq=1 ttl=52 time=106.275 ms 64 bytes from 124.83.147.202: icmp_seq=2 ttl=52 time=106.224 ms 64 bytes from 124.83.147.202: icmp_seq=3 ttl=52 time=202.067 ms
よけいひどいわい(笑) ばらつきが激しいのはエリアぎりぎりなのも影響していると思うけど。なんせLEDはずっとオレンジ(ギリギリ)で、一度も緑(つかみOK)になったことはないからな。
ちなみに、通常のNTTフレッツ光+大手プロバイダだと、レイテンシは15ms以下のことも多々あるはず。まあ、WiMAXでシビアなネトゲとかはやるなってことですな。素直に光ひいてEthernet接続ですな。
この方のブログの情報に従い、簡易リフレクタを作ってみた。
はははご冗談でしょう...こんなもので改善するわけが....
こりゃすごい。力の限り感謝。 下りは5Mbpsから6Mbpsへ、上りは0.5Mbpsから1Mbps越え。 100均で金属ボウルを買ってくるべきか!!!
不満の大半は電源周りなんですけどね。
URoad-7000は本体側に充電を表すLEDが全くないため、 アダプター側にLEDがついている。しかしUSB給電ケーブルだと 本当に給電しているのか全くわからない....一応LEDがつきそうな 部分はあるんだがなあ。ACアダプターではこの位置に赤色のLEDが点灯する。
思わず不安になったので電池外してテストしてしまった。 ランプはつかなくても給電はされている ようです。
しかしこの平型の独自コネクタは本当に困るわ。 素直にminiUSBにしてくれれば良かったのに。
一応、無通信状態(待ち受け)だと4時間強持つんだけど、 Web管理UIから電池残量を見る方法が全くないんだよね...... 放電テストしていても、どのくらいの時間で、どのくらい減るのか、 わからないから不安。 目安の数値くらい出してくれてもバチはあたらんでしょーに。
Portable Wi-Fi 並みのスタンバイ節電機能が欲しいとはいわないが、 せめて無通信1時間で電源OFFにする機能くらい 用意して欲しい。 いくらなんでも手を抜き過ぎだろう。
まず最初に買ったのはこれ。 契約した地方商店に唯一入荷していたケースだったの。
Brighton iPhone4専用 クリスタルケース CRYSTAL CASE For iPhone 4 BI-IP4CRL/C |
でもかろうじて角が保護されるくらいで、 ケースは非常にヤワくて 保護機能はほとんどない と 思われる。その割には一度ハメると外しにくいし。 要するに使っていて不安なのだ。あとホームボタンの切り込みが浅くて、 微妙に押せないというか押したと思ったらすぐ上のアイコン(俺はメール) を起動してしまったことが多々あった。
付いている保護シートは 前面のみ であり、ケースも背面は 開いているだけなので保護は全くない。
2日ほどCRYSTALを使っていたが、背面保護がないのに嫌気が差して、 買ったのがバッファローの両面フィルム。
BUFFALO iPhone 4 (16GB・32GB)用 液晶保護フィルム&背面保護フィルム BSIPP5FS |
まあデザイン見ればまんまである。指の滑りもよく障り心地も悪くない。 が!とにかく貼りにくくて気泡だらけになってしまった..... CRYSTALのほうが貼りやすかったなあ。最終的に中性洗剤入りスプレーで 水張りを強行したが これも大失敗 であり 俺の甲子園は終ったのである(何)。
今はこれで我慢してる。
Brighton iPhone4専用 TPUケース TPU CASE FOR iPhone 4 ブルー BI-IP4TPU/B |
やたらBrightonに貢いでる気がしないでもない....が、 TPU素材なのでポッケにも入りやすく、背面も保護できるので なかなかよろしいです。つなぎとしてはよいのではないか。 青は展示ではチープだけど、iPhone4黒本体とあわせると なかなかシックですよ。
あと余談だけど、iPhone4って背面がつるっつるの平坦なので スイカとか入れられます(^^;これは便利。まあこのケースの 特徴じゃないけどね。
3Gでは最も長く使ったのは実は スキンエボリューションなんだけど。ケースじゃなくて全面保護シートね。
でも......これはもうやりたくないくらい 貼りにくかった ので、 できれば避けたい。丈夫だから保護って意味ではいいんだけどねえ。 なんせ 2回コンクリに落とした けど、このシートはって あるだけで無事だったんで(※注意:個人的な感想で製品の特徴を表すものではありません)
その後、汚くなって剥がしたら、普通のフローリングの床に 落としただけでマナーボタンの端からクラックはいったわ..... なので俺の3Gは売れないのです。
http://linux.papa.to/image/tokyocabinet-1.4.45.scost.patch.tar.gz がパッチとバッチ。 彗星の煌めきのごときmikio wareに、俺のゴミパッチを当てたら当然 クォリティは下がりますので、そこんとこよろしく。責任とれまへん。 ライセンスはオリジナル準拠です。
TokyoTyrantのサーバであるttserverを起動しておいて、
% sh server.sh [ENTER]
setindex.plを実行してインデックスを作成し、ins.plで100万レコードを 登録したデータベースに対して、search.plで複合検索を行う、という実験です。 パッチ自体はTokyoCabinetに対するものですが。
登録するデータは、ニコニコ動画のタグや掲示板の書き込みのようなものを思い浮かべてください。 投稿者(uname)と、投稿本文またはタグ(ptoken)と、投稿時刻(time)がある。 時刻はUNIX起源時間にすると見辛いので1〜100万までの整数にしてある。
key | time | uname | ptoken |
jIuqHzqZd3QdXy4QeuFwEfwt | 1 | AABC | ucuuZRAU,jfb5XOyr,gI2CfCZ6,sSlCsZXQ,aYoC9JOS,0GK6visU,aOGmIH8M |
UC8A5Q13PYNYvYe0EOjyjiLq | 2 | DADB | 897IZiAU,e0k5ap06,i85jkur3,qWJcRIHm |
9dwkWmPq30ApknRfPHTf8xei | 3 | CCFA | p9Vlhd89,1KBZrZ1h,FwRgzl7r,Y5zBfLgT,uEEtvZ7F |
search.plは、このTTに対して複合的な検索クエリーを発行する。例えば 「ある開始時刻〜終了時刻の、ユーザほげほげさんの投稿を、古い順に100件探す」みたいなかんじです。 ありがちな処理でしょ?
my $qry = TokyoTyrant::RDBQRY->new($db); my $start = ($j * 12345) % 1000000; my $end = $start + 3600; my $user = $users[$j % 50]; print "TIMERANGE: $start - $end USER $user\n"; $qry->addcond('uname', $qry->QCSTREQ, $user); $qry->addcond('time', $qry->QCNUMGE, $start); $qry->addcond('time', $qry->QCNUMLE, $end); $qry->setorder('time', $qry->QONUMASC); $qry->setlimit(100); my $rv = $qry->search();
完全乱数だと実行結果の比較がしにくいので、検索時刻範囲やユーザ名は、 剰余によって、同じものが決まった順番で繰り返し出るように細工してあります。
_ 通りすがり [なんというか・・・あまりにも情けなさ過ぎて頭の固いおぢさんですね。]
_ ぱ [フヒヒwサーセンww]
_ ぱ [つづき。 linux.papa.to/?date=20100628]