Monthly Archives: 7月 2006

links for 2006-07-31


アウトレットパーク ラ・フェット多摩に行くの巻


南大沢くんだりまで1時間かけて行ってきた。別にそれが目的だったわけではないのだけど、ラ・フェット多摩 南大沢店に寄ってブラブラしてみた。ふらりと入ったペットショップで子犬や子猫たちに癒されてきますた……みんな寝てたけど。カブトムシやクワガタもいたけど、やっぱりキモイわ。あいつら誰に断って足6本もありますか?

外の広場っぽいところで、ニホンザルがすげー巨大な竹馬に乗ってた。興奮しすぎて写真取り忘れたぜっ。やはり動物はよい。そして虫はキモイ。

行った時間が遅かったので服屋を何軒か回ったところで閉店。しゃぶしゃぶ食ってビール飲んで帰ってきた。急行停まるし、ショッピングも食事もできるし映画も観れて公園もあって、南大沢侮りがたし。

links for 2006-07-30


WinRAR 3.51が2006/7/30の1日だけ無料で入手できる


現地時間の7月30日の0時から24時までWinRarのシングルライセンスが無料でもらえるみたい。日本時間では明日の朝8時?まで。

http://www.win-rar.com/bestoverallutility/からフォームを埋めて、届いたメールのURLからキー入手→日本語版をインストールして、さっきのキーを解凍して使用すると。

とりあえず本家サイトがクソ重すぎて繋がらねぇぇぇぇ

16:00追記
無事に入手。メールアドレス以外は嘘っぱちで入力しても問題ない。かメール来ないなーと思ったらPOPFileでspam認定されてゴミ箱に入ってたw

[MySQL] MyISAMとInnoDB


今運用している某システム、MyISAMのある難癖によって非常に辛い目に遭っております。それはもちろんテーブルロック。これはもうMyISAMを選択した時点でどうしても避けては通れない道。そこんところ仕組みをちゃんと理解してないと、MyISAMのほうが速いって言うから選んだのに、なんだよ全然遅いじゃん!っていうか使い物にならないよウワァァァァンみたいなことになりがち。今のシステムでどうやってMyISAMかInnoDBかを分けたのかというと、単純に更新頻度だった。頻繁に更新されるテーブルはInnoDB、そうじゃなければMyISAM。参照が殆どならInnoDBを選択するメリットは何もないと思っていた。が、実は全然そうじゃなかった。

MyISAMが辛いのは、INSERT文実行時にテーブルロックされることもそうだが、時間のかかるSELECT文を実行したときにREADロックされることなんじゃなかろうか。特に業務系のシステムを構築する場合、何かと複雑なSQLを発行せざるを得ない場合がある。それはもちろんテーブル設計を行った者の技量不足や、プログラマの技量不足が原因であることが多いのだが、不可避な理由(例えばクソくだらない出来損ないのコーディング規約など)によってそうせざるを得ない場合も、悲しいかな下っ端風情の一プログラマには良くあることだ。そこを正していくのが本筋だけども、そこはオトナの事情というかまぁ色々あるので以下略(もちろん技量不足が理由の大半なんだろうけども)。

この場合レプリケーションしていたとしても、悲惨な結末を辿る。例えばマスタ1台に対してスレーブを3台用意していたとしよう。普通に考えるとスレーブへの接続はラウンドロビンで順番に割り振ってやるわけだが、あるSQLによって1台のスレーブが長時間テーブルロックするとシステム全体に影響が及んでしまう。アクセス数が多ければ多いほど(というか発行するSELECT文が多ければ多いほど)、ある時間のかかるSQLによってどっかがテーブルロック→ロックしてないスレーブではすぐに結果を返す→単純なラウンドロビンなのでロックしてるスレーブにすぐに順番が回ってくる→ひたすら実行待ちSQLがキューに入る→コネクション使い切る。かと言ってロックを監視して、それによってどのスレーブに接続するかを選択するってのはオーバーヘッドが大きすぎる気が。ロックによる待ち時間よりは全然ましかも知れないけど…

と言うわけで、InnoDBにするかMyISAMにするかは、単純に更新頻度で考えてはいけないことになる。例え参照が大半を占めようとも、ある程度複雑で時間のかかるSQLを投げることが避けられないのならInnoDBにするべきだ。で、InnoDBとMyISAMと共存してるけど、特にInnoDBだからどうこうということはないように思うです。バックアップに関してはレプリケーションしてれば特に問題ないと思うし、気になるとすれば速度とディスク容量でしょうか。結構InnoDBは容量食うので注意が必要。速度に関してはSQLによるとしか言いようがないので、実際に試してみる以外ないかと。naoyaさんが言っているような「運用が面倒臭いのは萎える」のは例えばどのようなことを言ってるのかわかりかねますが…俺の中のイメージでは定期的にoptimizeしてあげたりしなくちゃいけない分、MyISAMのほうが運用は面倒なのではと思ったりします。

ちなみにMyISAM の「速い」というのがどう速いのか、という疑問についてはインデックスが絡んでいるのでは?MyISAMは文字列のキーに対してプリフィックス圧縮を行うのに対してInnoDBでは単なるB-Tree。また、InnoDBではINSERTやUPDATEのたびにインデックスの統計情報が最適化されるが、MyISAMではoptimize tableしない限り最適化しない。あとMyISAMはMVCCじゃないので、COUNTがインデックス見ただけで分かるので速い。それ以上はソース読んでないのでわかりませぬ…ちゃんと読んでみようと思いながら怠けてます。

結局のところ俺の中では、単純なSELECT文しか発行しない、かつDELETEやUPDATEが極端に少ないテーブルならMyISAM、それ以外はInnoDB、という結論で落ち着いています。あくまで4.1系の話ですが…5系はInnoDBが極端に遅いという話も聞く(検証はしてない)のでよくわからず。でも5.1からNDB Clusterがオンメンモリじゃなくても動くようになるらしいので、それについては動向をウォッチして行きたい所存。

本日の戦利品


060729_181915.jpg

みるみる理解できる相対性理論―特殊相対論も一般相対論も実はむずかしくなかった!
これやばい、超面白い。小難しい単語をあんまり使わずに、かなり砕いて説明されているし図も多いのでわかりやすい。別に相対性理論を知ったからどうということはないのだが、それがいいんじゃないか!
ソフトウェア開発見積りガイドブック―ITユーザとベンダにおける定量的見積りの実現
具体的な見積り方法とノウハウの紹介、事例集。やっぱ経験だけに頼った見積りでは、顧客も納得しないのよね…
ソフトウェア・テスト PRESS Vol.3
機能仕様を書きながらテスト仕様もまとめる、みたいな方法は導入してみたい。自動化については目新しいことは特に書かれてなかったけど、マインドマップでテスト設計は面白い
ヴァルキリープロファイル2 -シルメリア-(通常版)
やる時間があるかどうかは置いといて勢いで買った
かまいたちの夜×3 三日月島事件の真相
やる時間があるかどうかは(以下略

世界最速ギタリスト


ギネスに認定されている世界最速ギタリストらしいんだけど。確かに凄まじく速いのはわかるし、人並み外れた努力の成果なんだろうけど、なんだかなぁw

あまりにも音符が詰まりすぎて音楽として認識できん。仮に適当に弾いてたとしてもわからないぞ。いや、適当でもあそこまで速ければ凄いのか。わけわからんw

[MySQL]optimizeの落とし穴


MySQLのMyISAM型テーブルは、レコードの追加・削除を繰り返しているとどんどん効率が悪くなっていく。そこで定期的にoptimize tableを発行して統計情報の更新や、インデックスページのソートを行ってやることでテーブルの状態を最適化することが出来る。のだが…そこで思いっきり嵌った。

全部のテーブルをoptimizeして、今までslow-logに出ていたあるSQLを実行すると7秒かかっていた処理が1秒かからないまでに実行時間が短縮されたため、効果が出たと喜んでいたのだが。しばらく経って普通にシステムを使ってみると、時折異様に処理が遅いことがある。いままでDBの構成はMaster1+Slave1の2台構成だったのだが、メンテナンスでSlaveを2台増やした。どうも増設したSlaveにアクセスすると重いことがわかった。既存のSlaveと増設Slaveでの違いは、optimizeしたかどうか。optimizeしたSlaveのほうが、ある特定のSQLで200倍も遅くなっていることが判明した…200倍って!

問題になったSQLは、outer joinやunionを使いまくった、一目見ただけでは何をしているのかサッパリわからないほど複雑なSQLだった。保守性を考えれば、そういう複雑なSQLは使わずに、プログラム側でループを使うなりハッシュを使うなりしてわかりやすくするべきだ。しかし今回はあくまで処理速度重視というかアプリサーバとDBサーバ間の通信を極力減らす必要があったため、複雑なSQL1発で済ませなければならない事情があった。

最適化していないDBでは、explainしてみるときちんとインデックスが使われているのに対し、最適化したほうのDBではkeyがnullになっており、あるテーブルがフルスキャンされていた。そのフルスキャンされているテーブルはレコードが100万近く入っており、そりゃ時間かかるわなって話。2000秒以上テーブルロックして(MyISAM型は行ロックではなくテーブルロックがかかる…その間readもwriteも不可)、そのせいでアプリサーバもウェブサーバもコネクション使い切って死ぬ。

結局その問題はforce indexを使うことで無理矢理解決。あるいはstraight joinを使うことでも同様の効果が得られた。たまたま同じデータで最適化したものとしてないものがあったので、explainでどのindexを使えば速くなるのかすぐわかったので助かった…

実際のところforce joinよりもstraight joinのほうが、optimizerが順序を考えなくて済む分若干速いのかな?その辺はちゃんと調べる余裕がなかったので謎。まぁ複雑なクエリを投げるときはoptimizerに頼っちゃダメってことですな…

夜勤は結局悲惨な結末に


前の日なんとか明け方4時頃まで起きてて、昼まで寝る。んで17時頃出社して事前準備を色々やって。前半は割と順調に作業を消化してたのに、すったもんだあって結局朝6時終了予定が9時まで延びたorz

その後もポロポロと不具合が見つかって、収束するまで3時間。ボロボロになって部屋に戻ったのは14時でしたとさ。風呂に入ったあと泥のように眠りまくり。もうやりたくねぇ…もう最後の方は自分で何喋ってるのかわかんなくなるし、タイプミスでファイル消しそうになるし危険極まりないdeathよ。

笑えるYouTube


http://www.youtube.com/watch?v=p_tuLEmWccM
“I’m so fat”ってw
http://www.youtube.com/watch?v=1WpeHE-jI5U
Michael Angelo様の変態ギターその1。凄すぎて格好悪いあたりが凄い
http://www.youtube.com/watch?v=CLuCK8tYgaY
Michael Angelo様の変態ギターその2。1:50からの手の動きはもう人間ではない。通称「アンジェロラッシュ」w
http://www.youtube.com/watch?v=CCOhrGyoxTU
Michael Angelo様の以下略。あの弾き方をする意味も、ネックが4本ある意味もわからない。みんな同じ音がしてる!w
http://www.youtube.com/watch?v=bKmVVGTV-8g
ピアノは手で弾きましょう
http://www.youtube.com/w/?v=w_YbMzpQ6dk
つまんなあ・あ・あ・いっっ!!w